## What this is

#212 ignored `.spt/` and named **561 untracked files at the repo ROOT** as explicitly out of scope. This is that half — and the same landmine: at `2037bcb8` a `git add -A` at the root staged all 561 (**47.7 MiB**; 268 `.raw`, 184 `.exit`, 87 `.md`, 7 `.out`, 4 `.log`, 4 `.done`, 2 `.txt`, 2 `.stackdump`, 2 `.sh`, 1 `.py`).

## The finding is about the CENSUS, not the files

The first classification put **two cited files in the bury class**. `W3-196-CENSUS.md` and `WEBSERVE-272-JIT.md` were recorded as *"cited only from other root scratch"* — but their citing files, `W3-196-JIT.md` and `W3-272-MEASUREMENTS.md`, are **TRACKED**.

The census corpus was tracked-only, so **every hit it could return was a tracked citation by construction**; the two were then relabelled by their **path**, because a `.md` at the repo root reads as scratch.

> **The discriminator is TRACKED-OR-NOT, never ROOT-OR-NOT.** A corpus that can only return tracked hits cannot tell you which of its hits are tracked — it threw the distinction away before the question was asked.

Burying those two would have left two tracked files citing paths that no longer existed: the `launch-battery.py` mechanism from #212 **with the sides swapped**. Caught only because the burial list was re-verified against the corpus a second time, by a different reader.

## Destinations withdrawn, and why

The first ruling relocated the cited files into `docs/intake/`, `docs/design/`, `docs/gate-records/`. But the root **already holds 140 tracked files** — 134 `.md`, 25 with `JIT` in the name (`IDLE-EDGE-JIT.md`, `W3-196-JIT.md`, `WEBSERVE-272-W2-JIT.md`, every `M*-PLAN.md`, `MESH-D*-PLAN.md`, `RESTORATION-D*-PLAN.md`).

The house convention is **measured, not assumed**: a plan or record lives at the root and is tracked. Relocating would have split siblings across two homes (`WEBSERVE-272-W2-JIT.md` at root vs `WEBSERVE-272-W3-DRIFT-RIDERS.md` in `docs/intake/`) and repointed 18 citation lines to buy that split.

So the **18 are tracked where they are**: zero moves, zero repoints, zero sha-transfer risk.

**The rule IR-91 states:** *a plan or record cited from a tracked file is itself tracked, at the path the citation already names.* What decides a file's fate is whether the repo points at it — not where it sits, not what it is called, and not whether it looks like scratch.

## What moved — nothing deleted

| class | count | destination | bytes |
|---|---|---|---|
| B — gate legs | 473 | `.spt/preserved/root-gate-legs-2026-09-09/` | 48,210,644 |
| C — uncited `.md` | 70 | `.spt/preserved/root-md-2026-09-09/` | 1,140,907 |

Each file hashed **before and after** the move; each directory carries a sha256 manifest re-verified afterwards — **473/473** and **70/70**, zero mismatches, files-on-disk equal to manifest lines. All 543 were word-bounded against the whole **911-file tracked corpus** first and had no tracked citation. The two that did are the two promoted to Class A.

## Five root-anchored ignore lines

`/*.raw` `/*.exit` `/*.done` `/*.out` `/*.stackdump`

Legs are the one class whose **future** instances are scratch by construction, so ignoring them institutionalizes no loss. **The anchoring is load-bearing**, proved with a negative control: `crates/probe.raw` is **not** ignored — an unanchored `*.raw` would have swallowed it.

`/*.md`, `/*.log`, `/*.sh`, `/*.txt` are deliberately **not** ignored. A plan or script dropped at the root must keep showing as `??` so the next census classifies it — that is precisely the pattern that produced this repo's 140-file tracked root corpus.

## Proof

- **Zero `??` rows at the repo root** (was 561).
- `traceable-reqs check` → **exit 0**.
- Both manifests verified after the fact: 473/473, 70/70.
- All five ignore lines checked **by path** with a populated pattern field; five negative controls pass.

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

https://claude.ai/code/session_01WAw9XAcTR8oSwzYPsqZoY2
