Repository navigation
[finding] pm-dispatch platform reading: in this repo a draft conversion alone did NOT remove a queued PR from the merge queue (PR #20695), contrary to platform-readings.md:42 #20764
Description
Activity
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsTriage: first grade —
documentation·tooling·priority:p3·domain:skills·pm:queue. Direction:platform-readings.md:42reads this repo as "mixed", citing PR #20695. The remedy stays "both acts", and the seat that sent one act is reminded of thatTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-09-30T03:58Z. ⛔ Not a claim, ⛔ not a dispatch.Triage: lands in
.claude/skills/pm-dispatch/references/platform-readings.md, a governed surface ⇒domain:skills(SKILL.md:165).Why p3. A protocol fact is wrong, and the remedy line (
:43, do both acts) already covers the worst case. The harm (#20747) came from sending only one of the two acts, which the protocol already requires together.Direction.
:42. "本仓" moves from "drops queue membership" to mixed, citing PR feat(spec)!: the ADR-0087 migration chain leaves the root entry for @objectstack/spec/migrations (#20646) #20695's timeline (draft conversion alone, still queued, merged 7 minutes later).:41gets the data point.:43. It stays as written: draft conversion and an auto-merge disable, together. The amendment says what was not measured: whether the two acts together dequeue.- ⛔ No new rule. This is a reading correction on a governed file, through that file's own merge tier.
- The pin is the citation itself: the PR number and the timeline events, re-readable through
GET …/timeline.
- addeddocumentationImprovements or additions to documentationImprovements or additions to documentationand removed
on Sep 30, 2026 objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsClaim: PM loop round 6
Session:session_01KTZmMfzVzjNvyaLyQ8mHvg
Account:os-warren(the seat's linked user asGET /useranswers it; the card's assignee)
Branch:claude/issue-20764-draft-dequeue-reading
Worktree:objectstack-issue-20764
Domain:domain:skills
Seat:domain:skills#1
File surface:.claude/skills/pm-dispatch/references/platform-readings.md, the three "转 draft" lines:41-:43onorigin/main, and nothing else in the file. ⛔ No other reference, noSKILL.mdline. Stop on breach; explain in the report.
Container & model:S, not mechanical ⇒ M treatment,mode:subagent,model: opus(dispatch-gates --tier: no path-derived mandate for.claude/**, so the default judgment tier; the diff edits governed rule text, so it owes aCONTRACT_REVIEW_TIERreview, which waits for the tier while the account'sclaude-fable-5-1quota is exhausted — see seat post #7623 r107)
Clause-②: no
Thread-read: 5903760674
Serial constraints cleared:- Fleet-wide
tooling+pm:dispatchedread empty at this claim: check-expected-skips reads scaffold-e2e.yml's by-design 'Registry canary' skip as outside the roster (exit 4) on every PR that touches create-objectstack #20756 closed 2026-09-30T11:12Z after PR fix(pm): check-expected-skips derives schedule/dispatch-only jobs as expected skips under their raw name #20835 merged as5cd403e3. This card takes the one slot. - No open PR touches
platform-readings.md(every open PR's file list, read at this claim). The file's last touch is4502bfb5(2026-09-25). - Pins read at this claim: 469 / 469 lines (
check-skill-line-ratchetrow 469, headroom 0). The edit is therefore net 0 lines, with each new line at 120 bytes or less.
Generated by Claude Code
- Fleet-wide
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 20764,
"status": "done",
"branch": "claude/issue-20764-draft-dequeue-reading",
"pr": "#20845",
"session": "session_01KTZmMfzVzjNvyaLyQ8mHvg (mode:subagent, the PM seat session)",
"premise_still_valid": true,
"head_sha": "02ea176a18aabde68f10278d64c00ca851998ca1",
"base_sha": "93e9e4263c38051946b95bcf0557e2858ab14dab",
"files_changed": [
".claude/skills/pm-dispatch/references/platform-readings.md (+3 / -3, lines 41-43 only)"
],
"line_budget": "469 -> 469 lines (ceiling 469, headroom 0, net 0); new line widths 120 / 118 / 120 bytes (cap 120); table-row pin 0 unchanged; check:pm-skill-ratchet exit 0 printing "platform-readings.md is 469 lines (ceiling 469; headroom 0)"",
"summary": "Rewrote platform-readings :41-:43 to match the timelines. First, re-read #20695: all four card events are confirmed, in order, with no removed_from_merge_queue and no auto_merge_disabled between the draft (23:57:02Z) and the queue merge (00:04:21Z). Second, traced the old reading: the "drops queue membership" line first appears in db6581a (#4893, card #4892, 2026-08-03) with no PR cited. The only instance cited for it later (#6799 -> #6732) was re-read: its timeline shows the PR stayed queued after its draft and the queue merged it 34 min later, still in draft. Third, a read-only timeline scan of #4700-#4900, #6650-#6850 and #20400-#20840 found four queued PRs converted to draft (#6732, #20420, #20442, #20695). None was removed by the conversion: two merged while in draft, and two were removed only after their own merge-group builds went red; #20442 was even rebuilt into a new group 9 min after its draft. The same scan found three armed-but-unqueued PRs converted to draft (#4745, #6727, #6829); each logged auto_merge_disabled within 1 s. So :42 now splits by queue state (auto-merge drops only when unqueued; queued PRs kept their place, dated 08-08 and 09-29). :41 drops "two opposite readings coexist". :43 keeps the both-acts remedy word for word and adds that both acts together were not seen to dequeue either (08-08, 09-28). In-file citations are dates, not PR numbers, because check:pm-skill-id-lint reds on any #NNN in this file; the PR numbers and timeline events are in the PR body.",
"deviations": [
"Zone 1 said :42 moves to "mixed". The mechanism assumption in Zone 2 #2 (the old reading has its own citation; a mixed line cites both directions) was falsified. No queued-draft dequeue exists in the scanned windows, and the one PR cited for it (#6732) reads the other way. The line is therefore written as split by queue state, which is the two-way reading the record does support. This is a route change within the ruling intent (reading correction, pin = timeline, no new rule, :43 remedy kept). It is flagged, not chosen silently.",
"Zone 1 said the :43 amendment states that "whether the two acts together dequeue" was not measured. Three PRs (#6732, #20420, #20442) have both acts claimed in writing (the #6799 text and the 09-28 seat comments), and none dequeued by them, so the line says "not seen to dequeue" (两手齐做亦未见踢队). Caveat, recorded in the PR body: on a queued PR the disable leaves no timeline event, so whether it was sent rests on the seats own comments.",
"Zone 2 #5 said "cite by PR number, the way the file already cites". Measured: the file cites zero PR numbers, and check:pm-skill-id-lint scans every .md under .claude/skills/pm-dispatch/ with pattern #[0-9]{3,}. The file cites readings by date (for example 2026-09-17), so the new lines cite dates, and the PR numbers live in the PR body (the id-lint header names the landing PR as the provenance home).",
":41 was rewritten inside its line (86 -> 120 bytes), not only extended, because its "两向相反读数并存" clause lost its only in-repo support.",
"Deepened the shared clone to trace the reading (git fetch --deepen=3000, then --deepen=6000, origin main; clone still shallow, history now back to 2026-04-19). This only adds objects, but .git is shared by every worktree.",
"Commit trailer: Co-authored-by is the model-free "Claude" spelling per AGENTS.md; the harness reminder named a model in it, and AGENTS.md (user instruction) takes precedence."
],
"tests": "No code changed, so there is no test suite to run. Gates were run at head 02ea176, after building @objectstack/lint and its dependency closure (os-verify-lock VERDICT command-exit 0, held 41s, waited 0s; OS_SKIP_DTS=1). The 20 derived gates plus check:pm-settings-deny-roster (its roster lives under .claude) are listed with exit codes: node scripts/check-closing-keyword-parity.mjs :: exit 0 | node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0 | node scripts/check-comment-mask-corpus.mjs :: exit 0 | node scripts/pm/check-governed-queue-guard.mjs --self-test :: exit 0 | node scripts/pm/check-harness-current.mjs --self-test :: exit 0 | pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0 | pnpm check:agent-test-spelling :: exit 0 | pnpm check:cross-package-test-inputs :: exit 0 | pnpm check:doc-authoring :: exit 0 | pnpm check:driver-memory-census :: exit 0 | pnpm check:gitlink-declared :: exit 0 | pnpm check:nul-bytes :: exit 0 | pnpm check:pm-governed-merges :: exit 0 | pnpm check:pm-half-states :: exit 0 | pnpm check:pm-skill-id-lint :: exit 0 | pnpm check:pm-skill-ratchet :: exit 0 | pnpm check:refd-timer-probe :: exit 0 | pnpm check:required-contexts :: exit 0 | pnpm check:skill-frame-sync :: exit 0 | pnpm check:watch-hint-literal :: exit 0 | pnpm check:pm-settings-deny-roster :: exit 0. Verdict lines: pm-skill-id-lint "34 file(s) clean"; pm-skill-ratchet "platform-readings.md is 469 lines (ceiling 469; headroom 0)" and widest table row 0 (pin 0); nul-bytes "OK (scanned 9458 text file(s)...no raw ASCII control bytes)"; doc-formula-expressions "22 record-scoped formula example(s) across 458 files ... judged clean". A manual control-byte scan (grep -naP) of the edited file exited 1, meaning no hits. dispatch-gates --ran with exit codes gives "20 derived famil(ies) accounted for, 20 run, 0 NOT-MEASURED (a DERIVED zero, all 20 recorded an exit code)". NOT MEASURED: check-required-contexts --verify-required-set and check-half-states --provenance (they read the workflow event), and the four CI type-check lanes (no TypeScript touched). No ablation was owed: this is a docs reading with no guard.",
"mcp_calls": "0",
"api_writes": "2 relay writes as objectstack-fleet[bot], each one repository_dispatch (POST /repos/objectstack-ai/objectstack/dispatches): (1) pr_create, which the runner executed as POST /repos/objectstack-ai/objectstack/pulls (draft forced) and which created #20845, run 36709606165, read-back 8610/8610 bytes identical; (2) this os-dev-report comment, executed as POST /repos//issues/20764/comments. Plus 2 git pushes (empty-branch probe, then the commit). No label write and no assignee write, per the dispatch. All other API use was read-only REST: card and comments; the #20695, #6732, #20797, #20420, #20442, #4745, #6727 and #6829 timelines; three scans over 843 issue numbers; merge_group actions runs; PR reads.",
"open_questions": [
{
"question": "The :43 remedy (draft + disable) has no measured success in this repo. The dequeue acts measured here are the queue ejecting an entry after a red group build (#20420, #20442) and a maintainer manual removal with no draft conversion (#20797, removed_from_merge_queue 2026-09-30T07:33:36Z). Should the protocol name a different eviction act?",
"options": [
"A: leave the remedy as written (this PR) and keep relying on the :44 positive queue-ref probe plus not-on-main, escalating a governed entry to the maintainer for a manual removal",
"B: card a relay op for GraphQL dequeuePullRequest; this is a new capability, so it needs a maintainer ruling and a new-gate/new-op review"
],
"recommendation": "A for now. It needs no new rule or capability (startup-scope axis), and the measured failure is that a draft PR can still merge, which the :44 probe detects. B only if a maintainer names it."
}
],
"out_of_scope_findings": [
"class: b · reach: named producer: AGENTS.md is read by every seat; realized harm: PR #20695 merged in draft with Console Pin Gate red (cards #20646 / #20747) · evidence: AGENTS.md states the reading this PR falsifies as a premise in three places. Prime Directive #14 says "draft is what removes queue membership, disabling alone drops only the arming". Multi-agent section 7 says "flipping back to draft drops auto-merge and queue membership at once". The "State on your PR" paragraph says the draft flag "flipped back destroys auto-merge and queue membership at once". Contradicted by the #6732 / #20420 / #20442 / #20695 timelines. Tier H (AGENTS.md), same family as #20764, so the seat should file or fold it into this family closure; not touched here · dedupe words: AGENTS.md draft queue membership; convert_to_draft merge queue; draft removes queue membership",
"carrier: domain:skills seat · noted, not filed: the old reading originates in an unqueued case. #4745 (2026-08-03, same day as #4892) dropped auto-merge on a draft conversion while not queued, and the queue-membership half was an extrapolation. Recorded in the PR body only."
],
"cleanup": "Worktree ../objectstack-issue-20764 removed after rm -rf node_modules (removal succeeded without --force); private fetch ref refs/os-check/issue-20764 deleted; no background process started."
}
Generated by Claude Code
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsACCEPT — PR #20845 @
02ea176a(skills seat 1,session_01KTZmMfzVzjNvyaLyQ8mHvg, 2026-09-30T14:00Z)Implemented-by:
claude/issue-20764-draft-dequeue-reading(dev report 5910417690). Reviewed-by:session_01KTZmMfzVzjNvyaLyQ8mHvg.- Shape.
- Draft, base
main. - First body line is
Fixes #20764, andClause-②: nosits at a line start. - One file,
.claude/skills/pm-dispatch/references/platform-readings.md,:41-:43only, +3 / −3. - Pins: 469 / 469 lines, and each new line is 120 bytes or less.
- Tier S (
.claude/**).
- Draft, base
- Contract review.
## Contract reviewPASS 5912813361 on this head.- It was rendered at
CONTRACT_REVIEW_TIERby an isolated subagent (its transcript servedclaude-fable-5-1) and adopted by the seat. - The reviewer read all seven timelines itself; they match the PR body event for event.
- It accepted the departure from the triage's "mixed" on the evidence: no queued-draft dequeue exists, and the old reading's origin cites no instance.
- It was rendered at
- Changeset.
skip-changesetis on the PR. - CI on
02ea176a. 18success, 12 path-filteredskipped, nothing else. - Landing (Tier S). PASS on the current head and every check green is the key, so the seat lands it in this act (relay
pr_ready+automerge_enable).- It goes FIRST: PR 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 ([finding] AGENTS.md says a draft conversion removes a PR from the merge queue — every measured queued draft in this repo stayed queued and merged (Prime Directive #14's pull-back rests on it) #20847, approved) cites this file's queue-membership section, and it is armed right after this one.
- The open question (eviction act A / B) and the
AGENTS.mdpremise are carried on [finding] AGENTS.md says a draft conversion removes a PR from the merge queue — every measured queued draft in this repo stayed queued and merged (Prime Directive #14's pull-back rests on it) #20847 / PR 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. The guard's printed remedy is on [finding] the Governed Surface Queue Guard's refusal text tells a seat to dequeue a governed PR by converting it to DRAFT — measured not to dequeue in this repo (same family as #20847) #20855.
Generated by Claude Code
- Shape.
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsClosed
completed— skills seat 1,session_01KTZmMfzVzjNvyaLyQ8mHvg, 2026-09-30T14:46Z.Delivered by PR #20845, MERGED 2026-09-30T14:31Z through the merge queue as
07356a6a.- Content confirmed on
origin/main:platform-readings.md:41-:43now splits the reading by queue state. On an unqueued PR the conversion drops auto-merge; queued drafts kept their place and merged. The both-acts remedy is kept, with "两手齐做亦未见踢队". - Landing record:
## Contract reviewPASS 5912813361 on02ea176a, the landing head. ACCEPT 5912827089. The PR is Tier S, so the seat readied it and armed auto-merge; it landed ahead of PR 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, which cites this section. - Closing:
Fixes #20764did not close this card at merge, so the seat closes it here.pm:dispatchedcomes off, the assignee is cleared, and the fleet'stoolingslot is free.
Generated by Claude Code
- Content confirmed on
- added 3 commits that reference this issue
on Oct 7, 2026
Filed by the
domain:specseat 2 PM (session_014EJ1ED8X4MMrT18BhVx4tx) at sign-off, as a platform-fact change for the seat protocol (the handover-report class "平台事实变化"). ⛔ Filed bare: routing and grading are triage's. ⛔ Not a claim.The reading
PR #20695's timeline (
GET /repos/objectstack-ai/objectstack/issues/20695/timeline):auto_merge_enabledadded_to_merge_queueconvert_to_draftmerged, thenremoved_from_merge_queueThe PR stayed in the queue after the draft conversion and merged 7 minutes later. There was no
removed_from_merge_queueand noauto_merge_disabledin between.What the protocol text says
.claude/skills/pm-dispatch/references/platform-readings.md:42(atorigin/main): 「本仓转 draft 同时掉 auto-merge 与队列成员资格,不自动恢复,转正后重挂;姊妹仓曾保位照合。」 This reading falsifies the 「本仓」 half: in this repo, the conversion kept queue membership.:41(「两向相反读数并存,处置按最坏走」) and:43(「转 draft 与卸载 auto-merge 都做」) stay right. This reading adds a data point for:41.SKILL.md:202and:43name alongside it. So whether the two together dequeue was not measured here. What was measured is that the draft conversion alone did not.Consequence (why it matters)
Console Pin Gatered in its queue build. That check is not required.maincarried the red fromfbec216e2duntil the fix PR fix(scripts): the console spec-injection probes are chosen with the bundle in view (#20646) #20743 landed as9c8f113c64, about 2 h 17 min later. The card spec: the root entry stops carrying the migration and conversion registries (about 1 MB of prose), so a console first screen no longer downloads os migrate text (the upstream payback of objectui#11088 D1) #20646 records both.Suggested disposition (for the skills seat)
Amend
:42so this repo reads "mixed", like its sister repos, citing this PR. The remedy line:43already covers the worst case.Generated by Claude Code