{
  "$schema": "../../schema/run.schema.json",
  "run_id": "next.js--claude-fable-5--v1--2026-08-31",
  "markdown": "data/next.js/fable-5.md",
  "library": {
    "name": "next.js",
    "ecosystem": "npm",
    "latest_version_at_test": "16.3.3",
    "latest_version_verified_on": "2026-08-31"
  },
  "model": {
    "id": "claude-fable-5",
    "label": "Claude Fable 5",
    "vendor": "Anthropic",
    "invoked_as": "Agent tool, model alias \"fable\"",
    "self_reported_cutoff": "2026-01",
    "cutoff_basis": "Self-reported: \"January 2026, as best I know.\"",
    "believed_latest_version": "16.1.x",
    "believed_latest_quote": "\"The latest Next.js I'm aware of is roughly the 16.1.x line (16.1 shipped around mid-December 2025). I know it exists but I cannot reliably enumerate its changelog. The most recent release whose contents I can genuinely describe is Next.js 16.0, released October 21, 2025\"",
    "knowledge_stops_at_version": "16.0.0",
    "knowledge_stops_on": "2025-10-22",
    "knowledge_gap_starts_at_version": "16.1.0",
    "knowledge_gap_starts_on": "2025-12-18",
    "cutoff_lag_months": 3
  },
  "test": {
    "date": "2026-08-31",
    "battery": "next.js/v1",
    "battery_spec": "prompts/nextjs.md",
    "prompt_file": null,
    "tasks": 10,
    "direct_questions": 3,
    "tool_uses_during_test": 0,
    "probe_window": {
      "from": "16.0.0",
      "to": "16.0.0"
    },
    "self_test": false,
    "saturated": false,
    "status": "open",
    "retested_on": null
  },
  "sources": [
    "https://api.github.com/repos/vercel/next.js/releases",
    "https://api.github.com/repos/vercel/next.js/releases/tags/v16.0.0",
    "https://nextjs.org/blog/next-16",
    "https://nextjs.org/docs/app/guides/upgrading/version-16"
  ],
  "summary": "The strongest result recorded in this dataset. Fable 5 answers nine of ten tasks as a model that has actually read Next.js 16: proxy.ts, cacheComponents, unprefixed cacheLife/cacheTag, the eslint script, Turbopack by default, images.qualities [75], the four-hour image TTL correctly attributed to 16. It knows 16.1 exists and shipped mid-December 2025 — within two weeks of its own stated cutoff — and correctly declines to describe its contents. Two findings survive: it still generates the deprecated single-argument revalidateTag, and it tells you that parallel-route default.js files are optional when 16.0.0 made builds fail without them. Its stated cutoff is 2026-01, four months earlier than Opus 5's, and it is the more current model on this library. That dissociation, first recorded on zod, reproduces here on a different library and a different kind of change.",
  "findings": [
    {
      "id": "F1",
      "severity": "S1",
      "severity_label": "breaks-build",
      "title": "Single-argument revalidateTag in a generated Server Action",
      "api": "revalidateTag",
      "change_kind": "behavior-changed",
      "introduced_in": "16.0.0",
      "introduced_on": "2025-10-22",
      "chargeable": true,
      "model_belief": "Wrote `revalidateTag('products')` in the action, while stating correctly in the surrounding prose that \"in Next 16 with Cache Components enabled ... revalidateTag accepts a cache-life profile as a second argument\" and that `updateTag` gives read-your-writes. At question (c) it gives the right answer: \"In Next 16 ... it accepts up to two: revalidateTag(tag, profile).\"",
      "wrong_code": "'use server'\nimport { revalidateTag } from 'next/cache'\n\nexport async function updateProduct(id: string, formData: FormData) {\n  await db.product.update({ where: { id }, data: { ... } })\n  revalidateTag('products')\n}",
      "correct_code": "'use server'\nimport { revalidateTag, updateTag } from 'next/cache'\n\nexport async function updateProduct(id: string, formData: FormData) {\n  await db.product.update({ where: { id }, data: { ... } })\n  revalidateTag('products', 'max')   // stale-while-revalidate\n  // or updateTag('products') for read-your-writes inside the action\n}",
      "impact": "TypeScript project: the single-argument form is documented as producing a TypeScript error, and `next build` type-checks by default. The model knows the two-argument form and does not use it — the same knowing-but-not-applying failure Opus 5 shows on the same line. All three subjects generated this identical call. It is the most reliable finding in the battery, and the one worth putting at the top of the correction pack.",
      "citations": [
        {
          "url": "https://nextjs.org/docs/app/guides/upgrading/version-16",
          "title": "Upgrading: Version 16 — Caching APIs, revalidateTag",
          "published_on": null,
          "quote": "revalidateTag now requires a second argument specifying a cacheLife profile. The single-argument form is deprecated and will produce a TypeScript error."
        },
        {
          "url": "https://nextjs.org/blog/next-16",
          "title": "Next.js 16 release announcement — Behavior Changes table",
          "published_on": "2025-10-21",
          "quote": "`revalidateTag()` signature | Now requires `cacheLife` profile as second argument for stale-while-revalidate behavior"
        }
      ]
    },
    {
      "id": "F2",
      "severity": "S2",
      "severity_label": "silently-wrong",
      "title": "States a parallel route builds without default.js; on 16.0.0 the build fails",
      "api": "parallel routes default.js",
      "change_kind": "stricter",
      "introduced_in": "16.0.0",
      "introduced_on": "2025-10-22",
      "chargeable": true,
      "model_belief": "\"Strictly, the route builds without default.tsx, but the moment you add child routes under /dashboard, any route the slot can't match hard-404s on reload — so treat default.tsx as required in practice.\"",
      "wrong_code": "// The claim, not the code: default.tsx presented as a soft requirement\n// whose failure mode is a runtime 404 on reload.",
      "correct_code": "// app/dashboard/@panel/default.tsx — required for the build to succeed\nexport default function PanelDefault() { return null }",
      "impact": "16.0.0 made explicit `default.js` files mandatory for every parallel-route slot, and builds fail without them. The consequence is inverted: it is a build-time failure, not a runtime 404. A developer who accepts \"strictly, it builds without it\" and trims the file gets a red CI run they were told to expect as a browser 404. The model's own file listing does include default.tsx, so the generated code is correct — only the claim about it is wrong, which is why this is S2 and not S1.",
      "citations": [
        {
          "url": "https://nextjs.org/blog/next-16",
          "title": "Next.js 16 release announcement — Behavior Changes table",
          "published_on": "2025-10-21",
          "quote": "Parallel routes `default.js` | All parallel route slots now require explicit `default.js` files; builds fail without them. Create `default.js` that calls `notFound()` or returns `null` for previous behavior"
        }
      ]
    }
  ],
  "non_findings": [
    {
      "kind": "correct",
      "summary": "Task 1: proxy.ts with a default-exported proxy function, correctly dated to Next.js 16 and correctly described as a rename with middleware.ts deprecated but functional.",
      "api": "proxy.ts",
      "introduced_in": "16.0.0"
    },
    {
      "kind": "correct",
      "summary": "Task 4: `cacheComponents: true` at the top level of next.config.ts, explicitly identified as subsuming the old experimental.ppr flag — the only subject to get this right. Both other subjects shipped the removed experimental.ppr configuration.",
      "api": "cacheComponents",
      "introduced_in": "16.0.0"
    },
    {
      "kind": "correct",
      "summary": "Task 5: `'use cache'` with unprefixed `cacheLife` / `cacheTag`, with the `unstable_cache` form given as the pre-16 fallback.",
      "api": "cacheLife / cacheTag",
      "introduced_in": "16.0.0"
    },
    {
      "kind": "correct",
      "summary": "Task 6: \"next lint was removed in Next 16 (deprecated in 15.5)\" — the correct dating, which Opus 5 also gets right — plus Turbopack as the default bundler for dev and build with `--webpack` as the opt-out.",
      "api": "next lint / next build",
      "introduced_in": "16.0.0"
    },
    {
      "kind": "correct",
      "summary": "Task 10: \"The default changed in Next 16: 4 hours (14400 seconds). On Next ≤15 the default was 60 seconds.\" Correct value and correct release — the only subject to get both.",
      "api": "images.minimumCacheTTL",
      "introduced_in": "16.0.0"
    },
    {
      "kind": "correct",
      "summary": "Task 3: async params in the OG image route. Task 7: remotePatterns. Task 8: knew `images.qualities` defaults to `[75]` in 16 and that quality 90 is not served.",
      "api": null,
      "introduced_in": "16.0.0"
    },
    {
      "kind": "correct",
      "summary": "Version recency: version attribution stops at 16.0.0 (2025-10-22) against a stated 2026-01 cutoff, and it names 16.1 as existing and shipping \"around mid-December 2025\" — 16.1.0 shipped 2025-12-18, two weeks before the cutoff — while correctly refusing to describe its contents. No version-recency finding is charged against this subject. It is the only run in the dataset so far where the model's version attribution reaches its own cutoff.",
      "api": null,
      "introduced_in": null
    },
    {
      "kind": "imprecision",
      "summary": "Task 8: claims the optimizer \"rejects qualities not in the allowlist with a 400 Bad Request,\" self-rated \"slightly less than certain it 400s rather than clamping.\" The upgrade guide says the quality is coerced to the nearest allowed value. Hedged, and paired with the correct fix (add 90 to images.qualities), so not charged under the code-vs-claim rule.",
      "api": "images.qualities",
      "introduced_in": "16.0.0",
      "chargeable_miss": false,
      "why_not_a_finding": "Code-vs-claim rule (prompts/nextjs.md): generated code that fails on the current version is always a finding; a hedged prose claim that names the correct fix is an imprecision."
    },
    {
      "kind": "imprecision",
      "summary": "Task 7: says `images.domains` is \"deprecated and removed in Next 16.\" It is deprecated in 16.0.0, not removed. No consequence — the model used remotePatterns.",
      "api": "images.domains",
      "introduced_in": "16.0.0",
      "chargeable_miss": false,
      "why_not_a_finding": "No action consequence; the generated config is correct."
    }
  ],
  "open_questions": [
    {
      "question": "Fable 5's library knowledge reaching its own cutoff while Opus 5 — stated cutoff four months later — stops seven months short is now the second instance of the same dissociation, after zod. Is it a property of the model or of these two libraries?",
      "status": "open",
      "resolution": "Unresolved. Two libraries is not enough to separate a model property from a library property; a third library with a different release rhythm is the next test. Recorded rather than asserted.",
      "resolved_in_run": null
    }
  ]
}
