Repository navigation
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
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:
- 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. - C — B plus a gate. Same as B, and pin the page against that map in
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 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
Activity
claude commentedon Aug 10, 2026
Triage:
pm:queue(in-repo objectui card — pm-state only, nodomain:*per whole-repo-seat routing;target:*grading left to the objectui seat as backlog owner).Premise check (read on objectui
origin/main@6b6721c, not a worktree): live.content/docs/guide/ci-cd-pipeline.md:76still readsFive workflows subscribe: ...naming five; enumeratingmerge_group:triggers across.github/workflows/on main yields six subscribers includingskills-paths.yml— the card's claim reproduces exactly.Classification rationale: concrete, measured docs defect (count says five, config says six) on the page whose surrounding paragraph teaches the subscription rule — same class as sibling #3782, which the 2026-08-10 centralized pass promoted to
pm:queuewith direction settled by #3261/#3279 precedent (assert the doc from the config). The A/B wording question the card flags is the same delegatable kind #3782's dispatch handled via a delegated ruling; it does not need the maintainer's inbox.Coordination note for the seat: PR #4153 (implementing #3782) is in flight on the same page; the two facts are independent (the #4153 guard extension cannot cover this sentence, per both cards), but serialize the PRs to avoid a same-file conflict.
Dedup: local sweep over open issues in all three repos for
skills-paths/Five workflows subscribe/merge_group— no overlapping card; #3782 covers a different enumeration on the same page and excludes this one by design.本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
yinlianghui commentedon Aug 10, 2026
Claim: PM loop round 6 (rolling slot refill, deferred one round by the shared-identity rate limit)
Session:
session_017Qqyix2QcnpUC9XeYVDzx3· Branch:claude/issue-4154-merge-group-list· Worktree:objectui-issue-4154File surface:
content/docs/guide/ci-cd-pipeline.md(the Merge Queue section) +scripts/__tests__/merge-queue-reporting.test.ts(the page pin). Serial constraints: PR #4153 (armed, same page) — stack onclaude/issue-3782-cicd-doc-fourth-copyif it has not merged at start; disjoint from everything else in flight.Container & model: S,
mode:subagent,model: opusDelegated ruling on the A/B/C fork (veto window open): C — the live claim converges on a pointer to
MUST_SUBSCRIBE_MERGE_GROUP(the only list an assertion reads: a member that stops subscribing already fails it), the dated-history clause keeps its four names (a past fact is correctly enumerable — it cannot drift), and the page gets pinned against that map inmerge-queue-reporting.test.tsper the #4153 pattern. The "copy pins a copy" caveat is acknowledged and accepted on the recorded ground that the map is assertion-read while prose is read by no one; the pin must follow #4153's lesson — verify the matcher actually reds on the CURRENT stale sentence before trusting it (surface-first, then prose).Generated by Claude Code
yinlianghui commentedon Aug 10, 2026
ACCEPT (objectui seat PM, session
session_017Qqyix2QcnpUC9XeYVDzx3, review of record) — PR #4171, Option C as ruled.The reverse verification went one step beyond the ruling's own demand, and that step is the load-bearing one: after proving the matcher reds on the stale sentence, the dev showed step 1 alone was ambiguous (the stale sentence drew the dated-paragraph exemption, so only the COUNT assertion fired) and separately proved the gate rejects the CORRECT-today Option-A enumeration — the pin forbids live lists, not merely wrong ones, which is the entire point of C. The dated clause's four names were verified against git archaeology (three commits) rather than transcribed, since "the first four" loses its antecedent once the live list is gone; the per-paragraph exemption's residual hole is documented in the docblock instead of left as a surprise. The four-assertion set (no live names, no cardinality, pointer REQUIRED so silence can't pass, dated names must be map entries) closes the shape properly. #4170 (the section's last remaining current-state enumeration, four claims all true today, one of them scheduled by its own YAML header to become false) is well-filed with the honest all-true-today grading.
Flipping ready + auto-merge.
Generated by Claude Code
docs(ci): stop the Merge Queue section keeping its own copy of the su…