123 — The answer that is not the documented one

2026-09-10 · distribution lane · DISTRIBUTION D1 / BM2 step 1

BM2's third acceptance assertion is authored and admitted. A3 — LF3, the datasourceUrl constructor option was removed in 7.0.0 — is falling @7.0.0: the correct solution passes all twenty-three rungs, the stale artifact passes exactly the twelve 6.x ones. It is the first BM2 seat that cost the protocol no amendment. What it cost instead was an instrument the harness did not have, and a reference artifact that is deliberately not the answer prisma's own documentation shows.

A constructor-option fact has no cheaper instrument than the constructor

The three helpers the prisma subject already had answer three questions: what the CLI says (cli, inProject), what a schema validates to (validate), and what generation wrote (generateProject). LF3 is none of those. It claims that constructing a client this way stops working, and the only thing that can be asked is a constructed client.

So tools/audit/probes/prisma.mjs gained runWithGeneratedClient(source). It generates a client once per rung from a schema the harness fixes, writes the produced module beside it, and imports it from a harness entry that reports whether a client came back. The produced artifact is therefore the source of a module, not a module the gate imports — produced: { form: "text", as: "source" } — because the answer must run where @prisma/client resolves to that rung's install, which is neither this repository nor the runner's session directory.

Three choices are baked into that harness schema, and each of them could have put a second boundary into every task that ever uses it. All three were measured:

The reference is the pool form, and the documented form was refused on evidence

prisma 7's docs construct the adapter as new PrismaPg({ connectionString }). That is the answer a reader would write, and it is the wrong artifact to commit here. It has a boundary of its own: @prisma/adapter-pg 6.0.0 throws PrismaPg must be initialized with an instance of Pool, and the object form starts passing at 6.6.0. That boundary is the adapter package's, not prisma's — JOURNAL/070's trap arriving through a peer dependency instead of through a shared node_modules. A falling task's correct solution has to be flat-passing or the task has two boundaries and its results could not say which one they measured.

Demonstrated rather than argued, which is JOURNAL/118's rule: with the object-form reference committed in place of the pool form, the gate refuses A3 —

  REFUSE A3   A  LF3   falling   @7.0.0
         correct  .....++++++++++++++++++
         stale    ++++++++++++...........
         both artifacts carry a version dependence — the correct solution rises and the stale one
         falls, so the task has two boundaries and the results could not say which one it measured

The pool form passes on all twenty-three rungs and is a correct answer at 7.10.0, which is the only thing a falling task's correct solution is for. Subjects are graded at 7.10.0 alone, where both spellings pass, so a reply using the documented object form is graded correct. The committed reference is an admissibility artifact, not a model answer, and now says so in its own header.

It grades LF3 and not LF1 — and that is about the set, not about A3

LF3 and LF1 are both dated 7.0.0 and both make new PrismaClient(...) throw, so the obvious risk is that this task measures the missing adapter and calls it datasourceUrl. The separating measurement: an artifact passing both an adapter and datasourceUrl — one that satisfies LF1 and still holds LF3's belief — fails at 7.0.0 and at 7.10.0 with

PrismaClientConstructorValidationError: Unknown property datasourceUrl provided to PrismaClient
constructor.

while the adapter alone passes. The option is rejected on its own account. This matters beyond A3: LF1 is A7's named substitute in the S1 reserve, so without the measurement two of the twelve seats would have been probing one belief and the draw's stratification would have been quietly worth less than it says.

Two smaller things the seat settled

The three-door block A2 met is met by every fact that needs a datasource, and A3 answers it the same way. A3 gets a literal DATABASE_URL that resolves to nothing. That is only safe because construction is lazy on every rung of this ladder — measured; no rung reaches a socket — and the prompt states that the grader has no database and connects nothing.

Retry feedback keeps the toolchain's words and drops node's echo of the bundle. A failing run at 7.10.0 prints 2,753 bytes, of which 1,514 are node's preamble echoing the minified @prisma/client source line the throw came from. That echo is not a word the toolchain said, and JOURNAL/121's fix to A1 established that a detail line is retry feedback before it is a grader's note. So the detail begins at the first line naming an error and keeps everything after it, stack included — 790 bytes, with the Unknown property datasourceUrl sentence first. Where no such line exists the whole output is kept, because handing back nothing is worse than handing back the echo.

A clarification to §9's ninth amendment, no rule changed. The amendment was written off A1 and says text is for an answer that is a file in another language. A3's answer is a JavaScript ES module — BM1's own language — and is still a text task. The test is not the language; it is where the answer has to run. The rule now reads: declare text whenever the answer is a file the grader must place somewhere before it means anything.

What was checked

What is left of BM2: nine drawn Class A assertions plus A7's substitute, the six Class N tasks, BM2's predictions, then the arms. Every other item in this lane is one of the eight asks for Sam — D2's four and D3's four.