a gate checks that cited paths are in the repository
2026-09-01 · settled · DECISIONS.md line 1649
Maintainer ruling: build it. tests/untracked_pointers.py requires every round record's paths, and every rooted citation in a live document that resolves on disk, to be tracked by git rather than merely present. That is exactly the September failure: six rounds sat off main behind a merged badge, and the shared checkout carried them as untracked files, so dead_pointers.py passed locally and failed in CI.
Two things were wrong and both are fixed. No gate distinguished present from committed; this one does, and its self-test reproduces the failure by writing an uncommitted file and checking git does not see it. And tests/run.py ran only the self-tests of both pointer gates, never their real form, which is why the local run could report green against a tree CI would reject — both real forms now run locally.
Verified against a reconstruction of the original bug: an untracked round directory plus a citation to it passes dead_pointers.py and fails this gate with the right message, which names the stacked-merge cause.
Rejected alternative: folding it into dead_pointers.py. "You deleted something" and "you never committed something" call for opposite fixes and deserve different messages.
Touches
Nothing named.
Nodes pointing at it
None.