Repository navigation
OSV: urllib3 2.8.0 and PyJWT 2.15.0 relock for the OpenHands lock; the frozen macOS lock's next exception scoped by the scanner itself (split scan), five advisories of 2026-09-30 - #546
Conversation
…ext 16.3.5 in the frozen macOS lock (four advisories of 2026-09-30) Four advisories published on 2026-09-30 between 14:46Z and 15:00Z fail the required osv-scanner check on fresh runs: GHSA-8988-9cw3-xx77, GHSA-vxq7-64xx-v4gw and GHSA-gh4c-6fx4-qh6g (urllib3 2.7.0, fixed in 2.8.0) in the OpenHands recipe lock, and GHSA-vcvr-r3jv-pc5j (next 16.3.5, fixed in 16.3.6) in the frozen macOS variant lock. - requirements.lock: relocked with the recipe's own method plus --upgrade-package urllib3==2.8.0; the control reproduces the committed lock byte for byte and the new lock differs in urllib3's version and two hashes only. pins.json, the exact-lock entry and its evidence move to the new sha256. - The frozen macOS lock (no live owner, only #201 touched it) gets a dated ignore for the next advisory under the existing policy (ignoreUntil 2026-12-24), an exact-lock row bound to its sha256, and a pnpm reader plus two tests so the repo-wide ignore cannot hide an affected next in any other lock (python_pins reads no npm format). - Receipt, returned outputs, scripts and seven in-memory guard mutants are registered; the decision record gets a dated paragraph. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…15.0, ignore next 16.3.5 in the frozen macOS lock (five advisories of 2026-09-30) Five advisories whose OSV records were published on 2026-09-30 (14:46Z to 15:41Z) fail the required osv-scanner check on fresh runs: GHSA-8988-9cw3-xx77, GHSA-vxq7-64xx-v4gw and GHSA-gh4c-6fx4-qh6g (urllib3 2.7.0, fixed in 2.8.0), GHSA-42vr-xj54-vc7v (PyJWT 2.14.0, fixed in 2.15.0) in the OpenHands recipe lock, and GHSA-vcvr-r3jv-pc5j (next 16.3.5, fixed in 16.3.6) in the frozen macOS variant lock. - requirements.lock: relocked with the recipe's own method plus urllib3==2.8.0 and pyjwt==2.15.0 in place of 2.14.0, after PyJWT 2.15.0 left the workspace's 7-day window (the decision point of issue #518, overturn condition (a)). The control reproduces the committed lock byte for byte and the new lock differs in those two entries only. pins.json, the exact-lock entry and its evidence move to the new sha256; research.md records the section and the resolved decision point. - The frozen macOS lock (the tree records no owner) gets a dated ignore for the next advisory under the existing policy (ignoreUntil 2026-12-24), an exact-lock row bound to its sha256, and npm lock readers ported from OSV's extractors (osv-scalibr 3090dbb7aaa2) for the canonical output of pnpm, npm and yarn, failing closed on anything else, so the repo-wide ignore cannot hide an affected next in any other lock. Three cross-family reviews shaped them. - Receipt, returned outputs, retained scanner reports, scripts and 23 in-memory guard mutants are registered; the decision record gets a dated paragraph. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
Review the following changes in direct dependencies. Learn more about Socket for GitHub.
|
|
Owner handback (bc, 2026-09-30 17:20Z), for PR 550's owner and any branch that reports the same OSV findings. All of these findings are fixed by this one PR (#546,
I post the merge sha here. |
…s, tighten the receipt claims (fifth cross-family review) The fifth cross-family review of the whole change found one P1 and evidence-wording findings; this repairs them. - package_lock_next_pins: a `next` entry is read only as a plain registry install (a semver version whose resolved URL, when present, is an http(s) tarball URL without a fragment, a query or a git host hint); a git commit as version or resolved URL, a file: path and a range give None, because OSV reports another version for them. New table cases and two more mutants (R20, R21) cover it. - Receipt, decision paragraph, research.md and the ignore reason: claims that no retained output supported are removed or made precise (readers do not validate whole files; the PyJWT changelog section is printed whole; importers were searched outside the google package only; the upstream 7-day rule is read from the pinned archive; the review invocation is stated as typed, with no observed model, effort or route; counts). - The fifth review and the review command record are retained beside the others. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…lling it (tags, merge keys), misindented fields and YAML null names The Codex root's independent verifier refuted the fail-closed claim of the first repaired head with two counterexamples run through the pinned OSV-Scanner: a tagged top-level key (`!!str packages:`) and `packages` supplied by a merge key (`<<: *base`). Both are read by the scanner, which then filters the next advisory under the global ignore, while the reader returned no next. Reproduced with the pinned scanner (section K) and repaired: - pnpm_packages refuses any top-level line that is not a plain `key:` (tags, anchors, aliases, merge keys, quoted or complex keys, directives). - While closing these: entry fields must be indented by four spaces (a mapping at six hid its name and version), name and version must look like a package name and a version and not be a YAML null or boolean word, and both readers refuse the Unicode line separators Python splits on. - Mutants R22 to R26 and table cases keep the failed conditions; a script runs the inputs against the scanner with an empty config, the reader of the previous head and the current reader. The scalibr pin is stated as the go.mod pseudo-version. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…t scan), delete the custom npm lock readers The Codex root held #546 until the exception for the frozen macOS lock was scoped by the scanner, after its independent verifier read two more bypasses of the custom lock readers with the pinned OSV-Scanner (a tagged packages key, packages through a merge key) on top of the five cross-family review rounds that had each refuted the previous reader. The readers (and their tests and mutants) are deleted. OSV-Scanner 2.6.0 applies an explicit --config to every input of one invocation, so the exception now lives in .github/osv-scanner-frozen-macos.toml (one entry, GHSA-vcvr-r3jv-pc5j, ignoreUntil 2026-12-24) and security-scan.yml scans the inventory entries that name it in an invocation of their own: - the inventory entry of the frozen lock names that config, the 48 others name none; - two jq lists (parser flags preserved), a count check that they sum to the inventory, two scans, the worse exit status wins, both SARIF reports written, kept and uploaded under two categories off pull_request; - .github/osv-scanner.toml is main's again: no exception for that advisory. Tests: FrozenScanTests (partition, config scope, sha256 of the frozen lock, workflow shape, a mutant inventory), a shared ignore-field check for both configs, and the workflow hardening tests for the second upload step. Retained native controls run the workflow's own scan step with the pinned binary (exit 0 in both forms), the frozen lock under the ordinary config (exit 1, next 16.3.5), and the verifier's inputs (exit 1 as ordinary locks). The urllib3 2.8.0 and PyJWT 2.15.0 relock of the OpenHands lock is unchanged. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
Cross-family review of the split-scan head
None of these makes the present configs or the present step wrong (the configs contain none of the constructs in 1 and 2; 4 and 5 are unchanged behavior of the step on non-PR events), so I do not hold the required check for them: #546 merges at 8/8 on |
… 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>
… 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>
… 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>
… 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>
… 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>
…portable Claude template and the Codex AGENTS template, anti-pattern rows and the folded finalization record (unit F1) (#557) * 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> --------- Co-authored-by: Scout <scout@local> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…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>
Scope
osv-scannercheck, which fails on fresh runs since OSV records five advisories published on 2026-09-30 (14:46Z to 15:41Z). The OpenHands recipe lock is relocked onto urllib3 2.8.0 (three advisories) and PyJWT 2.15.0 (one advisory, the decision point of issue Relock OpenHands onto oauthlib 4.0.0 / PyJWT 2.15.1 by 2026-10-08 (osv ignores from #517 expire 2026-10-13) #518: the fix left the workspace's 7-day window at 16:56:01Z), and only those two entries change. The frozen macOS variant lock'snext16.3.5 (one advisory) cannot be patched (frozen, hash-bound evidence, no recorded owner): its dated exception (until 2026-12-24) moves into a config of its own that only the scan of that one lock uses, because OSV-Scanner applies an explicit--configto every input of one invocation. One PR carries all of it because the check scans the whole inventory and any one fix alone leaves it red.11227bfdf25b55b0481a9e78985c3fed26052472lane:foundation.github/osv-scanner-frozen-macos.toml(new),.github/osv-scanner-lockfiles.json,.github/workflows/security-scan.yml,tests/test_osv_lockfile_coverage.py,tests/test_workflow_hardening.py,blueprints/runtime-workers/openhands/(requirements.lock,pins.json,research.md,evidence/),docs/decisions/2026-09-22-github-automation-closure.md,docs/github-automation.md,evidence/receipts/osv-urllib3-next-20260930.json(the name predates the PyJWT advisory),manifests/evidence.json(registration only)..github/osv-scanner.tomlis main's again.SOTA sources
2.8.0, commitb1d30ab61fe0db8f11092805e8c5ac43e091064a; PyPI files uploaded 2026-09-15, https://pypi.org/project/urllib3/2.8.0/) and PyJWT 2.15.0 (tag2.15.0, commit1d41a6478e1562e68ff667fcd703356acf085f68; PyPI files uploaded 2026-09-23T16:55:59Z and 16:56:00Z, https://pypi.org/project/PyJWT/2.15.0/); both outside the SDK workspace'sexclude-newer = "7 days"when the lock was produced.blueprints/runtime-workers/openhands/research.md,pins.jsonuv_lockandsource_archive):uv lock --upgrade-package ...with uv 0.12.17 from the pinned OpenHands software-agent-sdk archive (sha2562d3006de...), withpyjwt==2.15.0in place of2.14.0andurllib3==2.8.0added; the control (the five earlier upgrades) reproduces the committed lock byte for byte, and the new lock equals the entry-substitution prediction byte for byte.ca69b3d3...; https://github.com/google/osv-scanner/releases/tag/v2.6.0; itsgo.modrequires osv-scalibrv0.5.3-0.20260911142458-3090dbb7aaa2). Config scoping:docs/configuration.md("--config... will applyconfig.tomlto all files parsed") andinternal/config/manager.go(Manager.Get) at tag v2.6.0, https://github.com/google/osv-scanner/blob/v2.6.0/docs/configuration.md;[[IgnoredVulns]]withignoreUntil(https://google.github.io/osv-scanner/configuration/).Evidence-class table
origin/mainat11227bfdwith exactly urllib3==2.7.0 (3 ids), pyjwt==2.14.0 (1 id) and next==16.3.5 (1 id)local_integration(pinned OSV-Scanner 2.6.0, retained wrapper; JSON report and stderr with sha256)blueprints/runtime-workers/openhands/evidence/relock-2026-09-30-urllib3.txtsection Elocal_integration(uv 0.12.17 from the pinned upstream archive)uv pip checkand the SDK import check pass on the new locklocal_integration(scratch venv)source_review(static, installed files)local_integrationnextin YAML the scanner reads exit 1 as ordinary locks and 0 under the frozen config (why that config is bound to one path by the inventory and to one sha256 by the tests)local_integration(pinned binary on scratch files)source_review(git log,git grep,jqoverorigin/main)source_reviewplus executed probes by the reviewers.../evidence/relock-2026-09-30-urllib3.cross-family-review-{1..5}.md, rubrics and the review command record; receiptindependent_reviewNot covered (receipt
limitations): the agent-server image's PyInstaller server binary and the grader venv still carry their own urllib3 and PyJWT; a future exception for another frozen artifact needs its own config, inventory key,FROZEN_LOCKSrow and workflow invocation; the upload step of the second SARIF report was not run here (it needs a token), its shape is checked by the hardening tests; the CI run on the merged head is the authority for the required check.Local commands run
Decision record
docs/decisions/2026-09-22-github-automation-closure.md, paragraph "urllib3 and PyJWT relock and a frozen macOS lock (2026-09-30)": the design, its history (the first design and why it was replaced), alternatives considered (exclude the lock from the inventory: rejected,excludedis for test fixtures only; edit the frozen lock: its bytes are hash-bound; wait for an owner: none recorded; a dated PyJWT ignore: rejected, the fix was available; nested per-directoryosv-scanner.toml: applies only without an explicit--config) and the overturn conditions.blueprints/runtime-workers/openhands/research.mdgets the matching relock section;docs/github-automation.mdthe updatedsecurity-scan.ymlbullet.Follow-ups
83293867...if only those two entries change) and asks for a delta review of the new digest.Checklist
security-scan.ymlkeeps its top-levelpermissions: contents: read, the job-local write scope ofosv-sarif-upload, the pinned action SHAs (the secondupload-sarifstep uses the same pin) and no new secret.🤖 Generated with Claude Code