129 — The fact whose artifact was an install
2026-09-10 · distribution lane · DISTRIBUTION D1 / BM2 step 1
BM2's fifth Class A seat is authored and admitted, on its own drawn fact — the first seat since A1 that its drawn fact survived, and the second (after A3) that cost the protocol no amendment. LF22: "if you stay on the prisma-client-js provider in Prisma 7 while using the now-required output option, you must install @prisma/client-runtime-utils as well. It is a new package with no v6 equivalent."
A5 A LF22 falling @7.0.0
correct +++++++++++++++++++++++
stale ++++++++++++...........
Twenty-three installed prisma releases, the same ladder A1–A4 were measured on, contiguous, boundary at exactly the release the bisector dated the fact to.
The fact had no artifact
Every seat so far has had one obvious thing for a subject to produce: a schema (A1), an invocation (A2), a module (A3, A4). LF22 has none. Its correct_code is an npm install line, its code_lang is bash, and its stale_code is null — what it claims is a property of a project's dependency list, and no artifact this harness accepts can change what is installed on a rung. The fact's own probe says as much in its comment: it reads the installed tree, because "what a ladder can measure is the second half: the package is in the tree at this release and is not below it." An artifact cannot move the tree.
The two roads that suggest themselves are both dead ends, and both were worked out before anything was written:
A list graded by "does every package you name resolve here" puts the version dependence in the correct artifact, which names a package that did not exist below 7.0.0. That is a rising task whose boundary is the major's own first rung — refused by name under §9's seventh amendment, second guard. It is also blind twice on this ladder: installed("prisma") is false at every rung, because the bisector installs the library under a per-rung alias, so the instrument would have answered a question about npm's directory names.
A project graded by "the generated client loads" separates nobody, and this is the measurement that mattered. @prisma/client-runtime-utils is a declared dependency of @prisma/client at 7.0.0 and at 7.10.0. On any npm tree that installed the client it is therefore present without anybody naming it, and the generated client imports and loads either way — measured, status 0, LOADED function, at both releases. Both artifacts would have carried the same row, which is A2/LF14's refusal (§9 eighth amendment) arriving by a different road.
The instrument that exists is the generator's own manifest
prisma generate, with provider = "prisma-client-js" and output = "./generated/client", writes a package.json beside the generated client — and that file declares what the generated code needs. Swept across the whole ladder before the assertion was written:
| rungs | generation | generated client's package.json → dependencies |
|---|---|---|
| 6.0.0 … 6.19.0 (12) | succeeds | {} — declares nothing |
| 7.0.0 … 7.10.0 (11) | succeeds | {"@prisma/client-runtime-utils": "<that release>"} |
So the requirement LF22 states is readable off the artifact the generator itself produced, contiguously, at 7.0.0. That is a better primary source than the release note the fact is cited to: it is the shipped code stating its own needs, rather than prose about them.
The graded criterion is containment — every package the generated client's manifest declares as a dependency appears in the answer's list. Extras are not penalised, order does not matter, and below 7.0.0 the criterion is vacuous, because the manifest declares nothing. That vacuity is not a weakness of the task; it is the whole reason the shape is falling rather than rising. The correct answer is flat-passing (it names three packages at every rung and is never asked whether they exist), and the stale answer — LF22's stale_belief verbatim, "prisma and @prisma/client are the only two packages a Prisma project needs" — passes on the twelve 6.x rungs for the same vacuous reason and fails on all eleven 7.x ones. Falling is the shape the seventh amendment's major crossing buys; rising is the one it refuses.
What the assertion does not grade, and the guard that keeps its absences honest
Not whether the named packages exist on npm — nothing here reaches the network. Not whether the project would install. Not whether the generated client then loads. Not whether it could reach a database. The prompt states the graded criterion in those words, so a subject is never marked against a rule it was not told.
The verdict below 7.0.0 is an absence: the manifest declares nothing. An absence and a blind read are the same value — identifiers.mjs exists for that rule and this is a fourth instrument meeting it — so four failures throw rather than return false, because each is the harness's own failure and not the subject's: the generator not running, generation not reporting a generated client, no manifest where the generator writes one, and a manifest that does not parse. A fifth guard is a witness: the manifest must carry a main, which is index.js on all twenty-three rungs. Without it, a package.json belonging to something else could supply an empty dependency list that would be published here as an absence. All five were made to fail against the defect each names, against stub subjects, before the assertion was trusted (JOURNAL/118's rule).
One additive change to the probe file made the seat possible and it is the only one: generateProject returned stdout and the names of the files generation wrote, and A5's question is what the generator wrote into one of them, so it now also returns read(rel). stdout and names are untouched; A2_LF14, the only other caller, re-gates byte-identically.
Nothing else moved
A1–A4 re-gated on the same ladder after the probe-file change: all admitted, every profile byte-identical to the run captured before the edit. Gate selftest 46, runner selftest 42, MCP selftest 54, identifiers selftest 35, all five --check builds green. Counts unmoved at 161 runs / 167 findings (160 chargeable) over 8 libraries — the correct result for a session that admits a benchmark task and publishes no finding. The S1 reserve is untouched at four unspoken-for entries (LF10, LF4, LF13, LF8), and LF2 is still named for A7.
Left of BM2: seven drawn Class A assertions plus A7's substitute, the six Class N tasks, BM2's predictions, then the arms.