Repository navigation
skills(os-dev, pm-dispatch): a seat-driven PR is not assigned to the seat's account at the draft open; it reaches a human only after ACCEPT + contract PASS, as a review request to os-zhuang/hotlong when Tier H #27363
Description
coordinator#1 · os-bill · session_01Utp6CXZyT2n7UiyKFUQ3yT
Filing gate ③ (maintainer-directed task). The maintainer, in this project's thread, 2026-10-29, verbatim:
- 「我看到你有一大堆pr」 (02:42Z, looking at his GitHub PR list)
- 「这个是技能的bug,应该是开发完了你审核通过才会推送给我审核。立skills卡」 (02:42Z)
- 「审核人是 os-zhuang 和 hotlong」 (02:43Z)
⛔ Not a claim, ⛔ not a dispatch: the maintainer asked for the card. Lane domain:skills; the filing project (engine/spec lanes) does not implement it.
Business reason: the maintainer's assigned-PR list fills with seat-driven drafts that are not his to look at yet, so the PRs that do need a human are buried, and a request to look reads as "ready" before the seat has reviewed anything (the failure #26617 measured five times).
Reader: the domain:skills seat that dispatches this; the dev edits the files named below.
Dedupe: MCP semantic search on objectstack issues, open + closed, query "draft PR assigned to maintainer and review requested before seat review pr_create assignees governed review request" (178 hits, top 10 read). Same family, not the same ask: #26617 (open, pm:on-hold) moves the governed approver request off pr_create; #27345 (open, p1) gates the seat record's approval ask on a same-head PASS; #26155 / #26671 closed. None touches the PR assignee set at the draft open, or the project harness step.
What happens now (measured on origin/main eef83734, 2026-10-29T02:50Z)
| PR | draft | assignees | requested_reviewers | author |
|---|---|---|---|---|
| #27344 | yes | os-bill |
hotlong, os-zhuang |
objectstack-fleet[bot] |
| #27268 | yes | os-bill |
hotlong |
objectstack-fleet[bot] |
| #27246 | yes | os-bill |
— | objectstack-fleet[bot] |
| #27353 | no | os-bill |
— | objectstack-fleet[bot] |
Three sources put a PR in front of a human the moment it opens:
- PR assignee at the draft open.
.claude/agents/os-dev.md:37「PR assignee = 卡的:pr_create带assignees: [LOGIN]」 and L60 (write budget 「pr_create(draft,含 assignee 与 labels)」);.claude/skills/pm-dispatch/references/execution-duties.md:63「PR assignee = 卡的,接管 ② 同笔换;读者is:pr is:open assignee:LOGIN」. The card's assignee is the seat's account; for this maintainer's own seats that isos-bill, his login, so every draft lands in his assigned list. The relay carries it out inscripts/pm/fleet-write/ops.mjs:861–873(pr_create, the assignees leg). - Governed approver request at the draft open.
ops.mjs:867governedReview: trueonpr_create;.claude/skills/pm-dispatch/SKILL.md:198–199③. Already carded as fleet-write: relay pr_create asks the governed approvers to review a Tier H draft before any contract review exists, so an approver can approve and merge it unreviewed (#26566, #26570) #26617; not re-filed here. The maintainer's rule above covers it too, so the two can ride one PR. - The claude.ai project harness, outside this repo. A project thread's session context tells it, after creating any PR on github.com, to add the requesting user as assignee and request a review from them (
issue_writeupdate withassignees: ["os-bill"], thenupdate_pull_requestwithreviewers: ["os-bill"]), best-effort. No repo file sets this and no repo PR can remove it; the repo can only tell project threads not to perform it for a seat-driven PR, on the maintainer's words above.
Wanted — the maintainer's rule
A PR reaches a human only when development is done and the seat's review (ACCEPT, ## 席位核对) and, where clause ② applies, the contract-review PASS on the current head are on the PR. Only then, and only when the PR needs a human approval (Tier H), the seat requests review from GOVERNED_APPROVERS (os-zhuang, hotlong; scripts/pm/check-governed-queue-guard.mjs:698). ⛔ The seat's own account (os-bill here) is never assigned to or requested on a PR. A PR that lands on the seat's review (Tier S, ungoverned) goes to no human.
os-dev.mdL37 / L60:pr_createstops carryingassignees; the dev opens the draft with labels only.execution-duties.md:63: drop 「PR assignee = 卡的」 and the takeover swap; the seat's in-flight-PR reader stops depending on a PR assignee (e.g. open PRs onhead:claude/whose bodyFixes #N/Part of #Nnames a card the seat holds; the card's assignee andClaim:Branch:still own it). Checkproject-forms.md:31–32and every patrol that reads PR assignees as ownership.SKILL.md:198–201andreferences/lanes/director.md:57: the approver request is the seat's hand-off step after PASS + ACCEPT on the current head (shape 1 of fleet-write: relay pr_create asks the governed approvers to review a Tier H draft before any contract review exists, so an approver can approve and merge it unreviewed (#26566, #26570) #26617). The author-is-approver fallback (L199: assign the approver who cannot be requested) stays; it assigns an approver, never the seat's account.- One line where project threads read the PR rules (
references/dispatch-runbook.mdcard-thread section orreferences/coordinator.md): a project thread does not perform the harness's post-create assign / request-review step on a seat-driven PR; the approver request is the seat's hand-off. Cite the maintainer's words above. - H43 (
scripts/pm/check-half-states.mjs:9886; drafts neither fire nor silence it, L9940) reads the new timing, as fleet-write: relay pr_create asks the governed approvers to review a Tier H draft before any contract review exists, so an approver can approve and merge it unreviewed (#26566, #26570) #26617 asks: a Tier H PR before PASS + ACCEPT is not a half state; after both with no approver request it is. - Not this card: unassigning
os-billfrom PRs already in flight; their owning seats do it once this lands, or earlier on the maintainer's word.
Acceptance
- A relay
pr_createfor an os-dev draft sends no assignee leg (one live run quoted);execute.mjs --self-test/validate.mjs --self-testpin it. - The seat finds its in-flight PRs without a PR assignee (self-test or a quoted read).
- After landing, new seat-driven PRs do not appear under
is:pr is:open assignee:os-bill; a Tier H PR showsrequested_reviewersonly after PASS + ACCEPT on its head. pnpm check:pm-skill-ratchetgreen (SKILL.md, os-dev.md, execution-duties.md sit at headroom 0: reword inside lines, pay each added line with a deleted one).
Tier: .claude/** + scripts/pm/**; SKILL.md is a MANDATORY_TIER_GLOB row (CONTRACT_REVIEW_TIER). Size: S–M. Clause-②: no. Metadata-protocol: none. Suggested grade: p2, same family as #26617; the grade is triage's.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 29, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: p1 ·
domain:skills·area:devpath· same family as #27345 · 2026-10-29T03:00Z⛔ Not a claim.
os-zhuangandhotlong.pm:on-hold) is the older half: read it, and do not reopen it here.pm:queue.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:skills#2 · os-justin · session_01QSeKYmhU5KEj1nukYhp1Tg
Claim: PM loop round 5 (takeover shift, wave 11) · 2026-10-29T03:16Z — member of the FOLDED dispatch whose chain head is #27345 (one dev, one branch, one PR with
Fixes #27345andFixes #27363; the five fold gates and the full serial check are on the chain head's claim)Session:
session_01QSeKYmhU5KEj1nukYhp1TgAccount:
os-justin(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-27345-human-sees-pr-after-pass(shared with #27345, named after the chain head)Worktree:
objectstack-issue-27345Domain:
domain:skillsSeat:
domain:skills#2File surface: this card's share of the shared surface —
.claude/agents/os-dev.mdL37 + L60 (noassigneesonpr_create),references/execution-duties.mdL63 (the in-flight-PR reader without a PR assignee),SKILL.mdL198–201 +references/lanes/director.mdL57 (the approver request as the seat's post-PASS hand-off; the author-is-approver fallback assigns an approver, never the seat's account), one project-thread line (dispatch-runbook.md〈卡线程〉 orcoordinator.md),scripts/pm/fleet-write/ops.mjspr_create(governedReviewoff the create; assignees leg not sent by the dev) +scripts/pm/check-half-states.mjsH43 (stop on breach; explain in the report)Container & model: as the chain head —
M,mode:subagent,model: CONTRACT_REVIEW_TIER(MANDATORY bySKILL.mdandos-dev.md),effort: xhighClause-②: no
Metadata-protocol: none
Responsibility:
n/a — not a defect card(maintainer-directed: 「这个是技能的bug,应该是开发完了你审核通过才会推送给我审核。立skills卡」「审核人是 os-zhuang 和 hotlong」)Thread-read: 6486689476
Premise: holds — the card's 「What happens now」 table re-measured this fire on the open PR list: fleet-bot PRs carry person assignees (
os-bill6,os-warren2,os-support-ai1,marchtian1,os-tesla1) and Tier H drafts carryrequested_reviewersat the open;os-dev.mdL37/L60 andexecution-duties.mdL63 read as quoted on origin/main28872e68; H43 (check-half-states.mjsL9886) fires on 「asked NEITHER approver」 with no PASS/ACCEPT reading. Triage's seam note followed: one PR with #27345 keeps the wording in one home; #26617 read, not reopened.Serial constraints cleared: as the chain head's claim; this seat's #27359 is disjoint; no open PR or claim names these files.
objectstack-fleet commentedon Oct 29, 2026
domain:skills#2 · os-justin · session_01QSeKYmhU5KEj1nukYhp1Tg
os-dev-report
{ "issue": 27363, "chain_head": 27345, "status": "done", "branch": "claude/issue-27345-human-sees-pr-after-pass", "pr": "https://github.com/objectstack-ai/objectstack/pull/27385", "head": "50118ffc", "session": "session_01QSeKYmhU5KEj1nukYhp1Tg", "premise_still_valid": true, "summary": "Member of the folded dispatch; the full report (tests, gates, line budget, ablations, api_writes, deviations) is the os-dev-report comment on the chain head, card 27345. This card's own items: (1) os-dev.md L37/L60 — `pr_create` carries no `assignees`, labels only; (2) execution-duties.md L63 — 「PR assignee = 卡的」 and the takeover swap dropped, in-flight PRs read by `head:claude/` + the card the body names; patrols reading PR assignees as ownership: none found (check-handover reads card assignees and excludes pull requests; check-half-states reads PR assignees only as H43's approver-coverage fallback; project-forms.md L31–32 already assignee-free on the PR side); (3) SKILL.md L198–201 + director.md L57 — the approver request is the seat's hand-off after ACCEPT + same-head PASS, author-is-approver fallback keeps `assign` of the approver, never the seat's account; (4) dispatch-runbook.md 〈卡线程〉 L140 — a project thread does not perform the harness's post-create assign/request step, quoting 「审核通过才会推送给我审核」; (5) H43 reads the new timing (unread UNJUDGED, before quiet, due fires); ops.mjs `pr_create` loses `governedReview` (the follow-up stays on `pr_ready` as a backstop; the hand-off is the existing `pr_request_reviewers` op). Item 6 (unassigning people from PRs already in flight) and the claude.ai harness step itself are untouched, as the card says; 26617 stays on hold.", "verification": "execute.mjs --self-test 209/20 (pins: GOVERNED_REVIEW_OPS === ['pr_ready']; a pr_create on a Tier H diff reads no file list, sends no request and no assignee, approver-authored included); validate.mjs --self-test 216/13 (the derived-list pin red under the ops.mjs ablation, 1 of 216); check-half-states.mjs --self-test 5066 with `H43 hand-off timing 89/80`; this PR's own open through the relay sent no `assignees` key — read-back: GET /pulls/27385 after the stroke: draft true, state open, head 50118ffcff6fff491191057f02197254f04c5207, assignees [], requested_reviewers [], labels [documentation, size/l, skip-changeset], body 25164 B (relay read-back: 25164 sent / 25164 stored, identical; assignees as the pull lists them: none).", "mcp_calls": "0", "api_writes": "shared with the chain head's report: this comment is the second post-stamped write", "open_questions": [], "out_of_scope_findings": ["see the chain head's report (AGENTS.md sentence, carrier: the seat)"] }Readings above taken 2026-10-29T04:39Z · PR head 50118ff · origin/main 28872e6.
Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:skills#2 · os-justin · session_01QSeKYmhU5KEj1nukYhp1Tg
ACCEPT → PR #27385 comment 6489050616 · head
3e2b20cc110264f5de051b6b70aa5990beeb6c20· 2026-10-29T05:47Z (folded dispatch #27345 + #27363; contract review 6488313163 FAIL → rework → delta PASS 6489025774; Tier S by path, the seat lands it:pr_ready+automerge_enable; booked on merge)objectstack-fleet commentedon Oct 29, 2026
domain:skills#2 · os-justin · session_01QSeKYmhU5KEj1nukYhp1Tg
Landed · PR #27385 merged as
c5d46341747746b180626ad2fcb918324341cd22(2026-10-29T06:05Z, merge queue,objectstack-fleet[bot]; folded dispatch #27345 + #27363; landing authorised by the maintainer's word 「你应该按照 pm-dispatch 技能审核并落地pr」; Tier S by path — contract review 6488313163 FAIL → rework 3e2b20c → delta PASS 6489025774; ACCEPT 6489050616).origin/mainc5d46341grep -c "governedReview: true" scripts/pm/fleet-write/ops.mjspr_readyrow alone;pr_createsummons nobody).claude/skills/pm-dispatch/SKILL.mdL200pr_create不请不派;pr_ready只补交棒漏;PASS 后 head 移 ⇒ 回等复核;脱中继 PR 自读请/派。」node scripts/pm/fleet-write/execute.mjs --self-testState: card closed by the merge (
Fixes);pm:dispatchedstripped 2026-10-29T06:08Z; assignee kept as the record of who carried it. Carried out of scope by this seat: AGENTS.md 〈Multi-agent working discipline〉 「the PR's assignee mirrors the card's, set by the executor at pr_create」 now contradicts os-dev.md L37 — Tier H, the maintainer's hand (one sentence to retire).objectstack-fleet commentedon Oct 29, 2026
epic:#8345#1 · os-bill · session_01Utp6CbTZrFqRYNgjSaSbN5
Instances from epic #8345, recorded for the trail. All of them predate the fix in #27385 (landed 2026-10-29 05:49Z), so no new card is owed:
currencyMode: 'record'+currencyField— a record-mode amount points at a sibling ISO 4217 code field (multi-currency M0-1) #27268:objectstack-fleet[bot]requestedos-zhuangandhotlongat the draft open (2026-10-28 13:53Z).os-zhuangapproved the draft (5683778948) and flipped it ready. The PR landed later on a fresh approval at its final head, after the seat's ACCEPT and a same-head contract PASS.os-zhuangapproved feat(ui): record-mode currency — each record shows its own currency; ISO 4217 code select pre-filled with the organization currency; no cross-currency totals; Studio currency section #27340's draft (5693123132). The seat does not count that approval and reviews the final head as usual.Residual: the requests made before the fix are still pending on #27338, #27339 and #27340, and the relay has no op to withdraw a review request. Those three land within the R1 window, so this is left as is.