{
  "$schema": "../../schema/run.schema.json",
  "run_id": "tailwindcss--claude-fable-5-1--v3-a--2026-09-06",
  "supersedes": null,
  "replicate_of": null,
  "library": {
    "name": "tailwindcss",
    "ecosystem": "npm",
    "latest_version_at_test": "4.3.3",
    "latest_version_verified_on": "2026-09-06",
    "latest_version_note": "`npm view tailwindcss versions` on 2026-09-06 ends at 4.3.3; the 4.2 line ran 4.2.0-4.2.4 and the 4.3 line 4.3.0-4.3.3. Every probe surface in this battery was compiled with the real Tailwind engine, one candidate at a time, against tailwindcss 4.1.0, 4.2.4, 4.3.0 and 4.3.3 installed in the session scratchpad. The scrollbar family, `zoom-*`, `tab-*` and `@container-size` emit nothing at 4.1.0 and 4.2.4 and the expected declaration at 4.3.0 and 4.3.3 — the whole 4.2 line is ruled out, not just 4.2.0. `@variant hover:focus` and `@variant hover, focus, active` throw `Cannot use @variant with unknown variant` at 4.2.4 and compile at 4.3.0. `scrollbar-corner-*` (the battery's guessing control), `tab-inherit` and any `overflow-anchor` utility (the poison rung) are absent at all four versions."
  },
  "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/tailwindcss-v3.txt. An identity probe run in this same session through the same alias, tool-free, answered \"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 cannot verify any of them introspectively — unchanged from the valibot batteries of the two preceding sessions, 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 first run outside valibot and next.js.",
    "self_reported_cutoff": "2026-06",
    "cutoff_basis": "Self-reported, AFFIRMING the environment value and qualifying only the density of recall: \"My stated training cutoff is June 2026. My concrete recall of Tailwind releases thins out around late 2025, so treat anything after that as a gap rather than a negative result.\" Under HARNESS.md § *A density self-assessment is not a stated cutoff* that qualification does not disqualify the arm — the subject states the date as a fact and then describes how well it knows one library. The battery's licence rests on this answer: 4.3.0 shipped 2026-05-08, twenty-three days below the stated cutoff, the tightest charging gap the Index has run.",
    "believed_latest_version": "4.1.x",
    "believed_latest_quote": "\"The latest version I'm aware of is somewhere in the v4.1.x patch line (roughly 4.1.13–4.1.14, autumn 2025). The most recent release whose contents I can actually describe is v4.1, released around 3 April 2025.\" … \"The first release I know only as a version number: v4.2. I have a vague sense it exists (late 2025 or 2026) but I cannot describe what's in it, and I would not trust myself to say whether it touched scrollbars, `overflow-anchor`, `zoom-*`, or `@variant` lists.\"",
    "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": 14
  },
  "test": {
    "date": "2026-09-06",
    "battery": "tailwindcss/v3-a",
    "battery_spec": "prompts/tailwindcss.md",
    "prompt_file": "prompts/sent/tailwindcss-v3.txt",
    "tasks": 6,
    "direct_questions": 3,
    "elicits_code": true,
    "tool_uses_during_test": 0,
    "probe_window": {
      "from": "4.3.0",
      "to": "4.3.0"
    },
    "self_test": false,
    "saturated": false,
    "status": "open",
    "retested_on": null
  },
  "sources": [
    "https://registry.npmjs.org/tailwindcss",
    "https://github.com/tailwindlabs/tailwindcss/releases/tag/v4.3.0",
    "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.0.tgz",
    "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.4.tgz",
    "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz"
  ],
  "findings": [
    {
      "id": "F1",
      "severity": "S2",
      "severity_label": "silently-wrong",
      "title": "Denies Tailwind ships scrollbar utilities, attributes the real class names to a third-party plugin, and rejects working markup that uses them",
      "api": "scrollbar-auto / scrollbar-thin / scrollbar-none / scrollbar-thumb-* / scrollbar-track-* / scrollbar-gutter-*",
      "change_kind": "added",
      "introduced_in": "4.3.0",
      "introduced_on": "2026-05-08",
      "chargeable": true,
      "chargeable_note": "4.3.0 shipped 2026-05-08; this draw states a June 2026 cutoff, so the release precedes it by twenty-three days. Tightest charging gap in the Index.",
      "model_belief": "Task 1(a), one word: \"No\". Then: \"Tailwind core (v4.0 / v4.1.x, the releases I can actually describe) has no `scrollbar-width`, `scrollbar-color`, or `scrollbar-gutter` utilities. Those class names you may have seen (`scrollbar-thin`, `scrollbar-thumb-*`, `scrollbar-track-*`) come from the third-party `tailwind-scrollbar` plugin, not the framework.\" On task 3, reviewing markup that uses them: \"`scrollbar-thin`, `scrollbar-thumb-slate-500`, `scrollbar-track-slate-100`, `scrollbar-gutter-stable` — none exist in core. These are `tailwind-scrollbar` plugin names, and the PR doesn't add the plugin.\"",
      "wrong_code": "<!-- the review verdict: four inert classes, replace them -->\n<div class=\"h-96 overflow-y-auto\n            [scrollbar-width:thin]\n            [scrollbar-color:var(--color-slate-500)_var(--color-slate-100)]\n            [scrollbar-gutter:stable]\">",
      "correct_code": "<div class=\"h-96 overflow-y-auto scrollbar-thin scrollbar-thumb-slate-500 scrollbar-track-slate-100 scrollbar-gutter-stable\">",
      "impact": "The charge is the REVIEW direction, not the code. The arbitrary-property block this draw shipped in task 1 compiles and emits the identical declarations — verified against installed 4.2.4 and 4.3.0 — so a reader who takes only the task 1 answer loses verbosity and nothing else, which is S3 under the workaround rule. What lifts it to S2 is task 3: presented with working markup, this draw tells the author that four classes generate no CSS and are plugin names the project does not have installed. Every one of them compiles at 4.3.0 and 4.3.3. A reviewer acting on that deletes correct code, and the false claim that the names belong to `tailwind-scrollbar` sends the next reader to add a dependency the framework has made unnecessary.",
      "citations": [
        {
          "url": "https://github.com/tailwindlabs/tailwindcss/releases/tag/v4.3.0",
          "title": "tailwindcss v4.3.0 release notes — Added",
          "published_on": "2026-05-08",
          "quote": "Add `scrollbar-{auto,thin,none}` utilities for `scrollbar-width`, and `scrollbar-thumb-*` / `scrollbar-track-*` color utilities for `scrollbar-color`"
        },
        {
          "url": "https://github.com/tailwindlabs/tailwindcss/releases/tag/v4.3.0",
          "title": "tailwindcss v4.3.0 release notes — Added",
          "published_on": "2026-05-08",
          "quote": "Add `scrollbar-gutter-*` utilities"
        },
        {
          "url": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.0.tgz",
          "title": "tailwindcss 4.3.0, shipped package — `scrollbar-thin` compiles to `scrollbar-width: thin`, `scrollbar-thumb-slate-500` and `scrollbar-track-slate-100` to `--tw-scrollbar-thumb`/`--tw-scrollbar-track` plus `scrollbar-color`, and `scrollbar-gutter-stable` to `scrollbar-gutter: stable`."
        },
        {
          "url": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.4.tgz",
          "title": "tailwindcss 4.2.4, shipped package — every one of those class names compiles to nothing at the last release of the 4.2 line."
        }
      ],
      "scope_note": "The draw's own arbitrary-property code was executed: `[scrollbar-width:thin]`, `[scrollbar-color:...]` and `[scrollbar-gutter:stable]` all compile at 4.2.4 and 4.3.0. Its browser-support caveats (Firefox/Chromium 121+, Safari ignoring the standard properties) were NOT verified and nothing in the charge rests on them. The denial was hedged (\"If a release newer than what I know added them, I can't vouch for it\"), which under HARNESS.md § *A hedge is a self-placement, not a grade on the content* is recorded but does not soften the verdict-first \"No\" or the task 3 review. PARTIAL DERIVABILITY, from this battery's own below-floor control: Claude Sonnet 5, sixteen months under the release, WROTE `scrollbar-thin scrollbar-thumb-slate-500 scrollbar-track-slate-100` in its task 1 markup — because `tailwind-scrollbar` has used those exact names for years. The names are derivable and the Index says so; `scrollbar-gutter-*` is not (no control produced it), and neither is the claim that the family is core. The charge rests on the denial and the rejection, never on the names."
    },
    {
      "id": "F2",
      "severity": "S2",
      "severity_label": "silently-wrong",
      "title": "Rejects `@container-size` as not a core utility, in a review of markup where it compiles",
      "api": "@container-size",
      "change_kind": "added",
      "introduced_in": "4.3.0",
      "introduced_on": "2026-05-08",
      "chargeable": true,
      "chargeable_note": "4.3.0 (2026-05-08) precedes this draw's stated 2026-06 cutoff.",
      "model_belief": "Task 3: \"`@container-size` — not a core utility as far as I know. Core has `@container` (`container-type: inline-size`), `@container-normal`, and named `@container/name`. If the section genuinely needs block-axis container queries, write `[container-type:size]`; otherwise use `@container`.\"",
      "wrong_code": "<section class=\"[container-type:size]\">",
      "correct_code": "<section class=\"@container-size\">",
      "impact": "Working markup called out as inert in review. The suggested replacement compiles, so the reader's page still works; the cost is the deleted correct class and a reviewer's stated confidence about a utility that exists. NOTE THE CONTRAST INSIDE THIS BATTERY: Claude Opus 5, whose stated cutoff is in the same month as the release, accepted `@container-size` as valid in the same review task and gave its declaration correctly. That marks this probe DERIVABLE (JOURNAL/030) and no pass on it would have been reported as knowledge — but a derivable outcome kills a pass, not a failure (JOURNAL/031), so this rejection stands, and stands as the weaker of this run's charges for how easy the correct answer was to reach.",
      "citations": [
        {
          "url": "https://github.com/tailwindlabs/tailwindcss/releases/tag/v4.3.0",
          "title": "tailwindcss v4.3.0 release notes — Added",
          "published_on": "2026-05-08",
          "quote": "Add `@container-size` utility"
        },
        {
          "url": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.0.tgz",
          "title": "tailwindcss 4.3.0, shipped package — `@container-size` compiles to `container-type: size`."
        },
        {
          "url": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.4.tgz",
          "title": "tailwindcss 4.2.4, shipped package — `@container-size` compiles to nothing, while `@container-[size]` already compiles to the same declaration."
        }
      ],
      "scope_note": "`[container-type:size]`, the replacement this draw proposed, compiles at 4.2.4 and 4.3.0 — so does `@container-[size]`, which the blind twin proposed. The 4.3.0 addition is a shorthand for something already expressible, which is why this finding is about the review verdict and not about broken output."
    },
    {
      "id": "F3",
      "severity": "S2",
      "severity_label": "silently-wrong",
      "title": "Denies a `zoom-*` family exists and attributes the name to an animation plugin, rejecting working markup",
      "api": "zoom-*",
      "change_kind": "added",
      "introduced_in": "4.3.0",
      "introduced_on": "2026-05-08",
      "chargeable": true,
      "chargeable_note": "4.3.0 (2026-05-08) precedes this draw's stated 2026-06 cutoff.",
      "model_belief": "Task 3: \"`zoom-50` — not a core utility that I know of. There's no `zoom-*` family (the `zoom-in-*`/`zoom-out-*` names people remember are from `tailwindcss-animate`). Write `[zoom:0.5]` if you really want the `zoom` property, or `scale-50 origin-top-left` if a transform is acceptable, which it usually is for a figure.\"",
      "wrong_code": "<figure class=\"[zoom:0.5]\">",
      "correct_code": "<figure class=\"zoom-50\">",
      "impact": "Same review-direction cost as F1 and F2, with one extra wrinkle worth flagging: the two replacements offered are not equivalent to each other or to the original. `[zoom:0.5]` emits `zoom: 0.5` while `zoom-50` emits `zoom: 50%` (same computed value, different syntax), and `scale-50` is a transform — it does not reflow, where `zoom` does. A reviewer who takes the `scale-50` suggestion changes the layout behaviour of the element while believing they are fixing a dead class. This is the ONLY probe in the battery no arm answered correctly and no control derived.",
      "citations": [
        {
          "url": "https://github.com/tailwindlabs/tailwindcss/releases/tag/v4.3.0",
          "title": "tailwindcss v4.3.0 release notes — Added",
          "published_on": "2026-05-08",
          "quote": "Add `zoom-*` utilities"
        },
        {
          "url": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.0.tgz",
          "title": "tailwindcss 4.3.0, shipped package — `zoom-50` compiles to `zoom: 50%` and `zoom-[1.5]` to `zoom: 1.5`."
        },
        {
          "url": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.4.tgz",
          "title": "tailwindcss 4.2.4, shipped package — `zoom-50` and `zoom-[1.5]` compile to nothing."
        }
      ],
      "scope_note": "`[zoom:1.5]` and `scale-50` were both compiled at 4.2.4 and 4.3.0 and both emit CSS; the claim that they differ in reflow behaviour is a property of CSS `zoom` versus `scale`, not something this Index verified in a browser."
    },
    {
      "id": "F4",
      "severity": "S3",
      "severity_label": "deprecated",
      "title": "Denies `@variant` accepts a stacked or comma-separated variant, and writes the block out three times for the OR case",
      "api": "@variant (stacked and compound variants)",
      "change_kind": "added",
      "introduced_in": "4.3.0",
      "introduced_on": "2026-05-08",
      "chargeable": true,
      "chargeable_note": "4.3.0 (2026-05-08) precedes this draw's stated 2026-06 cutoff.",
      "model_belief": "Task 4(a), one word: \"No\". Then: \"In v4, `@variant` (the applying form; `@custom-variant` is the defining form) takes a single variant name per at-rule. You get combined conditions by nesting; you get \\\"or\\\" by writing separate blocks (or by falling back to plain CSS selectors). I'm not certain a stacked form like `@variant hover:focus` is rejected rather than parsed, but I wouldn't ship on it.\"",
      "wrong_code": "@variant hover {\n  @variant focus { outline: 2px solid var(--color-slate-400); }\n}\n\n@variant hover  { border-color: var(--color-slate-400); }\n@variant focus  { border-color: var(--color-slate-400); }\n@variant active { border-color: var(--color-slate-400); }",
      "correct_code": "@variant hover:focus { outline: 2px solid var(--color-slate-400); }\n\n@variant hover, focus, active { border-color: var(--color-slate-400); }",
      "impact": "S3, and the severity is the interesting part. The nested workaround this draw wrote for the AND case compiles at 4.3.0 to output BYTE-IDENTICAL to the stacked form — verified — so that half costs nothing but keystrokes. The OR case has no nested equivalent (nesting is AND, the comma is OR), so the draw repeats the declaration block three times; that is still working CSS, which keeps the finding at S3 rather than S2. The draw notices the smell itself and recommends dropping the at-rule for plain `&:is(:hover, :focus, :active)` — a reasonable suggestion built on a false premise about what the at-rule can do.",
      "citations": [
        {
          "url": "https://github.com/tailwindlabs/tailwindcss/releases/tag/v4.3.0",
          "title": "tailwindcss v4.3.0 release notes — Added",
          "published_on": "2026-05-08",
          "quote": "Allow using `@variant` with stacked variants (e.g. `@variant hover:focus { … }`)"
        },
        {
          "url": "https://github.com/tailwindlabs/tailwindcss/releases/tag/v4.3.0",
          "title": "tailwindcss v4.3.0 release notes — Added",
          "published_on": "2026-05-08",
          "quote": "Allow using `@variant` with compound variants (e.g. `@variant hover, focus { … }`)"
        },
        {
          "url": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.0.tgz",
          "title": "tailwindcss 4.3.0, shipped package — `@variant hover:focus { … }` compiles, to output byte-identical to the nested form; `@variant hover, focus, active { … }` compiles to three separate rules."
        },
        {
          "url": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.4.tgz",
          "title": "tailwindcss 4.2.4, shipped package — both spellings throw `Cannot use @variant with unknown variant`; the single-variant and nested forms compile."
        }
      ],
      "scope_note": "The nested and stacked forms were compiled at 4.3.0 and their output compared: identical. At 4.2.4 the stacked and compound forms throw a hard build error, so this belief was exactly right for the release line the subject can describe and exactly wrong for the one under test. THIS PROBE IS DERIVABLE and the control that showed it is the one furthest below the floor: Claude Sonnet 5 answered task 4(a) \"Yes\" and wrote both `@variant hover:focus` and `@variant hover, focus, active` correctly, sixteen months under the release. A derivable outcome kills a pass, not a failure, so the charge stands — but no pass on this probe anywhere in the Index may be read as recall."
    }
  ],
  "non_findings": [
    {
      "kind": "correct",
      "summary": "TASK 3, `tab-4`: accepted as real, with the correct declaration — \"`tab-4` — fine. `tab-<number>` is a core utility in v4 and emits `tab-size: 4`.\" It is: `tab-*` arrived at 4.3.0 and compiles to `tab-size: 4` at 4.3.0 and 4.3.3, to nothing at 4.1.0 and 4.2.4. This looked like the battery's sharpest result until the below-floor control was read: Claude Sonnet 5, sixteen months under the release, also called `tab-4` valid AND listed the scale (`tab-1`, `tab-2`, `tab-4`, `tab-8`, `tab-[value]`, plus an invented `tab-inherit` that compiles to nothing at any version). The probe is therefore DERIVABLE and this pass is NOT reported as knowledge (JOURNAL/030, /031). What survives is narrower and still worth the line: this draw's blind twin, sent the same stored prompt, denied `tab-4` outright — so the subject is not stable on it either way.",
      "api": "tab-*",
      "introduced_in": "4.3.0"
    },
    {
      "kind": "correct",
      "summary": "TASK 2, the internal guessing control: no invention. Asked how to tint the scrollbar corner, this draw said plainly that the framework does not cover it, reached for the arbitrary variant `[&::-webkit-scrollbar-corner]:bg-slate-100`, and volunteered that the rule will often do nothing because Chromium ignores the WebKit pseudo-elements once the standard properties are set. `scrollbar-corner-*` does not exist at 4.2.4, 4.3.0 or 4.3.3 and this draw did not invent it. No arm in the battery did — P3 falsified 0/4.",
      "api": "scrollbar-corner-*"
    },
    {
      "kind": "correct",
      "summary": "TASK 6, the poison rung: refused. \"I don't know of any release that added `overflow-anchor` utilities... If you need it today: `[overflow-anchor:none]`. The question presupposes a release I can't confirm; I'd treat my answer as 'unknown,' not 'it doesn't exist.'\" No release added them; the correct answer is a refusal, and the offered arbitrary property compiles. P5 held on this arm and on all four.",
      "api": "overflow-anchor"
    },
    {
      "kind": "context",
      "summary": "TASK 5, attribution: refused, correctly for a subject that does not hold the capability — \"I can't name a release that changed this. If one exists, it's newer than my usable knowledge, and I'd rather say that than invent a version number.\" Under JOURNAL/030 an attribution question about a behaviour the subject does not hold measures nothing independent, so this is recorded and not scored."
    },
    {
      "kind": "context",
      "summary": "BOUNDARY. Most recent describable release 4.1.0 (2025-04-01); first release known only as a version number 4.2 (4.2.0 shipped 2026-02-18). Against a stated cutoff of 2026-06 that is a fourteen-month lag — the second library on which this subject's usable knowledge stops roughly thirteen to fourteen months below its stated cutoff (valibot: 1.1.0, thirteen months, JOURNAL/055). Two libraries is not a law, but it is the first evidence that the lag is not valibot-specific. P6 held on all four arms."
    }
  ],
  "open_questions": [
    {
      "question": "The battery's two most derivable-looking probes were derived by the subject furthest below the floor, not the nearest. Claude Sonnet 5 (2026-01) produced the correct `@variant` stacked and compound syntax and the correct `tab-*` scale; Claude Opus 5 (2026-05, three weeks nearer the release) got both wrong and derived only `@container-size`. Nothing in the Index predicts which control derives what, and distance below the floor evidently does not.",
      "status": "open"
    }
  ],
  "summary": "The Index's first Claude Fable 5.1 findings outside valibot, and the tightest charging gap it has run: tailwindcss 4.3.0 shipped 2026-05-08, twenty-three days below this subject's stated June 2026 cutoff. Four charges — three S2 in the review direction (the scrollbar family, `@container-size`, `zoom-*`, each called inert in a pull request where every class compiles) and one S3 denial that the `@variant` at-rule accepts a stacked or comma-separated variant. Every workaround the draw offered was compiled against installed 4.2.4 and 4.3.0 and every one of them works, which is why the charges rest on the denials and the rejections and never on the code. The battery's guessing control came back clean — asked for a scrollbar-corner utility it correctly said none exists rather than inventing `scrollbar-corner-*` — and the poison rung was refused. Two of the four probes turned out to be DERIVABLE, and by the control nobody expected: Claude Sonnet 5, sixteen months under the release, wrote the correct `@variant hover:focus` and `@variant hover, focus, active` syntax and the correct `tab-*` scale, while Claude Opus 5 three weeks under it got both wrong. Derivability kills a pass, not a failure, so the charges stand; what it kills is this run's one correct answer inside the window."
}
