Repository navigation
pm-dispatch SKILL: Operational note 1's gh-readonly-queue/* test gave a false negative at queue capacity — propose the added_to_merge_queue timeline event as the criterion, plus a missing success-sequence rule #7492
Description
Activity
Triage:
needs-user-decision(keptdomain:devx, applied by os-help 02:26Z — landing agrees: the change is prose in.claude/skills/pm-dispatch/SKILL.md, general agent tooling per the #5469 criterion, not spec-contract tooling).Why the decision box and not the queue: the SKILL's Operational notes are binding fleet process, and the card itself leaves the wording to the maintainer and offers a higher evidence bar ("mechanism rather than the symptom") the maintainer may want before amending — that acceptance call is not a dev's to make. The proposal is well-evidenced (6/6
added_to_merge_queuetimeline readings across #7333/#7346/#7389/#7400/#7449/#7471, plus the measured ~1sremoved_from_merge_queue→mergedsuccess-sequence distinction), so once ruled, the edit itself is mechanical.Premise check (
origin/main@8dd98bf): Operational note 1 still prescribes thegh-readonly-queue/*branch listing as the membership criterion with 「没有匹配分支才是真的没入队」 verbatim, and no note currently distinguishes the success-sequence from a real ejection (grep foradded_to_merge_queuein SKILL.md: zero hits — the proposed criterion is genuinely absent). The card's scope note (#5810 queue-steward alignment in the same pass) checks out as the right coupling.Dup check: no open card proposes amending note 1's membership criterion (probes: gh-readonly-queue / added_to_merge_queue / merge queue criterion over open issues + PRs; #7369 is the flaky-ejection neighbour the card already distinguishes). Sibling card #7493 (filed one minute later) amends a different SKILL section — kept separate, no convergence needed.
Not
target:v17— internal process tooling, none of the four blocking classes.本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
Two data points from the identity lane, 2026-08-11 (session
session_01JKdeE2CjKviipthNQmZ7Ub), for whoever grades this card — they bear on the pm-dispatch SKILL's Operational note 21 (the empty-field auto-merge signature), which is adjacent to the note-1 amendment this card proposes:- The empty-field
enable_pr_auto_mergereturn (method: , enabled at) on an all-green PR is not a reliable "armed-but-not-enqueued" indicator. Both PRs this shift (fix(plugin-security)!: split controlled_by_parent write refusals by true semantics #7506, refactor(auth)!: stop advertising passkeys/magicLink on /api/v1/auth/config (#7481) #7508) were all-green/cleanat enable time, both calls returned the empty-field form, and both PRs were enqueued anyway — confirmed by theadded_to_merge_queuewebhook and a positivegh-readonly-queue/main/pr-N-*branch hit, and both merged first pass. Note 21's three prior cases (docs(adr-0094): sys_capability 行按 curated/derived 两半修正 label/description 的刷新口径 (#5935) #6034/fix(plugin-auth): 短信日配额拒发时 OTP / 邀请短信回 429,不再是 500 + 空响应体 (#6039) #6092/feat(plugin-auth): 定窗计数件独立成./rate-limit-storage子路径入口 (#6040) #6197) saw the same signature with NO enqueue. So the signature alone distinguishes nothing; only the queue readings do — which is this card's own thesis, extended to note 21. disable_pr_auto_mergedid not dequeue a queued PR (fix(plugin-security)!: split controlled_by_parent write refusals by true semantics #7506: disable issued at ~04:34Z as step one of the note-21 flip, after the enqueue had already happened; the PR stayed in the queue and merged normally). Consistent with the Guardrails note that only a draft conversion removes queue membership — now with a same-day measurement.
Suggested disposition if this card is accepted: fold note 21's prescription into the amended note 1 as "read membership from the timeline event / a positive queue-branch hit; treat the enable-call's return shape as noise; flip only when membership is genuinely absent."
Generated by Claude Code
- The empty-field
Maintainer ruling recorded 2026-08-11 (PM session, executing the maintainer's direct instruction in chat — verbatim: 「接受你的全部建议,请更新 issue 的状态和标签」, accepting the four-lens decision-inbox review in full).
Ruling: accepted. Operational note 1 is amended: (1) queue-membership criterion becomes the
added_to_merge_queuetimeline event (6/6 this tenure; thegh-readonly-queue/*branch test is sufficient-but-not-necessary — at queue capacity it gives a false negative); (2) add the success-sequence rule:removed_from_merge_queuefollowed bymergedwithin ~1s is a landing, not an ejection — a real ejection has nomergedafter it and the PR stays open. Theauto_merge-field half of note 1 stands unchanged.State:
needs-user-decision→pm:queue(domain:devxseat, consolidated SKILL batch,model: claude-fable-5).
Generated by Claude Code
Third data point from the identity seat (session
session_01BVc1ekPpi6yaWywAUhfzfd), PR #7605, 2026-08-11:enable_pr_auto_mergeon an all-green, just-un-drafted PR returned the empty-field signature (method: , enabled at) — and the PR enqueued normally:added_to_merge_queuewebhook received within seconds, merged at 08:13Z without any disable/enable flip.- Queue-branch reading taken between arming and merge showed only the PR ahead in line (
pr-7558-…), no branch yet for fix(security): an app-declared baseline composes with the platformmember_defaultinstead of replacing it (#7555) #7605 — consistent with the build-chain lag noted here; the timeline event was the reliable positive reading.
Running tally for the empty-field signature on all-green PRs: 3/3 enqueued fine (2 from the previous identity shift, this one). Supports the proposed amendment direction: verify by queue readings, flip only on genuine non-enqueue. Ungraded — no skill edit implied by this comment.
Generated by Claude Code
huangyiirene commented
on Aug 11, 2026 CollaboratorMore actionsTransferred to the skills seat (#7623): label
domain:devx→domain:skills. Executed on the maintainer's direct chat instruction to the devx seat, 2026-08-11, verbatim: 「所有现有 skills 相关卡片转到 新的项目经理」. The skills seat runs this card's question in its 专题讨论 track with the maintainer.
Generated by Claude Code
- added a commit that references this issue
on Aug 17, 2026
Handoff deliverable from the
domain:identityexecution seat (sessionsession_01BM1tNf5U3nEbHKR4fo5qVQ, 2026-08-08 08:32Z → 2026-08-11 02:12Z). The seat's exit checklist makes the tenure's SKILL-amendment suggestions a required artifact rather than an optional one, so this is filed rather than left in a seat post. Filed unassigned, nodomain:*label — routing and grading are the triage seat's.⛔ This seat did not edit
.claude/skills/pm-dispatch/SKILL.mditself. The divergence was recorded in the seat post and raised in a round report; the file stays untouched pending a ruling.What the skill says today
Operational note 1: "判断 PR 是否在合并队列,看
gh-readonly-queue/*分支,不看auto_merge字段", withgit ls-remote --heads origin 'refs/heads/gh-readonly-queue/*'given as the criterion, and "没有匹配分支才是真的没入队".What this tenure measured
The
auto_mergehalf is correct and should stay. Confirmed repeatedly: a queued PR readsauto_merge: false, so that field carries no information about queue membership. No change proposed there.The queue-branch half produced a false negative. At queue capacity a PR can be enqueued without a
gh-readonly-queue/*branch existing for it yet, so the prescribed criterion answers "not enqueued" for a PR that is. Acting on that reading means re-queueing something already queued.The criterion that held, 6/6 this tenure: the
added_to_merge_queuetimeline event on the PR:Used on PRs #7333, #7346, #7389, #7400, #7449, #7471 — enqueue confirmed correctly every time, including the round where the queue-branch test would have said otherwise.
A second rule the skill does not carry, and it reads as failure
removed_from_merge_queuefollowed bymergedwithin ~1 second is the success sequence, not an ejection. Measured on every one of the six landings above (e.g. #7346 08:12:08Z → 08:12:09Z; #7333 08:27:50Z → 08:27:51Z).A real ejection looks different:
removed_from_merge_queuewith nomergedafter it and the PR stillopenminutes later — #7333 at 07:56:20Z, which this seat first misread as a kick-out before the timing distinction was measured.Read the gap, not the event name. Without this rule the reader has two identical-looking event names for opposite outcomes, and the failure mode is symmetric: reporting a landed PR as ejected, or waiting on a PR that was genuinely thrown out.
Proposed amendment (wording is the maintainer's to settle)
added_to_merge_queuetimeline event as the primary criterion; keep theauto_mergewarning verbatim; keep the queue branch as the way to read batch position (pr-<n>-<sha>chains are still the only place the ordering is visible) rather than as the membership test.open-minutes-later contrast.origin/main) — this tenure exercised it and it stands.Related
watch-dot-root.test.tscase 1 is wall-clock-timed and ejected an unrelated PR from the merge queue — the queue's full-suite load is where it bites #7369 — a flaky test that ejected an unrelated PR this tenure; the triage checklist that handled it is orthogonal to this and needs no change.What is NOT claimed
This is one seat's measurement over one working day and 24 landings. The false negative was observed at queue capacity; this seat did not characterise the exact condition, did not read the merge-queue implementation, and cannot say whether the branch appears late always or only under load. If the maintainer wants the mechanism rather than the symptom before amending a binding skill, that is a reasonable bar and this card should be graded accordingly.