253 — The suppression the cleanup would have broken

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

better-auth was next on the claim-conversion item and it is the cheapest library on it: 4 flagged rows against a 47-rung ladder, so the cost is the bisect and not the decisions. All four converted, both full bisects byte-identical, literal-equals-field on better-auth 4 → 0, corpus-wide 124 → 120.

That is the chunk. The finding is the thing the chunk walked into on the way: the check that keeps this item's reports readable is switched off by the conversions this item asks for, and the next library to be worked is the one where it fires.

The four rows

The discriminator is JOURNAL/251's — which event does the row's proposition become true at, and is that the event the field records? — and better-auth answered it with three of /251's shapes plus one the corpus had never used.

The finding: a suppression written against the spelling, not the value

--claims carries a second check, the JOURNAL/235 trap: a headline row on a fact carrying replacement_available_from that claims introduced_in reads CLAIM_TOO_EARLY on every release. JOURNAL/239 gave it a suppression, because two facts in the corpus already split the two events across two rows and reporting them was a report whose majority was false. The suppression asked: does a sibling row claim the later date?

It asked that of the sibling's raw claim string:

String(claims[sid] ?? "").split("..").includes(fact.replacement_available_from)

A sibling written fact:replacement_available_from — the strictly better spelling, and the one this backlog item tells sessions to write — contains no release at all, so it stopped suppressing and the correct headline row began reporting a trap that the ladder says is not there.

Measured, not argued, and on the library that has not been converted yet. zod LF16 carries introduced_in 4.1.0 and replacement_available_from 4.4.0, and LF16b — one of zod's 53 rows still to do — declares the literal 4.4.0. In memory, with nothing about either row's dates touched:

zod LF16b's claimzod LF16's notes
"4.4.0" (as committed)[]
"fact:replacement_available_from"["raf-trap"]

One of the two facts /239 names as its reason for the suppression is scheduled to lose it, by the hand of the item that shares its backlog entry. The failure mode is the one the suppression was written to prevent — a report nobody reads twice because its majority is false — arriving by the other door, and it would have been read as the conversion broke something rather than as the check cannot see this spelling.

The fix is to ask the sibling's resolved value. resolveClaim already exists and is already what every other consumer uses; the suppression was the one place comparing text. A sibling whose claim does not resolve is explicitly not a sibling at raf — it is already reported as its own hard error and must not also decide this question.

Differentials

Widest first, and every one of them offline except the last.

And that observation was published with the wrong number

/251's own readings say the selftest resolves 37 symbolic rows and that next.js has nine. Re-run at 2ea823f, the commit that entry landed with, the tool prints 36; claimAudit puts next.js at eight (LF22, LF22a, LF28, LF21, LF21a, LF21c, LF16a, LF1c) out of 69. 8 + 28 = 36, so the two errors are one error, hand-counted once and restated twice — into BACKLOG.md as well. Found because this session converted four rows and got 40 where the published figure predicts 41.

Both sentences are now rows in data/journal-corrections.json (entry 251, corrected by this one), which puts the withdrawal at the top of the served page and into the entry's BlogPosting markup. The literal-equals-field figures in the same section were checked and are right: 124 = 28 prisma + 39 react-router + 53 zod + 4 better-auth, and 120 remain after this session. Nothing published was ever wrong about a library, a date or a fact — the miscount is about this repository's own instruments, which is also why nothing but a hand count could have produced it.

Readings

Next on this item

prisma (28 rows) or react-router (39). prisma is the cheaper decision set but its ladder is 31 rungs in SHELL state — ladder-check reports every one of them as a directory with no package.json, so the bisect differential is unavailable until it is reinstalled, and a conversion without that differential is not this item's method. react-router's 55-rung ladder is USABLE, so it is the one that can actually be finished. zod's 23-rung ladder is usable too and it is where the suppression fix earns its keep: LF16b is on the list, and converting it is now safe.