119 — The fact with nowhere to put a connection string
2026-09-10 · distribution lane · DISTRIBUTION D1, BM2 build-order step 1
A2's seat, refused yesterday with LF14 and reassigned to the S1 reserve in task order, was filled: LF16 — the deprecated prisma introspect command was removed in 7.0.0 — authored and admitted as falling @7.0.0, with the correct solution passing all twenty-three rungs and the stale artifact passing exactly the twelve 6.x ones. The gate needed no new amendment. What the task cost instead was a narrower graded criterion, and the reason is a property of the ladder rather than of the task, so it is written into the draw file and not only into the assertion.
ADMIT A2 A LF16 falling @7.0.0
correct +++++++++++++++++++++++
stale ++++++++++++...........
The three-way block
LF16 is a fact about whether a CLI command exists. The natural acceptance criterion is the produced invocation reaches introspection — and on prisma that needs a connection string. There is nowhere on this ladder to put one that is not another dated fact, measured on the ladder rather than argued from the release notes:
- In the datasource block. Rejected from 7.0.0:
P1012 — The datasource property 'url' is no longer supported in schema files. That is LF8. - In
prisma.config.ts. Mandatory from 7.0.0 and a parse error at 6.19.0 (Failed to parse syntax of config file), because 6.18/6.19's loader is the opt-in one and takes a different shape. That is LF7, which is drawn as A6. A config that importsprisma/configfails on every rung besides, because the bisector installs the package under a per-rung alias — the aliasing trap GATE1 was written to demonstrate. - On the command line,
db pull --url. A two-release window inside the ladder: accepted throughout 6.x, rejected at 7.0.0 and 7.1.0, accepted again from 7.2.0. That is LF16's own note, complementing LF34.
Each of the three would have put a second boundary in the task, and a task with two boundaries is refused by §9 for the reason it should be: the results could not say which one they measured.
So A2 grades the one thing LF16 claims — the installed CLI recognises the command — by running the produced invocation in an empty directory and asking whether the answer is Unknown command "…". That is the CLI's own parser, and it is the same instrument the fact's own probe uses (probes.LF16a). The narrowing is disclosed twice: in the assertion, under the heading the A1 comment established, and in the prompt, which states the graded criterion in those words — so a subject is not marked against a rule it was not told. A command the CLI accepts but that does not introspect would pass; validate would pass. That is the price, and it is stated rather than left to be found.
The block is not A2's alone. Every drawn fact whose natural criterion needs a live datasource meets the same three doors, and each one leads to another fact in this same draw. Recorded in prompts/benchmark-bm2-draw.md for the ten seats still to be authored.
Two things that will stop BM2's arms, found while checking what the assertion is handed
Neither is authoring work and neither was fixed here; both are demonstrated rather than suspected, and both are now the next chunk in this lane.
1. The runner has not been brought to §9's fifth amendment. The gate grades through the probe file's own subject(ctx) (JOURNAL/109) — which is the only reason prisma has a benchmark at all, since its facts are a CLI and a schema language with nothing to import. tools/benchmark/run.mjs still calls the assertion as assertion({ library: await env.loadLibrary(), produced, version }). There is no subject key in that object at all, and loadLibrary is zod-shaped (m.z ?? m.default ?? m off an index.js). Every prisma assertion destructures subject and would throw on subject.validate / subject.inProject — an error cell, not a failure, on every task in every arm.
2. A reply that is not JavaScript cannot be loaded, and is graded as the subject's mistake. loadProduced writes the extracted code block to a .mjs and imports it. A1's prompt asks for a schema.prisma file, which is what its fact is about; imported as a module it is SyntaxError: Unexpected identifier 'db' — checked, not assumed — and gradeOnce turns a failed import into { passed: false } with that syntax error as the retry feedback. The subject is then told its schema is bad JavaScript and spends its retries on the harness. The penalty is symmetric across arms so it would not bias BARE against PACK, but it would make round 0 fail everywhere for a reason that is ours. A2 sidesteps it by asking for export const argv = [...] — an invocation is naturally a module — which is a workaround for one task and not the fix.
State
BM2: two Class A tasks admitted (A1/LF23, A2/LF16), one refused and kept for re-running (A2's original seat, LF14), one recorded as due for refusal before its assertion exists (A7/LF21). Ten drawn Class A assertions left plus A7's substitute, then the six Class N tasks, BM2's predictions, then the arms — and the arms are now blocked on the two runner gaps above.
No gate code changed this session, so BM1 cannot have moved; A1's flip_test block was re-measured alongside A2's on the same ladder and came back byte-identical to the one committed yesterday.