Skip to content

ci-cd-pipeline.md's "Five workflows subscribe" merge_group list is short by one (skills-paths.yml, since #3735) — the #3261 shape, one subsystem over #4154

Description

@yinlianghui

Found while implementing #3782 (PR #4153), whose card asked for a sweep of the same page for other hand-copied enumerations of the same shape. Filed separately rather than bundled — which is the discipline that produced #3782 itself, kept out of #3279's PR for the same reason.

The claim

content/docs/guide/ci-cd-pipeline.md, in ## Merge Queue:

Five workflows subscribe: `ci.yml`, `lint.yml`, `control-bytes.yml`, `docs-links.yml` and
`changeset-presence.yml` (the last added with the gate itself, in #3387 ...)

Six do

merge_group: in the on: block, measured on main@36ae2705b:

.github/workflows/changeset-presence.yml
.github/workflows/ci.yml
.github/workflows/control-bytes.yml
.github/workflows/docs-links.yml
.github/workflows/lint.yml
.github/workflows/skills-paths.yml      <- absent from the page

skills-paths.yml subscribes for real — a merge_group: trigger with types: [checks_requested], added by #3735 (merged as #3864), carrying its own comment explaining that an unfiltered gate which could become required subscribes from the start.

The repo already knows this: scripts/__tests__/merge-queue-reporting.test.ts's hand-maintained MUST_SUBSCRIBE_MERGE_GROUP map has six entries, including

['skills-paths.yml', 'produces Skill Guide Path Check — added by objectui#3735, same shape as the
  two above: its entire scan surface is markdown, so it carries no path filter, reports on every
  pull request, and is therefore requirable'],

So the guard pins the workflows, and nothing pins the page's copy of the list. The page went stale the moment #3735 landed.

Why this matters more than an off-by-one

This is #3261's defect verbatim, one subsystem over: a count that says N and an enumeration short by one, where a stale list reads exactly as authoritative as a fresh one. The specific reader harmed is the one the surrounding paragraph is written for — someone deciding whether a new gate of theirs has to subscribe. The parenthetical even states the selection rule ("a gate that carries no path filter reports on every pull request and is therefore requirable, which is exactly the property this list tracks"), and skills-paths.yml is the clearest instance of that rule on main. Omitting it teaches the rule and then contradicts it with the example set.

The consequence of the underlying mistake is documented on the same page and is not subtle: a queue whose required set is empty merges without validating, which is how three PRs merged with Type Check at conclusion=failure on 2026-08-07.

Why it was not fixed in PR #4153

Different fact, and the fix is not mechanical. #4153's guard extension is specific to the object-ui/* error ratchets, so it cannot cover this sentence. And unlike the ratchet parenthesis, this enumeration is load-bearing for the paragraph's argument — "None of the first four did until #3523" needs the four named — so converging it on evergreen phrasing is a wording decision of exactly the A/B kind #3782 needed a ruling for, not a swap.

Options, for whoever picks this up:

Leaning B or C for the same reason #3782 was ruled A: the only honest list is the one something reads.

Checked and NOT a defect

Recorded so it is not re-chased: the same page's "Every publishable package is in one fixed group (39 packages)" looks like the same shape but is correct. .changeset/config.json lists 40 entries; exactly one of them, object-ui at packages/vscode-extension, is private: true, leaving 39 publishable. (scripts/__tests__/check-changeset-no-major.test.ts says 39 in its docblock too, and is likewise right.)


Generated by Claude Code

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions