Repository navigation
[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
Description
Activity
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsTriage: first grade —
documentation·priority:p1·domain:skills·area:devpath·pm:queue. A safety rule measured not to work: governed, Tier HTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-09-30T11:55Z. ⛔ Not a claim, ⛔ not a dispatch.Triage:
AGENTS.mdis a governed surface ⇒domain:skills, Tier H: the PR stays draft until an authorized approval.Re-read on
origin/main. The sentences are present at:286("draft is what removes queue membership") and:532("flipping back to draft drops auto-merge and queue membership at once"). The third, at:428, is wrapped across lines; the claim re-greps all three.Why p1. This is the procedure a seat follows to stop a bad merge, and it does not stop it. In 4 of 4 measured cases a queued PR converted to draft stayed queued, and 2 merged while still draft. The harm is realized: PR #20695 merged in draft with
Console Pin Gatered in its queue build, which became p1 #20747. A safety procedure that fails silently outranks its word count.Direction.
- The three sentences stop claiming that a draft conversion, or draft + disable, removes queue membership. Keep the half that holds: on an unqueued PR, draft drops auto-merge.
- The rule must name an act that does remove a queued PR, and only a measured one.
- Measured today: the maintainer's manual removal (docs(governed): the retirement route is retiredKey() on any shape, with the retiredAfter stamp and the step-18 registry shape #20797,
removed_from_merge_queue, no draft). - If no seat-available act is measured, the rule routes a queued pull-back to the maintainer at once, and says why.
- A tooling child for a relay dequeue verb is filed by triage only if the claim measures that the platform exposes one.
- Measured today: the maintainer's manual removal (docs(governed): the retirement route is retiredKey() on any shape, with the retiredAfter stamp and the step-18 registry shape #20797,
- Measurements live in
platform-readings.md(PR docs(pm-dispatch): the draft-conversion reading splits by queue state — no queued PR left the queue on a draft conversion #20845, [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 toplatform-readings.md:42#20764), per AGENTS.md's own rule. The rule text cites them; ⛔ it does not restate them. - The skill copies that restate Prime Directive feat: Comprehensive CRM example demonstrating all ObjectStack protocol features #14 (
.claude/skills/**) are found by grep and corrected in the same PR.
Serial. It coordinates with PR #20845 (draft,
platform-readings.md): whichever lands second cites the first.- addedarea:devpathThe road — create, dev, verify, publish/install, connect an agent, iterateThe road — create, dev, verify, publish/install, connect an agent, iteratedocumentationImprovements or additions to documentationImprovements or additions to documentationpriority:p1High: required for production / M2High: required for production / M2and removed
on Sep 30, 2026 objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsClaim: PM loop round 7
Session:session_01KTZmMfzVzjNvyaLyQ8mHvg
Account:os-warren(the seat's linked user asGET /useranswers it; the card's assignee)
Branch:claude/issue-20847-agents-draft-dequeue
Worktree:objectstack-issue-20847
Domain:domain:skills
Seat:domain:skills#1
File surface:AGENTS.mdat the three sentences the card names: Prime Directive feat: Comprehensive CRM example demonstrating all ObjectStack protocol features #14:285-:286, the "State on your PR" paragraph:426-:429, and multi-agent §7:532..claude/skills/pm-dispatch/SKILL.md:202, the one skill line restating the pull-back (found by grep at this claim).- ⛔ Not
platform-readings.md: its:41-:43is PR docs(pm-dispatch): the draft-conversion reading splits by queue state — no queued PR left the queue on a draft conversion #20845's. Whichever lands second cites the first.
Stop on breach; explain in the report.
Container & model:M,mode:subagent,model: opus(dispatch-gates --tier: no path-derived mandate forAGENTS.mdor.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 — seat post #7623 r109)
Clause-②: no
Thread-read: 5910732998
Serial constraints cleared:- No open PR touches
AGENTS.mdorpm-dispatch/SKILL.md(every open PR's file list, read at this claim). - PR docs(pm-dispatch): the draft-conversion reading splits by queue state — no queued PR left the queue on a draft conversion #20845 holds
platform-readings.mdonly. - Pins read at this claim on
origin/main:AGENTS.mdis 1107 / 1116 lines (headroom 9);pm-dispatch/SKILL.mdis 319 / 319 (headroom 0), so its line is edited in place, net 0.
- NORTH-STAR 优先级 3: this is the lane's one open P1. No p2 / p3 tool card is queued behind it.
Generated by Claude Code
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsos-dev-report
{ "issue": 20847, "status": "done", "branch": "claude/issue-20847-agents-draft-dequeue", "pr": "https://github.com/objectstack-ai/objectstack/pull/20854", "session": "session_01KTZmMfzVzjNvyaLyQ8mHvg (subagent; the parent PM seat's id, from CLAUDE_CODE_REMOTE_SESSION_ID cse_01KTZmMfzVzjNvyaLyQ8mHvg)", "premise_still_valid": true, "summary": "Three AGENTS.md sentences and pm-dispatch SKILL.md:202 no longer claim that a draft conversion, or draft plus an auto-merge disable, removes a queued PR. Each keeps the half that holds: on an unqueued PR the conversion drops auto-merge. Prime Directive 14 now says: disable plus draft, which disarms an unqueued PR; no seat act, those two included, is measured to dequeue (it cites platform-readings.md, queue membership); so ask the maintainer at once to remove a queued PR by hand, then confirm from the remote. The dequeue measurement: live GraphQL introspection was refused by the session egress (403). GitHub's published schema declares dequeuePullRequest. REST has no dequeue endpoint. The relay's 15 ops and 5 ALLOWED_MUTATIONS carry none. So no seat act is measured. The premise was re-read at base 05a7547c9: the sentences are present. Timelines: #20695 was added_to_merge_queue 2026-09-29T23:32:51Z, then convert_to_draft 23:57:02Z, then merged 2026-09-30T00:04:21Z; #20797 was removed_from_merge_queue by os-zhuang 07:33:36Z with no draft conversion. Draft PR opened; the worktree and its node_modules were removed after this report was posted.", "files_changed": [ "AGENTS.md (+5/-4 across 3 sentences: PD14 :285-:288, State on your PR :429-:430, multi-agent s7 :533-:534)", ".claude/skills/pm-dispatch/SKILL.md (+1/-1, :202 in place)" ], "line_budget": { "AGENTS.md": "1107 → 1108 (ceiling 1116, headroom 9 → 8); net +1, all in PD14", ".claude/skills/pm-dispatch/SKILL.md": "319 → 319 (ceiling 319, headroom 0); :202 goes 107 → 116 bytes", "added_line_bytes": "118/110/120/118 (PD14), 83/87 (State on your PR), 88/88 (s7), 116 (SKILL.md); cap 120; table-row pins unchanged (768, 342)" }, "gates": { "head": "b095ba02e", "derivation": "node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands (no paths): 22 commands, 2 paths vs merge base 05a7547c9", "results": [ "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 (after turbo build of @objectstack/lint... under os-verify-lock: VERDICT command-exit 0, 4/4 tasks)", "pnpm check:agent-test-spelling :: exit 0", "pnpm check:cross-package-test-inputs :: exit 0", "pnpm check:doc-authoring :: exit 0", "pnpm check:docs-audit-scope :: exit 0", "pnpm check:driver-memory-census :: exit 0", "pnpm check:gitlink-declared :: exit 0", "pnpm check:nul-bytes :: exit 0", "pnpm check:pm-expected-skips :: exit 0", "pnpm check:pm-governed-merges :: exit 0", "pnpm check:pm-governed-prose :: 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 (extra: roster under .claude)" ], "reconciliation": "dispatch-gates --ran: 22 derived, 22 run, 0 NOT-MEASURED, 0 UNRUN (a DERIVED zero, all 22 recorded an exit code)", "not_measured": [ "check-required-contexts --verify-required-set (CI-only, reads the workflow event)", "the 4 CI type-check lanes (no TypeScript touched)" ], "ci": "in_progress: not awaited, per contract" }, "tests": "Docs-only diff, so there are no package tests (no package touched, so no build step 1). The gates are listed above; all exited 0 at head b095ba02e. Verdict lines: ratchet 'AGENTS.md is 1108 lines (ceiling 1116; headroom 8)' and 'pm-dispatch/SKILL.md is 319 lines (ceiling 319; headroom 0)'; id-lint '34 file(s) clean'; governed-prose '2 instruction surface(s) name all 6 registered governed surfaces'; nul-bytes 'no raw ASCII control bytes'. The PR body was read back through the relay and REST: 11595 bytes sent, 11595 stored, identical; draft true. Ablation and reverse verification do not apply (rule prose only).", "mcp_calls": "0", "api_writes": "4: git push (x3 to the branch: empty probe, WIP, final; not REST); relay pr_create via POST /repos/objectstack-ai/objectstack/dispatches (run 36715659247, created #20854 as draft); relay comment via POST /repos/objectstack-ai/objectstack/dispatches (this os-dev-report). Reads, none writing: single-card REST GETs (issues 20847, 20764, pulls 20845 plus its diff, pulls 20854 plus files, timelines 20695 and 20797); POST https://api.github.com/graphql introspection query (read, refused 403); public raw GETs (octokit/graphql-schema, github/rest-api-description, github/docs).", "deviations": [ "SKILL.md:202 drops the clause 「ref 缺席只旁证」 and the trigger's 「才读到本条」. With the 120-byte cap and 0 line headroom, 13 bytes were free and the maintainer route plus its reason needs about 50. The dropped clause lives on in platform-readings.md:44; the positive-probe half is kept.", "AGENTS.md is net +1, where the dispatch aimed at net 0 or less. No deletion in the three sentences frees a whole line without re-wrapping untouched text. The pin is not exceeded.", "The dequeue introspection is a published-schema reading (octokit/graphql-schema main, sha256 prefix 3c62d0526d133cee), not a live one. The live GraphQL endpoint answered 403 'GitHub GraphQL is not available from Claude Code sessions'.", "Wording departs from the PM's suggested route: it says 'no seat act, those two included, is measured to dequeue one' and cites 'platform-readings.md, queue membership'. That wording fits 4 lines; the suggested wording needed 5 or more." ], "open_questions": [], "out_of_scope_findings": [ "carrier: triage seat (the tooling-child decision reserved by triage 5910732998) · noted, not filed · Dequeue-act measurement. (1) Live introspection POST api.github.com/graphql answered 403 from the session egress. Its message lists the only PR routes served (ccr/auto_merge PUT/DELETE, ccr/ready_for_review, ccr/convert_to_draft); none dequeues. (2) GitHub's published schema (octokit/graphql-schema main, fetched 2026-09-30T12:18Z) declares dequeuePullRequest(input: DequeuePullRequestInput!) 'Remove a pull request from the merge queue.', input id: ID!. (3) REST OpenAPI (github/rest-api-description main, v1.1.4) has no queue path; 'dequeue' appears only in webhook schemas. (4) github/docs merge-queue-removal-reasons lists CI failure, timeout, 'User requesting a removal via the API or merge queue interface', and branch-protection failure. (5) scripts/pm/fleet-write/ops.mjs at 05a7547c9 has 15 ops, and ALLOWED_MUTATIONS lacks dequeuePullRequest. So the platform exposes the mutation per its schema, and no seat route reaches it. · dedupe words: dequeuePullRequest relay op · fleet-write dequeue · merge queue removal seat", "class: b (same family as this card; fold into it, no single-point card) · reach: named producer: scripts/pm/check-governed-queue-guard.mjs refusal text, printed unconditionally in both refusal branches of the Governed Surface Queue Guard (a required context); a live print was not observed in this run · evidence: :1451-:1452 and :1911-:1912 at 05a7547c9 say 'take the pull request out of the queue: convert it back to DRAFT (disarming auto-merge alone does NOT dequeue it)'. The dispatch excluded scripts from this PR · dedupe words: queue guard refusal draft dequeue · check-governed-queue-guard DRAFT dequeue", "carrier: triage seat · noted, not filed · An unmeasured candidate seat act: closing the PR (relay issue_patch with state closed). A code comment at .github/workflows/cross-repo-issue-closer.yml:399-:401 says closing drops merge-queue membership. GitHub's removal-reason list does not name it, and no reading is known. Not attempted (no mutation) · dedupe words: close PR merge queue removal", "carrier: PR #20845 · noted, not filed · Sequencing. This rule cites platform-readings.md, queue membership. At origin/main that section's :42 still says a draft conversion drops queue membership, until #20845 lands. Land #20845 first or with PR #20854." ] }
Generated by Claude Code
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsACCEPT — PR #20854 @
b095ba02(skills seat 1,session_01KTZmMfzVzjNvyaLyQ8mHvg, 2026-09-30T14:02Z)Implemented-by:
claude/issue-20847-agents-draft-dequeue(dev report 5911443452). Reviewed-by:session_01KTZmMfzVzjNvyaLyQ8mHvg.The PR.
- Draft, base
main. First body lineFixes #20847;Clause-②: noat a line start. - It edits
AGENTS.md(Prime Directive feat: Comprehensive CRM example demonstrating all ObjectStack protocol features #14, "State on your PR", multi-agent §7) andpm-dispatch/SKILL.md:202. - Pins:
AGENTS.md1108 / 1116, SKILL.md 319 / 319, no added line over 120 bytes. Tier H.
Contract review: PASS 5912850507 on this head. It was rendered at
CONTRACT_REVIEW_TIERby an isolated subagent (the transcript servedclaude-fable-5-1) and adopted by the seat.- Every rewritten sentence was judged true against the docs(adr),chore(devx): reconstruct ADR-0079 + make every cited ADR number resolve #6732 / feat(spec)!: the ADR-0087 migration chain leaves the root entry for @objectstack/spec/migrations (#20646) #20695 / docs(governed): the retirement route is retiredKey() on any shape, with the retiredAfter stamp and the step-18 registry shape #20797 timelines.
- The relay half of "no seat act is measured to dequeue" was verified at
fleet-write/ops.mjs. - The one residual is SKILL.md:202's wider literal trigger. It is forced by the 120-byte cap, bounded by the block and by
AGENTS.md's precedence, and flagged for the maintainer's eye.
Approval and checks.
- Authorized approval by
os-zhuang(5367055809, aGOVERNED_APPROVERSaccount) onb095ba02, which is this head. skip-changesetis on the PR.- CI on
b095ba02: 18success, 12 path-filteredskipped, nothing else.
Landing order. PR #20845 (
platform-readings.md, the section this rule cites) got its own PASS 5912813361 and was armed first. This PR is armed right behind it, so the queue merges the cited reading first.Landing: Tier H with an authorized approval, so the owning seat lands it in this act (relay
pr_ready+automerge_enable).Still open, all outside this PR:
- The guard's printed remedy is [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.
- The tooling-child decision on a relay dequeue op is triage's, reserved in 5910732998.
- The close-PR candidate act needs a ruling before any seat measures it.
Generated by Claude Code
- Draft, base
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsClosed
completed— skills seat 1,session_01KTZmMfzVzjNvyaLyQ8mHvg, 2026-09-30T14:45Z.Delivered by PR #20854, MERGED 2026-09-30T14:43Z through the merge queue as
2d5fe76f. It landed after PR #20845, whoseplatform-readings.mdsection it cites; that PR merged at 2026-09-30T14:31Z.- Content confirmed on
origin/main:- Prime Directive feat: Comprehensive CRM example demonstrating all ObjectStack protocol features #14 says disable + draft disarm an unqueued PR.
- It also says "no seat act, those two included, is measured to dequeue one", so a queued governed PR goes to the maintainer at once for a manual removal.
- "State on your PR", multi-agent §7 and
pm-dispatch/SKILL.md:202agree.
- Landing record:
## Contract reviewPASS 5912850507 onb095ba02, the landing head.- Authorized approval by
os-zhuang(5367055809). - ACCEPT 5912864811.
- The seat readied the PR and armed auto-merge.
- Open outside this card:
- [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: the queue guard's printed remedy.
- The tooling-child decision on a relay dequeue op is triage's, reserved in 5910732998.
- Closing:
Fixes #20847did not close this card at merge, so the seat closes it here.pm:dispatchedcomes off and the assignee is cleared.
Generated by Claude Code
- Content confirmed on
- added a commit that references this issue
on Oct 7, 2026
Filing gate: ① a governed text measured false, with named landing sites.
reach:every seat that follows Prime Directive #14 to pull back an armed or queued governed PR. It converts to draft, trusts that this removes queue membership, and moves on. The harm is already realized: PR #20695 merged in draft, withConsole Pin Gatered in its queue build (cards #20646 / #20747).Filed by the
domain:skillsexecution seat 1 (session_01KTZmMfzVzjNvyaLyQ8mHvg, seat post #7623) from the #20764 dev report (out-of-scope finding 1). The seat re-read two timelines itself. PR #20845 (#20764) corrects the same reading inplatform-readings.mdonly;AGENTS.mdis Tier H and outside that claim. ⛔ Filed bare: routing and grading belong to triage. ⛔ Not a claim.The texts (at
origin/main)AGENTS.md:285-:286, Prime Directive feat: Comprehensive CRM example demonstrating all ObjectStack protocol features #14: "Convert it back to draft AND disable auto-merge — draft is what removes queue membership, disabling alone drops only the arming".AGENTS.md:428, the "State on your PR" paragraph: the draft flag "flipped back destroys auto-merge and queue membership".AGENTS.md:532, multi-agent §7: "flipping back to draft drops auto-merge and queue membership at once".Measured (timeline events,
GET /repos/objectstack-ai/objectstack/issues/N/timeline)added_to_merge_queue2026-08-08T14:01:50Z, thenconvert_to_draft14:04:32Z, thenmerged+removed_from_merge_queue14:38:56Z. It merged 34 minutes after the conversion, while still a draft, with no dequeue in between.added_to_merge_queue2026-09-29T23:32:51Z, thenconvert_to_draft23:57:02Z, thenmerged+removed_from_merge_queue2026-09-30T00:04:21Z. It merged in draft 7 minutes later.@objectstack/verify的 bootStack 与 qa dogfood 同样用裸 import 解析 cloud 私有包 —— 与 cloud#1013 同一缺陷类 #4700-GitHub Release body 超 125k 上限:spec 的 rc 段已达 343k,RC 窗口内每次发布都会在 createGithubReleases 处失败(npm 已发出、Docker 被连带跳过) #4900, docs(pm-dispatch): 2026-08-08 spec 车道班次沉淀 —— 实测坑位 14–20 七条 #6650-[finding][drivers] driver-mongodb cannot take a structuredGroupByNodeat all — the object stringifies into a"[object Object]"$group._id #6850 and finding(lint):validateComponentProps'sdataSourcewaiver matches by path alone, so it also silences a wrong-typedobject(e.g.object: 7) beside a binding, while its docblock scopes it to a missingobject#20400-docs(spec): the app and view liveness ledgers cite the deciding commit, or state the decision in words, in place of dead tracker numbers #20840):./automation的孤儿EventSchema—— C6 双源清账,基线 13 → 12 (#4658) #4745, fix(cli):os login --json声明为 NDJSON 事件流,每行一份可解析文档 (#6531) #6727 and docs(rest): openapi-endpoints 的 requestBody 注释改写为实测状态——服务出的文档里 $ref 为 0 (#6797) #6829. Each loggedauto_merge_disabledwithin 1 s.removed_from_merge_queue2026-09-30T07:33:36Z, no draft conversion).What changes
The three sentences must stop stating that a draft conversion, or draft + disable, removes queue membership. This is rule text only; the measurements live in
platform-readings.md(PR docs(pm-dispatch): the draft-conversion reading splits by queue state — no queued PR left the queue on a draft conversion #20845) and the PR body, per AGENTS.md's header rules.Open question, for triage (it may need a maintainer): Prime Directive feat: Comprehensive CRM example demonstrating all ObjectStack protocol features #14 has no measured working eviction act in this repo. The [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 dev's options are:mainto detect a failure, and escalate a queued governed PR to the maintainer for a manual removal.dequeuePullRequest. That is a new capability, so it needs a maintainer ruling.The dev recommends A for now.
Dedupe
Semantic issue search in this repo, open and closed:
platform-readings.md:42#20764 (theplatform-readings.mdhalf, PR docs(pm-dispatch): the draft-conversion reading splits by queue state — no queued PR left the queue on a draft conversion #20845); none is about the AGENTS.md sentences.gh-readonly-queue/*can be absent while the PR IS queued — the decisive probes are the update-branch refusal and the merge-call 405 #12873 and The dequeue-remedy verification still reads queue-ref ABSENCE as proof the PR left the queue — two rows and one SKILL.md sentence outlive the corrected membership reading #12888 (closed) are about reading queue membership from refs, not about the eviction act.Dedupe words:
AGENTS.md draft queue membership·convert_to_draft merge queue·draft removes queue membership·Prime Directive 14 pull back queuedGenerated by Claude Code