Found while implementing #6400 (deriving the node-version set from .github/workflows so the ledger's Node 22.x entries stop restating a hand-written count). Deliberately not fixed there: #6400's PR is test-only and this is a prose edit on a guide page, and — more to the point — this exact sentence is the one the neighbouring ledger entry (ci-cd-pipeline.md :: node-version: 20, landed by #6409) is anchored on. Rewording it is a claim on that entry, not on #6400's.
The sentence
content/docs/guide/ci-cd-pipeline.md:1744, inside the numbered "adding a new workflow" steps:
- Copy the pnpm + Turbo setup from a workflow that runs today, not from a snippet on this
page. A copied YAML block is a fossil the moment it is pasted — this page used to keep
one here, and every line of it had drifted: actions/setup-node@v4 where every workflow
now uses @v7, a hardcoded node-version: 20where every workflow declares '22.x'
(and 20 sat below the floor the root package.json's engines field now declares), and
pnpm/action-setup@v4, which no workflow in this repository has ever used …
Measured on c8ea8af9c (origin/main at 2026-08-26T00:47Z)
$ grep -rhoP "node-version:\s*'22\.x'" .github/workflows/ | wc -l
27
$ grep -rhoP "node-version:\s*'22'" .github/workflows/ | wc -l
1
$ grep -rnP "node-version:\s*'22'" .github/workflows/
.github/workflows/half-state-patrol.yml:196: node-version: '22'
28 declarations across 23 files. 27 are spelled '22.x'; half-state-patrol.yml is spelled '22'. So "every workflow declares '22.x'" is false as written — by one lane, on the spelling, not on the version.
Control, same page and same sweep: the page's three references to readme-exports.yml all resolve to a workflow that exists (.github/workflows/readme-exports.yml), so this is not a page whose workflow references have gone stale wholesale — the rest of the paragraph measures true, including @v7 and the pnpm/action-setup@v4 claim.
Why it is worth a card rather than a shrug
It is the same defect shape as #6400 one layer out: an absolute quantifier over .github/workflows written into prose, which one lane falsifies and nothing re-measures. #6400 moved the ledger's version anchor into a run precisely because a sentence a reader re-measures by is not re-measured by anything; this sentence is on the page rather than in the ledger, and #6400's new assertion deliberately does not cover it (it compares the major a page states against the major the workflows declare — it is blind to spelling, which is the whole reason it can see the '22' lane at all).
The claim the sentence is making is true and worth keeping: a copied block pinning 20 is a fossil, and the tree is on 22 everywhere. What is wrong is the spelling-level absolute.
Two dispositions, both one line:
A is recommended: the sentence is teaching don't copy a fossilised pin, and the spelling of the quote marks is not part of that lesson. Same reasoning #6409 used when it deliberately gave its own node-version: 20 ledger entry no declaration count.
Related: #6400 (the ledger entries for the same page's Node 22.x literal), #6409 (the ledger entry anchored on this very sentence), #6447 (the same class in the pnpm 10.x entries).
Found while implementing #6400 (deriving the
node-versionset from.github/workflowsso the ledger'sNode 22.xentries stop restating a hand-written count). Deliberately not fixed there: #6400's PR is test-only and this is a prose edit on a guide page, and — more to the point — this exact sentence is the one the neighbouring ledger entry (ci-cd-pipeline.md :: node-version: 20, landed by #6409) is anchored on. Rewording it is a claim on that entry, not on #6400's.The sentence
content/docs/guide/ci-cd-pipeline.md:1744, inside the numbered "adding a new workflow" steps:Measured on
c8ea8af9c(origin/main at 2026-08-26T00:47Z)28 declarations across 23 files. 27 are spelled
'22.x';half-state-patrol.ymlis spelled'22'. So "every workflow declares'22.x'" is false as written — by one lane, on the spelling, not on the version.Control, same page and same sweep: the page's three references to
readme-exports.ymlall resolve to a workflow that exists (.github/workflows/readme-exports.yml), so this is not a page whose workflow references have gone stale wholesale — the rest of the paragraph measures true, including@v7and thepnpm/action-setup@v4claim.Why it is worth a card rather than a shrug
It is the same defect shape as #6400 one layer out: an absolute quantifier over
.github/workflowswritten into prose, which one lane falsifies and nothing re-measures. #6400 moved the ledger's version anchor into a run precisely because a sentence a reader re-measures by is not re-measured by anything; this sentence is on the page rather than in the ledger, and #6400's new assertion deliberately does not cover it (it compares the major a page states against the major the workflows declare — it is blind to spelling, which is the whole reason it can see the'22'lane at all).The claim the sentence is making is true and worth keeping: a copied block pinning 20 is a fossil, and the tree is on 22 everywhere. What is wrong is the spelling-level absolute.
Two dispositions, both one line:
node-version: 20where every workflow declares 22". True today, true afterhalf-state-patrol.ymlis normalised or not, and it stops the sentence making a claim about YAML quoting that nothing checks.'22.x'". More precise, and re-introduces exactly the kind of count-shaped fact finding(gate): the version-claim ledger'sci-cd-pipeline.md :: Node 22.xreason states 14node-versiondeclarations; the tree has 27 #6400 was filed about — it goes stale the moment that lane is normalised.A is recommended: the sentence is teaching don't copy a fossilised pin, and the spelling of the quote marks is not part of that lesson. Same reasoning #6409 used when it deliberately gave its own
node-version: 20ledger entry no declaration count.Related: #6400 (the ledger entries for the same page's
Node 22.xliteral), #6409 (the ledger entry anchored on this very sentence), #6447 (the same class in thepnpm 10.xentries).