Skip to content

Record NativeStack workstation acceptance and retained failures - #160

Merged
seathatflowsinourveins merged 3 commits into
mainfrom
evidence/nativestack-20260924
Sep 25, 2026
Merged

seathatflowsinourveins merged 3 commits into
mainfrom
evidence/nativestack-20260924

Conversation

@seathatflowsinourveins

@seathatflowsinourveins seathatflowsinourveins commented Sep 24, 2026 •

Copy link
Copy Markdown
Collaborator

Scope

Add evidence from the independently installed NativeStack Ubuntu 24.04.5 distribution on the user's new Threadripper 5975WX / RTX 4090 workstation. The six selected Linux profiles, native clients, scoped retrieval, telemetry, recovery drills and local text model were exercised; failures and narrower acceptance boundaries remain visible.

Installation stays at attested v2026.09.23.1 / 40828dfea7bca910032e93b966bbdfdd729f9f44. This separate contribution checkout is based on current main 7c211addc2b53b0532f64de8910730601b2fde7a. Changes are confined to the host receipts/artifacts, hardware registry, evidence hashes and regenerated matrix/grand-list reports. No platform status or layer winner is changed.

Evidence-class table

Claim Evidence class Command / receipt
Native installed versions and source-specific retrieval; local embeddings/generation native_proven within the checks' declared fixture scope evidence/hosts/threadripper4090-nativestack-20260924/; checks.py
Native Codex/Claude calls, offline research engines, restore drills and monitoring persistence Actual execution retained; follow-up formal receipts are local_integration metadata validation execution-ledger.json, retained-checks.py, adjacent handoffs
SDK calendar test conflict with installed optional backend local_integration, fail exchange-calendars--use receipt; full SDK suite retained separately
Memory alternatives and update holds source_review, no comparative winner claim artifact README and explicit upstream references

There are 66 new formal host receipts: 65 pass, one fail. Version checks do not establish functional acceptance; metadata checks do not replay their underlying command. The ledger retains 271 original command identities, actual exits and raw-stream digests, including 36 nonzero exits. Exact argv and raw streams remain private; known prompt/page payloads and long/multiline arguments are withheld publicly.

Local commands run

python3 scripts/component_matrix.py --write                 exit 0
python3 scripts/new_host_grand_list.py --write              exit 0
python3 scripts/host_receipts.py validate                   exit 0 (70 total host receipts)
python3 scripts/validate.py                                exit 0
python3 scripts/component_matrix.py --check                exit 0
python3 scripts/new_host_grand_list.py --check              exit 0
python3 -m unittest                                        exit 0: 3640 tests, 423 skips, 241.020 seconds
gitleaks dir <owned copy of 83 changed/new files> --redact=100 --no-banner --report-format json --report-path <private report> --timeout 120
                                                          exit 0, zero findings

The current-main suite uses the normal managed Python environment. The separate locked SDK environment ran 3501 tests with one failure and 203 skips, because a test assumes exchange_calendars is absent while the lock installs it. The original source/test was not patched. An older full-catalog directory scan retains 218 untriaged findings and an interrupted history scan. The scoped contribution scan does not erase that baseline. Its two initial matches were verified public Git commit IDs, now explicit upstream links; no scanner rule was suppressed.

Decision record

evidence/artifacts/nativestack-20260924/README.md records source pins, alternatives, holds and recheck conditions. Qwen3.8-27B UD-Q4_K_M on llama.cpp b11146 passed three designed fixtures at roughly five generated tokens/second, with an 8192-token slot and CPU offload under shared GPU use. No universal quality, vision or long-context claim. ai-memory 2.3.2 remains accepted pending matched evaluation and migration review of newer candidates. Restores are isolated but same-host; no off-host disaster recovery or live trading readiness is claimed.

Host evidence

  • python3 scripts/host_receipts.py validate passes for every new/changed receipt, including validation of the correctly marked failing receipt.
  • Independent review is explicitly requested. Please review this new physical-host evidence, its failure boundaries, qualified-model records and historical-metadata distinction, then record an independent identity through scripts/host_receipts.py review if accepted. Current self-review entries do not satisfy independent review.
  • No platform_status change is made from these receipts.

Checklist

  • No workflow changes; existing workflow pin/permission policy remains unchanged.
  • Public-content validation and the targeted secret scan passed. Private native auth stores, raw prompts, memory bodies and raw model streams are excluded.
  • No new paid hosting, subscription or billing surface introduced.
  • Other distributions, shared WSL configuration, peer-owned files/worktrees and native model choices preserved.

