Skip to content

docs(guide): replace invented Node/pnpm floors with what CI exercises, and let the version-claim scan see emphasis - #6401

Merged
os-warren merged 2 commits into
mainfrom
claude/issue-6307-bold-version-literals
Aug 25, 2026
Merged

docs(guide): replace invented Node/pnpm floors with what CI exercises, and let the version-claim scan see emphasis#6401
os-warren merged 2 commits into
mainfrom
claude/issue-6307-bold-version-literals

Conversation

@os-warren

@os-warrenos-warren commented Aug 25, 2026

Copy link
Copy Markdown
Collaborator

Fixes#6307

Both halves, in the ruled order: half 2 first, because it defines half 1's surface.

All readings below were taken on 992bcec7f, the final commit of this branch.

Half 2 — the scan was blind to **bold**

SEP, the class between a toolchain name and its version, admitted backticks, quotes, whitespace, colons, commas, pipes and brackets — and not *. It now admits * and _:

-const SEP = '[' + TICK + '\'"\\s:,|)\\]]{0,6}(?:[-—]\\s*)?[' + TICK + '\'"]?\\s*';+const SEP = '[' + TICK + '\'"\\s:,|)\\]*_]{0,6}(?:[-—]\\s*)?[' + TICK + '\'"]?\\s*';

Blind, then seeing — the gate's own output in both states

Before (b362c1b47, the branch point), pnpm exec vitest run scripts/__tests__/doc-version-claims.test.ts:

 Test Files 1 passed (1)
Tests 18 passed (18)

Green — and green here does not mean "examined and found sound". The two pages carrying **Node.js** 20+ appear in no KNOWN_CLAIMS entry and in no failure, because the scan never matched them.

Proven positively rather than inferred from a green run, with a control in the same sweep. The probe lifts OP, VERSION, FIRST_PARTY, TOOLCHAIN, TICK, SEP and CLAIM_RES verbatim out of the test file's own source and evaluates them, so the only difference between the two runs is that file's SEP line:

# SEP as of b362c1b47
content/docs/guide/quick-start.md -> 0 claim(s)
content/docs/guide/building-crud-app.md -> 0 claim(s)
content/docs/guide/ci-cd-pipeline.md -> 1 claim(s) <- CONTROL, matched
content/docs/guide/ci-cd-pipeline.md:196: Node 22.x
# SEP with * and _
content/docs/guide/quick-start.md -> 2 claim(s)
content/docs/guide/quick-start.md:12: Node.js** 20+
content/docs/guide/quick-start.md:13: pnpm** 9+
content/docs/guide/building-crud-app.md -> 2 claim(s)
content/docs/guide/building-crud-app.md:12: Node.js** 20+
content/docs/guide/building-crud-app.md:12: pnpm** 9+
content/docs/guide/ci-cd-pipeline.md -> 1 claim(s) <- CONTROL, still matched
content/docs/guide/ci-cd-pipeline.md:196: Node 22.x

After the SEP line changed and before anything else, the gate itself goes red and names them:

AssertionError: These doc surfaces state a version and nothing in this repository can tell whether it is still true:
- content/docs/guide/building-crud-app.md:12 "Node.js** 20+"
- content/docs/guide/building-crud-app.md:12 "pnpm** 9+"
- content/docs/guide/quick-start.md:12 "Node.js** 20+"
- content/docs/guide/quick-start.md:13 "pnpm** 9+"

Corpus-wide delta, over the 241 files the three SCAN_ROOTS resolve to: 33 matched literals before, 37 after — four new, none lost. The four are exactly the ones above.

Triage — every literal the widened scan surfaced

LiteralDispositionReason
quick-start.md:12**Node.js** 20+Deleted, no ledger entryA floor nothing declares and nothing tests — see half 1. The gate's own failure message prefers deleting over ledgering for exactly this case, and the downward half of the ratchet forbids an entry naming a claim no longer in the tree.
quick-start.md:13**pnpm** 9+Deleted, no ledger entrySame.
building-crud-app.md:12**Node.js** 20+Deleted, no ledger entrySame.
building-crud-app.md:12**pnpm** 9+Deleted, no ledger entrySame.

