Repository navigation
Release 0.3.0 under compatibility contract evidence-v3.2 - #6
Merged
Merged
Conversation
#3, #4 and #5 changed what admissible means - drifted and refused records are rejected at composition, CI evidence binds the whole provenance chain against policy-declared expectations, and the adopted contract is committed and fails closed - while the verifier kept reporting `evidence-v3.1` / `0.2.0`, the identity of the build before any of it. `verifier_status` decides composability by that contract and nothing else, so records judged under the older, weaker rules still composed with records judged under the new ones. The installer's pinned verifier, 760977f, is such a build. §J of the design says a release that changes evidence semantics increments the contract and says so in its notes. The contract is now `evidence-v3.2`, VERSION and pyproject move to 0.3.0 together, and CHANGELOG.md is the notes: what moved, and that `evidence-v3.1` records must be re-established. Regressions: a record carrying `evidence-v3.1` is refused, alone or beside current records, both at `verifier_status` and through `compose` on an activated repository; and the newest CHANGELOG entry must name this verifier's VERSION and COMPATIBILITY, so neither can move without the notes. All three fail against main. The installer pin is deliberately not moved here: `install-ladder.sh` refuses a pin that is not already an ancestor of origin/main, so it can only name this release once it has merged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016m6di8xFVdwwq949mJx9U1
Deep-Sixed
marked this pull request as ready for review
September 23, 2026 09:57
This was referenced Sep 23, 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.
Work package: release integrity, step 1 of 2. Branched from
mainatc130317. This is the first half of the P1 finding from the repository review of the merged #2–#5 state.The defect
PRs #3, #4 and #5 changed what admissible means, but the verifier kept reporting the identity of the build that came before any of them:
verifier_statusdecides whether records compose bycompatibilityalone; the commit and implementation digest are provenance and are never compared. So a record judged under the pre-hardening rules composed beside a record judged under the new ones. The pinned760977fis such a build: 26 commits and +531/−39 lines ofverify.pybehindmain, and it cannot even read the committedevidence = "…/3"policy line.The change
Design doc §J: "A release that changes evidence semantics increments the contract and says so in its notes."
COMPATIBILITY:evidence-v3.1→evidence-v3.2VERSIONandpyproject.toml:0.2.0→0.3.0(the suite already holds these equal)CHANGELOG.md, new. These are the notes §J requires. They say what changed admissibility in Bind evidence to the measured state and refuse drifted executions #3–Make the evidence/3 contract durable, fail closed, and adoptable #5, thatevidence-v3.1records must be re-established, and, plainly, that the installer still pins760977funtil step 2.verifier_statusalready refuses any contract other than the verifier's own (it rejects anything not equal toCOMPATIBILITY), so no composition logic changes. Once the contract is bumped,evidence-v3.1records are refused.Regressions (3; all fail against
main)test_records_from_the_pre_hardening_contract_are_refused: anevidence-v3.1record is INADMISSIBLE on its own ("the rules in force") and beside current records ("different verifier contracts").test_composition_refuses_a_record_from_the_pre_hardening_contract: the same throughcomposeon an activated repository. The record is the checkout's own run, re-stamped, so only the contract can refuse it.test_the_release_notes_name_the_contract_this_verifier_applies: the newest CHANGELOG entry must name this verifier'sVERSIONandCOMPATIBILITY. The contract can't move without the notes moving too.Why the installer pin is not moved here
install-ladder.shfetches the real origin and refuses a pin that is not already an ancestor oforigin/main, and two network-marked installer tests reach that check. Pointing the pin at this PR's own commit would turn CI red until merge. It also can't name the commit that contains it. So the pin moves in step 2, after this merges:PINininstall-ladder.shandcheck-install.sh;CHECKER_SHA, which changes becausecheck-install.shchanges;INV_SHA, re-validated. The invariant block inINSTALL.mdhashes to282f2117…at both760977fandmain, so it's expected to stay;PINconstant intests/test_install_scripts.py, and the docs that say "the pin predatesscripts/", which stops being true;v0.3.0. Tags are outward-facing, so I'll propose one rather than create it.Consumer testing against Cerberus follows the pin move.
Deliberately not changed
docs/design/evidence-v3.md: its seven mentions ofevidence-v3.1/0.2.0are the §J example and the historical M4 record, not statements of the current identity.load_jsonshape, evidence-dir exclusion, nested-repo symlink) belong to a later hardening package. Branch protection is a repository setting.Verification
Climb against
f0cacf404f58 + sha256:28967a9dc9b9, over a baseline captured onmainatc130317:drift: false. Ruff clean.35843499956
and pull_request run
35843533175.
This repository's own climb runs under evidence/2, which it has not moved off.
Its evidence/2
composenever readsverifier_status, so the bump doesn'ttouch it. The contract is read only for evidence/3 records: by
composeunderevidence/3, and by the shadow comparison behind
qualifyandcompare.🤖 Generated with Claude Code
https://claude.ai/code/session_016m6di8xFVdwwq949mJx9U1
Generated by Claude Code
Generated by Claude Code