Skip to content

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

Closed

Description

@objectstack-fleet

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:

  1. 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 is os-bill, his login, so every draft lands in his assigned list. The relay carries it out in scripts/pm/fleet-write/ops.mjs:861–873 (pr_create, the assignees leg).
  2. Governed approver request at the draft open. ops.mjs:867 governedReview: true on pr_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.
  3. 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_write update with assignees: ["os-bill"], then update_pull_request with reviewers: ["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.

  1. os-dev.md L37 / L60: pr_create stops carrying assignees; the dev opens the draft with labels only.
  2. 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 on head:claude/ whose body Fixes #N / Part of #N names a card the seat holds; the card's assignee and Claim: Branch: still own it). Check project-forms.md:31–32 and every patrol that reads PR assignees as ownership.
  3. SKILL.md:198–201 and references/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.
  4. One line where project threads read the PR rules (references/dispatch-runbook.md card-thread section or references/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.
  5. 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.
  6. Not this card: unassigning os-bill from PRs already in flight; their owning seats do it once this lands, or earlier on the maintainer's word.

Acceptance

  • A relay pr_create for an os-dev draft sends no assignee leg (one live run quoted); execute.mjs --self-test / validate.mjs --self-test pin 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 shows requested_reviewers only after PASS + ACCEPT on its head.
  • pnpm check:pm-skill-ratchet green (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

  1. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    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.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    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 #27345 and Fixes #27363; the five fold gates and the full serial check are on the chain head's claim)
    Session: session_01QSeKYmhU5KEj1nukYhp1Tg
    Account: os-justin (the seat's linked user as GET /user answers 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-27345
    Domain: domain:skills
    Seat: domain:skills#2
    File surface: this card's share of the shared surface — .claude/agents/os-dev.md L37 + L60 (no assignees on pr_create), references/execution-duties.md L63 (the in-flight-PR reader without a PR assignee), SKILL.md L198–201 + references/lanes/director.md L57 (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 〈卡线程〉 or coordinator.md), scripts/pm/fleet-write/ops.mjs pr_create (governedReview off the create; assignees leg not sent by the dev) + scripts/pm/check-half-states.mjs H43 (stop on breach; explain in the report)
    Container & model: as the chain head — M, mode:subagent, model: CONTRACT_REVIEW_TIER (MANDATORY by SKILL.md and os-dev.md), effort: xhigh
    Clause-②: 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-bill 6, os-warren 2, os-support-ai 1, marchtian 1, os-tesla 1) and Tier H drafts carry requested_reviewers at the open; os-dev.md L37/L60 and execution-duties.md L63 read as quoted on origin/main 28872e68; H43 (check-half-states.mjs L9886) 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.

  3. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  4. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    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)

  5. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    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).

    probe on origin/main c5d46341 reading
    grep -c "governedReview: true" scripts/pm/fleet-write/ops.mjs 2 (the pr_ready row alone; pr_create summons nobody)
    .claude/skills/pm-dispatch/SKILL.md L200 118 B 「pr_create 不请不派;pr_ready 只补交棒漏;PASS 后 head 移 ⇒ 回等复核;脱中继 PR 自读请/派。」
    node scripts/pm/fleet-write/execute.mjs --self-test 209 cases pass

    State: card closed by the merge (Fixes); pm:dispatched stripped 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).

  6. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    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:

    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.

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

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedomain:skillspriority:p1High: required for production / M2tooling

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions