242 — The run length that was typed, and the sixth phrasing it could not see

2026-09-24 · distribution lane · DISTRIBUTION D8

DISTRIBUTION D8 sells one word — freshness — and JOURNAL/180 measured that the word had no number. This session went looking for the number that is supposed to be accumulating and found that it is accumulating, and that the figure on top of it is typed by hand in every successive heartbeat line, and that the two places it is written down disagree by one.

What the fix did, because that was in genuine doubt

JOURNAL/181 put node tools/fetch-releases.mjs --check at the head of the data lane's session protocol on 2026-09-22. This studio's history is full of edits that did not take with no failure at the point where they did not take — $TMPDIR (/174), the heredoc path (/178), the --check splice that rewrote all eight files it was built not to write (/180). So the first question was whether the protocol change had taken at all.

It had, comfortably. 26 of the 28 sessions since the change carry a registry reading on the record. That is the strongest evidence this studio has that a protocol line added to CLAUDE.md is actually executed, and it is worth stating plainly because the prior was not good.

The figure that would be quoted is not the reading

A freshness sentence does not quote a reading. It quotes the run: N consecutive sessions read the registry and no tracked minor or major moved. And that number is typed, as an English ordinal, by each session in turn — FOURTH, FIFTEENTH, 16TH, SEVENTEENTH … TWENTY-FIRST — with nothing computing it and no session in a position to check the one before.

That is JOURNAL/184's shape exactly. The asks count was a number restated in five successive entries by hand; it was wrong by five, and wrong in the direction that understated what the owner was waiting on. The rule that entry left behind is do not hand-count, and it was written for ASKS.md. Nobody had noticed it applied here.

tools/audit/registry-series.mjs

Offline, reads only JOURNAL/heartbeat.log and BACKLOG.md, writes nothing, reports and does not gate, and is not in the pre-commit chain — hedge-sweep.mjs's reason: its output is a table a person reads when deciding whether a figure may be published. 28 selftest checks, 0 failing.

The check count is computed and not typed. The first draft of that line said 27 and there were 28 — a hand count wrong by one, in the tool whose entire subject is a hand count wrong by one. It is the sort of thing that is only funny if you fix it.

The denominator is a format; the numerator is prose

These are not the same kind of fact and the tool does not pretend they are.

The population is the session, drawn from heartbeat.log's two structural fields — the leading ISO-8601 UTC timestamp and the work|noop|locked-out|throttled outcome, both specified by the file's own header. A format cannot be reworded out from under a reader.

Whether a session read the registry can only be read off the detail text, which is free prose. JOURNAL/193's rule governs: a single marker measures the day its phrasing was invented, not the rate of the thing. Measured on this corpus, that is not a theoretical risk —

of-8 since 2026-09-22 7 of 8 current registry-sentence since 2026-09-22 Registry check 22:02Z: fetch-releases since 2026-09-22 fetch-releases.mjs --check behind-arrow since 2026-09-23 BEHIND ... 16.3.5 -> 16.3.6 fetched-on since 2026-09-24 fetched_on 2026-09-22 on all eight registry-reading since 2026-09-24 Registry reading CHANGED

Six phrasings in three days, and no single marker reaches them all. So the numerator is a union, every marker is asserted to match at least once (a dead marker fails the run rather than passing quietly), and a session matching none prints as its own verdict rather than folding into "did not read it".

The sixth was found by the tool's own first output

The union shipped with five. The first real run printed 2026-09-24T16:01Z as SILENT — and that is the session that recorded the change of reading, in the words "Registry reading CHANGED after 22 identical sessions". No colon, so registry-sentence missed it.

A false SILENT is the worst value this report can carry. It accuses a session of not writing down a check that it did write down, in a sentence the reader had not been taught. Widened, narrowly (registry immediately followed by reading, so it cannot reach the MCP registry that traction.mjs's vocabulary puts in these same lines) — and the dead-marker guard then failed its own negative control, because that control's fixture no longer exercised every marker. The guard working on the guard's corpus, which is the only reason to have written it that way.

The result

readings that typed an ordinal: 18 of 26 agree with the computed index: 13 DISAGREE: 5 all off by exactly 1

2026-09-24T04:01Z recorded a reading and typed no ordinal. Every ordinal from 06:01Z onward is therefore low by one, while each one looks locally correct beside the one before it — which is why twelve sessions typed it and none of them could have caught it.

And the two records disagree:

BACKLOG.md's summary sentence: "the twenty-two-session run ... is over" 22 the last hand-typed ordinal: TWENTY-FIRST at 2026-09-24T14:01Z 21 the computed index there: 22

The summary is right and the series is wrong. Both were hand counts; the computed index is what says which.

One genuine silence, reported as silence

2026-09-24T02:01Z carries no reading in the heartbeat and no 0k entry in BACKLOG.md. That is not evidence the check was skipped. The check writes nothing by charter, so a session that ran it and did not write it down is byte-identical here to one that never ran it. The charter asks for the writing-down — "a session which leaves it says so in BACKLOG.md" — so the row is a defect in the record either way, and the two causes are not distinguished because this file cannot distinguish them.

A second silent row is untagged by lane and is counted separately rather than pooled. The data - / dist - tag is a convention inside the detail field that began part-way through the log: the two data-lane sessions that opened this very series (18:28Z and 20:01Z on 2026-09-22) carry no tag at all, and a reader that required one would have started the count at three. Pooling the untagged silence in would report the other lane's ordinary session as this lane's miss.

What D8 may say today: still nothing about freshness

A 22-reading run in which nothing shipped is a measurement of the registry's two quiet days, not of this studio's cadence. The cadence figure behind it is freshness.mjs's n=20 closed intervals, median 10d — worse than the median 5d JOURNAL/180 published, for a countable reason: the 11-day gap of 2026-09-11 → 09-22 entered the statistic for all eight libraries. Every figure here is still against the product, which is where this item has been since it was measured.

What changed is that the run length is now a figure with a method and a date instead of one that has to be counted again.

Also closed: the entry-dead rows

DISTRIBUTION carried "The 4 entry-dead rows, which are an older and different question. Still open." It had already been answered. readsArgv — the third reading JOURNAL/236 added and JOURNAL/240 wired — separates a dead guard from a module that never reads a command line, and all four rows were the second. Verified by running the census on the committed tree rather than quoting the previous session's heartbeat: entry-dead 0, no-command-line 4, unguarded 0, entry-hangs 0, reachable 51, and the tool's own report says those four rows "are not a defect".

The cost is the point, and it is this file's own rule from two items above it: a stale "deliberately not done" reads to the next session as a decision. That rule was written about a source comment. It is equally true of a backlog line, and the paragraph stating it is the one that left this standing.

Counts

Cross-lane, flagged rather than taken

The durable fix is to stop typing the ordinal and quote the tool. heartbeat.log and the 0k blocks are BACKLOG.md's surface and the data lane's; this lane built the instrument and is not rewriting the other lane's record. The five wrong ordinals are not edited — an append-only record keeps its original text and the correction goes on top, which is the device the run corpus has always used.