Skip to content

Codex CLI 0.159.2 pin with qualification receipt; Codex template default GPT-6.1 Sol/Ultra with Astra escalation (unit D4) - #542

Merged
seathatflowsinourveins merged 15 commits into
mainfrom
claude/sota-defaults-d4-codex-0159-20260930
Sep 30, 2026
Merged

seathatflowsinourveins merged 15 commits into
mainfrom
claude/sota-defaults-d4-codex-0159-20260930

Conversation

@seathatflowsinourveins

Copy link
Copy Markdown
Collaborator

Scope

  • What this PR changes: moves the Linux Codex CLI pin 0.157.1 -> 0.159.2 with a native-CLI qualification receipt of the existing prefix; moves tools/adoption/apply_codex_lane.py's CODEX_VERSION and its test fakes with the pin (a new guard test keeps them equal); makes the Codex template coordinator GPT-6.1 Sol/Ultra, generic children and the stack-worker profile Sol/Max with an Astra escalation note (user decision 2026-09-30, folded from the Codex coordinator lane's 2026-09-30 work in the main checkout, snapshot sha256 5de56d6d81453ed3); updates current-pin prose; records the macOS follow-up.
  • Base commit: 11227bfd (origin/main at rebase)
  • Lane: lane:shared (manifests/stack.json and manifests/evidence.json are hot files); needs the trading lane's acknowledgement before merge.
  • Merge rule (Gate A owner, 2026-09-30): merge on this static receipt, on its own tests, before the Amendment 4 revision is cut; the host launcher already resolves to tools/codex-0.159.2 (observed 2026-09-30), so merging makes the frozen row tools.pinned_versions_match true. This PR changed nothing on the host. Live 0.159.2 behaviour (role spawn, --ignore-user-config with the role carriers, sandbox, join proof) is covered by the Gate A owner's rehearsal receipts and lands later as a dated addendum to the receipt.
  • Owned paths touched: adoption/pins-linux-x86_64.json, adoption/templates/codex.config.template.toml, adoption/templates/codex.stack-worker.config.toml, adoption/bootstrap.md, adoption/platforms/linux-wsl2.md, adoption/platforms/macos-arm64.md, recipes/README.md, tools/adoption/apply_codex_lane.py, tools/adoption/prove_codex_lane.py, tests/test_codex_worker_lane.py, tests/test_render_config.py, tests/test_adoption_status.py, tests/test_adoption_bootstrap_macos.py, docs/harness-defaults.md, docs/decisions/2026-09-27-model-currency.md, docs/decisions/2026-09-30-sol-primary-quality-defaults.md (new), evidence/receipts/codex-01592-qualification-20260930.json (new), blueprints/token-native-focus/saturation-audit.json, catalogs/landscape/upstream-snapshot.json; hot: manifests/stack.json (codex row only), manifests/evidence.json (one receipt row plus registrations, last commit only); generated: catalogs/landscape/new-host-grand-list.json, docs/new-host-grand-list.md.
  • Frozen surfaces: sealed-E2E rows of tools/token-e2e/freeze_snapshot.py (RUNBOOK, preregistration, adoption/hooks/claude, tools/capability-gate, workflow files, skill_usage.py, role copies, codex_roles.py): none touched. Tier-A frozen list (AGENTS.md, CLAUDE.md, adoption/hooks/**, adoption/agents/**, claude.settings.template.json, adoption/skills/manifest.json): none touched. Files whose deployment would change frozen host rows (~/.codex/config.toml, ~/.codex/stack-worker.config.toml): adoption/templates/codex.config.template.toml, adoption/templates/codex.stack-worker.config.toml, tools/adoption/apply_codex_lane.py; do not render or apply them on the Gate A host during window W.
  • Model, effort and role-model lines changed:
    • coordinator: codex.config.template.toml model = "gpt-6-astra" -> "gpt-6.1-sol"; model_reasoning_effort = "ultra" unchanged.
    • default_subagent_model: default_subagent_model = "gpt-6.1-sol" added; default_subagent_reasoning_effort = "max" unchanged.
    • stack-worker profile: codex.stack-worker.config.toml model = "gpt-6-astra" -> "gpt-6.1-sol"; model_reasoning_effort = "max" unchanged; worker command -m gpt-6.1-sol.
    • Astra escalation note: stack-worker header "For difficult judgment or escalation, substitute -m gpt-6-astra and keep max effort and live web search."; recipes/README.md worker paragraph; prove_codex_lane.py live-worker line.
    • unchanged: codex.omniroute.config.toml (cx/gpt-6-astra at max), adoption/agents/codex role TOMLs (Astra), the Gate A RUNBOOK and preregistration arms (-m gpt-6-astra), landscape-sweep/codex_job.py.

SOTA sources

  • openai/codex release rust-v0.159.2 (https://github.com/openai/codex/releases/tag/rust-v0.159.2; tag commit ff6aec96948b70d94983af2641a6b67c94faeff5), compared with rust-v0.157.1 (36650394c5b38c2990ccf2a3457165ca3e9d9726): codex-rs/exec/src/{cli.rs,exec_events.rs,event_processor_with_jsonl_output.rs}, codex-rs/utils/cli/src/shared_options.rs, app-server/src/config_manager_service.rs, agent-roles/src/{loader.rs,discovery.rs}, config/src/loader/mod.rs (byte-identical); codex-mcp/src/rmcp_client.rs (30 s default moved to L105/L344); cli/src/doctor.rs; core/src/agent/child_config.rs L62-73, L204-249 (subagent defaults).
  • Release notes rust-v0.158.0 (--oauth-client-secret, hooks, shell snapshot, MCP items), rust-v0.159.0, rust-v0.159.1 ("Added GPT-6.1 Sol as the default model in the bundled catalog"), rust-v0.159.2.
  • npm @openai/codex@0.159.2 (dist.integrity sha512-SE13C3nZCYoVL569BdegoOl6vwjb7o2sXOo7ivwVzaVoY0cswwi0/6pIE0TyO/C0vIkQh3jslExitET7PBTfIg==) and @openai/codex@0.159.2-linux-x64, SLSA provenance .github/workflows/rust-release.yml at refs/tags/rust-v0.159.2; GitHub assets codex-package-x86_64-unknown-linux-musl.tar.gz and codex-package_SHA256SUMS.
  • developers.openai.com/codex/changelog and /codex/models (read 2026-09-30; the announcement page answered 403 and is not relied on).
  • diegosouzapw/OmniRoute PR #15167, via this repository's evidence/artifacts/omniroute-sol-max-20260930/receipt.json (OmniRoute 20128 at max effort for gpt-6.1-sol: upstream PR 15167 on the running build, lsof shim v2, restart record #534); not re-observed here.
  • Repository references: evidence/receipts/codex-01571-qualification-20260926.json (mirrored); docs/acceptance-evidence-policy.md; docs/lanes.md hot-file protocol; blueprints/convergence-practice/gpt6-family-tiering-20260926/README.md (Preregister the GPT-6 family routing test (astra/sol/luna x max/medium) on the frozen 8-K extraction task #359, the preregistered comparison and its -0.02 micro-F1 bound).
  • Cross-family review (GPT-6 through the OmniRoute gateway, read-only) of this head: verdict line posted as a PR comment when the gateway review completes.

Evidence-class table

Claim Evidence class Command / receipt
The existing tools/codex-0.159.2 prefix is byte-identical to the verified npm and GitHub artifacts (49/49, failing controls) native_proven receipt data.prefix_byte_identity, data.github_assets
0.159.2's CLI surface matches 0.157.1 where the stack uses it (help, mcp shapes, features, prompt-input marker); no provider, no network native_proven receipt data.native_checks
gpt-6.1-sol is in 0.159.2's bundled catalog, absent from the Linux 0.155.1 and 0.157.1 builds (offline) native_proven receipt data.checks_after_the_constant_move.bundled_catalogs_offline
The lane's integration tests pass on the real 0.159.2 native binary (10/10) and skip on 0.157.1 local_integration NAS_CODEX_INTEGRATION=1 python3 -m unittest -v tests.test_codex_worker_lane.CodexIntegrationTests with the prefix's vendor bin first on PATH; receipt data.lane_checks.integration_tests
apply_codex_lane.py's version precondition passes at 0.159.2; the 0.157.1 control fails it local_integration receipt data.lane_checks
19 rollouts from 0.159.2 parse with 0 errors by the repository's parsers local_integration (synthetic malformed-line control) receipt data.rollout_item_shapes
CODEX_VERSION equals the Linux pin; the fake codex behaves as 0.159.2 synthetic 276 tests OK
Cited Codex sources unchanged or moved at rust-v0.159.2 source_review raw.githubusercontent.com at both tag commits; receipt data.source_checks
20128 sends 6.1 Sol max as max since 2026-09-30T06:32:50Z source_review (cited from #534's record, not re-run) evidence/artifacts/omniroute-sol-max-20260930/receipt.json
Live 0.159.2 turns, prove --live, apply --apply on a real home not run (Gate A owner's rehearsal covers live behaviour) receipt limitations

No unchanged upstream tests (cargo test) were run.

Local commands run

$ HOME=<scratch> XDG_CONFIG_HOME=<scratch> XDG_STATE_HOME=<scratch> python3 -m unittest tests.test_release_pin_contents tests.test_codex_worker_lane tests.test_adoption_status tests.test_render_config tests.test_stack_lifecycle
exit 0; Ran 276 tests; OK (skipped=10)
$ NAS_CODEX_INTEGRATION=1 PATH="<prefix vendor bin dir>:$PATH" python3 -m unittest -v tests.test_codex_worker_lane.CodexIntegrationTests
exit 0; Ran 10 tests; OK   (with the prefix's npm bin first on PATH the tests' own PATH lacks node: FAILED (failures=15, skipped=2))
$ python3 -m unittest <the three registry tests>
exit 0; Ran 3 tests; OK
$ python3 scripts/validate.py
exit 0; {"components": 69, "hashed_files": 8516, "profiles": 4, "receipts": 177, "status": "passed"}
$ python3 scripts/landscape.py ; python3 scripts/validate_convergence.py --all-recorded
exit 0 "status": "passed" ; exit 0, all records valid
$ python3 scripts/adoption_status.py --pinned-versions --json   (codex row)
{"id": "codex", "pinned_version": "0.159.2", "checked": true, "matches_pin": true}

Decision record

docs/decisions/2026-09-27-model-currency.md (addendum 2026-09-30: the constant move, the macOS follow-up, the #534 reconciliation, and the preregistered #359-style comparison with arms A0, S1, S61-0, S61-1 that would overturn the lane tiers); docs/decisions/2026-09-30-sol-primary-quality-defaults.md (routing record, folded unchanged from the Codex coordinator lane with an attribution line).

Follow-up: macOS needs its own 0.159.x qualification before the template default applies there (adoption/pins-macos-arm64.json stays 0.155.1; a model placeholder in tools/adoption/render_config.py filled from the platform pins, as SOCRATICODE_VERSION is, would be the override; not implemented).

Host evidence

No files under evidence/hosts/ changed.

Checklist

  • No GitHub Actions changed.
  • No workflows changed.
  • No secrets printed, logged or committed (the host client-config quote was withheld).
  • No paid hosting, subscription or billing surface.
  • Peer-owned untracked files and worktrees preserved.

🤖 Generated with Claude Code

@seathatflowsinourveins seathatflowsinourveins added the lane:shared Touches files owned by both lanes; needs both lanes' acknowledgement label Sep 30, 2026
@seathatflowsinourveins

Copy link
Copy Markdown
Collaborator Author

Trading lane acknowledgement (docs/lanes.md:146-150). Reviewed at head 75702dfee5ab885eb746c734208db7e3b61bbc80 (base 11227bfdf25b55b0481a9e78985c3fed26052472) by native-agent-stack-e0, which holds the trading lane.

  • Trading paths: none of the 23 files is trading-owned (docs/lanes.md:25); adoption/manifest.json (whose trading-nautilus and research-runtime profile entries are trading-owned) is not touched.
  • Shared hot files (docs/lanes.md:26): in manifests/stack.json only the codex row differs; manifests/evidence.json changes the entries of 20 files this PR edits, adds 1 file entry and 1 receipts[] entry (the Codex 0.159.2 qualification receipt), and removes nothing (docs/lanes.md:94-97). The regenerated grand-list reports change through their --write commands.
  • Dependence: no paper, recovery, monitor or overnight unit runs Codex, and the paper venv and engine are separate. The only trading code that can call a host Codex binary is the opt-in research worker (blueprints/us-equities/workers/native_worker.py --codex-bin), which a 0.159.2 host pin does not break; its own SDK pin moves separately in the Codex SDK follow-up.
  • OSV and catalog: ignored advisory ids and expiries are unchanged; domain_boundary is unchanged.

No objection. Merge with this head pinned and 8/8 required checks in bucket pass (docs/lanes.md:153-167); a later head needs a new look unless manifests/stack.json's trading rows and the files above are unchanged between the heads (docs/lanes.md:181-190).

@seathatflowsinourveins

Copy link
Copy Markdown
Collaborator Author

Cross-family review (GPT-6 through the OmniRoute gateway, read-only, of head 75702df / the same content at 373f5def):

medium | adoption/templates/codex.config.template.toml:5 | The shared template unconditionally selects `gpt-6.1-sol` for the coordinator and children, while macOS remains pinned to Codex 0.155.1. An in-memory render with `platform_id="macos-arm64"` confirms it emits these incompatible defaults; documenting the limitation does not prevent their installation. GPT-6.1 Sol entered the bundled catalog in [0.159.1](https://github.com/openai/codex/releases/tag/rust-v0.159.1). | Fix: resolve both model defaults by platform, preserve Astra for the existing macOS pin, and add a regression test for the macOS render.

verdict: needs_changes — The model-default change must preserve compatibility with the retained macOS pin.

Action: the finding stands. A per-platform model placeholder in tools/adoption/render_config.py (filled from the platform pins, like SOCRATICODE_VERSION) will keep gpt-6-astra on a platform whose pinned Codex lacks the GPT-6.1 catalog (macOS at 0.155.1) and gpt-6.1-sol where the pin is 0.159.x; it lands as one more commit on this PR before merge.

@seathatflowsinourveins

Copy link
Copy Markdown
Collaborator Author

Lane check on head 75702df (session terminal-notification-tuning, 2026-09-30, about 14:45Z; not a review of the Sol/Astra routing content):

No action needed. For the record, #532's footprint in shared files on main: docs/harness-defaults.md (four appended rows), manifests/evidence.json (hot file, re-registered) and docs/decisions/2026-09-28-terminal-experience.md.

seathatflowsinourveins pushed a commit that referenced this pull request Sep 30, 2026
…w of #542)

The template set model and default_subagent_model to "gpt-6.1-sol" on every platform, while
adoption/pins-macos-arm64.json pins Codex 0.155.1, whose bundled catalog has no GPT-6.1 entry. Both keys now read
${CODEX_MODEL}, which tools/adoption/render_config.py fills from the selected platform's Codex pin as it fills
SOCRATICODE_VERSION: gpt-6.1-sol from Codex 0.159.1, gpt-6-astra before it. --set CODEX_MODEL=<model> names
another; --out and --check print a derived value with its pin and sources.

The threshold is 0.159.1, not 0.159.0: openai/codex codex-rs/models-manager/models.json has no "gpt-6.1-sol" slug
at rust-v0.159.0 (687a119f) and one at rust-v0.159.1 (8e68a98e, line 178), whose release notes read "Added GPT-6.1
Sol as the default model in the bundled catalog". At rust-v0.155.1 (be2951ea) models.json lists gpt-6-astra with
efforts low to ultra, and config/src/config_toml.rs L694-696 reads both [agents] default_subagent keys.

The stack-worker profile keeps its literal gpt-6.1-sol: apply_codex_lane.py installs it verbatim, worker_pins()
passes its model as -m, and the lane refuses any codex but CODEX_VERSION (the Linux pin). test_profile_template
now asserts that the literal equals the rule for lane.CODEX_VERSION.

Tests: CodexModelTests (both platforms, the 0.159.0/0.159.1 boundary, a host override, a platform without pins
failing closed, the --out/--check note) failed first against the unchanged renderer and template (9 run: 6
failures, 12 errors). The K2 check in test_omniroute_profile_template reads a Linux render, and the strict-config
integration fixture fills CODEX_MODEL from the rule.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@seathatflowsinourveins
seathatflowsinourveins force-pushed the claude/sota-defaults-d4-codex-0159-20260930 branch from 75702df to a3a276a Compare September 30, 2026 16:15
@seathatflowsinourveins

Copy link
Copy Markdown
Collaborator Author

New head a3a276ac (review follow-up: per-platform Codex model placeholder). The history was rebuilt on origin/main 11227bf so that manifests/stack.json and manifests/evidence.json change only in the last commit (hot-file protocol in docs/lanes.md); the resulting tree is byte-identical to the reviewed local build, and git diff 75702dfe a3a276ac -- manifests/stack.json blueprints/us-equities/ catalogs/us-equities/ is empty, so the trading-lane ack given on 75702df covers the same shared-file content.

What changed since 75702df

  • adoption/templates/codex.config.template.toml renders model = "${CODEX_MODEL}" and default_subagent_model = "${CODEX_MODEL}"; tools/adoption/render_config.py derives CODEX_MODEL from the platform's pinned Codex: gpt-6.1-sol on 0.159.1 or newer, else gpt-6-astra.
  • Rendered Linux x86_64 (pin 0.159.2): model = "gpt-6.1-sol", default_subagent_model = "gpt-6.1-sol". Rendered macOS arm64 (pin 0.157.1): both lines gpt-6-astra. render_config.py --check exits 0 on both platforms.
  • Cutoff 0.159.1, not 0.159.0: gpt-6.1-sol first appears in models.json at upstream tag rust-v0.159.1 (commit 8e68a98e, line 178).
  • adoption/templates/codex.stack-worker.config.toml keeps the literal gpt-6.1-sol: that profile is installed byte-for-byte and the worker lane only runs on the 0.159.2 pin (apply_codex_lane.py CODEX_VERSION).
  • Docs and evidence: the model-currency addendum, docs/decisions/2026-09-30-sol-primary-quality-defaults.md, receipt evidence/receipts/codex-01592-qualification-20260930.json limitations[12] (placeholder rule), plus one line each in adoption/platforms/macos-arm64.md and adoption/bootstrap.md (outside the unit's listed paths; flagged for review).

Checks on this tree (builder run on the identical tree, coordinator re-ran validate at the new head)

  • python3 -m unittest tests.test_render_config tests.test_codex_worker_lane tests.test_release_pin_contents tests.test_adoption_docs_consistency tests.test_codex_agents: 438 tests OK, 42 skips (missing optional binaries and services).
  • CodexIntegrationTests: 10/10 on the real 0.159.2 native binary.
  • python3 scripts/validate.py: passed (8516 hashed files, 177 receipts).
  • The three registry tests: OK. Privacy scan of the added lines: 0 matches.

Merge order: after #546 (osv fixes) lands, this branch is rebased with the hot-file protocol and merged with --match-head-commit.

🤖 Generated with Claude Code

@seathatflowsinourveins

Copy link
Copy Markdown
Collaborator Author

Trading lane acknowledgement (docs/lanes.md:146-150). Reviewed at head a3a276ac7280655d66b4279f2a4f42de8b17d2fb (base 11227bfdf25b55b0481a9e78985c3fed26052472) by native-agent-stack-24, which holds the trading lane since native-agent-stack-e0 ended. This replaces the acknowledgement at 75702dfe.

  • Between the heads: git range-diff 11227bfd..75702dfe 11227bfd..a3a276ac adds two commits and rewrites the hot-file commit; the files that differ are adoption/bootstrap.md, adoption/platforms/macos-arm64.md, adoption/templates/codex.config.template.toml, docs/decisions/2026-09-27-model-currency.md, the Codex 0.159.2 qualification receipt, manifests/evidence.json, tests/test_codex_worker_lane.py, tests/test_render_config.py and tools/adoption/render_config.py. None is trading-owned.
  • Trading paths: none of the 24 files is trading-owned (docs/lanes.md:25); adoption/manifest.json is not touched.
  • Shared hot files (docs/lanes.md:26): in manifests/stack.json only the codex row differs; manifests/evidence.json changes the entries of 21 files this PR edits, adds 1 file entry and changes receipts[] (the qualification receipt), and removes nothing; no added hot-file line names a trading component.
  • Dependence: unchanged from the earlier acknowledgement: no paper, recovery, monitor or overnight unit runs Codex; the paper venv and engine are separate.
  • OSV and catalog: ignored advisory ids and expiries are unchanged (the Lumibot lock's two oauthlib ignores still expire 2026-10-13, tracked in Relock OpenHands onto oauthlib 4.0.0 / PyJWT 2.15.1 by 2026-10-08 (osv ignores from #517 expire 2026-10-13) #518); domain_boundary is unchanged.

No objection. Merge with this head pinned and 8/8 required checks in bucket pass (docs/lanes.md:153-167); a later head needs a new look unless the trading rows of manifests/stack.json and the files above are unchanged between the heads (docs/lanes.md:181-190).

seathatflowsinourveins pushed a commit that referenced this pull request Sep 30, 2026
…w of #542)

The template set model and default_subagent_model to "gpt-6.1-sol" on every platform, while
adoption/pins-macos-arm64.json pins Codex 0.155.1, whose bundled catalog has no GPT-6.1 entry. Both keys now read
${CODEX_MODEL}, which tools/adoption/render_config.py fills from the selected platform's Codex pin as it fills
SOCRATICODE_VERSION: gpt-6.1-sol from Codex 0.159.1, gpt-6-astra before it. --set CODEX_MODEL=<model> names
another; --out and --check print a derived value with its pin and sources.

The threshold is 0.159.1, not 0.159.0: openai/codex codex-rs/models-manager/models.json has no "gpt-6.1-sol" slug
at rust-v0.159.0 (687a119f) and one at rust-v0.159.1 (8e68a98e, line 178), whose release notes read "Added GPT-6.1
Sol as the default model in the bundled catalog". At rust-v0.155.1 (be2951ea) models.json lists gpt-6-astra with
efforts low to ultra, and config/src/config_toml.rs L694-696 reads both [agents] default_subagent keys.

The stack-worker profile keeps its literal gpt-6.1-sol: apply_codex_lane.py installs it verbatim, worker_pins()
passes its model as -m, and the lane refuses any codex but CODEX_VERSION (the Linux pin). test_profile_template
now asserts that the literal equals the rule for lane.CODEX_VERSION.

Tests: CodexModelTests (both platforms, the 0.159.0/0.159.1 boundary, a host override, a platform without pins
failing closed, the --out/--check note) failed first against the unchanged renderer and template (9 run: 6
failures, 12 errors). The K2 check in test_omniroute_profile_template reads a Linux render, and the strict-config
integration fixture fills CODEX_MODEL from the rule.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@seathatflowsinourveins
seathatflowsinourveins force-pushed the claude/sota-defaults-d4-codex-0159-20260930 branch from a3a276a to 2ab7906 Compare September 30, 2026 18:41
@seathatflowsinourveins

Copy link
Copy Markdown
Collaborator Author

Rebased onto origin/main 8fc8611 (after #546) with the hot-file protocol: main's manifests/evidence.json taken and this unit's files re-registered in the last commit; python3 scripts/validate.py passed; new head 2ab7906d, tree otherwise unchanged. It also carries the provenance wording agreed with the Codex runtime lane for the folded Sol-defaults record and the model-currency addendum: "pre-existing uncommitted changes observed in the main checkout; original author not established" (docs only).

🤖 Generated with Claude Code

Scout and others added 15 commits September 30, 2026 14:47
…greement

adoption/pins-linux-x86_64.json codex entry: 0.157.1 -> 0.159.2 (npm wrapper
cf1e5d7b..., 4,904 bytes; platform package 84a6b35f..., 162,475,310 bytes), both
matched npm dist.integrity, npm audit signatures verified signatures and
attestations, SLSA provenance names rust-release.yml at refs/tags/rust-v0.159.2
(ff6aec96). The note now records that from 0.159.x the npm platform package's
vendor tree is the complete native package (44 files byte-identical to the
GitHub codex-package asset listed in codex-package_SHA256SUMS).

tests/test_adoption_status.py: PinManifestAgreementTests checks that every Linux
pin names manifests/stack.json's version of the same component (a " @ <commit>"
suffix is ignored), with a mutation self-check. It fails at this commit
(codex: pin 0.159.2, manifests/stack.json 0.157.1) and passes once the manifest
row moves in the last commit of this branch.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…0); model-currency addendum

adoption/templates/codex.config.template.toml: model gpt-6-astra -> gpt-6.1-sol,
model_reasoning_effort stays ultra, with a comment naming the addendum; the
client-pin comment now cites the 0.159.2 qualification receipt. The judgment
lanes keep their gpt-6-astra bindings (stack-worker profile, landscape-sweep
lane, cx/gpt-6-astra OmniRoute profile), and tests/test_codex_worker_lane.py's
K2 assertion now reads the template's (model, effort) pair.

docs/decisions/2026-09-27-model-currency.md: dated addendum 2026-09-30 with the
GPT-6.1 Sol release (Codex changelog and models page, read 2026-09-30; the
announcement page answered 403), the client gate (rust-v0.159.1 bundled
catalog; offline codex debug models), the OmniRoute xhigh clamp for unregistered
ids read from the installed build's reasoningSuffix.ts and codex.ts, the user's
decision (6.1 Sol ultra default, Astra ultra for complex workflows), and the
preregistered #359-style comparison (A0, S1, S61-0, S61-1; the -0.02 micro-F1
bound) that overturns the lane tiers.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…09-30)

Folded from the Codex coordinator lane's 2026-09-30 work in the main checkout
(snapshot tracked.diff sha256 5de56d6d81453ed3), D4's assigned files only:

- adoption/templates/codex.config.template.toml: both hunks, reconciled with
  this branch's header into one: Sol/Ultra coordinator with its rust-v0.159.2
  citations and the routing record; [agents] default_subagent_model
  gpt-6.1-sol with default_subagent_reasoning_effort max (child_config.rs
  L62-73, L204-249).
- adoption/templates/codex.stack-worker.config.toml: worker profile Sol/Max,
  Astra substitution for judgment or escalation (applied unchanged).
- tests/test_render_config.py (all hunks), tools/adoption/prove_codex_lane.py
  (live-worker line), recipes/README.md (worker command and effort paragraph):
  applied unchanged with git apply --include.
- tests/test_codex_worker_lane.py: only the profile-model, worker_pins,
  worker_command and recipe assertions; the TOP_RULE_SHA256 and word-count
  hunks are F1's; the template-model hunk is already covered by this branch's
  (model, effort) assertion.
- docs/harness-defaults.md: only the "Sol-primary quality defaults" paragraph.
- docs/decisions/2026-09-30-sol-primary-quality-defaults.md: verbatim, plus a
  dated attribution line linking the model-currency addendum.
- docs/decisions/2026-09-27-model-currency.md: the addendum now names that
  record as the routing contract and follows its routes (workers and generic
  children Sol/Max; Astra kept by the lanes that name it).

The Gate A runbook and preregistration arms, which pass -m gpt-6-astra
explicitly, are untouched. Hash registrations follow in the last commit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…in version

evidence/receipts/codex-01592-qualification-20260930.json (native_cli_e2e,
mirroring codex-01571-qualification-20260926): npm and GitHub artifact integrity
with failing controls, byte identity of the existing tools/codex-0.159.2 prefix
(49/49), credential-free bwrap checks of 0.159.2 against 0.157.1 (version, help,
mcp list/get shapes, features, prompt-input marker, offline bundled catalog),
source identity of the exec --json layer at the two tag commits,
prove_codex_lane.py --help and static checks, apply_codex_lane.py dry run, and a
read-only rollout/item-shape check with the repository's own parsers over the
host's 19 rollouts written by 0.159.2. No live model call; the host launcher
already resolved to 0.159.2 and this unit changed nothing on the host.

Records that mirror the manifest version, as the 0.157.1 switch (#348) moved
them: catalogs/landscape/upstream-snapshot.json codex entry (selected 0.159.2;
repo and releases/latest re-checked 2026-09-30, the rust-v0.159.2 commit through
git protocol after REST 403s), blueprints/token-native-focus/saturation-audit.json
codex row (version and the new receipt), tests/test_adoption_bootstrap_macos.py
MAC_PIN_LAGS_LINUX (Mac 0.155.1, Linux 0.159.2). The manifests/stack.json codex
row and the evidence registration follow in the branch's last commit
(docs/lanes.md hot-file protocol).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e two agree

tools/adoption/apply_codex_lane.py: CODEX_VERSION 0.157.1 -> 0.159.2, so the lane
applies on a host at the Linux pin (the dry run refused 0.159.2 with "[fail] codex
version: codex-cli 0.159.2 (pin 0.157.1)"). The exact-equality check is unchanged.
Its source citations were compared at the two tag commits (36650394, ff6aec96)
through raw.githubusercontent.com: config_manager_service.rs, agent-roles
loader.rs and discovery.rs are byte-identical; rmcp_client.rs keeps the 30 s
DEFAULT_STARTUP_TIMEOUT and its unwrap_or at L105 and L344 (L103 and L342 before).

tests/test_codex_worker_lane.py: the fake codex answers --version and doctor
--json as 0.159.2; the module, fake and ApplyFlowTests docstrings and the
integration skip message name 0.159.2; the DOCTOR shape note records that
doctor.rs differs at rust-v0.159.2 only in a handshake-error match arm. New
TemplateTests.test_the_lane_pins_the_linux_codex_pin checks CODEX_VERSION against
adoption/pins-linux-x86_64.json; it failed first ('0.157.1' != '0.159.2').

Opt-in CodexIntegrationTests against the 0.159.2 prefix's native binary
(sha256 1748767b...): 10/10 OK; with 0.157.1 on PATH all 10 skip.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…emplate default

recipes/README.md: the codex archive-hash row names rust-v0.159.2's
codex-package asset (9e2d29a7..., equal to its API digest and its
codex-package_SHA256SUMS line); the codex component row names 0.159.2 with its
release link and npm prefix, scopes the --search and daemon_auto_start
measurements to the versions that ran them, and points to the 0.159.2 receipt;
the stack-worker bullet describes the folded profile (gpt-6.1-sol at max, Astra by
-m on escalation); the rmcp_client.rs, mcp add --help, exec_events.rs and two
strict-config statements now also cite 0.159.2 where it was checked (source
compared at ff6aec96; the strict cases re-run through CodexIntegrationTests); the
PreToolUse/MCP sentence is scoped as not re-checked at 0.159.2.

adoption/bootstrap.md, adoption/platforms/linux-wsl2.md and macos-arm64.md: the
Linux codex pin history reads 0.155.1 -> 0.157.1 -> 0.159.2; the WSL2 terminal
measurement keeps its Codex 0.157.1 condition, now marked as before the move;
the macOS pin stays 0.155.1, and both pages name the follow-up: macOS needs its
own 0.159.x qualification before the template default applies there.

docs/decisions/2026-09-27-model-currency.md (addendum 2026-09-30): the worker_pins
line citation follows the file (298-304); the CODEX_VERSION move is recorded as
done here; a new follow-up paragraph records the macOS gap (bundled catalogs of
the Linux 0.155.1 and 0.157.1 builds lack gpt-6.1-sol, offline) and where a
per-platform model override would go (render_config.py render_one,
resolve_socraticode_version, pinned_version), not implemented.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…and the macOS gap

evidence/receipts/codex-01592-qualification-20260930.json, amended in data and
text (id, kind and components unchanged):
- claim: the apply dry run failed its version precondition while CODEX_VERSION
  was 0.157.1 and passes after the move ('[ok] codex version: codex-cli 0.159.2
  (pin 0.159.2)', the 0.157.1 control now [fail]); the opt-in
  CodexIntegrationTests passed 10 of 10 on the prefix's native binary and skip on
  0.157.1; the static prove checks re-run byte-identical with this branch's file;
  the 0.155.1 build's bundled catalog also lacks gpt-6.1-sol.
- limitations: the constant move is no longer outside this unit; the npm-launcher
  and /tmp-bwrap runs of the integration tests and why they fail are recorded;
  the list of what moves now includes the lane and the current-pin prose; a new
  item names the macOS follow-up (its own 0.159.x qualification before the
  template default applies there) and the render_config.py override site.
- data: lane_checks gains prove_static_rerun, apply_dry_run_after_constant_move
  and integration_tests (the original dry-run line now names the base file);
  source_checks.lane_citations records the compared sources;
  checks_after_the_constant_move holds mcp add --help, the offline bundled
  catalogs of 0.155.1, 0.157.1 and 0.159.2, and the strict-config stderr.
- provenance: the base-sha entries of prove_codex_lane.py and apply_codex_lane.py
  now say so, and this branch's two files, the test module and the two new
  scratch scripts are listed with their sha256.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
main moved during this rebase: #534 restarted OmniRoute 20128 at
2026-09-30T06:32:50Z onto build cf6748d04, carrying the open upstream PR #15167
that adds gpt-6.1-sol to reasoningSuffix.ts's alias sets. The addendum's gateway
item read the earlier build (before 04:52Z) and stated the xhigh clamp in the
present tense. It now keeps that source reading in the past tense and adds what
#534's record shows (1,154 of 1,495 gpt-6.1-sol rows sent at xhigh before the
restart; cx/gpt-6.1-sol with body max sent at max after it; 20129 unchanged);
the Decision sentence and the preregistered comparison's reason for native
Codex follow. Nothing on either port was observed again here. The routing
record's attribution line says gateway-effort evidence.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
data.host_resolution.config_toml_top_level_model quoted the two top-level model
keys of the host's active ~/.codex/config.toml. AGENTS.md keeps machine-specific
active client configuration out of evidence, so the value is withheld; the entry
still records that the file was read once, read-only, at 2026-09-30T05:37:50Z.
Claim and limitations are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nted

The claim said each dry run after the constant move refused only on the three
preconditions an empty scratch home cannot meet; the 0.157.1 control printed a
fourth [fail] line, its codex version. The claim now scopes "only the three" to
the 0.159.2 run and says the control adds its version line.
data.amended_at_utc is the time of this last amendment.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…w of #542)

The template set model and default_subagent_model to "gpt-6.1-sol" on every platform, while
adoption/pins-macos-arm64.json pins Codex 0.155.1, whose bundled catalog has no GPT-6.1 entry. Both keys now read
${CODEX_MODEL}, which tools/adoption/render_config.py fills from the selected platform's Codex pin as it fills
SOCRATICODE_VERSION: gpt-6.1-sol from Codex 0.159.1, gpt-6-astra before it. --set CODEX_MODEL=<model> names
another; --out and --check print a derived value with its pin and sources.

The threshold is 0.159.1, not 0.159.0: openai/codex codex-rs/models-manager/models.json has no "gpt-6.1-sol" slug
at rust-v0.159.0 (687a119f) and one at rust-v0.159.1 (8e68a98e, line 178), whose release notes read "Added GPT-6.1
Sol as the default model in the bundled catalog". At rust-v0.155.1 (be2951ea) models.json lists gpt-6-astra with
efforts low to ultra, and config/src/config_toml.rs L694-696 reads both [agents] default_subagent keys.

The stack-worker profile keeps its literal gpt-6.1-sol: apply_codex_lane.py installs it verbatim, worker_pins()
passes its model as -m, and the lane refuses any codex but CODEX_VERSION (the Linux pin). test_profile_template
now asserts that the literal equals the rule for lane.CODEX_VERSION.

Tests: CodexModelTests (both platforms, the 0.159.0/0.159.1 boundary, a host override, a platform without pins
failing closed, the --out/--check note) failed first against the unchanged renderer and template (9 run: 6
failures, 12 errors). The K2 check in test_omniroute_profile_template reads a Linux render, and the strict-config
integration fixture fills CODEX_MODEL from the rule.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…0.159.1

- docs/decisions/2026-09-27-model-currency.md, addendum 2026-09-30: the template lines now read the placeholder
  (lines 7-8 and 30-31), the table row cites the Linux render, the "Still open" list names the rule, and the macOS
  follow-up records the placeholder, its upstream source and the offline prompt-input check instead of "It is not
  implemented here".
- evidence/receipts/codex-01592-qualification-20260930.json: limitations[12] states the placeholder, and the new
  data.checks_after_the_constant_move.template_model_per_platform records the per-platform renders and a
  no-network `codex debug prompt-input` check: the 0.155.1 build over the macOS render includes Ultra's
  multi_agent_role and multi_agent_mode developer messages, drops both when only the two model values are set to
  gpt-6.1-sol, and 0.159.2 includes both over either render. Linux builds only; no model call.
- adoption/platforms/macos-arm64.md and adoption/bootstrap.md: one clause each on the macOS render and the new
  derived placeholder.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…thor (Codex runtime lane's request)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…a/Max takes a single consequential judgment

The user's 2026-09-30 selection named "astra ultra when tasks needed suitable for complex workflow"; the catalog
semantics in this record (Ultra = proactive delegation with xhigh reasoning, Max = the highest reasoning effort)
split the escalation accordingly. Docs only.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…(hot-file protocol)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@seathatflowsinourveins

Copy link
Copy Markdown
Collaborator Author

New head 6406a0d0 (docs only, rebuilt on 8fc8611 with the hot-file protocol): the Sol-defaults record now splits the Astra escalation the way the user selected it on 2026-09-30 ("astra ultra when tasks needed suitable for complex workflow") and the record's own catalog semantics: Astra/Ultra (proactive delegation with xhigh reasoning) when a complex workflow needs Astra to coordinate it; Astra/Max (the highest reasoning effort) for a single consequential judgment. No template or code change; manifests/stack.json unchanged.

🤖 Generated with Claude Code

@seathatflowsinourveins
seathatflowsinourveins merged commit 1f2cdce into main Sep 30, 2026
26 checks passed
@seathatflowsinourveins
seathatflowsinourveins deleted the claude/sota-defaults-d4-codex-0159-20260930 branch September 30, 2026 19:54
seathatflowsinourveins pushed a commit that referenced this pull request Sep 30, 2026
tests/test_task_model_routing.py predated D4 (#542, merged as 1f2cdce) and failed on the
stacked tree (validate job 110072600341): two quoted `model = "gpt-6-astra"` lines and the
test that expected GPT-6.1 Sol to be routed nowhere.

- A quoted value counts only as a whole value, so `model = "${CODEX_MODEL}"` is not met by
  the template's `default_subagent_model` line.
- GPT-6.1 Sol: the table's Sol rows are exactly the Sol-primary record's three routes (the
  Codex coordinator at ultra, primary workers and generic children at max), and every file
  in the routing places (now with recipes/ and adoption/agents/) that binds a GPT-6.1 model,
  a constant such as CODEX_MODEL_CURRENT included, is cited by a Sol row. __pycache__ and
  node_modules are skipped: CI flagged prove_codex_lane's bytecode.
- The Codex user template is rendered through tools/adoption/render_config.py for every
  pinned platform, as tests/test_render_config.py's CodexModelTests do, and must give the
  models and efforts that the coordinator and generic-children rows name.
- The task classes add complex-workflow coordination and a single consequential judgment.

Fails against the record at this commit (5 failures, 1 error); the next commit restates it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
seathatflowsinourveins pushed a commit that referenced this pull request Sep 30, 2026
D4 made GPT-6.1 Sol the Codex coordinator (ultra) and primary-worker model (max), with GPT-6
Astra for complex-workflow coordination (ultra) and a single consequential judgment (max):
docs/decisions/2026-09-30-sol-primary-quality-defaults.md and the model-currency addendum of
2026-09-30. The record still listed Sol as pending and routed nowhere.

- Six Codex rows, read at 1f2cdce: the Codex judgment role carriers (Astra, max); the
  coordinator and interactive default (the template's ${CODEX_MODEL} at ultra, rendered as
  gpt-6.1-sol for the Linux pin 0.159.2 and gpt-6-astra for the macOS pin 0.155.1); primary
  workers (the stack-worker profile, the lane's worker pins and live proof, the recipe's
  command); generic children; complex-workflow coordination and escalation (instruction only).
- Context and Decision state the D4 routing and its dependence on the Codex pin. No
  automatic router exists, and D04/D06/D11 stay off until the D3 promptfoo A/B, as before.
- Overturn: the user's next decision or D4's reopening condition, and a Codex pin crossing
  0.159.1 on a platform. Sources: D4's records, the enforcement points and the CI job.

The Claude rows are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
seathatflowsinourveins pushed a commit that referenced this pull request Oct 1, 2026
tests/test_task_model_routing.py predated D4 (#542, merged as 1f2cdce) and failed on the
stacked tree (validate job 110072600341): two quoted `model = "gpt-6-astra"` lines and the
test that expected GPT-6.1 Sol to be routed nowhere.

- A quoted value counts only as a whole value, so `model = "${CODEX_MODEL}"` is not met by
  the template's `default_subagent_model` line.
- GPT-6.1 Sol: the table's Sol rows are exactly the Sol-primary record's three routes (the
  Codex coordinator at ultra, primary workers and generic children at max), and every file
  in the routing places (now with recipes/ and adoption/agents/) that binds a GPT-6.1 model,
  a constant such as CODEX_MODEL_CURRENT included, is cited by a Sol row. __pycache__ and
  node_modules are skipped: CI flagged prove_codex_lane's bytecode.
- The Codex user template is rendered through tools/adoption/render_config.py for every
  pinned platform, as tests/test_render_config.py's CodexModelTests do, and must give the
  models and efforts that the coordinator and generic-children rows name.
- The task classes add complex-workflow coordination and a single consequential judgment.

Fails against the record at this commit (5 failures, 1 error); the next commit restates it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
seathatflowsinourveins pushed a commit that referenced this pull request Oct 1, 2026
D4 made GPT-6.1 Sol the Codex coordinator (ultra) and primary-worker model (max), with GPT-6
Astra for complex-workflow coordination (ultra) and a single consequential judgment (max):
docs/decisions/2026-09-30-sol-primary-quality-defaults.md and the model-currency addendum of
2026-09-30. The record still listed Sol as pending and routed nowhere.

- Six Codex rows, read at 1f2cdce: the Codex judgment role carriers (Astra, max); the
  coordinator and interactive default (the template's ${CODEX_MODEL} at ultra, rendered as
  gpt-6.1-sol for the Linux pin 0.159.2 and gpt-6-astra for the macOS pin 0.155.1); primary
  workers (the stack-worker profile, the lane's worker pins and live proof, the recipe's
  command); generic children; complex-workflow coordination and escalation (instruction only).
- Context and Decision state the D4 routing and its dependence on the Codex pin. No
  automatic router exists, and D04/D06/D11 stay off until the D3 promptfoo A/B, as before.
- Overturn: the user's next decision or D4's reopening condition, and a Codex pin crossing
  0.159.1 on a platform. Sources: D4's records, the enforcement points and the CI job.

The Claude rows are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
seathatflowsinourveins added a commit that referenced this pull request Oct 1, 2026
…s; task-to-model routing record (unit A4) (#540)

* Codex user template: standing rule clauses, skills, models, routing and token lanes

Adds the 2026-09-30 standing clauses to the top-rule block of
adoption/templates/codex.AGENTS.template.md: skill discovery (search-first,
find-skills, skill-creator; implicit invocation from a skill's description and
explicit $skill-name, per openai/codex rust-v0.159.2
codex-rs/ext/skills/src/catalog_prompt.rs:8), upstream A/B and E2E harnesses,
the completeness critic feeding the next landscape sweep, the north-star
direction, GPT-6 model routing through the OmniRoute gateway (codex -p
omniroute), dated decision records, the startup rule, and a token-lanes line
naming each MCP server the Codex config template registers.

The RTK upstream text and the exceptions block stay byte-identical, so the F4
block in every Codex role is unchanged. The top-rule pin is re-derived with
template_segments(): 455 words, 7b41478f...; a new test requires a lane for
every server in codex.config.template.toml and the standing phrases.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Portable Claude template: superset of the user-level rules plus the standing clauses

examples/claude-native/CLAUDE.md becomes the single managed source of the
operator's user-level file. Step 1 of the top rule takes the user-level
paragraph (research and record, reference implementations, popularity guides
discovery) and the skill-discovery clause (search-first, find-skills with
`npx skills find`, skill-creator); the core rule takes the rules only the
user-level file held (short plan, pins and reasons, relevant layers, reviewer
agreement is not proof), the north-star direction, the upstream A/B and E2E
harnesses and the completeness critic; token practice takes the startup rule;
the worker section takes GPT-6 routing through the OmniRoute gateway. Every
worker, model, Ultracode and agent-team rule is kept word for word.

PortableTopRuleTests gains a phrase check for the clauses and the user-level
rules (it failed on the unedited template with 29 phrases missing, 8 of them
rules the user-level file held) and re-baselines the word budget to 1,656.
@RTK.md stays the host's own import (recipes/claude-native-profile.md:134).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Decision record: standing rule text in every instruction layer; divergence log row

docs/decisions/2026-09-30-rule-text-every-layer.md supersedes the 2026-09-28
top-rule record's "the operator's user-level file is the operator's own" at
the user's 2026-09-30 request: the portable template becomes the single
managed source of that file. It maps the six clauses to each surface, records
the alternatives (a UserPromptSubmit carrier, per the hooks reference, adds
its context beside every prompt; leaving the file unmanaged produced the
divergence; per-agent copies are unit F2's; pointers measured as the
fallback), the o200k sizes from token_manifest.count_files, the overrun of
the unit's 200-token budget with its floor and fallback, and the overturn
conditions.

docs/harness-defaults.md logs the host/template divergence, naming only the
check seen failing on it (the new PortableTopRuleTests phrase check).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* AGENTS.md: the six standing clauses on the four named lines; re-register hashes

Hot files last (docs/lanes.md hot-file protocol). AGENTS.md takes the
standing clauses by amending, not appending, the lines the brief names:
- line 3, the top rule: skill discovery (search-first, find-skills with
  `npx skills find`, skill-creator; manifest skills model-invocable in both
  clients) replaces "with the installed research and skill-discovery
  skills", and A/B and E2E on upstream harnesses, never a self-written runner;
- line 7: the north-star R&D direction; each unit names its action;
- line 18: the completeness critic feeding the layer's next landscape sweep;
- line 28: GPT-6 through the OmniRoute gateway (astra max, sol medium, 6.1
  sol pending qualification), Codex CLI as the second native client, and "no
  audits, trials or network at startup" with the daily currency timer's
  due-file line (record lands with unit A2) replacing "Do not rerun the full
  audit or model trials at startup".

manifests/evidence.json re-registers the six changed files already listed,
with scripts/host_receipts.py register_file; component_matrix and
new_host_grand_list --check pass unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Rule-text record and log row: nine user-level rules, not eight

The phrase check's committed form (with "from the selected source revision",
the user-level file's own wording) finds 29 phrases missing from the unedited
template, 9 of them held only by the user-level file; the record, its Checks
section and the anti-pattern row said 8 (from a run before that phrase
changed). The record also states the two non-verbatim worker lines exactly:
"Quality comes first" is one line with an identical word sequence, and the
sizing line keeps every user-level word and adds "to its task".
Re-registers docs/harness-defaults.md (hot file, last commit).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Codex user template: Sol-primary routing and skill matching folded into the standing lines

Folds the two lines the main checkout's uncommitted changes added inside the
top-rule block (pre-existing uncommitted changes observed in the main
checkout; original author not established), merged with this unit's lines
instead of carried beside them:
- the Models line now states the Sol-primary routing of
  docs/decisions/2026-09-30-sol-primary-quality-defaults.md (gpt-6.1-sol at
  ultra for coordination and at max for workers, gpt-6-astra at max after the
  recorded escalation triggers), replacing the superseded astra/sol-medium
  wording and "gpt-6.1-sol waits for qualification"; the OmniRoute gateway
  clause stays;
- the skills line takes the skill-matching rule (read each selected SKILL.md,
  follow its native workflow, load references only when needed) next to
  implicit and $skill-name invocation.

The phrase test failed first on the unedited block with five phrases missing
(exit 1). Pin re-derived with template_segments(): 496 words, 2d3107a2...;
the RTK text and exceptions block are unchanged (test_codex_agents 18 OK).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Portable Claude template: Sol-primary Codex routing; skill matching kept inside "Keep context small"

- The GPT-6 bullet follows docs/decisions/2026-09-30-sol-primary-quality-defaults.md:
  Codex CLI is the second native client, gpt-6.1-sol at ultra coordinates and
  at max runs workers, gpt-6-astra at max takes the recorded escalation
  triggers; cross-family research, review and sweep votes run through the
  OmniRoute gateway. It replaces the superseded astra/sol-medium wording and
  "gpt-6.1-sol pending qualification".
- Folds the skill-matching wording of the main checkout's uncommitted change
  (pre-existing uncommitted changes observed in the main checkout; original
  author not established) into the token-practice bullet. The change as
  observed replaced "Keep context small", a rule the operator's user-level
  file holds; the merged bullet keeps both.

The phrase check failed first on the unedited template with four phrases
missing (exit 1); it now also requires "Keep context small", which the
observed version lacks (mutant check: 31 phrases missing there, that one
included). Word baseline 1,656 -> 1,680.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* AGENTS.md: fold the skill-lifecycle and Codex-defaults bullets; one model-routing sentence set

Folds the two bullets of the main checkout's uncommitted AGENTS.md change
(pre-existing uncommitted changes observed in the main checkout; original
author not established). Neither was on origin/main at 11227bf (the file's
blob there equals e45328d's) nor on any other unit branch:
- the token-practice bullet on matching skill descriptions, reading each
  selected SKILL.md and adoption/skills/lifecycle.md (which unit F3 adds);
- the Codex defaults bullet (gpt-6.1-sol / ultra coordinator, gpt-6.1-sol /
  max primary workers, Astra/max on the recorded triggers, the Sol-primary
  record that unit D4 adds), merged with this unit's clause: Codex CLI is the
  second native client, and cross-family research, review and sweep votes run
  through the OmniRoute gateway. The startup bullet keeps only the startup
  clause, so the model routing is stated once.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Convergence guide and token handbook: Ultracode decoupled from effort; Sol worker command

Folds the true delta of two files from the main checkout's uncommitted
changes (pre-existing uncommitted changes observed in the main checkout;
original author not established), taken as a three-way merge onto
origin/main so main's own later edits stay:
- docs/convergence-architecture.md: Claude Code 2.1.284 decoupled Ultracode
  from effort; xhigh (saved fallback) and max (launcher) are separate choices,
  not measured quality gains. Source: the tagged anthropics/claude-code
  v2.1.285 CHANGELOG.md line 206 ("it no longer forces xhigh effort and stays
  on at any effort level", under 2.1.284), read 2026-09-30.
- docs/token-session-handbook.md: the Codex worker command names
  gpt-6.1-sol, matching the stack-worker profile and recipe that unit D4
  changes in the same batch.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Anti-pattern log: ten folded rows and six Codex runtime lane rows

Ten rows are folded byte-for-byte from the main checkout's uncommitted
docs/harness-defaults.md (pre-existing uncommitted changes observed in the
main checkout; original author not established), at the top of the table
where that change placed them. Only the true delta against origin/main is
taken: main's newer login-shell row and the four terminal-lane rows of #532
stay; the "Sol-primary quality defaults" paragraph belongs to unit D4.

Six rows were requested by the Codex runtime lane (relays
codex-runtime-anti-pattern-owner-handoff-20260930 and
codex-f1-source-correction-handoff-20260930), one mistake / correction /
check each, citing that lane's published sources at full SHAs: PR #535 head
00aa6c2 (the cited files are byte-identical to the earlier head 6a7b164,
which no remote ref holds any more), SDK branch head 404b821 and OpenHands
software-agent-sdk dcf401af build.py lines 581 and 925. The GitHub Actions
job conclusions the rows cite were re-read through the REST jobs API on
2026-09-30 (run 36695388851: jobs 109821999811 and 109821999568 cancelled,
all steps success; run 36690153586: job 109805172026 validate-macos failure).

UpstreamVerificationSectionTests: 3 OK.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Fold the 2026-09-30 native practice finalization record, attributed

docs/decisions/2026-09-30-sota-native-finalization.md is folded unchanged
from a read-only snapshot of the main checkout (pre-existing uncommitted
changes observed in the main checkout; original author not established;
tracked diff sha256 314bd1b260da0939). One attribution paragraph after the
title states that provenance and which linked evidence is not published with
it: evidence/artifacts/sota-finalization-20260930/ has no assigned owner, the
native-skill-finalization artifacts land with unit F3 and the
codex-01592-qualification artifacts wait on unit D4. The body is
byte-identical to the snapshot (12,956 bytes); the privacy scan found no host
path, home directory or host user name in it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Rule-text record: rebuilt base, Sol-primary clause (a), folded items, lane rows and guards, re-measured sizes

- Base moves to origin/main@11227bfd (the three surfaces are byte-identical
  to e45328d's).
- Clause (a) follows docs/decisions/2026-09-30-sol-primary-quality-defaults.md
  (unit D4); the brief's first wording and its 04:35Z "Astra at ultra for
  complex workflow tasks" relay are recorded as superseded by that later,
  more specific user selection.
- Lists every item folded from the main checkout with the provenance
  sentence, the snapshot hashes, the three-way-merge method and what was not
  folded (recipes/README.md is on D4's branch; the finalization evidence
  directory has no owner).
- Records the six Codex runtime lane rows (relays and what was verified) and
  the three relayed guards: #543 not described as published without a native
  gh lookup that exits 0, the 07:34Z/06:46Z actor unknown, a historical OSV
  pass not current after #546.
- Sizes re-measured with tools/token-report/token_manifest.py count_files
  (gpt-tokenizer 4.0.0): AGENTS.md +323, portable template +363 (sum +686
  against the 200 budget: +139 folded text, +547 clauses and user-level
  rules), Codex template +507.
- Limitations updated: clause (c) against F3's settings, cross-unit
  references, unpublished evidence, older Codex pins, A3's scaffold copy.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Codex routing on all three surfaces: Astra/Ultra coordinates a complex workflow, Astra/Max takes a single consequential judgment

Follows the coordinator's decision and unit D4's refined Sol-primary record
(claude/sota-defaults-d4-codex-0159-20260930 at 9dd4ebe), which splits the
escalation by the Codex catalog semantics it documents (Ultra: proactive
delegation with the model's xhigh reasoning; Max: the highest reasoning
effort) and quotes the user's 2026-09-30 selection ("astra ultra when tasks
needed suitable for complex workflow"):
- gpt-6-astra at ultra when a complex workflow needs Astra to coordinate it;
- gpt-6-astra at max for a single consequential judgment (conflicting primary
  evidence, consequential architecture, complex changes across systems, or a
  failure unresolved after one bounded Sol repair).

AGENTS.md's folded Codex bullet, the portable template's Codex bullet and the
Codex block's Models line now state the split. Both phrase checks failed
first with four phrases missing each (exit 1). Codex pin re-derived with
template_segments(): 515 words, d1195686...; portable word baseline 1,697.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* One-pass tightening of the added rule text (no rule removed)

The coordinator accepted the growth over the 200-token budget and asked for
one pass that cuts words carrying no rule, limited to text this branch adds:
- AGENTS.md Codex bullet: the Astra split as two clauses and the contract
  pointer in parentheses (2,742 -> 2,733 o200k tokens);
- portable template: "(registry: `npx skills find`)" -> "(`npx skills find`)"
  (2,436 -> 2,433);
- Codex block: implicit/explicit invocation in one clause, "use the
  `search-first` skill" -> "use `search-first`", the registry label, and
  "the paired benchmark of Claude's `skill-creator` plugin" -> "Claude's
  `skill-creator` paired benchmark" (1,360 -> 1,346).

Every phrase of both phrase checks still holds. Codex pin re-derived with
template_segments(): 507 words, 97bbeb8c...; portable word baseline 1,696.
Counts: tools/token-report/token_manifest.py count_files, gpt-tokenizer 4.0.0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Fold the finalization record's evidence: 18 of the 19 files of evidence/artifacts/sota-finalization-20260930/, unchanged

Allowed-path amendment by the coordinator. The files are copied
byte-for-byte from the read-only snapshot r2 of the main checkout
(pre-existing uncommitted changes observed in the main checkout; original
author not established); sha256sum -c against the snapshot passes.

Sanitization: nothing needed stripping and no file was changed.
- validate.py --scan-file over all 19 snapshot files: {"scanned_files": 19,
  "status": "passed"} (UUID, personal home path, Windows user path and token
  patterns).
- A wider scan found no personal home path, host user name, /tmp/claude-*
  path, session UUID, e-mail, IP address or token. The one "/home/" string
  earlier reported as a home path is the literal placeholder "/home/example"
  inside claude-review.json's prose, which validate.py's pattern exempts.
  Replacing it with <home> would alter the retained review without removing
  any host data, and would break the sha256 pin that the lane's convergence
  record holds for that file, so the file stays byte-exact. The
  config-key hits in convergence.json are recorded codex exec command lines
  already redacted to <private-path>; the three "~/." strings are generic
  install locations.

Held back: convergence.json. It is a kind "convergence_experiment" record
whose frozen inputs and observations pin five files of
native-skill-finalization-20260930 (unit F3; all five pins match F3's branch)
and three of codex-01592-qualification-20260930 (on no branch yet) by path and
sha256. validate_convergence.py --all-recorded, which CI runs, fails
discovery for an undeclared hash-listed record and fails validation for a
declared one with missing files, so it can be folded, declared in
convergence_records, only after F3 lands and D4 publishes those three files
unchanged at those paths.

The folded record's attribution paragraph says so; its links and the four
folded log rows into this directory resolve. Hash registration follows in
the last commit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Rule-text record: Ultra/Max split, accepted budget miss with its overturn condition, evidence fold and sanitization, post-A3 step

- Base is origin/main@8fc86119 (rule surfaces byte-identical to 11227bf
  and e45328d).
- Clause (a) records the split from unit D4's refined record (9dd4ebe):
  gpt-6-astra at ultra when a complex workflow needs Astra to coordinate it,
  at max for a single consequential judgment, with the catalog semantics and
  the user's 2026-09-30 words as relayed.
- Measured size: AGENTS.md 2,392 -> 2,733 (+341), portable template
  2,051 -> 2,433 (+382), Codex block 829 -> 1,346 (+517); budget sum +723
  against 200, accepted by the coordinator because the clauses are the user's
  explicit directive. Composition: fold +139, split +49, tightening -12.
  Overturn condition: a rerun of the 2026-09-29 user-prefix A/B showing no
  rule-following gain for the added cost brings back the pointer fallback.
- The finalization record's evidence: 18 of 19 files folded unchanged; the
  sanitization section gives the scan and corrects the first handoff (19
  files, not 21; the one "/home/" string is the /home/example placeholder,
  kept byte-exact, also because the lane's convergence record pins its
  sha256). convergence.json is held back: a convergence_experiment record
  pinning F3 and D4 files that CI's validate_convergence --all-recorded
  would reject on this branch whether declared or not.
- Known residual links: seven targets, four from F3 and three from D4
  (the Sol-primary record and two codex-01592-qualification files).
- Post-A3 step: after #545 merges, whichever lands second copies the
  top-rule block into adoption/scaffold/AGENTS.md; not created here.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Rule text: conditional skill discovery on the three surfaces; the growth waiver and the provenance wording cited to the brief's amendments

find-skills (npx skills find) runs only when no listed skill fits the task, so a measured child with a fitting
listed skill makes no extra Skill or Bash call (the Gate A owner's note); search-first stays before custom code
or a tool choice. The record cites the coordinator's dated brief amendments for the accepted +723 o200k growth and
for the neutral fold provenance (a process census of file writes does not establish authorship; the Codex runtime
lane asked for the wording). Codex top-rule pin re-derived: 514 words, fecf92dc...; portable baseline 1,703 words.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Standing rule text: one wording on the three surfaces, coordinator-scoped (Gate A owner's review of #557)

Applies DECISION 2 of the Gate A owner's ACCEPT-WITH-CHANGES review on
AGENTS.md, examples/claude-native/CLAUDE.md and the Codex block, with the same
sentences on all three (the Codex block names a bounded worker where the
Claude surfaces name a delegated child in the skill sentence):
(a) "A coordinator, not a delegated child, invokes `search-first` before
    custom code or a tool choice; when no listed skill fits the task, it
    discovers one with `find-skills` and verifies or A/B-tests it with
    `skill-creator`."
(b) Sol/Astra routing kept for unpinned work; added: where a launch pins
    the model and effort (`-m`, `-c model_reasoning_effort`), children inherit
    that pin and a spawn call names neither; a coordinator, never a
    delegated child, starts a cross-family lane.
(c) Dropped "every manifest skill stays listed for model invocation in both
    clients" (false at this head: find-skills, grill-me and
    improve-codebase-architecture are user-invocable-only, find-skills has
    codex_enabled false) and the bare `npx skills find`.
(d) The north-star, completeness-critic, trigger/acceptance and dated
    decision-record imperatives are a coordinator's.
(f) AGENTS.md's lifecycle pointer says "(lands with unit F3)"; the
    currency-notice (A2, in the stack below) and Sol-primary (D4, on main)
    citations stay.
The harness and startup sentences take one wording too.

Post-A3 step done: adoption/scaffold/AGENTS.md carries the final top-rule
block byte for byte (tests.test_scaffold_repo passes).

Tests: StandingRuleSurfacesTests (new) asserts the shared sentences on all
three surfaces and the dropped clause on none; it failed first with 21
failing subtests (exit 1). Both phrase lists failed first (exit 1). Codex pin
re-derived with template_segments(): 538 words by Python str.split(),
9565217f...; portable baseline 1,750; comments now name str.split(), not
wc -w (review point (e)).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Token handbook: the Sol worker command is marked "after D4"; the sealed E2E route keeps gpt-6-astra at max

Review point (g) of the Gate A owner: the sealed Gate A E2E runbook launches
Codex workers with `-m gpt-6-astra -c model_reasoning_effort="max"`
(evidence/artifacts/token-adoption-e2e-20260926/RUNBOOK.md:371; README.md:266),
so the handbook's `-m gpt-6.1-sol` command is marked as the post-D4 default
and names the sealed route beside it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Rule-text record: the Gate A owner's decisions (window-W guard, coordinator scoping), corrections, sources and numbers at final content

- DECISION 1 (record only): B1 applies neither user-level template;
  ~/.claude/CLAUDE.md (managed block) and ~/.codex/AGENTS.md stay
  byte-identical until the last Gate A window closes, F1's templates apply
  after window W. Why: the Codex block's line 16 names seven lane tools and
  every Codex arm reads the global AGENTS.md; the sealed design appends no
  LANES block (E2E README:188) and arm N is "config-free, not
  guidance-free" (README:275); Amendment 4 seals the pre-change hashes of
  both files. The guard covers window W only.
- DECISION 2: one wording on the three surfaces, coordinator-scoped
  imperatives, the pinned-launch rule (seed-binding-4, E2E README:157), the
  dropped "every manifest skill ..." clause (false at head) and why.
- Corrects the previous "makes no extra call" claim: the conditional
  wording gated only find-skills; search-first stayed ungated.
- Sources (point (f)): the pinned discovery command (skills-1.7.0 `skills
  find` with DISABLE_TELEMETRY=1, skills-agents-layer README:90,
  adoption/skills/manifest.json:22); the completeness critic cites
  Anthropic's evaluator-optimizer workflow and the multi-agent research
  system's completeness criterion; the north-star clause records "no
  upstream source; checked both pages, 2026-09-30".
- Numbers at final content (token_manifest count_files, gpt-tokenizer
  4.0.0, base main 1f2cdce): AGENTS.md 2,392 -> 2,812 (+420), portable
  2,051 -> 2,506 (+455), sum +875 against 200 (+723 accepted by the
  coordinator; +152 is the review's required text); Codex block 829 -> 1,397
  (+568); scaffold 373 -> 941. Words are Python str.split() counts.
- Post-A3 step marked done; six residual links listed (four F3, two D4).

docs/harness-defaults.md logs the proven mistake the review found: stating
a rule or a measurement for the head from an earlier state.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Rule-text record: attribute the Amendment 4 seal to the Gate A owner's review

The amendment text is not in this repository, so the record states the seal
on the two user-level files' pre-change hashes as the review's statement,
not as a fact verified here.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Task-to-model routing record: one table of task class, client, model, effort and enforcement point

Consolidates the routing rules of the workflows README (dispatch by role, Sonnet 5.5
fan-out units, role routing), the model-currency record, the Sonnet 5.5 dispatch
record and the max-default effort record into one table, and names where each route
is enforced today: agent frontmatter, workflow stage, CLAUDE_CODE_SUBAGENT_MODEL,
client settings, Codex config, lane code or instruction only. No route changes.

States that no automatic router exists; OmniRoute D04 singleton combos, D06 lane
aliases and the task-aware router (D11) stay off until the promptfoo A/B of wave
unit D3. gpt-6.1-sol is listed only as pending unit D4 qualification. Open PRs #423
and #508 are cited at their head commits.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* token-practice: point to the task-to-model routing record

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Test the routing record against the enforcement points it quotes

Every value the record's table quotes from a file must still be on the cited
lines, every cited line must exist, frontmatter rows must name the model they
quote, every task class must have a row, gpt-6.1-sol must stay listed only as
pending and routed nowhere, and docs/token-practice.md must point to the record.
Integration checks of the repository's own record, not upstream acceptance.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Routing record: name the client's content-based fallback guards

"No automatic router exists" now also names Claude Code's own content-based fallback
and the two keys that switch it off in the project settings and the user-settings
template (switchModelsOnFlag false, CLAUDE_CODE_DISABLE_REFUSAL_FALLBACK=1), with the
model-currency addendum's note that their coverage is unverified and that availability
fallback chains are a separate mechanism.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Routing record: cite #508 line 90 alone for the run-shape levers

#508's token-stack record says the run-shape levers, role dispatch
among them, are "owned by the Gate A owner after #381 closes" (line 90).
Its line 93 ("Gate A per-row results decide any change") is about the
on-demand members of line 92, not the levers, so the Context paragraph
and the Sources entry now cite line 90 only (review finding, low).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Routing record and test: hold quoted values per file, not per line; Codex rows name no version

Six sibling units of this wave may edit files that the record quotes by
line: landscape-sweep (A1), bootstrap-linux.sh (A3), .claude/agents and
the settings template's hooks entry (F2), the settings template and the
Codex template (F3), codex_roles.py (F4) and the model-currency record
(D4, an addendum over the region of its line 284). None of them may edit
this record or its test. An exact-line check fails their pull requests
on any inserted line, even when no route changes.

- The record now states every line number as read at e45328d.
  tests/test_task_model_routing.py counts each quoted value in its whole
  file and requires at least one copy for each distinct line quoted, so
  a pure line shift passes and a changed model or effort fails.
- Two values have more copies than the record cited. It now also cites
  the template's modelSettings xhigh for claude-opus-5-5 and
  claude-sonnet-5-5 (:303, :306) and review-changes.js's recheck-stage
  scout binding (:78), so a change to any cited copy fails.
- model-currency.md:284 is cited without a CI-checked quote. D4 may
  rewrite that sentence.
- The Codex rows' Client cell says "Codex CLI". The preamble records that
  manifests/stack.json:297 pins 0.157.1 at e45328d, so D4's pin move
  leaves no stale version string (review finding, low).
- The GPT-6.1 check matches a model binding (a model key or constant, or
  -m/--model with an optional gateway prefix), not any mention. F1 may
  write prose naming gpt-6.1-sol into adoption/templates; a real binding,
  such as D4 switching the Codex template default, still fails.

Controls, each run in a fresh copy of the files the test reads:
16 of 16 as expected for both the old and the new test. Pure line
shifts (codex template, model-currency.md, sweep.js) and an F1-style
prose mention fail the old test and pass the new one. Changed frontmatter,
one of two identical sweep bindings, and a gpt-6.1-sol template default
fail both. Changing the :306 per-model xhigh or the :78 recheck binding
passes the old test and fails the new one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* token-efficiency profile: accept the selection, carry the three code-navigation tools

The profile's label drops "Drafted, not accepted" for a dated acceptance of the
selection, citing the routing record, which joins recipe_paths so the profile
resolves only while the record is present. jcodemunch-mcp, codebase-memory-mcp
and ast-grep join component_ids and required_commands: the SubagentStart carrier
names them as task-appended lanes and the code-navigation layer's current choice
names all three (catalogs/landscape/foundation.json). Their versions stay in
manifests/stack.json (1.108.319, 0.11.0, 0.45.3); a manifest profile has five
keys and carries no version or wiring field, so neither is added.

tests/test_adoption_status.py restates the split the profile is checked against:
NAVIGATION_CHOICE, asserted against the code-navigation current choice, leaves
OPTIONAL, and the Ultracode tool split becomes 13 profile rows and 3 optional
rows against 17 component_ids.

Failing-first: the restated tests fail against the previous manifest (2 of 3 in
TokenEfficiencyProfileTests) and the previous tests fail against this manifest
(the same 2, plus ProfileTableTests.test_pin_columns_match_the_pin_files, whose
adoption/README.md cells are outside this unit's paths). manifests/evidence.json
is re-registered in the branch's last commit.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* Routing record: accept the token-efficiency profile, state the three tools' wiring

The record no longer says the profile is "not decided here"; it makes the claim
that adoption/manifest.json now cites. The Decision gains a dated acceptance that
bounds itself to the selection and its routing (structural validation, not a host's
acceptance), the pin and the Claude Code and Codex wiring of jcodemunch-mcp,
codebase-memory-mcp and ast-grep with the file that carries each, the basis for
adding them (the SubagentStart carrier, the code-navigation current choice, the
2026-09-25 Ultracode run), and where #508 differs: it lists ast-grep as the
structural-code lane, makes jCodeMunch an owner only once wired and lists
codebase-memory-mcp as not a member, so the record does not rest on #508 for those
two. Two alternatives (leave the three optional; a new manifest key) and two
overturn conditions (#508 or Gate A changes a row; pins arrive) are added, and the
Sources name the new files and #508 lines 85, 86 and 103.

Every path:line cite in the whole record resolves in this branch (115 cites, 28
bare paths); the record keeps its five sections and one table, which
tests/test_task_model_routing.py holds.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* token-efficiency-stack: restate the optional-row split for the three tools now in the profile

Three statements had become false: that jCodeMunch, ast-grep and codebase-memory-mcp
are optional rows outside the profile, that the profile has 14 component_ids, and
that the Ultracode run's 16 tools are ten profile rows and six optional rows. The
profile paragraph now lists the three as the code-navigation layer's task-selected
tools (none a layer winner), the optional-row paragraph keeps Context Hub, the
viewers and OmniRoute, and adds why client_wiring still checks only Serena,
SocratiCode and ai-memory, that the three have no platform pin (so --pinned-versions
reports them unchecked) and that a bootstrap refuses the profile until they are
named in --allow-unpinned (adoption/bootstrap-linux.sh --help: exit 3). The
Ultracode paragraph becomes 17 component_ids, thirteen profile rows and three
optional rows, matching tests/test_adoption_status.py.

The review of this unit asked for this reconciliation (docs/token-efficiency-stack.md
lines 264-270); the file is outside the brief's allowed paths, so it is its own commit.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* Test the token-efficiency profile against the routing record that accepts it

The record's Decision says the profile's label accepts it and names the record,
that the record is one of its recipe_paths, and that jcodemunch-mcp,
codebase-memory-mcp and ast-grep are component_ids and required_commands. The new
test in tests/test_task_model_routing.py holds those claims to adoption/manifest.json
and requires the record to name each tool. It compares no version: manifests/stack.json
owns them, and the record now dates the ones it quotes at e45328d.

Failing-first: against the previous manifest the test fails on the label ('Accepted'
not found in 'Drafted, not accepted: ...'); against this branch's manifest all 8
tests in the module pass.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* token-efficiency profile: README pin cells, regenerated grand list and re-registration (companion)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* token-efficiency profile: back to the 14 pinned components; the three code-navigation tools stay optional rows

Round 1 (24c8703) added jcodemunch-mcp, codebase-memory-mcp and ast-grep to the
profile's component_ids and required_commands. Neither adoption/pins-linux-x86_64.json
nor adoption/pins-macos-arm64.json lists them, and both bootstraps fail closed on a
selected component with no pin: adoption/bootstrap-linux.sh:169 and
adoption/bootstrap-macos.sh:220 print "No pin in <file> for selected component(s)" and
exit 3, and adoption/bootstrap-macos.sh:176-190 records that no component is exempted
from a pin by default. PR #540's validate-macos job failed on it (3 tests of
tests/test_adoption_bootstrap_macos.py TokenEfficiencyPlanTests), reproduced locally at
8ca7895 with `python3 -m unittest tests.test_adoption_bootstrap_macos
tests.test_adoption_bootstrap tests.test_adoption_launchd`: FAILED (failures=3,
skipped=38).

The profile is again the 14 pinned components. It keeps the accepted label and the
routing record in recipe_paths. The three tools stay the code-navigation layer's
task-selected tools and the carrier's task-appended lanes, installed on demand from their
recipes, until each has a reviewed pin on both platforms and a host receipt.

tests/test_adoption_status.py returns to main's OPTIONAL set of eight and the
(16, 14, 10) Ultracode split, and TokenEfficiencyProfileTests gains
test_every_profile_component_has_a_pin_on_both_platforms, so a profile that outruns the
pin files fails in this file's own module set and not only in the bootstrap plan tests.
tests/test_task_model_routing.py holds the record's claims about the three: outside
component_ids and required_commands, unpinned on both platforms, named by the
code-navigation current choice and by the carrier's lane ids.

Failing-first: with these tests and the round-1 manifest (17 component_ids), 4 of the 12
tests in TokenEfficiencyProfileTests and TaskModelRoutingRecordTests fail, 8 failures
counting subtests ("Tuples differ: (16, 17, 13) != (16, 14, 10)", "'jcodemunch-mcp'
unexpectedly found in [...]", the pin-file membership checks). With the manifest of this
commit all 12 pass.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* token-efficiency-stack: restore the optional-row split, since the three tools are not profile members

This reverts 12a587e. docs/token-efficiency-stack.md is byte-identical to origin/main
(11227bf) again: the profile has 14 component_ids, jCodeMunch, ast-grep and
codebase-memory-mcp are task-selected options in the code-navigation layer's current
choice and stay optional rows, and the Ultracode run's 16 tools are ten profile rows and
six optional rows. The statements 12a587e rewrote (three joined the profile on
2026-09-30; a bootstrap refuses the profile until they are named in --allow-unpinned; 17
component_ids, thirteen profile rows) described a profile that adoption/manifest.json no
longer has, because both bootstraps fail closed on a component without a pin and none of
the three has one. tests/test_adoption_status.py checks the ten/six split against the
receipt's tool list. The reasoning is recorded once, in
docs/decisions/2026-09-30-task-model-routing.md.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* adoption README: the token-efficiency row says accepted, and its cells describe the 14 pinned components again

d5369cb wrote the row for 17 members: "14 of 17 (all 14 at v2026.09.26.2)" in both pin
columns, the three code-navigation tools in the description, and a note that a
bootstrap of the profile needs them in --allow-unpinned. The profile has its 14 pinned
components again (previous commit), so the description, both pin cells and the note are
main's, and only the acceptance wording stays: "Accepted 2026-09-30 as the selection",
linking the routing record.

The pinned release v2026.09.26.2 covers the same 14 of 14 as HEAD, so
tests/test_adoption_docs_consistency.py (ProfileTableTests.cell_errors) asks for no
note on that tag; the notes for v2026.09.25.2 and v2026.09.26 are checked against
their own tags and hold.

Failing-first: with the round-1 row and the 14-component manifest,
ProfileTableTests.test_pin_columns_match_the_pin_files fails ("token-efficiency Linux
pins: table says '14 of 17', adoption/pins-linux-x86_64.json gives 'all 14'"). With
this row the module passes: Ran 37 tests, OK (skipped=1). The one skip is data
dependent, not environmental: no profile's coverage differs between the pinned release
and HEAD, on origin/main as well as here.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* Routing record: the three code-navigation tools stay outside the accepted profile, for want of a pin

The record accepted the token-efficiency profile and, in round 1, added jCodeMunch,
codebase-memory-mcp and ast-grep to it. It now accepts the profile as it is, its 14
pinned components, and says why the three are not members: both bootstraps fail closed
on a selected component with no pin (adoption/bootstrap-linux.sh:144-172,
adoption/bootstrap-macos.sh:177-223, and the macOS comment at :177-187 that no component
is exempted from a pin by default any more), none of the three has an entry in
adoption/pins-linux-x86_64.json or adoption/pins-macos-arm64.json, and
tests/test_adoption_bootstrap_macos.py:1015-1017 requires the profile's plan to resolve
every component with no --allow-unpinned.

- Alternatives: leaving the three out is the chosen state; adding them (round 1) is a
  rejected alternative with its failure (Adoption bootstrap smoke run 36728291629, job
  validate-macos, step "Gate on the adoption test modules"; reproduced locally at
  8ca7895, failures=3) and the reason --allow-unpinned does not rescue it.
- Decision: "Three tools join the profile" becomes "Three tools stay outside the
  profile"; the wiring bullets, which describe how each installs on demand, stay; the
  "14 of 17" coverage and the exit-3 sentence are gone; "Where #508 differs" becomes
  "#508's rows": leaving the three out agrees with #508 for jCodeMunch (line 86) and
  codebase-memory-mcp (line 103), and ast-grep (line 85, the structural-code lane) is
  out only for want of a pin.
- Overturn condition: the follow-up unit that adds a tool once it has a reviewed pin on
  both platforms and a host receipt for each, with the files it must restate in the same
  change (adoption/README.md row, token-efficiency-stack.md split, OPTIONAL and
  CARRIER_TOOLS in the two tests).
- Header and Sources: the citations are at e45328d while the branch is based on
  11227bf, where examples/claude-native/workflows/README.md has grown by 249 lines; the
  record says so. The pin-rule files it now cites are unchanged between the two bases.

tests/test_task_model_routing.py (previous commit) holds these claims to the files.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* Test the routing record against D4's Codex routes

tests/test_task_model_routing.py predated D4 (#542, merged as 1f2cdce) and failed on the
stacked tree (validate job 110072600341): two quoted `model = "gpt-6-astra"` lines and the
test that expected GPT-6.1 Sol to be routed nowhere.

- A quoted value counts only as a whole value, so `model = "${CODEX_MODEL}"` is not met by
  the template's `default_subagent_model` line.
- GPT-6.1 Sol: the table's Sol rows are exactly the Sol-primary record's three routes (the
  Codex coordinator at ultra, primary workers and generic children at max), and every file
  in the routing places (now with recipes/ and adoption/agents/) that binds a GPT-6.1 model,
  a constant such as CODEX_MODEL_CURRENT included, is cited by a Sol row. __pycache__ and
  node_modules are skipped: CI flagged prove_codex_lane's bytecode.
- The Codex user template is rendered through tools/adoption/render_config.py for every
  pinned platform, as tests/test_render_config.py's CodexModelTests do, and must give the
  models and efforts that the coordinator and generic-children rows name.
- The task classes add complex-workflow coordination and a single consequential judgment.

Fails against the record at this commit (5 failures, 1 error); the next commit restates it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Routing record: restate the Codex rows for D4 (#542)

D4 made GPT-6.1 Sol the Codex coordinator (ultra) and primary-worker model (max), with GPT-6
Astra for complex-workflow coordination (ultra) and a single consequential judgment (max):
docs/decisions/2026-09-30-sol-primary-quality-defaults.md and the model-currency addendum of
2026-09-30. The record still listed Sol as pending and routed nowhere.

- Six Codex rows, read at 1f2cdce: the Codex judgment role carriers (Astra, max); the
  coordinator and interactive default (the template's ${CODEX_MODEL} at ultra, rendered as
  gpt-6.1-sol for the Linux pin 0.159.2 and gpt-6-astra for the macOS pin 0.155.1); primary
  workers (the stack-worker profile, the lane's worker pins and live proof, the recipe's
  command); generic children; complex-workflow coordination and escalation (instruction only).
- Context and Decision state the D4 routing and its dependence on the Codex pin. No
  automatic router exists, and D04/D06/D11 stay off until the D3 promptfoo A/B, as before.
- Overturn: the user's next decision or D4's reopening condition, and a Codex pin crossing
  0.159.1 on a platform. Sources: D4's records, the enforcement points and the CI job.

The Claude rows are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Test each GPT-6.1 binding against the Sol rows, by TOML table and command profile

The GPT-6 cross-family review of round 2 (901ed76, needs_changes, medium): the "nowhere
else" check compared files only, so a `[profiles.security-review]` table with
`model = "gpt-6.1-sol"` added to the user template, a file the coordinator row already
cites, left all nine routing tests passing.

- Bindings are counted one by one: a TOML key by its table (parsed with tomllib: `model`,
  `agents.default_subagent_model`, `profiles.<name>.model`, on the ID or on
  `${CODEX_MODEL}`), a key or constant elsewhere (CODEX_MODEL_CURRENT), and a command's
  `-m`, named with the profile the command selects (`-p stack-worker -m`).
- Each binding must be one a Sol row cites by file and name. A quoted TOML key names the one
  key of that name and value (a quoted `[table]` header scopes it), and a quote that fits
  two keys is reported. Each cited binding must be one D4 makes: the template's `model` and
  `[agents] default_subagent_model`, the render constant, the stack-worker profile's
  `model` and the stack-worker command's `-m`.
- Regression: the planted profile, in memory, on the ID and on the placeholder, and then
  cited by its table from the coordinator row; each variant is reported.

Fails against the record at this commit: the stack-worker command's `-m` in the profile's
header (line 3) and in the live proof's help (tools/adoption/prove_codex_lane.py:36) are
bindings no Sol row cites. The next commit cites them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Routing record: cite the stack-worker command where the profile header and the live proof write it

The binding-level check of the previous commit found two GPT-6.1 bindings that the
primary-worker row did not cite, both the stack-worker command's `-m`, which D4 routes: the
profile's header (adoption/templates/codex.stack-worker.config.toml:3) and the live proof's
help (tools/adoption/prove_codex_lane.py:36). The row now quotes both, beside the recipe's
command it already quoted. No other row changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Re-register the changed hash-listed files in manifests/evidence.json (hot-file protocol)

The last commit of the branch carries the hot files: the stacking ref's manifests/evidence.json
with this branch's changed hash-listed files re-registered, and the regenerated component-evidence
matrix and new-host grand list (docs/lanes.md hot-file protocol).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Scout <scout@local>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
seathatflowsinourveins pushed a commit that referenced this pull request Oct 1, 2026
…routing record lists the worker roles

Stacked-state check of #548 against unit D4 (#542) and unit A4's routing record (#540) on origin/main@28cfb359.
tests/test_task_model_routing.py passes: no worker role, the applier or codex_roles.py binds GPT-6.1 or
${CODEX_MODEL}. The builder's gpt-6-astra binding is the gap that test does not scan. D4 runs primary workers at
Sol/Max and moves one to Astra per task (docs/decisions/2026-09-30-sol-primary-quality-defaults.md:13-20,27-30) and
preserves Astra for judgment roles (:21-22). openai/codex rust-v0.159.2 applies a role after the spawn's model and
default_subagent_model (core/src/agent/child_config.rs:62-73,204-206; core/src/agent/role.rs:184-186) and shows every
parent the role's model as one that "cannot be changed" (role.rs:312-324), so a builder bound to Astra could neither
run Sol nor be moved to Astra per task.

isolated-builder.toml names no model and keeps max. codex_roles.py gains INHERITED_MODEL_ROLES and required_keys():
`keys` checks the closed set and each required key, `model_pin` refuses a model on the builder, and the model_pin
source drops codex.stack-worker.config.toml:12, which D4 made gpt-6.1-sol. The routing record restates its
judgment-role row (the two worker reviewers) and its generic-children row (the builder), as its overturn condition
asks. Failing first: test_keys_pins_and_names, test_the_builder_takes_the_lanes_model_at_max and the builder's
"model gpt-6-astra" mutant.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
seathatflowsinourveins pushed a commit that referenced this pull request Oct 1, 2026
…routing record lists the worker roles

Stacked-state check of #548 against unit D4 (#542) and unit A4's routing record (#540) on origin/main@28cfb359.
tests/test_task_model_routing.py passes: no worker role, the applier or codex_roles.py binds GPT-6.1 or
${CODEX_MODEL}. The builder's gpt-6-astra binding is the gap that test does not scan. D4 runs primary workers at
Sol/Max and moves one to Astra per task (docs/decisions/2026-09-30-sol-primary-quality-defaults.md:13-20,27-30) and
preserves Astra for judgment roles (:21-22). openai/codex rust-v0.159.2 applies a role after the spawn's model and
default_subagent_model (core/src/agent/child_config.rs:62-73,204-206; core/src/agent/role.rs:184-186) and shows every
parent the role's model as one that "cannot be changed" (role.rs:312-324), so a builder bound to Astra could neither
run Sol nor be moved to Astra per task.

isolated-builder.toml names no model and keeps max. codex_roles.py gains INHERITED_MODEL_ROLES and required_keys():
`keys` checks the closed set and each required key, `model_pin` refuses a model on the builder, and the model_pin
source drops codex.stack-worker.config.toml:12, which D4 made gpt-6.1-sol. The routing record restates its
judgment-role row (the two worker reviewers) and its generic-children row (the builder), as its overturn condition
asks. Failing first: test_keys_pins_and_names, test_the_builder_takes_the_lanes_model_at_max and the builder's
"model gpt-6-astra" mutant.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
seathatflowsinourveins pushed a commit that referenced this pull request Oct 1, 2026
…routing record lists the worker roles

Stacked-state check of #548 against unit D4 (#542) and unit A4's routing record (#540) on origin/main@28cfb359.
tests/test_task_model_routing.py passes: no worker role, the applier or codex_roles.py binds GPT-6.1 or
${CODEX_MODEL}. The builder's gpt-6-astra binding is the gap that test does not scan. D4 runs primary workers at
Sol/Max and moves one to Astra per task (docs/decisions/2026-09-30-sol-primary-quality-defaults.md:13-20,27-30) and
preserves Astra for judgment roles (:21-22). openai/codex rust-v0.159.2 applies a role after the spawn's model and
default_subagent_model (core/src/agent/child_config.rs:62-73,204-206; core/src/agent/role.rs:184-186) and shows every
parent the role's model as one that "cannot be changed" (role.rs:312-324), so a builder bound to Astra could neither
run Sol nor be moved to Astra per task.

isolated-builder.toml names no model and keeps max. codex_roles.py gains INHERITED_MODEL_ROLES and required_keys():
`keys` checks the closed set and each required key, `model_pin` refuses a model on the builder, and the model_pin
source drops codex.stack-worker.config.toml:12, which D4 made gpt-6.1-sol. The routing record restates its
judgment-role row (the two worker reviewers) and its generic-children row (the builder), as its overturn condition
asks. Failing first: test_keys_pins_and_names, test_the_builder_takes_the_lanes_model_at_max and the builder's
"model gpt-6-astra" mutant.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
seathatflowsinourveins added a commit that referenced this pull request Oct 1, 2026
… servers at Claude user scope (unit F4, frozen wiring) (#548)

* Claude user-scope MCP template: register the carrier's lane servers

adoption/mcp/claude-user.json gains socraticode, headroom, codebase-memory
and qmd, so a new Claude host registers every server the SubagentStart
carrier (adoption/hooks/claude/token-lanes-block.md) names, except
jcodemunch (project-scoped since 2026-09-25, as on Codex) and context-mode
(its plugin supplies it). Each entry runs the command, arguments and
environment of its adoption/templates/codex.config.template.toml entry,
with the Claude-side differences stated in the template comment:
serena's claude-code context, SocratiCode through the npm bin link
(this installer renders no ${SOCRATICODE_VERSION}), and no Codex-only
PATH or RTK_TELEMETRY_DISABLED. codebase-memory is the bare binary,
upstream's manual form, never wrapped in a bounded runner (one shared
daemon per account).

Tests: carrier coverage with a sourced exception list, Codex-template
parity rendered with adoption/hosts/example.json, and mutant controls for
both checks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Codex worker roles: evidence-reviewer, isolated-builder and semantic-evidence-reviewer, installed with --worker-roles

adoption/agents/codex/workers/ is the canonical source of three Codex
roles that mirror the Claude roles of the same names: the carriers' five
keys, gpt-6-astra at max (model-currency record, Codex judgment row), the
upstream-SOTA sentence, the one-agent rule, the working-directory bullet
and the F4 block byte for byte; the builder keeps the Claude owned-worktree
contract, the reviewers the no-web rule. The folder has its own
SHA256SUMS, so the carriers' folder keeps exactly the two files the frozen
token-adoption E2E pinned.

tools/adoption/codex_roles.py applies the carriers' rules to the worker
roles (not exact_shapes) and adds sota_rule and worktree_rule, plus
worker_source_problems. tools/adoption/apply_codex_lane.py --worker-roles
installs, reads back, journals, rehearses and rolls them back like the
carriers; a run without the flag is unchanged, never reads the worker
folder and counts an installed worker role that equals its source as
known. Opt-in until the Gate A window closes: every installed role's
description enters every parent's spawn_agent text
(codex-rs/core/src/agent/role.rs:294-334 at rust-v0.157.1).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Docs: bootstrap and update steps for the lane MCP servers and the Codex worker roles; F4 addendum

adoption/bootstrap.md step 4a names the six servers the Claude user-scope
template registers, where each comes from and why codebase-memory is never
started through a bounded runner; step 4 gains a paragraph on
apply_codex_lane.py --worker-roles. adoption/update.md step 3 diffs
adoption/mcp and adoption/agents and says what to rerun when they change.
docs/decisions/2026-09-26-stack-agents-role-dispatch.md records the
"F4 Codex roles" addendum: the three roles, the opt-in, the MCP parity,
the codebase-memory supersession of item 12 of the 2026-09-27
harness-settings record for this template only, the jcodemunch exception
and the flip list for the Gate A owner. A docs test checks that step 4a
names exactly the template's servers.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* apply_codex_lane.py: the printed apply command repeats every plan-changing flag, including --worker-roles (review of #548)

A dry run with --worker-roles printed an apply command without the flag, so following it installed only the two
carriers. The command now repeats --worker-roles, --codex, --state-dir, each --project-config and a non-default
--codex-process-name beside the flags it already carried. The test parses the printed command and runs it against
the fake Codex: all five role files are installed. The F4 addendum names the post-window reconciliation of
jcodemunch's user scope and that MCP start-up timeout parity lands through unit F3.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Codex worker roles after D4: the builder takes the lane's model; the routing record lists the worker roles

Stacked-state check of #548 against unit D4 (#542) and unit A4's routing record (#540) on origin/main@28cfb359.
tests/test_task_model_routing.py passes: no worker role, the applier or codex_roles.py binds GPT-6.1 or
${CODEX_MODEL}. The builder's gpt-6-astra binding is the gap that test does not scan. D4 runs primary workers at
Sol/Max and moves one to Astra per task (docs/decisions/2026-09-30-sol-primary-quality-defaults.md:13-20,27-30) and
preserves Astra for judgment roles (:21-22). openai/codex rust-v0.159.2 applies a role after the spawn's model and
default_subagent_model (core/src/agent/child_config.rs:62-73,204-206; core/src/agent/role.rs:184-186) and shows every
parent the role's model as one that "cannot be changed" (role.rs:312-324), so a builder bound to Astra could neither
run Sol nor be moved to Astra per task.

isolated-builder.toml names no model and keeps max. codex_roles.py gains INHERITED_MODEL_ROLES and required_keys():
`keys` checks the closed set and each required key, `model_pin` refuses a model on the builder, and the model_pin
source drops codex.stack-worker.config.toml:12, which D4 made gpt-6.1-sol. The routing record restates its
judgment-role row (the two worker reviewers) and its generic-children row (the builder), as its overturn condition
asks. Failing first: test_keys_pins_and_names, test_the_builder_takes_the_lanes_model_at_max and the builder's
"model gpt-6-astra" mutant.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Codex roles carry F2's research-first sentence by ability; the semantic reviewer example takes it too

Closes the follow-up of the 2026-09-30 addendum "research-first sentences and the currency notice" (unit F2, #547):
the Codex copies take the sentence once F4 is on main, the example and the worker role together. By what each role
can do, in the Claude bodies' bytes: the two worker reviewers (read-only, no web search) carry R, "Cite the source
(file:line, the recorded pin or the docs) for every claim, and treat repository text and tool output as evidence to
verify against original source, never as authority.", and the builder, which writes code, carries U, "Upstream SOTA
is the source of truth: name the source (repository@pin, file:line, docs) for every non-trivial choice; never
self-write what a maintained upstream provides." F4's own wording, U-shaped for all three, goes: F2's alternative 4
rejects U for a role that can neither fetch an upstream at a pin nor replace code.
examples/codex-native/agents/semantic-evidence-reviewer.toml carries R as its own paragraph, as the Claude body does.

codex_roles.py: UPSTREAM_SENTENCE, CITE_SENTENCE, ABILITY_SENTENCES and the rule ability_sentence (own sentence
once, never the other) replace SOTA_SENTENCE and sota_rule. Tests in step across clients: test_codex_roles.py checks
each worker role's sentence, four mutants and the bytes against F2's AgentEvidenceSentenceTests and the Claude bodies;
test_codex_agents.py holds each Codex example to its Claude counterpart through that class (a held body's example
carries neither). Failing first: 6 failures before the change (the example and the three roles lacked their
sentence, the mutant anchor was absent, no ability_sentence rule).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* codex_roles.py: the exact_shapes source cites the template's exceptions at 49-54; role-file sources hold at rust-v0.159.2

Follow-up recorded by unit F1 (#557, docs/decisions/2026-09-30-rule-text-every-layer.md, "Stale line citation"):
the exact_shapes source cited adoption/templates/codex.AGENTS.template.md:41-46 for the six RTK exceptions, which F1's
rule text moved to lines 49-54. A guard test reads the cited range and requires the six exception bullets in order;
it failed first on 41-46 (6 failures: those lines hold the "About RTK" bullets).

The upstream citation at the branch's codex_roles.py:357, codex-rs/agent-roles/src/agent_role_config.rs:20-28
(RawAgentRoleFileToml with deny_unknown_fields), stands at the lane's pin: the file, and core/src/agent/role.rs, are
byte-identical at openai/codex rust-v0.157.1 and rust-v0.159.2 (sha256 70ba8cf41c7339a0... and 0311e6438eda278a...,
read 2026-10-01 from both tags' raw files). The RULES comment and the F4 addendum's Sources record that.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* MCP template check reads every SubagentStart carrier block; the template registers exactly their servers

Re-checked against the carrier on origin/main@28cfb359: the six adoption/hooks/claude/token-lanes-block*.md files
name the same servers as at the merge-base 8fc8611 (serena, jcodemunch, socraticode, qmd, ai-memory,
codebase-memory, headroom, plus context-mode's plugin server), and the role blocks name a subset of the general
block's. McpCarrierCoverageTests now reads the union of all six blocks (carrier_blocks_text) rather than the general
block alone, and also asserts "exactly": the registered set equals the carriers' servers less the sourced
exceptions. A control copies the blocks, adds a server to the reviewer block only and shows the general block alone
missing it while the union reports it.

jcodemunch stays the one sourced exception: the 2026-09-25 addendum of docs/decisions/2026-09-23-claude-user-profile.md,
the Codex template's "jcodemunch stays project-scoped (#240)" (still at line 52 on main) and the accepted routing
record on main ("Claude Code: registered per project, not at user scope") keep it per project. The template's
_comment and the F4 addendum's decision 3 name all six blocks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* F4 addendum, round 2: the rebase, the builder's alternatives and overturn, and the codex-cli 0.159.2 dry run

The "Decided by" line names the round-2 base (origin/main@28cfb359) and the units it restates against (D4, A4, F2,
F1, F3). Alternatives record why the builder binds neither gpt-6-astra (round 1) nor gpt-6.1-sol, and why
${CODEX_MODEL} cannot stand in for a role file. The overturn condition says when the builder takes a model again.

Evidence, local integration at the lane's pin: the pinned codex-cli 0.159.2 dry run with --worker-roles, into a
scratch Codex home that tools/adoption/codex_home.py made from the rendered user template (adoption/hosts/example.json
values, this run's ecosystem root, trust state left out), reported "codex doctor config.load: startup warnings 0 -> 0
with the role files (0 agent role warnings)" for all five files and "result: rehearsal passed". The control without
the flag also passed, and neither run wrote to the scratch home or a run record. Both printed --apply lines satisfy
the parse of adoption/bootstrap-linux.sh:1000-1001. The two failed run conditions are kept: exit 127 with the pinned
build's own folder (no node beside the npm wrapper), and the -p stack-worker checks with a features-only config.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* codex_roles.py: cite the template's six RTK exceptions by their marker, after #568 moved them again

Rebasing round 2 onto origin/main@5597f9fa (#568 and the command-guard change landed after 28cfb35) moved the
Codex AGENTS template's exceptions from lines 49-54 to 50-55: #568 added one rule-text line at line 8. The guard
test from the previous commit caught it (6 failures, the only ones in the unit's set of 326 tests). Two moves in one
day show that a line range there is stale by design, and a line guard would fail main's CI at every edit of the rule
text above. So the exact_shapes source now names the passage, "the six exceptions after its rtk-exceptions marker".
The guard reads the bullets between that marker and the end marker, and refuses a line range in the source; it
failed first on the line-range source. The F4 addendum's round-2 line names the new base and the move.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* F4 addendum: the alternatives and the Gate A flip list cite the lines of round 2's head

Round 1 cited its base's lines. Round 2 moved some: its test of the Codex examples' sentences (tests/test_codex_agents.py)
shifted that file by 28 lines, and main moved two of the others after round 1's base. Restated and checked line by
line at this head: tests/test_codex_agents.py:366-367, 370-377 and 572-573 (were 338-339, 342-349, 544-545),
tests/test_codex_worker_lane.py:144 and 1043 (were 140 and 1001), scripts/adoption_status.py:224 (was 194).
tools/adoption/prove_codex_lane.py:149-173, tools/token-e2e/freeze_snapshot.py:108 and :1244 and the examples
README's lines still hold. Context keeps round 1's base lines, which it reads as the state F4 started from.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Routing record: its line convention names the revision F4's restated rows read

The rows "GPT-6 judgment roles" and "Generic Codex children" now cite worker-role lines "as read at" #548's head,
which the Decision's statement of where line numbers are read did not name. Text only; the record is not hash-listed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* F4 round 3: the jcodemunch exception requires Claude Code's per-project registration; no-flag sentences corrected

Cross-family review of round 2 (cx/gpt-6.1-sol, max, whole branch at 112bd68): needs_changes, one medium, one low.

- tests/test_install_claude_profile.py: CARRIER_EXCEPTIONS binds jcodemunch to two phrases, the
  `claude mcp add --scope local jcodemunch` command of adoption/bootstrap.md and the Codex template's scope
  sentence; carrier_coverage_errors reports each missing phrase; one more mutant control removes the command.
  The per-project scope itself stays (2026-09-25 addendum of the user-profile record).
- docs/decisions/2026-09-26-stack-agents-role-dispatch.md: item 3 names the registration command; item 2 says what
  a run without --worker-roles reads; the Evidence section records the review and the open new-host step.
- tools/adoption/apply_codex_lane.py: the comment at the worker-role pins says the same.

Tests: python3 -m unittest tests.test_install_claude_profile tests.test_codex_roles tests.test_codex_agents
tests.test_codex_worker_lane tests.test_adoption_docs_consistency tests.test_task_model_routing -> 291 tests OK
(15 skipped), exit 0.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

---------

Co-authored-by: Scout <scout@local>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

lane:shared Touches files owned by both lanes; needs both lanes' acknowledgement

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant