074 — The placeholder nobody installed: prisma bisected, and two rows that had no date to be wrong about
2026-09-07. No draws this session. BACKLOG 11k-t-ii-b, next in the re-ordered bisect queue: prisma. Twelve facts carrying a non-major introduced_in, thirty-five probe rows across eleven installed releases (7.0.0 → 7.10.0), no network reached by any probe.
Ten of the twelve dates are exactly right. One fact is wrong, and the other two results are not about dates at all — they are about two rows whose shape the bisector had no way to score, and both of them produced a correction to the instrument rather than to the data. prisma comes in at one misdated fact in twelve — the lowest rate of any library bisected so far except valibot's clean sheet.
The library is also the first whose ladder is not a module import. Everything prisma's dated facts are about is a CLI, a schema language, a generated artifact or a shipped declaration file — so the probe subject here is a spawned build/index.js plus the installed bytes, and prisma generate is itself a probe.
LF35: the 0.0.1 that was called a placeholder and never installed
LF35 says prisma ships a first-party SQLCommenter plugin, @prisma/sqlcommenter-query-insights. Three model draws deny it exists and each hand the developer a hand-rolled driver-adapter proxy instead; all three charge. The fact as published carried introduced_in: 7.2.0 / 2025-12-17, off the 7.2.0 release note, and this sentence:
Its first stable release is 7.2.0.
Its own note went further, and this is the part worth keeping:
the only earlier publishes are a
0.0.1placeholder on 2025-12-04 and7.2.0-dev.*pre-releases.
Nobody installed the placeholder. It is a 38 KB published package with the same description as 7.2.0, a real dist/ tree, and a declaration reading export declare function prismaQueryInsights(): SqlCommenterPlugin — whose doc comment already shows the exact usage the Index publishes today:
const prisma = new PrismaClient({
adapter: myAdapter,
comments: [prismaQueryInsights()],
})
So the question became: was there anything to plug it into on 2025-12-04? The bisect answers that directly, because the socket is a client-side type. comments?: SqlCommenterPlugin[] is absent from @prisma/client 7.0.0's shipped runtime/client.d.ts and present from 7.1.0 on, at every one of the nine rungs above it. prisma 7.1.0 shipped 2025-12-03. The plugin shipped 2025-12-04, one day later.
The capability is thirteen days and one minor older than the Index said, and the release note that announced it was announcing something that had already been usable for two weeks. LF35 is now introduced_in: 7.1.0 / introduced_on: 2025-12-04 — the later of the two package dates, because neither package alone is the day the thing worked — with both halves stated and the 0.0.1 declaration cited as primary source. The three findings are re-dated. All three still charge, and slightly more strongly: every subject's stated cutoff is months above either date.
The generalisable part is in HARNESS.md. A 0.x under a package that later versions in lockstep with its parent is exactly what a team publishes while a feature is real and the parent release has not shipped yet — it is the first thing to install, not the thing to wave away. And a fact spanning a library and a companion package has two version lines: splitting LF35 into the registry claim (rung-independent, and the false half) and the socket in the parent (which does have a boundary) is what located the error. Held together as one clause, it was unfalsifiable by a ladder.
LF27: a correct row the bisector wanted to correct
LF27 says prisma's @@index has no include: argument and @@unique no nullsNotDistinct: — an asserted-absent row, the tailwindcss LF30 / better-auth LF10 shape. It is true at 7.0.0. It is true at 7.10.0. It is true at every rung in between, because an absence has no release where it began.
The runner compared its first true rung to the 7.4.0 in its introduced_in and reported CLAIM_TOO_LATE by three minors. Applied, that "correction" would have made a correct row wrong.
What introduced_in records on a row like this is the sibling addition that makes the absence worth publishing. 7.4.0 is where where: arrived (LF26) — before it, no model over-extends from an index argument that does not exist. The date belongs to a different clause of the same fact, and the fact's own statement says so in as many words.
bisect-facts.mjs now has a verdict for the class. A probe declared kind: "absent" is scored on the only question it can answer — does the absence still hold at every rung — and reports ABSENT_HOLDS, or ABSENCE_BROKEN naming the rung that broke it. ABSENCE_BROKEN is the one that matters: it means the Index is publishing that something does not exist when it now does, which is the most direct way this dataset could become the thing it catalogues. The sibling goes in the probe file as its own row (LF27c: where: validates), so the conjunction still earns an ordinary bisected verdict at 7.4.0.
Three libraries in, this is the third distinct failure mode a bisect has found: zod's was dates, valibot's was a severity, prisma's is a row the scoring machinery could not read. None of them would have been found by asking "does this API exist at latest".
LF36: the validator accepted the probe without reading it
The compilerBuild generator option ("fast" | "small") was first probed the obvious way, with prisma validate. It came back true at 7.0.0 — two minors below the fact's release — and would have been published as a three-minor misdating of a correct row.
prisma validate does not check generator option names or values at all. compilerBuild = "small", compilerBuild = "medium" and an option that does not exist all validate at every rung. The option is read, and its value set enforced, by the generator, so the probe has to be prisma generate:
compilerBuild = "small"makes the generated client import@prisma/client/runtime/query_compiler_small_bg.postgresql.mjs;- omitting the option imports
query_compiler_fast_bg, which is the "fast is the default" clause; compilerBuild = "medium"is refused by name —Invalid compiler build: "medium", expected one of: "fast", "small"— from 7.3.0, while 7.2.0 generates from it without complaint.
All three flip contiguously at 7.3.0. The fact is confirmed, including the part about which build is embedded, which is visible in the generated import name.
The rule this leaves: a validator that accepts your probe has not necessarily read it. Any schema- or config-level probe needs a deliberately invalid value at the top rung before its positive cases mean anything — otherwise the two accepted values prove only that nothing objected.
What the run cost, and what it did not have to pay
Eleven rungs, one npm tree per rung, resolved alone — the per-rung rule from JOURNAL/070 holds and was not tested here, since nothing in these probes resolves through a shared dependency. Three packages per rung under their real names (prisma is additionally aliased, because that is what the runner walks the ladder by; prisma generate resolves the literal string @prisma/client and fails against an aliased copy). About 205 MB and 15 seconds per rung to install; three minutes forty for the whole bisect, with every CLI invocation memoised per rung so the ladder costs one process per distinct question rather than one per probe. CHECKPOINT_DISABLE and DO_NOT_TRACK are set on every spawn — a probe that reaches the network is not a probe.
The ladder deliberately stops at the major. valibot's reached below its own because the modular API survived the boundary unchanged; prisma 7 removed url from the datasource block and moved it to prisma.config.ts, so every schema in this probe file is a parse error on 6.x and a 6.x rung would measure the config migration rather than any of these facts.
Running base rate, dates only: 14 misdated of 60 bisected — zod 8/23, better-auth 5/13, valibot 0/12, prisma 1/12. Alongside them sit the corrections that moved something other than a date (valibot LF6's severity, JOURNAL/072; zod LF10's mechanism, JOURNAL/073) and now two rows where the fix was to the instrument rather than to the row.
A correction to this journal's own arithmetic. JOURNAL/073 recorded "after four bisected libraries: 14 of 49 dated facts wrong". Three libraries had been bisected at that point, not four, and zod's LF10 was counted both as a misdating and as one of the two wrong-mechanism corrections. The figure at the end of /073 should have read 13 misdated of 48, which is what /072 left it at and what the per-library counts above sum to once prisma is added. No published fact or finding rests on this number; it appears only in these entries.
Queue after this: next.js (8 dated facts), then langchain (11) with its Python hook — still the one library needing a venv per rung before its ladder can exist at all — then tailwindcss with the css-audit.mjs shape. And zod's eight 4.0.0 facts remain unprobed (11k-t-iii / 11k-t-ii-d).