docs(agents,pm-dispatch): a draft conversion drops only an unqueued PR's auto-merge; a queued governed pull-back goes to the maintainer - #20854
Conversation
…nd routes a queued PR to the maintainer WIP: first of the three AGENTS.md sentences rewritten. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KTZmMfzVzjNvyaLyQ8mHvg
…to-merge; a queued pull-back goes to the maintainer The "State on your PR" paragraph and multi-agent section 7 stop saying a draft conversion drops queue membership; pm-dispatch SKILL.md's queued pull-back line asks the maintainer for a manual removal at once, since no seat act is measured to dequeue a PR. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KTZmMfzVzjNvyaLyQ8mHvg
Contract reviewServed-tier: Reviewed read-only: card #20847 (body + comments 5910732998 / 5911100852 / 5911443452), PR #20854 body, file list and net diff, PR #20845 diff, the #20695 / #6732 / #20797 timelines, the head's check-runs, and the repository at Net diff at the head. Check-runs on the head ( ① Derived judgmentsPrime Directive #14,
"State on your PR", Multi-agent §7,
The dequeue-act measurement — the relay half verified at the code; the sentence is an honest statement. The cross-file citation and sequencing. At Pins — right, measured at the head. Survivor grep at the head ( ② Semver level
③ Boundary flags
This PR is Tier H ( Implemented-by: VERDICT: PASS |
Fixes #20847
Clause-②: no
What changes
Four sentences stop saying that a draft conversion, or draft plus an auto-merge disable, removes a PR from the merge queue. Each keeps the half that holds: on an unqueued PR, the conversion drops auto-merge. Prime Directive 14 now names the one removal act that is measured, the maintainer's manual removal, and says why a seat cannot do it.
AGENTS.mdPrime Directive 14, "Already armed or queued" (was:285-:287, now:285-:288)origin/main.platform-readings.md, queue membership), so ask the maintainer at once to remove a queued PR by hand — then confirm from the remote that it is in neither the queue nororigin/main.AGENTS.md"State on your PR" (:428-:429→:429-:430)AGENTS.mdmulti-agent §7 (:532-:533→:533-:534).claude/skills/pm-dispatch/SKILL.md:202Every clause that still holds is kept: "Draft is no barrier by itself — the barrier is this directive", "confirm from the remote that it is in neither the queue nor
origin/main", "ready first, arm second", and the positive-probe reading of a dequeue. The rule text citesplatform-readings.mdand restates no reading. The readings themselves are in PR #20845 (issue #20764).The grep.
AGENTS.mdand every file under.claude/**were searched for other copies of the claim:queue membership, draft next to queue or auto-merge, 转 draft, 出队, 踢队, dequeue, evict. The four sites above are all of them.references/platform-readings.md:41-:43is PR #20845's, and this PR leaves it alone.lanes/cli.md:17only points at that file.Is there a seat act that removes a queued PR? (the claim's measurement)
Every step was read-only. ⛔ No mutation was called and no PR was dequeued.
POST https://api.github.com/graphqlwithquery { __type(name: "Mutation") { fields { name description } } }. It returned 403 from this session's egress, with the message "GitHub GraphQL is not available from Claude Code sessions". The same message lists the pull-request routes the egress does serve:ccr/auto_merge(PUT/DELETE),ccr/ready_for_reviewandccr/convert_to_draft. None of them dequeues.octokit/graphql-schemaschema.graphqlonmain, fetched 2026-09-30T12:18Z (1,223,842 bytes, sha256 prefix3c62d0526d133cee). It declaresdequeuePullRequest(input: DequeuePullRequestInput!)with the description "Remove a pull request from the merge queue." Its input isid: ID!, the pull request id.github/rest-api-description,api.github.com.json(info version 1.1.4,main), no path containsqueue. The word "dequeue" appears only in thepull_request.dequeuedwebhook schemas.github/docsonmain(data/reusables/pull_requests/merge-queue-removal-reasons.md). The list has four entries: CI failure, timeout, "User requesting a removal via the API or merge queue interface", and a branch-protection failure. Neither a draft conversion nor a close is on it. The how-to page (merging-a-pull-request-with-a-merge-queue.md) removes a PR through the web page's Remove from queue button and says the CLI cannot do it.scripts/pm/fleet-write/ops.mjsat05a7547c9has 15 ops: comment, comment_edit, labels_add, labels_remove, assign, unassign, issue_patch, issue_create, pr_create, pr_request_reviewers, pr_ready, pr_draft, automerge_enable, automerge_disable and transfer.ALLOWED_MUTATIONShas five entries, anddequeuePullRequestis not one of them.⇒ No dequeue act is measured to be available to a seat. The platform documents one (the GraphQL mutation), but neither this session's egress nor the relay can reach it. So the rule sends a queued pull-back to the maintainer and says why. The triage direction on the card reserves the next step for the triage seat: whether to file a tooling child for a relay dequeue op. That would be a new relay capability.
Coordination with PR #20845
The new rule cites the queue-membership section of
platform-readings.md. Atorigin/main(05a7547c9), line:42of that section still carries the old reading, and PR #20845 rewrites:41-:43. Until #20845 lands, the rule and line:42disagree. #20845 should land first, or with this PR. The citation names a file section, not a PR, so it is correct once both have landed, whatever the order.Line budget
AGENTS.md: 1107 → 1108 lines, against a ceiling of 1116 (headroom 9 → 8). The +1 is all in Prime Directive 14. The new sentence adds the maintainer route and the reason for it, and it needs four lines where the old one took three. The other twoAGENTS.mdsentences are net 0.pm-dispatch/SKILL.md: 319 → 319 lines (ceiling 319, headroom 0). Line:202is edited in place and goes from 107 to 116 bytes.SKILL.md).check:pm-skill-ratchetreports no over-length line and leaves the table-row pins unchanged (768 and 342).Deviations from the dispatch
SKILL.md:202drops two parts. They are the clause 「ref 缺席只旁证」 and the 「才读到本条」 of the trigger. The 120-byte cap left 13 bytes of room on the line, and the maintainer route with its reason needs about 50. The dropped clause is kept inplatform-readings.md:44(「ref 缺席只作旁证,⛔ 永不承载结论」), and the positive-probe half of the line stays.AGENTS.mdis net +1, not ≤ 0. None of the three sentences frees a whole line by deleting content. Freeing one would need a re-wrap of text this PR does not otherwise change. The pin is not exceeded.Acceptance notes
scripts/pm/check-governed-queue-guard.mjsmakes the same claim in both of its refusal texts, at:1451-:1452and:1911-:1912(at05a7547c9): "take the pull request out of the queue: convert it back to DRAFT (disarming auto-merge alone does NOT dequeue it)". Parking the PR in draft after the guard's red is still useful: an armed PR re-enters the queue, and a draft cannot be armed. The part in parentheses is the falsified premise. This is reported to the seat so it can join the card's family. No card is filed.issue_patchwithstate: closed. A code comment in.github/workflows/cross-repo-issue-closer.yml:399-:401says that closing drops queue membership. GitHub's list of removal reasons does not name it, and I know of no reading of it in this repo. It was not attempted..claude/**andAGENTS.mdare not in any package'sfiles[], so this PR publishes nothing.skip-changesetis for the seat to apply.AGENTS.md). The PR stays a draft until an authorized approval.Verification (head
b095ba02e)node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands, with no paths, derived 22 commands for this change set (2 paths against merge base05a7547c9). All 22 exited 0:check-closing-keyword-parity, plus its--self-test;check-comment-mask-corpus;check-governed-queue-guard --self-testandcheck-harness-current --self-test;@objectstack/lint check:doc-formula-expressions, run after building@objectstack/lintand its dependency closure underos-verify-lock.sh(VERDICT command-exit 0);check:family:agent-test-spelling,cross-package-test-inputs,doc-authoring,docs-audit-scope,driver-memory-census,gitlink-declared,nul-bytes,pm-expected-skips,pm-governed-merges,pm-governed-prose,pm-skill-id-lint,pm-skill-ratchet,refd-timer-probe,required-contexts,skill-frame-syncandwatch-hint-literal.pnpm check:pm-settings-deny-rosterwas also run, because its roster lives under.claude. It exited 0.--ranreconciliation read "22 derived, 22 run, 0 NOT-MEASURED, 0 UNRUN". All 22 commands recorded an exit code.check:pm-skill-ratchet: "AGENTS.md is 1108 lines (ceiling 1116; headroom 8)" and "pm-dispatch/SKILL.md is 319 lines (ceiling 319; headroom 0)".check:pm-skill-id-lint: "34 file(s) clean".check:pm-governed-prose: "2 instruction surface(s) name all 6 registered governed surfaces".check-required-contexts --verify-required-set, which reads the workflow event and so runs only in CI;维护者速读(草稿)
AGENTS.md三句、pm-dispatch/SKILL.md一行。旧文说「转 draft 会把 PR 踢出合并队列」,现在都不再这么说。改后:转 draft 只在未入队时掉 auto-merge。已入队的受管 PR 要撤回时,两手照做,并立即请你手动出队。dequeuePullRequest,但本会话出口拒绝 GraphQL(403),中继也没有这个 op。所以规则暂时把已入队的撤回交给你手动出队。要不要给中继加出队 op,属于新能力,由分诊决定是否立子卡。子卡立了,你会看到裁决请求。Generated by Claude Code