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
What was measured
scripts/pm/check-governed-queue-guard.mjsis the prevention half of the governed-surface regime (#11704). Its header states the load-bearing rule in its own words: on amerge_groupevent, "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.os-steve.The chain, reading by reading
231283a6e … (#19255) (#19351)— the subject names the PR, so the entry is attributable and cannot be theunattributedrefusal pathgit log --onelinebetween the entry tip231283a6e2and its basec334ba0f3a(the branch name's trailing sha is the base, not the tip —git ls-remotegives the tip).claude/skills/pm-dispatch/SKILL.md,.claude/skills/pm-dispatch/references/core-rules.md,.claude/skills/pm-dispatch/references/state-machine.mdgit diff --name-onlyover the same two refs, filtered through theGOVERNED_SURFACESprefixesTIER_RULES, notTIER_REFERENCES:governedTierFor()at:619requires every governed path to start withREFERENCES_TIER_PREFIX(:572=.claude/skills/pm-dispatch/references/), andSKILL.mddoes not. The function's own docblock states the rule verbatim: 「混合 diff 一条命中即整 PR 分叉」origin/mainGOVERNED_APPROVERS(:510=os-zhuang,hotlong) approval exists, authorized or otherwiseGET /repos/{o}/{r}/pulls/19351/reviews?per_page=100→[]106090124390, contextGoverned Surface Queue Guard, eventmerge_group, started 2026-09-20T14:03:14Z on231283a6e218f68251cba877d9ed24837dac27e6— 20 seconds after theadded_to_merge_queueevent at 14:02:54Z, so it is this entry's own runGET .../commits/231283a6e2…/check-runsandGET .../actions/runs?head_sha=…(the sibling runs on that sha all carryevent: merge_group)Against the guard's own
guardVerdict()(:1010), readings 1–4 land onentries.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 reviewrecord withServed-tier: CONTRACT_REVIEW_TIERandHead-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:992andrecordUnreadable()at:1003both requireentry?.tier === TIER_REFERENCES;guardVerdictat:1018attaches therecordkey only whenevent === EVENT_MERGE_GROUP && entry.tier === TIER_REFERENCES; andrunGuardat:1436readsif (entry.tier !== TIER_REFERENCES) continue;before it fetches a thread at all. ⇒ On aTIER_RULESentry that record is never consulted, so it cannot be the pass path either.The job's own log.
GET .../actions/jobs/106090124390/logsredirects toproductionresultssa*.blob.core.windows.net, and this container's egress policy refuses the CONNECT (connect_rejected) — so what the guard actually printed is unread, andoutput.summary,output.textand 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
governedTierForis not the function the merge_group leg consults for this entry, ordecomposeGovernedWorkhands it a path list that has already droppedSKILL.mdfor a reason reading 3 did not look for.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.merge_groupevent 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 Guardis 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 reviewsFiled by
domain:specseat 5 · seat post #19357 · ⛔ deliberately ungraded: nodomain:*, nopriority:*, no type — grading and routing are the triage seat's sole production. Readings taken 2026-09-20T14:05Z–14:07Z.Generated by Claude Code