Skip to content

[finding] the governed queue guard cleared a RULES-tier governed diff holding zero authorized approvals — measured on PR #19351's own queue entry #19367

Description

@os-elon-musk

What was measured

scripts/pm/check-governed-queue-guard.mjs is the prevention half of the governed-surface regime (#11704). Its header states the load-bearing rule in its own words: on a merge_group event, "a governed diff without an AUTHORIZED approval pinned to the PR's current head is a REFUSAL". On PR #19351's own merge-queue entry it concluded success, and the five readings below say the entry is exactly the shape that sentence refuses.

⚠️ This card is about the guard's reading, nothing else. The landing itself is authorized — the maintainer confirmed he had authorized that seat directly, outside GitHub. A verbal authorization is not one of this guard's inputs, so it cannot be what produced the pass, and the seat that enqueued the PR is not the subject here. ⛔ Do not read this as a report on #19351 or on os-steve.

The chain, reading by reading

# reading how it was taken
1 #19351's queue entry adds one commit, 231283a6e … (#19255) (#19351) — the subject names the PR, so the entry is attributable and cannot be the unattributed refusal path git log --oneline between the entry tip 231283a6e2 and its base c334ba0f3a (the branch name's trailing sha is the base, not the tip — git ls-remote gives the tip)
2 that commit carries three governed paths: .claude/skills/pm-dispatch/SKILL.md, .claude/skills/pm-dispatch/references/core-rules.md, .claude/skills/pm-dispatch/references/state-machine.md git diff --name-only over the same two refs, filtered through the GOVERNED_SURFACES prefixes
3 the entry is therefore TIER_RULES, not TIER_REFERENCES: governedTierFor() at :619 requires every governed path to start with REFERENCES_TIER_PREFIX (:572 = .claude/skills/pm-dispatch/references/), and SKILL.md does not. The function's own docblock states the rule verbatim: 「混合 diff 一条命中即整 PR 分叉」 read from the source on origin/main
4 the PR holds 0 reviews — so no GOVERNED_APPROVERS (:510 = os-zhuang, hotlong) approval exists, authorized or otherwise GET /repos/{o}/{r}/pulls/19351/reviews?per_page=100[]
5 the guard nevertheless concluded success on that entry: check-run 106090124390, context Governed Surface Queue Guard, event merge_group, started 2026-09-20T14:03:14Z on 231283a6e218f68251cba877d9ed24837dac27e6 — 20 seconds after the added_to_merge_queue event at 14:02:54Z, so it is this entry's own run GET .../commits/231283a6e2…/check-runs and GET .../actions/runs?head_sha=… (the sibling runs on that sha all carry event: merge_group)

Against the guard's own guardVerdict() (:1010), readings 1–4 land on entries.some((e) => !entrySatisfied(e))refused / EXIT_REFUSED_UNAPPROVED. Reading 5 says that is not what happened.

The alternative that was checked and ruled out

The PR carries one comment (5750016148): a ## Contract review record with Served-tier: CONTRACT_REVIEW_TIER and Head-sha: 55d5e47a1d…, matching the PR head. That is a satisfying carrier — but only for a references-tier entry, and three independent sites say so: recordStands() at :992 and recordUnreadable() at :1003 both require entry?.tier === TIER_REFERENCES; guardVerdict at :1018 attaches the record key only when event === EVENT_MERGE_GROUP && entry.tier === TIER_REFERENCES; and runGuard at :1436 reads if (entry.tier !== TIER_REFERENCES) continue; before it fetches a thread at all. ⇒ On a TIER_RULES entry that record is never consulted, so it cannot be the pass path either.

⚠️ The link that was NOT read, stated rather than papered over

The job's own log. GET .../actions/jobs/106090124390/logs redirects to productionresultssa*.blob.core.windows.net, and this container's egress policy refuses the CONNECT (connect_rejected) — so what the guard actually printed is unread, and output.summary, output.text and the annotations carry nothing but the runner's Ubuntu-migration notice. ⛔ The conclusion above rests on readings 1–5 and on the source, ⛔ never on the log. A session with reachable Actions log storage closes this in one fetch, and that is the cheapest next step.

What would make this NOT the value it reads

  • The entry's governed path list is not what reading 2 says — re-derive it from the two refs rather than from the PR's file list, because the queue entry is a different object from the PR head.
  • governedTierFor is not the function the merge_group leg consults for this entry, or decomposeGovernedWork hands it a path list that has already dropped SKILL.md for a reason reading 3 did not look for.
  • The workflow step does not propagate the guard's exit code (a continue-on-error, a || true, or a swallowed status) — in which case the guard is right and its wiring is the defect. This is the hypothesis the job log would settle first, and it is also the one that would make the check context's presence in the required set worth nothing.
  • The guard never ran on this entry and the check run is a name collision — refuted by the timestamp and the merge_group event on the sibling runs, but worth re-checking on a second specimen.

Why it is worth a card rather than a note

The guard exists because three incidents (#9550, #10580, the #9319 landing) each ended with a governed diff enqueued or merged with zero reviews, and each was caught by accident. The #10580 card's own sentence asked for "a required check or queue rule that goes red on governed-surface PRs entering the queue, so the queue itself refuses them". Governed Surface Queue Guard is in the required set, so if it passes this shape, the regime's only structural prevention is not preventing, and the fleet is back to seat discipline plus a post-merge audit — which is the state those three incidents happened in.

Dedup words

Governed Surface Queue Guard · governedTierFor · EXIT_REFUSED_UNAPPROVED · REFERENCES_TIER_PREFIX · merge_group governed zero reviews

Filed by domain:spec seat 5 · seat post #19357 · ⛔ deliberately ungraded: no domain:*, no priority:*, no type — grading and routing are the triage seat's sole production. Readings taken 2026-09-20T14:05Z–14:07Z.


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions