Skip to content

docs(pm-dispatch): the draft-conversion reading splits by queue state — no queued PR left the queue on a draft conversion - #20845

Draft
objectstack-fleet[bot] wants to merge 1 commit into
mainfrom
claude/issue-20764-draft-dequeue-reading
Draft

objectstack-fleet[bot] wants to merge 1 commit into
mainfrom
claude/issue-20764-draft-dequeue-reading

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #20764

Clause-②: no

What changes

.claude/skills/pm-dispatch/references/platform-readings.md, lines 41-43 only. The rewrite is net 0 lines, and the three new lines are 120 / 118 / 120 bytes (cap 120).

line before after
:41 转 draft 不是可靠的踢队手段:两向相反读数并存,处置按最坏走。 转 draft 不是可靠的踢队手段:本仓与姊妹仓均见已入队转 draft 仍保位照合,处置按最坏走。
:42 本仓转 draft 同时掉 auto-merge 与队列成员资格,不自动恢复,转正后重挂;姊妹仓曾保位照合。 本仓转 draft 同秒掉 auto-merge 仅见于未入队时,转正后重挂;已入队者 2026-08-08、09-29 照合。
:43 补救:转 draft 与卸载 auto-merge 都做 —— 本仓卸载 auto-merge 单独不踢队。 补救:转 draft 与卸载 auto-merge 都做,本仓卸载单独不踢队;两手齐做亦未见踢队(08-08、09-28)。

The remedy on :43 is unchanged: do both acts. No rule is added. The in-file citations are dates, because pnpm check:pm-skill-id-lint goes red on a #-number anywhere under .claude/skills/pm-dispatch/, and this file cites no PR number today. The PR numbers and timeline events are in this body. That is where the id-lint header puts a reading's provenance.

The readings (re-readable: GET /repos/objectstack-ai/objectstack/issues/N/timeline)

I ran a read-only timeline scan over #4700-#4900, #6650-#6850 and #20400-#20840. It looked for two patterns: a convert_to_draft between added_to_merge_queue and the next removed_from_merge_queue, and a convert_to_draft on a PR that was armed but not queued. The scan found every row below. The table is complete for those windows only, not for the whole repo.

Queued, then converted to draft. None of the four left the queue because of the conversion.

PR queued draft disable sent? what followed
#6732 2026-08-08T14:01:50Z 14:04:32Z claimed in #6799's text; no auto_merge_disabled event the queue merged it at 14:38:56Z, 34 min later, still draft
#20420 2026-09-28T13:43:01Z 14:02:28Z claimed in the seat's 14:04Z comment; no event its own group pr-20420-3cf6449 had Lint & Type Check = failure at 14:01:49Z, before the draft; github-merge-queue[bot] removed it at 14:11:24Z, unmerged
#20442 2026-09-28T13:45:42Z 14:02:50Z claimed in the seat's 14:04Z comment; no event the queue built a new group pr-20442-b285508 for it at 14:11:29Z, 9 min after the draft; that group's CI = failure at 14:30:14Z; removed at 14:35:44Z, unmerged
#20695 2026-09-29T23:32:51Z 23:57:02Z no (the card discloses: draft alone) the queue merged it at 00:04:21Z, 7 min later, still draft

Armed, not queued, then converted to draft. Each one dropped auto-merge.

PR armed draft auto_merge_disabled after
#4745 2026-08-03T01:28:46Z 01:29:30Z 01:29:30Z (same second) ready, re-armed 01:30:52Z, queued, merged
#6727 2026-08-08T13:42:58Z 13:44:36Z 13:44:36Z (same second) ready, re-armed 13:46:02Z
#6829 2026-08-08T23:37:05Z 23:40:25Z 23:40:26Z (1 s) ready and enqueued 6 h later

Each disable event carries the converter as its actor. A timeline cannot tell whether the platform wrote it or a scripted follow-up did. The line records what was observed ("同秒").

Where the old reading came from

How this departs from the triage direction (5903760674)