No other literal anywhere in the three scan roots changed state, so nothing was bulk-added to keep the gate quiet. The four entries this PR does add to KNOWN_CLAIMS are for the sentences that replace them, each anchored and each naming the anchor it can be re-measured against.

The widening keeps a witness after the repair

After half 1 the corpus holds no emphasised claim at all, and the replacement sentences separate name from version with a plain space. So on the corpus alone, reverting SEP would change nothing observable and this gate would report green over the same blind spot — the second-order form of the defect. it('reads a claim through markdown emphasis, so the widened separator is not decorative') is the permanent witness: a fixture through claimsIn, plus the pre-#6307 class rebuilt inline and asserted not to match the same line.

Reverse-verified on the committed tree (mutation confirmed on disk by blob hash 51dc12f… to 2d1d830… and by the widened spelling going to 0 occurrences; restored by git checkout HEAD -- plus the absolute path, verified back to 51dc12f… with git diff HEAD empty):

 ❯ reverting SEP to its pre-#6307 spelling
FAIL reads a claim through markdown emphasis, so the widened separator is not decorative
AssertionError: a toolchain name wrapped in markdown emphasis must still produce a claim:
expected [] to deeply equal [ 'Node.js** 20+', 'pnpm* 9+' ]
Test Files 1 failed (1)
Tests 1 failed | 18 passed (19)

Predicted direction and observed direction agree, including which test goes red: only the new fixture. The ratchet stays green, which is the whole reason the fixture had to exist.

The boundary the widening does not cross, pinned rather than assumed

_ is in the class and costs nothing, but underscore emphasis around a name is still invisible and no character class can reach it: _ is a word character, so the \b on each side of TOOLCHAIN fires on neither side of _Node.js_, and the match fails before SEP is consulted. Measured across the three scan roots: zero underscore-emphasised toolchain names (control, same sweep: six files carry the bold spelling, e.g. content/docs/utilities/runner.mdx:446). Recorded as a documented boundary with an assertion that goes red if it ever changes, not repaired by widening \b into a lookaround nothing has asked for.

Half 1 (ruled B) — say what is true, not a floor nobody measured

Both pages, identically:

-- **Node.js** 20+-- **pnpm** 9+ or npm/yarn+- **Node.js** and **pnpm** (or npm/yarn) — ObjectUI is tested on Node 22.x with pnpm 10.x.

It leads with what the reader installs, and states the measured fact as what this project tests on — never as a requirement. (First wording on this branch put the engines audit in the bullet itself; that reasoning lives in the changeset, the file docblock and the card, not on a getting-started page.)

Re-measured on this branch's base rather than copied from the card's 12:16Z reading:

  • Node — 27 node-version: declarations across .github/workflows: 26 read '22.x', the 27th (half-state-patrol.yml:196) reads '22'. Nothing runs Node 20.
  • pnpm — root packageManager is pnpm@10.31.0, and 17 run: corepack enable steps across 12 workflow files mean that field is what CI installs with. (pnpm install in this worktree reported pnpm v10.31.0.)
  • No consumer floor exists to restate — of 46 workspace manifests, zero declare engines.node or engines.pnpm; the only engines block outside the root is packages/vscode-extension's engines.vscode (control for that zero: the root manifest, which does declare node: ">=22.11" / pnpm: ">=10").

Root engines is deliberately not what these pages cite: they address the reader's own project, which is why #5306 left them alone.

Both literals the ledger pins on these pages survive the rewrite verbatim — one occurrence each, per page:

content/docs/guide/quick-start.md | Node 22.x -> 1 :12
content/docs/guide/quick-start.md | pnpm 10.x -> 1 :12
content/docs/guide/building-crud-app.md | Node 22.x -> 1 :12
content/docs/guide/building-crud-app.md | pnpm 10.x -> 1 :12

Verification

Run at 992bcec7f (the final commit), from the repo root:

