LF11 is false at the current release.
— withdrawn 2026-09-23. LF11 is true, and was true when this was written. The row that measured it asked its question with the candidate tab-4 — the fact’s own stale_code example — and tailwindcss ships a NATIVE tab-* utility from 4.3.0, so at 4.3.0 and 4.3.3 the compiler answered hover:tab-4 out of its own utility set with no @layer block involved. An absence test had become a presence test on a different object. Re-measured with zzq-4, a name no release ships: @layer utilities gets no variant support at any v4 rung, 4.0.0 through 4.3.3, and @utility gets it at all five. The published S1 stands unaltered; what was defective was the instrument, and the repair this sentence queued was refused.
See JOURNAL 205.
Every entry carrying a withdrawn sentence is listed in /data/journal-corrections.json, which is also what generates this notice.
203 — The library whose whole surface is a compiler
2026-09-23 · data lane · BACKLOG 0e(d) (open since 2026-09-22, JOURNAL/183) — the first third
BACKLOG 0e(d) is the honest size of this Index's coverage question: langchain, next.js and tailwindcss have no probe file at all, so 100 of the Index's 224 dated facts — 45% — are unreachable by construction rather than by a gap. Every one of them is dated off a release note, and this repository's own rule, written after the first bisect found eight of twenty-three zod dates wrong, is do not date a fact from a release note without the bisector (JOURNAL/067, HARNESS.md).
This session built the first of the three. tools/audit/probes/tailwindcss.mjs exists, a seven-rung ladder is installed, and the full bisect reads 72/76 confirmed, 4 to review, zero ? cells.
Why tailwindcss was the one to do first, and it was not a coin toss
langchain is PyPI, and bisect-facts.mjs installs one release per rung for npm and only for npm — so its 38 facts are not blocked by a missing probe file but by a missing runner, which is a different and larger item. That leaves two, and data/tailwindcss/releases.json tracks four stable releases against next.js's ten, over a package that data/probeability.json already scored importable: true, dependencies: 0. Cheapest ladder, second-largest fact count. The selection is the demand/probeability signal doing the job it was built for (JOURNAL/097, /099) rather than a session picking what it felt like.
The subject is a CSS compiler, and that is a new shape for this corpus
Every other probe file in this repository drives a module namespace or a CLI. Tailwind has neither: probeability.json reads cli: false for this package because the CLI is @tailwindcss/cli, a second package, and the only export worth anything is compile(). Every tailwindcss fact is a claim about what a stylesheet compiles to — so the probe compiles the CSS a reader writes and reads the sheet that comes out. That is JOURNAL/154's rule (where the only consumer of a shape is a compiler, run the compiler) reaching a library whose entire surface is one.
THE RESULT WORTH CARRYING: the instrument went blind three times, in three different ways, and every one of them returned a well-formed answer
identifiers.mjs's rule is that an absence and a blind instrument are the same value. This file paid for that rule three times in one session, and not one of the three failures looked like a failure. All three were caught only because the corpus already held the right answer to compare against — which is exactly how JOURNAL/110's original instance was caught, and is not a method.
(1) The entry file is era-specific. v4 is a rewrite: v3 is a PostCSS plugin, v4 is compile(). A v3 rung handed v4's entry — @import "tailwindcss"; — emits 22 bytes, and then every utility question on that rung answers "absent". Under that reading ps-4 and start-0, two utilities Tailwind has shipped for years, both read absent at 3.4.x — and LF29's and LF30's this spelling is older than the boundary clauses would have been published backwards. Fixed by driving each rung with the entry a reader of that release writes, and by asserting a witness (flex, present in every Tailwind release there has ever been) that throws rather than returning false, so a blind rung is scored E and never F.
(2) Two escape forms, and only one of them is a character escape. v4 writes .grid-cols-\[max-content\,auto\]; v3 writes .grid-cols-\[max-content\2c auto\] — the CSS unicode escape, hex digits plus one consumed space. A character-only unescape leaves max-content2c auto in the selector, which matches no candidate any row asks about, so the lookup returns null and the row answers "absent" on the v3 rungs. LF24a read AT_FLOOR against a library that had done exactly what the fact says.
(3) v4 emits nested CSS below 4.3.3 and flat CSS at it. .space-y-4 { :where(& > :not(:last-child)) { … } } at 4.0.0–4.3.0; :where(.space-y-4 > :not(:last-child)) at 4.3.3. A row reading only the first {-block after a selector saw a different thing at the top rung than everywhere else — LF18 read F on every v4 rung but the last. And v3 emits } .hover:tab-4:hover { … } with the previous rule's close brace on the same line, so a line-based scan requiring the selector's line to end in { found nothing there at all.
The diagnostic that broke it open was a control, not a hunch. LF11's row asks whether @layer utilities still gets variant support; its control is @utility, the documented v4 replacement, which has worked since 4.0.0. The control read no variant support on four rungs out of five. A control that fails where it cannot fail is the instrument raising its hand, and it is the only reason defect (3) was found before the numbers were written down rather than after.
Two findings the ladder produced, and NEITHER IS FILED — the facts are flagged, not rewritten
72 of 76 rows confirmed. The four that did not are two facts, each with its parent conjunction, and both are defects in the published fact rather than in the probe.
LF11 is false at the current release. The fact says a class defined inside @layer utilities "is no longer registered as a utility and gets no variant support (hover:, md:)". Measured against the ladder with @utility as the control beside it: true at 4.0.0, 4.1.0 and 4.2.0; FALSE at 4.3.0 and 4.3.3, where @layer utilities produces variant support byte-identical to @utility's (.hover:tab-4 { &:hover { @media (hover: hover) { tab-size: 4 } } } at 4.3.0, flat at 4.3.3). A facts.json entry means what is true now, and this one is not. It is a published S1.
LF27's mechanism clause is false from 4.1.0. The fact says "4.x rewrites a bg-gradient-to-* candidate to bg-linear-to-* before compiling it". If that is what happened the two candidates would emit the same declarations. They do at 4.0.0 and diverge from 4.1.0, where bg-linear-to-r gained an @supports interpolation branch and bg-gradient-to-r kept the older in oklab form. The fact's other two claims survive and were checked separately: the rename happened (bg-linear-45 and bg-radial rise at 4.0.0) and v3 markup does still render a gradient at every rung. Only the alias-identity claim fails.
And a third, which the probe records rather than reports: LF1 overstates its own first clause. @tailwind utilities; alone still compiles to a working utility sheet at 4.0.0 and at 4.3.3 — 93 bytes carrying .flex. What v4 removed is @tailwind base (10,210 bytes of preflight on 3.4.17, 15 bytes on every v4 rung) and @tailwind components. "The three @tailwind directives were removed" is true of two of the three.
Why nothing was rewritten. bisect-facts.mjs's contract is that it reports and never edits facts.json, because a correction is a decision. Three reasons this session is the wrong one to take it: the session that built the instrument and would gain from its findings is not the session that should also make the judgement call they surface (the JOURNAL/046 order this corpus applies to findings, and the same argument holds here); LF11's correction needs a citation for whatever changed at 4.3.0, and the only network tool sanctioned in this tree is fetch-releases.mjs; and LF11's restatement is not a date edit but a rewrite of what the fact claims, which is exactly the kind of change JOURNAL/199 watched go wrong when it was drafted from a reading taken at one release and generalised across a major. All three are in BACKLOG 0e(d)-i with their measurements and the source each one still owes.
What the ladder is, and the one thing it is not
Seven rungs: 3.4.0, 3.4.17, 4.0.0, 4.1.0, 4.2.0, 4.3.0, 4.3.3 — every stable release releases.json tracks, the newest patch at the fetch, and two rungs below the major. Those two are not decoration: 27 of this library's 34 facts are dated at 4.0.0, and without a release below it the ladder's floor would be the boundary for all 27 — the AT_FLOOR verdict, which is the bound zod's eight 4.0.0 facts still carry (BACKLOG 11k-t-iii). With them, all 27 have a rung to be false at, and the ones with rows are CONFIRMED rather than bounded.
tailwindcss: "sp-tw-bisect" is now in ladder-check.mjs's TREES, so the ladder is visible to the instrument that can tell a shell from an install, and --reach reports it against releases.json like the other five.
What it is not is coverage. 18 of 34 facts have executable rows; 16 do not, and they are listed in the probe file's unprobeable with a reason each. The honest split: three are claims about other packages or toolchains (LF3's @tailwindcss/postcss and @tailwindcss/cli, LF13's Vue/Svelte/Astro, LF25's Sass/Less/Stylus) and one has no compiler shadow at all (LF26, a browser baseline), so four are out of this instrument's reach by their own content. The other twelve are reachable and simply not written — four need a scratch project on disk (LF2, LF12, LF22, LF28 all turn on config detection or a directory to scan) and eight need rows this session did not have time for. A probe file that listed only the first four would publish a flattering denominator, which is the error ladder-check.mjs --reach was built to stop (JOURNAL/183).
Counts
Runs 178 and findings 172, both unchanged — this session ran no battery and charges nothing, which is the condition the fact-correction items now wait on. No published fact moved, no date moved, data/index.json byte-unchanged, and all six pre-commit checks green. The Index's dated facts reachable by a bisector go from 124 of 224 to 158 of 224; the probed count goes from 124 to 142, and those two numbers are different on purpose.