Update 2026-09-25 (native-agent-stack-9a, foundation PR queue)

#231 (merged) records the same physical machine as nativestack-5975wx-20260925, with 21 independently reviewed receipts. The recorder of #231 and I agreed on option (d):

  • Receipts kept, not counted: the 66 receipts recorded here under threadripper4090-nativestack-20260924 move unchanged into evidence/artifacts/nativestack-20260924/host-receipts-20260924/. They stay hash-registered. They are kept out of evidence/hosts/, so platform_status and the component matrix do not count one machine twice. The regenerated matrix and grand list are identical to main's.
  • Profile dropped: the duplicate adoption/hardware-profiles.json entry and evidence/artifacts/hw-profiles/threadripper4090-nativestack-20260924/ are removed, in favour of Record the nativestack-5975wx-20260925 WSL2 workstation: measured profile and 21 host receipts #231's measured profile.
  • Failures preserved: failure-register.md, execution-ledger.json, the handoffs and the check scripts stay. The README states the relationship.
  • Re-recording: more than 45 component-stages proven here are not in Record the nativestack-5975wx-20260925 WSL2 workstation: measured profile and 21 host receipts #231, for example use-stage for claude-code, codex, context-mode, jcodemunch-mcp, llama-cpp, serena and nautilus-trader, and recovery for qdrant and restic. They will be re-recorded fresh under nativestack-5975wx-20260925 on current pins, with independent-session review, in a separate PR.

Checks after merging main: validate.py passed, host_receipts.py validate passed with 37 receipts, validate_catalogs.py passed, and the gitleaks pre-commit hook found no leaks.

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 24, 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-09-24T04:50:28.935525Z 7094118 PR opened
ℹ️ 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: 709411828d

ℹ️ 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

Copy link
Copy Markdown
Collaborator Author

Independent review of #160 (head 70941182): changes needed before independent agree is recorded

Reviewer: session agent-lab-e9 on the original WSL host. This is a different machine and a different identity from the recorder (46d4a459…).

Method: workflow wf_0ab6e9c5-808, 72 agents, 0 errors.

  • Opus reviewers at max effort judged the 66 receipts in 11 batches. Each receipt was read against its check source (checks.py / retained-checks.py), its execution-ledger.json rows and docs/contributing-evidence.md §2/§5.
  • Every non-agree verdict went to an independent refuter.
  • A skeptic re-examined each batch's agrees.
  • Four cross-cutting lenses ran: generated-file consistency, privacy, ledger integrity and decision record. Each lens finding was then attacked by a refuter, and a completeness critic reviewed the whole run.
  • Separately, guarded gitleaks git --log-opts="-1 70941182" scanned 462 KB and found 0 leaks.

Limit: none of the host commands can be re-run here. Every verdict is about whether the retained, checked-in evidence supports each claim as scoped.

What holds

  • host_receipts.py validate, component_matrix.py --check, new_host_grand_list.py --check, evidence_manifest.py --check, validate.py and landscape.py all exit 0.
  • No platform_status or platform_profiles[].status field changes.
  • The failing exchange-calendars--use receipt is correctly marked as a failure.
  • All 36 nonzero exits in the ledger are accounted for.
  • 46 of 66 receipts are supportable as recorded. They are listed at the end.

Systemic (blocking for content-assertion receipts)

  1. The check source isn't bound to the receipts' catalog_revision. The receipts record catalog_revision 8eacd8b6. At that commit checks.py and retained-checks.py do not exist; they are first committed in 70941182. For a receipt whose whole output is the fixed line checks.py prints after its assertion (for example ai-memory, qmd, loki, prometheus, context-mode and socraticode use), the executed assertion is therefore not bound by digest.

    Fix: re-record the checks.py-backed use, persistence and recovery receipts from a checkout whose revision contains the committed scripts, or record the scripts' SHA-256 at run time. Version-only install receipts are exempt, because their output is the tool's own version banner.

Per-receipt changes (20)

Each of these survived an adversarial refuter, or was found by the skeptic or critic and verified.

