Repository navigation
Retire the skill's Claude-in-GitHub rows and point them to local review - #1001
Conversation
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>
|
@codex review |
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 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".
…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>
|
@codex review |
There was a problem hiding this comment.
💡 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".
…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>
|
@codex review |
There was a problem hiding this comment.
💡 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".
…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>
… 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>
|
@codex review |
There was a problem hiding this comment.
💡 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".
…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>
|
@codex review |
There was a problem hiding this comment.
💡 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".
…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>
|
@codex review |
|
Codex Review: Didn't find any major issues. Nice work! Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
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". |
… 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>
… 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>
…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>
, #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>
Scope
claude-native-practiceskill.github-actionbecomesretired(a new status) with its former default kept as a dated snapshot; the in-GitHub run leavespr-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 newslots.jsonso 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.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 atba6ab3a5c; andef3f3e7bf0c0a66f18b086acc37b9065cc7fe6ac, the second forward commit, which answers the command center's Claude first read and Codex's second review, both at6e97620cd(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 was6e97620cd..ef3f3e7bf. The fourth commit isefaa077efa57e7adf75151809f8e977c77eacd94, the third forward commit, which answers the command center's Claude micro and Codex's third review, both atef3f3e7bf(below); the range for a read of it isef3f3e7bf..efaa077ef, the range of all of it isba6ab3a5c..efaa077ef, and the co-op's GPT micro readsba6ab3a5c..efaa077ef. The fifth commit isbdf60fc62b96734c8db84f2967132515f54df737, the final fix round (below): it answers the command center's Claude micro atefaa077ef(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 wasefaa077ef..bdf60fc62. The sixth commit is7498bcbbaf73574ea99056f2f50892112bd68537, 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 atbdf60fc62and 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 isbdf60fc62..7498bcbba, and the co-op's GPT micro readsba6ab3a5c..7498bcbba.lane:foundation.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 tree3a485d2a) 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 freshclaude -pin a worktree reports the project folder as the skill's base directory), so sessions here read the folder this PR changes.SKILL.mdchanges 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 throughapply_skills_row.py(which re-measuresskill_md_sha256andskill_md_bytes) and not through the plain pin move. The skill folder's tree is4c125c1c(b9034b19at the second forward commit,7287caf7at the first forward commit,104af1cfat the first commit,3a485d2aon the base).SOTA sources
2dca132ff0e0c4094ce6048b422c6915a071210b(v1.0.247, committed 2026-10-08T19:51:21Z),base-action/src/parse-sdk-options.tslines 283-284:// Set the entrypoint for Claude Code to identify this as the GitHub Actionandenv.CLAUDE_CODE_ENTRYPOINT = "claude-code-github-action";. Read for this change throughgh api repos/anthropics/claude-code-action/contents/base-action/src/parse-sdk-options.ts?ref=<pin>(13,126 bytes, sha256b42cc8daa1d15fb00321784cec375b1c855bb2e41bf03b37dfd462385f9e5548); 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.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.ba6ab3a5c(four P2 threads) and the co-op's GPT first read at the same head (CHANGES_REQUESTED, three P2s; verdict sha2561ac338d506d5d07d86fe17858d16eaf78baff1836ae349f5d0fadfd60a52727e): each finding is reproduced here from the module and the skill folder before the change, not copied.53f6de6168f6efb8…), the sentence present.6e97620cd(CHANGES_REQUESTED: two P2s, seven P3s; file sha256155e47b7322f13b4e5c1737782fc122f899b6d9ebde8666131f8cab1ca0e6d70) 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.2dca132ff0e0c4094ce6048b422c6915a071210b,README.md(a381c47399445c97…, 4,896 bytes): line 5 describes the action and the@claudemention, 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.ef3f3e7bf(CHANGES_REQUESTED: one P2, six P3s; file sha2567de3d252e539f06225e9d12d4148961b4acb0800a7a7238f85364d12cbda46d1) 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.2dca132ff0e0c4094ce6048b422c6915a071210bin 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:1and: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, sha25687b99aefc0a9f438…): 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
slots.json,slots.mdor the layer pages, selects a retired route; an explaining field names one only while saying it is retiredlocal_integrationtests.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), logfails-first.loglocal_integrationCheckSeesTheRowsOfBeforeTestsin the same modulelocal_integration8dfb9ce48c3ff3fabccce295ffb053ab4e4bcbf6e9687c1c098b86a4b227b1bfsource_reviewCLAUDE_CODE_ENTRYPOINTtoclaude-code-github-actionsource_reviewnative_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 transcriptsapiKeySourcenone)native_proven(receipts retained; sha256775ae8781e5b80d5bc6d5b2f3642e094a2f790c9e0e4f24cbac64c51faa41c7bfor the first table,8aba443b4aca701c54dd532d3b4709edbcb97c828c5a4823d3a2fd425765637ffor the second)trigger_cases.pyreceipts and transcripts of ten arms (four in the first table, three earlier wordings, three settling arms) and one control underresearch/cc-native-practice-20261009/pr-retire/ab/native_provenlocal_integrationSKILL.md)local_integration760451e3e5651575f1d1057cc5a8d3084e3e5c2918bc1aa712936550878c5f89(the table of the first forward commit, 43 caught, was418aa331…)local_integration6e94bfe59d80beb9f16d58caa289c7207e1049b55fb771ee144ef7c61faf12f7local_integratione97b73832177fe6c277a6bca33e768083f23d751f21ef5977495613883380937local_integration869500c79e139e97008221a94871f0a57775ee93a1eb407f8bbe759094e0a70dlocal_integrationef3f3e7bfis wrong on 13 of 19, the guard of this head on none; sha256d8c0ea8345b03eeff3b4789c0f36a5a86b644c52faee547671f472c0f99af6e5)slots.json, and a change to that file that does not carry its label fails (the exact-difference check no longer skips)local_integrationtests.test_native_practice_snapshot_provenance(9 tests, none skipped;test_the_label_names_the_shipped_slots_filefails at6e97620cd); fail-before table below (sha256933bb4a9b5fbcb5d8e7eff2dec6a2926e89afe2c9dd363b44c0c44765183d9f0)local_integration6e97620cdis wrong on 9 of 12 scenarios, accepting seven bad ones and rejecting two legitimate ones; the guard of this head is wrong on none; sha2563fa4a2c8692ef17c5d0824a7b96e17fc433c7744a4e00824fac7fcc9ad017b66)Response to the Codex review in GitHub and the co-op's GPT first read, both at
ba6ab3a5cAll of it is one forward commit,
6e97620cd356c0042a22d3b353b97585ceb5c030, leased onba6ab3a5c. Codex's four threads are replied to and resolved after the push.tests/test_native_practice_retired_routes.py:41). Right:SENTENCEsplit 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.: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.":312). Right: the guard readreference/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'sSKILL.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.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_ruleinslots.json, its copy onslots.mdand step 3 ofSKILL.mdnow name the exception, and one test compares the three. This is the only edit toSKILL.md.wrong-decision-date). Changing the decision date on all three surfaces passed the old suite because it pinned a phrase and checked agreement;RETIRED_DEFAULTnow 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 theslots.mdindex cell behind: a check compares every row's Overturn when acrossslots.json, the index and the layer pages.ba6ab3a5c6e97620cdEach 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.mdout 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
6e97620cdOne forward commit,
ef3f3e7bf0c0a66f18b086acc37b9065cc7fe6ac, leased on6e97620cd. The co-op's GPT first read at6e97620cdwas superseded by this head (it readsba6ab3a5c..ef3f3e7bf). Codex's two threads (09:42:51Z) are replied to and resolved after the push. The command center's read isresearch-cc-role-20261008/pr1001-claude-read-6e97620c.md.claude-native-slot-manifest.json:12). Right, and found in this lane's own head before the read: the forward commit of6e97620cdchangedselection_ruleinslots.jsonafter the manifest had been labeled against the file ofba6ab3a5c(628e02f3…), sotest_no_other_exported_field_differs_while_the_slots_file_has_the_labeled_bytesskipped (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, sotest_the_label_names_the_shipped_slots_fileasserts equality and the exact-difference test (renamedtest_no_other_exported_field_differs) no longer skips; a later pull request that changesslots.jsonrefreshes 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:6e97620cd6e97620cd)slots.jsonedited, label keptslots.json:1616). Right:skills-library.primary_sources[5].native_mechanism(slots.json:948) saidclaude -pruns per eval "in a GitHub workflow ... plus a nightly cron" on a live slot, andGENERIChad 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 oftest_a_live_source_mapping_that_runs_claude_in_a_github_workflow_is_flagged_and_the_reworded_mapping_is_not. Run on the skill folder of6e97620cd, the new guard flags exactly three things: this mapping and the retired slot's own mapping (twice, see P3-5)./install-github-appand an@claudemention are the same route (names read at the upstream README and the documentation page, above);anthropics/claude-code-security-reviewstays out, as the read said: it is a documented rejection and appears in the pages' Rejected rows. An address such asname@claude.exampleis not a mention.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'snative_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".6e97620cd. "e.g." and "i.e." no longer end a sentence, and wrapped lines of prose are one paragraph (the prose ofslots.mdandSKILL.mdwas judged line by line, so a retirement sentence wrapped over two lines was rejected; reverted atefaa077ef, 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 atba6ab3a5c("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.prompt-caching,github-action,pr-review-pre-cue,release-trackingandusage-cost-monitoring, theretiredblock ofgithub-action, and the top-levelselection_rule,status_valuesandcross_client.SKILL.mdnow 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 anIndexError(control C4). P3-3 (the keyword exemption) needed nothing, 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 fromadoption/new-wsl-profile.json; its "Owns" lines name the action and line 1363 marks it not installed) anddocs/community-native-practice.md(dated catalog rows).6e97620cdef3f3e7bfclaude -pin a GitHub workflow plus a nightly cron) restoredRun 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
6e97620cdaccepts seven bad scenarios and rejects two legitimate ones (it is right on 3 of the 12); the guard ofef3f3e7bfis 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
ef3f3e7bfOne forward commit,
efaa077efa57e7adf75151809f8e977c77eacd94, leased onef3f3e7bf. The command center's micro isresearch-cc-role-20261008/pr1001-claude-micro-ef3f3e7b.md(8,155 B, sha2567de3d252e539f06225e9d12d4148961b4acb0800a7a7238f85364d12cbda46d1: one P2, six P3s) and Codex's four threads (:43,:63,:122,:211) are of 10:45:10Z. The co-op's GPT micro readsba6ab3a5c..efaa077ef. Every item was reproduced onef3f3e7bfbefore the change; the table below runs 19 scenarios through the guard of each head.SKILL.md,slots.md,cross-client.mdand the layer-page preambles (Codex's resolved scenario atba6ab3a5c, line 41, reopened; the pinned case went throughjudge()only and never throughprose_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 ofslots.mdand 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_messagefails onef3f3e7bfand 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.: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 sha25687b99aefc0a9f438…, lines 5, 9, 33 and 63-64);claude-code-base-actionis the published mirror of the action'sbase-action/directory (anthropics/claude-code-action at2dca132ff0e0c4094ce6048b422c6915a071210b, read in the local mirror:CLAUDE.md:20,.github/scripts/check_workflow_hardening.py:18,.github/workflows/sync-base-action.yml:1and: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).:211, a duplicate operative bullet.section_fields()keeps the first bullet of a label, so a conflicting secondRouteorOverturn whenbullet 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 secondOverturn whenbullet that names no route).: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).: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_pinnedpins both sides.scripts/host_receipts.register_fileafterevidence_manifest.py --write), as the micro asked.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.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-6and: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_jobpins the wording onslots.jsonand on the page.ef3f3e7bfefaa077efRun with the module of each head on the same skill folder: the guard of
ef3f3e7bfis 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 sha256d8c0ea8345b03eeff3b4789c0f36a5a86b644c52faee547671f472c0f99af6e5).Response to the command center's Claude micro at
efaa077efand its adjudication of Codex's three threads (2026-10-11T13:50Z, the final fix round)One forward commit,
bdf60fc62b96734c8db84f2967132515f54df737, onefaa077ef; the range for the confirmation micro isefaa077ef..bdf60fc62. The command center's micro isresearch-cc-role-20261008/pr1001-claude-micro-efaa077e.md(1,428 B, sha2567f50ad983ca0eefa92cfacd7747214a8398c4b0e90f6feabb26fa81ad030ce1c: 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 onefaa077efbefore the change.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-6and: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_jobreads the manifest's note as well as the route and fails with the note undone (mutant M79).test_every_explaining_unit_of_a_layer_page_and_of_the_index_states_the_rule_and_a_selecting_field_does_notpins all three kinds (mutants M83 to M85).tests.test_local_pages_fleet_executiontotests.test_local_pages_workstation, 144 tests; the sentence of the fifth commit that said "without its ninetests.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 keptThe 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 withchr(), so the module stays ASCII);test_a_closing_quote_parenthesis_or_bracket_after_the_full_stop_does_not_join_two_claimscovers six forms, keepsclaude-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, andtest_generic_workflow_phrasing_is_out_of_scope_and_the_module_says_sopins 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
bdf60fc62and the command center's correction #163 of 2026-10-11T16:18Z)One forward commit,
7498bcbbaf73574ea99056f2f50892112bd68537, onbdf60fc62; the range for the confirmation isbdf60fc62..7498bcbba. The command center's confirmation micro ofbdf60fc62isresearch-cc-role-20261008/pr1001-claude-micro-bdf60fc6.md(10,994 B, sha2561952d3400a004b62581a7a417214c5478aa3935716d99b09abfda91a20776d37): 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 ofbdf60fc62(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 byefaa077ef; the scan of the added lines ofbdf60fc62covered that commit only, and its "none" was true). The character is three full stops now, andtest_the_source_of_this_module_is_printable_asciipins the claim; it fails on the module ofbdf60fc62(['U+2026'] != []; retainedfail-before-correction.txt, sha2565547d7f1f6fc29b2554e4800966c9766f05d229fa4980f17f7d4d09e7bd6684f) 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:48closed: 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, andtest_the_unit_ends_and_the_scope_of_the_name_patterns_are_documentedpins both the sentence and the behavior; it fails on the module ofbdf60fc62, 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, layerinstructions-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.onis checked for its shape only): a follow-up (rule 5: the shipped value is 2026-10-10, so2099-12-31is 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_patterncompares it withPATTERNS(it fails on the module ofbdf60fc62:'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, sha2566889fe1e1f7365a5…, 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 ofbdf60fc62, and the documented unit ends matching the code on 36 of 36 probes; Codex re-reviewed7498bcbbaat 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 dontAskwith onlySkillpre-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 tree6cb044d5); 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 (tree6cb044d5). The scratch-repository arms stand for a session in another repository with an installed copy; they are not that.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):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):
SKILL.mdis 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).anthropics/claude-code-actionpinned 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.claude-code-actionworkflow 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-dirfrom 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 tree6cb044d5); 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 thegithub-actiondefault 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) changestests/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 againstPATTERNS, 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) changestests/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'snoteis edited (text only; the label is the sha256 ofslots.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_claimis replaced bytest_an_abbreviation_does_not_end_a_claim(the abbreviation half, unchanged in substance) andtest_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), andparagraphs()with its block-start pattern is removed. Four assertions that counted exactly one finding (a note and a default in each oftest_the_other_names_of_the_retired_route_are_flagged_and_the_documented_rejection_is_notandtest_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_isandtest_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 oftests/test_native_practice_snapshot_provenance.pygains the register step. No other assertion is dropped.The second forward commit adds a second declared change:
tests.test_native_practice_snapshot_provenanceno longer skips its exact-difference test whenreference/slots.jsondiffers from the labeled bytes; a new test requires the label to be the sha256 of the shipped file, and the exact-difference test (renamedtest_no_other_exported_field_differs) runs on every checkout. A pull request that changesslots.jsonnow 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_provenanceexpects the differences between the #923 snapshot and the currentslots.jsonto 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 newslots.jsonbytes; 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
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 atefaa077ef; none is a blocker.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.tests/test_native_practice_retired_routes.py:51(15:39:21Z, headbdf60fc62): 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).: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, layerinstructions-skills). Codex P2 at:170(retired.onchecked for its shape only): a follow-up (rule 5, hardening). Codex P2 at:51: confirmed within the closed class, above.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 testtest_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 onlyba6ab3a5cand conflicts with main in the slot manifest andevidence.json, resolved at its rebase).7498bcbba("compares the list itself with PATTERNS") overstate it. The list itself names all 17; fixed the next time the module changes.:83thread 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).docs/github-automation.md:63, one HOST-09 history row,docs/new-wsl-handbook.md:1419and its generated sourceadoption/new-wsl-profile.json), and the two false positives that existed atba6ab3a5c("prints a summary to the console and runs in GitHub Actions"; "no Claude model is involved"), a documented boundary of the Claude-context test.Decision record
No new record: this carries
docs/decisions/2026-10-10-retire-in-github-claude-review.mdinto 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
permissions: {}and grant each job only what it needs. (none changed)🤖 Generated with Claude Code