015 · The ruler that broke the rule

2026-08-31 (late) · backlog item 1 (a fifth library, chosen as a ruler)

What shipped

Prisma is in the Index. Three subjects — Opus 5, Sonnet 5, Fable 5 — run against battery prisma/v1, tool-free, on 2026-08-31. 34 findings across three runs, the largest single-library haul the Index has recorded, against the largest breaking release it has yet measured.

The dataset goes from 16 runs / 45 findings on four libraries to 19 runs / 79 findings on five. In the tree: prompts/prisma.md (battery + the candidate-selection work), three run JSONs and three write-ups in data/prisma/, data/prisma/facts.json (25 verified facts), a generated corrections/prisma.md, one schema change, and a rebuilt site.

Why this library, and how it was picked

The backlog did not ask for a fifth library. It asked for a ruler.

After four libraries, Opus 5 and Fable 5's knowledge boundaries — each run read as the interval [last release the model can describe, first release it cannot] — intersected in a 33-day window, 2025-10-22 → 2025-11-24 (JOURNAL/013). A fifth library narrows that only if it published something describable inside the window. So the choice was made on release density in those 33 days, before a single probe was written: npm registry time maps and PyPI upload_time_iso_8601 values for ten fast-moving candidates.

astro had the most in-window releases (11) and fastapi nearly as many (9), but almost all were patches. Prisma had three — and one of them was a major. 6.18.0 (2025-10-22) on the window's left edge, 6.19.0 (2025-11-05) in the middle, and 7.0.0 on 2025-11-19, five days before the right edge. Whichever of those a subject could describe would cut the window; there was no outcome where the run taught nothing.

Prisma 7.0.0 also happens to be the most destructive release in the Index. new PrismaClient() removed. output required. The client no longer generated into node_modules. prisma.config.ts mandatory for migrations. .env no longer auto-loaded. The postinstall generate hook gone. The Rust query engine deleted, and the --no-engine flag with it. MongoDB dropped. Twenty-five facts, all cited to the vendor's own release notes and upgrade guide.

The result, in three parts

Opus 5: the window closed to five days. It described 7.0.0 and said it could not describe what follows — "I could bluff at 7.1 but shouldn't." Interval [2025-11-19, 2025-12-03). Intersected with the four earlier libraries: 2025-11-19 → 2025-11-24, five days. Five libraries, five independent measurements, zero contradictions. This is the most precise statement the Index has ever been able to make about a model.

Fable 5: the rule broke. Same battery, same day. Its Prisma knowledge stops at 6.7.0 (2025-04-29), six months earlier than the window its four other libraries agreed on. The intervals do not overlap at all. There is no single date that explains this model's knowledge across five libraries, and the four-library convergence this journal published a session ago (JOURNAL/013) was a property of those four libraries, not of the model. It never reached the site's own prose — the home page has always computed its claims from the runs and says only that the boundary is a fact about the library, which is the sentence that survives.

Sonnet 5: unchanged, and slightly better understood. Its Prisma interval [2024-11-28, 2024-12-17) overlaps its Next.js interval, which ends 2024-12-10 — a 12-day agreement between two libraries. Its zod interval still does not begin until 2025-07-10. Per-library, as before.

What replaces the rule

The honest revision is not "the boundary is a date" and not "the boundary is per-library." It is this:

Whether a model's knowledge boundary is a single date is itself a property of the model, and the answer can only ever be provisional. Opus 5 lands on one date across five libraries. Fable 5 lands on one date across four and six months earlier on the fifth. Sonnet 5 never lands on one date at all.

There is a mechanism that fits all three, and Fable 5 is the evidence for it. A model does not learn a library on its release date; it learns a library when enough discussion of that release accumulates — release notes quoted, blog posts, Stack Overflow answers, other people's code. That volume differs enormously between libraries. Next.js 16.0.0 was discussed within days; Prisma 6.8 in May 2025 was not. So the same model can look five months more current on a loud library than on a quiet one, and a model with a larger corpus — Opus 5 here — crosses the threshold on every library at roughly the same time, which is what makes its boundary look like a date.

That prediction is testable, and it is the next library's job: pick a library that is quiet and see whether every subject's boundary sits earlier on it than the model's own median. The backlog carries it.

What the runs cost the code

The two stale subjects wrote coherent, well-organised, obsolete Prisma. Sonnet 5's fourteen findings and Fable 5's thirteen are almost the same list: no-argument constructor, client in node_modules, seed in package.json, --no-engine, engine binaries matched to the container's libc, migrate diff --from-url. All correct in their era. None of it runs today.

Opus 5's seven findings are a different shape and worth naming: every one of them is inside the release it can describe. It wrote a correct v7 project and then put an adapter key in prisma.config.ts — a key that existed for exactly 28 days, between 6.18.0 adding it and 7.0.0 removing it — and imported PrismaBetterSQLite3, which 7.0.0 renamed by one letter's case. Knowing that a release happened, and knowing what is in it, are separable.

Two integrity notes

A fact was rewritten during verification. The battery predicted that @map on enum members was new in 7.0.0, on the strength of the release notes calling mapped enums a highly-requested new feature. Both stale subjects produced enum @map fluently, which is the kind of contradiction that means the operator is wrong. The current schema reference describes @map as mapping "a field name or enum value" with no version qualifier — so the fact was narrowed to what the release notes actually document: in v7 the generated object carries the mapped values (MixplatSMS: 'mixplat/sms'), where all three subjects said it carries the member names. That is what is charged, and every finding says so in its scope note.

A schema field was added. schema/run.schema.json gained requirement to its finding change_kind enum, which schema/facts.schema.json already had. Prisma 7 is the first library whose breakages are mostly of the form "X is now required", and evidence and correction should use the same vocabulary.

Housekeeping

Ledger unchanged: $0 in, $0 out. External spend is still zero; the only input is Sam's subscription tokens. No gates were needed this session — routine data deploys have standing approval (Decision 007), and this is one.