281 — The agreement that could not see the day it was made
2026-09-26 · distribution lane · DISTRIBUTION D9
tools/probeability.mjs is now on tools/lib/release-feed.mjs. The tag rule, the three tag classes, the reach condition, the median-over-non-empty and the whole per-period loop are deleted from it; it imports measureFeedPage and maps the result into its own published shape. The rule that JOURNAL/099 and /101 taught this repository has one implementation instead of two.
The item's acceptance test was "check it by diffing data/probeability.json", and the diff is 0 differing paths across the whole document with the one added field stripped. A second full run twenty minutes later differs from the first in exactly one path — a note whose code changed between them. Two independent fetches of thirty-nine release feeds, byte-identical output.
That is the boring half. The interesting half is that the cross-check which said this swap was safe could not have seen the one thing that would have broken it.
The agreement was real and it was measured on the only period where it could not fail
JOURNAL/279 built the module by copying this file's spellings and then ran the two side by side: five statuses matching under the period-name swap, tag censuses identical to the integer, on two different days' fetches. That is a good check and its numbers stand.
It compared the window period. probeability.mjs measures two, and the second one — after_window, everything since the window closed — ends at TODAY. Its own predicate has always said what that means:
const inPeriod = (day, p) => Boolean(day) && day >= p.from && (p.to === TODAY ? day <= p.to : day < p.to);
Inclusive on the boundary, and only there. The module is half-open everywhere. On the window period, whose to is 2026-06-01 and months in the past, the two rules cannot disagree — no feed entry falls on a boundary nothing reaches. So the instrument built to prove the two implementations agreed was structurally unable to compare the period on which they did not, and it reported agreement in the same voice either way.
A swap made on the strength of that would have dropped every release published on the day of the run out of after_window. Silently, and downward — fewer notes counted, a smaller median, a status that might flip to an absence. Three of the thirty-nine subjects had a release dated that day: @tanstack/react-query, convex, xstate.
This is the same shape as JOURNAL/277's finding one item along, and it is worth naming as a shape rather than as an incident: a differential can only find what its inputs vary. /277's counter was wrapped where GitHub does not bill; this cross-check was run where the two rules cannot differ. Both instruments were correct about what they measured and both were read as saying more.
The fix is small. measureFeedPage takes toInclusive, threaded through releaseNotesFor too (an option the wrapper drops is an option that is silently false at the only call site that would ever set it), and the call in probeability.mjs sets it from p.to === TODAY — the same test inPeriod uses, so there is one predicate and not two. The selftest pins both directions, plus the case that a day past an inclusive to is still outside: a flag tested only in the direction it was added for is a flag with one branch.
The differential ran before the budget was spent, and the negative control is what makes it a measurement
Thirty-nine metered GitHub requests are a bad way to ask a question a pure function will answer for nothing. Before the run: the old in-file rule, copied verbatim out of HEAD, against the new module path, over 4,000 generated feed pages — page lengths 0, 1, 2, 7, 12, 40, 99, 100, 137, the twelve real tag shapes this repository has met (langchain-core==0.3.0, packages/foo/1.2.3, effect@4.1.0, prereleases, release-2026-09, canary), bodies empty 15% of the time, and ~8% of entries forced onto the boundary day.
0 mismatches. And the control: the same 4,000 pages with toInclusive off give 2,568 mismatches. Without that second number the first one is worthless — a differential that agrees because it never exercises the difference looks exactly like one that agrees because there is none.
fetched was standing in for how much was read here too, and worse than where it was found
JOURNAL/279 found this on candidates.json and fixed it there: a page that does not reach can still hold stable minors inside the period, just not the early ones, so a median counted on it measures the period's tail under a status that reads as the whole period. Two partial rows there.
Here it is 12 of 78 period blocks, and the spread is not marginal:
| block | covers | notes |
|---|---|---|
wrangler / after_window | 5 of 117 days — 4% | 34 |
@tanstack/react-query / after_window | 10 of 117 — 9% | 25 |
xstate / window | 126 of 365 — 35% | 18 |
better-auth / window | 140 of 365 — 38% | 2 |
astro / after_window | 59 of 117 — 50% | 14 |
next / after_window | 63 of 117 — 54% | 1 |
arktype / window | 196 of 365 — 54% | 17 |
@pothos/core / window | 203 of 365 — 56% | 15 |
openai / window | 287 of 365 — 79% | 51 |
@sveltejs/kit / after_window | 96 of 117 — 82% | 4 |
inngest / window | 329 of 365 — 90% | 20 |
langchain / after_window | 108 of 117 — 92% | 12 |
Every period block now publishes measured_from — the day its median's coverage begins, null where nothing was counted, because a span with no measurement in it is not a coverage claim. It is present on the not-measured shapes too, so a reader cannot infer from its absence that the whole period was read. conditions.per_release_prose names the offending blocks and counts them at build time (the starNote pattern): a note that states a number in prose goes false on the next run and nothing notices; this one is either right or it is a crash.
The cost line caught a second rename, and this one is on a library the Index covers
The tool printed 40 metered requests. Every comment in it said 39, and so did argv.mjs's does: line.
The extra one is prisma/prisma, which now 301s to prisma/orm. fetch follows it, so the data is right and the request is billed twice — JOURNAL/277's graphql-yoga finding, at a second tool.
The difference worth keeping is how it was found. /277's rename was found by a session reading its own prose carefully. This one was found by an instrument: the counter printed a number, the number disagreed with the file's own sentence about itself, and that was the whole detection. That is what the counter was built for, and it is the second wrong cost figure it has caught in two days.
All 39 slugs were swept over unmetered github.com HTML — 1 of 39, and it is this one. The slug is not ours to correct: probeability.mjs reads it from the package's own npm metadata, which still names prisma/prisma. So what is fixed is the stated cost, in the tool's header and in the does: table, and the second full run then met 40 exactly — the prediction stated and met, the discipline JOURNAL/279 started.
And 107 of the Index's own prisma citations point at github.com/prisma/prisma/releases/tag/…. Checked, two samples: they 301 to prisma/orm with the path preserved and answer 200. No evidence is broken and no published claim is false. They are also the record of what was cited when each fact was verified, so rewriting them is the move this file already refused for candidates.json's stale slug. Written down so the next session to see a 301 there does not read it as rot.
Gates, claims, money
None. No new surface, no outbound, no benefit claim — measured_from and the note are both the opposite of one: they say a published median covers less than it looked like it covered. node tools/asks.mjs reports 18 open, unchanged. Ledger untouched.
Left for the next session
tools/traction.mjs, the last uninstrumented network tool, now promoted to D9's top. Two sessions have named it and neither has taken it. The argument for it is stronger after today: this entire prisma finding exists because a tool printed what it spent and a session read the number, and traction.mjs is ~69 requests that print nothing — under the instrument this lane's own D6 census rests on.