Receipt Problem
claude-code/use The retained-checks.py claim states a scope the check never examines. The check passes for any scope text; it only verifies ledger ids, actual_exit and 64-hex digests.
context-mode/use, socraticode/use These are native_proven live MCP calls, but the only limitation says "not a fresh execution" (the same copy-pasted string as on exchange-calendars/use).
edgartools/use, lean/use, mcp-inspector/use, sandbox-runtime/use, qdrant/recovery Metadata-only local_integration is honest, but each claim describes behaviour the retained check never asserts. Scope the claim to "retained ledger rows X, Y exited 0".
exchange-calendars/use The failure is correct. The limitation calls it "retained metadata validation", but it was a fresh test run, and the command isn't in the ledger.
headroom/use The claim and README say a "critical 503 line" was restored. checks.py:38 asserts only request=0 and request=999 .
jcodemunch-mcp/use The only assertion is 'Hello' anywhere in the serialized response. The printed "exact indexed greeting source" claims more than that.
llama-cpp/use The {answer:42} check is real. The receipt's qualified_models bars (three fixtures, tok/s, weight SHA) rest on private evidence that isn't committed.
markitdown/use The check ran against a host-local purpose-built document.html that isn't committed or created in the ledger. That makes it a synthetic stand-in, so the class should be local_integration, and the input should be retained.
serena/use, vllm/use Narrow real calls with bounded claims. The README and prose around them claim more than 'greeting' in result or len==2048 and finite shows.
grafana/persistence The Grafana assertions don't show persistence across a restart. The scope is generic and the limitation is boilerplate.
prometheus/use The entire output is a fixed wrapper string, with no metric, target or query result asserted.
qdrant/use The check reads metadata for one collection, which is SocratiCode's index of this repository's fixtures/ (8 points). That is fixture-scoped, so native_proven overclaims.
skfolio/use tool_versions 1.2.9 is not shown by the check, and is not the skfolio winner pin, so the receipt is unbound. The regenerated matrix still lists it as a passing receipt for that winner.
syft/use The only retained command has empty output, and the backing CycloneDX digest has 58 hex characters (agent-gap-handoff.md:11), which cannot be a SHA-256.

Artifacts and decision record

  • Privacy (medium).
    • execution-ledger.json publishes an unsalted original_argv_sha256 of the unsanitized argv on every entry. Anyone can reverse the <user> redaction by guessing the name offline. Salt or drop it.
    • Lower severity: checks.py:44 hard-codes collection codebase_b053c4b010f2, a truncated hash of the home path.
    • 105 argv_sanitized occurrences expose the /mnt/c/Users/<user>/Documents/Codex/…/pl/work/… layout.
  • Ledger completeness (medium). Failures named in the handoffs never reached the ledger or the register, for example agent-gap-gitleaks-scan exit 1 (agent-gap-handoff.md:7). So 271/36 is not the full execution record. Add them, or say so.
  • Model artifact (medium). The local model differs from the catalog pin: publisher, quantization and revision vary from manifests/stack.json (llama.cpp b11057, ggml-org/Qwen3.8-27B-GGUF @ efbb3b1f…, Q4_K_M). The README names no alternative, rollback target or overturn comparison.
  • WSL limits (medium). The shared WSL limits (104 GB / 48 / 24 GB) are kept, contrary to the dated user decision for this exact workstation (docs/new-workstation-runtime-profile-20260922.md), with no alternative or recheck recorded.
  • Disclosure (low).
    • The claude-code receipts ran 2.1.280, but the winner pin is 2.1.278, so they are unbound. The README doesn't say so, although it does for llama.cpp.
    • The regenerated matrix raises the derived status of difftastic and worktrunk (not_established → conditional). The README's "no platform status changed" doesn't disclose this.
  • Prose (low).
    • A Dagu digest suffix doesn't match the pin (agent-research-handoff.md:12).
    • The Poppler runner link is broken.
    • Four failure-register.md rows (:51-56) sit outside any table.
    • The validation and secret-scan claims (README :40-42) predate the final ledger and README rewrites.
    • The README's 128 GB RAM figure has no retained measurement.

Policy question for catalog maintainers (not a defect in this PR)

Version-only install receipts such as gitleaks version, dagu version, difft --version and grafana --version are honest native_proven for the narrow thing they ran, per §2. §5, however, counts an install-stage pass as qualifying. One independent agree on such a receipt would therefore lift a Linux winner towards accepted on a version call alone; for gitleaks, the derivation goes from conditional to accepted. If acceptance should require functional use, that is a change to §5 or QUALIFYING_STAGES, not a relabel here. I've kept these receipts in the supportable list under the current rules, and I'm raising the rule question separately.

