-
Notifications
You must be signed in to change notification settings - Fork 92
docs(adr): ADR 0103 — shared configuration as recorded presets bumped by Renovate #6976
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
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -38,6 +38,10 @@ Deprecates the per-org installation mode established in | |
| Per-repo installation mode ([ADR 0033](0033-per-repo-installation-mode.md)) | ||
| becomes the sole supported installation model. | ||
|
|
||
| > **Note (2026-09-03):** The "no centralized policy" and "per-repo setup | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [low] internal consistency Two annotations added in the same PR give inconsistent impressions of how completely ADR 0103 resolves the 'no centralized policy' cost. The ADR 0044 annotation says both costs 'are decided in recorded presets and fullsend update,' implying full resolution. The governance.md annotation in the same PR correctly qualifies: 'enforcing a policy floor remains open.' ADR 0103 itself confirms enforcement is out of scope: 'Refusing to run when a repo drifts from its preset is a separate decision; this ADR only makes drift visible.' Additionally, the verb 'decided' is imprecise when applied to 'costs' — costs are not 'decided in' a mechanism; they are 'addressed by' or 'mitigated by' one. Suggested fix: Reword the annotation to: '> Note (2026-09-03): The "no centralized policy" and "per-repo setup overhead" costs listed below are partially addressed by recorded presets and |
||
| > overhead" costs listed below are decided in recorded presets and | ||
| > `fullsend update` ([ADR 0103](0103-shared-config-presets-converged-by-fullsend-update.md)). | ||
|
|
||
| ## Context | ||
|
|
||
| Fullsend's original installation model is per-org: `fullsend admin install <org>` | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -19,6 +19,11 @@ Date: 2026-06-29 | |
|
|
||
| Accepted | ||
|
|
||
| > **Note (2026-09-03):** Preset provenance (a bot-owned | ||
| > `.fullsend/preset.lock.yaml`) and the refresh path (Renovate running | ||
| > `fullsend update` as a post-upgrade task) are decided in | ||
| > [ADR 0103](0103-shared-config-presets-converged-by-fullsend-update.md). | ||
|
Comment on lines
+22
to
+25
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 7. Adr 0069 edit undisclosed The PR modifies accepted ADR 0069, but the PR description does not identify ADR 0069 or summarize its new provenance and refresh-path note. Accepted ADR edits must be explicitly called out in the PR description. Agent Prompt
|
||
|
|
||
| ## Context | ||
|
|
||
| `fullsend github setup` today spreads installation decisions across many CLI | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,105 @@ | ||
| --- | ||
| title: "103. Shared configuration as recorded presets bumped by Renovate" | ||
| status: Accepted | ||
| relates_to: | ||
| - governance | ||
| - agent-infrastructure | ||
| topics: | ||
| - configuration | ||
| - installation | ||
| - distribution | ||
| - presets | ||
| --- | ||
|
|
||
| # 103. Shared configuration as recorded presets bumped by Renovate | ||
|
|
||
| Date: 2026-09-03 | ||
|
|
||
| ## Status | ||
|
|
||
| Accepted | ||
|
|
||
| <!-- ADRs are point-in-time records, but not fully frozen after acceptance. | ||
| Minor annotations are welcome: cross-references to related ADRs, short | ||
| notes linking to newer decisions, or clarifying remarks. However, do not | ||
| substantially rewrite the Context, Decision, or Consequences sections. If | ||
| the decision itself needs to change, write a new ADR that supersedes this | ||
| one. For evolving design narrative, use docs/architecture.md. --> | ||
|
|
||
| ## Context | ||
|
|
||
| An organization wants one shared agent configuration for many repos, and | ||
| wants each repo to pick up updates automatically, the way Renovate already | ||
| bumps its packages and GitHub Actions pins. Per-repo installation | ||
| ([ADR 0044](0044-deprecate-per-org-installation-mode.md)) removed the org | ||
| config repo that used to do this and left nothing in its place. | ||
|
|
||
| The building blocks exist but do not connect. A shared | ||
| `config.base.yaml` can be installed with `github setup --config` | ||
| ([ADR 0069](0069-ready-made-configuration-presets.md)), but nothing records | ||
| where it came from, so nothing can refresh it. Agent pins carry a commit | ||
| SHA and a `#sha256=` hash, but `agent update` does not re-pin `base:` in | ||
| local harness files and does not regenerate `lock.yaml` (#5433, #5802). | ||
| No command checks pins in CI (#6191). `repos install` | ||
| ([ADR 0074](0074-repos-command-consolidation.md)) does not know presets. | ||
|
|
||
| Today the fullsend-ai org fills the gap with a workflow that `sed`-rewrites | ||
| `config.yaml` in a hard-coded list of repos and pushes to `main` through a | ||
| ruleset-bypass App. It always tracks `main`, offers no review, and leaves | ||
| stale hashes on any path outside `harness/`. It replaced a Renovate custom | ||
| manager that did the bump correctly but ran in only one repo | ||
| (fullsend-ai/.fullsend#174). Two readers also ignore the base layer and | ||
| are fixed as prerequisites, not decided here: the dispatch Route job reads | ||
| only `config.yaml` (#6422's class), and `agent add/update/remove` copy | ||
| preset entries into `config.yaml`, where they shadow the preset. | ||
|
|
||
| ## Decision | ||
|
|
||
| Shared configuration is a **preset**: a versioned `config.base.yaml` in | ||
| any repo, recorded in each consuming repo by provenance, and bumped by that | ||
| repo's own Renovate job. | ||
|
|
||
| 1. **Preset.** The preset is a `config.base.yaml` plus the harness bases, | ||
| skills and policies it references by URL. It lives in whichever repo | ||
| hosts the org's shared Renovate config. There is no dedicated org repo, | ||
| no org-level workflow and no enrollment list. | ||
| 2. **Two kinds of files.** Humans own `config.yaml` and local harness | ||
| files. Tooling owns `config.base.yaml` (a byte-identical copy of the | ||
| preset), `lock.yaml`, the shim, and a new `.fullsend/preset.lock.yaml` | ||
| whose `source` URL names the preset and its tracked ref; the resolved | ||
| SHA and `sha256` are derived from it. Tooling never writes the human | ||
| files. That split is why no three-way merge and no compile step are | ||
| needed. | ||
| 3. **Renovate bumps the pins.** fullsend ships a Renovate preset with | ||
| `custom.regex` managers for the preset record, `agents[].source` URLs | ||
| and harness `base:` URLs (never `config.base.yaml`). A repo's | ||
| `renovate.json` extends it. Renovate's built-in `github-actions` manager | ||
| already bumps the shim. | ||
| 4. **`fullsend update` does the rest.** Renovate runs it as the | ||
| `postUpgradeTasks` command. It re-fetches the preset into | ||
| `config.base.yaml`, recomputes every `#sha256=`, and regenerates | ||
| `lock.yaml` without re-resolving unchanged dependencies. Run by hand it | ||
| also bumps the shim ref. `--check` writes nothing and exits non-zero on | ||
| drift from a tag or SHA. `repos install` applies the preset on a fresh | ||
| install. | ||
| 5. **Policy is Renovate's.** Which ref to track, how long to wait | ||
| (`minimumReleaseAge`) and how often to run (`schedule`) are ordinary | ||
| Renovate `packageRules`, shared through the org's Renovate preset. | ||
|
|
||
| Repos with no explicit `agents:` entry follow the fullsend build tag for | ||
| first-party agents, so the shim bump is their agent bump. Agents generated | ||
| by `fullsend agent new` (#6966) are local files and are left alone. | ||
|
|
||
| ## Consequences | ||
|
|
||
| - Agent and preset bumps arrive as ordinary Renovate pull requests, and the | ||
| fullsend-ai sync workflows are retired. | ||
| - #5433, #5802 and #6191 close on the verb; #6597 and #6607 become | ||
| Renovate policy. | ||
| - `postUpgradeTasks` needs self-hosted Renovate with an anchored | ||
| `allowedCommands` entry, so a repo without Renovate runs `fullsend | ||
| update` by hand. | ||
| - The preset URL is a supply-chain trust surface covered by | ||
| `allowed_remote_resources` and `--config-hash`; signing is a follow-on. | ||
| - Refusing to run when a repo drifts from its preset is a separate | ||
| decision; this ADR only makes drift visible. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
6. Adr 0003 edit undisclosed
📘 Rule violation§ ComplianceAgent Prompt
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools