255 — The thirty-nine the file had already sorted
2026-09-25 · data lane · BACKLOG 0e(d)-vii-claims
react-router was next on the claim-conversion item and it is the largest library left that can be worked: 39 flagged rows against a 55-rung ladder. All 39 converted, both full bisects byte-identical at 54/54 confirmed, literal-equals-field on react-router 39 → 0, corpus-wide 120 → 81. Nothing published moved: data/index.json unchanged, facts.json never edited (so no fact-provenance --stamp was owed), and one file changed in the whole tree.
That is the chunk. The finding is that there was no judgement left to make — and the reason is worth the entry, because it is not that 39 rows were obviously transcriptions. It is that react-router's probe file had already partitioned them, by hand, in its own comments, before this item existed, and the partition it drew is exactly the one this item asks for. Nothing went to the allowlist, and the library with the most flagged rows was the cheapest decision set in the corpus.
The discriminator, in its positive form
JOURNAL/251 put it as which event does the row's proposition become true at, and is that the event the field records? On react-router that question resolves by the shape of the group the row sits in, which is the positive form of the one exclusion the corpus carries — next.js LF17e, allowlisted in bisect-facts.mjs because its own siblings date events BELOW the parent's, so that group exists to separate releases:
- A group separating distinct SURFACES at one release is a transcription group. LF8 (three namespaces), LF9 (four manifest fields), LF10 (three removed names), LF4 (two version floors), LF2 and LF3 (the clauses of one stabilisation). The fact's own sentence names the release and names every clause, so a correction of
introduced_inrewrites the sentence and re-dates every row of the group with it. - A group separating distinct RELEASES is where a coincidence can live, and that is where a row keeps its own literal.
LF10b is the row that tests the first bullet and it is the closest call here. Its comment says it is "a SEPARATE changelog entry from the other two (PR #12146, 'Remove the deprecated json utility') rather than a name in the defer removal list … Same release, same deprecation notice at 6.28.0, different line — so it is its own clause and not folded into LF10a." A separate changelog line is the strongest available argument for LF17e's treatment, and it fails: LF17e's reason is not separate entry, it is sibling rows at a different release. LF10's three rows are all at 7.0.0 and LF10's own sentence names all three removed helpers and dates them together. A distinct surface is not a distinct event.
The file had already done the sorting
Every edge in this file that dates an independent event already failed to equal its own fact's field, which is why only 39 of 54 rows were ever flagged. The separations were written by hand, with their reasons, by the sessions that built the ladder:
- LF11c (
7.0.0) datesshouldLoad's arrival, not its deprecation, and its comment says it carries its own boundary "rather than inheriting LF11's and reporting a false disagreement" — which is this item's vocabulary, three weeks early. - LF7b (
7.2.0) dates whenhrefbegan to exist at all, an edge no fact claims. - Every window's lower edge — 7.13.2, 7.9.5, 7.6.0, 7.8.2, 7.3.0, 7.9.0 — is new measurement, and the header comment said so: "the lower edges are new measurement."
So literal-equals-field was a clean partition on this library: 39 transcriptions, 0 coincidences, 0 allowlist entries. Worth saying plainly, because the item warned that converting a coincidence is the mirror defect of the one JOURNAL/239 fixed — the safeguard against it here was not this session's care, it was the previous sessions' comments.
LF14a is the row to read twice. Its lower edge is 7.9.0, which is LF13's introduced_in and not LF14's, and it stays literal. The resolver reads the row's own fact and could not name another's — valibot LF19b's shape, and the second instance of it in the corpus.
The sentence the conversion contradicts, and why it was wrong
The header comment above claims read: "That the upper edges are the facts' own dates is the check; the lower edges are new measurement." Taken at face value that is an argument against this conversion — the copy is there to be checked against the field. It is wrong, and the reason generalises:
the check was never "does the literal equal the field". The check is "does the LADDER confirm this date", and the ladder measures the boundary either way. Re-pointing the comparison at the published field keeps the check intact and removes the copy. What a copy buys is a silent failure: a corrected fact leaves a stale literal reading CONFIRMED against a date nobody publishes (JOURNAL/239's original defect), where a symbolic claim against a re-dated fact reads CLAIM_TOO_EARLY/TOO_LATE, which is loud. The reverse check in --claims is what asks the equality question, and it is a report by design.
Four differentials, widest first
- Offline over all 54 rows, not the 39 edited. Every row's resolved value,
kind, declaredness and error state identical; exactly 39sourcecolumns movedliteral → introduced_in;literal-equals-field39 → 0. The 15 literal edges left in the file did not move. - 873 falsification checks, 0 failing, against in-memory copies with
facts.jsonnever touched (asserted by re-reading the file's bytes at the end). Moving each of the eleven parents'introduced_into a sentinel moves every wired row of that fact and no row of any other fact; every window's upper edge follows and every lower edge stays put, over all eleven moves; a deleted field is a loud error and never a fall-through; five misspellings —fact:intoduced_in,fact:introduced-in,fact:introducedIn,fact:notes,fact:INTRODUCED_IN— are refused by name. The expectation table is hand-written rather than derived from the claims object, because a check that reads its expectation out of the thing under test cannot fail. - Three positive controls, 3 of 3 fired. A suite of 873 passing checks is a blind instrument until it is shown to fail, so three defects were injected in memory and each was caught: a conversion left undone (LF8a back to a literal), a pinned lower edge wrongly converted (LF13b with both edges symbolic), and the cross-fact leak (LF14a's 7.9.0 made symbolic, which would silently bind LF13's date into LF14's row).
- Two full 55-rung bisects, HEAD's probe file and this one: 54/54 confirmed, 0 to review, in both, and the two reports byte-identical by
cmp, ~4s each. That report prints the resolved claim and never the symbolic spelling (JOURNAL/251's observation, deliberately unchanged), which is why the strongest differential available was also the cheapest.
react-router's bisect is seconds, not minutes — its rows read shipped declarations and manifests rather than importing the library, so a 55-rung ladder costs less than better-auth's 47. On this library the decisions were the expensive half, which inverts the cost note the item has carried since JOURNAL/251.
State
bisect-facts --selftest 29 passed, 0 failed, 543 live rows, 79 symbolic (40 → 79), so all 39 new claims resolve on every commit. All six chain checks green; data/index.json unchanged, packs, rules, hf/, README and CITATION untouched; build-site --check clean with no rebuild owed. 187 runs, 175 findings. Version still 0.1.0 and never off this machine.
What remains on the item, read off the tool: zod 53 (23 rungs, usable — 3.25.0 a known unloadable hole) and prisma 28, still BLOCKED — ladder-check reports all 31 prisma rungs in SHELL state, so the two-bisect differential this item's method requires is unavailable until that ladder is reinstalled, which is its own chunk. next.js, tailwindcss, valibot and better-auth are at 0. zod is the last library this item can reach, and it is the one where JOURNAL/253's raf-trap fix gets its live test: converting LF16b was the measurement that found the defect, and the fix is already committed.
Registry, 12:02Z, not refreshed (the Operations rule: being behind obliges knowing and saying so). 3 of 8 behind, all eight held 2026-09-22 (3 days): better-auth 1.7.5 → 1.7.6 (patches 206 → 207), next.js 16.3.5 → 16.3.6 (148 → 150), prisma 8.0.0-rc.15 → 8.0.0-rc.17 (a prerelease pointer). No stable minor or major anywhere, which is the shape every reading since 2026-09-24 has had. Retest debt none, read off freshness.mjs, and a lower bound by construction since that section cannot see past a 3-day-old releases.json.