fix(pm): the queue guard's refusal remedies send a queued PR to the maintainer's manual removal, never claiming a DRAFT conversion dequeues it - #20894
Merged
objectstack-fleet[bot] merged 2 commits intoSep 30, 2026
Conversation
…he maintainer's manual removal No seat act is measured to dequeue a queued pull request, a DRAFT conversion included, so neither refusal tells a seat to take the PR out of the queue by converting it; both now carry the landed rule's pull-back. Claude-Session: https://claude.ai/code/session_01KTZmMfzVzjNvyaLyQ8mHvg Co-authored-by: Claude <[email protected]>
…equeue claim in any rendering A new self-test battery reads every refusal kind on both legs flattened: each carries the maintainer's manual removal, the disarm and the remote confirmation, and no rendering matches a spelling of "a DRAFT conversion dequeues it" (with a control that the detector fires on each spelling). The governed remedy's ordering pin now reads the pull-back position and refuses a missing phrase instead of sorting -1 first. Claude-Session: https://claude.ai/code/session_01KTZmMfzVzjNvyaLyQ8mHvg Co-authored-by: Claude <[email protected]>
objectstack-fleet
Bot
deleted the
claude/issue-20855-queue-guard-dequeue-remedy
branch
September 30, 2026 17:05
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #20855
Clause-②: no
What changed
scripts/pm/check-governed-queue-guard.mjsprints two refusal remedies: the governed-surface leg's (renderGuardVerdict) and the SIZE leg's (renderSizeVerdict). Both refusals fire only on themerge_groupleg (guardVerdictreturnswarnedandsizeGuardVerdictreturnsnot-applicableonpull_request), so the pull request they name IS in the queue. Both told a seat to "take the pull request out of the queue: convert it back to DRAFT (disarming auto-merge alone does NOT dequeue it) and park it there". No seat act is measured to dequeue a queued pull request, and that includes a draft conversion (.claude/skills/pm-dispatch/references/platform-readings.md, queue membership).Step one of both remedies now says what AGENTS.md Prime Directive #14 has said since
2d5fe76f:origin/main.The rest of each remedy is unchanged: the approval route, both landings, and the bypass-rules option. The quote 「四件套留 draft 等人批,⛔ 不翻正式不入队」 is kept, now as the place a governed PR waits once it is out of the queue. No dequeue act is named: no GraphQL mutation and no relay op. Only printed text and its self-test move. No verdict, exit code or read changes.
The pins
ask the maintainer AT ONCE), thenobtain an APPROVED review, thenCLAIMING SEAT lands it from there. It also refuses a missing phrase. The old pin compared rawindexOfresults, and a missing phrase answers -1, which sorts first.⛔ the queued pull-back: the remedy names no dequeue act a seat has;SELF_TEST_BATTERY_FLOORgoes from 23 to 24. The battery collapses whitespace in each text before reading it, so a phrase wrapped across two array entries still counts as one. Its four cases:pull_request-leg warning) matches any spelling of "a DRAFT conversion dequeues it".Ablation (one-time; no permanent test file)
Both legs ran through
node scripts/ablation-replace.mjsin WRAP mode, from the committed head7f89016f9. Each leg ran inside a script with an EXIT/INT/TERM restore trap on the absolute path.4edb61449: anchor 1 → 0, blob3f59569d5403→8bd07044a078, on-disk count ofalone does NOT dequeue it1 → 2. The self-test printed2 of 296 case(s) failed:every-size-refusal-kind-carries-the-SAME-pull-back, andNO-rendering-claims-a-DRAFT-conversion-dequeues-a-queued-PRon the three size renderings. Restore: blob == HEAD3f59569d5403,git diff HEADempty.1 of 296 case(s) failed, the negative pin only, on the three governed renderings. Restore: blob == HEAD,git diff HEADempty.dist/is involved, because the self-test runs this script from source.Gates, at head
7f89016f9node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands(no paths) derives the same 31 commands the dispatch named. All 31 exit 0, and--ranreconciles them:31 derived famil(ies) accounted for — 31 run, 0 NOT-MEASURED.check-ci-filter-parity,check-closing-keyword-parity(+--self-test),check-comment-mask-corpus(7658 files, 0 disagree),check-declaration-mirrors(+--self-test),check-scripts-symbol-anchors(+--self-test),check-self-test-wired(+--self-test),check-self-test-workflow-commands(+--self-test),check-whole-set-label-write(+--self-test),pm/bare-root-worklist --self-test, andpm/check-governed-queue-guard --self-test(296 cases pass).pnpm check:agent-test-spelling,bash32-floor,cli-command-ids,closing-target-claim,cross-package-test-inputs,driver-memory-census,entry-guard,gitlink-declared,nul-bytes,parse-guard,pnpm-filter-targets,ratchet-remedy-authority,refd-timer-probeandwatch-hint-literal.pnpm check:pm-dispatch-gatesran detached:dispatch-gates self-test: 1976 cases pass, 882.7 s, exit 0.eslint scripts/pm/check-governed-queue-guard.mjs --no-inline-config --format jsonread 1 file with 0 errors and 0 warnings. The effective config for this file has noparserOptions.project, and its two rules (no-restricted-imports,comment-swallow/no-code-inside-block-comment) are per-file, so this diff cannot move the verdict on any untouched file.grep -naPexit 1).Publishing
scripts/pm/**ships in no package'sfiles[], so this PR has no changeset.Acceptance notes
scripts/pm/check-governed-merges.mjs:773-774is a header comment, not printed text, and it still says "Disarming alone does not dequeue: converting the PR back to draft is what removes it from the merge queue." That file is outside this card's file surface, so it is not edited here. Carrier: none named.Generated by Claude Code