Found while implementing #8015, which fixed exactly this class in the ## Lint (lint.yml) section
and generalised scripts/__tests__/ci-cd-pipeline-doc.test.ts's command-parity rule to module scope
so a second section costs three lines to pin. Filing rather than fixing: this needs per-section
judgement, not a sweep — see the false-positive note at the bottom.
The class
content/docs/guide/ci-cd-pipeline.md gives every workflow its own section. Only two of those
sections are now held to what their jobs actually RUN:
Every other section is held only by the workflow-INVENTORY pin, which requires a heading naming the
.yml file and asserts nothing about the heading's contents. So each of those sections can name a
gate its job does not run, or omit one it does, indefinitely and greenly — the #3653 shape, one
section over.
Two instances, verified by hand on 4b4d35a7d
1. ## Inert vi.mock Specifiers (vi-mock-specifiers.yml) says, in full:
Runs scripts/check-vi-mock-specifiers.mjs.
The workflow runs two gates:
.github/workflows/vi-mock-specifiers.yml:96: run: node scripts/check-vi-mock-specifiers.mjs
.github/workflows/vi-mock-specifiers.yml:116: run: node scripts/check-vi-mock-inherit.mjs
check-vi-mock-inherit.mjs is a blocking gate that the page does not mention. It was widened three
commits ago by #8414 (4b5e07a53), which is the same drift rate #8015 records.
2. ### Shadcn Component Check (shadcn-check.yml) describes the job in three prose bullets
("Runs offline and online analysis of shadcn/ui components") and names none of the three
first-party commands the job runs: pnpm shadcn:analyze, pnpm shadcn:check and
scripts/shadcn-check-report.mjs.
Reproduce
The rule now lives at module scope in scripts/__tests__/ci-cd-pipeline-doc.test.ts
(commandParity(workflowFile, jobKey, documentationText) plus undocumentedCommands /
phantomCommands), so an instance is one call. For the first one:
commandParity('vi-mock-specifiers.yml', 'check', viMockSection())
Why this is not a sweep — read before writing the fix
A naive extension that pairs every ## Heading (some.yml) section against every job in that
workflow flags 24 of the 34 sections on the page. Most of those are NOT defects:
- a section legitimately names a neighbouring gate for contrast (
check-links.yml's section names
scripts/check-doc-links.mjs, which docs-links.yml runs — the page says so);
pre-install-import-graph.yml's section names scripts/some-gate.mjs, an illustrative
placeholder in a code block;
- several sections name the
pnpm check:* ALIAS while the workflow invokes node scripts/…
directly, which is a real and deliberate distinction the workflows document (pre-install
placement), not a phantom gate.
ci.yml's table and lint.yml's section each needed a decision about what their documentation
surface IS before the rule could be pointed at it. A gate that cries wolf gets switched off rather
than fixed — this repository's own words, in check-unreferenced-sources. So the fix is
section-by-section with the alias question settled first, not one loop over the page.
Scope note: not a rider on #8015's PR — that card's acceptance is the lint.yml section, and
this document is under concurrent edit (#8006, #8417 and #8015 all landed or are open on it today).
Found while implementing #8015, which fixed exactly this class in the
## Lint (lint.yml)sectionand generalised
scripts/__tests__/ci-cd-pipeline-doc.test.ts's command-parity rule to module scopeso a second section costs three lines to pin. Filing rather than fixing: this needs per-section
judgement, not a sweep — see the false-positive note at the bottom.
The class
content/docs/guide/ci-cd-pipeline.mdgives every workflow its own section. Only two of thosesections are now held to what their jobs actually RUN:
ci.yml, by the job table'sWhat it runscolumn (ci-cd-pipeline.md 的 type-check 行漏了pnpm check:i18n-keys,而 ci-cd-pipeline-doc.test.ts 的钉子按「作业」而非「步骤」判定,看不见这类漏项 #3653), andlint.yml, by finding(docs): ci-cd-pipeline.md's Lint section names 1 of the 4scripts/check-*.mjsgates that job runs, and nothing pins it the wayci.yml's job table is pinned #8015.Every other section is held only by the workflow-INVENTORY pin, which requires a heading naming the
.ymlfile and asserts nothing about the heading's contents. So each of those sections can name agate its job does not run, or omit one it does, indefinitely and greenly — the #3653 shape, one
section over.
Two instances, verified by hand on
4b4d35a7d1.
## Inert vi.mock Specifiers (vi-mock-specifiers.yml)says, in full:The workflow runs two gates:
check-vi-mock-inherit.mjsis a blocking gate that the page does not mention. It was widened threecommits ago by #8414 (
4b5e07a53), which is the same drift rate #8015 records.2.
### Shadcn Component Check (shadcn-check.yml)describes the job in three prose bullets("Runs offline and online analysis of shadcn/ui components") and names none of the three
first-party commands the job runs:
pnpm shadcn:analyze,pnpm shadcn:checkandscripts/shadcn-check-report.mjs.Reproduce
The rule now lives at module scope in
scripts/__tests__/ci-cd-pipeline-doc.test.ts(
commandParity(workflowFile, jobKey, documentationText)plusundocumentedCommands/phantomCommands), so an instance is one call. For the first one:Why this is not a sweep — read before writing the fix
A naive extension that pairs every
## Heading (some.yml)section against every job in thatworkflow flags 24 of the 34 sections on the page. Most of those are NOT defects:
check-links.yml's section namesscripts/check-doc-links.mjs, whichdocs-links.ymlruns — the page says so);pre-install-import-graph.yml's section namesscripts/some-gate.mjs, an illustrativeplaceholder in a code block;
pnpm check:*ALIAS while the workflow invokesnode scripts/…directly, which is a real and deliberate distinction the workflows document (pre-install
placement), not a phantom gate.
ci.yml's table andlint.yml's section each needed a decision about what their documentationsurface IS before the rule could be pointed at it. A gate that cries wolf gets switched off rather
than fixed — this repository's own words, in
check-unreferenced-sources. So the fix issection-by-section with the alias question settled first, not one loop over the page.
Scope note: not a rider on #8015's PR — that card's acceptance is the
lint.ymlsection, andthis document is under concurrent edit (#8006, #8417 and #8015 all landed or are open on it today).