Repository navigation
feat(setup): commit only the shared agent-settings floor - #1684
Merged
Merged
Conversation
nothing every contributor must share - the sandbox, the deny and ask rules, the plugin wiring - reached a fresh checkout without a manual copy step. The committed file is back, now holding only that floor plus the vetted-ops read path and the MCP tools of the adopted families, which adopt and upgrade derive from a family registry the way they derive the plugin wiring. Everything else ships as a local template that setup reconciles into .claude/settings.local.json, per worktree, together with the MCP tools of families installed on one machine only; sandbox-lint lints the two layered, keeps every protective rule in the committed file, and checks the floor's MCP allows against the registry. Generated-by: Claude Opus 5
3 of 10 tasks
potiuk
added a commit
that referenced
this pull request
Oct 17, 2026
…nt (#1692) Since #1684 the committed .claude/settings.json is the shared floor and .claude/settings.local.json is each contributor's own layer, reconciled from the local template. The local file is gitignored but can be force-added, and a committed copy would be loaded for everyone who checks the repository out: its scalars override the floor's (`sandbox.enabled: false`), and CI lints only the floor and the template. #1684 dropped the step that refused committed agent settings. The workflow now runs when .claude/settings.local.json changes and fails while it is tracked, pointing the author at the floor or the template. Generated-by: Claude Opus 5
This was referenced Oct 17, 2026
Merged
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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
#1671 stopped committing
.claude/settings.jsonand #1675 made CI refuse it, so nothing every contributor must share — the sandbox, thedeny/askrules, the plugin wiring — reached a fresh checkout without a manual copy. This brings the committed file back, but only as a floor, and moves everything personal into a local layer that setup keeps up to date.Committed
.claude/settings.json(the floor):sandbox.enabled, the~/read wall with the minimum reads git/uv/prek need, the core network hosts (GitHub, PyPI, astral), the credential env-var denies, everydenyandaskrule, the plugin wiring, the vetted-ops read path (the~read pair and exclusions #1640 requires), and the MCP tools of the adopted families. Its onlyallowentries are those MCP tools and thevetted-op-readpair.Local template →
.claude/settings.local.json:tools/agent-isolation/claude-settings.local.template.jsoncarries the rest — theghread allows, thegh */ adversarial-review / evals exclusions, family-specific hosts, personal tool paths (GnuPG, Docker).setup upgrade,isolated-setup-install(Step T) andworktree-init(per worktree) reconcile it and hand the user the copy, since an agent cannot write its own settings; reconciliation adds missing entries, records what it applied per worktree, and asks before removing anything upstream dropped. The template is applied only in the framework checkout itself, never staged into an adopter's project.MCP allows by family:
skills/setup/family-mcp-allows.jsonrecords which families' skills call which read-only MCP tools (ponymail, apache-projects, claude.ai Gmail reads, gmail-plaintext drafts).adoptandupgradederive the committed allows from the lock's families, as they already deriveenabledPlugins; families installed on one machine only get theirs in the local file. Upgrade proposes removing derived allows the lock and registry no longer produce, and unadopt/uninstall remove them.sandbox-lint:deny/askin the floor, no non-derived allow in the floor, no MCP allow and no overridden scalar in the template (a localsandbox.enabled: falsewould switch the sandbox off);.claude/settings.local.jsonlayered over the floor (invariants plus overrides) — it may add, not weaken.This replaces #1675's refusal step. The template and registry are
Edit-denied (and so sandbox write-denied) like the floor.Migration: contributors who set up while the file was untracked should back it up first (
cp .claude/settings.json .claude/settings.json.bak), sincegit pullsilently overwrites an ignored file, then move their personal entries into.claude/settings.local.json(CONTRIBUTING → Agent settings).#1681's removal of the Gmail token path and Google hosts carries over: those entries are gone from the template, and its new invariant guards the merged view and the live local layer.
Test plan:
sandbox-lintpasses on the layered files; 294 sandbox-lint tests pass (merge semantics, every split rule, registry drift, CLI failure paths, live-local cases);prek runclean apart from the workspace tests that need local sockets/network; roborev (claude-code) iterated to Pass with no issues.Generated-by: Claude Opus 5
🤖 Generated with Claude Code