---
name: a-tracked-only-corpus-cannot-answer-tracked-or-not
description: "A citation census built from a tracked-only corpus returns tracked hits BY CONSTRUCTION, so it cannot tell you which hits are tracked — and the gap gets filled by the file's PATH, which is not the discriminator"
metadata: 
  node_type: memory
  type: feedback
  originSessionId: 9a42c7a1-71f1-47b6-8341-adf7b3dbae7d
  modified: 2026-09-09T16:51:16.774Z
---

**Measured 2026-09-09, the root-scratch lane (PR #214), correcting doyle's census; he verified and
banked the correction himself.** 561 untracked files at the repo root had to be split into "cited by
the repo, so track it" and "uncited, so preserve and ignore it". The census grepped every filename
against a corpus built from `git ls-files`. Two files came back cited and were nonetheless put in the
bury class, labelled *"cited only from other root scratch"*:

- `W3-196-CENSUS.md` ← `W3-196-JIT.md`
- `WEBSERVE-272-JIT.md` ← `W3-272-MEASUREMENTS.md`

Both citing files are **TRACKED**. `git ls-files --error-unmatch` on each: YES.

**The mechanism.** A corpus assembled from `git ls-files` contains only tracked files, so **every hit
it can possibly return is a tracked citation by construction**. It has thrown away the
tracked/untracked distinction before the question is asked, and therefore cannot answer it. The
missing answer then gets supplied by something else that is ready to hand — here the file's **PATH**:
a `.md` sitting at the repo root *reads* as scratch. But this repo has **140 tracked root files, 134
of them `.md`**, so root-or-not was never the discriminator.

> **The discriminator is TRACKED-OR-NOT, never ROOT-OR-NOT** (or named-like-scratch, or
> looks-temporary). What decides a file's fate is whether the repo points at it.

**Why it matters:** burying those two would have left two tracked files citing paths that no longer
existed — the same shape as
[[ignoring-a-directory-buries-what-the-repo-cites-in-it]] **with the sides swapped**: there the
cited file was buried by a directory ignore, here by a misclassification of who was citing it. It
was caught only because the burial list was re-verified against the corpus a second time, by a
different reader than the one who built it.

**How to apply:**
1. **When a census's own construction guarantees a property of its output, it cannot also test for
   that property.** Before trusting a classification, ask what the corpus could NOT have returned.
2. **Re-derive the discriminator explicitly per file** — `git ls-files --error-unmatch <citer>` —
   rather than inferring it from the citer's path, name, or directory.
3. **Re-verify a burial list against the corpus a second time before burying anything**, ideally as
   a different reader than the one who classified it. Two files in 545 were wrong; both were the
   expensive kind.
4. **Measure the house convention before "tidying" toward an assumed one.** The same lane nearly
   relocated 16 cited files into `docs/intake|design|gate-records` — until `git ls-files | grep -v /`
   showed 140 tracked files already living at the root, 25 with `JIT` in the name. Relocating would
   have split siblings across two homes and repointed 18 citation lines to buy the split. The
   destinations were withdrawn; the files were tracked in place, and the lane's Class A half
   collapsed to a single `git add`.
5. **The rule the register now states (IR-91):** *a plan or record cited from a tracked file is
   itself tracked, at the path the citation already names.* Root is a legal home.

Kin: [[ignoring-a-directory-buries-what-the-repo-cites-in-it]] (same arc, sides swapped),
[[a-launch-time-spot-read-is-not-the-instruments-first-sample]] (a figure whose provenance the
instrument could not have produced), [[a-trap-entry-without-its-control-teaches-only-the-symptom]].
