Repository navigation
Withhold selection-bearing evidence from blind lane packets - #1262
Open
seathatflowsinourveins wants to merge 17 commits into
Open
seathatflowsinourveins wants to merge 17 commits into
seathatflowsinourveins wants to merge 17 commits into
Conversation
Blind layer-verdict lanes must not see the current choice. A sweep over 22 builds, 644 packets and 366 references found 88 references whose content still stated it; withhold_removed_refs() and the keyed field strips did not catch them, because the choice sat in prose, catalog and receipt records and in adoption-valued fields. - blind_checkout.py: add the 82 mixed prose, catalog and receipt records to REMOVE_GLOBS, so their references are dropped; strip decision keys and adoption-valued verdict/status fields at any depth of evidence JSON in 6 files; disclose the field strips with a second "withheld" label. - lane_packets.py: carry the new withheld label through packet assembly. - tests: an 88-case regression fixture (tests/fixtures/blind_current_choice_refs.json) and new EvidenceChoiceKeyTests and RemovedSelectionRecordTests; red at the base (175 failures, 6 errors), green after (174 OK, 2 skipped). - manifests/evidence.json: refresh the three changed shipped entries and add two. Extends the existing mechanisms in tools/sota-convergence/blind_checkout.py at 30ab2e3 (REMOVE_GLOBS and the recursive keyed field strip); no new sanitizer or prose parser, and no earlier removal, role, catalog, blueprint or adoption rule is relaxed. Known limits for reviewers: whole-file removal shrinks every affected lane readset; a path list fixed from one sweep will not catch files added later; three offline checks need jsonschema==4.26.0 and must run in CI. Authored by a GPT-6.1 Sol lane for the NativeHorizonNY2 wave builder (pre-2, gate 14; local commit 0877d59a, patch 1f1cbc5f); published by the coordinator. Co-Authored-By: Claude Opus 5.5 <[email protected]>
added 5 commits
October 20, 2026 08:09
…stion Extend the readset choice classification and redaction so every layer's cited readset (direct references plus one level) has no cited prose_exposure finding (20/30 exposed layers at dab1f38, 0/30 here); export-only exposures stay bounded with paths and reasons. The lane contract's adopted eligibility pool (lane-prompt.md, the pinned example LANE) is unchanged; W1 is recorded as a design question for the coordinator, not changed in this PR.
seathatflowsinourveins
added a commit
that referenced
this pull request
Oct 21, 2026
* Bump certifi to 2026.10.19 (GHSA-6q48-6c7w-9gw2) GHSA-6q48-6c7w-9gw2 (published 2026-10-20 19:35Z): certifi >= 2019.03.09, < 2026.10.19 bundles emSign ECC Root CA - G3, whose intermediates had compromised keys. certifi 2026.10.19 drops that root and keeps the unaffected emSign roots. #1262's required osv-scanner context fails on it across every lock below. Lock delta (certifi only, following #1265's method): - certifi 2026.7.22 -> 2026.10.19 in every lock that pinned it: the adaptive-paper engine lock, the trading-2604 runtime uv.lock, the memory native-qualification uv.lock, the OpenHands worker lock and pins, the adoption SDK lock and constraints, portfolio-risk, catalyst-provenance, sim-crosscheck-hftbacktest, deepagents-omniroute, openhands-native-capabilities, mlx-smoke and the macOS e2e evidence lock. - Hashes from PyPI's JSON for 2026.10.19, each file downloaded and checked: wheel 42d35340cc5b9ba78e818ddbff0c5b1c2b779de448a340fd1b989f5fa8670e1b, sdist 035c1e85572b141bf1c3a3eff0e33a8eb74917522f2559075ff8d2fea780a1ae. No other package line changes in any lock. - adaptive-paper engine lock sha256 645544edbd13e7ff2434d5459e981ec0a2506c944e30d47844b4f3c57f602db8 -> 8e08849c3370b905b7993a75e2f356920d45cdba81d64709a71fa3ff6263cb2d. - trading-2604 runtime lock a1413f20... -> 2df71327...; the published a1413f20 becomes one more recorded migration input in install-trading-2604.sh, as #873 and #1265 did, never acceptance; accept-trading-2604.sh and adaptive-paper/scheduled_trial.sh require the new hash. Bindings refreshed: .github/osv-scanner-lockfiles.json (per-lock sha256 and the retained fixtures as excluded evidence), adaptive-paper/source-hashes.json (scheduled_trial.sh, test_scheduled_trial.py), tests/test_scheduled_trial.py, tests/test_trading_2604_migration.py, runtime-2604/README.md, the convergence records' frozen inputs re-pointed to the retained copies, catalogs/landscape/final-stack.json (sources hash of the trading-2604 lock only), and manifests/evidence.json for every changed and added file. Retained bytes: each pre-bump lock is kept byte-identical (git show da55495) under evidence/artifacts/certifi-2026.10.19-repin-20261020/ historical/ as published-<hash>-<name>, an excluded evidence fixture in the osv inventory (not an install input; the active lock is scanned), with repin.json as the record. Checks (python -B, scratch venv from .github/requirements-ci.txt with --require-hashes): - scripts/validate_convergence.py --all-recorded: 33 records, all valid; - scripts/validate.py: passed; - scripts/evidence_manifest.py --check: passed (12,342 files); - scripts/final_stack.py --check: passed; - unittest of test_trading_2604_lock, test_trading_2604_migration, test_scheduled_trial, test_osv_lockfile_coverage, test_receipt_sha256_key_custody, test_convergence_contract, test_evidence_manifest, test_research_convergence_practice and test_sota_convergence: 310 tests, OK; - git diff --check: clean. osv-scanner was not run locally (not installed); the required context runs it. No install, accept or trial script was run; no host state, broker or paper contact. LIVE remains NO-GO. Co-Authored-By: Claude Opus 5.5 <[email protected]> * Bind the SDK lock's certifi relock to its qualification (validate-shard-5) The certifi bump changes adoption/sdk/requirements-linux-x86_64-py313.lock, which tests/test_adoption_contract.py binds two ways: every non-SDK pin must equal the supply-chain receipt's historical inventory (certifi 2026.7.22), and the runtime-sdk-20261003 qualification receipt's lock_sha256 (3a17fa09) must equal the current lock. Both failed at 1328f12, in test_lock_matches_accepted_inventory_and_all_pins_have_hashes and test_sdk_upgrade_keeps_independent_inventory_and_client_guards (validate-shard-5); both pass at da55495. The ignore route does not apply: .github/osv-scanner.toml allows an ignore only for unreachable code, and certifi's bundle is reachable from any HTTPS client in this SDK environment. The relock is recorded instead of silently re-baselined, in the shape of IGNORE_ALLOWED_LOCKS in tests/test_osv_lockfile_coverage.py: - SDK_SECURITY_RELOCKS names certifi 2026.7.22 -> 2026.10.19 and GHSA-6q48-6c7w-9gw2 (GHSA-6q48-6c7w-9gw2, first patched version 2026.10.19). The inventory guard applies exactly that move, and only from the inventory's own version. - SDK_QUALIFIED_LOCK is the retained pre-bump lock (this PR's evidence fixture, byte-identical to da55495). When the receipt's lock_sha256 is not the current lock's, it must be that fixture's, and the current lock may differ from it only in the relocked blocks; the preamble and every other block must be byte-identical. - The historical receipts stay unedited. A re-qualification of the SDK pair records the new lock and inventory and empties the table. New regression test: test_relocked_lock_differs_from_the_qualified_lock_only_in_recorded_relocks. It keeps every version, changes one charset-normalizer hash in the current lock and then in the qualified fixture, and requires the two new guards to refuse each. The existing duckdb and openai-codex-cli-bin drift cases still fail on their own guards. manifests/evidence.json carries the test file's new hash. Local, in a requirements-ci venv: - tests.test_adoption_contract, test_osv_lockfile_coverage and test_evidence_manifest: 80 tests, OK; - scripts/validate.py: rc 0; evidence_manifest --check: passed (12,342 files); final_stack --check: passed; git diff --check: clean. validate_shards.py run --shard 5 --shards 8 at 1328f12 also failed locally in test_adoption_launchd and test_codex_job_lane_hardening. Those failures come from the checkout location: mise installs [email protected] there, and GitHub's attestation API refused it with a 403 rate limit. In clean worktrees of 1328f12 and of da55495, the same three modules give the same result (1 pre-existing error, test_claude_usage_sampler). test_runtime_boot needs PyYAML, which this venv lacks, on both commits. No install, accept or trial script was run; no host state, broker or paper contact. LIVE remains NO-GO. Co-Authored-By: Claude Opus 5.5 <[email protected]> * Bind the SDK relock to repin.json, reproduce the mlx lock, restore three modes Both families' checks of 1328f12 (AMEND, agreed): 1. HIGH (Claude D1, GPT P2a): the adoption SDK lock contract. The contract now admits exactly the move evidence/artifacts/ certifi-2026.10.19-repin-20261020/repin.json records for adoption/sdk/requirements-linux-x86_64-py313.lock: - certifi 2026.7.22 -> 2026.10.19, GHSA-6q48-6c7w-9gw2; - prior 3a17fa09... (the retained qualified lock, which the runtime-sdk-20261003 receipt names) -> current 9ee41e37.... It also requires the record's "Prior native acceptance does not transfer". The dated receipts (the 09-19 supply-chain inventory and the 10-03 SDK qualification) are unedited. The inventory guard and the client mutation guard both stay (the duckdb and openai-codex-cli-bin cases). The regression test test_relocked_lock_differs_from_the_qualified_lock_only_in_recorded_relocks now refuses four version-preserving mutations, each by its own guard: a lock hash, a qualified-fixture hash, the record's current sha256 and the record's no-transfer sentence. 2. GPT P2b: tools/mlx-smoke/requirements.lock.txt did not reproduce under hardware-profile-smoke.yml's --exclude-newer 2026-09-23T00:00:00Z. The step adds --exclude-newer-package certifi=2026-10-20T02:30:00Z. That is uv 0.12.17's own per-package override (crates/uv-cli/src/lib.rs: 7158-7177, PACKAGE=DATE, flattened into pip compile through ResolverArgs:7486 and PipCompileArgs:1642, at tag 0.12.17). certifi 2026.10.19's files reached PyPI at 2026-10-20T02:24:15Z and 02:24:16Z, and no later release exists. Every other pin keeps the original cutoff. Reproduced locally with the pinned uv 0.12.17 (x86_64 release archive, sha256 fa82fd8d..., equal to its published .sha256) and the step's exact arguments: diff -u against the committed lock is empty. 3. MEDIUM (Claude D2, GPT P3): mode 100755 restored on adaptive-paper/scheduled_trial.sh, runtime-2604/accept-trading-2604.sh and runtime-2604/install-trading-2604.sh, with no content change (blobs afe6305, ed1b600 and 412c571, unchanged). manifests/evidence.json carries the new hashes of the test and the workflow. No lock byte changes; the engine lock stays 8e08849c. Local, in a requirements-ci venv: - scripts/validate.py: rc 0; - evidence_manifest --check: passed (12,342 files); - final_stack --check: passed; - validate_convergence --all-recorded: 33 records valid; - test_adoption_contract, test_osv_lockfile_coverage, test_evidence_manifest, test_workflow_hardening, test_workflow_security_coverage, test_scheduled_trial and test_trading_2604_migration: 234 tests, OK (13 skipped); - git diff --check: clean. Shard 5 (validate_shards.py run --shard 5 --shards 8) at 710733d, in a clean worktree: 2,304 tests, 0 failures. Its 2 errors are local only and the same on da55495: test_claude_usage_sampler, and test_runtime_boot, which needs PyYAML. No install, accept or trial script was run; no host state, broker or paper contact. LIVE remains NO-GO. Co-Authored-By: Claude Opus 5.5 <[email protected]> * Pin Pillow 13.0.0 on reviewed certifi 2026.10.19 head Stack the five native Pillow relocks on #1266 accepted head eb898b5, carrying its reviewed certifi pins unchanged. Only Pillow package entries move. Preserve exactly the two reviewed trading certifi timestamp strings under the wave builder decision; both pinned uv versions accept the lock offline. Reproduce the worker certifi export byte for byte before reapplying the unchanged scratch-only Pillow override, rule-6 turn-back and F18 scope. Retain each accepted intermediate input once; reuse #1266 reviewed history and relocate only frozen receipt paths, never their digests or acceptance. Refresh all live binders and add real predecessor-admission regression. Checks: 901 tests, 873 pass and 28 optional skips; publication validation, all 33 convergence records, evidence manifest, final-stack, trading gates, shell syntax and whitespace pass. Local osv-scanner is unavailable; normal exact-head hosted checks and both-family reviews remain required. Sources and compatibility evidence: evidence/artifacts/ pillow-13-repin-20261020/RESEARCH.md and worker research.md, 2026-10-21. No destination-host, image, grader, model, broker or paper acceptance. --------- Co-authored-by: Claude Opus 5.5 <[email protected]>
added 6 commits
October 20, 2026 22:26
… the blinding branch
…blocks V9's blind_checkout.py edits moved its three lazy-import blocks, so the comment locators in the OpenHands resolver's patch_policy.py and its resolver test cited lines without sys.path.insert, and tests.test_us_equities_strategies.ContractTests.test_live_lazy_import_comment_locators_include_the_cited_blocks failed in validate-shard-5 at 5743e08 (five subtests). The locators now cite 443-444, 643-644 and 1068-1069; manifests/evidence.json carries the two files' new sha256 values (byte counts unchanged).
This branch has not been deployed
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.
Close identity-binding asymmetry in blind readsets
Scope
Mask the remaining selected identities in exported evidence while preserving measurements. The repair covers executable installation decisions, slot/correction/roadmap identities, pinned layer components, owner/default prose and alternatives assignments. An operator-only comparison now tests whether these contexts identify prior winners differently from adopted nonwinners in every actual packet build.
d6ee6e1d355728794e2e7bd08694c3598bd0499d.5743e085351c7b10a706626543274387d6b7b2b6(tree416ff648d26ee2e78eedf640255e0d57596f10e2).07b5969d27e852a6bfe1153be0aed888ff359ba8(tree28aada546310a2dde1d38cffbc9abd32da16d62a): the V9 repair plus one CI-fix commit, described under Validation.lane:shared.The two local commits descend directly from the base without a merge: 9c8c0e1 implements the identity repair and 5743e08 appends the supported advisory observation. The lane prompt and example lane are byte-identical to
dab1f38b6aaaef20afd5b949d24318cc954b677a. Existing measurement artifacts, installation sources, eligibility rules and .github files retain their bytes. Historical advisory snapshots and deltas remain unchanged. Shared-lane acknowledgement and the normal merge requirements remain applicable.SOTA sources
The change extends existing NAS mechanisms at the exact reviewed base:
tools/sota-convergence/lane-prompt.mdandexamples/claude-native/workflows/layer-verdict-lane.js.Changes
N5-R2. Add
winner_asymmetry.py, which reads restored operator candidates and prior winners but never writes those roles to a blind file. It scans actual export bytes for slot/default/owner/interim/deciding assignments, alternatives, correction prose, pinned layer identities, shell functions, installation commands and dispatch. Name/repository/package/CLI/function/owner/pin tokens are matched inside those contexts. Measurement subjects alone are not selection records.The audit compares adopted-role incidence and binding density. It rejects either role-only separation and any unequal rate, including equal presence with unequal binding density. Native and wider cited closures are separately measured; the wider closure includes every path-like packet string and one JSON/string/link level. A whole-export scan also catches choices outside a layer's cited closure. Unscored zero-winner rows are labelled separately.
The independent inventory reproduces 97 structures in each V8 export: 50 selection structures and 47 host-package measurements. V9 removes the 50 selection structures and preserves all 47 host measurements byte-for-byte. All 104 top-level definitive-manifest measurement objects also survive unchanged. This replaces the earlier five-file inventory's overly broad interpretation, not measured evidence.
Installer decision and M1-b. Withhold both
install.shandaccept.shfrom the new-WSL installation plan's blind export. Their selected-slot functions, command arguments, dispatch and acceptance lists encode the chosen stack; removing only individual commands leaves that decision readable. Each whole-file removal has a keyed audit record, while the original repository scripts are unchanged. Remove the promptfoo manifest-following clause and owner-default acknowledgement rather than allowing them under an execution-history disposition.The two V8-view scripts total 346,085 bytes. Every export loses exactly those two files; total bytes fall 276,033 in ledger mode and 276,051 in manifest mode after accounting for other masks and larger keyed audit metadata. Direct role-specific evidence volumes and shared install-command signals are measured separately.
L-t2, L-r and L-f. Fast controls now kill AUDS4, EMPTY1 and REPLNAME. Every replacement is checked against independently reviewed exact bytes, so an identity-bearing replacement cannot pass merely by omitting a choice keyword. Add positive and negative controls for stays/remains/is the selection, selected numeric versions and installs ... by default. Preserve measurement and UI-selection negatives.
L-b4. Remove newly vacated list/object members and list elements while preserving original empties and measurement objects. Withholding the decision scripts also removes the comment-header gaps. The expanded whole-export predicate finds eleven newly empty members in five V8 files and one comment-gap path; both counts are zero after repair. Their exclusive per-role incidence was already zero because the relevant files are shared. That zero attribution is not used as evidence of whole-export absence.
N6 and earlier repairs. Every registered decision cell remains masked, including final body rows. The registry has 52 header entries, representing 53 actual tables, 503 body rows and 542 decision cells. Earlier measured-neighbor, pin-provenance, parser, lifecycle and eligibility controls remain active.
Evidence classes
measurements-v9/builds.mdandproof.jsonnative-asymmetry.md,native-rows.json,rows.jsontests/test_blind_checkout.py,scripts/validate_shards.py:94-96and.github/workflows/validate.yml:345-354mutants-verified.jsonrole-marks.md,volumes.mdandpilot.mdproof.jsonfinal-advisory-validate.log,final-advisory-manifest.logandfinal-advisory-convergence.logThe new 11-method V9 module includes per-form positive/negative and density controls, closure controls, actual residual-form checks, replacement integrity, keyed installer removal and vacated-container controls. The existing all-packet readset test now fails if any scored layer separates or correlates by identity context. The blind exporter does not import the operator auditor; no winner labels or private tokens are emitted into a lane-visible file.
Two-mode results
Five manifest dates, both modes and newcomers off/on produce 20 exports, 640 rows and 64 mode/layer groups. Each grouped row contains ten actual builds. Counts below are scored rows; correlation includes separation and unequal binding density.
Across both modes, whole-export correlated scored rows fall 520 to zero. Every after candidate binding count is zero, rather than merely having equal role rates. The independent content audit reports zero after findings in every export. The retained 47 host-package rows are measurements, not unresolved selection findings. Complete native/wider per-layer before/after tables appear in
REPORT-v9.mdand the machine-readable measurement artifacts.Broad lexical exposure is separate: 0/320 native rows in each mode, 80/320 wider ledger rows and 90/320 wider manifest rows. The L-f word-order extension matches additional raw tool-response/regex payloads and procedural documents compared with V8's older 40/320 and 50/320 figures. The same expanded predicate is used before and after in V9; these lexical matches are not independent selection findings. Exact/near counts remain 20/320 and 30/320 for ledger mode, and 20/320 and 40/320 for manifest mode.
Primary scored denominators are 560 winners / 1,600 nonwinners over 270 ledger rows, and 660 / 1,520 over 300 manifest rows. All-row denominators remain separately labelled:
Other after families include whitespace, Markdown, real emptied dictionaries, newly vacated lists/objects, blank shell comments, broader text marks and all seven earlier fragment families. All are zero after, both as whole-export paths and exclusive role incidence. Binder target paths rise 47 to 51 in ledger mode and 51 to 59 in manifest mode as additional fields are masked; exclusive binder-role incidence remains unchanged from V8.
Install-command role incidence is a separate shared-export signal. In scored ledger rows it falls 280/560 winners versus 510/1600 nonwinners to zero for both roles; in manifest mode it falls 300/660 versus 480/1520 to zero. Full per-role file/byte totals appear in
volumes.md. Unequal evidence volumes remain disclosed, not treated as eliminated by zero identity-binding counts.Exact document-retrieval pilot
Each of the 20
foundation::document-retrievalbuilds has six adopted candidates: three prior winners (markitdown, poppler and qmd) and three nonwinners. The pool remains neither exact nor near under the unchanged eligibility rule. Native, wider and whole-export after identity bindings are zero.The source-hash binder still marks qmd, one of three winners and none of three nonwinners in every build. Each mode therefore has 10/30 marked winner occurrences and 0/30 marked nonwinner occurrences. The scripts that previously named qmd and markitdown against context-hub are withheld, so their install-command marks fall 2/3 versus 1/3 to zero versus zero. Measured benchmark subjects are retained.
Direct pilot evidence remains 38 winner file occurrences and seven nonwinner file occurrences per build. Winner bytes fall 459,132 to 459,114 and nonwinner bytes remain 210,767; exclusive file totals remain 25 versus one. These binder and volume differences are why the overall assessment remains PARTLY, not unconditional blinding.
Corrections to v8
REPORT-v8 said: "The separate complete-export slot probe records
tobi-qmd1 before, zero after, and all installed-owner assignments are absent from every V8 export." It also said: "Thus the pilot cited closure cannot reveal that selected slot or its installed-owner row through the reviewed structural forms." PR-BODY-v8 said: "The pilot'stobi-qmdslot and installed-owner assignment are withheld rather than treated as ordinary repository provenance."The exact corrected claim is narrower: V8 withheld the QMD slot and installed-owner assignment from its JSON decision indexes. It still exported
tobi-qmd(),@tobilu/[email protected]and the selected-slot dispatch in install.sh in all 20 builds. That script was outside the pilot's cited closure, but visible in the whole export. Its commands named two of three pilot winners and one of three nonwinners. The old pilot 1-before/0-after structural count concerned the accepted memory record, not proof that the executable choice was absent. V9 removes that executable selection channel; the separately disclosed 1/3 versus 0/3 binder residual remains.The V7-to-V8 binder delta was 48/52 to 47/51 target paths in ledger/manifest modes. The removed target was
evidence/artifacts/harbor-0240-currency-20261009/receipt.json, which had marked the only quality-evaluation nonwinner. That layer's [marked W, all W, marked N, all N] tuple changed [0, 2, 1, 8] to [0, 2, 0, 8]. Across ten builds, every mode/scope lost ten nonwinner marks while winner marks stayed unchanged:Ledger scored nonwinner incidence fell 4.38% to 3.75%, widening the role gap. V9 has the same exclusive role incidence as V8, while additional source-bound masks increase target-path counts as stated above. The prior 352-to-zero five-file inventory never established absence of all identity bindings from every exported file; the independent 97-per-export inventory corrects that interpretation.
These corrections are recorded in V9 only. The delivered V8 report and body retain their reviewed hashes
446eaaeae17d990a4ceffad05e791fb614b01c74efc4ea7dfb034f82429f666cand91014510340ce651fa69a1962d5cd4bac19bb14853b68ad82769e375cb670cb4.Validation and chronology
The first focused run at 9c8c0e1 ran 845 tests with two advisory-inventory failures, 30 skips and no errors. The immutable V8 parent passes both original tests with 357 advisory locations; V9 has 385, adding 23 reachable reads in codex_hook_trust.py, four in grand-dashboard/progress.py and one in omniroute-codex-sdk/worker.py. Commit 5743e08 appends the supported monitoring-only observation and index entry. No historical baseline, test assertion or execution authority is weakened.
Final-head focused suite at 5743e08: exit 0; Ran 845 tests in 2517.655s, OK (skipped=30). Log measurements-v9/final-focused-advisory.log, SHA256 22645912e0fdf81866494109ba475e7501b30abc09b94bfd8d193ba9161e0270; the run completed at 2026-10-21T14:19:54Z (recorded by the wave builder).
At final head
5743e085351c7b10a706626543274387d6b7b2b6, all three required validators exit 0:scripts/validate.pyreports 71 components, 12,364 hashed files, four profiles and 243 receipts;scripts/evidence_manifest.py --checkpasses all 12,364 files;scripts/validate_convergence.py --all-recordedvalidates all 33 recorded results. Both contract files remain byte-identical to dab1f38, with SHA256d3ef2cc0c06d33d6a4a058f5e74a1cf5be8a3760cc2b0b5572598f0e0e4288e4and09f03c824488ea37c4384c2d4bc867ecc2211d2fce4d50ba08c0dd8f91e7b289.The operator snapshot was prepared before the commit; final proof asserts that every source/registry content hash equals this exact head. Earlier exploratory matrices and interrupted attempts are retained as history, not passing final-head evidence. V9 work is local, offline and model-free. No hosted V9 CI or external-review result is claimed, and predecessor successes are not transferred to this head.
Historical corrections remain scoped: the original failed GPT local run was 828 tests, 17 failures and six skips; the successful supplied V7/V8 snapshots concern only their own heads and supported scanner setup. Certifi attribution is limited to the historical 49f0d3a scan. REPORT-v3's correct SHA256 is
72874a473adc5d2c71ddaf1fba4cd9c5f9473309f30f674218c7ee23ee78be4b. V4 had 47 hash-bound targets plus one instruction replacement, and the unsupported 28-failures claim remains withdrawn. No OSV ignore or security-workflow change is introduced.CI fix at 07b5969. Hosted CI at 5743e08 failed validate-shard-5 (and the aggregate validate):
tests.test_us_equities_strategies.ContractTests.test_live_lazy_import_comment_locators_include_the_cited_blocksfailed five subtests, because V9'sblind_checkout.pyedits moved its three lazy-import blocks and the comment locators inblueprints/runtime-workers/openhands/resolver/patch_policy.pyandtests/test_runtime_worker_openhands_resolver.pystill cited 439-440, 634-635 and 1059-1060. Commit 07b5969 re-points them to 443-444, 643-644 and 1068-1069 and updates the two files' sha256 values inmanifests/evidence.json(byte counts unchanged); nothing else changes. Locally at 07b5969:tests.test_us_equities_strategies,tests.test_runtime_worker_openhands_resolverandtests.test_runtime_worker_openhands_push_gateran 297 tests, OK (skipped=19);scripts/validate.py,scripts/evidence_manifest.py --check(12,364 files) andscripts/validate_convergence.py --all-recordedexit 0. The hosted required checks at 07b5969 are the authoritative CI result.The repair closes the measured identity-binding and rewrite forms. It does not remove original-source hash binders, adopted roles, unequal evidence volume or arbitrary semantic inference.