You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
finding(gate): the version-literal ledger cannot see node-version: 20 — the word version sits between the toolchain name and the number, and that is how every workflow example in the docs spells a Node version #6409
Filed unassigned by the domain:devx @ objectui execution seat (#5748), PM session session_012CZgmFFzqA9cX8tBMhvpFe, R33. ⛔ I do not set domain:* or type labels — routing and grading are the triage seat's. Deduped before filing: #6307 (closed the **bold** spelling) and #6313 are the nearest cards; neither covers this spelling.
Measured by the dev on #6308 while correcting a false explanation I had written on that card. I asserted there — and repeated in the dispatch order — that the ledger missed those literals because doc-version-claims.test.ts"skips fences by design". ⛔ That is false: the file's own header says "Fences are SCANNED… the opposite of check-doc-links.mjs, on purpose", and the scan loop calls collect() on fenced lines. The real cause is narrower and is a live hole.
The blind spelling
SEP matches the run of characters between a toolchain name and its version. It admits backticks, quotes, whitespace, colons, commas, pipes, brackets, a dash — and, since #6307, * and _. It cannot cross a word.
So in:
node-version: 20
the literal word version sits between node and 20. TOOLCHAIN + SEP + VERSION never matches, the literal is never collected, and the ratchet's "every literal is either exempt or inventoried" promise silently does not hold for it.
⭐ This is how every workflow example in the docs spells a Node version. It is not an exotic shape — it is the shape.
Two neighbouring spellings from the same measurement, recorded for completeness but ⚠️not claimed as equally important, since they are action pins rather than toolchain floors:
line
what breaks the match
actions/setup-node@v4
@ between the toolchain word and the version
pnpm/action-setup@v4
/action-setup@ between pnpm and the version
Why it matters
⛔ Not hypothetical, and not stale: the instance that produced this finding was node-version: 20 in content/docs/guide/ci-cd-pipeline.md, in a block headed "Follow the existing pattern". It sat below the declared engines.node floor of 22.11, so a contributor following the page would have written a workflow the repo's own manifest rejects. It was fixed by #6308 / PR #6408 — by hand, because no gate could see it.
⚠️ The failure direction is the bad one, and it is the same one #6307 was filed for: the gate reports green over claims it never examined. #6307 closed one spelling; this is another, and this one is the canonical spelling for the toolchain whose floor moved twice today (#5306 → >=22.11, #6313 → the derived pin).
What would settle it — and ⚠️ the trap
Whoever takes this should start from #6307's worked example, which is on PR #6401:
⛔ Not asserted: that every node-version: line in the docs is wrong. Most will now be right. The claim is only that the ledger cannot see any of them, so their correctness is unverified rather than checked.
Related: #6307 / PR #6401 (the **bold** spelling, same family, same file) · #6308 / PR #6408 (the instance, fixed by hand) · #6313 (the Node floor's other pin) · #5306 (the floor that moved)
Filed unassigned by the
domain:devx@ objectui execution seat (#5748), PM sessionsession_012CZgmFFzqA9cX8tBMhvpFe, R33. ⛔ I do not setdomain:*or type labels — routing and grading are the triage seat's. Deduped before filing: #6307 (closed the**bold**spelling) and #6313 are the nearest cards; neither covers this spelling.Measured by the dev on #6308 while correcting a false explanation I had written on that card. I asserted there — and repeated in the dispatch order — that the ledger missed those literals because
doc-version-claims.test.ts"skips fences by design". ⛔ That is false: the file's own header says "Fences are SCANNED… the opposite ofcheck-doc-links.mjs, on purpose", and the scan loop callscollect()on fenced lines. The real cause is narrower and is a live hole.The blind spelling
SEPmatches the run of characters between a toolchain name and its version. It admits backticks, quotes, whitespace, colons, commas, pipes, brackets, a dash — and, since #6307,*and_. It cannot cross a word.So in:
the literal word
versionsits betweennodeand20.TOOLCHAIN + SEP + VERSIONnever matches, the literal is never collected, and the ratchet's "every literal is either exempt or inventoried" promise silently does not hold for it.⭐ This is how every workflow example in the docs spells a Node version. It is not an exotic shape — it is the shape.
Two neighbouring spellings from the same measurement, recorded for completeness but⚠️ not claimed as equally important, since they are action pins rather than toolchain floors:
actions/setup-node@v4@between the toolchain word and the versionpnpm/action-setup@v4/action-setup@betweenpnpmand the versionWhy it matters
⛔ Not hypothetical, and not stale: the instance that produced this finding was
node-version: 20incontent/docs/guide/ci-cd-pipeline.md, in a block headed "Follow the existing pattern". It sat below the declaredengines.nodefloor of 22.11, so a contributor following the page would have written a workflow the repo's own manifest rejects. It was fixed by #6308 / PR #6408 — by hand, because no gate could see it.>=22.11, #6313 → the derived pin).What would settle it — and⚠️ the trap
Whoever takes this should start from #6307's worked example, which is on PR #6401:
SEPcannot fix this. finding(docs): the consumer-facing Node/pnpm floors in two guides are anchored to nothing — and the version-literal ledger cannot see them, because its separator class excludes**bold**#6307 already established the shape of that limit —_Node.js_stays invisible no matter what goes in the character class, because\bfires on neither side of a word character. Here the obstacle is a word, not a separator character. WideningSEPto admit[a-z]would make it match almost anything and destroy the gate. The fix is more likely a second recogniser for thename-version: Nshape, or an alias list that treatsnode-versionas a spelling of theNodetoolchain.**bold**#6307 did — each new hit is a real claim to inventory or an exemption with a stated reason. ⛔ Do not bulk-add toKNOWN_CLAIMSto get green; an entry written to silence a gate is worse than the blind spot it replaces.**bold**#6307 hit: docs(ci-cd-pipeline): the "follow the existing pattern" workflow snippet teachessetup-node@v4+node-version: 20+pnpm/action-setup, none of which this repo uses #6308 has now deleted the onlynode-version: 20this corpus had. If the repaired corpus contains no instance of the spelling, reverting your change becomes unobservable and the blind spot returns unnoticed. finding(docs): the consumer-facing Node/pnpm floors in two guides are anchored to nothing — and the version-literal ledger cannot see them, because its separator class excludes**bold**#6307's answer was a permanent fixture test that rebuilds the pre-fix recogniser and asserts it fails on the same line the new one matches — copy that shape.⛔ Not asserted: that every
node-version:line in the docs is wrong. Most will now be right. The claim is only that the ledger cannot see any of them, so their correctness is unverified rather than checked.Related: #6307 / PR #6401 (the
**bold**spelling, same family, same file) · #6308 / PR #6408 (the instance, fixed by hand) · #6313 (the Node floor's other pin) · #5306 (the floor that moved)Generated by Claude Code