I did not choose these quietly. Each one is a place where a measurement changed what the direction assumed:

  1. :42 is split by queue state, not "mixed" in the sense of opposite readings. No queued PR in the scanned windows left the queue because of a draft conversion. The direction assumed the old half had its own measurement. It has none, and the one PR later cited for it reads the other way. What does go both ways in this repo is the effect by state: unqueued, auto-merge drops; queued, the PR keeps its place.
  2. :43 says "not seen to dequeue", not "not measured". Three PRs (docs(adr),chore(devx): reconstruct ADR-0079 + make every cited ADR number resolve #6732, feat(spec): ComponentPropsMap rows for action:button/group/menu/icon and element:definition-list/repeater #20420, feat(spec): declare the staged $empty filter operator and its per-type expansion (#20311) #20442) have both acts claimed in writing, and none was removed by them. The caveat: on a queued PR, the disable leaves no timeline event, so whether it was sent rests on the seats' own comments.
  3. :41 loses "两向相反读数并存". No opposite reading survived the re-read.

Acceptance notes

Verification (head 02ea176a1)

  • The 20 gates from node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands all exit 0. They are check-closing-keyword-parity (plus --self-test), check-comment-mask-corpus, check-governed-queue-guard --self-test, check-harness-current --self-test, lint check:doc-formula-expressions (after building @objectstack/lint and its dependency closure under os-verify-lock.sh), check:agent-test-spelling, check:cross-package-test-inputs, check:doc-authoring, check:driver-memory-census, check:gitlink-declared, check:nul-bytes, check:pm-governed-merges, check:pm-half-states, check:pm-skill-id-lint, check:pm-skill-ratchet, check:refd-timer-probe, check:required-contexts, check:skill-frame-sync and check:watch-hint-literal.
  • pnpm check:pm-settings-deny-roster was also run, because its roster lives under .claude. Exit 0.
  • --ran reconciliation: 20 derived, 20 run, 0 NOT-MEASURED. All 20 recorded an exit code.
  • check:pm-skill-ratchet printed: platform-readings.md is 469 lines (ceiling 469; headroom 0), widest table row 0 bytes (pin 0).
  • Not measured locally: check-required-contexts --verify-required-set and check-half-states --provenance, which read the workflow event, and the four CI type-check lanes. This diff touches no TypeScript.

维护者速读(草稿)

  • 改了什么:PM 协议参考文件 platform-readings.md 第 41-43 行,关于「已入队 PR 转 draft 能否踢出合并队列」的三条平台读数。行数不变。
  • 为什么改:旧文说本仓转 draft 会掉出队列。回查时间线后发现,本仓 4 个已入队后转 draft 的 PR 都没有因此出队。其中 2 个带着 draft 状态被队列直接合入,另外 2 个是在自身队列构建变红之后才被移出。旧说法唯一引用的实例,时间线恰好反向。转 draft 会掉 auto-merge,这一点只在「未入队」时成立。
  • 风险与代价(含回滚):只改文档读数,不改任何规则或代码。补救仍是两手都做。风险在于读者以为有可靠的踢队手段,而实际没有。回滚就是 revert 这一个提交。
  • 席位意见:
  • 你要做的:无需操作,由席位按 Tier S 复核后落地。若要让 AGENTS.md 里的同一旧说法一并修正(Tier H),需要你点头另开 PR。

Generated by Claude Code

… — a queued PR kept its place in every re-read

platform-readings `:41-:43` re-read against the timelines they rest on.
Unqueued and armed, a draft conversion drops auto-merge in the same second
(re-arm after ready). Queued, no draft conversion was seen to dequeue in
this repo: two PRs merged through the queue while in draft, and two others
left only after their own merge-group builds went red. The remedy line keeps
both acts and records that both together were not seen to dequeue either.

Net 0 lines; each rewritten line is at most 120 bytes.

Claude-Session: https://claude.ai/code/session_01KTZmMfzVzjNvyaLyQ8mHvg
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added size/xs documentation Improvements or additions to documentation labels Sep 30, 2026
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 30, 2026

This branch has not been deployed

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

Labels

documentation Improvements or additions to documentation size/xs skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants