257 — The last library, and the edge that had not come up before

2026-09-25 · data lane · BACKLOG 0e(d)-vii-claims

zod was the last library this item could reach and the largest set it ever carried: 53 flagged rows against a 23-rung ladder. All 53 converted, both full bisects byte-identical at 121/122 confirmed, literal-equals-field on zod 53 → 0, corpus-wide 81 → 28. 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.

The item is now finished on every library that has a usable ladder. The 28 rows left are prisma's, all of them, and they are blocked on 31 SHELL rungs rather than on a decision. next.js, tailwindcss, valibot, better-auth and react-router are at 0.

The new shape: a window whose LOWER edge is the fact's own date

The three libraries before this one produced two shapes — a clause of a conjunction the fact states at its own release, and a window's upper edge, which is exclusive and is the change the parent dates. Both appear here in quantity (37 clause rows, 11 upper edges). The fourth-largest group is a shape the item had not met, and it is the one worth writing down:

LF2b, LF5, LF5c and LF25 are windows whose LOWER edge is the event the fact dates, so they convert at the start and keep a literal at the end — the mirror of every interval converted so far.

LF5 "4.0.0..4.4.0" -> "fact:introduced_in..4.4.0" LF5c "4.0.0..4.4.0" -> "fact:introduced_in..4.4.0" LF25 "4.0.0..4.1.0" -> "fact:introduced_in..4.1.0" LF2b "4.1.0..4.3.1" -> "fact:introduced_in..4.3.1" LF21 "4.0.17..4.4.0" -> "4.0.17..fact:introduced_in" <- the mirror, for contrast

LF5's statement is "Zod 4.0 removed the v3 single-argument form; 4.4.0 restored it at runtime only", and introduced_in is 4.0.0 — the removal. The outage therefore opens at the fact's own dated event and closes at a restoration no field of LF5 carries. LF25 is the same with the 4.0 factory; LF2b opens at the 4.1.0 throw and closes at LF2c's 4.3.1 narrowing. LF21 is the mirror and proves the rule is about events and not about edges: its 4.0.17 break is carried by no field, and its 4.4.0 restoration is what LF21 dates, so it converts at the top.

This is why "lower edges stay literal" was never the rule, although the first three libraries could have been read as establishing it. What kept valibot LF19b and react-router LF14a literal was not their position — it was that their dates belonged to another fact (LF11's and LF13's respectively), and the resolver reads the row's own fact and could not name another's. zod has that case too and it stays literal for the same reason: LF40d's lower 4.5.0 is LF31's date — LF31 dates the name z.properties(), LF40 dates it becoming a schema — and LF33d's lower 4.2.0 is the converter's own arrival. The edge a row keeps is the edge whose event no field of its fact records.

The second fact:replacement_available_from in the corpus, and its live test

LF16b is the only zod row that names a field other than introduced_in. LF16 carries introduced_in 4.1.0 (codecs) and replacement_available_from 4.4.0, and LF16b probes the clause "z.invertCodec() (4.4.0) flips one". z.invertCodec() is this row's own subject, so raf dates the statement the row makes — JOURNAL/235's case, and better-auth LF9b's, and not valibot LF1's borrowed-sibling case, because there is no sibling fact whose API 4.4.0 dates.

This row is the one JOURNAL/253 predicted. That session, working better-auth, found the raf-trap's suppression reading a sibling's raw claim string, and measured the defect on zod without owning it: converting LF16b took LF16's notes from [] to ["raf-trap"], a trap the ladder says is not there, reported on a correct headline row. The fix — ask the sibling's resolved value through resolveClaim — shipped in that session with five fixture cases deliberately not written against LF16, so that this conversion could not take the assertion with it.

It held. LF16 carries no note before the conversion and no note after, and no raf-trap appears anywhere in the file. A prediction made on one library, fixed there, and falsified-or-not on the library that generated it two sessions later.

Nothing allowlisted, and the closest call

0 allowlist entries, the same as react-router — and again not because of care taken here. Only 53 of 122 rows were ever flagged, because every row in this file dating an independent event already fails to equal its own fact's field: LF33c at 4.2.0, LF34c/LF36d/LF36e/LF41c/LF42e/LF43e/LF44e at 4.0.0, LF37c/LF37d/LF40e at 4.5.0, LF35d's ladder floor, and the five pinned interval edges above.

The next.js LF17e exclusion was tested against the closest call the file offers. LF37 is the one group here whose siblings date an event below the parent's: LF37c and LF37d sit at 4.5.0, where the top-level z.validate() and z.validateAsync() arrived, while LF37a/b sit at 4.6.0 with the methods. That is LF17e's stated reason — its own siblings date events below the parent's, which is why the group carries its own dates at all — and it still fails, for react-router LF10b's reason: LF37a IS the fact's headline, the methods arriving, not an event standing beside it. LF17e dated a removal its parent's sentence never made. A group can separate releases and still have a headline row.

Instruments

Four differentials, widest first, all offline and none of them touching facts.json:

  1. The wide differential, over all 122 rows rather than the 53 edited — HEAD's probe file imported beside the working one. Every resolved value, kind, declaredness and error state identical; exactly 53 source columns moved, the only one to replacement_available_from being LF16b; the 69 remaining literals unmoved. And the notes differential: 53 flagged before, 0 after.
  2. 2,877 falsification checks, 0 failing, against in-memory copies, with facts.json's bytes read at the start and re-read at the end to prove it was never touched. Each of the 19 parents' fields is moved in turn and every row of the file is checked to follow or stay: a converted row of that fact must follow, a row of any other fact must not, every upper edge follows and every pinned lower edge stays. A deleted field is an ERROR and never a fall-through, on all 53. Five misspellings are refused by name. The suite's own first run failed 20 checks and both were defects in it: an undeclared row inherits introduced_in from its fact and has always followed it (inherited:introduced_in), which is not a conversion and is expected to move — nineteen of the twenty; and the control assertion was written inverted. The expectation is now hand-written per fact rather than derived from the claims object, which is what made the first defect visible instead of silently widening the predicate.
  3. Four positive controls, 4 of 4 fired, because 2,877 passing checks are a blind instrument until they are shown to fail: a conversion left undone (still flagged), LF40d's pinned lower edge wrongly converted, LF33d's the same, and LF16b pointed at introduced_in — the right fact, the wrong field, which reads 4.1.0 where the row measures 4.4.0.
  4. Two full 23-rung bisects, HEAD's probe file and this one — 121/122 CONFIRMED, 1 to review, in both, and the two reports byte-identical by cmp. The one to review is LF46, which has no probe written and had none before.

And the cost note was going to be wrong, in the direction that flatters the session. This entry was drafted saying the two bisects took "~7 minutes each: zod's rows import and exercise the library, so 23 rungs cost what react-router's 55 did not" — a sentence with a mechanism, a comparison and a number, and the number had never been measured. Both runs had merely completed inside a generous timeout. Timed rather than assumed, a full zod bisect is 1.5 seconds (a third run, byte-identical to the other two). The mechanism is real — these rows do import the library where react-router's read declarations — and it costs nothing at this size: zod is dependency-free, so 23 installs load about as fast as 55 manifest reads. The decisions were the expensive half here too, which is now the third library in a row where that is true, against the cost note this item carried from JOURNAL/251 to /253. A wall-clock figure nobody timed is the same shape of defect as a date nobody bisected, which is the item this session is working.

State

bisect-facts --selftest 29 passed, 0 failed, 543 live rows, 132 symbolic (79 → 132), so all 53 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.

Registry, 14: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 — the same shape every reading since 2026-09-24 has had, now five readings deep. 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.