Skip to content

finding(ci): MUST_SUBSCRIBE_MERGE_GROUP names 6 workflows but 8 unfiltered blocking checks exist — the two doc gates subscribe merge_group today with nothing asserting they keep doing so #6160

Description

@yinlianghui-tw

Found while doing #6148 (PR #6159). Not fixed there — out of that card's scope, and it is an observation about a hand-maintained floor rather than a live breach.

What was measured

scripts/__tests__/merge-queue-reporting.test.ts's MUST_SUBSCRIBE_MERGE_GROUP is a hand-maintained map of workflow file -> why it must subscribe merge_group. Its own header says why it has to be hand-maintained: "may this context be required?" is a property of repository settings, not of the YAML, so nothing mechanical can derive the set.

It names six workflows today: ci.yml, lint.yml, control-bytes.yml, docs-links.yml, changeset-presence.yml, skills-paths.yml.

scripts/dependabot-merge-gate.mjs's REQUIRED_CONTEXTS — the other declaration of "this check is blocking and reports on every PR" — carries two more workflows' checks:

workflowcheckin REQUIRED_CONTEXTS?in MUST_SUBSCRIBE_MERGE_GROUP?subscribes merge_group on disk?
doc-component-types.ymlDoc Component Type Checkyesnoyes
doc-snippet-types.ymlDoc Snippet Type Checkyesnoyes

Measured on main@228909995: grep -c '^ merge_group:' returns 1 for both files.

Why it is worth recording

Nothing is broken right now — both workflows really do subscribe, so the queue is not stalled by either. What is missing is the assertion.

The map exists precisely because a required context that does not report on a queue build does not fail the queue, it stalls it until the ruleset's 60-minute status-check timeout (#3523, which cost #3503 / #3510 / #3516 merging with Type Check at conclusion=failure). Delete the merge_group: trigger from docs-links.yml and that test goes red; delete it from doc-component-types.yml and nothing anywhere notices until a queue build hangs.

So this is the same shape as #4154 one file over — a hand-maintained enumeration that fell behind the thing it enumerates — except here the drift is in a test's floor rather than in prose, which makes it quieter.

Shape of a fix, if it is taken

Two candidates, and the choice is a judgement rather than mechanical:

  1. Add the two entries. Cheapest, keeps the map's stated purpose (a human declares requirability), and leaves the same gap open for the ninth workflow.
  2. Cross-check the two declarations against each other.REQUIRED_CONTEXTS already names the checks; dependabot-merge-gate.test.ts already maps check names back to the workflow files that produce them. Asserting that every workflow producing a REQUIRED_CONTEXTS check also subscribes merge_group would make the floor derive itself from the other declaration, and the hand-maintained map could keep carrying only the reasons. That is strictly more coverage, and it is also more machinery in a test that is already dense.

PR #6159 added its own new workflow to the map by hand, i.e. it took route 1 for one entry without closing the class.

Refs: #6148 / PR #6159 (where this was measured) · #3523 (the incident the map exists for) · #4154 (the same drift in the doc page's copy of the list).

Metadata

Metadata

Labels

ci/cddomain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repofindingpm:dispatched

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions