## What this is

`.spt/` is agent scratch — peer messages, commit and PR bodies, gate legs, run output, preserved evidence. **152 entries / 277 MiB** on the authoring box, none of it repo content, and nothing ignored it: a `git add -A` at the root staged every byte, including the 205 MiB `.spt/preserved/` tree.

This adds the one-line ignore — **after** moving out the six files the repo actually cites.

## Why the moves come first

`.spt/launch-battery.py`'s own docstring records that the original was **"lost with a `.spt/` sweep"** in 2026-09 and rebuilt at cost — while the register cites the tool twice. An ignore line institutionalizes exactly the condition that produced that loss: a file the repo depends on, invisible to git, one sweep from gone.

So every `.spt/` path the repo names moves out, and the line goes in behind them.

## The six moves

| From | To | Why |
|---|---|---|
| `.spt/rig/twohost-web-local.sh` | `.github/bench/` | **Was tracked** (`6f620ce4`, the W2 lane's record). A blanket ignore does not untrack a tracked file. Goes beside `wrap.sh` / `link-probe.sh`. |
| `.spt/preserved/pump-on-one-box-rig.patch` | `docs/spikes/` | **Was tracked**, same reason. An unapplied rig with its measurement in the header is a spike record. |
| `.spt/RCA-FLEET-DAEMON-14444.md` | `docs/` | Linked 4× from the register as `[[RCA-FLEET-DAEMON-14444]]`, existed nowhere but `.spt/`. |
| `.spt/PID-KILL-CENSUS.md` | `docs/` | IR-81 names it as its "Census body". |
| `.spt/launch-battery.py` | `.github/bench/` | Cited twice by the register; see above. |
| `.spt/RIDER-65S-DESIGN.md` | `docs/design/` | Its lane is still **live** — `fix/ir84-pump-peer-budget-instrument` is not an ancestor of main and IR-84 is absent from the register. |

## Four register paths fixed, one invisible to a path grep

`:4267` (ENV READ table row) and `:4304` (IR-81's census body) cite old paths directly. **`:4288` does not** — it reads *"the ENV face's fix is a tool in `.spt/`, not product code"*, naming the directory as a **category**, so the move makes the sentence false with no path for a grep to match. It now names the file.

`:4276` is deliberately **unchanged**: it says `launch-battery.py` with no path, and that stays true.

## Nine write-ups stay behind the line — each checked, not assumed

`ir79`..`ir83` drafts all landed (IR-79..83 each appear once in the register) · `ir37-redundancy-evidence` substance at `:2264`/`:2281` · `pr-rigports-body`'s two rows are in `FLAKE-LEDGER.md:50` and `INFRA-REGISTER.md:3886` with the same sha256 · `IR37-RIDER-NOTES`, `REAUDIT-REFS-6e075f7e`, `operator-brief-rc-panel` have zero citations anywhere.

## What this does NOT touch

Four `.spt/` paths remain cited in `docs/` — `preserved/w1-kitsubito-8d980fdf/nextest.raw`, the `golden-272-r3-drive` run log, `ws272-w1-gate/`, `twohost-web/none2/`. They are **machine-bound evidence paths that were never repo paths**: disk-local by design, already untracked, neither tracked nor deleted here. The `.gitignore` comment says so, or the next reader takes a register citation for a repo path and finds nothing.

Separately, **561 untracked gate-leg files sit at the repo ROOT** (`ASM22B_reap*`, `W2_check*`, E276/W3/W4 legs). Bigger population than `.spt/`, deliberately **out of scope** — this line does not grow root globs to chase them.

## Proof

- **All six hash-identical across the move** (sha256 before/after), and the two tracked ones verified as **pure renames** — same blob oid at old and new path, not a name match.
- `traceable-reqs check` → **exit 0**.
- `git status --short` → **zero `?? .spt/` rows**, six moved files tracked.
- The two new `.github/bench/` files checked against `bench_row_parity`, which **discovers** ledger writers rather than listing them: the `.py` is dropped by the extension filter, the `.sh` emits no `"step":` line, so neither joins that gate — and its `wrap.sh`/`wrap.ps1` positive control still fires.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_01WAw9XAcTR8oSwzYPsqZoY2
