Skip to content

Retire the skill's Claude-in-GitHub rows and point them to local review - #1001

Merged
seathatflowsinourveins merged 6 commits into
mainfrom
claude/cc-native-practice-retire-gh-review-routes-20261010
Oct 11, 2026
Merged

seathatflowsinourveins merged 6 commits into
mainfrom
claude/cc-native-practice-retire-gh-review-routes-20261010

Conversation

@seathatflowsinourveins

@seathatflowsinourveins seathatflowsinourveins commented Oct 11, 2026 •

Copy link
Copy Markdown
Owner

Scope

  • What this PR changes, in one or two sentences: carries Retire Claude review inside GitHub; AI reviews run locally #981's retirement of Claude review inside GitHub into the claude-native-practice skill. github-action becomes retired (a new status) with its former default kept as a dated snapshot; the in-GitHub run leaves pr-review-pre-cue (now default (scoped); the routes available now are listed apart from the open Add a local Claude review worker for essential pull request heads #953 worker); stale texts that still pointed at the retired route are corrected (the Dependabot note, the scheduled-tasks route and its source mapping, the usage note, the pre-cue source mapping); the slot manifest of Claude Code native practice, 2026-10: one evidenced default per role slot #923 is relabeled against the new slots.json so the provenance test's exact-difference check runs again instead of skipping; and a new test stops any current row, line or source mapping from selecting a retired route. The three forward commits (below) close the holes that the reads found in that test, qualify the one-default rule for retired slots, bind the manifest label to the shipped slots file and judge the prose one physical line at a time.
  • Base commit: 8bffa2c41692ef483e91b68e3b15aeb331423d2c (origin/main with Retire Claude review inside GitHub; AI reviews run locally #981 landed); six commits: ba6ab3a5c1f9ea2cf54caf75ab317f580629f872, replayed onto it from the branch prepared on Retire Claude review inside GitHub; AI reviews run locally #981's head; 6e97620cd356c0042a22d3b353b97585ceb5c030, the first forward commit, which answers the Codex review in GitHub and the co-op's GPT first read, both at ba6ab3a5c; and ef3f3e7bf0c0a66f18b086acc37b9065cc7fe6ac, the second forward commit, which answers the command center's Claude first read and Codex's second review, both at 6e97620cd (both below; the co-op's GPT first read is superseded and covers this head). The range for a read of the second forward commit was 6e97620cd..ef3f3e7bf. The fourth commit is efaa077efa57e7adf75151809f8e977c77eacd94, the third forward commit, which answers the command center's Claude micro and Codex's third review, both at ef3f3e7bf (below); the range for a read of it is ef3f3e7bf..efaa077ef, the range of all of it is ba6ab3a5c..efaa077ef, and the co-op's GPT micro reads ba6ab3a5c..efaa077ef. The fifth commit is bdf60fc62b96734c8db84f2967132515f54df737, the final fix round (below): it answers the command center's Claude micro at efaa077ef (three blockers) and its adjudication of 2026-10-11T13:50Z of Codex's three threads of 13:36:37Z; the range for the confirmation micro was efaa077ef..bdf60fc62. The sixth commit is 7498bcbbaf73574ea99056f2f50892112bd68537, the one correction commit that the command center allows (below): it answers the two claims of the previous round that its confirmation micro found false at bdf60fc62 and closes Codex's threads of 15:39:21Z as the command center ruled (its correction Bind the no-git archive check to the release; report new-machine content drift in release_due; run step 6 under Python 3.13 #163); the range for the confirmation is bdf60fc62..7498bcbba, and the co-op's GPT micro reads ba6ab3a5c..7498bcbba.
  • Lane: lane:foundation
  • Owned paths touched (12 files): .claude/skills/claude-native-practice/SKILL.md (the forward commit: one clause in step 3), .claude/skills/claude-native-practice/reference/ci-supply-chain.md, .claude/skills/claude-native-practice/reference/git-github-automation.md, .claude/skills/claude-native-practice/reference/observation-inference.md, .claude/skills/claude-native-practice/reference/scheduling-supervision.md, .claude/skills/claude-native-practice/reference/slots.json, .claude/skills/claude-native-practice/reference/slots.md, docs/decisions/2026-10-09-claude-code-native-practice.md, evidence/artifacts/claude-native-practice-20261009/claude-native-slot-manifest.json, manifests/evidence.json, tests/test_native_practice_retired_routes.py, tests/test_native_practice_snapshot_provenance.py.

The manifest pin of #972 does not move here. A pin names a landed commit and has to cover these rows, so the re-pin is its own PR: ONE re-pin after this PR and the PR that records the paired-run results, naming the row sets of #986 (the cross-client page), this PR (the retired rows) and the results PR (the planning, orchestration and owed-work rows) (the command center's rulings of 2026-10-10, 20:44Z, and 2026-10-11). Until it lands the pinned row (7a6bfbcf0, skill tree 3a485d2a) still carries the retired default, so the row is not to be installed first. No personal copy of the skill is installed on this host (python3 scripts/skills_status.py --json: canonical, link and lock missing; a fresh claude -p in a worktree reports the project folder as the skill's base directory), so sessions here read the folder this PR changes. SKILL.md changes only in step 3 (one clause, reworded in the second forward commit as the command center's read suggested: "a retired row has no default, so follow the replacement it names"); its description is unchanged, so the listing entry and the routing question are untouched, but its bytes and sha256 change, so the re-pin goes through apply_skills_row.py (which re-measures skill_md_sha256 and skill_md_bytes) and not through the plain pin move. The skill folder's tree is 4c125c1c (b9034b19 at the second forward commit, 7287caf7 at the first forward commit, 104af1cf at the first commit, 3a485d2a on the base).

SOTA sources

  • anthropics/claude-code-action at 2dca132ff0e0c4094ce6048b422c6915a071210b (v1.0.247, committed 2026-10-08T19:51:21Z), base-action/src/parse-sdk-options.ts lines 283-284: // Set the entrypoint for Claude Code to identify this as the GitHub Action and env.CLAUDE_CODE_ENTRYPOINT = "claude-code-github-action";. Read for this change through gh api repos/anthropics/claude-code-action/contents/base-action/src/parse-sdk-options.ts?ref=<pin> (13,126 bytes, sha256 b42cc8daa1d15fb00321784cec375b1c855bb2e41bf03b37dfd462385f9e5548); it is the mechanism Retire Claude review inside GitHub; AI reviews run locally #981's record gives for the API refusal. Retained with its hash beside the research records and re-fetched identical on 2026-10-11 (the lines are 283, the comment, and 284, the assignment); the v1.0.247 tag resolves to that commit, committed 2026-10-08T19:51:21Z.
  • docs/decisions/2026-10-10-retire-in-github-claude-review.md (Retire Claude review inside GitHub; AI reviews run locally #981): the decision, "What remains" (the local routes and the GitHub gates) and "Revisit when". The command center's correction Blind both layer-verdict lanes for the 2026-09-23 re-record #141 (a 400 "credit balance is too low" on each of five Console keys when the request carries the action's attribution) is the command center's measurement, relayed in that record; it is not re-measured here.
  • Claude Code documentation, Skills, "Resolve skills that share a name" (https://code.claude.com/docs/en/skills.md, read 2026-10-10, 107,130 bytes, sha256 35fd2c11f870fbe1497a53796de31b2a6b760645e724bda58894525356d4602a, line 206, counted by newline: "Enterprise over personal, and personal over project"): why the pinned row must not be installed before the re-pin. Correction: this description said line 205, which is the table's delimiter row; the page was re-fetched on 2026-10-11 with the same size and hash and is retained, and the sentence is on line 206.
  • The command center's ruling of 2026-10-10 (20:44Z): the managed Claude Code Review GitHub App, the old row's ranked alternative, is covered by the same decision.
  • The Codex review in GitHub of Retire the skill's Claude-in-GitHub rows and point them to local review #1001 at ba6ab3a5c (four P2 threads) and the co-op's GPT first read at the same head (CHANGES_REQUESTED, three P2s; verdict sha256 1ac338d506d5d07d86fe17858d16eaf78baff1836ae349f5d0fadfd60a52727e): each finding is reproduced here from the module and the skill folder before the change, not copied.
  • GitHub Docs, "Managing a merge queue" (https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/managing-a-merge-queue), the sentence the record quotes ("Pull request merge queues are available in any public repository owned by an organization"): fetched 2026-10-11 and retained (HTML, sha256 53f6de6168f6efb8…), the sentence present.
  • All the upstream bytes above are retained with SHA256SUMS and MANIFEST.json beside the research records (the action's file, the tag and commit JSON, the Skills page, the merge-queue page); the co-op has their location.
  • The command center's Claude first read of Retire the skill's Claude-in-GitHub rows and point them to local review #1001 at 6e97620cd (CHANGES_REQUESTED: two P2s, seven P3s; file sha256 155e47b7322f13b4e5c1737782fc122f899b6d9ebde8666131f8cab1ca0e6d70) and Codex's second review in GitHub of the same head (09:42:51Z, two P2 threads): each finding reproduced here from the module and the skill folder before the change, not copied.
  • The names the new patterns encode, read at the upstream sources: anthropics/claude-code-action at 2dca132ff0e0c4094ce6048b422c6915a071210b, README.md (a381c47399445c97…, 4,896 bytes): line 5 describes the action and the @claude mention, line 26 gives /install-github-app; and the Claude Code documentation page https://code.claude.com/docs/en/github-actions.md (87b99aefc0a9f438…, 29,088 bytes): line 7 "Run Claude Code in GitHub Actions workflows to respond to @claude mentions", line 22 /install-github-app. Both are retained with their hashes beside the research records and re-read for this change.
  • The command center's Claude micro of Retire the skill's Claude-in-GitHub rows and point them to local review #1001 at ef3f3e7bf (CHANGES_REQUESTED: one P2, six P3s; file sha256 7de3d252e539f06225e9d12d4148961b4acb0800a7a7238f85364d12cbda46d1) and Codex's third review in GitHub of the same head (four P2 threads, 10:45:10Z): each finding reproduced here from the module and the skill folder before the change, not copied.
  • The vendor's own text for the added names, read at the pin: anthropics/claude-code-action at 2dca132ff0e0c4094ce6048b422c6915a071210b in the local mirror (CLAUDE.md:20: "base-action/ is also published standalone as @anthropic-ai/claude-code-base-action"; .github/scripts/check_workflow_hardening.py:18: CLAUDE_ACTIONS = ("anthropics/claude-code-action", "anthropics/claude-code-base-action"); .github/workflows/sync-base-action.yml:1 and :43; base-action/README.md:1-3: "Claude Code Base Action", "This GitHub Action allows you to run Claude Code within your GitHub Actions workflows"), and the documentation page https://code.claude.com/docs/en/github-actions.md (retained, 29,088 bytes, sha256 87b99aefc0a9f438…): line 5 "Claude Code GitHub Actions", line 33 "Claude Code installs the Claude GitHub App", lines 63-64 "Install the Claude GitHub App".

Evidence-class table

Claim Evidence class Command / receipt
No current row of the skill, on slots.json, slots.md or the layer pages, selects a retired route; an explaining field names one only while saying it is retired local_integration tests.test_native_practice_retired_routes (22 tests at the first commit, 29 and 32 at the first and second forward commits, 39 at the third, 42 at the fourth, 45 at the fifth, OK); on the base tree plus only the new test it fails (7 of 22 tests fail), log fails-first.log
The check sees the rows as they stood before: the old github-action default, the old pre-cue default ("in Actions through #909") and the Dependabot note are each flagged, and the same rows pass once they say retired local_integration CheckSeesTheRowsOfBeforeTests in the same module
36 single-edit mutations of the change are caught (status, vocabulary, index row, layer-page route, repeated label, notes, route split, workflow file back, another slot's route); the control that edits the dated snapshots passes by design local_integration the mutation table, sha256 8dfb9ce48c3ff3fabccce295ffb053ab4e4bcbf6e9687c1c098b86a4b227b1bf
An independent read of the first version of this change (one P1, three P2, three P3) found a read in the pre-cue route that the record does not name, live rows still pointing at the retired action behind the snapshot exemption, no marker for the managed app, and parsers that dropped lines; each is fixed and the scenarios are mutants M22 to M36 source_review the mutation table above
The line the retirement rests on: the pinned action sets CLAUDE_CODE_ENTRYPOINT to claude-code-github-action source_review the upstream file at the pin, lines 283-284 (above)
No personal copy of the skill is installed on this host, and a fresh session loads the project folder native_proven (run on this host) python3 scripts/skills_status.py --json (canonical, link, lock missing; pass: false); the Skill result's base directory in the A/B transcripts
Routing and content with the stale and the retired rows, hermetic fresh sessions on the pinned client 2.1.296 (tables below; 137 receipts, no memory marker, client 2.1.296, apiKeySource none) native_proven (receipts retained; sha256 775ae8781e5b80d5bc6d5b2f3642e094a2f790c9e0e4f24cbac64c51faa41c7b for the first table, 8aba443b4aca701c54dd532d3b4709edbcb97c828c5a4823d3a2fd425765637f for the second) trigger_cases.py receipts and transcripts of ten arms (four in the first table, three earlier wordings, three settling arms) and one control under research/cc-native-practice-20261009/pr-retire/ab/
The worktree's HEAD commit subject is in a session's context and moves skill invocation on an off-description prompt (the control in the A/B) native_proven a fresh session in the control worktree quotes the recent commit subjects, HEAD first; the stale tree under an empty commit with this PR's subject: 7 of 8 invoked, against 2 of 11 on the same tree under its own subjects
The guard rejects what it must and accepts what the decision retains: lowercase and line-break clauses, the entry point, the ruled default text on all three surfaces, a catalog job in GitHub Actions, a non-model gate under WIF local_integration the comparison table below (old guard wrong on 6 of 8 scenarios, new guard on none)
59 single-edit mutations (the 36 of the first commit, seven of the first forward commit and sixteen of the second) are caught and four controls pass (a legitimate Actions sentence, a lowercase clause that says retired, the dated snapshots as the page quoted them, renumbered steps of SKILL.md) local_integration the mutation table of this head, sha256 760451e3e5651575f1d1057cc5a8d3084e3e5c2918bc1aa712936550878c5f89 (the table of the first forward commit, 43 caught, was 418aa331…)
72 single-edit mutations (the 59 above, less the four that mutated the paragraph joining that the third forward commit reverts, plus seventeen of the third) are caught and five controls pass (the four earlier ones and a wrapped sentence in which every line says retired) local_integration the mutation table of this head, sha256 6e94bfe59d80beb9f16d58caa289c7207e1049b55fb771ee144ef7c61faf12f7
80 single-edit mutations (the 72 above plus eight of the final round: the closing delimiters, the manifest's note, the stated scope and the closed pattern class, and the rule in every explaining unit) are caught and six controls pass (a sixth: a retirement sentence closed with a quote and followed by a sentence that names no route) local_integration the mutation table of this head, sha256 e97b73832177fe6c277a6bca33e768083f23d751f21ef5977495613883380937
88 single-edit mutations (the 80 above plus eight of the correction: the documented unit ends and the reordered phrasings in the docstring, the exclamation mark and the semicolon as unit ends, the module's ASCII, the scope list twice and the right single quotation mark closer) are caught and 6 controls pass local_integration the mutation table of this head, sha256 869500c79e139e97008221a94871f0a57775ee93a1eb407f8bbe759094e0a70d
The guard rejects what it must and accepts what the decision retains, on the scenarios of the command center's micro and Codex's third review (run-ons with a bare line break on four surfaces, the vendor's other names of the route, negations, a duplicate bullet, an index link to another page, a scheduled job) local_integration the third comparison table above (the guard of ef3f3e7bf is wrong on 13 of 19, the guard of this head on none; sha256 d8c0ea8345b03eeff3b4789c0f36a5a86b644c52faee547671f472c0f99af6e5)
The manifest label is the sha256 of the shipped slots.json, and a change to that file that does not carry its label fails (the exact-difference check no longer skips) local_integration tests.test_native_practice_snapshot_provenance (9 tests, none skipped; test_the_label_names_the_shipped_slots_file fails at 6e97620cd); fail-before table below (sha256 933bb4a9b5fbcb5d8e7eff2dec6a2926e89afe2c9dd363b44c0c44765183d9f0)
The guard rejects what it must and accepts what the decision retains, on the scenarios of the command center's read local_integration the second comparison table below (the guard of 6e97620cd is wrong on 9 of 12 scenarios, accepting seven bad ones and rejecting two legitimate ones; the guard of this head is wrong on none; sha256 3fa4a2c8692ef17c5d0824a7b96e17fc433c7744a4e00824fac7fcc9ad017b66)

Response to the Codex review in GitHub and the co-op's GPT first read, both at ba6ab3a5c

All of it is one forward commit, 6e97620cd356c0042a22d3b353b97585ceb5c030, leased on ba6ab3a5c. Codex's four threads are replied to and resolved after the push.

  • Lowercase clauses (the co-op P2 1, Codex tests/test_native_practice_retired_routes.py:41). Right: SENTENCE split only before a capital letter, a backtick, a bracket, a parenthesis or a hyphen, so "This route was retired; the current default is claude-code-action." was one unit that said retired. The units now end at a full stop or a semicolon followed by white space, whatever follows, and at a line break; a comma, a colon or a dash does not end one ("Retired 2026-10-10: the workflows that ran claude-code-action are removed." stays one claim). Both the lowercase-after-semicolon and the lowercase-after-newline forms fail the new test and passed the old module.
  • Generic phrases (the co-op P2 2, Codex :33). Right: "in Actions", "through Actions" and "under WIF" rejected routes the decision keeps (GitHub's required checks, Codex's GitHub review, the scheduled jobs). They now count as the retired route only with Claude context (Claude, Anthropic, Console, the toolkit or Add a pre-cue read by Anthropic's pr-review-toolkit agents in Actions #909), judged per leaf string so one list item does not turn another's phrase into the retired route; the named workflows, "through Add a pre-cue read by Anthropic's pr-review-toolkit agents in Actions #909" and the managed app count everywhere. Accepted controls: the read's two sentences ("Catalog freshness runs in GitHub Actions.", "The non-model artifact gate runs under WIF."), the required checks and the landing scripts described the same way, and every bullet of the record's "What remains" section; rejected: "The Claude review runs in GitHub Actions under WIF." and "The local Claude review worker runs in GitHub Actions."
  • The entry point (the co-op P2 3, Codex :312). Right: the guard read reference/ only. SKILL.md (frontmatter and numbered instructions) is now in the scan, and a test requires every file of the skill folder to be read by a check, so a new file cannot name a retired route unseen. One step wider: the other instruction surfaces (AGENTS.md, CLAUDE.md, README.md, the other skill's SKILL.md) name none of the retired routes; the handbooks and catalogs outside the skill folder that still mention the action (docs/github-automation.md, docs/community-native-practice.md, docs/new-wsl-handbook.md) describe it as unadopted or list its pin, belong to other lanes and are not edited here.
  • The one-default rule (Codex slots.json:13; the co-op's read judged it non-blocking and the wording cleanup reasonable). Done anyway, since the rule and the entry point said "one default per slot" and "follow the default" while a retired row has none: selection_rule in slots.json, its copy on slots.md and step 3 of SKILL.md now name the exception, and one test compares the three. This is the only edit to SKILL.md.
  • The ruled default is pinned exactly (the read's measured boundary wrong-decision-date). Changing the decision date on all three surfaces passed the old suite because it pinned a phrase and checked agreement; RETIRED_DEFAULT now pins the whole text. One step wider than the review of Record the paired-run results (planning, orchestration) and pin the RTK receipt's locators #1005, where editing a row left the slots.md index cell behind: a check compares every row's Overturn when across slots.json, the index and the layer pages.
Scenario (appended to the live skill folder in a scratch copy) Right answer Guard at ba6ab3a5c Guard at 6e97620cd
the unmutated skill folder accept accepts accepts
lowercase clause after a semicolon names the action as current reject accepts (wrong) rejects
lowercase clause after a full stop and a line break reject accepts (wrong) rejects
SKILL.md names the action as the current GitHub review default reject accepts (wrong) rejects
the decision date changed on all three surfaces reject accepts (wrong) rejects
a catalog job described as running in GitHub Actions accept rejects (wrong) accepts
a non-model gate described as running under WIF accept rejects (wrong) accepts
control: a plainly reintroduced route reject rejects rejects

Each finding undone alone fails exactly its own test (the splitter back to capital-letter-only, the line break dropped, the generic phrases global or judged on the whole field, SKILL.md out of the scan, the data files at the base commit). The hermetic A/B below ran before the step-3 clause: the description is unchanged, so it still holds for routing, and the clause is not claimed to be measured.

Response to the command center's Claude first read and Codex's second review, both at 6e97620cd

One forward commit, ef3f3e7bf0c0a66f18b086acc37b9065cc7fe6ac, leased on 6e97620cd. The co-op's GPT first read at 6e97620cd was superseded by this head (it reads ba6ab3a5c..ef3f3e7bf). Codex's two threads (09:42:51Z) are replied to and resolved after the push. The command center's read is research-cc-role-20261008/pr1001-claude-read-6e97620c.md.

  • P2-1, the manifest label (Codex thread on claude-native-slot-manifest.json:12). Right, and found in this lane's own head before the read: the forward commit of 6e97620cd changed selection_rule in slots.json after the manifest had been labeled against the file of ba6ab3a5c (628e02f3…), so test_no_other_exported_field_differs_while_the_slots_file_has_the_labeled_bytes skipped (OK, skipped=1) and the Scope paragraph's "runs again instead of skipping" was untrue. The label is the sha256 of the shipped file (9eccbb3c…), set last, after every other edit of the file. The command center ruled that a silent skip is this defect's class, so test_the_label_names_the_shipped_slots_file asserts equality and the exact-difference test (renamed test_no_other_exported_field_differs) no longer skips; a later pull request that changes slots.json refreshes the label in the same pull request, a mechanical recompute at each rebase. Fail-before, in a scratch root with the modules and the data files:
State Module of 6e97620cd Module of this head
stale label (as at 6e97620cd) rc 0, the exact-difference test skipped rc 1, the label test fails
label recomputed rc 0 rc 0, nothing skipped
one byte of slots.json edited, label kept rc 0, skipped rc 1, the label test fails
stale label and a listed difference removed rc 0, skipped rc 1, both tests fail (the exact-difference test no longer skips)
  • P2-2, a live mapping that ran Claude in a GitHub workflow (Codex thread on slots.json:1616). Right: skills-library.primary_sources[5].native_mechanism (slots.json:948) said claude -p runs per eval "in a GitHub workflow ... plus a nightly cron" on a live slot, and GENERIC had no such form. The mapping now says that run is retired here (decision of 2026-10-10) and the checks run locally; the guard flags "in a GitHub workflow" (also from, via, through, using, as, with or without Actions) when the sentence is about Claude, so a catalog job described as running in a GitHub workflow is accepted. The pre-fix text is a failing case of test_a_live_source_mapping_that_runs_claude_in_a_github_workflow_is_flagged_and_the_reworded_mapping_is_not. Run on the skill folder of 6e97620cd, the new guard flags exactly three things: this mapping and the retired slot's own mapping (twice, see P3-5).
  • P3-1, other names of the route. The Claude Code GitHub Action, /install-github-app and an @claude mention are the same route (names read at the upstream README and the documentation page, above); anthropics/claude-code-security-review stays out, as the read said: it is a documented rejection and appears in the pages' Rejected rows. An address such as name@claude.example is not a mention.
  • P3-4, the Former default exemption. A layer page's "Former default" bullet is a dated snapshot only on a retired slot's page; on a live slot's page it is read like any other line.
  • P3-5, the retired slot's own mapping. github-action.primary_sources[0].native_mechanism (slots.json:1913) named the action and the mention in the present tense and the guard skipped the retired slot's sources. A source's native_mechanism (this repository's mapping of it) is now read on every slot; what the page quoted (practice) stays a snapshot. The mapping says "retired here on 2026-10-10".
  • P3-2, two false positives new at 6e97620cd. "e.g." and "i.e." no longer end a sentence, and wrapped lines of prose are one paragraph (the prose of slots.md and SKILL.md was judged line by line, so a retirement sentence wrapped over two lines was rejected; reverted at efaa077ef, the command center's correction Record NativeStack workstation acceptance and retained failures #160, below); a line that starts a list item, a heading, a table row, a quote, a fence or a rule still starts its own block, so the word retired on such a line does not excuse the unit above it. Not changed, as the read said: two false positives that already existed at ba6ab3a5c ("prints a summary to the console and runs in GitHub Actions"; "no Claude model is involved") follow from the Claude-context test and are a documented boundary.
  • P3-6, the manifest prose. The note now lists the fields beyond the exported ones that differ from the snapshot: the notes of prompt-caching, github-action, pr-review-pre-cue, release-tracking and usage-cost-monitoring, the retired block of github-action, and the top-level selection_rule, status_values and cross_client.
  • P3-7, the entry point directs. Step 3 of SKILL.md now reads "a retired row has no default, so follow the replacement it names", and the pin finds the step by its name, so a renumbering no longer raises an IndexError (control C4). P3-3 (the keyword exemption) needed nothing, as the read said.
  • Not in this pull request, as the read said: docs/github-automation.md:72 (present-tense text of Retire Claude review inside GitHub; AI reviews run locally #981 about a worker that Add a local Claude review worker for essential pull request heads #953 has not landed), docs/new-wsl-handbook.* (generated from adoption/new-wsl-profile.json; its "Owns" lines name the action and line 1363 marks it not installed) and docs/community-native-practice.md (dated catalog rows).
Scenario (on the skill folder of this head, in a scratch copy) Right answer Guard of 6e97620cd Guard of ef3f3e7bf
the skill folder as the second forward commit ships it accept accepts accepts
the pre-fix :948 mapping (claude -p in a GitHub workflow plus a nightly cron) restored reject accepts (wrong) rejects
a live note says the Claude review runs in a GitHub workflow reject accepts (wrong) rejects
a live note names the Claude Code GitHub Action reject accepts (wrong) rejects
a live note says to run /install-github-app reject accepts (wrong) rejects
a live note asks for a fix with an @claude mention reject accepts (wrong) rejects
a live slot's layer page keeps a Former default bullet that is still current reject accepts (wrong) rejects
the retired slot's source mapping back in the present tense (as it stood at :1913) reject accepts (wrong) rejects
a retirement sentence with an abbreviation: (e.g. the workflows that ran claude-code-action are removed) accept rejects (wrong) accepts
a retirement sentence of SKILL.md wrapped over two lines accept rejects (wrong) accepts
a catalog job described as running in a GitHub workflow (no Claude) accept accepts accepts
control: a plainly reintroduced route reject rejects rejects

Run with the module of each head on the same trees (the old guard is given the old step-3 pin so that it is judged on the scenario): the guard of 6e97620cd accepts seven bad scenarios and rejects two legitimate ones (it is right on 3 of the 12); the guard of ef3f3e7bf is right on all twelve (its wrapped-line row is reversed on purpose by the third forward commit, below).

Response to the command center's Claude micro and Codex's third review, both at ef3f3e7bf

One forward commit, efaa077efa57e7adf75151809f8e977c77eacd94, leased on ef3f3e7bf. The command center's micro is research-cc-role-20261008/pr1001-claude-micro-ef3f3e7b.md (8,155 B, sha256 7de3d252e539f06225e9d12d4148961b4acb0800a7a7238f85364d12cbda46d1: one P2, six P3s) and Codex's four threads (:43, :63, :122, :211) are of 10:45:10Z. The co-op's GPT micro reads ba6ab3a5c..efaa077ef. Every item was reproduced on ef3f3e7bf before the change; the table below runs 19 scenarios through the guard of each head.

  • P2-1, a bare line break ended no unit on the four prose surfaces (the command center's correction Record NativeStack workstation acceptance and retained failures #160). The second forward commit joined wrapped lines into a paragraph before judging a unit, so "Retired 2026-10-10" followed by a line that says the current default is claude-code-action passed on SKILL.md, slots.md, cross-client.md and the layer-page preambles (Codex's resolved scenario at ba6ab3a5c, line 41, reopened; the pinned case went through judge() only and never through prose_violations()). Reverted: prose is judged one physical line at a time again, a bare line break ends a unit, "e.g." and "i.e." still do not, and the module, the legend of slots.md and the message of every line-judged surface state the rule (a physical line that names a retired route says it is retired on that same line; keep the name and the retirement on one line). test_a_bare_line_break_ends_a_unit_on_every_surface_and_the_rule_is_in_the_message fails on ef3f3e7bf and passes now: the run-on is rejected on all four surfaces, the "." and ";" forms stay rejected, a one-line retirement sentence is accepted and a wrapped one is rejected with the rule in its message.
  • P3-1 and Codex :43, more names of the same route, all in the vendor's own text. The plural "Claude Code GitHub Actions" is the documentation page's title and "the Claude GitHub App" its installation step (github-actions.md, capture sha256 87b99aefc0a9f438…, lines 5, 9, 33 and 63-64); claude-code-base-action is the published mirror of the action's base-action/ directory (anthropics/claude-code-action at 2dca132ff0e0c4094ce6048b422c6915a071210b, read in the local mirror: CLAUDE.md:20, .github/scripts/check_workflow_hardening.py:18, .github/workflows/sync-base-action.yml:1 and :43, base-action/README.md:1-3); and a row can name the carrier first ("Use the GitHub Action for Claude reviews"), so "a GitHub Action" is a generic carrier name that counts when its field or unit is about Claude. "in Actions" and "through Actions" now also take on, with, inside and via. The failing cases are the page's own lines (test_the_other_names_the_documentation_page_uses_are_flagged); a catalog job that runs on GitHub Actions is still accepted (control C2).
  • P3-2, layer pages: judged one physical line at a time, under the same stated rule.
  • P3-3 and Codex :211, a duplicate operative bullet. section_fields() keeps the first bullet of a label, so a conflicting second Route or Overturn when bullet was never compared and the module's own statement that every parser keeps duplicates was untrue for it. A label that occurs twice in a section is a violation (test_a_second_bullet_with_the_same_label_in_a_layer_page_section_is_flagged; the isolated case is a second Overturn when bullet that names no route).
  • P3-4 and Codex :63, the index link target. The row pattern captured the id and the cells and dropped the href, so [github-action](ci-supply-chain.md#release-tracking) parsed like the right link. Every row's target is required to be <layer page>#<slot id> (test_each_index_row_links_to_the_layer_page_section_of_its_slot).
  • P3-5 and Codex :122, negation. The boundary the command center ruled stays, written where it is applied: a unit that negates the retirement outright ("not retired", "never retired", "no longer retired", "isn't retired", "unretired") no longer counts as saying retired (NEGATED_RETIREMENT), and a unit that says retired and then reverses it ("was retired, but is now current") is still accepted, because the guard is a tripwire for stale text and review reads what it accepts. test_explicit_negations_of_the_retirement_do_not_count_as_saying_retired_and_the_reversal_boundary_is_pinned pins both sides.
  • P3-6, this description: the commands list the 46 modules of the targeted run (1202 tests at this head) and every block is fenced (the second head's block had lost its opening fence, so the last sections rendered as code). The assertion message of the label test now names the register step (scripts/host_receipts.register_file after evidence_manifest.py --write), as the micro asked.
  • The description line of SKILL.md (not in the micro): it names the topic that invokes the skill ("Claude GitHub Actions setup"), which the plural pattern would flag. It is pinned by sha256 to the text the routing was measured with and read as a topic and not as a route (test_the_description_line_is_the_measured_topic_text_and_is_not_read_as_a_route); a changed description is read like any other line.
  • Scheduled tasks (Codex on Record the paired-run results (planning, orchestration) and pin the RTK receipt's locators #1005 at 425240f6e, scheduling-supervision.md:9, and the command center's ruling). The route said GitHub Actions schedules "only for repository jobs that run no model", which goes further than the record (docs/decisions/2026-10-10-retire-in-github-claude-review.md:5-6 and :43: Claude review inside GitHub is retired and Codex's GitHub review stays). The route, the alternative and the layer page now say that GitHub Actions schedules repository jobs, that Claude runs inside GitHub are retired (2026-10-10) and that a scheduled Claude task runs locally; test_the_scheduled_tasks_route_retires_the_claude_routes_and_not_every_model_backed_job pins the wording on slots.json and on the page.
Scenario (on the skill folder of this head, in a scratch copy) Right answer Guard of ef3f3e7bf Guard of efaa077ef
the skill folder as the third commit ships it accept accepts accepts
a run-on with a bare line break on SKILL.md reject accepts (wrong) rejects
a run-on with a bare line break on slots.md reject accepts (wrong) rejects
a run-on with a bare line break on cross-client.md reject accepts (wrong) rejects
a run-on with a bare line break in a layer preamble reject accepts (wrong) rejects
a full stop before the break on SKILL.md reject rejects rejects
a retirement sentence on one line of SKILL.md accept accepts accepts
a retirement sentence wrapped over two lines of SKILL.md reject accepts (wrong) rejects
the carrier named first: Use the GitHub Action for Claude reviews reject accepts (wrong) rejects
the documentation page's title: Claude Code GitHub Actions reject accepts (wrong) rejects
the Claude GitHub App reject accepts (wrong) rejects
the mirror claude-code-base-action reject accepts (wrong) rejects
a Claude review run on GitHub Actions reject accepts (wrong) rejects
a negated retirement: claude-code-action is not retired reject accepts (wrong) rejects
a second Route bullet that names the retired route reject rejects rejects
a second Overturn when bullet with other text, naming no route reject accepts (wrong) rejects
an index row that links to another page and anchor reject accepts (wrong) rejects
a catalog job described as running on GitHub Actions (no Claude) accept accepts accepts
control: a plainly reintroduced route reject rejects rejects

Run with the module of each head on the same skill folder: the guard of ef3f3e7bf is wrong on 13 of the 19 scenarios (it accepts 13 bad ones and rejects 0 legitimate ones); the guard of this head is right on all 19 (retained output sha256 d8c0ea8345b03eeff3b4789c0f36a5a86b644c52faee547671f472c0f99af6e5).

Response to the command center's Claude micro at efaa077ef and its adjudication of Codex's three threads (2026-10-11T13:50Z, the final fix round)

One forward commit, bdf60fc62b96734c8db84f2967132515f54df737, on efaa077ef; the range for the confirmation micro is efaa077ef..bdf60fc62. The command center's micro is research-cc-role-20261008/pr1001-claude-micro-efaa077e.md (1,428 B, sha256 7f50ad983ca0eefa92cfacd7747214a8398c4b0e90f6feabb26fa81ad030ce1c: rule 1b, three blockers that are claims false at the head, and no code defect; its P2-1 of the earlier micro is fixed first-hand on all four prose surfaces). Codex's three threads (13:36:37Z) were reproduced on efaa077ef before the change.

  • B1, and Codex claude-native-slot-manifest.json:47: a text of this PR that was false at the head. The manifest's note on the differences from its snapshot said the route of scheduled-tasks was narrowed "to jobs that run no model". The shipped route says that GitHub Actions schedules repository jobs, that Claude runs inside GitHub are retired (2026-10-10, docs/decisions/2026-10-10-retire-in-github-claude-review.md:5-6 and :43) and that a scheduled Claude task runs locally; the note says that now, in the command center's wording. test_the_scheduled_tasks_route_retires_the_claude_routes_and_not_every_model_backed_job reads the manifest's note as well as the route and fails with the note undone (mutant M79).
  • B2: the rule is in the message of every explaining unit, as the module claims. The module says that the message of every line-judged surface states the rule (a physical line that names a retired route says it is retired on that same line); the labelled bullets of a layer page and the Overturn when cell of an index row did not. Every explaining unit states it now, and a selecting field (Default, Alternatives, a live slot's Route) names no unit and states nothing. The three expected messages of the layer-page test carry the rule, and test_every_explaining_unit_of_a_layer_page_and_of_the_index_states_the_rule_and_a_selecting_field_does_not pins all three kinds (mutants M83 to M85).
  • B3: this description. The two earlier command blocks said "the same 37 modules" while the first block lists 46: they ran the first 37 modules of that list, without its last nine (tests.test_local_pages_fleet_execution to tests.test_local_pages_workstation, 144 tests; the sentence of the fifth commit that said "without its nine tests.test_local_pages_* modules" was wrong: 29 of the 46 are local-pages modules, and the nine left out are the last nine), and say so now.
  • tests/test_native_practice_retired_routes.py:83 (Codex P2, the micro's P3-2): a closing delimiter after the full stop. A closing quote, parenthesis or bracket between the full stop and the white space kept The route was "retired." The current default is claude-code-action. in one unit that said retired. The sentence pattern takes closing delimiters (the curly quotes are built with chr(), so the module stays ASCII); test_a_closing_quote_parenthesis_or_bracket_after_the_full_stop_does_not_join_two_claims covers six forms, keeps claude-code-action was retired (see the record.) No row selects it. accepted, and fails without the change (mutants M78 and M82; control C6).
  • :48, workflow-first phrasing: a follow-up, and the class closes (rule 4 of the convergence ruling). The guard pins the named retired artifacts and the retired slot rows: the 17 patterns that the module docstring lists since the sixth commit (claude-code-action, also as anthropics/claude-code-action; the three retired workflow names claude-pr-review, claude-pr-toolkit-review and harness-audit; the entry-point name claude-code-github-action; claude-code-base-action; install-github-app; the @claude mention; "Claude Code GitHub Action(s)"; "Claude GitHub App"; the managed Code Review app; "through Add a pre-cue read by Anthropic's pr-review-toolkit agents in Actions #909"), with the carrier phrases it already flags when the field is about Claude ("in Actions", "through Actions", "under WIF", "in a GitHub workflow", "a GitHub Action"). Generic phrasing of a Claude run in a GitHub workflow that names none of them cannot be enumerated and is out of the guard's scope; the retirement record governs it. The module says so, and test_generic_workflow_phrasing_is_out_of_scope_and_the_module_says_so pins the boundary (mutants M80 and M81), so a later pattern round has to reopen it with new primary evidence. No pattern is added.

80 single-edit mutants of the guard and its data are caught and 6 controls pass (table sha256 e97b73832177fe6c277a6bca33e768083f23d751f21ef5977495613883380937).

The correction commit (the confirmation micro of bdf60fc62 and the command center's correction #163 of 2026-10-11T16:18Z)

One forward commit, 7498bcbbaf73574ea99056f2f50892112bd68537, on bdf60fc62; the range for the confirmation is bdf60fc62..7498bcbba. The command center's confirmation micro of bdf60fc62 is research-cc-role-20261008/pr1001-claude-micro-bdf60fc6.md (10,994 B, sha256 1952d3400a004b62581a7a417214c5478aa3935716d99b09abfda91a20776d37): rule 1b only, no P1 or P2 code defect, and two claims of the previous round that were false at that head. Codex's re-review of bdf60fc62 (15:39:21Z) raised three P2 threads, all earlier than the range; the command center's correction #163 reversed its first ruling on two of them (it had ruled them fix-now without checking the class history), so this commit changes no code of the guard.

  • Blocker 1 of the micro: the B3 sentence was false. See the correction in the section of the previous round above and in the two command blocks: the 37 modules that ran are the first 37 of the 46-module list, and the nine left out are its last nine (144 tests, verified here by running them).

  • Blocker 2 of the micro: "stays ASCII" was false. The module said that its curly quotes are built with chr() so that the file stays ASCII, and it held one U+2026 in a comment (added by efaa077ef; the scan of the added lines of bdf60fc62 covered that commit only, and its "none" was true). The character is three full stops now, and test_the_source_of_this_module_is_printable_ascii pins the claim; it fails on the module of bdf60fc62 (['U+2026'] != []; retained fail-before-correction.txt, sha256 5547d7f1f6fc29b2554e4800966c9766f05d229fa4980f17f7d4d09e7bd6684f) and its mutant M88 inserts the character again.

  • tests/test_native_practice_retired_routes.py:92 (Codex P2): the unit ends are documented and pinned, and the splitter is not patched a fifth time (correction Bind the no-git archive check to the release; report new-machine content drift in release_due; run step 6 under Python 3.13 #163, rule 4). The sentence splitter has drawn findings in five consecutive rounds (the lowercase clause, "e.g.", the joined lines, the closers, and now the exclamation mark and the question mark) and was patched four times. The class closes the way :48 closed: the module docstring says exactly what the guard accepts as a unit end (a full stop or a semicolon followed by white space, with closing quotes, parentheses and brackets allowed in between, and a line break; an exclamation mark, a question mark, a comma, a colon, a dash, "e.g." and "i.e." do not end a unit) and that review reads everything else, and test_the_unit_ends_and_the_scope_of_the_name_patterns_are_documented pins both the sentence and the behavior; it fails on the module of bdf60fc62, where the sentence is missing (mutants M86, M87 and M93). The confirmation micro found no live instance: with the exclamation mark and the question mark made terminators, the 44 other tests pass on the live skill folder, and the pinning test fails by design, so there is no live instance. Replacing the splitter with a pinned upstream sentence segmenter is a research-queue item (rule 8, layer instructions-skills), not part of this change.

  • :51 (Codex P2, carrier-first names of the managed app): confirmed within the closed class by the command center. The same scope paragraph now says plainly that reordered phrasings of a pinned artifact ("Use the GitHub App for Claude Code Review" for the managed Code Review app) are out of the guard's scope (mutant M92). The thread stays resolved.

  • :170 (Codex P2, retired.on is checked for its shape only): a follow-up (rule 5: the shipped value is 2026-10-10, so 2099-12-31 is a mutant and not a reproduced failure of the shipped state; hardening, P3).

  • The micro's P3s, folded in because this is the last commit. The scope list of the name patterns named 11 of the 17 patterns; it names all 17 now, and test_the_scope_of_the_name_patterns_names_every_pattern compares it with PATTERNS (it fails on the module of bdf60fc62: 'claude-pr-review' not found; mutants M89 and M91). The right single quotation mark among the closers had no test (its mutant survived); a case for it is in the closers test (M90). The comment at the sentence pattern said that a closer "belongs to the unit that ends" while the separator consumes it; it says what the code does.

  • The command center's delta micro of 7498bcbba: CHANGES_REQUESTED on two claims made outside the code, so no new commit (research-cc-role-20261008/pr1001-claude-micro-7498bcbb.md, 12,140 B, sha256 6889fe1e1f7365a5…, as of 2026-10-11T16:57Z). It found no P1, no P2 and no code change in the range (AST comparison), each new test failing on the module of bdf60fc62, and the documented unit ends matching the code on 36 of 36 probes; Codex re-reviewed 7498bcbba at 16:35:10Z ("Didn't find any major issues"). The two claims: this description gave the size of the previous micro record as 10,257 B (the file is 10,994 B; its digest was right; corrected above), and the research-queue pointer of the docstring had no row (the queue keeper, the co-op, adds it; the command center asked). Its P3s are in the Follow-ups.
    88 single-edit mutants of the guard and its data are caught and 6 controls pass (table sha256 869500c79e139e97008221a94871f0a57775ee93a1eb407f8bbe759094e0a70d).

Hermetic A/B

Five prompts about setting up Claude review in GitHub Actions (gha-setup, gha-action-run, gha-default, action-or-else) and about the default AI review before a landing (precue-default), 3 repeats per arm, claude-opus-5-5, client 2.1.296, ai-memory hooks neutralised in every arm (--hermetic: no memory marker in any run), --permission-mode dontAsk with only Skill pre-approved, 8 turns. Arms: A, the repository at #981's head (the retirement record is in the checkout) with the stale skill rows; F, the same repository at the first version of this PR's rows (595ccd037, skill tree 6cb044d5); D, a scratch repository with no Claude workflow and no decision record, the stale skill folder loaded with --add-dir; G, the scratch repository with that first version's skill folder (tree 6cb044d5). The scratch-repository arms stand for a session in another repository with an installed copy; they are not that.

Arm Runs Skill invoked (Wilson 95%) In turn 1 Read slots.md / layer page No final answer Says retired Recommends the retired action
A 15 12/15 (0.55-0.93) 12/15 12/15 / 4/15 2/15 13/15 0/15
F 15 14/15 (0.7-0.99) 14/15 14/15 / 15/15 0/15 15/15 0/15
D 15 15/15 (0.8-1) 15/15 15/15 / 15/15 5/15 0/15 9/15
G 15 15/15 (0.8-1) 15/15 15/15 / 15/15 0/15 15/15 0/15

Earlier wordings of the same rows, kept in the record (B: first retirement rows; C: with the managed-app sentence; E: C's skill folder in the scratch repository; sha256 8aba443b4aca701c54dd532d3b4709edbcb97c828c5a4823d3a2fd425765637f):

Arm Runs Skill invoked (Wilson 95%) In turn 1 Read slots.md / layer page No final answer Says retired Recommends the retired action
B 15 15/15 (0.8-1) 14/15 15/15 / 15/15 0/15 15/15 0/15
C 15 14/15 (0.7-0.99) 14/15 13/15 / 15/15 0/15 15/15 0/15
E 15 15/15 (0.8-1) 14/15 15/15 / 15/15 1/15 14/15 0/15

The last column of D is the keyword count (9); by hand all 10 answered runs of D present the retired route as the current default (the tenth says the toolkit pre-cue also runs "in GitHub Actions, through #909" without naming the action). Every other answer was read by hand as well, and the keyword count agrees.

What the arms show (counts only):

  • Routing holds. SKILL.md is the same bytes in every arm. On the four prompts that name GitHub Actions or the Claude action the skill was invoked 12 of 12 times in each repository arm (A, F, and the earlier B and C) and in the scratch repository on all five prompts (D, G: 15 of 15 each). The one prompt the description does not name (precue-default, the default review before a landing) varies with the worktree's HEAD commit subject, not with the rows: a session's context carries the recent commit subjects (a fresh session in the control worktree quotes them, HEAD first), and the arms differ in HEAD. Stale tree: 2 of 11 invoked (1 of 11 in turn 1; A 0 of 3 plus a settling run 2 of 8). Retirement tree: 10 of 11 (8 of 11 in turn 1; F 2 of 3 plus 8 of 8; Fisher p = 0.0019). Control, the stale tree under an empty commit that carries this PR's subject: 7 of 8, all in turn 1 (against the stale arms p = 0.0055; against the retirement arms p = 1.0). I did not test the converse (the retirement tree under an unrelated subject).
  • Inside the repository the record corrects a stale row, at a cost (A). The sessions read the retirement record: 13 of 13 answered runs say retired and none recommends the retired action. They read the skill's layer page in 4 of 15 runs (15 of 15 with these rows) and 2 of 15 ended at the turn cap without an answer (0 of 15 with these rows).
  • Where nothing around the skill can correct it, the stale rows are followed (D). All 10 answered runs present the retired route as current: 7 recommend anthropics/claude-code-action pinned and federated (one writes the workflow) and 3 say the pre-cue also runs in GitHub Actions. The other 5 runs ended at the turn cap while checking the action's current release before writing the workflow (one had already tried to write .github/workflows/claude-review.yml). With these rows (G) all 15 runs say retired and name local review, none recommends it, no answer contains a workflow that uses the action, and no answer offers the managed Claude Code Review GitHub App as an option.
  • The wording changed after the first retirement rows. With "no Claude workflow runs in GitHub Actions in this repository" (E, 15 runs) two of the three runs of the prompt that asks for a claude-code-action workflow by name still wrote it, with the caution that the retirement only covers native-agent-stack. The command center ruled that the decision covers the owner's repositories, so the rows now say "Claude review does not run inside GitHub" and the test pins that wording; G is the rerun on it (0 of 15 wrote a workflow).

Limits: one model (claude-opus-5-5) and one client version (2.1.296); 15 runs per arm over five prompts this lane wrote (not blind), 8 more repeats of one prompt per settling arm; runs that ended without an answer are shown, not imputed; D and G load the skill through --add-dir from a scratch repository, which stands for a session in another repository with an installed copy and is not that; the arms in the repository differ in HEAD commit, which the control shows matters for an off-description prompt and not for the four prompts the description covers (invoked 12 of 12 in all); costs are not reported (subscription login, list-equivalent only). Arms F and G ran on the rows of the first version of this change (and before the step-3 clause of the forward commits) (skill tree 6cb044d5); the final rows differ by the edits an independent read of that version led to: the pre-cue route no longer lists a read the record does not name, the scheduled-tasks route, the usage note and three source mappings are reworded, and the retired rows' evidence and notes sentences each say retired. None of them changes the github-action default or route text beyond a leading "Retired:", and the arms were not re-run (the account's five-hour usage window was at 0.97 when the edits were made).

Declared test contract change

The sixth commit (7498bcbba) changes tests/test_native_practice_retired_routes.py (42 tests become 45) and drops no assertion and no code of the guard: three tests are added (the scope list against PATTERNS, the documented unit ends and the scope of the name patterns, and the module's ASCII), the closers test gains a case, the docstring names all 17 patterns, states the unit ends and the reordered phrasings, and one non-ASCII character of a comment is written in ASCII.

The fifth commit (bdf60fc62) changes tests/test_native_practice_retired_routes.py (39 tests become 42) and drops no assertion: three tests are added (the closing delimiters, the stated scope of the name patterns, which pins that generic workflow-first phrasing is out of scope, and the rule in every explaining unit), one test is extended (the scheduled-tasks test also reads the manifest's note), the sentence pattern gains closing delimiters, the module docstring states the scope, and the expected messages of the layer-page test (three) now end with the rule, because the code now appends it to every explaining unit of a layer page and to the index's Overturn when cell (a stronger check of the same findings). The manifest's note is edited (text only; the label is the sha256 of slots.json, which this commit does not touch).

The third forward commit declares a change to the module tests/test_native_practice_retired_routes.py (32 tests become 39): test_an_abbreviation_does_not_end_a_claim_and_a_wrapped_paragraph_is_one_claim is replaced by test_an_abbreviation_does_not_end_a_claim (the abbreviation half, unchanged in substance) and test_a_bare_line_break_ends_a_unit_on_every_surface_and_the_rule_is_in_the_message (the wrapped-paragraph half is reversed on purpose: the command center's correction #160), and paragraphs() with its block-start pattern is removed. Four assertions that counted exactly one finding (a note and a default in each of test_the_other_names_of_the_retired_route_are_flagged_and_the_documented_rejection_is_not and test_a_live_source_mapping_that_runs_claude_in_a_github_workflow_is_flagged_and_the_reworded_mapping_is_not) now require at least one, because a text can match more than one name since the new patterns (for example "the Claude Code GitHub Action" and "a GitHub Action"); no scenario they cover is dropped. Four existing tests gain cases (test_a_layer_page_route_or_continuation_line_that_names_a_retired_route_is_flagged, test_a_live_source_mapping_that_runs_claude_in_a_github_workflow_is_flagged_and_the_reworded_mapping_is_not, test_the_index_says_what_a_retired_row_is and test_the_other_names_of_the_retired_route_are_flagged_and_the_documented_rejection_is_not), six tests are added (the duplicate bullet, the index link, the negation boundary, the description line, the documentation page's names and the scheduled-tasks wording) and one assertion message of tests/test_native_practice_snapshot_provenance.py gains the register step. No other assertion is dropped.

The second forward commit adds a second declared change: tests.test_native_practice_snapshot_provenance no longer skips its exact-difference test when reference/slots.json differs from the labeled bytes; a new test requires the label to be the sha256 of the shipped file, and the exact-difference test (renamed test_no_other_exported_field_differs) runs on every checkout. A pull request that changes slots.json now refreshes the label (and the list of differences) in the same pull request (the command center's ruling: a silent skip is this defect's class). No assertion is dropped.

The first declared change: one expected value changes: tests.test_native_practice_snapshot_provenance expects the differences between the #923 snapshot and the current slots.json to lie in alternatives, default, evidence, overturn_when, rejections, route and status (it expected alternatives, rejections and route), because the slot manifest is relabeled against the new slots.json bytes; with the bytes matching its label the check that skips on changed bytes runs again and holds. No assertion is dropped; one test module is added.

Local commands run

Head ba6ab3a5c1f9ea2cf54caf75ab317f580629f872 on 8bffa2c41 (CPython 3.13.16 locally), TMPDIR outside /tmp and outside home:
$ python3 -E -s -B scripts/validate.py
{"components": 70, "hashed_files": 11471, "profiles": 4, "receipts": 239, "status": "passed"}   (rc 0)
$ python3 -E -s -B scripts/evidence_manifest.py --check
{"files": 11471, "status": "passed"}   (rc 0)
$ python3 -E -s -B scripts/validate_convergence.py --all-recorded
rc 0
$ python3 -E -s -B scripts/component_matrix.py --write && python3 -E -s -B scripts/new_host_grand_list.py --write
rc 0; no change to a generated report
$ python3 -E -s -B -m unittest tests.test_native_practice_retired_routes tests.test_primary_source_reading_counts tests.test_native_practice_snapshot_provenance tests.test_native_practice_doc_corrections tests.test_evidence_manifest tests.test_upstream_surface_watch tests.test_practice_references tests.test_record_verdicts tests.test_skills_manifest tests.test_skills_status tests.test_runtime_worker_skills tests.test_landscape_sweep_skills tests.test_install_skills tests.test_github_automation_practice tests.test_workflow_hardening tests.test_workflow_security_coverage tests.test_claude_federation_diagnostics tests.test_local_pages_adoption tests.test_local_pages_adoption_roles tests.test_local_pages_adoption_roles_boundary tests.test_local_pages_architecture_cache tests.test_local_pages_architecture_evidence_boundary tests.test_local_pages_architecture_evidence_fix tests.test_local_pages_architecture_host_receipts tests.test_local_pages_architecture_inventory tests.test_local_pages_architecture_landscape_exclusions tests.test_local_pages_architecture_lazy tests.test_local_pages_architecture_manifest tests.test_local_pages_architecture_policy tests.test_local_pages_architecture_privacy tests.test_local_pages_architecture_public_names tests.test_local_pages_architecture_read_boundary tests.test_local_pages_architecture_roles tests.test_local_pages_architecture_sources tests.test_local_pages_architecture_view tests.test_local_pages_current_view tests.test_local_pages_fleet_data tests.test_local_pages_fleet_execution tests.test_local_pages_fleet_regressions tests.test_local_pages_fleet_tracking tests.test_local_pages_fleet_tracking_view tests.test_local_pages_fleet_view tests.test_local_pages_policy_grants tests.test_local_pages_sanitization tests.test_local_pages_source_policy tests.test_local_pages_workstation
Ran 1184 tests in 134.544s; FAILED (failures=1, skipped=9): the one failing subtest is test_fixture_step_fails_when_a_scan_does_not_complete_in_the_real_fixture_module, which runs the repository's real gitleaks fixture module against a stand-in scanner in seven modes; it failed in a different mode at each of its four failing runs on this host (scan-error, no-report, killed, detections-missing) at a load average of 20 to 40 while other lanes' tests and measurements ran, the cause of those failures under load was not isolated here; the gates script reran it alone, attempt 1: FAILED (failures=1) (Ran 1 test in 3.806s); attempt 2: OK (Ran 1 test in 3.525s).
$ git diff origin/main --unified=0 | grep '^+'   # added lines, scanned for the host's private names
hits 0

Head 6e97620cd356c0042a22d3b353b97585ceb5c030 (the working tree as tested, committed unchanged), same environment:
$ python3 -E -s -B scripts/validate.py
{"components": 70, "hashed_files": 11471, "profiles": 4, "receipts": 239, "status": "passed"}   (rc 0)
$ python3 -E -s -B scripts/evidence_manifest.py --check
{"files": 11471, "status": "passed"}   (rc 0)
$ python3 -E -s -B scripts/validate_convergence.py --all-recorded
rc 0
$ python3 -E -s -B scripts/component_matrix.py --write && python3 -E -s -B scripts/new_host_grand_list.py --write
rc 0; the only changes are the 5 files of the commit
$ python3 -E -s -B -m unittest <the first 37 modules of the first block's list, without its last nine, tests.test_local_pages_fleet_execution to tests.test_local_pages_workstation (144 tests)>
Ran 1047 tests in 96.150s; OK (skipped=10)   (rc 0; the gitleaks fixture test passed in this run)
$ the old module and the new one against eight scenarios of the GPT read (the table above)
the new module is right on all eight, the old one on two
$ 43 single-edit mutations, 3 controls
43 of 43 caught, controls pass
$ git diff HEAD~1 --unified=0 | grep '^+'   # added lines, scanned for the host's private names
hits 0
Head ef3f3e7bf0c0a66f18b086acc37b9065cc7fe6ac (the working tree as tested, committed unchanged), same environment, run after `scripts/host_receipts.register_file` had registered the five changed files (`evidence_manifest.py --write` alone left `validate.py` failing on them):
$ python3 -E -s -B scripts/validate.py
{"components": 70, "hashed_files": 11471, "profiles": 4, "receipts": 239, "status": "passed"}   (rc 0)
$ python3 -E -s -B scripts/evidence_manifest.py --check
{"files": 11471, "status": "passed"}   (rc 0)
$ python3 -E -s -B scripts/validate_convergence.py --all-recorded
rc 0
$ python3 -E -s -B scripts/component_matrix.py --write && python3 -E -s -B scripts/new_host_grand_list.py --write
rc 0; the only changes are the 6 files of the commit
$ python3 -E -s -B -m unittest <the first 37 modules of the first block's list, without its last nine, tests.test_local_pages_fleet_execution to tests.test_local_pages_workstation (144 tests)>
Ran 1051 tests in 88.254s; FAILED (failures=1, skipped=8): the failing subtest is test_fixture_step_fails_when_a_scan_does_not_complete_in_the_real_fixture_module, mode 'deadlock', the repository's real gitleaks fixture module against a stand-in scanner, at a load average of 15 to 23 on this host; run alone it passed twice in a row (Ran 1 test in 3.05s and 2.91s, OK) and it failed in the same way on both the old and the new head when the two suites ran side by side; the skips of the two heads differ by exactly the exact-difference test that no longer skips
$ python3 -E -s -B -m unittest tests.test_native_practice_retired_routes tests.test_native_practice_snapshot_provenance
Ran 41 tests; OK (the guard module 32 tests, the provenance module 9, none skipped)
$ 59 single-edit mutations, 4 controls (mutations_retire_v3.py)
59 of 59 caught, controls pass (table sha256 760451e3...)
$ git diff HEAD~1 --unified=0 | grep '^+'   # added lines, scanned for the host's private names
hits 0
Head efaa077efa57e7adf75151809f8e977c77eacd94 (the working tree as tested, committed unchanged), same environment, run after `scripts/host_receipts.register_file` had registered the seven changed files:
$ python3 -E -s -B scripts/validate.py
{"components": 70, "hashed_files": 11471, "profiles": 4, "receipts": 239, "status": "passed"}   (rc 0)
$ python3 -E -s -B scripts/evidence_manifest.py --check
{"files": 11471, "status": "passed"}   (rc 0)
$ python3 -E -s -B scripts/validate_convergence.py --all-recorded
rc 0
$ python3 -E -s -B scripts/component_matrix.py --write && python3 -E -s -B scripts/new_host_grand_list.py --write
rc 0; the only changes are the 7 files of the commit
$ python3 -E -s -B -m unittest <the 46 modules of the body's earlier list>
Ran 1202 tests in 97.793s; OK (skipped=8)   (rc 0)
$ python3 -E -s -B -m unittest tests.test_native_practice_retired_routes tests.test_native_practice_snapshot_provenance
Ran 48 tests; OK (the guard module 39 tests, the provenance module 9, none skipped)
$ the guard of ef3f3e7bf and the guard of this head against 19 scenarios (the third table above)
the guard of ef3f3e7bf is wrong on 13, the guard of this head on none
$ 72 single-edit mutations, 5 controls (mutations_retire_v4.py)
72 of 72 caught, controls pass (table sha256 6e94bfe5...)
$ git diff HEAD~1 --unified=0 | grep '^+'   # added lines, scanned for the host's private names
hits 0
Head bdf60fc62b96734c8db84f2967132515f54df737 (the working tree as tested, committed unchanged) on `efaa077ef`, same environment, run after `scripts/host_receipts.register_file` had registered the changed files:
$ python3 -E -s -B scripts/validate.py
{"components": 70, "hashed_files": 11471, "profiles": 4, "receipts": 239, "status": "passed"}   (rc 0)
$ python3 -E -s -B scripts/evidence_manifest.py --check
{"files": 11471, "status": "passed"}   (rc 0)
$ python3 -E -s -B scripts/validate_convergence.py --all-recorded
rc 0
$ python3 -E -s -B scripts/component_matrix.py --write && python3 -E -s -B scripts/new_host_grand_list.py --write
rc 0; no change to a generated report
$ python3 -E -s -B -m unittest <the 46 modules of the first block's list>
Ran 1205 tests in 179.364s; OK (skipped=8)   (rc 0; a first run at a load average of about 80 failed one timing test of the local-pages modules, test_producer_timeout_cleans_up_a_real_descendant_process_group, a real process-group cleanup, which passes alone in a module of 23 tests, twice, and in this rerun)
$ python3 -E -s -B -m unittest tests.test_native_practice_retired_routes tests.test_native_practice_snapshot_provenance
Ran 51 tests; OK (the guard module 42 tests, the provenance module 9, none skipped)
$ 80 single-edit mutations, 6 controls (mutations_retire_v6.py)
80 of 80 caught, controls pass (table sha256 e97b7383...)
$ git diff HEAD~1 --unified=0 | grep '^+'   # added lines, scanned for the host's private names and for characters outside printable ASCII
hits 0; characters outside printable ASCII: none
Head 7498bcbbaf73574ea99056f2f50892112bd68537 (the working tree as tested, committed unchanged) on `bdf60fc62`, same environment, run after `scripts/host_receipts.register_file` had registered the changed file:
$ python3 -E -s -B scripts/validate.py
{"components": 70, "hashed_files": 11471, "profiles": 4, "receipts": 239, "status": "passed"}   (rc 0)
$ python3 -E -s -B scripts/evidence_manifest.py --check
{"files": 11471, "status": "passed"}   (rc 0)
$ python3 -E -s -B scripts/validate_convergence.py --all-recorded
rc 0
$ python3 -E -s -B scripts/component_matrix.py --write && python3 -E -s -B scripts/new_host_grand_list.py --write
rc 0; no change to a generated report
$ python3 -E -s -B -m unittest <the 46 modules of the first block's list>
Ran 1208 tests in 129.529s; OK (skipped=8)   (rc 0)
$ python3 -E -s -B -m unittest tests.test_native_practice_retired_routes tests.test_native_practice_snapshot_provenance
Ran 54 tests; OK (the guard module 45 tests, the provenance module 9, none skipped)
$ the three new tests of the commit (scope list, documented unit ends, ASCII) on the module of bdf60fc62
FAILED (failures=3): 'claude-pr-review' not found in the scope list; the Unit ends sentence is missing; ['U+2026'] != [] (retained fail-before-correction.txt)
$ 88 single-edit mutations, 6 controls (mutations_retire_v9.py)
88 of 88 caught, controls pass (table sha256 869500c7...)
$ git diff HEAD~1 --unified=0 | grep '^+'   # added lines, scanned for the host's private names and for characters outside printable ASCII; and the whole module scanned for them
hits 0; characters outside printable ASCII: none (added lines and the module)

12 files changed, 951 insertions(+), 77 deletions(-) against the base. The local full-suite shards in a CI-like environment are noisy on this host, so the list above is the targeted run and CI's eight shards are the full-suite measurement.

Follow-ups

Listed under the command center's convergence ruling of 2026-10-11T13:37Z (research-cc-role-20261008/ruling-pr-wave-convergence-20261011.md) and its micro at efaa077ef; none is a blocker.

  • Codex P2 at tests/test_native_practice_retired_routes.py:48 (13:36:37Z) and the micro's P3-1: workflow-first and plural action-first phrasing ("A GitHub workflow runs Claude Code to review every pull request", "The GitHub Actions workflow invokes Claude for PR review") passes the guard. CLOSED by the command center's rule-4 ruling: the guard pins named retired artifacts only, generic phrasing is out of its stated scope and governed by the retirement record, and the boundary is pinned by a test.
  • Codex P2 at tests/test_native_practice_retired_routes.py:51 (15:39:21Z, head bdf60fc62): carrier-first names of the managed Code Review app ("Use the GitHub App for Claude Code Review.") pass the guard. CLOSED with the name-pattern class by the command center's rule-4 ruling (the guard pins the named retired artifacts; generic phrasing is out of scope).
  • Codex P2 at :92 (15:39:21Z, an exclamation mark or a question mark does not end a unit): CLOSED by documentation in the sixth commit (7498bcbba), above, by the command center's correction Bind the no-git archive check to the release; report new-machine content drift in release_due; run step 6 under Python 3.13 #163; a pinned upstream sentence segmenter instead of the bespoke splitter is a research-queue item (rule 8, layer instructions-skills). Codex P2 at :170 (retired.on checked for its shape only): a follow-up (rule 5, hardening). Codex P2 at :51: confirmed within the closed class, above.
  • The confirmation micro of bdf60fc62, wider or pre-existing: the markdown closers after a full stop (**, _, a backtick) are not closers of the sentence pattern (the same splitter class: documented, not patched); the 0.4 s producer-timeout budget of the unrelated local-pages test test_producer_timeout_cleans_up_a_real_descendant_process_group, which is load-sensitive; and the Record the paired-run results (planning, orchestration) and pin the RTK receipt's locators #1005 coupling (its branch contains only ba6ab3a5c and conflicts with main in the slot manifest and evidence.json, resolved at its rebase).
  • The delta micro's P3 1: the scope-list test pins 15 of the 17 patterns, not all 17: removing "in a GitHub workflow" (the generic-phrasing sentence repeats it) or "a GitHub Action" (a substring of "Claude Code GitHub Action(s)") from the list still passes, so the test's comment and the commit message of 7498bcbba ("compares the list itself with PATTERNS") overstate it. The list itself names all 17; fixed the next time the module changes.
  • The delta micro's P3 4: no test pins the research-queue sentence of the docstring ("a research-queue item (rule 8, layer instructions-skills)"); the queue row is the co-op's to add, and the sentence is true once it does.
  • The micro's P3 4: the reply on the :83 thread cites the v5 mutation table (77 of 77) while this description cites the later tables; each statement is true of its own table (each table adds mutants to the previous one).
  • The micro's P3-3 to P3-7: negation variants, a second Status line, the layer_id href, an R7 test and the artifact citation (listed in the micro without further text).
  • Not this PR (the earlier micro's one-step-wider list): present-tense text outside the skill folder that names the retired route (docs/github-automation.md:63, one HOST-09 history row, docs/new-wsl-handbook.md:1419 and its generated source adoption/new-wsl-profile.json), and the two false positives that existed at ba6ab3a5c ("prints a summary to the console and runs in GitHub Actions"; "no Claude model is involved"), a documented boundary of the Claude-context test.
  • Boundary kept by ruling: a unit that says retired and then reverses it ("was retired, but is now current") is accepted; review reads what the guard accepts.

Decision record

No new record: this carries docs/decisions/2026-10-10-retire-in-github-claude-review.md into the skill. The 2026-10-09 record gains a dated pointer to it, as #981 did for the older Claude-action records.

Host evidence

Not applicable: no file under evidence/hosts/ changes.

Checklist

  • New/changed GitHub Actions are pinned to a full commit SHA with a version comment (no floating tags). (none changed)
  • New/changed workflows declare top-level permissions: {} and grant each job only what it needs. (none changed)
  • No secrets are printed, logged or committed; no new required secret was added without a documented owner.
  • No new paid hosting, subscription or billing surface was introduced.
  • Peer-owned untracked files and worktrees were preserved (not deleted, moved or overwritten).

🤖 Generated with Claude Code

The claude-native-practice skill still selected the route that
docs/decisions/2026-10-10-retire-in-github-claude-review.md retired:
the github-action row (anthropics/claude-code-action at a pin) and the
Actions part of pr-review-pre-cue.

- slots.json, slots.md and the layer pages: `retired` joins the status
  vocabulary; github-action becomes retired with a dated block (record,
  correction #141, scope, the three workflows, the former default, route,
  alternatives, evidence and notes as a snapshot, the revisit triggers);
  pr-review-pre-cue becomes default (scoped) and lists the routes
  available now (local Claude reads, GPT reads, Codex's GitHub review,
  the required verdict-review-gate) apart from the open #953 worker.
- The scope is the owner's repositories (the command center's ruling of
  2026-10-10), not "this repository": a hermetic A/B showed a session in
  another repository concluding that the action was still fine there.
  The same ruling retires the managed Claude Code Review GitHub App.
- Stale texts the independent pre-read and the stricter check found: the
  release-tracking note (Dependabot as the action's tracker), the
  scheduled-tasks route (GitHub Actions schedules only for jobs that run
  no model) and its source mapping, the usage-cost-monitoring note
  (Actions under WIF), and the pre-cue source mapping (in Actions through
  #909). The pre-cue route no longer lists a read the record does not name.
- tests/test_native_practice_retired_routes.py: no current row selects a
  retired route; a retired route is named elsewhere only in a sentence or
  list item that says it is retired; every line of slots.json, slots.md,
  the layer pages and cross-client.md is read (duplicates kept, the source
  mappings of live slots included); only the dated snapshots are exempt.
  Positive controls are the rows as they stood; the mutation table is in
  the pull request description.
- The slot manifest of #923 is relabeled against the new slots.json
  bytes, so the exact-difference check of the provenance test runs again
  instead of skipping.
- docs/decisions/2026-10-09-claude-code-native-practice.md: a dated
  pointer to the retirement, as #981 did for the older records.

Source read for this change: anthropics/claude-code-action at
2dca132ff0e0c4094ce6048b422c6915a071210b, base-action/src/
parse-sdk-options.ts:283-284 (CLAUDE_CODE_ENTRYPOINT is set to
claude-code-github-action).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@seathatflowsinourveins seathatflowsinourveins added the lane:foundation Foundation lane: Claude/Codex setup, hosts, memory, RAG, research, workers label Oct 11, 2026
@seathatflowsinourveins

Copy link
Copy Markdown
Owner Author

@codex review

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 11, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-11T16:35:11.949420Z 7498bcb Manual request
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ba6ab3a5c1

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread tests/test_native_practice_retired_routes.py Outdated
Comment thread tests/test_native_practice_retired_routes.py Outdated
Comment thread tests/test_native_practice_retired_routes.py Outdated
Comment thread .claude/skills/claude-native-practice/reference/slots.json
…ule for retired slots

Answers the Codex review in GitHub of #1001 at ba6ab3a (four P2s) and the co-op's GPT first read at the same head (three P2s, the first three below); each was reproduced before the change.
- Sentence units split at a full stop or a semicolon whatever follows, and at a line break: "This route was retired; the current default is claude-code-action." was one unit that said retired.
- The generic phrases "in Actions", "through Actions" and "under WIF" count as the retired route only with Claude context, judged per leaf string; the named workflows, "through #909" and the managed app count
  everywhere. The routes the decision retains (every bullet of its "What remains" section, a catalog job in GitHub Actions, a non-model gate under WIF) are accepted.
- The skill's entry point SKILL.md is scanned, and a test requires every file of the skill folder to be read by a check.
- The one-default rule names the retired exception in slots.json, in the slots.md copy and in step 3 of SKILL.md (a retired row has none and says what replaced the route).
- The ruled default text is pinned exactly (the read's measured boundary: the date changed on all three surfaces passed), and a check compares every row's Overturn when across slots.json, the index and the
  layer pages (one step wider than the review of #1005, where an edit left the index cell behind).
Each finding fails its own test when its fix is undone alone, and 43 single-edit mutations are caught; the old guard accepts the four bad scenarios of the read and rejects its two legitimate ones.

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

Copy link
Copy Markdown
Owner Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6e97620cd3

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread .claude/skills/claude-native-practice/reference/slots.json Outdated
…ning holes of the retirement guard

Answers the CC's Claude first read of #1001 at 6e97620 (two P2s, six P3s) and Codex's second review in GitHub of the same head (two P2 threads); each was reproduced before the change.
- P2-1: the slot manifest was labeled against the slots.json of ba6ab3a, so the exact-difference check of the provenance test skipped at the head (OK, skipped=1). The label is the sha256 of the shipped file again,
  the check no longer skips, and a new test fails when a change to slots.json does not carry its label (the CC's ruling: a silent skip is this defect's class, so it fails loud).
- P2-2: a live source mapping (skills-library, primary_sources[5]) still ran `claude -p` "in a GitHub workflow ... plus a nightly cron"; the guard had no such form. It is reworded to say the run is retired,
  and "in a GitHub workflow" (also from, via, through, using, as) counts as the retired route when the sentence is about Claude.
- P3-1: the Claude Code GitHub Action, /install-github-app and an @claude mention are the retired route under other names (claude-code-security-review stays out: a documented rejection).
- P3-4: the Former default exemption of a layer page applies to a retired slot only.
- P3-5: a retired slot's own source mapping is read, and now says retired.
- P3-2: "e.g." and "i.e." no longer end a sentence, and wrapped lines of prose are one paragraph (the slots.md prose and SKILL.md were judged line by line).
- P3-6: the manifest prose lists the fields beyond the exported ones that differ from the snapshot.
- P3-7: the entry point directs ("a retired row has no default, so follow the replacement it names"), and the step-3 pin no longer fails with an IndexError on a renumbering.
Each correction fails its own test when it is undone alone, and the mutation table is extended.

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

Copy link
Copy Markdown
Owner Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ef3f3e7bf0

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread tests/test_native_practice_retired_routes.py Outdated
Comment thread tests/test_native_practice_retired_routes.py Outdated
Comment thread tests/test_native_practice_retired_routes.py
Comment thread tests/test_native_practice_retired_routes.py Outdated
…uard's other gaps

Answers the command center's Claude micro of #1001 at ef3f3e7 (P2-1, P3-1 to P3-5) and Codex's four threads of the same head (:43, :63, :122, :211). Each case was reproduced before the change:
compare-guards-ef3f3e7b-vs-third-commit.txt runs 19 scenarios through the guard of ef3f3e7 and this one; the old guard is wrong on 13 (it accepts a retired route that is reintroduced), this one on none.
- P2-1 (correction #160): joining wrapped lines into one paragraph let "Retired 2026-10-10" followed by a line that says the current default is claude-code-action pass on four prose surfaces (SKILL.md, slots.md,
  cross-client.md, layer-page preambles), the scenario Codex raised at ba6ab3a line 41. Prose is judged one physical line at a time again, a line break ends a unit, and the message of every line-judged surface
  states the rule (RULE; the legend of slots.md states it too and a test pins the two to each other).
- P3-1 and Codex :43: three more names of the same route, all in the vendor's own text: the page's title "Claude Code GitHub Actions" and its "installs the Claude GitHub App"
  (code.claude.com/docs/en/github-actions.md, capture sha256 87b99aef, lines 5, 9, 33, 63-64), the mirror claude-code-base-action (anthropics/claude-code-action@2dca132ff0e0:
  .github/scripts/check_workflow_hardening.py:18, .github/workflows/sync-base-action.yml:1 and 43, CLAUDE.md:20) and the carrier named first ("Use the GitHub Action for Claude reviews", generic
  like "in Actions": it counts when the field or unit is about Claude). The families "in Actions" and "through Actions" take on, with, inside and via.
- Codex :122 and the command center's P3-3 and P3-5: a unit that negates the retirement outright ("not retired", "never retired", "no longer retired", "isn't retired", "unretired") no longer counts as saying
  retired. The other half of that scenario, "was retired, but is now current", is the boundary the command center ruled (the guard is a tripwire for stale text; review reads what it accepts); the module names it.
- Codex :211 and P3-3: a layer-page section with a label twice (a second Route or Overturn when bullet) is a violation, because the page-to-slots.json comparison keeps the first bullet only.
- Codex :63 and P3-4: the target of every slots.md row is checked against <page>#<id>, from the layer of the slot.
- The description line of SKILL.md names the topic that invokes the skill; it is pinned by sha256 to the text the routing was measured with and read as a topic, not as a route.
- Scheduled-tasks (Codex on #1005, scheduling-supervision.md:9, and the command center's ruling): the route no longer bans every model-backed job. The retirement record
  (docs/decisions/2026-10-10-retire-in-github-claude-review.md:5-6, :43) retires Claude review inside GitHub and keeps Codex's GitHub review, so the route says GitHub Actions schedules repository jobs and a
  scheduled Claude task runs locally; a test pins the wording on slots.json, the layer page and the alternatives.
The label of claude-native-slot-manifest.json equals the sha256 of the shipped slots.json again (relabel last); test_the_label_names_the_shipped_slots_file and test_no_other_exported_field_differs
(no skip) are unchanged from ef3f3e7. 72 of 72 single-edit mutants of the guard and its data are caught and 5 controls pass (mutations-v4-forward-commit-3.md).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
seathatflowsinourveins added a commit that referenced this pull request Oct 11, 2026
… the registered trigger, the time bounds, the basis of the tolerant floor

Answers the command center's Claude micro of 425240f (PASS_WITH_P3: P3-1 to P3-7) and Codex's three new threads of the same head (workers.md:61, test_paired_runs_results.py:91, scheduling-supervision.md:9). Each was
reproduced before the change: five tests of this commit fail on the data of 425240f (retained output fail-before-micro3.txt).
- P3-1: decision.two_trial_verdict_basis no longer says that the decision to run two trials was not fixed before any run. Addendum 1 (paired-routing/addendum-01-ruling-and-extension-20261011.md, sha256 1917091f, line 13,
  written before any run) fixed the trigger too: after a passing trial 1 the run ends (Sonnet takes review micros, no second trial). The command center ran trial 2 after seeing that result (addendum 3, pinned beside the
  basis with its path, size and hash), so the two-trial verdict stays a ruled extension and not a preregistered outcome. The paragraph of the record is regenerated from the artifact; the ruling's sidecar correction
  (sha256 338600a9) is pinned as papers.ruling_correction and the ruling's own bytes are unchanged; ruling.routing says "read or micro" like the ruling.
- Codex P1 (test_paired_runs_results.py:91): the tolerant floor's reading and null model are the run's own, registered before any run (addendum 1, lines 17-18: the reading with the clause on the totals, and the noise floors of
  two identical reviewers who each find a finding with probability p in each run); no third-party source defines them, so the reference is the brute-force enumeration that already fails before the correction. The
  convolution of the per-finding differences is the one numpy 2.5.3 documents for numpy.convolve ("the sum of two independent random variables is distributed according to the convolution of their individual
  distributions"); a test cross-checks tolerant_floor against numpy.convolve where numpy is installed, the artifact records both bases (decision.tolerant_floor_basis), and the gated papers test reads lines 17-18 of the
  retained addendum.
- Codex P2 (workers.md:61) and P3-3: the orchestration-frameworks row and the record said "a 45-minute ceiling per run". The registered design has two bounds, a 50-minute process cap for a headless session and a 45-minute
  cap for the team (paired-runs.json design.caps; preregistration.md line 156, sha256 531758c4), and the Workflow's verifier was cut by the client's own 45-minute wait for background tasks: the stderr of the runs F1-B, F3-B,
  F4-B and F5-B reads "Background tasks still running 45m after the last turn", after 2779 to 2794 seconds, inside the 50-minute cap. The row (slots.json and workers.md) and the record say so, and
  test_the_time_bounds_the_row_and_the_record_state_are_the_registered_ones computes the counts from the run rows (4 of 6 Workflow runs, 4 of 6 team runs of which 3 at the team cap).
- Codex P2 (scheduling-supervision.md:9): that text is #1001's (commit ba6ab3a). This commit carries the same wording as #1001's third commit (efaa077): GitHub Actions schedules repository jobs, Claude runs inside GitHub
  are retired (2026-10-10, docs/decisions/2026-10-10-retire-in-github-claude-review.md:5-6, :43), so a scheduled Claude task runs locally. The test of the wording is that commit's.
- P3-7: the RTK locator test cites git 2.53.0 git-ls-tree(1), OUTPUT FORMAT, for the entry it splits.
The label of claude-native-slot-manifest.json equals the sha256 of slots.json again (relabel last). Its strict test arrives with #1001.

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

Copy link
Copy Markdown
Owner Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: efaa077efa

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread tests/test_native_practice_retired_routes.py
Comment thread tests/test_native_practice_retired_routes.py Outdated
…plaining unit, split units after a closing delimiter and pin the scope of the name patterns

The final fix round of #1001 under the command center's convergence ruling: its Claude micro at efaa077 (blockers B1 to B3, P3-2) and its adjudication of 2026-10-11T13:50Z of Codex's third review. Each item was reproduced on that
head before the change.
- claude-native-slot-manifest.json:47 (Codex P2, B1, a text of this PR that is false at the head): the note on the differences from the snapshot still said the route of scheduled-tasks was narrowed "to jobs that run no model",
  while the shipped route says that GitHub Actions schedules repository jobs, that Claude runs inside GitHub are retired (2026-10-10, docs/decisions/2026-10-10-retire-in-github-claude-review.md:5-6, :43) and that a scheduled
  Claude task runs locally. The note says so now, and test_the_scheduled_tasks_route_retires_the_claude_routes_and_not_every_model_backed_job reads the manifest as well as the route (fails with the note undone: M79).
- B2: the module claims that the message of every line-judged surface states the rule, and it did not for the labelled bullets of a layer page or for the Overturn when cell of an index row. Every explaining unit states it now
  (a selecting field names no unit and states nothing); the three expected messages carry the rule and test_every_explaining_unit_of_a_layer_page_and_of_the_index_states_the_rule_and_a_selecting_field_does_not pins all three
  kinds (mutants M83 to M85).
- tests/test_native_practice_retired_routes.py:83 (Codex P2, P3-2): a closing quote, parenthesis or bracket between the full stop and the white space kept `The route was "retired." The current default is claude-code-action.` in one
  unit that said retired. The sentence pattern takes closing delimiters (the curly quotes are built with chr(), so the file stays ASCII); test_a_closing_quote_parenthesis_or_bracket_after_the_full_stop_does_not_join_two_claims fails
  without it (M78, M82) and keeps `claude-code-action was retired (see the record.) No row selects it.` accepted (control C6).
- :48 (Codex P2, workflow-first phrasing) is a follow-up and the class closes (rule 4 of the convergence ruling): the module states that the guard pins the named retired artifacts and the retired slot rows, that generic phrasing of a
  Claude run in a GitHub workflow cannot be enumerated and is out of its scope (the retirement record governs it), and test_generic_workflow_phrasing_is_out_of_scope_and_the_module_says_so pins the boundary. No pattern is added.
- B3 is the description: the two earlier command blocks name the 37 modules they ran (the 46 of the first block without the nine tests.test_local_pages_* modules).
80 single-edit mutants of the guard and its data are caught and 6 controls pass (mutations_retire_v6.py).

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

Copy link
Copy Markdown
Owner Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: bdf60fc62b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread tests/test_native_practice_retired_routes.py
Comment thread tests/test_native_practice_retired_routes.py
Comment thread tests/test_native_practice_retired_routes.py
…ASCII and the scope list

The command center's confirmation micro of #1001 at bdf60fc (research-cc-role-20261008/pr1001-claude-micro-bdf60fc6.md: blockers 1 and 2, P3s) and its correction #163 of 2026-10-11T16:18Z on Codex's three threads of 15:39:21Z.
No code of the guard changes in this commit.
- Blocker 2: the module said that it stays ASCII and held one U+2026 in a comment (added by efaa077). It is three full stops now, and test_the_source_of_this_module_is_printable_ascii pins the claim; it fails on the module
  of bdf60fc (['U+2026'] != []).
- Blocker 1 (the pull request description, and this message corrects the message of bdf60fc): the earlier statement that the 37 modules ran "without its nine tests.test_local_pages_* modules" was false. They are the first 37
  modules of the 46-module list, and the nine left out are its last nine (tests.test_local_pages_fleet_execution to tests.test_local_pages_workstation, 144 tests, run and counted); 29 of the 46 are local-pages modules.
- Codex :92 (an exclamation mark or a question mark does not end a unit) is not patched: the sentence splitter has drawn findings in five consecutive rounds (the lowercase clause, "e.g.", the joined lines, the closers,
  the exclamation mark and the question mark) and was patched four times, so rule 4 of the convergence ruling closes the class the way line 48 closed. The module docstring states exactly what the guard accepts as a unit end
  and that review reads everything else; test_the_unit_ends_and_the_scope_of_the_name_patterns_are_documented pins the sentence and the behavior, and fails on the module of bdf60fc, where the sentence is missing.
  A pinned upstream sentence segmenter is a research-queue item (rule 8, layer instructions-skills).
- Codex :51 (a carrier-first name of the managed Code Review app) is confirmed within the closed class: the same scope paragraph says that reordered phrasings of a pinned artifact are out of the guard's scope.
- P3-1: the scope list named 11 of the 17 patterns; it names all 17 now, and test_the_scope_of_the_name_patterns_names_every_pattern compares the list itself with PATTERNS (it fails on the module of bdf60fc).
  P3-2: the right single quotation mark closer is tested (its mutant survived). P3-3: the comment at the sentence pattern says what the code does.
- Codex :170 (retired.on is checked for its shape only) is a follow-up under rule 5: the shipped value is the date of the record, so 2099-12-31 is a mutant and not a reproduced failure of the shipped state.
88 single-edit mutants of the guard and its data are caught and 6 controls pass (mutations_retire_v9.py).

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

Copy link
Copy Markdown
Owner Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Nice work!

Reviewed commit: 7498bcbbaf

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@seathatflowsinourveins
seathatflowsinourveins merged commit b490361 into main Oct 11, 2026
37 checks passed
@seathatflowsinourveins
seathatflowsinourveins deleted the claude/cc-native-practice-retire-gh-review-routes-20261010 branch October 11, 2026 19:24
seathatflowsinourveins added a commit that referenced this pull request Oct 11, 2026
… the registered trigger, the time bounds, the basis of the tolerant floor

Answers the command center's Claude micro of 425240f (PASS_WITH_P3: P3-1 to P3-7) and Codex's three new threads of the same head (workers.md:61, test_paired_runs_results.py:91, scheduling-supervision.md:9). Each was
reproduced before the change: five tests of this commit fail on the data of 425240f (retained output fail-before-micro3.txt).
- P3-1: decision.two_trial_verdict_basis no longer says that the decision to run two trials was not fixed before any run. Addendum 1 (paired-routing/addendum-01-ruling-and-extension-20261011.md, sha256 1917091f, line 13,
  written before any run) fixed the trigger too: after a passing trial 1 the run ends (Sonnet takes review micros, no second trial). The command center ran trial 2 after seeing that result (addendum 3, pinned beside the
  basis with its path, size and hash), so the two-trial verdict stays a ruled extension and not a preregistered outcome. The paragraph of the record is regenerated from the artifact; the ruling's sidecar correction
  (sha256 338600a9) is pinned as papers.ruling_correction and the ruling's own bytes are unchanged; ruling.routing says "read or micro" like the ruling.
- Codex P1 (test_paired_runs_results.py:91): the tolerant floor's reading and null model are the run's own, registered before any run (addendum 1, lines 17-18: the reading with the clause on the totals, and the noise floors of
  two identical reviewers who each find a finding with probability p in each run); no third-party source defines them, so the reference is the brute-force enumeration that already fails before the correction. The
  convolution of the per-finding differences is the one numpy 2.5.3 documents for numpy.convolve ("the sum of two independent random variables is distributed according to the convolution of their individual
  distributions"); a test cross-checks tolerant_floor against numpy.convolve where numpy is installed, the artifact records both bases (decision.tolerant_floor_basis), and the gated papers test reads lines 17-18 of the
  retained addendum.
- Codex P2 (workers.md:61) and P3-3: the orchestration-frameworks row and the record said "a 45-minute ceiling per run". The registered design has two bounds, a 50-minute process cap for a headless session and a 45-minute
  cap for the team (paired-runs.json design.caps; preregistration.md line 156, sha256 531758c4), and the Workflow's verifier was cut by the client's own 45-minute wait for background tasks: the stderr of the runs F1-B, F3-B,
  F4-B and F5-B reads "Background tasks still running 45m after the last turn", after 2779 to 2794 seconds, inside the 50-minute cap. The row (slots.json and workers.md) and the record say so, and
  test_the_time_bounds_the_row_and_the_record_state_are_the_registered_ones computes the counts from the run rows (4 of 6 Workflow runs, 4 of 6 team runs of which 3 at the team cap).
- Codex P2 (scheduling-supervision.md:9): that text is #1001's (commit ba6ab3a). This commit carries the same wording as #1001's third commit (efaa077): GitHub Actions schedules repository jobs, Claude runs inside GitHub
  are retired (2026-10-10, docs/decisions/2026-10-10-retire-in-github-claude-review.md:5-6, :43), so a scheduled Claude task runs locally. The test of the wording is that commit's.
- P3-7: the RTK locator test cites git 2.53.0 git-ls-tree(1), OUTPUT FORMAT, for the entry it splits.
The label of claude-native-slot-manifest.json equals the sha256 of slots.json again (relabel last). Its strict test arrives with #1001.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
seathatflowsinourveins added a commit that referenced this pull request Oct 11, 2026
… label after the rebase onto main

Mechanical, after the rebase of the seven commits of this pull request onto main at b490361 (the landing of #1001, whose forward commits replace the first head ba6ab3a that this branch was stacked on).
- The rebase conflicted in manifests/evidence.json and in claude-native-slot-manifest.json only, at seven of the seven replayed commits. Both were resolved by taking main's side: main already carries #1001's corrected
  manifest note and its strict label test, and this branch's own rows are re-registered below.
- evidence_manifest.py --write and host_receipts.register_file re-register every file this branch adds or changes (12 files and the manifest) at its current bytes; relabel_manifest.py then sets the label of the slot manifest
  to the sha256 of slots.json (76d5eff8...) and rebuilds the list of differences, last. The note of the manifest keeps #1001's wording (GitHub Actions schedules repository jobs; a scheduled Claude task runs locally).
- The diff against main is the diff of this pull request: 14 files, +3708/-57, no file of #1001 or #986.
- validate.py and evidence_manifest.py --check pass (11654 files).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
seathatflowsinourveins added a commit that referenced this pull request Oct 11, 2026
…TK receipt's locators (#1005)

* Record the paired-run results of planning persistence and orchestration

Planning persistence (paired run 2b, 12 runs): repository state files stay the default; the native
task list is ranked second and the Ralph-style loop third, for fallback only, with the command
center's three statements (an external done check, a post hoc and provisional criterion, a
preregistered criterion for any rerun). Orchestration (paired run 1, 18 runs): the single session
stays the routing for bounded fixes on north-star code; neither the verify Workflow nor the agent
team clears the preregistered rule. F3's two pairs with the team are void because its diff was not
captured.

The compact artifact holds the per-run rows and the sha256 of every private paper; the rows,
their layer pages and the record's addendum state the decisions; tests/test_paired_runs_results.py
recomputes each decision from the artifact (19 single-edit mutations are caught); the baseline
manifest's label lists the fields that now differ from its rows. The advisor run and the routing
run are recorded as owed work; their results are later records.

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

* Pin the RTK receipt's locators and correct the abspath comment of #973

The RTK 0.51.0 qualification receipt cited three places that require rtk 0.50.0 as
path:line without a commit. #973 added two imports to tests/test_skill_usage.py, so the
unqualified `tests/test_skill_usage.py:33` named PARSER_DIR instead of the version regex it
named when the receipt was written. The three locators are now pinned to the commit that
added the receipt (14048b8), where each resolves; tests/test_rtk_receipt_locators.py reads
the line at the pin through Git and requires the prerequisite's regex on it (it fails on the
old receipt: line 33 of the working tree is PARSER_DIR).

The comment in tests/test_skill_usage.py said ntpath.abspath adds a drive to a POSIX string;
it turns the separators into backslashes and adds none (CPython v3.12.4 Lib/ntpath.py:564-578,
_abspath_fallback). The comment says so and a new test measures it on a POSIX host.

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

* Pin the corrected abspath comment of #973 with a test that fails on the old text

The comment in tests/test_skill_usage.py said ntpath.abspath adds a drive to a POSIX
string; the previous commit corrected it (CPython v3.12.4 Lib/ntpath.py:564-578,
_abspath_fallback joins the working directory only when isabs is false, then calls
normpath). The repository's correction rule asks for a regression test that fails before
the fix, and a measurement of the standard library cannot: it passes on the old comment too.

test_the_comment_of_the_windows_path_test_states_what_abspath_does reads the source of the
test the comment belongs to and requires that the wrong claim is gone and the corrected one
and its citation are present. On the module with the old comment restored it fails (the
regex matches "abspath adds a drive"); on this head all eight tests of the class pass.

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

* Answer the Codex review of #1005 and record paired run 5 (model routing for review micros)

Codex review in GitHub at bf864c3, four P2s, each reproduced before the change:
- background-workflows: the route now says a saved Workflow in a headless run fenced with --setting-sources local is launched by scriptPath (its name was not found in 6 of 6 runs of paired run 1, arm B) and that
  a long verifier is cut by the wait ceiling; Overturn when says which measured failures the route carries, and the slots.md index cell follows (a new check compares every row's Overturn when across the three surfaces).
- agent-teams note: "won no fixture" is replaced by the counted result against the single session: 1 of the 5 fixtures where its diff was captured (F2), none of F3 to F6.
- tests/test_rtk_receipt_locators.py: a pin whose commit is present but whose tree is missing (a partial clone) is skipped; a bad path with the tree present still fails.
- usage-cost-monitoring: the metering sentence is rewritten from a committed artifact (meter-windows-20261011.json) with a test that recomputes it. The "about 1.9 times" figure was one instant's (2.56 and 1.64 over two
  fixed 24-hour windows) and the clause that the events leave the advisor out contradicted the advisor run's Stage 0; both are gone.

Paired run 5, as the command center directed: routing_5 in paired-runs.json (20 runs, the 12 decisive findings with the runs that found each, costs, hashes), RoutingRunTests recomputing the strict verdict from the rows
(Opus stays), the record's addendum paragraph, run 4 marked stopped and run 5 removed from the owed table. No slot row, default or skill text changes.

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

* Answer the Codex re-review and the Claude read of #1005: re-pin the ruling, count the totals in the tolerant floor, state the order of the second trial

Answers the command center's Claude first read of #1005 at 5c5eeca (three P2s, five P3s) and Codex's re-review in GitHub of the same head (one P1, four P2s); each was reproduced before the change.
- The ruling file the record cites was edited by the command center after the record cited it (CC P2-1): routing_5.ruling and papers.ruling carry the current sha256 and size, the record's paragraph is regenerated from them, and a test that is
  enabled by PAIRED_PAPER_ROOTS resolves every private paper of the artifact against its recorded hash, so a paper that changes after it is cited is noticed on a host that has it.
- The ruling's condition for Sonnet at medium (the change is mechanical, or a second Claude-family read exists) was dropped from the artifact and the paragraph (CC P2-2); it is in both now, with the clause that the allowance is the command center's
  routing discretion and not something run 5 measured (CC P3-2).
- The slot-manifest label named an older slots.json and its list lacked three pairs, so the exact-difference check skipped (CC P2-3): the label is the sha256 of the shipped file and the list is recomputed (background-workflows route and overturn_when,
  usage-cost-monitoring evidence, and the agent-teams overturn condition edited below).
- Codex P1: the second trial was added by the command center after trial 1 had met the registered rule (addendum 3 of the run's papers says so). The paragraph and the decision now state that the two-trial verdict is a ruled extension and not a preregistered
  outcome, and that an extension after a pass can only move the verdict toward Opus.
- Codex P2 and CC P3-1: the tolerant reading also bounds the totals, and the floor printed (0.62) modelled the per-finding clause only; the full reading's floor is 0.56 (exact convolution, checked against enumeration). Both figures are kept and labelled, the
  correction is recorded in a new private note (hash in papers.correction), and the strict rule's chance with each finding's own pooled rate (0.73, a plug-in calculation) is added.
- Codex P2 (workers.md:29): the agent-teams overturn condition names the class the default is scoped to (work where workers must message each other); paired run 1 measured bounded fixes, which fall outside it.
- Codex P2 (workers.md:76): the task-list alternative states that it has no completion condition of its own and needs the external done check of loops-completion, as the measured F5 runs used all 8 sessions without declaring done.
- Codex P2 and CC P3-3: a blob that is absent in a blobless partial clone skips the locator test and a path that is not in the tree at the pin still fails.
- CC P3-4: the meter test's tolerance is 0.01. CC P3-5: the addendum's heading names both dates.
Each correction fails its own test when undone alone: 31 single-edit mutants of the run-5 data and text and 7 of the locator check are caught.

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

* Answer the Claude micro and the new Codex threads of #1005 at 425240f: the registered trigger, the time bounds, the basis of the tolerant floor

Answers the command center's Claude micro of 425240f (PASS_WITH_P3: P3-1 to P3-7) and Codex's three new threads of the same head (workers.md:61, test_paired_runs_results.py:91, scheduling-supervision.md:9). Each was
reproduced before the change: five tests of this commit fail on the data of 425240f (retained output fail-before-micro3.txt).
- P3-1: decision.two_trial_verdict_basis no longer says that the decision to run two trials was not fixed before any run. Addendum 1 (paired-routing/addendum-01-ruling-and-extension-20261011.md, sha256 1917091f, line 13,
  written before any run) fixed the trigger too: after a passing trial 1 the run ends (Sonnet takes review micros, no second trial). The command center ran trial 2 after seeing that result (addendum 3, pinned beside the
  basis with its path, size and hash), so the two-trial verdict stays a ruled extension and not a preregistered outcome. The paragraph of the record is regenerated from the artifact; the ruling's sidecar correction
  (sha256 338600a9) is pinned as papers.ruling_correction and the ruling's own bytes are unchanged; ruling.routing says "read or micro" like the ruling.
- Codex P1 (test_paired_runs_results.py:91): the tolerant floor's reading and null model are the run's own, registered before any run (addendum 1, lines 17-18: the reading with the clause on the totals, and the noise floors of
  two identical reviewers who each find a finding with probability p in each run); no third-party source defines them, so the reference is the brute-force enumeration that already fails before the correction. The
  convolution of the per-finding differences is the one numpy 2.5.3 documents for numpy.convolve ("the sum of two independent random variables is distributed according to the convolution of their individual
  distributions"); a test cross-checks tolerant_floor against numpy.convolve where numpy is installed, the artifact records both bases (decision.tolerant_floor_basis), and the gated papers test reads lines 17-18 of the
  retained addendum.
- Codex P2 (workers.md:61) and P3-3: the orchestration-frameworks row and the record said "a 45-minute ceiling per run". The registered design has two bounds, a 50-minute process cap for a headless session and a 45-minute
  cap for the team (paired-runs.json design.caps; preregistration.md line 156, sha256 531758c4), and the Workflow's verifier was cut by the client's own 45-minute wait for background tasks: the stderr of the runs F1-B, F3-B,
  F4-B and F5-B reads "Background tasks still running 45m after the last turn", after 2779 to 2794 seconds, inside the 50-minute cap. The row (slots.json and workers.md) and the record say so, and
  test_the_time_bounds_the_row_and_the_record_state_are_the_registered_ones computes the counts from the run rows (4 of 6 Workflow runs, 4 of 6 team runs of which 3 at the team cap).
- Codex P2 (scheduling-supervision.md:9): that text is #1001's (commit ba6ab3a). This commit carries the same wording as #1001's third commit (efaa077): GitHub Actions schedules repository jobs, Claude runs inside GitHub
  are retired (2026-10-10, docs/decisions/2026-10-10-retire-in-github-claude-review.md:5-6, :43), so a scheduled Claude task runs locally. The test of the wording is that commit's.
- P3-7: the RTK locator test cites git 2.53.0 git-ls-tree(1), OUTPUT FORMAT, for the entry it splits.
The label of claude-native-slot-manifest.json equals the sha256 of slots.json again (relabel last). Its strict test arrives with #1001.

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

* Correct the origin of the 45-minute background wait of paired run 1: the runner's setting, not the client's

The command center's Claude micro of #1005 at 49bb649 (P2-1, P3-2, P3-3); each item was reproduced on that head before the change.
- P2-1: the previous commit said the Workflow's verifier was cut by "claude -p's own 45-minute wait for background tasks". The runner set CLAUDE_CODE_PRINT_BG_WAIT_CEILING_MS=2700000 for every headless run
  (paired/orch_run.py line 137); the client's default is 10 minutes (the retained env-vars.md line 357: "Default: `600000`, or 10 minutes"; headless.md line 77: "after 10 minutes of continuous idle waiting by default"). The decision
  is unaffected: the runs show exactly what a 45-minute ceiling produces (the four Workflow runs that ended there ran background work for 2,702 to 2,703 seconds, the ceiling being 2,700). One rewording pass over the
  orchestration-frameworks and background-workflows rows (slots.json), their pages (workers.md) and the record, with the setting in design.caps and the three sources as papers (the runner file, retained and hashed; the two
  documentation lines, hashed and checked on their lines by the gated test).
- The test pins of the old wording are inverted and fail on the data of 49bb649 (fail-before-wave.txt); test_the_background_wait_ceiling_is_the_runners_setting_and_the_clients_default_is_ten_minutes computes the 2,700 seconds
  from the run rows; 13 single-edit mutants are caught and the control passes (mutations-wave.md).
- P3-3: the git-ls-tree quote of the RTK locator test is exact (git 2.53.0, OUTPUT FORMAT and -z).
The label of claude-native-slot-manifest.json equals the sha256 of slots.json again (relabel last).

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

* Re-register the files of this pull request and recompute the manifest label after the rebase onto main

Mechanical, after the rebase of the seven commits of this pull request onto main at b490361 (the landing of #1001, whose forward commits replace the first head ba6ab3a that this branch was stacked on).
- The rebase conflicted in manifests/evidence.json and in claude-native-slot-manifest.json only, at seven of the seven replayed commits. Both were resolved by taking main's side: main already carries #1001's corrected
  manifest note and its strict label test, and this branch's own rows are re-registered below.
- evidence_manifest.py --write and host_receipts.register_file re-register every file this branch adds or changes (12 files and the manifest) at its current bytes; relabel_manifest.py then sets the label of the slot manifest
  to the sha256 of slots.json (76d5eff8...) and rebuilds the list of differences, last. The note of the manifest keeps #1001's wording (GitHub Actions schedules repository jobs; a scheduled Claude task runs locally).
- The diff against main is the diff of this pull request: 14 files, +3708/-57, no file of #1001 or #986.
- validate.py and evidence_manifest.py --check pass (11654 files).

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

---------

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
seathatflowsinourveins added a commit that referenced this pull request Oct 11, 2026
, #1005 and #986 (#1018)

The row of adoption/skills/manifest.json and this repository's source pin in catalogs/landscape/skills-lifecycle.json follow the skill to c59655c, the commit of main that holds its final state after the retirement of the Claude-in-GitHub rows (#1001), the paired-run results (#1005) and the cross-client page (#986).

Only the measured pin fields change, from the commit's own bytes: url, ref, tree_sha (3a485d2... to f08d0d2...), skill_md_sha256 and skill_md_bytes (2,224 to 2,290), and the manifest's checked_at. The description stays 349 characters, so the listing sums and the ceiling are unchanged. A dated amendment in the row's decision record names the move; the three files are registered in manifests/evidence.json. The skill is not installed by this change.

Co-authored-by: Claude Sonnet 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:foundation Foundation lane: Claude/Codex setup, hosts, memory, RAG, research, workers

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant