{
  "$schema": "../../schema/run.schema.json",
  "run_id": "tailwindcss--claude-fable-5--v1--2026-08-31",
  "markdown": "data/tailwindcss/fable-5.md",
  "library": {
    "name": "tailwindcss",
    "ecosystem": "npm",
    "latest_version_at_test": "4.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.\"",
    "believed_latest_version": "4.1",
    "believed_latest_quote": "\"The latest major line I know is Tailwind CSS v4. The most recent release whose actual contents I can describe confidently is v4.1, published around April 2025 ... I can't rule out a newer minor having shipped after my cutoff.\"",
    "knowledge_stops_at_version": "4.1.0",
    "knowledge_stops_on": "2025-04-01",
    "knowledge_gap_starts_at_version": "4.2.0",
    "knowledge_gap_starts_on": "2026-02-18",
    "cutoff_lag_months": 9
  },
  "test": {
    "date": "2026-08-31",
    "battery": "tailwindcss/v1",
    "battery_spec": "prompts/tailwindcss.md",
    "prompt_file": null,
    "tasks": 10,
    "direct_questions": 3,
    "tool_uses_during_test": 0,
    "probe_window": {
      "from": "4.0.0",
      "to": "4.1.0"
    },
    "self_test": false,
    "saturated": true,
    "status": "open",
    "retested_on": null
  },
  "sources": [
    "https://tailwindcss.com/docs/upgrade-guide",
    "https://tailwindcss.com/blog/tailwindcss-v4",
    "https://tailwindcss.com/docs/installation/using-vite",
    "https://tailwindcss.com/docs/detecting-classes-in-source-files",
    "https://raw.githubusercontent.com/tailwindlabs/tailwindcss/main/CHANGELOG.md",
    "https://registry.npmjs.org/tailwindcss"
  ],
  "summary": "Zero findings, and the most consistently version-aware run of the three: every task that had a v3 form volunteered the v3 form explicitly labelled as v3, after giving the v4 answer. Version attribution stops at 4.1.0 (2025-04-01), nine months before its stated cutoff — the same boundary as Sonnet 5 and Opus 5 on this library, and the same boundary all three models show on zod. With zero findings, nothing in the code contradicts its post-4.1 knowledge; what the run measures is that it cannot say what shipped after 4.1.0. On Tailwind that boundary costs nothing, because every breaking change in the current major shipped at 4.0.0, three months before it.",
  "findings": [],
  "non_findings": [
    {
      "kind": "correct",
      "summary": "Task 1: `@tailwindcss/vite` plugin plus `@import \"tailwindcss\";`, then spelled out the v3 path it was NOT using — \"no tailwind.config.js, no postcss.config.js, no content array, no npx tailwindcss init\" — and gave the v3 commands for contrast. This is the behaviour the code-vs-claim rule is meant to reward: v4 leads, v3 is labelled legacy.",
      "api": "@tailwind base / @tailwind components / @tailwind utilities",
      "introduced_in": "4.0.0"
    },
    {
      "kind": "correct",
      "summary": "Task 2: `@theme` with --color-brand and --font-display, and named the v3 equivalent (theme.extend.colors.brand) as the v3 equivalent.",
      "api": "tailwind.config.js",
      "introduced_in": "4.0.0"
    },
    {
      "kind": "correct",
      "summary": "Task 3: `@utility tab-4`. Correctly noted that in v3 an @layer utilities rule did get variant support — which is true of v3 and is exactly the behaviour v4 removed.",
      "api": "@layer utilities / @layer components (for defining custom classes)",
      "introduced_in": "4.0.0"
    },
    {
      "kind": "correct",
      "summary": "Task 4: `@source inline(...)` including the range form `text-slate-{100..900..100}`, verified against the docs. Named safelist explicitly as the v3 equivalent, and recommended the static lookup map as the better fix.",
      "api": "safelist / corePlugins / separator",
      "introduced_in": "4.0.0"
    },
    {
      "kind": "correct",
      "summary": "Task 5: `shrink-0`, `flex-1`, `min-w-0`, with the min-width:auto explanation.",
      "api": "flex-shrink-* / flex-grow-* / overflow-ellipsis / decoration-slice / decoration-clone",
      "introduced_in": "4.0.0"
    },
    {
      "kind": "correct",
      "summary": "Task 6: `bg-black/50`.",
      "api": "bg-opacity-* / text-opacity-* / border-opacity-* / ring-opacity-* / placeholder-opacity-* / divide-opacity-*",
      "introduced_in": "4.0.0"
    },
    {
      "kind": "correct",
      "summary": "Task 7: `bg-[var(--brand)]` as the primary answer and `bg-(--brand)` named as the v4 shorthand. Both work on 4.x.",
      "api": "bg-[--var] (CSS variable shorthand in arbitrary values)",
      "introduced_in": "4.0.0"
    },
    {
      "kind": "correct",
      "summary": "Task 8: currentColor border default correctly attributed to v4 with gray-200 as the v3 behaviour, and the shadow scale rename stated in both directions (v4 shadow-sm == v3 shadow; v3 shadow-sm == v4 shadow-xs).",
      "api": "border / divide (default colour)",
      "introduced_in": "4.0.0"
    },
    {
      "kind": "correct",
      "summary": "Task 9: bare ring is 1px currentColor in v4, 3px blue-500/50 in v3, plus the correct restoration (`ring-3 ring-blue-500/50`). Also reached for focus-visible rather than focus unprompted.",
      "api": "ring",
      "introduced_in": "4.0.0"
    },
    {
      "kind": "correct",
      "summary": "Task 10: `@reference \"../assets/main.css\"` in the SFC style block, with the correct reason and the correct note that v3 needed no such thing.",
      "api": "@apply inside Vue/Svelte/Astro <style> blocks and CSS modules",
      "introduced_in": "4.0.0"
    },
    {
      "kind": "imprecision",
      "summary": "Task 6: described `bg-black bg-opacity-50` as what \"in older v2-era code you'd see\". The opacity utilities were v3 utilities too — they were removed in 4.0.0, not before it. The generated code was correct and the model never suggested using them, so this is a dating slip in an aside, not a finding.",
      "api": "bg-opacity-* / text-opacity-* / border-opacity-* / ring-opacity-* / placeholder-opacity-* / divide-opacity-*",
      "introduced_in": "4.0.0",
      "chargeable_miss": false,
      "why_not_a_finding": "Code-vs-claim rule: the artefact handed over was correct, and the aside misdates a removal rather than recommending the removed API. Recorded because version-attribution slips are the failure mode that produced findings in the Next.js battery (opus F3), so the dataset should show where they do and do not occur."
    },
    {
      "kind": "context",
      "summary": "Question (a): named v4.1/April 2025 as its describable boundary and disclosed that a newer minor may have shipped. Same boundary as the other two subjects.",
      "api": null,
      "introduced_in": "4.1.0",
      "why_not_a_finding": "Same reasoning as the Sonnet 5 run: the last minor published before this model's 2026-01 cutoff is 4.1.0, which it can describe. 4.2.0 (2026-02-18) is outside its window and excluded by the probe fairness rule."
    }
  ],
  "open_questions": []
}
