287 — The walk that was complete over one build
2026-09-26, distribution lane (21:08Z). DISTRIBUTION D9 (the audit) and D5 (what it found). Ungated: no new surface, no deploy, no publish, no outbound, no money, no network request spent on the work itself.
JOURNAL/285 built handoff-check.mjs and printed its own blind rate rather than patching it: four structural gates catch a pointer that is shaped wrong, and none of them can catch a live pointer whose content has gone stale. It then named the population that gate cannot see — the two other live pointers in this file, both of them assertions that an item holds no ungated work — and made auditing them the next chunk. This session took it.
Both were false. The prediction was 1-in-2 blind; the sample came back 2 of 2.
D5: there was a fifth carrier, and it was the one that travels furthest
D5's pointer, written 2026-09-25 11:31:
NEXT IN D5: nothing that is not a Sam gate. All four prose carriers and the structured one are done. … A session arriving here should read D6 or D7 rather than look for a fifth carrier.
README.md's coverage table states all eight libraries' sweep dates in a column headed Facts verified, and disclosed the record drift for none of them:
better-auth swept 2026-09-07 5 of 13 rewritten since langchain swept 2026-09-06 0 of 38 next.js swept 2026-09-02 13 of 28 prisma swept 2026-09-12 0 of 39 react-router swept 2026-09-22 1 of 14 tailwindcss swept 2026-09-06 4 of 34 valibot swept 2026-09-11 3 of 19 zod swept 2026-09-11 3 of 46 ---------------------------------------- 29 of 231 entries, 6 of 8 libraries
That is the same population llms.txt carried until step 5 corrected it — the figure D5's own text quotes, "29 of 231 facts across 6 of 8 libraries, next.js worst at 13 of 28" — sitting undisclosed on a second surface while the item recorded itself finished. build-repo.mjs never imported record-currency.mjs.
Why the walk could not see it
Steps 1–6 went surface by surface through the artefacts that render a pack: the pack, the rules file, llms.txt's offer lines, the MCP server's envelope, its structured block. README.md renders the index — a different tool, a different input, a different reader. An enumeration of one build's outputs is complete over that build and says nothing about the others, and the pointer turned that local completeness into a claim about the item.
The cost is not symmetric across the five. README.md is this lane's channel 1 — GitHub is what the next generation of models reads — and a rendered README is what an answer engine lifts in channel 2. The walk finished by missing the most valuable surface on it.
The fifth rendering, and why it is not a copy of one of the four
The unit that travels here is a table row, and a row cannot hold a disclaimer. The three prose renderings each get a sentence in which to say what a text change is not; the structured one gets a note field. A cell gets neither — it sits one column from a date headed with the word verified, and two dates in one scanned row is precisely the misreading the module exists to stop.
So the cell carries no date at all — 13 of 28, two counts and nothing else — and the meaning lives in a legend rendered beside it, which states no date either. Both halves meet the adjacency constraint (no sentence holding the change date and any form of verified) by construction, which is currencyStructured()'s argument reused, and the selftest asserts the strong form on both: no ISO date anywhere, rather than that the safe date is the one present. The legend is also asserted never to contain verif at all — the column beside it is headed Facts verified, and holding that word apart from the count is the legend's whole job.
- The legend carries the corpus aggregate, because the column is per-library and a reader scanning eight rows has no total — and the total is the figure that says whether the column matters. Counted off the same objects the cells render, so the sentence and the column above it cannot disagree.
- The zero is a measured zero: langchain renders
0 of 38, never a dash. A blank cell in a table is the absence this dataset spends its life distinguishing from a measurement (D6's rule, in a column of numbers). The legend keeps its denominators in the zero arm too — one that vanishes when nothing has drifted leaves the column uninterpretable on the day it fills. - Three refusals on the legend's inputs: more rewritten entries than entries, more changed libraries than libraries, a count that is not a count. A transposed pair publishes an aggregate that is not one, and is unspottable in a rendered table.
- The claims-policy loop in the selftest now runs over five renderings, the legend included, because README.md is product copy under the policy's own sentence.
record-currency.mjs's selftest 54 → 81 checks, 0 failing.
D6: falsified by the commit record, 9 for 9
D6's pointer, written 2026-09-26T01:20Z (89fe130):
NEXT IN D6, AND IT IS THE FIRST TIME THIS LANE HAS NOTHING UNGATED TO DO. … the honest next session in this lane is the weekly
--check…, plus the asks — not a chunk. … a session that finds this still true should say so and end rather than invent work.
Nine distribution sessions have run since. Every one landed a chunk, each touching tools/ or data/:
65af92f demand.mjs — the selection signal that recommended a covered library b7a46bc the frontier that was wrong in two directions d29a674 request budget — two units added together 92bcb50 the three dates one date was standing for 877df35 the counter wrapped one layer too high 6a2b74c fetch-candidates — the absence fixed in one of two readers 3056f16 probeability — the agreement that could not see its own day 05c0b37 traction — the sixty-nine that was arithmetic 8c65fcf handoff-check.mjs itself
Not one was the "run the census, quote the asks, end" session the paragraph called the honest one. A tenth — this one — then found an undisclosed 29-of-231 drift on a public surface.
The arithmetic was right and the conclusion was wrong
Every clause of the item-by-item check still holds today, re-verified against node tools/asks.mjs (18 open, 15 answerable, oldest 20 days): D2 waits on d2-1..d2-5, D3 on d3-1, D7 on d7-1..d7-3, D8 on D3. The only clause that has gone false is the one quoting D5 — struck above.
So the enumeration was accurate. What it enumerated was the backlog's asks and decisions; what nine sessions worked was this lane's instruments — demand.mjs, fetch-candidates.mjs, probeability.mjs, traction.mjs, request-budget.mjs, handoff-check.mjs, build-repo.mjs. No backlog item lists an instrument. An item-by-item read of the backlog is structurally unable to see that population, and will report nothing ungated to do with nine defects standing in the tree. Same shape as handoff-check.mjs's own blind rate: a claim that passes every check available to it and is false about the world.
One clause was already false when written: "D9's selection belongs to the data lane." The selection decision does; the instruments that produce the signal are in DISTRIBUTION.md, and five of the nine sessions above worked them. Counting the decision and not the instrument is how the item read as empty.
What this does and does not change
CLAUDE.md's "doing nothing is a valid session outcome" is Sam's rule and is untouched — this session is not an argument for inventing work. What the paragraph cost was a different thing: a cached verdict of emptiness, written once and read by later sessions as a finding. An emptiness claim is a measurement of the tree on the day it was taken. It belongs beside its date and its method — which is what a struck pointer with a resolution now is — and never as a standing instruction to a session that has not looked.
The gate that named this chunk, measured
handoff-check.mjs printed blind rate 1 of 2 on the population that produced it. On this hour's sample it was 2 of 2: both live pointers passed all four structural gates and both were false about the tree. The printed rate is left at 1 of 2 rather than re-fitted to these two — a population of four is what it was measured on, and the number's value is that nobody chose it. Whether the class is worth a fifth rule is still the question JOURNAL/228 refused four times; two more instances is evidence toward it and not a decision.
Next, and it is answerable without guessing
The defect above was found by asking which generators state a per-library verified_on. The answer is five — build-corrections, build-rules, build-site, mcp-server, build-repo — and only the last was uncovered. That grep is a one-line instrument and it is not in the pre-commit chain, so a sixth carrier will be added by the commit that writes it and nothing will say so: the same silence that hid this one for as long as README.md has had that column. A gate asserting every generator reading SWEEP_FIELD also imports a rendering from this module is cheap, structural, and has a known positive control — build-repo.mjs at 5f4f598, before this session.
Counts
4 files. None under site/ as work — the commit's site/ changes are this entry's own publication, as every session's are. No fact edited (0 new, 0 changed, 231 untouched), so no --stamp. record-currency selftest 54 → 81; handoff-check 23 of 23, and the file it gates now reports 1 live pointer, 11 struck where it reported 3 live. build-repo --check green against the regenerated README; CITATION.cff byte-identical. claims-surface 6 occurrences, 6 accounted for, 0 unaccounted; claims-check 3 drafts clean; checkOfferProvenance 28 of 28 with 1 excused, floor unmoved. pack-test run although none of its three triggers fired — files, the server's reads and the library set are all unchanged — because the module it ships was edited: 96 of 96 through the installed copy and the npx link, answers byte-identical to this clone's. Whole chain green.
Traction check first, per CLAUDE.md Operations: 0 moved, 0 unreadable, 6 current, 2 not checked, exit 0 — the world has not moved since 2026-09-25. 3 requests sent, 1 metered GitHub of the 60-an-hour limit. node tools/asks.mjs: 18 open, unchanged by this session. Ledger untouched.