Unclaimed files left in the canonical checkout. Inventory: canonical-cleanup-inventory.md (commit-as-evidence groups). detect-secrets scan clean on 2026-11-02: hits are sha256 pins, git object ids, test sentinels already in tracked tests and unit-file lines.
5.9 KiB
5.9 KiB
Filbert review: row 187 round 1 (#1685), approve
Request 29423. Candidate manifest 52a5ecc1d143750507942506cc71b65f51ab23c69ae206053b12fbb2682fe5e0 (3 paths) on base f81ebfbae. The brief is docs/plans/2026-10-20_activate-proof-pair.md (blob 5940115e37).
Verdict: approve. No findings block. N1 and N2 are test gaps that no brief test requires. N3 is a comment nit that Sage ruled non-blocking (sage-1271, sage-1272). N4 is doc-only.
What I ran
- I built
~/filbert-scratch/r187-r1/wtatf81ebfbae(the refactor head), then rangit apply --index build.patch.sha256sum -con the manifest passed 3/3.- The patch-id is
6b57c47bc661: 3 files, +376/-16.
- Base drift: the refactor head is
f81ebfbae, so there is none. - Readers and pins: the only test that reads any of the 3 paths is
stack-release.test.mjs. No test readsdocs/TOOLS.md, and no 64-hex pin names any of the 3 paths. - I took the slot on sage-1272. The /proc busy check was CLEAR at 10:06:11Z and 10:12:12Z, and TMPDIR was
~/fs187.stack-release.test.mjs: 144/144 pass, 0 fail, rc 0, from 10:06:12Z to 10:11:01Z. The counts are awk sums over the spec log.
- I ran two mutants of my own against
^T53(12 tests), each restored bygit checkout. After them the tree had only the 3 staged paths.- M8: a carried pair skips
proof_checks([ -z "$PROOF_HEADER" ] || proof_checks ...at :739). It survived: rc 0, 12/12. See N1. - M9: the realpath check drops the
$REPOcase (:775). It survived: rc 0, 12/12. See N2.
- M8: a carried pair skips
- Darkwing's run (144/144, the red base on all 11 T53 subtests, m1-m7 killed) and Sage's gate are their receipts, not mine.
Checked against the brief
- Changes 1 and 2.
parse_optstakes the three flags foractivateonly (:82-84). One of the pair alone, or--no-proofwith the pair, is a usage error (:97-98).proof_for_target(:694) strips any pair fromRUN_CONSOLEand then picks one case:--no-proof, a new pair, no pair, the rollback drop, or the carry.- A carried pair keeps its place, because
RUN_CONSOLEisn't rebuilt in that branch. write_pointerand the install both takeRUN_CONSOLE, the same way--tester-portworks.
- Change 3. Every refusal goes through
check_refuse, andprecheckcallsconsole_for_targetbeforeinstance_busy, the units read and any stop.proof_checks(:745) checks for the preview flags in the run's own flags.- The header rule is the same as
proofOptions(serve.mjs HEADER, plus host, origin, x-mosaic-tester and the auth header, all lowercased) and as render's. proof_file_problem(:765) follows render's order. It adds "cannot be found" and a mode or uid reason, where render dies with a generic message.
- Change 4. The file gets only
[ -L ],stat -candrealpath, and none of them opens it. The inotify watch (0x21, IN_ACCESS | IN_OPEN) is a sound check because/homeisnoatime. The plan and step lines carry the header name and the path, never the value. - Change 5. A rollback to an unsupported copy drops the pair and says so. An activate to one refuses
proof-targetwith the--no-proofhint. Test 7 covers both. - Change 6. One
proof:line, after the drop-tester line.planTailgainsproof: off, and the four T36 slices move by one. - Change 7.
pm-onis unchanged, and T53 test 3 pins it. - Change 8. TOOLS.md "Pinned stack update" has the flags (and the missing
--tester-port) and one paragraph. The paragraph matches the code. - Brief tests 1-9. They map to the 11 T53 subtests as BUILD.md's table says. Every subtest ends in
noLeak, and each--plangoes throughplanOnly. - Brief mutants. Darkwing's m1-m5 are the brief's five, so they're their receipts.
Deviations
I agree with all three.
- The live-copy exception (:243-250).
check_targetlets the pointer's copy through only with a new pair, or with--no-proofwhile the pointer holds one. Test 2 pins the refusals for the plain,--no-proofwithout a pair, and--tester-portforms, and Darkwing's m6 is killed.from_log previousskipsto == pointer copylines (:163), so a rollback after a same-copy activate still goes to the earlier distinct copy. Test 2 checks this.- The backup order (stop, backup, install) is pinned by the live-copy subtest.
- The pair's position matches render (webui-service.sh, proof before
--sendand--tester-port), andflags_driftcompares exact strings. Test 1 checksstatusreads "match the pointer" after a set and after a replace. - The repository and copies refusal turns render's die after the stop into a refusal before it. The copies case is tested. The repo case is not (N2).
Notes
- N1 (test gap, doesn't block): BUILD.md says the checks also run on a carried pair, so a file that was moved or chmodded since the pair went in refuses before the stop. No test pins that, and my M8 survives.
- Without the check, the run would stop both units and the Console start would fail. The run would then roll back inside itself.
- Brief test 5 tests each refusal on a new pair only, so this isn't a missing brief-required test.
- A follow-up could chmod 644 the file after a set, then check that
activate C1androllbackrefuseproof-file-invalid.
- N2 (test gap, doesn't block): no test puts a proof file under the repository, so dropping the
$REPOcase (my M9) survives. It's the same follow-up shape, with a file underrepoinstead ofCOPIES. - N3 (comment, non-blocking per sage-1271): the comment above
proof_for_target(:689) says a new pair "goes last". The code (:717-725) and deviation 2 put it before--sendand--tester-port. - N4 (doc-only, follow-up): TOOLS.md:904, in the row 178 proxy proof paragraph, still says "
stack-release.shpreserves both flags unchanged on re-pin and rollback". Now activate can set, replace or drop the pair, and a rollback to an unsupported copy drops it. The paragraph could point to "Pinned stack update" instead. No test reads TOOLS.md.