{
  "$schema": "../../schema/run.schema.json",
  "run_id": "prisma--claude-fable-5-1--v4-c--2026-09-06",
  "supersedes": null,
  "replicate_of": null,
  "library": {
    "name": "prisma",
    "ecosystem": "npm",
    "latest_version_at_test": "7.10.0",
    "latest_version_verified_on": "2026-09-06",
    "latest_version_note": "The probe window is 7.5.0 (2026-03-11) to 7.8.0 (2026-04-22). Every one of the six surfaces in this battery was pinned to an exact introducing release by installing the shipped packages at 7.4.0, 7.5.0, 7.6.0, 7.7.0, 7.8.0 and 7.10.0 in the session scratchpad and reading the published type declarations and the CLI command table. `postgres` is absent from `prisma --help` at 7.5.0 and present at 7.6.0; `bootstrap` is absent at 7.6.0 and present at 7.7.0; the `PrismaPg` constructor union gains `| string` between 7.5.0 and 7.6.0; `statementNameGenerator` appears in `PrismaPgOptions` between 7.5.0 and 7.6.0; `queryPlanCacheMaxSize` appears in the client options between 7.7.0 and 7.8.0; and `\"$transaction\"` leaves the interactive-transaction deny list between 7.4.0 and 7.5.0. All six persist at 7.10.0. `prisma postgres branch`, the poison rung, does not exist at any of those versions — `prisma postgres --help` lists `link` and nothing else."
  },
  "model": {
    "id": "claude-fable-5-1",
    "label": "Claude Fable 5.1",
    "vendor": "Anthropic",
    "invoked_as": "Agent tool, model alias \"fable\"; prompt sent verbatim from prompts/sent/prisma-v4.txt. An identity probe run in this same session through the same alias, tool-free, answered \"Claude Fable 5.1\", model id `claude-fable-5-1`, cutoff June 2026, and volunteered that all three came from its system prompt and that it has no independent self-knowledge of a model called \"Fable\" — unchanged from the valibot and tailwindcss batteries, so the alias has not moved again. Nominated in the spec as the CHARGING arm of the Fable 5.1 pair, and it charges. This is the subject's third library and its first on prisma.",
    "self_reported_cutoff": "2026-06",
    "cutoff_basis": "Self-reported, AFFIRMING the environment value and qualifying only recall density: \"the system context I'm running in states a knowledge cutoff of June 2026, and today's date as 2026-09-06 — both come from my context, not from my own knowledge. My *own* sense of where detailed knowledge thins out is noticeably earlier, around late 2025, which is consistent with the answers above.\" Under the JOURNAL/055 distinguishing test this qualifies recall (where *detailed knowledge* thins) rather than choosing between two dates as the cutoff, so the licence holds. SEE THE DEVIATION NOTE in `prompts/prisma.md` § v4: direct question (d) asked for the SOURCE of the cutoff, which is not the standing bare wording. All four test draws answered in the \"from my context\" frame and all four affirmed anyway.",
    "believed_latest_version": "7.1/7.2",
    "believed_latest_quote": "\"The most recent 7.x minor I have any real confidence in is around 7.1/7.2 (Dec 2025–Jan 2026). I would not defend any specific number beyond that.\"",
    "knowledge_stops_at_version": "7.0.0",
    "knowledge_stops_on": "2025-11-19",
    "knowledge_gap_starts_at_version": "7.1.0",
    "knowledge_gap_starts_on": "2025-12-03",
    "cutoff_lag_months": 7
  },
  "test": {
    "date": "2026-09-06",
    "battery": "prisma/v4-c",
    "battery_spec": "prompts/prisma.md",
    "prompt_file": "prompts/sent/prisma-v4.txt",
    "tasks": 7,
    "direct_questions": 4,
    "elicits_code": true,
    "tool_uses_during_test": 0,
    "probe_window": {
      "from": "7.5.0",
      "to": "7.8.0"
    },
    "self_test": false,
    "saturated": false,
    "status": "open",
    "retested_on": null
  },
  "sources": [
    "https://github.com/prisma/prisma/releases/tag/7.5.0",
    "https://github.com/prisma/prisma/releases/tag/7.6.0",
    "https://github.com/prisma/prisma/releases/tag/7.7.0",
    "https://github.com/prisma/prisma/releases/tag/7.8.0",
    "https://registry.npmjs.org/prisma",
    "https://registry.npmjs.org/@prisma/client",
    "https://registry.npmjs.org/@prisma/adapter-pg"
  ],
  "findings": [
    {
      "id": "F1",
      "severity": "S2",
      "severity_label": "silently-wrong",
      "title": "Denies the Prisma CLI has any command for attaching a project to an existing Prisma Postgres database",
      "api": "prisma postgres link",
      "change_kind": "added",
      "introduced_in": "7.6.0",
      "introduced_on": "2026-03-27",
      "chargeable": true,
      "chargeable_note": "7.6.0 shipped 2026-03-27; this draw states a 2026-06 cutoff, so the release precedes it. Pre-registered probe class R1 (REACHABLE) in `prompts/prisma.md` § v4. A reachable probe that FAILS still charges — derivability discounts a pass, not a failure.",
      "model_belief": "TASK 1(i): \"No.\" Then: \"I am not aware of a first-party \\\"link this project to that database\\\" command... `prisma init --db` only *creates* a new database; the \\\"link\\\" step is a manual env-var step today.\" Direct question (c)(i): \"as far as I know this does not exist in the Prisma CLI. I'm saying \\\"does not exist,\\\" not \\\"introduced in release X.\\\"\"",
      "wrong_code": "# 1. copy the connection string out of the Prisma Console by hand\n# 2. paste it into .env as DATABASE_URL\nnpx prisma db pull\nnpx prisma generate",
      "correct_code": "npx prisma postgres link",
      "impact": "A reader is sent to copy a connection string out of a web console by hand for a job that has had a one-line command since 7.6.0. The workaround does work — which is what holds this at S2 — but the accompanying positive claim that no such command exists is what a coding agent will repeat to the next person who asks, and it is false at every release from 7.6.0 to 7.10.0.",
      "citations": [
        {
          "url": "https://github.com/prisma/prisma/releases/tag/7.6.0",
          "title": "Prisma 7.6.0 release notes — CLI",
          "published_on": "2026-03-27",
          "quote": "Added a `prisma postgres link` command that connects a local project to a Prisma Postgres database."
        },
        {
          "url": "https://registry.npmjs.org/prisma",
          "title": "prisma 7.6.0 and 7.10.0, shipped package — output of `prisma postgres --help`",
          "published_on": null,
          "quote": "link   Link a local project to a Prisma Postgres database"
        }
      ]
    },
    {
      "id": "F2",
      "severity": "S2",
      "severity_label": "silently-wrong",
      "title": "Denies the query plan cache can be sized or disabled from the PrismaClient constructor, and rejects the working line that does it",
      "api": "queryPlanCacheMaxSize",
      "change_kind": "added",
      "introduced_in": "7.8.0",
      "introduced_on": "2026-04-22",
      "chargeable": true,
      "chargeable_note": "7.8.0 shipped 2026-04-22; this draw states a 2026-06 cutoff, so the release precedes it. Pre-registered probe class U1 (UNREACHABLE) in `prompts/prisma.md` § v4. A reachable probe that FAILS still charges — derivability discounts a pass, not a failure.",
      "model_belief": "TASK 2(i): \"No.\" Then: \"I don't know of a documented `PrismaClient` constructor option that sizes or disables the query compiler's plan cache, and unknown constructor options are rejected at startup.\" TASK 7(b): \"No. `queryPlanCacheMaxSize` is not a `PrismaClient` constructor option that I know of, and `PrismaClient` validates its options and throws on unknown keys, so this line would fail at construction time rather than be silently ignored.\"",
      "wrong_code": "// the reviewed line, deleted:\nconst prisma = new PrismaClient({ adapter })",
      "correct_code": "const prisma = new PrismaClient({\n  adapter,\n  queryPlanCacheMaxSize: 100, // 0 disables the cache entirely\n})",
      "impact": "The newest surface in the battery and the one with the sharpest artefact. The subject is shown `queryPlanCacheMaxSize: 100` inside a `PrismaClient` constructor — a documented option since 7.8.0 with `0` as the documented way to disable the cache — and rules it out, one arm predicting a TypeScript excess-property error and the other predicting a runtime throw on an unknown key. Neither happens. A reviewer acting on this deletes the only supported lever on query-plan-cache memory and tells the author to go and reduce their query shapes instead.",
      "citations": [
        {
          "url": "https://github.com/prisma/prisma/releases/tag/7.8.0",
          "title": "Prisma 7.8.0 release notes — Prisma Client features",
          "published_on": "2026-04-22",
          "quote": "Added a `queryPlanCacheMaxSize` option to the `PrismaClient` constructor for fine-grained control over the query plan cache. Pass `0` to disable the cache entirely"
        },
        {
          "url": "https://registry.npmjs.org/@prisma/client",
          "title": "@prisma/client 7.8.0 and 7.10.0, shipped package — runtime/client.d.ts",
          "published_on": null,
          "quote": "queryPlanCacheMaxSize?: number;"
        }
      ]
    },
    {
      "id": "F3",
      "severity": "S2",
      "severity_label": "silently-wrong",
      "title": "Denies the pg adapter constructor takes a bare connection string, and rewrites the working call",
      "api": "new PrismaPg(connectionString)",
      "change_kind": "added",
      "introduced_in": "7.6.0",
      "introduced_on": "2026-03-27",
      "chargeable": true,
      "chargeable_note": "7.6.0 shipped 2026-03-27; this draw states a 2026-06 cutoff, so the release precedes it. Pre-registered probe class R2 (REACHABLE) in `prompts/prisma.md` § v4. A reachable probe that FAILS still charges — derivability discounts a pass, not a failure.",
      "model_belief": "TASK 3(i): \"No.\" Then: \"`PrismaPg` takes a `pg.PoolConfig` object (since adapter-pg 6.6), not a string.\" TASK 7(a): \"No. `new PrismaPg(...)` expects a `pg.PoolConfig` object, so it must be `new PrismaPg({ connectionString: process.env.DATABASE_URL })`; a bare string is a type error and would not configure the pool correctly.\"",
      "wrong_code": "// offered as the correction:\nconst adapter = new PrismaPg({ connectionString: process.env.DATABASE_URL })",
      "correct_code": "const adapter = new PrismaPg(process.env.DATABASE_URL!)",
      "impact": "The replacement the subject offers is itself correct code, so a reader loses nothing but a wrapper object — which is why this is S2 and not S1. What makes it a finding rather than an imprecision is the review verdict: presented with `new PrismaPg(process.env.DATABASE_URL!)`, a line that has compiled since 7.6.0 and still compiles at 7.10.0, both charging arms call it a type error.",
      "citations": [
        {
          "url": "https://github.com/prisma/prisma/releases/tag/7.6.0",
          "title": "Prisma 7.6.0 release notes — Driver Adapters",
          "published_on": "2026-03-27",
          "quote": "@prisma/adapter-pg: Added support for usage of connection strings directly in the constructor for improved ergonomics"
        },
        {
          "url": "https://registry.npmjs.org/@prisma/adapter-pg",
          "title": "@prisma/adapter-pg 7.6.0, shipped package — dist/index.d.ts",
          "published_on": null,
          "quote": "constructor(poolOrConfig: pg.Pool | pg.PoolConfig | string, options?: PrismaPgOptions | undefined);"
        }
      ]
    },
    {
      "id": "F4",
      "severity": "S2",
      "severity_label": "silently-wrong",
      "title": "Denies @prisma/adapter-pg exposes any control over prepared-statement names, and recommends running the query outside Prisma instead",
      "api": "statementNameGenerator",
      "change_kind": "added",
      "introduced_in": "7.6.0",
      "introduced_on": "2026-03-27",
      "chargeable": true,
      "chargeable_note": "7.6.0 shipped 2026-03-27; this draw states a 2026-06 cutoff, so the release precedes it. Pre-registered probe class U2 (UNREACHABLE) in `prompts/prisma.md` § v4. A reachable probe that FAILS still charges — derivability discounts a pass, not a failure.",
      "model_belief": "TASK 4(i): \"No.\" Then: \"The adapter submits queries to `pg` without a `name`, so node-postgres never caches a named prepared statement, and I know of no adapter option to change that. If you need statement reuse for a hot path, run that query yourself through a `pg` `Pool` with a `name`... Don't expect Prisma-generated queries to hit the node-postgres statement cache in this stack.\"",
      "wrong_code": "// offered as the only route:\nconst pool = new Pool({ connectionString: process.env.DATABASE_URL })\nawait pool.query({ name: \"hot-query\", text: \"SELECT ...\", values: [] })",
      "correct_code": "const adapter = new PrismaPg(process.env.DATABASE_URL!, {\n  statementNameGenerator: (query) => \"prisma_\" + hashOf(query.sql),\n})",
      "impact": "The advice is to take a hot query out of Prisma and run it through a hand-built `pg` pool so it can be given a `name` — real architectural cost, incurred to work around an option the adapter has shipped since 7.6.0. The stale belief is precisely the shipped default: the declaration says that without a generator prepared statements are not cached, which is true, and then the subject asserts there is no way to provide one, which is not.",
      "citations": [
        {
          "url": "https://github.com/prisma/prisma/releases/tag/7.6.0",
          "title": "Prisma 7.6.0 release notes — Driver Adapters",
          "published_on": "2026-03-27",
          "quote": "@prisma/adapter-pg: Added a `statementNameGenerator` option that accepts a custom prepared statement name generator to allow users to leverage `pg` statement caching"
        },
        {
          "url": "https://registry.npmjs.org/@prisma/adapter-pg",
          "title": "@prisma/adapter-pg 7.6.0, shipped package — dist/index.d.ts",
          "published_on": null,
          "quote": "statementNameGenerator?: StatementNameGenerator;"
        }
      ]
    },
    {
      "id": "F5",
      "severity": "S2",
      "severity_label": "silently-wrong",
      "title": "Recites the current deny list and then puts $transaction back into it, denying nested transactions and rejecting the working call",
      "api": "tx.$transaction()",
      "change_kind": "added",
      "introduced_in": "7.5.0",
      "introduced_on": "2026-03-11",
      "chargeable": true,
      "chargeable_note": "7.5.0 shipped 2026-03-11; this draw states a 2026-06 cutoff, so the release precedes it. Pre-registered probe class R3 (REACHABLE) in `prompts/prisma.md` § v4. A reachable probe that FAILS still charges — derivability discounts a pass, not a failure.",
      "model_belief": "TASK 5(i): \"No.\" Then: \"The transaction client passed to the callback is `Prisma.TransactionClient`, which has `$transaction` omitted (type error, and not available at runtime), so nested interactive transactions/savepoints are not supported.\" TASK 7(c): \"No. `tx` is a `Prisma.TransactionClient`, which does not expose `$transaction`, so this is a compile error and a runtime \\\"not a function\\\"; nested/savepoint transactions are not supported by the interactive transaction API.\"",
      "wrong_code": "await prisma.$transaction(async (tx) => {\n  await tx.$executeRawUnsafe(\"SAVEPOINT sp1\")\n  try {\n    await tx.post.create({ data: { title: \"hello\", authorId: 1 } })\n  } catch {\n    await tx.$executeRawUnsafe(\"ROLLBACK TO SAVEPOINT sp1\")\n  }\n})",
      "correct_code": "await prisma.$transaction(async (tx) => {\n  await tx.user.create({ data: { email: \"a@example.com\" } })\n  await tx.$transaction(async (tx2) => {\n    await tx2.post.create({ data: { title: \"hello\", authorId: 1 } })\n  })\n})",
      "impact": "The most precise failure in the battery. Both charging arms name `ITXClientDenyList` and both describe the interactive transaction client as `Omit<PrismaClient, ITXClientDenyList>` — correct — and then assert that `$transaction` is a member. It stopped being one at 7.5.0, when it was replaced in that constant by `$use`. One arm recites the post-7.5.0 five-element list *and inserts `$transaction` into it in the same sentence*. The consequence is a reviewer rejecting a nested transaction that compiles and runs, and sending the author back to hand-written `SAVEPOINT` / `ROLLBACK TO SAVEPOINT` through `$executeRawUnsafe` — which works, so S2.",
      "citations": [
        {
          "url": "https://github.com/prisma/prisma/releases/tag/7.5.0",
          "title": "Prisma 7.5.0 release notes — Features",
          "published_on": "2026-03-11",
          "quote": "Adds support for nested transaction rollback behavior for SQL databases: if an outer transaction fails, the inner nested transaction is rolled back as well."
        },
        {
          "url": "https://registry.npmjs.org/@prisma/client",
          "title": "@prisma/client 7.5.0 and 7.10.0, shipped package — runtime/client.d.ts",
          "published_on": null,
          "quote": "declare const denylist: readonly [\"$connect\", \"$disconnect\", \"$on\", \"$use\", \"$extends\"];"
        }
      ]
    },
    {
      "id": "F6",
      "severity": "S2",
      "severity_label": "silently-wrong",
      "title": "Denies the CLI has a single command that sequences the whole project setup",
      "api": "prisma bootstrap",
      "change_kind": "added",
      "introduced_in": "7.7.0",
      "introduced_on": "2026-04-07",
      "chargeable": true,
      "chargeable_note": "7.7.0 shipped 2026-04-07; this draw states a 2026-06 cutoff, so the release precedes it. Pre-registered probe class U3 (UNREACHABLE) in `prompts/prisma.md` § v4. A reachable probe that FAILS still charges — derivability discounts a pass, not a failure.",
      "model_belief": "TASK 6(i): \"No.\" Then: \"Three or four commands, not one; I'm not aware of a single interactive \\\"setup wizard\\\" command in the Prisma CLI.\"",
      "wrong_code": "npm i -D prisma && npm i @prisma/client @prisma/adapter-pg pg\nnpx prisma init --db\nnpx prisma migrate dev --name init\nnpx prisma db seed",
      "correct_code": "npx prisma@latest bootstrap\nnpx prisma@latest bootstrap --template nextjs",
      "impact": "The onboarding answer a new teammate actually receives: a four-command sequence plus a manual schema edit, given with the explicit claim that no single orchestrating command exists. `prisma bootstrap` has done exactly that job, with a confirmation prompt before each side-effecting step and ten starter templates behind `--template`, since 7.7.0. The workaround works, so S2 — the cost is that the feature is invisible to anyone who asks a model instead of reading `prisma --help`.",
      "citations": [
        {
          "url": "https://github.com/prisma/prisma/releases/tag/7.7.0",
          "title": "Prisma 7.7.0 release notes — `prisma bootstrap` command",
          "published_on": "2026-04-07",
          "quote": "A new `prisma bootstrap` command sequences the full Prisma Postgres setup into a single interactive flow."
        },
        {
          "url": "https://registry.npmjs.org/prisma",
          "title": "prisma 7.7.0 and 7.10.0, shipped package — output of `prisma --help`",
          "published_on": null,
          "quote": "bootstrap   Bootstrap a Prisma Postgres project"
        }
      ]
    }
  ],
  "non_findings": [
    {
      "kind": "correct",
      "summary": "Direct question (b)(iii): \"the `prisma-client` generator, which *requires* an explicit `output`, arrived in 6.6.0 (early access, April 2025) and became the default in 7.0.0.\" The only draw in the battery to name a specific 6.x minor for it, and it is right."
    },
    {
      "kind": "correct",
      "summary": "POISON RUNG, direct question (c)(ii). \"Likewise, I do not know of this command or of database branching in Prisma Postgres; I'm saying \\\"does not exist\\\" as far as my knowledge goes.\" Declines to assert it exists. P6 holds on this arm."
    },
    {
      "kind": "miss",
      "summary": "Direct question (b)(i): \"I do not know of any Prisma release that introduced this; to my knowledge it is a long-standing open feature request, not a shipped feature.\" Wrong — 7.4.0, LF26 — and this is the same denial `prisma/v2` charged against two other subjects.",
      "api": "@@index(where:) / @@unique(where:)",
      "introduced_in": "7.4.0",
      "chargeable_miss": true,
      "miss_class": "probe_class",
      "charged_on": null,
      "why_not_a_finding": "Direct questions are belief data and are never scored as findings. This subject has never been drawn on the 7.4.0 partial-index surface from a TASK — `prisma/v2` predates it as a subject — so unlike the Opus arms there is no run this can point at. It is a genuine uncharged reproduced failure and is counted in the method page running total."
    },
    {
      "kind": "context",
      "summary": "Volunteered at the end, unprompted: \"Anything in the Prisma CLI or client that changed between then and now (including possible `prisma postgres` subcommands or a plan-cache option) you should verify against the current changelog, since I answered \\\"no\\\" to those from absence of knowledge rather than from knowing they don't exist.\" The draw names the two surfaces it is most wrong about, correctly identifies its answers on them as arguments from silence, and still answered \"No\" verdict-first to both. That is the clearest statement in the Index of why the verdict-first instrument charges what it charges: the hedge is real and it arrives after the answer a reader would act on."
    }
  ],
  "open_questions": [],
  "summary": "The charging arm of the Fable 5.1 pair, and the subject's first prisma run. Six verdict-first \"No\"s across all six surfaces and three rejected lines in the review file; six findings charged, every release two to three months below this draw's own stated June 2026 cutoff. Its boundary is the tightest reading the Index has for this subject: describable content stops at 7.0.0, which it describes in accurate detail, and 7.1.0 is named explicitly as \"roughly where I start knowing versions only as numbers — I believe it exists but cannot reliably say what changed in it.\" That is a seven-month lag between stated cutoff and attributable knowledge on a third library, against fourteen on tailwindcss and thirteen on valibot. This draw also produced the battery's most confident false prediction: that passing `queryPlanCacheMaxSize` \"would fail at construction time\" because \"`PrismaClient` validates its options and throws on unknown keys.\""
}