CheckResult
pnpm exec vitest run scripts/__tests__/doc-version-claims.test.tsTest Files 1 passed (1) / Tests 19 passed (19)
pnpm exec vitest run scripts/__tests__/ (whole gate-test tree)Test Files 79 passed (79) / Tests 2280 passed (2280)
node scripts/check-doc-links.mjsLinks are valid across 17 scan roots.
node scripts/check-doc-fence-languages.mjs✅ check:doc-fences — every TypeScript block in 223 document(s) …
pnpm run check:doc-types✅ Every documented component type is registered.
node scripts/check-control-bytes.mjs✅ check-control-bytes: OK (scanned 5277 tracked text file(s); …)
node scripts/check-changeset-presence.mjs✅ No source of a released package changed in this range …
node scripts/check-changeset-no-major.mjs✅ No changeset declares a `major` bump.
node scripts/check-changeset-fixed.mjs✅ All workspace packages are in the changeset fixed group.
pnpm run type-check:scriptsexit 0; --listFiles confirms doc-version-claims.test.ts is in the program (133 files from scripts/)
pnpm run lint:rootexit 0 — full run, 9s, 28 warnings, 0 errors, none in the changed file

The whole-tree, changeset, type-check and lint rows were measured on 37f6f5990; the follow-up commit 992bcec7f changes two lines of markdown prose and nothing else, and the gate, doc-link, doc-fence and doc-type rows above were re-run on it.

Declared narrowing, one check:pnpm run check:doc-snippets exits 2 = PRECONDITION NOT MET here ("the snippet program was NOT run"; it needs 21 packages built first) — so it is not measured locally, neither green nor red. Narrowed on the grounds that it compiles fencedts/tsx blocks and this diff touches none: the changed hunks are at line 12 of each page and the first fence delimiter in each file is at line 19. CI runs it in full regardless.

Scope notes


Generated by Claude Code

The prerequisite bullets of quick-start.md and building-crud-app.md stated
`**Node.js** 20+` and `**pnpm** 9+` for the reader's OWN project. Nothing in
this tree backs those numbers: of the 46 workspace manifests, zero declare
`engines.node` or `engines.pnpm`, and no lane runs Node 20 (26 of the 27
`node-version:` declarations in .github/workflows read '22.x', the 27th '22').
Both pages now state what is measurable — the packages are built and tested on
Node 22.x with pnpm 10.x, worded as what CI exercises rather than as a
requirement.
Also widens `SEP` in scripts/__tests__/doc-version-claims.test.ts to admit `*`
and `_`. That class sat between a toolchain name and its version and omitted
`*`, so `**Node.js** 20+` never matched TOOLCHAIN + SEP + VERSION and the
ratchet reported green over four literals it had never examined. Measured over
the 241 files the three scan roots resolve to: 33 matched literals before, 37
after, none lost. The four are deleted rather than ledgered; the sentences
replacing them are inventoried as `anchored`, each naming its anchor.
A new fixture test keeps the widening measurable now that the repaired corpus
carries no emphasised claim, and pins the boundary it does not cross —
`_Node.js_ 20+` stays invisible because `_` is a word character, so the `\b` on
each side of the toolchain name fires on neither side of it.
objectui#6307
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012CZgmFFzqA9cX8tBMhvpFe
…alls
Review pass on the same two bullets: the previous wording opened with this
repository's manifest situation ("the published packages declare no Node or
pnpm `engines` floor"), which is gate rationale rather than something a reader
about to run `pnpm create vite` needs. The bullet now leads with what to
install and states the measured fact as what ObjectUI is tested on, so ruling B
is unchanged: still no invented consumer floor, still not phrased as a
requirement.
Both literals the version-claim ledger pins on these pages — `Node 22.x` and
`pnpm 10.x` — survive verbatim on both, so the four KNOWN_CLAIMS entries stay
resolvable and the ratchet's downward half stays green.
objectui#6307
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012CZgmFFzqA9cX8tBMhvpFe
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

2 participants

@os-warren@claude