Repository navigation
Layer-scoped host-receipt verification; version-aware supersession (GPT-6 + Opus verified) - #321
Merged
Conversation
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
seathatflowsinourveins
force-pushed
the
claude/receipt-layer-scope-20260926
branch
from
September 26, 2026 05:01
069dd22 to
de92ca1
Compare
A use receipt can name its layers (record --layer-ref CATALOG/LAYER_ID, the schema's layer_refs). Scoped receipts count only for rows in those layers; an unscoped receipt verifies an alternative only when that repository appears in exactly one layer, and record refuses an unscoped use receipt for a multi-layer component. A successor retires its predecessor only at a pin-matching version; forked supersede chains are rejected and withhold acceptance; a superseded fail keeps blocking until a later native pass on the same host/platform/pin/stage/layer; host receipts no longer count through the generic evidence_refs fallback; the review gate refuses deleting or rewriting a base-registered host receipt. 15 of 19 host_verified alternatives return to receipts_recorded; no winner cell changes. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
seathatflowsinourveins
force-pushed
the
claude/receipt-layer-scope-20260926
branch
from
September 26, 2026 05:39
de92ca1 to
8376445
Compare
seathatflowsinourveins
deleted the
claude/receipt-layer-scope-20260926
branch
September 26, 2026 05:52
This was referenced Sep 26, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
What was wrong. A GPT-6 cross-family review of #312 found that host-receipt verification wasn't scoped to layers:
scripts/component_matrix.pymarked a catalog alternativehost_verifiedwhenever any independently reviewed use pass existed for its repository, whatever layer or role the receipt had exercised.codex execthread plus a resume, which is the native-clients role. It would have promoted the workers-layer alternative "Codex native workers", whose catalog text says the owned writing child is unproven.What changes:
host_receipts.py record --layer-ref CATALOG/LAYER_ID(repeatable) writes the schema's existing optionallayer_refsfield. A scoped receipt counts only for winner cells and alternatives in the layers it names, and everyplatform_statuscaller now passes the row's layer.receipts_recordedwithlayer_scope_needed: true.recordguard:recordrefuses a use receipt without--layer-refwhen the component is in more than one layer. It exits with code 2 before running anything. Install and other stages are unaffected.tool_versions[component_id]). It walks back past generations at other versions, so v1/agree → v2/agree → v1/needs_changes retires the first v1 receipt, and v2 keeps its own evidence.validateand withholds acceptance from the fork on.evidence/hosts/no longer count through the genericevidence_refsfallback. They count only through the receipt checks.docs/contributing-evidence.mdanddocs/next-host-stages.mddocument the field, the flag and the supersede rules, each with a "changed afterv2026.09.26" marker.Status changes (generated from the two component matrices)
alternatives changed: 15; winner cells changed: 0
Of the 15 alternatives:
No winner cell changes. An earlier revision of this PR demoted the vllm semantic-rag WSL cell, but that came only from a cross-version supersede link:
-3at 0.30.0 retired-2, which is independently agreed and bound to the 0.25.0 winner pin. Supersession is now version-aware, so-2's evidence counts again.Rule choice. Here is how each candidate rule plays out on origin/main (183 alternatives, 19
host_verified):host_verifiedNo rule based on catalog data alone separates the 8 overclaims from the 7 plausible rows. R2 would leave 32 multi-layer repositories that win no layer unscoped (codex-plugin-cc, temporal and toon, for example). The winner binding stays as it was: the 18 multi-layer winner cells each exercise the one job every selecting layer chose them for. For new receipts, the
recordguard closes the claude-code and codex multi-role case.Review
GPT-6 review of the original change: Codex
gpt-6-astra, effort max, reviewed the first implementation and found 4 defects, all confirmed by reproduction:evidence_refsfallback;v2026.09.26schema.Repair: each defect became a failing regression test first (8 red), then was fixed.
Status counts: unchanged between the two rounds.
Verification round. A GPT-6 re-check and an independent Opus verifier (scratch export, reproductions and mutation tests) confirmed that all 4 round-1 findings are fixed. They found 3 more, all now fixed with failing-first regression tests:
Final round. A last GPT-6 check found 3 more defects. They are fixed with failing-first tests:
Per the bounded-review rule, this was the last repair round. Anything later is recorded as a residual.
Verification
python -m unittest(full suite, after the commit, so the release-marker consistency test sees it):Ran 5845 tests,OK (skipped=613). An earlier run had 2 failures in untouched modules (gitleaks per-user lock contention and a 30 s subprocess timeout); both pass in isolation..scripts/validate.py,host_receipts.py validate(all existing receipts still validate),component_matrix.py --check(0 flip-rule violations),new_host_grand_list.py --check,build_verdicts.py --check,evidence_manifest.py --check,build_ecosystem.py --checkandvalidate_convergence.py --all-recorded: all pass.verdict_review_gate.py: passed.v2026.09.26;release_due.pyreportsrelease_due. 9a will cut one release covering the repair round.Residuals
validatedoes not requirelayer_refs. Onlyrecordenforces the rule, so a hand-written unscoped receipt stays unscoped.dissentedcounts still include superseded receipts. They are display only.recordstill accepts a cross-version--supersedeslink. It retires nothing, and the docs say so.validatedoes not compare platforms across a supersede link.SOTA sources
subjectscoping (a claim binds to named subjects only): https://github.com/in-toto/attestation/blob/main/spec/v1/statement.mdbuildDefinitionscope and verification against expectations: https://slsa.dev/spec/v1.0/provenance and https://slsa.dev/spec/v1.0/verifying-artifactsdocs/acceptance-evidence-policy.mdanddocs/contributing-evidence.mdsection 8, review point 1 (layer role)🤖 Generated with Claude Code