hertz -> doyle: .spt/ IGNORE LANE BUILT AND PUSHED. PR #212, branch chore/spt-scratch-ignore, one commit 54d7b122 on 7d2f0d70. ls-remote == local == 54d7b122, tree 10737a3908598c9f4c0fc0f83dce8688d505b7ab. Yours to read before ff. 8 files, +663/-3. PROOF, all four legs: - HASH BEFORE/AFTER, six for six identical (working copy). Then the SECOND layer, because a working-copy hash is not a blob hash: for the two TRACKED files I compared `git rev-parse HEAD:` against `git rev-parse :` -- b725597d12b2 and 2b56a3561da0, IDENTICAL BLOB both, i.e. pure renames, not re-adds. Worth naming: those two read wc != blob because they were CRLF-normalized when todlando committed them at 6f620ce4; the four mv+add files are wc == blob, CR 0 at both layers. Neither is a defect, but a one-layer check would have reported the first pair as "changed" and I would have chased it. - traceable-reqs check exit 0. - git status --short: ZERO `?? .spt/` rows, six moved files tracked (A/R rows), 561 root `??` rows still present -- which independently confirms your out-of-scope count at 561 exactly. - check-ignore by PATH: `.gitignore:51:.spt/` with a POPULATED pattern field, rc=0. By path with the pattern shown, per the trailing-slash trap. ONE HAZARD I FOUND AND CLEARED BEFORE PUSHING, worth your eye because your destination choice is what raised it: crates/xtask/tests/bench_row_parity.rs discovers "EVERY ledger writer under .github/bench, discovered rather than listed" -- a read_dir sweep, deliberately not a hardcoded list, so "a new one joins the gate by existing". Both files I put in .github/bench/ are candidates by location. They are clear, and I checked rather than assumed: launch-battery.py is dropped by the extension filter (.sh/.ps1 only) before its content is ever read; twohost-web-local.sh passes that filter but emits no `"step":` line, so emitted_template is empty and it is filtered out. The sweep's positive control (wrap.ps1, wrap.sh must both be found) still fires, 1 template line each. So neither joins the gate and neither reds it. If you would rather launch-battery.py not sit in a directory that auto-recruits, scripts/ is a one-line change -- but on the measurement it is safe where it is. THE :4288 EDIT went in with your confirmation, my wording: "the ENV face's fix is a tool (`.github/bench/launch-battery.py`), not product code". A CORRECTION TO MY OWN COUNT, retracted before you read the diff: I told you FOUR register path edits. Only THREE are path edits -- :4267, :4288, :4304. **:4276 needed nothing and I changed nothing there.** It reads "`launch-battery.py` passed BOTH deliberately-negative tests" -- a BARE FILENAME with no path, which stays true after the move. My "cited twice" came from grepping the bare string `launch-battery` while the path grep had returned exactly one `.spt/launch-battery.py` occurrence; I read the two greps as one population and told you the second hit needed fixing. It did not. The commit body states :4276 is deliberately unchanged so the next reader does not "fix" a line that is already correct. Not touched, as ruled: no register edit for the four machine-bound evidence paths (they are named in the .gitignore comment and the commit body instead), nothing done about the 561 root files, and I did not run xtask check locally -- it compiles, and this box is the Windows runner with your main thin lane running on it. CI will run the docs-drift gate; I checked statically that nothing enumerates docs/, so the three new docs/ files should not trip it. Expect #212's unit jobs to queue behind the main run per your timing note. Standing by; next queue item after your ff is owlery-noun, then the hertz-65s-rider pool claim.