Supportable as recorded (46)

ai-memory/install, ai-memory/use*, alertmanager/install, alertmanager/persistence*, alpaca-py/install, candidate:astral-sh-uv/install, candidate:cli-cli/install, ccusage/install, ccusage/use*, claude-code/install (unbound: 2.1.280 vs pin 2.1.278), codex/install, codex/use*, dagu/install, dagu/use*, difftastic/install, duckdb/install, gitleaks/install, grafana/install, huggingface-hub-native/install, llama-cpp/install, loki/install, loki/use*, mcporter/install, nautilus-trader/use*, ntfy/install, ntfy/persistence*, opentelemetry-collector-contrib/install, opentelemetry-collector-contrib/use*, pandas/install, poppler/install, poppler/use*, prometheus/install, qdrant/install, qmd/install, qmd/use*, restic/install, restic/recovery*, rtk/install, rtk/use*, syft/install, systemd/install, vllm/install, worktrunk/install, worktrunk/use*, zizmor/install, zizmor/use*.

* = a checks.py-backed content assertion. It becomes recordable once the systemic item above is fixed.

Next step: after a fix push, I'll re-check the changed receipts and record scripts/host_receipts.py review --kind independent_session --verdict agree on every receipt that then holds. I won't push to this branch before then, to avoid conflicting with your fixes.

…artifact (one host identity)

#231 already records this physical machine as nativestack-5975wx-20260925.
To avoid two host identities (and double counting in platform_status), the
66 receipts recorded here under threadripper4090-nativestack-20260924 move
unchanged into evidence/artifacts/nativestack-20260924/host-receipts-20260924/
(still hash-registered), the duplicate hardware-profiles entry and its
hw-profiles artifact are dropped, and the README states the relationship.
The failure register and execution ledger stay. Agreed with the #231
recorder (option d).

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
@seathatflowsinourveins
seathatflowsinourveins enabled auto-merge (squash) September 25, 2026 14:19
seathatflowsinourveins added a commit that referenced this pull request Sep 25, 2026
…20260925 (#262)

* Record 31 host receipts on nativestack-5975wx-20260925 (component-stages only the 09-24 record held)

The 2026-09-24 NativeStack record (#160) held 66 receipts under a second host
id for this machine; #231's canonical record held 21. The component-stages
only #160 proved are re-recorded fresh on current pins under the canonical
host id, by host_receipts.py record: 8 observability/recovery, 10 tools,
6 trading-lane libraries, 7 clients and scanners. Recovery stages ran on
owned instances only; use stages meet the four review points (layer role,
positive control, backed claims, winner binding). 16 historical pairs were
not re-recorded, each for a stated reason (no landscape winner to bind,
unpinned catalog pin, already on main, or Codex usage-limited until
2026-09-30). The vllm install receipt waits for the 0.30.0 pin.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>

* Keep the 26 independently agreed receipts; drop five for re-recording from a published commit

Independent headless review sessions agreed on 26 receipts. Five are
withdrawn before publication: mcp-inspector, poppler, serena and lean were
re-recorded on an unpublished local commit (catalog_revision not on GitHub),
and claude-code use shows none of the workers layer's job. They will be
re-recorded from a published origin/main commit and reviewed again.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>

---------

Co-authored-by: Scout <scout@local>
Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]>
@seathatflowsinourveins
seathatflowsinourveins merged commit ae3d3d3 into main Sep 25, 2026
23 checks passed
@seathatflowsinourveins
seathatflowsinourveins deleted the evidence/nativestack-20260924 branch September 25, 2026 17:42
seathatflowsinourveins added a commit that referenced this pull request Oct 11, 2026
…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 <[email protected]>
seathatflowsinourveins added a commit that referenced this pull request Oct 11, 2026
…ew (#1001)

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

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 <[email protected]>

* Close the holes in the retirement guard and qualify the one-default rule 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 <[email protected]>

* Bind the manifest label to the shipped slots file and close the remaining 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 <[email protected]>

* Judge retired-route prose one physical line at a time and close the guard'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 <[email protected]>

* Align the manifest's scheduled-tasks note, state the rule in every explaining 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 <[email protected]>

* Close the sentence-splitter class by documentation, pin the module's 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 <[email protected]>

---------

Co-authored-by: Claude Sonnet 5.5 <[email protected]>
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