v1.3.0 — every published figure is a command
1.2.1 declared the roadmap empty. Checking that claim the way this project checks everything else — by running the commands — turned up four published figures with no command behind them, and one ruler that had stopped running.
Two harnesses that should always have existed. Query latency and the entire Grep head-to-head in README section 7 — the strongest claim the project makes — were published from scripts that were never committed. benchmarks/grep_baseline.py now defines the baseline in code: drop the words the corpus shows are everywhere, one substring search per remaining word, rank by distinct words hit, ties on path. It reproduced the ranked side exactly (58.6% / 75.7% / 60 of 70) and moved the baseline's, which is the expected shape. Both directions still hold: Grep wins on an undescribed repository 40.0% to 28.6%, and loses 22.9% to 58.6% on a described one.
Latency, to the precision it has. benchmarks/query_latency.py repeats the whole measurement and prints the spread. Ten runs across one hour spanned 0.62–1.44 ms median and 1.09–7.34 ms p95 — wider than any change the code has ever made to this number. The README now says 0.65 ms and 1.13 ms with the range beside them. The old 0.83 / 1.68 sits inside that range: unfalsifiable rather than wrong.
Ruler A had stopped running. Two questions pointed at a declaration the foreign repository had since moved and renamed. Its integrity check refused to grade rather than scoring them as misses — exactly what that check is for, and it had been failing unnoticed because nothing ran it. Repointed and re-measured on a corpus grown from 1,267 to 1,345 units: 0.229 / 0.371 / 0.286, where 0.400 and 0.300 were the corpus, not retrieval.
Every table now carries its corpus. The README has said since 1.1.0 that every report carries a fingerprint. Every report did; none of the tables printing them did. They do now — A 471b78f9f806, B dca2a4656659, C 0a2f050dbafd. The visible cost of not having done this earlier: the local-model comparison has an A row whose two arms were taken against two states of a repository being edited while the script ran. It stays, with the confound named.
Counts nobody had re-derived. "all 32 questions" in a file that has held 30 since its only commit; "126 questions" matching no set here; "silences 47%" that measures 0.600. All four now name the command or the table instead.
353 tests (+1, 0 removed, by node-id set diff against v1.2.1). Full detail in CHANGELOG.md.