Repository navigation
Claude harness settings: credential-store and destructive-git denies, Opus role agents without frontmatter isolation, rtk-aware guard - #402
Merged
seathatflowsinourveins merged 4 commits intoSep 27, 2026
Conversation
…, docs-agent deny, 30-minute Bash ceiling, status-line refresh; ai-memory hook binary rendered from the platform pin
Settings synthesis PR-A (rows A1, A2, A3, A6, B1, C4, C6 and H4's deny rule) and
token gap ai-memory#2. The model-fallback guards (H1) were already in the
template; they are now asserted by a test in the next commit.
- adoption/templates/claude.settings.template.json: Read denies for ~/.ssh,
~/.gnupg, ~/.aws, ~/.azure, ~/.kube, ~/.docker/config.json,
~/.git-credentials, ~/.netrc, ~/.npmrc, ~/.pypirc, OmniRoute's data
directories (~/.omniroute, ~/.config/omniroute and the two Windows
defaults under WSL2's /mnt) and ~/.codex/shell_snapshots, each with its
Context Mode **/ twin; Edit(~/.bashrc|.profile|.zshrc);
Agent(claude-code-guide) (Haiku); nine destructive-git denies that leave
--force-with-lease runnable; BASH_MAX_TIMEOUT_MS=1800000;
statusLine.refreshInterval 5. The eight ai-memory hook commands run
${AI_MEMORY_BIN}.
- .claude/settings.json: the same home credential-store denies and twins.
- scripts/hooks/secret_path_guard.py: a reader, copy or search of a home
credential file (an SSH private key but not its .pub) or of a Codex
shell_snapshots file is credential_file_read; clients that use a key or a
store, listings and chmod still pass. SHA256SUMS re-pinned.
- tools/adoption/render_config.py: AI_MEMORY_BIN defaults to
${ECO_ROOT}/tools/ai-memory-<version>/ai-memory from
adoption/pins-<os>-<arch>.json (--platform, default this machine), or a
host-supplied binary; a platform without a pins file fails closed. On
Linux the rendered hooks are byte-identical to before; macOS renders
2.3.2.
- Docs: secret-storage "Home and tool credential stores", the macOS note and
pin note, the bootstrap render step, two appended anti-pattern cells.
Sources: code.claude.com/docs/en/permissions, permission-modes, sub-agents,
env-vars, tools-reference, statusline (read 2026-09-27, Claude Code
2.1.283); trailofbits/claude-code-config@2109be9 settings.json;
jarrodwatts/claude-hud v0.8.0 README; cheaper-inference/OmniRoute@a58000c7
src/lib/dataPaths.ts; openai/codex rust-v0.157.1
shell-command/src/shell_snapshot_exports.rs; akitaonrails/ai-memory v2.4.1
docs/install.md.
Tests: test_secret_path_guard (blocked, allowed and recorded-gap cases),
test_render_config.AiMemoryBinTests (four failures against the previous
template, none now), test_apply_claude_settings (status-line merge).
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
…es, and portable dispatch rules for named spawns and teammates
Settings synthesis PR-C (F1, F2, orchestration 4, 5, 6, 11, C4) and PR-D
(orchestration 1, 7, 8, 9, 10, 19; F3 rule text, F4, G1; the Codex depth
statement), plus token gaps serena#2 and codebase-memory-mcp#2 on the
Claude side.
- isolated-builder and stack-verifier declare model: opus (the user's rule:
Opus at effort max for build and verification). isolated-builder drops
isolation: worktree and edits only in the owned checkout its brief names,
refusing the coordinator's own checkout (git rev-parse --show-toplevel
compared with its starting directory's). stack-verifier's timeout text
follows BASH_MAX_TIMEOUT_MS.
- .claude/agents/ holds byte-identical copies of the ten installed
definitions (project scope outranks user scope).
- test-envelope.mjs: no agent declares frontmatter isolation, and an agent
that can edit files carries the own-checkout refusal; three new mutations
fail the suite. SHA256SUMS re-pinned. Role tables say Opus.
- tests/test_install_claude_profile.py: third copy byte identity, no memory
on read-only roles (failing-first control), the template settings of the
previous commit, and a re-baselined word budget for the portable
instructions (1,205 words; the user's four dispatch modes did not fit 925).
- examples/claude-native/CLAUDE.md: the four dispatch modes and the
named-spawn rule (a named spawn becomes a teammate at the lead's effort,
without its definition's skills or isolation; per-run opt-out).
- recipes: dispatch facts, verification patterns (a)-(h), prefix sharing,
teammate effort, the headless cross-family review form and the Codex V2
depth note; the workflows README gains a brief contract and keeps lane
text in saved-workflow packets until a Workflow child is observed with the
SubagentStart block.
- docs/decisions/2026-09-27-claude-harness-settings.md, and a dated addendum
to the 2026-09-26 role-dispatch record (arm B amended before any run).
Serena's alpha hooks are not adopted (remind denies reads roles without
Serena cannot replace; activate conflicts with the single-project context);
codebase-memory-mcp stays a manual per-host registration.
Sources: code.claude.com/docs/en/sub-agents ("Subagent names", scopes,
memory), agent-teams, workflows, hooks, best-practices (2.1.283);
Anthropic "multi-agent research system"; anthropics/claude-code@7779afb
plugins/code-review/commands/code-review.md; arXiv:2512.08296 v3;
oraios/serena@c6fbd1c src/serena/hooks.py; openai/codex rust-v0.157.1
config/src/config_toml.rs L719-720; git-rev-parse(1).
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
…, verifier timeout text, builder refusal checks One read-only GPT-6 review round (cx/gpt-6-astra through the OmniRoute profile, client effort max) returned nine findings on this branch. Each was checked against source before acting: seven held and are fixed, one held in part and one is kept as a recorded limitation. - Template, partly held: the six force-push denies again as `rtk git push ...`. The finding said no push deny matches RTK's rewrite; RTK 0.50.0 does not rewrite a command that a deny rule of the project or user settings files matches (src/hooks/decision.rs "Deny wins outright"; a probe project holding the rules got "Denied by a permission rule" for all five forms), so a typed `git push --force` stays denied. A hand-typed `rtk git push --force` passes through RTK unchanged, and a rule from a source RTK does not read (managed settings, --settings) sees only the rewrite; the rtk forms cover both. test_the_push_denies_also_match_the_rtk_rewrite fails all five rtk spellings on the old template. - Guard: every rule reads the command an `rtk` invocation runs (proxy, summary, err, test; run via sh -c; read, smart, json and log as readers; other subcommands as the program of that name, per `rtk --help`); `cp -t DIR` makes every other operand a source (cp(1)); dd's `of=` is a write (dd(1)); a grep-family search's own pattern is not taken for a credential file when only plain flags precede it (grep(1), rg(1)), and anything else keeps every argument. The home-credential cases move into BLOCKED, so the keyring and the new rtk-proxy tests cover them. Against the guard at 08b84af3 the suite fails 11 blocked cases, 204 rtk-proxy subtests and 5 safe cases; none now. SHA256SUMS re-pinned. - stack-verifier (three copies): a timed-out command stops at the final response only in a foreground subagent and keeps running in a background one (tools reference, "Background commands"; sub-agents: background is the default); report it as not run and still running. - test-envelope.mjs asserts each builder refusal condition verbatim and the workflows README's agent table; four builder and two table mutations (74 in all) went unnoticed by the old suite (68 of 74) and fail now. The README's builder and verifier rows say Opus. - Decision record: agent-contract checks are structural validation (docs/acceptance-evidence-policy.md), the rtk probe, a cross-family review section, alternatives 8-9, and limitations incl. the kept `git clean -*f*` false positive. Secret storage, and a harness-defaults anti-pattern row for reproducing a hook decision with settings the deployed host will not have. Sources: code.claude.com/docs/en/hooks (parallel hooks, PreToolUse updatedInput), permissions (wildcard patterns, wrappers), tools-reference (background commands), sub-agents (foreground/background), read 2026-09-27 for 2.1.283; rtk-ai/rtk v0.50.0 (1d87b8e7) src/hooks/decision.rs and src/hooks/permissions.rs, `rtk --help` and `rtk hook check`; GNU grep(1), rg(1), coreutils cp(1), dd(1); docs/acceptance-evidence-policy.md. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
…ial store, RTK scope narrowed, scout timeout text An independent verifier checked 3eeb5f7b and reported five defects; all held. 1. The credential-store Read denies do not stop Bash readers on a host that runs `rtk hook claude`, which the template registers: rtk 0.50.0 rewrites `cat`, `head` and `tail -n` to `rtk read` (src/discover/rules.rs), Claude Code evaluates its rules against the returned input (hooks, PreToolUse `updatedInput`), and RTK's own deny gate loads only Bash(...) rules (src/hooks/permissions.rs, append_bash_rules). A dry run in a probe project holding the template's 86 deny rules showed `rtk hook check 'cat ~/.ssh/config'` -> `rtk read ~/.ssh/config`. The guard, which reads the command as written and whose deny wins, now blocks a reader, copy or search of every path the template's credential-store Read denies cover (HOME_CREDENTIAL_STORE), including any nativestack/*.key, which the new test exposed. That test derives cat, head -n, tail -n and rtk read of a path under every anchored template Read deny and expects a block. secret-storage.md, the decision record (row 5, row 6, evidence, alternatives 10-11, limitations, overturn) and the anti-pattern log row narrow the RTK statements to Bash(...) rules; a new dated log row records the mistake. 2. Directory and glob operands of a store passed (`cat ~/.ssh/*`, `cp -r ~/.ssh`, `grep -r BEGIN ~/.ssh`, `find ~/.aws -exec cat`): the same rule covers each store directory, a glob in it and the Docker home as a whole (the HF_HOME_ROOT precedent). `.pub`, `config` and `known_hosts` follow the template's whole-~/.ssh deny. Ancestors and directories that hold older store files stay recorded gaps. 3. source-scout still said the tool limit is 10 minutes; it now carries stack-verifier's BASH_MAX_TIMEOUT_MS ceiling and background-command text (env-vars; tools reference, "Background commands"), all three copies. 4. The builder-mutation evidence row named the wrong four mutations. 5. The foundation catalog's lean-workflow-child-routing text is recorded as a follow-up (outside this unit's paths). Failing-first: the guard at 3eeb5f7b fails 33 blocked cases, 66 rtk proxy, 33 keyring-exec and 40 template-deny subtests of the new suite; the repaired guard none. `scp -i KEY`, `rsync -e 'ssh -i KEY'` and `gpg --homedir ~/.gnupg` are recorded as over-blocking in BLOCKED. adoption/hooks/claude/SHA256SUMS re-pinned. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
seathatflowsinourveins
force-pushed
the
claude/claude-harness-settings-20260927
branch
from
September 27, 2026 13:44
5a32ea4 to
88af2ba
Compare
seathatflowsinourveins
deleted the
claude/claude-harness-settings-20260927
branch
September 27, 2026 14:04
seathatflowsinourveins
pushed a commit
that referenced
this pull request
Sep 27, 2026
manifests/evidence.json follows the hot-file protocol: main's copy, with this branch's files re-registered. #402 made .claude/agents/ a byte-for-byte project-scope copy of adoption/agents/claude/ (test_project_scope_agents_are_ the_installed_definitions), so landscape-sweep-worker.md gets its project copy. It is force-added and not hash-listed, like the other ten. Tests: test_install_claude_profile, test_token_lanes_subagent_start, test_adoption_docs_consistency, test_verdict_lane_vendoring, test_saturation_ledger, test_landscape_sweep_harness: 287 run, OK (7 skipped). validate.py passed. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]> Claude-Session: https://claude.ai/code/session_012qwXNtFyUhY5x2dtrm7tG5
seathatflowsinourveins
added a commit
that referenced
this pull request
Sep 27, 2026
… fetches, skills kept); repository check ignores Codex's empty .git mount targets (#398) The landscape sweep's Claude judgment stages (discover in both rounds, refute-facts, refute-fit, critic) run as a new agent type, adoption/agents/claude/landscape-sweep-worker.md: Opus, effort max, disallowedTools WebFetch, and no tools list, so it inherits Skill and context-mode's ctx_* tools. Pages are fetched with ctx_fetch_and_index and read with ctx_search, and the worker prompts never mention WebFetch. - refute-facts moves from Sonnet to Opus (the user's model rule). - The GPT-6 wrappers stay Sonnet with the default type. - The project-scope copy in .claude/agents/ is byte-identical (#402's rule). Also: inside_repository() in sweep_common.py and codex_job.py treats a repository marker as a .git directory holding HEAD (a file, or a symlink to an unborn branch), or a non-empty .git file. Codex's Linux sandbox creates empty .git mount targets under its writable roots, /tmp included (bwrap.rs SyntheticMountTarget at rust-v0.157.1), and those had made work directories under /tmp fail at random. Evidence: - smoke 3 (wf_c7bc3ee8-c16): WebFetch 0 and ctx_fetch_and_index 3 of 3 across the Claude agents (smoke 2 had 15 WebFetch, 0 ctx_fetch_and_index); skills reported for every role; GPT-6 ok 2/2; copy check 2/2; - GPT-6 review: one medium (an unborn-HEAD symlink) and one low (critic schema), both fixed with a red control. Tests: 287 run, OK. validate.py passed. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]> Claude-Session: https://claude.ai/code/session_012qwXNtFyUhY5x2dtrm7tG5
This was referenced Sep 27, 2026
seathatflowsinourveins
pushed a commit
that referenced
this pull request
Sep 27, 2026
…ution The token-practice E2E preregistration (#381, merged as c7b7885) has not executed: no organic run, capability probe or Workflow of it has run. #402 (d022295) moved stack-verifier and isolated-builder to Opus and removed the builder's frontmatter isolation. Every Workflow stage passes an explicit model, which outranks the definition's model, so the frozen protocol has to change for the run to change. This follows the preregistration's own amendment rule and Amendment 1's convention. - preregistration.json: the six Claude stack-verifier tasks and the two isolated-builder tasks move from sonnet to opus (effort stays max); builder_worktree_policy keeps its eight Repair 1 fields and adds the prepared-path brief binding, the observed-tree-equals-prepared-path check and the retained hooks and sentinel checks. Codex tasks, source-scout and the blocked loopback slot are unchanged. - token-e2e-run.mjs: role map on Opus for both roles; the builder comment follows #402. No logic change. - RUNBOOK.md: the builder section follows the #402 role (prepared path in every arm's brief, observed edit tree must be that path, hooks preflight/restore and per-tree sentinels kept, the base-refusal boundary marked [nv]); the freeze section records the project- and user-scope definitions and requires byte identity with adoption/agents/claude at the execution HEAD. - README.md: role table models and #402 carriers, the builder paragraph, a pointer under Sealing, and the append-only Amendment 2 section with its change table, merge chronology and seal. The Repair 1 seal table and Amendment 1 are preserved. - tests/test_token_e2e_preregistration.py: five new and two extended tests; against the unamended artifacts they fail (27 tests, FAILED (failures=42)); they pass on the amended artifacts. - manifests/evidence.json: the five changed files re-registered with scripts/host_receipts.py register_file. Tasks, task text, eligibility, lanes, thresholds, exceptions, checks and arm order are unchanged. Sources: adoption/agents/claude/{isolated-builder,stack-verifier,source-scout}.md at d022295; docs/decisions/2026-09-26-stack-agents-role-dispatch.md (addendum 2026-09-27) and docs/decisions/2026-09-27-claude-harness-settings.md; code.claude.com/docs/en/sub-agents (scope priority, starting directory, isolation, model resolution order; read 2026-09-27); the preregistration's Sealing section and retrieval-quality-v2's amendment convention; docs/lanes.md hot-file protocol. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
seathatflowsinourveins
added a commit
that referenced
this pull request
Sep 27, 2026
…(Opus verifier and builder, builder base binding) (#413) * PR-H Amendment 2 (2026-09-27): adopt the #402 role bodies before execution The token-practice E2E preregistration (#381, merged as c7b7885) has not executed: no organic run, capability probe or Workflow of it has run. #402 (d022295) moved stack-verifier and isolated-builder to Opus and removed the builder's frontmatter isolation. Every Workflow stage passes an explicit model, which outranks the definition's model, so the frozen protocol has to change for the run to change. This follows the preregistration's own amendment rule and Amendment 1's convention. - preregistration.json: the six Claude stack-verifier tasks and the two isolated-builder tasks move from sonnet to opus (effort stays max); builder_worktree_policy keeps its eight Repair 1 fields and adds the prepared-path brief binding, the observed-tree-equals-prepared-path check and the retained hooks and sentinel checks. Codex tasks, source-scout and the blocked loopback slot are unchanged. - token-e2e-run.mjs: role map on Opus for both roles; the builder comment follows #402. No logic change. - RUNBOOK.md: the builder section follows the #402 role (prepared path in every arm's brief, observed edit tree must be that path, hooks preflight/restore and per-tree sentinels kept, the base-refusal boundary marked [nv]); the freeze section records the project- and user-scope definitions and requires byte identity with adoption/agents/claude at the execution HEAD. - README.md: role table models and #402 carriers, the builder paragraph, a pointer under Sealing, and the append-only Amendment 2 section with its change table, merge chronology and seal. The Repair 1 seal table and Amendment 1 are preserved. - tests/test_token_e2e_preregistration.py: five new and two extended tests; against the unamended artifacts they fail (27 tests, FAILED (failures=42)); they pass on the amended artifacts. - manifests/evidence.json: the five changed files re-registered with scripts/host_receipts.py register_file. Tasks, task text, eligibility, lanes, thresholds, exceptions, checks and arm order are unchanged. Sources: adoption/agents/claude/{isolated-builder,stack-verifier,source-scout}.md at d022295; docs/decisions/2026-09-26-stack-agents-role-dispatch.md (addendum 2026-09-27) and docs/decisions/2026-09-27-claude-harness-settings.md; code.claude.com/docs/en/sub-agents (scope priority, starting directory, isolation, model resolution order; read 2026-09-27); the preregistration's Sealing section and retrieval-quality-v2's amendment convention; docs/lanes.md hot-file protocol. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]> * PR-H Amendment 2 repair round (2026-09-27): builder base binding, pinned role bodies, probe shape Single repair round after the GPT-6 cross-family and evidence-reviewer reviews, before merge and before any capability probe or organic run. - Finding 1 (HIGH): both builder task texts add the frozen <assigned-base> placeholder after <assigned-worktree>, because isolated-builder.md:12 at d022295 stops when HEAD is not the brief's base. A new frozen binding, worktree_bases, is recorded privately before probes. The runner requires a 40-hex value for every worktree_required task, requires and binds the placeholder in the builder briefs, and refuses to start when a value is missing, malformed or unbound. builder_worktree_policy adds base_binding. This is a pre-execution input binding and changes no eligibility, lane, threshold or check. - Finding 2 (LOW): README records the d022295 SHA256 of the five role bodies, and the RUNBOOK freeze requires every executed copy to equal them. - Finding 3 (LOW): the B-route isolated-builder capability probe must use exactly the frozen brief shape (prepared path plus <assigned-base>). - Integration: rebased onto origin/main f68d13c; manifests/evidence.json taken from main and re-registered with host_receipts.register_file. - Tests: six new and one extended. Pre-repair: exit 1 (33 tests, failures=52). Repaired: exit 0. Amendment 2 seal recomputed. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]> --------- Co-authored-by: Scout <scout@local> Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]>
seathatflowsinourveins
pushed a commit
that referenced
this pull request
Sep 28, 2026
…erturn variables Repair round for the verification-line addendum and the skills-trial carrier-condition addendum (findings V-F1, R-F1, R-F3, R-F4, R-F5, R-F6, R-F7, GAP-3, GAP-6, GAP-7). Skills-trial addendum: - The review no longer "replaces" the count-based prune rule. It adds a with/without comparison that varies the builder's preload for the skill's Claude listing; trial.prune_rule (adoption/skills/manifest.json L30) and tools/skill-usage/skill_usage.py L516-538 still apply, and Codex enablement stays under that rule. A disagreement is written into the manifest update the trial window end already requires. - Other sources and role changes: the landscape-sweep templates name both skills from 1b0e459 (templates.json common; build_args.py L59 TEMPLATE_SKILLS), for the Claude workers and the GPT-6 lane; the C0 baseline counts (child-lane baseline README L128-130) match that list without proving cause; #398 (5483412) and #402 (d022295) change the sweep workers' type and model and the builder's model inside C1. - Boundaries: the installer writes no install record (shutil.copy2 at install_claude_profile.py L113, L143 keeps the source mtime), and #381 step 2 freezes hashes, not install times. Verification-line addendum: - The builder runs model: opus, which is Opus 5.5 on this host since September 22 (grand-catalog-handbook.md L242-244), so the Opus 5 advice reaches it through the 5.5 guide's L9; before #402 it ran sonnet. - #381 records hashes, not an install time; a Supersedes note corrects the qmd addendum's L389 wording the same way. - Overturn names what each comparison varies: default-block line 13, a non-Opus child set, the builder line with the preload held on, or a prompting-guide reversal. - Line 13's quote, the local file:line policy, the re-read of every documentation quote at its cited line (2026-09-28 08:55Z), the installed SKILL.md hash check and the control's own returned lines. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
seathatflowsinourveins
pushed a commit
that referenced
this pull request
Sep 28, 2026
…erturn variables Repair round for the verification-line addendum and the skills-trial carrier-condition addendum (findings V-F1, R-F1, R-F3, R-F4, R-F5, R-F6, R-F7, GAP-3, GAP-6, GAP-7). Skills-trial addendum: - The review no longer "replaces" the count-based prune rule. It adds a with/without comparison that varies the builder's preload for the skill's Claude listing; trial.prune_rule (adoption/skills/manifest.json L30) and tools/skill-usage/skill_usage.py L516-538 still apply, and Codex enablement stays under that rule. A disagreement is written into the manifest update the trial window end already requires. - Other sources and role changes: the landscape-sweep templates name both skills from 1b0e459 (templates.json common; build_args.py L59 TEMPLATE_SKILLS), for the Claude workers and the GPT-6 lane; the C0 baseline counts (child-lane baseline README L128-130) match that list without proving cause; #398 (5483412) and #402 (d022295) change the sweep workers' type and model and the builder's model inside C1. - Boundaries: the installer writes no install record (shutil.copy2 at install_claude_profile.py L113, L143 keeps the source mtime), and #381 step 2 freezes hashes, not install times. Verification-line addendum: - The builder runs model: opus, which is Opus 5.5 on this host since September 22 (grand-catalog-handbook.md L242-244), so the Opus 5 advice reaches it through the 5.5 guide's L9; before #402 it ran sonnet. - #381 records hashes, not an install time; a Supersedes note corrects the qmd addendum's L389 wording the same way. - Overturn names what each comparison varies: default-block line 13, a non-Opus child set, the builder line with the preload held on, or a prompting-guide reversal. - Line 13's quote, the local file:line policy, the re-read of every documentation quote at its cited line (2026-09-28 08:55Z), the installed SKILL.md hash check and the control's own returned lines. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
seathatflowsinourveins
pushed a commit
that referenced
this pull request
Sep 28, 2026
…erturn variables Repair round for the verification-line addendum and the skills-trial carrier-condition addendum (findings V-F1, R-F1, R-F3, R-F4, R-F5, R-F6, R-F7, GAP-3, GAP-6, GAP-7). Skills-trial addendum: - The review no longer "replaces" the count-based prune rule. It adds a with/without comparison that varies the builder's preload for the skill's Claude listing; trial.prune_rule (adoption/skills/manifest.json L30) and tools/skill-usage/skill_usage.py L516-538 still apply, and Codex enablement stays under that rule. A disagreement is written into the manifest update the trial window end already requires. - Other sources and role changes: the landscape-sweep templates name both skills from 1b0e459 (templates.json common; build_args.py L59 TEMPLATE_SKILLS), for the Claude workers and the GPT-6 lane; the C0 baseline counts (child-lane baseline README L128-130) match that list without proving cause; #398 (5483412) and #402 (d022295) change the sweep workers' type and model and the builder's model inside C1. - Boundaries: the installer writes no install record (shutil.copy2 at install_claude_profile.py L113, L143 keeps the source mtime), and #381 step 2 freezes hashes, not install times. Verification-line addendum: - The builder runs model: opus, which is Opus 5.5 on this host since September 22 (grand-catalog-handbook.md L242-244), so the Opus 5 advice reaches it through the 5.5 guide's L9; before #402 it ran sonnet. - #381 records hashes, not an install time; a Supersedes note corrects the qmd addendum's L389 wording the same way. - Overturn names what each comparison varies: default-block line 13, a non-Opus child set, the builder line with the preload held on, or a prompting-guide reversal. - Line 13's quote, the local file:line policy, the re-read of every documentation quote at its cited line (2026-09-28 08:55Z), the installed SKILL.md hash check and the control's own returned lines. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
seathatflowsinourveins
pushed a commit
that referenced
this pull request
Sep 28, 2026
…erturn variables Repair round for the verification-line addendum and the skills-trial carrier-condition addendum (findings V-F1, R-F1, R-F3, R-F4, R-F5, R-F6, R-F7, GAP-3, GAP-6, GAP-7). Skills-trial addendum: - The review no longer "replaces" the count-based prune rule. It adds a with/without comparison that varies the builder's preload for the skill's Claude listing; trial.prune_rule (adoption/skills/manifest.json L30) and tools/skill-usage/skill_usage.py L516-538 still apply, and Codex enablement stays under that rule. A disagreement is written into the manifest update the trial window end already requires. - Other sources and role changes: the landscape-sweep templates name both skills from 1b0e459 (templates.json common; build_args.py L59 TEMPLATE_SKILLS), for the Claude workers and the GPT-6 lane; the C0 baseline counts (child-lane baseline README L128-130) match that list without proving cause; #398 (5483412) and #402 (d022295) change the sweep workers' type and model and the builder's model inside C1. - Boundaries: the installer writes no install record (shutil.copy2 at install_claude_profile.py L113, L143 keeps the source mtime), and #381 step 2 freezes hashes, not install times. Verification-line addendum: - The builder runs model: opus, which is Opus 5.5 on this host since September 22 (grand-catalog-handbook.md L242-244), so the Opus 5 advice reaches it through the 5.5 guide's L9; before #402 it ran sonnet. - #381 records hashes, not an install time; a Supersedes note corrects the qmd addendum's L389 wording the same way. - Overturn names what each comparison varies: default-block line 13, a non-Opus child set, the builder line with the preload held on, or a prompting-guide reversal. - Line 13's quote, the local file:line policy, the re-read of every documentation quote at its cited line (2026-09-28 08:55Z), the installed SKILL.md hash check and the control's own returned lines. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
seathatflowsinourveins
added a commit
that referenced
this pull request
Sep 28, 2026
…l line (AN-15, after #447) (#456) * Token-lanes carrier: evidence line replaces the verification-skill instruction Default block line 13 now asks for evidence (the command and what it returned, or the file:line read) and keeps the search-first sentence: 4,094 -> 4,088 bytes against the unchanged 4,100-byte bound (AN-15). The builder block drops its verification sentence (2,883 -> 2,747 bytes): isolated-builder.md:7-9 preloads the skill and :12 names it. Sources: code.claude.com/docs/en/best-practices.md L52 (show evidence); platform.claude.com prompting-claude-opus-5.md L61, L81 (remove explicit verification instructions), prompting-claude-opus-5-5.md L9 (carried forward), claude-prompting-best-practices.md L780 (Opus 5 exception). Handbook mirror: carrier line, its sources paragraph naming only search-first, and the builder table row and variant. Tests: the default key phrase becomes "Show evidence before a success claim", the builder drops the skill phrase, and no block may name the withdrawn skill. SHA256SUMS refreshed for both blocks. No installer run. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]> * Decision records: verification-line addendum and skills-trial carrier conditions Token-lanes decision, addendum 2026-09-28: why the default carrier line now asks only for evidence (Opus 5 guide L61, L81; Opus 5.5 guide L9; prompting best practices L780; Claude Code best practices L52), why the builder line is removed on its own merits (isolated-builder.md L5, L7-9, L12; sub-agents reference L600), sizes, the failing-first control, the non-Opus boundary, alternatives, #381 freeze and overturn. Skills-trial record, addendum 2026-09-28: condition log C0-C3 (#378, 2026-10-25 review rule for verification-before-completion: a with/without comparison on frozen builder tasks through an upstream harness named with its pin (tokens, elapsed time, review-found defects). Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]> * Decision records: date the builder preload boundary; drop an unretained count Skills-trial condition log: isolated-builder's verification-before-completion preload and the body line that names it came from #376 (623d34f, 2026-09-27T03:38:47Z per TZ=UTC git log -S on adoption/agents/claude/isolated-builder.md), a boundary inside C0, not a constant across every condition. The one recorded install time is attributed as measured-gaps.md reports it (the coordinator's local measurement), without naming a host. Token-lanes addendum: the community alternative keeps superpowers as the verifiable example and drops a survey count that is not retained in the repository. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]> * Token-lanes carrier: tag the evidence sentence's upstream item; narrow the no-verification claim Repair round for the verification-line change (review findings R-F2, R-F7). - token-lanes-block.md line 13 moves "(code.claude.com best practices)" to follow "the command and what it returned", the item Claude Code best practices L52 names (https://code.claude.com/docs/en/best-practices.md, re-read 2026-09-28). The file:line alternative is local policy, not in L52. Zero-byte reorder: the block stays 4,088 bytes and line 13 295. - SHA256SUMS lists the new block hash; `sha256sum -c SHA256SUMS` passes. - Handbook: the mirrored line follows, and the sources paragraph records the file:line alternative as local policy. It now says the carrier gives no instruction to verify finished work and names no verification skill, since the codebase-memory line still checks caller lists (handbook L264). - Test comment: WITHDRAWN_PHRASES is a literal skill-name check, not a check for every verification wording. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]> * Decision records: keep the manifest prune rule, name confounds and overturn variables Repair round for the verification-line addendum and the skills-trial carrier-condition addendum (findings V-F1, R-F1, R-F3, R-F4, R-F5, R-F6, R-F7, GAP-3, GAP-6, GAP-7). Skills-trial addendum: - The review no longer "replaces" the count-based prune rule. It adds a with/without comparison that varies the builder's preload for the skill's Claude listing; trial.prune_rule (adoption/skills/manifest.json L30) and tools/skill-usage/skill_usage.py L516-538 still apply, and Codex enablement stays under that rule. A disagreement is written into the manifest update the trial window end already requires. - Other sources and role changes: the landscape-sweep templates name both skills from 1b0e459 (templates.json common; build_args.py L59 TEMPLATE_SKILLS), for the Claude workers and the GPT-6 lane; the C0 baseline counts (child-lane baseline README L128-130) match that list without proving cause; #398 (5483412) and #402 (d022295) change the sweep workers' type and model and the builder's model inside C1. - Boundaries: the installer writes no install record (shutil.copy2 at install_claude_profile.py L113, L143 keeps the source mtime), and #381 step 2 freezes hashes, not install times. Verification-line addendum: - The builder runs model: opus, which is Opus 5.5 on this host since September 22 (grand-catalog-handbook.md L242-244), so the Opus 5 advice reaches it through the 5.5 guide's L9; before #402 it ran sonnet. - #381 records hashes, not an install time; a Supersedes note corrects the qmd addendum's L389 wording the same way. - Overturn names what each comparison varies: default-block line 13, a non-Opus child set, the builder line with the preload held on, or a prompting-guide reversal. - Line 13's quote, the local file:line policy, the re-read of every documentation quote at its cited line (2026-09-28 08:55Z), the installed SKILL.md hash check and the control's own returned lines. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]> * Token-lanes record: the no-command-output case needs neither Bash nor ctx_execute security-reviewer has no Bash but runs commands through Context Mode's ctx_execute (Codex review), so the rationale is qualified to children with no command runner. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]> * Evidence manifest: re-register this change's files Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]> --------- Co-authored-by: Scout <scout@local> Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]>
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.
Scope
What this PR changes: the Claude Code harness side of the 2026-09-27 settings synthesis (its PR-A, PR-C and PR-D items that are verified and not user decisions) plus three token gaps (
serena#2,ai-memory#2,codebase-memory-mcp#2) where the Claude template or agents own them. A new host gets it throughtools/adoption/render_config.py,tools/adoption/apply_claude_settings.pyandtools/adoption/install_claude_profile.py.Base commit:
5f3a7c21(after Landscape-sweep GPT-6 lane through OmniRoute: lane-local Codex home with the token stack at max effort (stacked on #385) #387 and Practice gaps #6 and #8: truthful skills-install message; agent teams are an allowed dispatch mode #388). Branchclaude/claude-harness-settings-20260927, five commits: the settings template; role agents and dispatch rules; the cross-family review repairs; the independent-verification repairs; and the evidence manifest. Themanifests/evidence.jsonre-registration is the last commit.origin/mainmoved to805991bc(GPT-6 family tiering: record the frozen run's results (S1, gpt-6-sol at medium, for mechanical extraction) #397, Codex templates: OmniRoute gateway profile, verified base keys and the Codex-template token gaps #395) during the verification round, and this branch is not rebased. Agit merge-treedry run against it conflicts in two files:docs/harness-defaults.md: Codex templates: OmniRoute gateway profile, verified base keys and the Codex-template token gaps #395 and this branch both append anti-pattern rows at the table's end. Keep all rows, Codex templates: OmniRoute gateway profile, verified base keys and the Codex-template token gaps #395's first.manifests/evidence.json: follow the hot-file protocol. Takemain's copy, then re-register the 28 filesregister_filelists.adoption/bootstrap.mdandtests/test_render_config.pymerge cleanly. Re-run acceptance after the rebase.Lane:
lane:foundation(recommended label). The only shared hot file touched ismanifests/evidence.json(hashes re-registered by the protocol).AGENTS.mdis untouched.Owned paths touched:
adoption/(templates, agents, hooks SHA256SUMS, mcp comment, macOS pin note and platform doc, bootstrap),.claude/,scripts/hooks/secret_path_guard.py,tools/adoption/render_config.py,examples/claude-native/,recipes/claude-native-ultracode.md,recipes/claude-codex-cooperation-lanes.md,docs/(secret-storage, harness-defaults, two decision records), tests.Files that running sessions load from the repository (peers
main,why-is-macos,native-agent-stack-b4,mac-memory-layer-planand every session started in this checkout after merge):.claude/settings.jsongains 26 deny rules (home credential stores with their**/twins). After merge, sessions started in this repository can no longer use Claude's file tools to read~/.ssh,~/.gnupg,~/.aws,~/.azure,~/.kube,~/.docker/config.json,~/.git-credentials,~/.netrc,~/.npmrc,~/.pypirc, OmniRoute's data directories or~/.codex/shell_snapshots. A project-local.npmrc,.netrcor.pypircis denied too, by the twin semantics, as for.env. No tracked file of this repository matches any new twin (git ls-fileschecked against all of them).New
.claude/agents/(ten files, byte-identical toadoption/agents/claude/). Project agents outrank~/.claude/agents/, so after merge every session in this checkout dispatches the new definitions:isolated-builderandstack-verifierrun on Opus.isolated-builderhas no frontmatter worktree isolation. A builder brief must name an owned checkout, and the body refuses the coordinator's own checkout, a missing path or a HEAD off the base.stack-verifierandsource-scoutstate theBASH_MAX_TIMEOUT_MSceiling and report a timed-out command as not run and still running.This host's
.git/info/excludelists/.claude/, so these files were added withgit add -f; clones are unaffected.scripts/hooks/secret_path_guard.pyruns as the project PreToolUse hook here. After merge it blocks these, in every session in this checkout:Readdenies cover: anything in~/.ssh(includingconfig,known_hostsand*.pub),~/.gnupg,~/.aws(includingconfig),~/.azure,~/.kube, OmniRoute's data directories and anyshell_snapshotsdirectory, each directory itself and a glob in it; the Docker home as a whole; the Docker, git-credential, netrc, npm and PyPI files; and anynativestack/*.key;scp -i KEY,rsync -e 'ssh -i KEY'andgpg --homedir ~/.gnupg, which name a store as the operand of a program the guard treats as a reader. A key named in~/.ssh/configor loaded withssh-addavoids that.Every guard rule also reads the command inside
rtk proxy|summary|err|test|run|read|smart|json|log ...and any other rtk subcommand as its native program, sortk proxy cat .envandrtk envare blocked too; both passed before.ssh -i,ssh-add,ssh-keygen -y -f,kubectl --kubeconfig,curl --netrc,gh ssh-key add,ls,statandchmodstill pass. A grep-family search whose pattern merely spells a credential path (rg shell_snapshots docs) also passes.Nothing on any host was changed: no
~/.claude,~/.codex, service or gateway write. The host-now steps (H1, H2, H6, H8 of the synthesis: apply the template keys, install guard and agents) remain for the coordinator.SOTA sources
~/and//anchors; gitignore*; trailing*semantics; "Wrappers" (a fixed list; RTK is not in it); "What a Bash rule doesn't match" (rules match the command text as written, and a PreToolUse hook is the way to inspect the full command); "not a security boundary".isolationbranches from the default branch;memoryauto-enabling Read/Write/Edit;claude-code-guideruns on Haiku, and anAgent(name)deny works for built-ins;skillsis not applied;-pspawns no teammates; the"0"override and--settingsprecedence.updatedInput("Claude Code evaluates permission rules ... against the input your hook returns, not the input Claude sent");deny>defer>ask>allow.BASH_MAX_TIMEOUT_MS; what happens at a timeout; "Background commands".refreshInterval.v0.50.0(1d87b8e7), which the template registers asrtk hook claude:src/discover/rules.rs:^(cat|head|tail)\s+is rewritten tortk read.src/discover/registry.rs:is_single_file_operandkeeps~paths eligible.src/hooks/permissions.rs: reads the project and usersettings.json/settings.local.jsononly, andappend_bash_ruleskeeps onlyBash(...)rules.src/hooks/decision.rs: "Deny wins outright".src/hooks/hook_cmd.rs: the rewrite is returned asupdatedInput.src/core/config.rsand README:[hooks] exclude_commands.rtk --help, subcommand--helpandrtk hook check.2109be9,settings.json(credential-store Read denies, rc-file Edit denies, git denies): corroboration.v0.8.0,README.md(refreshInterval: 5).7779afb,plugins/code-review/commands/code-review.mdsteps 4-6 (per-finding validation, Opus for bug and logic findings).rust-v0.157.1:codex-rs/config/src/config_toml.rsL719-720 (max_depth"Ignored by V2"), andcodex-rs/shell-command/src/shell_snapshot_exports.rs(snapshots record exported values); installed codex-cli 0.157.1codex exec --help.a58000c7(same lines atv3.8.50):src/lib/dataPaths.tsL40-62 and L175-190;.env.exampleL36-41.v2.4.1,docs/install.md("Native hook commands invoke the installed binary directly").c6fbd1c,src/serena/hooks.py(remind, activate and auto-approve behaviour) and the client guide (the hooks are opt-in and alpha).git-rev-parse(1)(--show-toplevel); GNU grep(1) and rg(1) synopses (PATTERNS [FILE...],-e/-f); coreutils cp(1)-t; dd(1)of=.docs/acceptance-evidence-policy.md: local contract tests are structural validation.What changed
Settings template and project settings (PR-A, H1, H6, H8, C4). The model-fallback guards were already in the template and are now asserted by a test. Added:
Readdenies with their Context Mode twins, plus the two WSL2 Windows OmniRoute defaults (template only);Edit(~/.bashrc|.profile|.zshrc)andAgent(claude-code-guide);rtk git push ...(--force-with-leasestays runnable for the hot-file protocol);BASH_MAX_TIMEOUT_MS=1800000andstatusLine.refreshInterval: 5.On Linux the rendered template's hooks are byte-identical to before. The only rendered differences are 49 added deny rules (none removed), one env key and
refreshInterval. This comes from a render comparison oforigin/mainand the final template withadoption/hosts/example.json, re-run after the review repairs; this round did not change the template.Guard. A reader, copy or search whose operand is a template credential store, a glob in one or a file in one is
credential_file_read. The rule covers the directory itself and every path the template's credential-storeReaddenies cover: anything in~/.ssh,~/.gnupg,~/.aws,~/.azure,~/.kube, the OmniRoute data directories and anyshell_snapshotsdirectory; the Docker, git-credential, netrc, npm and PyPI files; and the Docker home as a whole, following the Hugging Face home precedent.It is deliberately a reader-operand rule, not a mention rule, so
ssh -i,ssh-add,kubectl --kubeconfig,curl --netrc,ls,statand the H4chmodstill pass in every session. OmniRoute's.env/server.envare now reported as reads of the data directory. A dotenv file elsewhere is stilldotenv_read.On a host that runs RTK's hook, this rule is what stops
cat,headandtail -nof those stores. RTK 0.50.0 rewrites those readers tortk read, Claude Code checks its rules against the rewrite, and RTK's own deny gate reads onlyBash(...)rules (see Independent verification).Role agents (PR-C).
isolated-builderandstack-verifier→model: opus(the user's rule).isolated-builderdropsisolation: worktree. It refuses to edit unless its brief names an owned checkout at the stated base that is not the coordinator's own (agit rev-parse --show-toplevelcomparison). It accepts a prepared clone as well as agit worktree add --no-tracktree.stack-verifierandsource-scouttimeout text followsBASH_MAX_TIMEOUT_MS..claude/agents/.memoryon read-only roles (failing-first control).Portable instructions and dispatch (PR-D).
examples/claude-native/CLAUDE.mdnow carries the user's four dispatch modes (solo, one unnamed subagent, Ultracode workflow, agent team). It also carries the verified named-spawn rule with the per-run opt-out.codex exec -s read-only ... < /dev/nullreview form and the Codex V2 depth note.Token gaps.
ai-memory#2: hook commands run${AI_MEMORY_BIN}. It is rendered from the selected platform's pin (--platform, default this machine; macOS →tools/ai-memory-2.3.2) or from a host-supplied binary. The false macOS pin note is corrected.serena#2: not adopting Serena's alpha hooks, with source evidence:remindhook denies Read/Grep in roles that have no Serena tools;activateasks foractivate_project, which the single-projectclaude-codecontext disables;auto-approveis inert underbypassPermissions.codebase-memory-mcp#2: Claude registration is explicitly gated on a manual install. No agent gets the server's tools until a useful call per intended agent is recorded.Word budget.
PortableTopRuleTestsis re-baselined to 1,205 words, from a 925 ceiling. The user's four modes plus the named-spawn rule do not fit; a 344-word Workers section still dropped user rules. The reason is recorded in the test docstring and the decision record. Reviewers: this is a deliberate budget change.The synthesis also listed the Codex V2 depth statement for the portable CLAUDE.md. It sits in the Ultracode and cooperation recipes instead, so the portable file keeps only the user's approved text and the named-spawn rule.
Review repairs (commit 3).
rtk git push .... RTK 0.50.0 already leaves a command alone when aBash(...)deny rule of the settings files it reads matches it, so a typedgit push --forcestays denied. But a hand-typedrtk git push --forcepasses RTK unchanged. And a rule from a source RTK does not read (managed settings,--settings) sees only the rewrite.rtkform.cp -t DIRoperands as sources and dd'sof=as a write. It no longer takes a grep-family search's own pattern for a file when only plain flags precede it; otherwise every argument still counts.Independent-verification repairs (commit 4). The guard now covers every template credential store (above) and any
nativestack/*.key. A new test derives a reader of every anchored templateReaddeny. The RTK statements are narrowed toBash(...)rules indocs/secret-storage.md, the decision record (rows 5 and 6) and the anti-pattern log, with a new dated log row.source-scoutgets the timeout text. The decision record's mutation evidence row is corrected.Evidence-class table
structural_validationnode test-envelope.mjs254/254;python3 -m unittest tests.test_install_claude_profile(also with PyYAML viauv run --no-project --with pyyaml, 58 tests, no skips)structural_validation, failing-firstnode test-contract-mutations.mjs74/74. The six mutations added in review pass unnoticed against the pre-repair suite (68/74): the HEAD read and the three refusal conditions of the builder, and two agent-table rows. This checks the instruction text, not an agent refusingstructural_validation, failing-firsttest_the_push_denies_also_match_the_rtk_rewriteapplies the documented wildcard rules to both spellings. The template at08b84af3fails all fivertk git pushspellings (template-control.out)local_integration, failing-firstAiMemoryBinTests: 4 failures against the5f3a7c21template, 0 nowrtk) and passes the clients and search patternslocal_integration, failing-firsttests.test_secret_path_guard, includingtest_every_template_read_deny_has_a_blocked_bash_reader, which runscat,head -n,tail -nandrtk readover 26 derived paths. Against the new suite, the guard at3eeb5f7bfails 33 blocked cases, 66rtk proxy, 33 keyring-exec and 40 template-deny subtests (guard-control-2.out); the repaired guard fails none. Of all 25,626 documented shell lines and code spans in the tracked Markdown outsideevidence/, the repair newly blocks 15. Each is an example of a blocked form in this branch's own docs (documented-newly-blocked.out). The review round's control isguard-control.out: the guard at08b84af3failed 11 blocked cases, 204rtk proxysubtests and 5 safe casescat,headandtail -nof aRead-denied store reach Claude Code's rule check asrtk readrtk hook checkon rtk 0.50.0, in a probe project whose.claude/settings.jsonheld the template's 86 deny rules (rtk-read-probe.out). It rewrotecat ~/.ssh/config,cat ~/.ssh/*,head -n 5 ~/.aws/credentialsandtail -n 3 ~/.kube/configtortk read ..., andgrep token ~/.kube/configtortk grep .... It returned "No rewrite" for a baretail FILE,sed,teeand input redirections. The controlgit push --force origin HEADreturned "Denied by a permission rule"rtk read ..., which it does not treat as a file commandsource_reviewupdatedInput), permissions ("Wrappers", the Bash file commands), corroborated by the retainedrtk lsobservation inblueprints/convergence-practice/worker-recovery/README.md. Not exercised in a live sessionlocal_integrationorigin/mainvs the template withadoption/hosts/example.json: hooks identical, 49 deny rules added, none removedrtk git pushthroughrtk hook checkon rtk 0.50.0, in a probe project whose.claude/settings.jsonheld the six push denies. All five force-push forms returned "Denied by a permission rule". A plain and a--force-with-leasepush came back asrtk git push ....rtk git push --force origin HEADreturned "No rewrite". Sources:src/hooks/decision.rsandsrc/hooks/permissions.rsatv0.50.0source_reviewsource_reviewsrc/serena/hooks.py@c6fbd1c; installedserena-hooks --helpLocal commands run
At the final head
45568642(worktree of this branch):The one failure is
test_secret_path_guard.test_host_profile_copy_is_verbatim, and it is expected. This host's~/.claude/hooks/secret_path_guard.pyis the previous guard untilinstall_claude_profile.py --only guardruns, which is a host step outside this unit. The test skips in CI.Decision record
docs/decisions/2026-09-27-claude-harness-settings.md: the decisions, evidence, alternatives (now 1-11), overturn conditions, open user decisions, and the cross-family review and independent verification sections.docs/decisions/2026-09-26-stack-agents-role-dispatch.md. It amends arm B before any run: an Opus builder and verifier, and no frontmatter isolation.Needs follow-up (not in this PR)
evidence/artifacts/token-adoption-e2e-20260926/): its B arm bindsisolated-builder/stack-verifierstages tomodel: 'sonnet', and its runbook says "Keepisolation: worktree". Its own rule requires a merged amendment before launch; this PR does not edit the frozen protocol.catalogs/foundation/decisions.json, decisionlean-workflow-child-routing). Its activation text still routes "isolated-builder(Sonnet/max, own worktree)". This PR's builder is Opus in a coordinator-created checkout with no frontmatter isolation. The decision'ssource_pathsincluderecipes/claude-native-ultracode.mdandexamples/claude-native/workflows/README.md, which this PR changed. Update it through the catalog's own tooling andvalidate_foundationin a foundation-lane follow-up. It is outside this unit's paths (independent verification, finding 5).apply_claude_settings.py), theninstall_claude_profile.py --only guard --only agents. After the guard install, sessions on this host also block Bash readers of the whole~/.ssh, includingconfig,known_hostsand*.pub.isolated-builderandstack-verifieron Opus. Run the WorktreeCreate and named-spawn guard probes, and a Workflow-child SubagentStart probe.~/.sshcarve-outs (U5), which would now change both the template and the guard;AGENTS.mdtrading paragraphs (U6);tmptrust entry (U11);docs/token-efficiency-stack.mdstill carries Practice gaps #6 and #8: truthful skills-install message; agent teams are an allowed dispatch mode #388's dispatch sentence; another unit owns that file.docs/secret-storage.mdcan add that Codex templates: OmniRoute gateway profile, verified base keys and the Codex-template token gaps #395's user template sets[features] shell_snapshot = false. The deny rules and the guard still cover snapshots written before that change, or by a lane that turns the feature on.rtk git pushforms with them. After each RTK upgrade, re-run both probes, each in a project whose settings hold the template's rules, thenrtk hook checkon each form. The push probe confirms RTK still leaves denied commands alone. The read probe checks whether RTK still rewritescatof aRead-denied store. On this host's current settings, RTK 0.50.0 also leaves the template's other Bash denies alone:env,printenv,git credential fillandgh auth git-credentialreturn "Denied by a permission rule". The token-print forms were not probed, because the guard blocks a probe that names them and blocks those commands itself.git reset --hardandgit clean -fhave nortkforms, so a hand-typedrtk git reset --hardpasses the template's denies (recorded in the decision record's limitations).Residuals
Bash(git clean -*f*)false positive (cross-family finding 5). A dry run on a path containingfis denied, and this is kept deliberately: narrower*rules would miss clusters such as-dfx, and a git token hook would have no upstream source. It is recorded as a limitation and as alternative 9.Guard gaps, recorded and asserted in
EXPECTED_PASS_THROUGH:cd;kubectl config view --raw,gpg --export-secret-keys);sqlite3);tar czf k.tgz ~/.ssh);~/.n*rc);~/.config, and~/.codex, which holdsshell_snapshots);~/.claude, whose.credentials.jsonis blocked only by name);DATA_DIRelsewhere.Closing the
~/.claudeand~/.codexdirectory forms would also block common whole-directory searches in every session. They are outside this round's findings and are left to a decision.Guard over-blocking, recorded and asserted in
BLOCKED.scp -i KEY,rsync -e 'ssh -i KEY'andgpg --homedir ~/.gnupgare blocked, and so iscp -t DIRinto a store directory.No live permission evaluation. No Claude Code session evaluated the new rules. The RTK side is a dry run, and the Claude side is source review.
Host test.
test_host_profile_copy_is_verbatimfails on this host until the coordinator installs the guard.Checklist
rtk hook checkprobe that named a token command, and it was dropped. The guard was never bypassed. This round's RTK probe is a dry run (rtk hook check) that opens none of the files it names.catalogs/foundation/is left to its owner (follow-up above).Cross-family review
One round was run, as required, from the worktree on the pre-repair head
a22a042f. That head held commits 1-2 plus the first manifest re-registration; that commit was rebuilt as the last commit after the repairs. The reviewed patch is retained asreview.diff(git diff origin/main...HEAD, 2,016 lines). The command:~/.local/share/codex-ecosystem/bin/codex-omniroute exec --skip-git-repo-check -s read-only -o gpt6-review.md "<prompt>" </dev/null.The events header records
model: cx/gpt-6-astra,provider: omniroute,sandbox: read-onlyandreasoning effort: max. That effort is the client's request; what the gateway forwarded upstream was not observed. The run used 86,448 tokens and took 10 minutes 18 seconds. The prompt named the local copies of the cited upstream sources and carried no reasoning of this unit.Verdict: DEFECTS FOUND, 9 findings. Seven held and were fixed. One held in part and was fixed for the part that held. One is kept as a recorded residual. There was no second round.
rtk git push ..., the spelling RTK's hook producesBash(...)deny rule matches, so the typed forms stay denied. The sixrtk git pushdenies still close a hand-typed rtk spelling and rules from sources RTK does not read. There is a failing-first matcher test, and the anti-pattern log records the flawed first reproductionrtk/rtk proxyprefixesrtk proxy cat .envalso passed). Every rule now reads the command anrtkform runs, and every blocked case is re-tested behindrtk proxycp -t DIR SRCpasses because the last operand was taken for the destination-t), with testsof=were taken for credential readsof=is a write. There are tests for both, and--include,-g,-e,-fand-Astay blockedBash(git clean -*f*)deniesgit clean -n foolocal_integrationstructural_validationin the decision record and this bodyThe raw review is
units/claude/gpt6-review.md, the events areunits/claude/gpt6-review.events.jsonl, and the reviewed diff isunits/claude/review.diff.Independent verification
An independent verifier checked the repaired head
3eeb5f7band reported five defects. Each was checked against source before acting, and all five held and were fixed, finding 5 as a recorded follow-up. No further GPT-6 round was run.Readdenies also stop Bashcat/head/tail, and the RTK text said RTK leaves any deny-matched command alone. On hosts runningrtk hook claude, neither holds, and the guard did not cover these storesrtk hook check 'cat ~/.ssh/config'→rtk read ~/.ssh/config;head -nandtail -nwere rewritten too, andgrepbecamertk grep. The source matches: rtkrules.rs,registry.rsandpermissions.rs(append_bash_rules). The guard now blocks a reader of every path the template's credential-storeReaddenies cover. The guard reads the command as written, and its deny wins (hooks precedence). A new template-derived test (26 rules ×cat,head -n,tail -n,rtk read) exposed and closednativestack/*.keyas well. The RTK wording is narrowed toBash(...)rules indocs/secret-storage.md, decision rows 5 and 6, the anti-pattern row and the profile test comment. There is a new dated anti-pattern row, and alternatives 10-11 record why the gap was not left documented and why RTK exclusions or per-reader Bash denies were rejectedcat ~/.ssh/*,cp -r ~/.ssh,grep -r BEGIN ~/.ssh,find ~/.aws -exec cat,rtk read ~/.aws/*...)HF_HOME_ROOTprecedent. It covers each store directory, a glob in it and the Docker home as a whole, and every listed form is now aBLOCKEDcase (also behindrtk proxy).ls,chmod,statandssh -istill pass..pub,configandknown_hostsfollow the template's whole-~/.sshdeny, and a U5 carve-out would change both. Ancestors (~/.config,~/.codex) and~/.claudestay recorded gaps in both documented listssource-scoutstill said "The tool limit is 10 minutes"stack-verifier'sBASH_MAX_TIMEOUT_MSceiling and background-command text is now in all three copies (byte-identical), and the envelope, mutation and profile suites passmutations-control-old-envelope.out. The stop mutation was detected; the HEAD read and the three refusal conditions, and the two table rows, were not (68/74)catalogs/foundation/decisions.jsonlean-workflow-child-routingstill routesisolated-builder(Sonnet/max, own worktree), and it was not in the follow-up listReceipts, all in
units/claude/:rtk_read_probe.pyandrtk-read-probe.out,guard_control2.pyandguard-control-2.out,tests-all-5.out, andvalidate-sh-5.out.🤖 Generated with Claude Code