Skip to content

finding(gate): the version-claim ledger's ci-cd-pipeline.md :: Node 22.x reason states 14 node-version declarations; the tree has 27 #6400

Description

@os-warren

Found while implementing #6307 (widening the version-claim scan's SEP and re-measuring the CI reality behind the two guides). Deliberately not fixed there: #6307's PR adds new ledger entries and repairs two guide pages, and rewriting a neighbouring entry's prose is a different claim on the same file. Filing so the number is recorded rather than carried.

The entry

scripts/__tests__/doc-version-claims.test.ts, KNOWN_CLAIMS:

{file: 'content/docs/guide/ci-cd-pipeline.md',claim: 'Node 22.x',kind: 'anchored',why: 'Matches the 14 node-version: 22.x declarations across .github/workflows. Verified true; this page already has its own pin test (ci-cd-pipeline-doc.test.ts).',},

Measured on b362c1b47 (origin/main at 2026-08-25T19:49Z)

$ grep -rhoP 'node-version:\s*\K\S+' .github/workflows/ | sort | uniq -c
1 '22'
26 '22.x'
$ grep -rhoP 'node-version:\s*\K\S+' .github/workflows/ | wc -l
27
$ grep -rn "node-version: '22'" .github/workflows/
.github/workflows/half-state-patrol.yml:196: node-version: '22'

So the anchor the entry names has nearly doubled (14 → 26 declarations reading '22.x', out of 27 total), and one lane now reads '22' rather than '22.x' — a spelling the sentence does not admit at all. The claim is still true; what drifted is the sentence a reader would re-measure it by, which is what an anchored entry without a skeletonDep rests on entirely.

Second, smaller observation in the same entry, recorded because it is the reason nothing caught the first: ci-cd-pipeline-doc.test.ts does not pin this literal. Measured — grep -nP '\b22\b' scripts/__tests__/ci-cd-pipeline-doc.test.ts returns nothing (control, same file, same sweep: grep -c 'ci.yml' … returns matches), so "this page already has its own pin test" is true of the page and false of the Node 22.x line. Nothing re-measures either half.

Why this class matters here rather than generally

anchored is the strongest class this ledger has, and for entries with no skeletonDep the whole strength is the why string: a reviewer re-runs the command it describes. A why whose numbers no longer match the tree quietly converts that into "someone once checked". Same failure family as the sample misfiling the file's own header records for content/docs/guide/plugins.md — the entry keeps its shape while the fact underneath it moves.

Two dispositions, both cheap:

  • A — re-measure and rewrite the sentence (26 of 27, and name the '22' outlier), leaving it a reviewer-checked anchored entry that is accurate today and will drift again on the next workflow added.
  • B — give this entry a machine-checked anchor the way skeletonDep did for the plugin skeleton: derive the node-version set from .github/workflows and assert the doc literal against it. That also covers the ci-cd-pipeline-doc.test.ts gap above, and is the direction the file's header argues for whenever an anchor is unanimous enough to compute.

Related but distinct: #6308 (the same page's workflow snippet teaches node-version: 20 and pnpm/action-setup, neither of which this repo uses) is about the page's fenced sample; this one is about the ledger entry describing the page's prose literal.

Metadata

Metadata

Assignees

Labels

domain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repopm:dispatched

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions