|
| 1 | +--- |
| 2 | +title: "64. Deprecate customized/ directory overlay" |
| 3 | +status: Accepted |
| 4 | +relates_to: |
| 5 | + - agent-infrastructure |
| 6 | + - agent-architecture |
| 7 | +topics: |
| 8 | + - layering |
| 9 | + - customization |
| 10 | + - deprecation |
| 11 | +--- |
| 12 | + |
| 13 | +# 64. Deprecate customized/ directory overlay |
| 14 | + |
| 15 | +Date: 2026-06-30 |
| 16 | + |
| 17 | +## Status |
| 18 | + |
| 19 | +Accepted |
| 20 | + |
| 21 | +Supersedes [ADR 0035](0035-layered-content-resolution.md) (layered content |
| 22 | +resolution). |
| 23 | + |
| 24 | +## Context |
| 25 | + |
| 26 | +[ADR 0035](0035-layered-content-resolution.md) introduced a three-tier |
| 27 | +layering model for agent customization: upstream defaults are copied into the |
| 28 | +workspace at runtime, then files from `customized/` (per-org) or |
| 29 | +`.fullsend/customized/` (per-repo) are overlaid on top, replacing upstream |
| 30 | +files with matching names. The overlay is file-level replacement with no |
| 31 | +field-level merging — customizing a single harness field requires copying the |
| 32 | +entire upstream YAML and modifying it. |
| 33 | + |
| 34 | +Three subsequent ADRs have introduced mechanisms that cover every |
| 35 | +customization scenario the overlay handled, with better ergonomics: |
| 36 | + |
| 37 | +- [ADR 0045](0045-forge-portable-harness-schema.md) added `base:` |
| 38 | + composition for harness files. A thin wrapper inherits an upstream harness |
| 39 | + by URL and overrides only the fields that differ, with proper merge |
| 40 | + semantics (scalars override, skills concatenate, runner_env merges). |
| 41 | + |
| 42 | +- [ADR 0038](0038-universal-harness-access.md) added URL-based references |
| 43 | + for declarative resources (agents, skills, policies, schemas). Resources |
| 44 | + can be referenced from any trusted source without copying them into a |
| 45 | + local directory. |
| 46 | + |
| 47 | +- [ADR 0058](0058-agent-registration.md) added config-based agent |
| 48 | + registration. Agents are discovered from `agents:` entries in config |
| 49 | + (URLs or local paths), not from directory scanning. |
| 50 | + |
| 51 | +Together these make the `customized/` directory overlay redundant: |
| 52 | + |
| 53 | +| What `customized/` did | Replacement | |
| 54 | +|---|---| |
| 55 | +| Override a harness | `base:` composition (ADR 0045) | |
| 56 | +| Override an agent definition | Harness `agent:` field with path or URL (ADR 0038) | |
| 57 | +| Add/remove agents | `agents:` list in config (ADR 0058) | |
| 58 | +| Add custom skills | Harness `skills:` list with paths or URLs (ADR 0038); concatenated via `base:` (ADR 0045) | |
| 59 | +| Override policies/schemas | Harness fields with paths or URLs (ADR 0038) | |
| 60 | +| Custom scripts | `pre_script`/`post_script` in harness; inherited from `base:` (ADR 0045) | |
| 61 | +| Custom env vars | `env:` in harness; merged via `base:` (ADR 0045) | |
| 62 | +| 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 | |
| 63 | + |
| 64 | +**Scripts and env constraint:** |
| 65 | +[ADR 0038](0038-universal-harness-access.md) prohibits standalone URL |
| 66 | +references for executable resources. All script customization must go |
| 67 | +through `base:` harness composition (where scripts declared in the base |
| 68 | +are fetched from the same origin). The L1 full-replacement path for |
| 69 | +data files like `.pre-commit-tools.yaml` via `customized/scripts/` |
| 70 | +([ADR 0056](0056-per-repo-precommit-tools-registry.md)) is replaced by |
| 71 | +the L2 additive merge at repo root, which already covers per-repo |
| 72 | +customization without the overlay. |
| 73 | + |
| 74 | +The `customized/` directories currently contain only `.gitkeep` placeholders. |
| 75 | +The overlay loop in reusable workflows runs every agent invocation but copies |
| 76 | +zero files. |
| 77 | + |
| 78 | +## Decision |
| 79 | + |
| 80 | +Deprecate and remove the `customized/` directory overlay mechanism introduced |
| 81 | +by ADR 0035. |
| 82 | + |
| 83 | +The implementation plan is in |
| 84 | +[docs/plans/deprecate-customized-directory-overlay.md](../plans/deprecate-customized-directory-overlay.md). |
| 85 | + |
| 86 | +This ADR should be implemented once ADRs 0038, 0045, and 0058 are fully |
| 87 | +implemented and in production. |
| 88 | + |
| 89 | +## Consequences |
| 90 | + |
| 91 | +- Users who placed files in `customized/` must migrate to `base:` |
| 92 | + composition, URL references, or config-based registration. |
| 93 | +- Deprecation warnings during install and updated documentation will guide |
| 94 | + migration. |
| 95 | +- The reusable workflows become simpler — no overlay loop, no |
| 96 | + `install_mode` branching for customization paths. |
| 97 | +- The scaffold produces fewer files — no `.gitkeep` placeholders in |
| 98 | + `customized/` subdirectories. |
| 99 | +- `fullsend admin install` no longer creates `customized/` directories. |
| 100 | +- A single, consistent customization model replaces the split between |
| 101 | + directory overlay (ADR 0035) and harness composition (ADR 0045). |
0 commit comments