-
Notifications
You must be signed in to change notification settings - Fork 61
docs(adr): ADR 0064 — deprecate customized/ directory overlay #2811
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
ggallen
merged 1 commit into
fullsend-ai:main
from
ggallen:worktree-deprecate-customized-dirs
Jul 2, 2026
+410
−3
Merged
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
105 changes: 105 additions & 0 deletions
105
docs/ADRs/0064-deprecate-customized-directory-overlay.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,105 @@ | ||
| --- | ||
| title: "64. Deprecate customized/ directory overlay" | ||
| status: Accepted | ||
| relates_to: | ||
| - agent-infrastructure | ||
| - agent-architecture | ||
| topics: | ||
| - layering | ||
| - customization | ||
| - deprecation | ||
| --- | ||
|
|
||
| # 64. Deprecate customized/ directory overlay | ||
|
|
||
| Date: 2026-06-30 | ||
|
|
||
| ## Status | ||
|
|
||
| Accepted | ||
|
|
||
| Supersedes [ADR 0035](0035-layered-content-resolution.md) (layered content | ||
| resolution). | ||
|
ggallen marked this conversation as resolved.
|
||
|
|
||
| ## Context | ||
|
|
||
| [ADR 0035](0035-layered-content-resolution.md) introduced a three-tier | ||
| layering model for agent customization: upstream defaults are copied into the | ||
| workspace at runtime, then files from `customized/` (per-org) or | ||
| `.fullsend/customized/` (per-repo) are overlaid on top, replacing upstream | ||
| files with matching names. The overlay is file-level replacement with no | ||
| field-level merging — customizing a single harness field requires copying the | ||
| entire upstream YAML and modifying it. | ||
|
|
||
| Three subsequent ADRs have introduced mechanisms that cover every | ||
| customization scenario the overlay handled, with better ergonomics: | ||
|
|
||
| - [ADR 0045](0045-forge-portable-harness-schema.md) added `base:` | ||
| composition for harness files. A thin wrapper inherits an upstream harness | ||
| by URL and overrides only the fields that differ, with proper merge | ||
| semantics (scalars override, skills concatenate, runner_env merges). | ||
|
|
||
| - [ADR 0038](0038-universal-harness-access.md) added URL-based references | ||
| for declarative resources (agents, skills, policies, schemas). Resources | ||
| can be referenced from any trusted source without copying them into a | ||
| local directory. | ||
|
|
||
| - [ADR 0058](0058-agent-registration.md) added config-based agent | ||
| registration. Agents are discovered from `agents:` entries in config | ||
| (URLs or local paths), not from directory scanning. | ||
|
|
||
| Together these make the `customized/` directory overlay redundant: | ||
|
|
||
| | What `customized/` did | Replacement | | ||
| |---|---| | ||
| | Override a harness | `base:` composition (ADR 0045) | | ||
| | Override an agent definition | Harness `agent:` field with path or URL (ADR 0038) | | ||
| | Add/remove agents | `agents:` list in config (ADR 0058) | | ||
| | Add custom skills | Harness `skills:` list with paths or URLs (ADR 0038); concatenated via `base:` (ADR 0045) | | ||
| | Override policies/schemas | Harness fields with paths or URLs (ADR 0038) | | ||
| | Custom scripts | `pre_script`/`post_script` in harness; inherited from `base:` (ADR 0045) | | ||
| | Custom env vars | `env:` in harness; merged via `base:` (ADR 0045) | | ||
| | Data files in `scripts/` (e.g. `.pre-commit-tools.yaml`) | L2 additive merge at repo root ([ADR 0056](0056-per-repo-precommit-tools-registry.md)); `base:` composition for harness-level overrides | | ||
|
|
||
| **Scripts and env constraint:** | ||
| [ADR 0038](0038-universal-harness-access.md) prohibits standalone URL | ||
| references for executable resources. All script customization must go | ||
| through `base:` harness composition (where scripts declared in the base | ||
| are fetched from the same origin). The L1 full-replacement path for | ||
| data files like `.pre-commit-tools.yaml` via `customized/scripts/` | ||
| ([ADR 0056](0056-per-repo-precommit-tools-registry.md)) is replaced by | ||
| the L2 additive merge at repo root, which already covers per-repo | ||
| customization without the overlay. | ||
|
|
||
| The `customized/` directories currently contain only `.gitkeep` placeholders. | ||
| The overlay loop in reusable workflows runs every agent invocation but copies | ||
| zero files. | ||
|
|
||
| ## Decision | ||
|
|
||
| Deprecate and remove the `customized/` directory overlay mechanism introduced | ||
| by ADR 0035. | ||
|
|
||
| The implementation plan is in | ||
| [docs/plans/deprecate-customized-directory-overlay.md](../plans/deprecate-customized-directory-overlay.md). | ||
|
|
||
| This ADR should be implemented once ADRs 0038, 0045, and 0058 are fully | ||
| implemented and in production. This deprecation is independent of | ||
| [ADR 0044](0044-deprecate-per-org-installation-mode.md) (deprecate per-org | ||
| installation mode) — the two may proceed in any order. If ADR 0044 completes | ||
| first, the per-org `customized/` path becomes moot and the scope here narrows | ||
| to per-repo only. | ||
|
|
||
| ## Consequences | ||
|
|
||
| - Users who placed files in `customized/` must migrate to `base:` | ||
| composition, URL references, or config-based registration. | ||
| - Deprecation warnings during install and updated documentation will guide | ||
| migration. | ||
| - The reusable workflows become simpler — no overlay loop, no | ||
| `install_mode` branching for customization paths. | ||
| - The scaffold produces fewer files — no `.gitkeep` placeholders in | ||
| `customized/` subdirectories. | ||
| - `fullsend admin install` no longer creates `customized/` directories. | ||
| - A single, consistent customization model replaces the split between | ||
| directory overlay (ADR 0035) and harness composition (ADR 0045). | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.