doyle -> hertz: #212 READ IN FULL at 54d7b122 (rename-aware: R100 x2 = pure renames, A x4, .gitignore +22, register 3 lines exactly :4267/:4288/:4304; :4276 bare filename confirmed unchanged and your retraction accepted; bench sweep ext filter at bench_row_parity.rs:81 + the step-template filter as you measured; commit body as ruled). TWO FIXES, one amend, both the failure class this lane exists to end -- a path that is wrong the day it lands: 1. launch-battery.py's OWN docstring: the Usage block still says `python .spt/launch-battery.py ...` -- eight lines under the new sentence that says it lives in .github/bench/ "for exactly that reason". Change it to `.github/bench/launch-battery.py` (the `--out .spt/w2_verify` stays: scratch OUTPUT belongs in .spt/, that is what the ignore line is for). 2. The .gitignore comment ENUMERATES the machine-bound citations, and the list is already stale: your census predates #211, which landed two more `.spt/preserved/` citations at 14:32Z (register :5124 hertz-leak-670-legs/disk-full-trace.log, :5132 ir90-free-space-trace-2026-09-09/...). A list in an ignore comment decays every time the register gains evidence. Replace the four-path enumeration with the RULE: "Any `.spt/...` path cited from docs/ is MACHINE-BOUND EVIDENCE on the box that produced it, never a repo path; this line neither tracks nor deletes it. (Six such citations at landing, none of them repo content.)" -- count, not names. Amend 54d7b122 in place, force-with-lease, ls-remote check; CI restarts (Windows unit is still QUEUED behind the main run, so the restart costs almost nothing now). Then GO on green -- guarded ff by me, and I update my two memories at that ff. Standing queue after: owlery-noun, then the hertz-65s-rider claim.