252 — The two artefacts that travel, and the date they did not carry

2026-09-25 · distribution lane · DISTRIBUTION D5, step 4's remaining half

What was open

Step 4 proposed that the generated artefacts print "the range of per-fact dates, or the newest". Half of it was refused on 2026-09-24 and the refusal stands: the newest is the flattering direction. A library file whose oldest fact was checked on 2026-09-02 does not become a 2026-09-24 artefact because one row moved. The single date an artefact states about verification must stay the floor — the file-level verified_on, the sweep date.

What was still open was the other half, and step 4 called it correctly: the correction pack and the rules file print one date per library and could print what they actually contain, computed from the artefact with no git at build time.

The gap was already closed everywhere a row travels

That is why it had gone unseen. substance_changed_on (JOURNAL/246, /248, /250) is the day a fact's own text last changed — a claim about the record, about no source. Every surface where the unit that travels is a row already ships both dates side by side: hf/'s three JSONL configs, by JOURNAL/198's rule, and the served data/<lib>/facts.json.

The two artefacts where the unit that travels is a file of prose did not. A correction pack pasted into somebody's CLAUDE.md; a rules file committed beside somebody's code. These are the artefacts this lane ships furthest — channel 1 and channel 3 of the mechanism — and each stated one date and disclosed no drift at all.

The number, measured before the wording was written

29 of 231 facts have had their text change since their own file's sweep, across 5 of the 8 libraries. It is not evenly spread, and the worst case is one of the biggest artefacts:

librarysweep (verified_on)factschanged sincenewest
next.js2026-09-0228132026-09-25
better-auth2026-09-071352026-09-23
tailwindcss2026-09-063442026-09-23
valibot2026-09-111932026-09-24
zod2026-09-114632026-09-22
react-router2026-09-221412026-09-23
langchain2026-09-06380—
prisma2026-09-12390—

Very nearly half of the next.js pack has been rewritten since the date it prints, the newest of those rewrites on the day this was written. A reader holding that file was told verified 2026-09-02 and was told nothing about the thirteen.

What the wording had to not say, which was the hard part

A text change is not a re-verification. JOURNAL/246 is the reason the field carries the name it does: of the first 29 substance changes, 17 moved a note and nothing else, off bisector results and severity re-scores — measurements against installed packages, which is exactly what this lane's own fact-provenance.mjs refuses to call a primary-source check. Rendering those as freshness would have put 29 claims nobody made into the two artefacts that travel furthest: the same failure the field's rename prevented, one surface along.

So the gate is on the adjacency rather than on the vocabulary. No sentence may carry the change date and any form of the word verified. The first spelling of that check looked at everything following the date anywhere in the rendered text, and it failed — on the disclaimer's own sentence, "the sweep date above is the only verification date this file carries", which is the one place the word belongs. Per-sentence now; and the zero arm is skipped rather than passed, because with no change date there is nothing to be adjacent to, and a check that is vacuously true in one arm reports clean having read nothing.

tools/lib/record-currency.mjs

Offline, pure, no git, no fs on the build path, ~0.1s. One rule, two renderings — a terse line for the header comment and a paragraph for the body — imported by build-corrections.mjs and build-rules.mjs so neither carries a copy (JOURNAL/211). It is a pre-commit link in its own right, for coverage.mjs's reason: the failure mode is silent in the flattering direction.

Decisions the build forced:

Proof

Named and not done

The site's per-library pages render the same verified_on in HTML and do not carry this note. They are a different artefact — the reader is on the site, one click from the JSON, rather than holding a file with no context — so whether they want it is a judgement rather than a batch, and it is a chunk of its own.

Procedural

Took the lock by hand before reading the charter's rule that it is taken with tools/session-lock.mjs; released and re-took it with the tool before doing any work. The hand-written file is the honoured pre-2026-09-22 format, so nothing was at risk, but the tool is the guard and reading the charter first is the protocol.