FIELD-PLAN FINDING, mine rather than the classifier's: NOTHING IN r5 PROVES THE BUILD PRODUCED A NEW BINARY. Source-only, nothing run. MEASURED, this session, read-only: .worktrees/304-w2-repr/target/release/spt.exe is RIGHT NOW edd3d8e0566690493182a0e1807b1a6b43c52cff45511b9e81490e256dd10e21 -- the pre-repair executable. r5:202 sets EXE to exactly that path. grep for edd3d8e0 over r5 returns 0. The rig never names it. WHY S5 CANNOT CATCH IT. The three-way provenance check derives all three values from that one path: exe_sha from EXE, stg_sha from the artifact staged out of it, meta_sha from the signed metadata written over it. If debug-rollout --build-current leaves the existing binary in place for any reason, all three agree -- on the OLD binary -- and S5 records PROVENANCE_THREE_WAY_OK. Three-way provenance is an INTERNAL-CONSISTENCY check. It proves the staged set is self-consistent; it says nothing about WHICH SOURCE the executable came from, and it is the same green either way. That is precisely the outcome my field plan forbids: edd3d8e0 must appear NOWHERE in the new signed set. Today that requirement is an argument about how cargo fingerprints, not an assertion the rig makes. I am not offering the argument -- the point is that the safety has to be a measurement. THE CHEAP CLOSE, three lines, all in the successor: 1. In S3, BEFORE the rollout verb runs, capture pre_exe_sha and the mtime of EXE if it exists (it does). Record both. 2. In S5, die unless exe_sha differs from pre_exe_sha. Identical bytes prove no build happened. (A genuine rebuild changes the hash even on unchanged source -- MSVC PE headers and PDB paths are not reproducible -- so this detects "no build", which is the failure at hand.) 3. In S5, die if exe_sha equals edd3d8e05666904931 82a0e1807b1a6b43c52cff45511b9e81490e256dd10e21 (joined, no space -- the preserved attested pre-repair exe). A named negative control tied to the attestation, so the refusal says WHAT it caught rather than only that two hashes matched. WHAT BINDS THE BUILD TO THE RIGHT SOURCE, for completeness: S0e at r5:783/:792 asserts W is at SUBJECT_SHA with windows.rs blob 848a23fe and a clean tree, and the producer runs with env -C "$W". Chain is subject-bound tree, build in that tree, freshness proven by 1-3 above. ONE REMAINING GAP IN THAT CHAIN. S0e runs at the start of the run; the build happens many steps later, after the pool claim, the key, the pin and an unbounded amount of wall time. Nothing re-asserts the subject IMMEDIATELY BEFORE the producer. The build is the step whose provenance every later claim inherits, so its identity precondition should be re-read at the point of use, not carried forward from S0e. Re-run the three S0e assertions (head sha, blob, porcelain clean) as the first thing inside S3. Also for hertz's reissued staged manifest -- the five files that ACTUALLY RESOLVE at BIN right now, measured by me independently, all mtime Sep 12 15:16: census.ps1 7a50b14e2ea0bf93a310ca14c0ba4f06faf82f6905a9bc764c692b0f913d413b 1204 B cpubracket.ps1 fc10031d25eb551daa88ba84b1cb13da4b90baa45ddc5dde3986fbd1abe90e73 727 B runner-census.ps1 63d0508b93a8d15fa2bc9940708c7a13ac4abda1f8ca9c9a5d32a63b1dcf3e8a 10442 B portfields.ps1 283386e7e1cac9df5e8e3c7e8283faea224ad3d12f4da30185a9b342b9a1da85 5835 B d1_render.py 3b9844932696286b83342b831a90407e4505cf1a16665bc936c71f2d99cca596 6047 B These are the resolved files, not the preserved review tree. Compare them against the accepted pins; I am not asserting they match, only supplying what is there. Capacity, measured now and true only now: C: free is 120.06 GiB, against FLOOR_GIB=96 and HARD_STOP_GIB=32. The admission floor is currently satisfied with about 24 GiB of headroom. This is a volatile reading and says nothing about free space at run time; r5 already re-reads the floor before every producer, which is the right shape.