You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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
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.
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:
A — correct in place. Say "Six" and add skills-paths.yml. Cheapest, keeps the narrative, and puts the page back on the treadmill: correct today, stale at the next subscriber.
B — evergreen the live claim, freeze the history. Split the sentence: the current set becomes a pointer to MUST_SUBSCRIBE_MERGE_GROUP (which is already the maintained list, with a stated reason per workflow), while the "none of the first four did until ⛔ P0:合并队列已强制但零 merge_group 订阅——队列必需集为空、不校验任何东西;今日已兑现三例带红 Type Check 合入(#3503/#3510/#3516) #3523" clause stays as dated history, where naming them is correct precisely because it is a past fact.
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.)
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:Six do
merge_group:in theon:block, measured onmain@36ae2705b:skills-paths.ymlsubscribes for real — amerge_group:trigger withtypes: [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-maintainedMUST_SUBSCRIBE_MERGE_GROUPmap has six entries, includingSo 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.ymlis the clearest instance of that rule onmain. 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=failureon 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:
skills-paths.yml. Cheapest, keeps the narrative, and puts the page back on the treadmill: correct today, stale at the next subscriber.MUST_SUBSCRIBE_MERGE_GROUP(which is already the maintained list, with a stated reason per workflow), while the "none of the first four did until ⛔ P0:合并队列已强制但零 merge_group 订阅——队列必需集为空、不校验任何东西;今日已兑现三例带红 Type Check 合入(#3503/#3510/#3516) #3523" clause stays as dated history, where naming them is correct precisely because it is a past fact.merge-queue-reporting.test.ts, the way docs(ci): drop ci-cd-pipeline.md's hand-copied object-ui ratchet list and put the page under the guard (#3782) #4153 pins the ratchet prose. Note the honest caveat from ci-cd-pipeline.md 里 object-ui ratchet 的括号列举是同一事实的第四份手抄清单(目前恰好完整,但无门禁) #3782's own analysis: the map is itself hand-maintained, so C pins a copy to a copy — though that map, unlike prose, is at least read by an assertion that fails when a listed workflow stops subscribing.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
fixedgroup (39 packages)" looks like the same shape but is correct..changeset/config.jsonlists 40 entries; exactly one of them,object-uiatpackages/vscode-extension, isprivate: true, leaving 39 publishable. (scripts/__tests__/check-changeset-no-major.test.tssays 39 in its docblock too, and is likewise right.)Generated by Claude Code