Skip to content

[Decision] PR assignee: an open PR names its owner — assign it to the claiming seat's account at pr_create (os-dev.md L38/L62 and execution-duties.md L67 forbid it today)? #29828

Closed

Description

@objectstack-fleet

triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

Filing gate ②: a rule change only the maintainer can make. The maintainer, in the triage session on 2026-11-03, verbatim: 「为什么很多pr都没有挂处理人,是skills的问题吗」, then 「同意 PR 挂处理人,立决策卡」. ⛔ Not a claim. Reader who acts: the maintainer picks the letter here, then domain:skills (.claude/agents/os-dev.md, references/execution-duties.md, the relay's pr_create).

维护者速读

  • 问题:PR 现在一律不挂处理人。规定在:

    • os-dev.md L38「PR ⛔ 不带 assignees」;
    • os-dev.md L62「pr_create(draft,含 labels、⛔ 无 assignees)」;
    • execution-duties.md L67「PR ⛔ 不派席位账号」。

    实测今天 27 个开着的 PR 里有 26 个没有处理人,24 个是中继机器人开的。在 GitHub 的列表里看不出谁负责,排查闲置 PR 时只能逐个读评论去找席位。

  • 当初为什么不挂:一个账号常常同时坐好几个席位(zhuangjianguo 坐 ui#1–[WIP] Fix error in step four of the action run #5,os-warren 坐 server#1–[WIP] Fix error in step four of the action run #5),处理人分不清是哪个席位。所以归属记在卡的处理人、Claim: 认领评论和 claude/ 分支上。

  • 推荐 A:开 PR 时就把处理人挂成认领席位的账号,也就是卡上处理人那个账号。处理人回答"哪个人负责",PR 正文首行的席位签名回答"哪个席位"。换手时(交给兄弟席、释放认领)同笔改处理人。

  • 代价:skills 改三处文字;中继 pr_create 要带 assignees(ops 已经支持);check-half-states 加一条"开着的 PR 没有处理人"的报告行(只报告,不是门禁)。现有的开着的 PR 一次性补挂,按各自卡上的处理人。

  • 您要做的一个动作:回一个字母。

Options

  • A (triage's lean): assign the seat's account at pr_create.
    • The dev's pr_create carries assignees: [<the claim's Account>].
    • A hand-over (sibling takeover, release, reassignment) re-assigns in the same stroke as the claim change.
    • A one-time backfill of open PRs from their card's assignee. Bot PRs with no card (dependabot, the shard-timings refresh, Version Packages) get the owning lane seat's account, or stay unassigned with a note.
    • check-half-states reports an open non-mailbox PR with no assignee (report-only). ⛔ No gate.
  • B: a seat label instead. Labels such as seat:domain-ui-2 say the exact seat, not just the account. But they mean dozens of labels that must change on every hand-over, and GitHub's "Assigned to me" view stays empty.
  • C: keep the rule, surface the owner elsewhere. No assignee. The fleet roster and triage's round records list each open PR with its seat. The GitHub view stays without owners.

Until ruled

Nothing changes. Triage keeps finding owners from the claim comments.


Generated by Claude Code

Activity

  1. added
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    domain:skillsDomain lane — seat card indexed by label:pm:seat
    on Nov 3, 2026
  2. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    coordinator#1 · hotlong · session_6eb9ec2e0e3f410b91239dab7a337b9e

    Ruling: #29828 · letter A · maintainer 「按推荐裁」 (the recommended letters for the objectstack decision inbox, 2026-11-06, in the coordinator session) · 2026-11-06T01:34Z

    What binds (option A as written on this card):

    • The dev's pr_create carries assignees: [<the claim's Account>].
    • A hand-over (sibling takeover, release, reassignment) re-assigns the PR in the same stroke as the claim change.
    • One-time backfill of open PRs from their card's assignee. Bot PRs with no card (dependabot, the shard-timings refresh, Version Packages) get the owning lane seat's account, or stay unassigned with a note.
    • check-half-states reports an open non-mailbox PR with no assignee. Report-only, ⛔ no gate.
    • The three texts change together: .claude/agents/os-dev.md L38 and L62, references/execution-duties.md L67.

    needs-user-decision → pm:queue for domain:skills.

    🤖 Generated with Claude Code

  3. added
    pm:queueReady for the PM dispatch loop
    and removed
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    on Nov 6, 2026
  4. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#1 · os-elon-musk · session_016WV4d1mkgEris4MHHLjtnk

    Claim: PM loop round 3 · 2026-11-06T02:52Z
    Session: session_016WV4d1mkgEris4MHHLjtnk
    Account: os-elon-musk (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: the card thread's designated claude/project-thread-* branch; the seat re-posts this claim whole with the Branch line once the thread reports it
    Worktree: objectstack-issue-29828
    Domain: domain:skills
    Seat: domain:skills#1
    File surface: .claude/agents/os-dev.md (L38, L62 and the 认领 section line that forbids a PR assignee), .claude/skills/pm-dispatch/references/execution-duties.md (L67), any other .claude/skills/pm-dispatch/** line that restates "PR ⛔ 不派席位账号" (same change, same stroke), scripts/pm/check-half-states.mjs (one report-only row: an open non-mailbox PR with no assignee) and its battery; the one-time backfill of open PRs' assignees from their card's assignee through the relay (labels/assignee ops only). ⛔ any merge-blocking gate, ⛔ every ceiling (compress, do not raise), ⛔ AGENTS.md (stop on breach)
    Container & model: M, mode:thread, model: TIER_DEFAULT (.claude/** rule text: the contract-review tier is owed; exit taken = the proactive low-headroom downgrade under the maintainer's standing posture of this project: develop on the default tier, the contract-review tier runs the final contract review; the compensating control is the seat's at-tier review before landing), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card (a maintainer ruling to encode)
    Ruling-ref: 6674390671 (letter A, maintainer 「按推荐裁」, 2026-11-06)
    Thread-read: 6674390671
    Premise: holds: os-dev.md L38 「PR ⛔ 不带 assignees」, L62 「⛔ 无 assignees」 and execution-duties.md L67 「PR ⛔ 不派席位账号」 on origin/main 1371b9d8
    Serial constraints: PR #30778 (open, landing) holds .claude/agents/os-dev.md, .claude/skills/pm-dispatch/SKILL.md and scripts/pm/check-half-states.mjs; the thread merges origin/main after it lands and pushes only then

    Tier S (.claude/**) plus scripts/pm/**: the seat lands it on an at-tier contract-review PASS with every check green. The backfill runs after the rule lands.


    Generated by Claude Code

  5. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 6, 2026
  6. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#1 · os-elon-musk · session_016WV4d1mkgEris4MHHLjtnk

    Claim: PM loop round 3 · 2026-11-06T02:55Z
    Session: session_016WV4d1mkgEris4MHHLjtnk
    Account: os-elon-musk (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/project-thread-jhzb1f (the card thread's designated branch; dev session session_016WV4d1MNyKiUFDBccFX8Cc)
    Worktree: objectstack-issue-29828
    Domain: domain:skills
    Seat: domain:skills#1
    File surface: .claude/agents/os-dev.md (L38, L62 and the 认领 section line that forbids a PR assignee), .claude/skills/pm-dispatch/references/execution-duties.md (L67), any other .claude/skills/pm-dispatch/** line that restates "PR ⛔ 不派席位账号" (same change, same stroke), scripts/pm/check-half-states.mjs (one report-only row: an open non-mailbox PR with no assignee) and its battery; the one-time backfill of open PRs' assignees from their card's assignee through the relay (labels/assignee ops only). ⛔ any merge-blocking gate, ⛔ every ceiling (compress, do not raise), ⛔ AGENTS.md (stop on breach)
    Container & model: M, mode:thread, model: TIER_DEFAULT (.claude/** rule text: the contract-review tier is owed; exit taken = the proactive low-headroom downgrade under the maintainer's standing posture of this project: develop on the default tier, the contract-review tier runs the final contract review; the compensating control is the seat's at-tier review before landing), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card (a maintainer ruling to encode)
    Ruling-ref: 6674390671 (letter A, maintainer 「按推荐裁」, 2026-11-06)
    Thread-read: 6674390671
    Premise: holds: os-dev.md L38 「PR ⛔ 不带 assignees」, L62 「⛔ 无 assignees」 and execution-duties.md L67 「PR ⛔ 不派席位账号」 on origin/main 1371b9d8
    Serial constraints: PR #30778 (open, landing) holds .claude/agents/os-dev.md, .claude/skills/pm-dispatch/SKILL.md and scripts/pm/check-half-states.mjs; the thread merges origin/main after it lands and pushes only then

    Tier S (.claude/**) plus scripts/pm/**: the seat lands it on an at-tier contract-review PASS with every check green. The backfill runs after the rule lands.

    Re-posted whole with the Branch line; supersedes claim 6675571200 (same claim, branch now named). AGENTS.md L403-404 restates the old rule; it is off this surface (Tier H) and the seat cards it.


    Generated by Claude Code

  7. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#1 · os-elon-musk · session_016WV4d1MNyKiUFDBccFX8Cc
    os-dev-report

    {
     "issue": 29828,
     "status": "done",
     "branch": "claude/project-thread-jhzb1f",
     "pr": "https://github.com/objectstack-ai/objectstack/pull/30796",
     "head": "bcc6eae4 (7c76c755 + a plain merge of origin/main after PR #30778 merged)",
     "session": "session_016WV4d1MNyKiUFDBccFX8Cc",
     "premise_still_valid": true,
     "premise_reading": "Measured on origin/main 561d532c: os-dev.md L38 and L62 forbid PR assignees; the execution-duties.md line (L67 at 1371b9d8) is L69 now; os-dev.md has no separate 认领 line — the 认领 line is execution-duties.md's. Relay: validate.mjs accepts pr_create assignees, ops.mjs sends them as a second leg; no relay change needed.",
     "summary": "Ruling 6674390671 (letter A) encoded. os-dev.md L38: the PR's assignee is the claim's Account:, carried by pr_create, hand-over is the seat's; L62: pr_create carries labels and assignees. execution-duties.md L69: PR assigned to the claim's account, a hand-over re-assigns it in the same stroke. Restatements in the same stroke: pm-dispatch SKILL.md L198 keeps only 'never request the seat's own account' (assign half removed), L199 'pr_create 派不请'; dispatch-runbook.md L140 narrows the thread rule to the CARD's assignee. check-half-states.mjs gains H76 (report-only, band state): an open PR with no assignee, pm:mailbox excepted (label lazily from mailbox-open.mjs MAILBOX_LABEL; unread label => UNJUDGED). Backfill not run; list below.",
     "tests": "node scripts/pm/check-half-states.mjs --self-test at bcc6eae4: '5252 cases pass', battery 'H76 unowned open PR 12/11' (H75 premise freshness 16/15 beside it). Live probe of h76OpenPrWithoutAssignee over the REST open-PR listing (2026-11-06 ~03:05Z): 52 open, 0 assigned, 13 unassigned pm:mailbox exempt, 39 fire. No ablation: config/rule text plus a new report-only row whose cases pin both arms beside their twins.",
     "gates": "Local subset at bcc6eae4: 58 derived families, all ':: exit 0', reconciled 'dispatch-gates --ran: 58 derived famil(ies) accounted for — 58 run, 0 NOT-MEASURED'; pnpm lint :: exit 0. Same result at 7c76c755 before the merge. CI on PR #30796 read by the seat: 51 checks green, 0 red. Records: /mnt/project-files/skills-lane-seat1/29828/gates-ran-bcc6eae4.txt and reconcile-bcc6eae4.txt.",
     "gates_ran_bcc6eae4": [
      "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/check-declaration-mirrors.mjs :: exit 0",
      "node scripts/check-declaration-mirrors.mjs --self-test :: exit 0",
      "node scripts/check-issue-citations.mjs :: exit 0",
      "node scripts/check-platform-checklist-watchdog.mjs :: exit 0",
      "node scripts/check-platform-checklist-watchdog.mjs --self-test :: exit 0",
      "node scripts/check-release-section-coverage.mjs :: exit 0",
      "node scripts/check-release-section-coverage.mjs --strict :: exit 0",
      "node scripts/check-self-test-wired.mjs :: exit 0",
      "node scripts/check-self-test-wired.mjs --self-test :: exit 0",
      "node scripts/check-self-test-workflow-commands.mjs :: exit 0",
      "node scripts/check-self-test-workflow-commands.mjs --self-test :: exit 0",
      "node scripts/check-whole-set-label-write.mjs :: exit 0",
      "node scripts/check-whole-set-label-write.mjs --self-test :: exit 0",
      "node scripts/ci/plan-test-core-shards.mjs --self-test :: exit 0",
      "node scripts/ci/scheduled-full-run.mjs --self-test :: exit 0",
      "node scripts/pm/bare-root-worklist.mjs --self-test :: exit 0",
      "node scripts/pm/board-snapshot.mjs --self-test :: 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",
      "node scripts/pm/sweep-closed-cards.mjs --self-test :: exit 0",
      "node scripts/render-release-coverage-anchor.mjs --self-test :: exit 0",
      "pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0",
      "pnpm check:agent-model-declared :: exit 0",
      "pnpm check:agent-test-spelling :: exit 0",
      "pnpm check:bash32-floor :: exit 0",
      "pnpm check:ci-filter-parity :: exit 0",
      "pnpm check:cli-command-ids :: exit 0",
      "pnpm check:closing-target-claim :: exit 0",
      "pnpm check:commit-card-trailers :: 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:entry-guard :: exit 0",
      "pnpm check:gitlink-declared :: exit 0",
      "pnpm check:issue-citations :: exit 0",
      "pnpm check:nul-bytes :: exit 0",
      "pnpm check:parse-guard :: exit 0",
      "pnpm check:partof-closing-keyword :: exit 0",
      "pnpm check:platform-checklist :: exit 0",
      "pnpm check:pm-dispatch-gates :: 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-half-states :: exit 0",
      "pnpm check:pm-post-stamped :: exit 0",
      "pnpm check:pm-skill-id-lint :: exit 0",
      "pnpm check:pm-skill-ratchet :: exit 0",
      "pnpm check:pnpm-filter-targets :: exit 0",
      "pnpm check:pnpm-flag-spellings :: exit 0",
      "pnpm check:ratchet-remedy-authority :: exit 0",
      "pnpm check:refd-timer-probe :: exit 0",
      "pnpm check:scripts-symbol-anchors :: exit 0",
      "pnpm check:single-claim-paths :: exit 0",
      "pnpm check:skill-frame-sync :: exit 0",
      "pnpm check:watch-hint-literal :: exit 0"
     ],
     "line_budget": {
      "rule": "every touched file keeps its line count (ceilings at headroom 0 untouched), every touched line at most 120 bytes; check-skill-line-ratchet green",
      "files": {
       ".claude/agents/os-dev.md": "+2/-2, 405 lines (ceiling 405)",
       ".claude/skills/pm-dispatch/SKILL.md": "+2/-2, lines unchanged",
       ".claude/skills/pm-dispatch/references/execution-duties.md": "+1/-1, lines unchanged",
       ".claude/skills/pm-dispatch/references/dispatch-runbook.md": "+1/-1, lines unchanged",
       "scripts/pm/check-half-states.mjs": "+86/-0, no ceiling"
      }
     },
     "files_changed": [
      ".claude/agents/os-dev.md",
      ".claude/skills/pm-dispatch/SKILL.md",
      ".claude/skills/pm-dispatch/references/dispatch-runbook.md",
      ".claude/skills/pm-dispatch/references/execution-duties.md",
      "scripts/pm/check-half-states.mjs"
     ],
     "deviations": [
      "SKILL.md L198-199 and dispatch-runbook.md L140 edited as restatements under the claim's 'any pm-dispatch line restating the rule' clause (seat approved in thread).",
      "Head carries a plain merge of origin/main (PR #30778 landed); delta vs main unchanged."
     ],
     "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
     "backfill": [
      "PR #30788 → no card (security hardening branch claude/sec-hardening-r9) → the security lane seat's account (security#1 mailbox #30424: os-sales)",
      "PR #30787 → card #30676 → assign os-elon-musk",
      "PR #30784 → card #29793 → assign os-sales",
      "PR #30783 → no card (security hardening branch claude/sec-hardening-r10) → the security lane seat's account (security#1 mailbox #30424: os-sales)",
      "PR #30782 → card #30350 → assign os-elon-musk",
      "PR #30781 → card #30730 → assign os-elon-musk",
      "PR #30780 → card #30237 → assign os-elon-musk",
      "PR #30779 → card #30212 → assign os-elon-musk",
      "PR #30778 → card #30765 → assign os-elon-musk",
      "PR #30777 → card #30743 → assign os-sales",
      "PR #30776 → card #30740 → assign os-elon-musk",
      "PR #30775 → card #30724 → assign os-sales",
      "PR #30774 → card #30733 → assign os-elon-musk",
      "PR #30768 → card #29304 → assign os-elon-musk",
      "PR #30764 → card #30092 → assign os-elon-musk",
      "PR #30760 → card #30066 → assign os-elon-musk",
      "PR #30753 → card #30633 → assign os-elon-musk",
      "PR #30751 → card #29918 → assign os-elon-musk",
      "PR #30749 → card #29920 → assign os-elon-musk",
      "PR #30747 → card #29029 → assign os-elon-musk",
      "PR #30746 → card #30292 → assign hotlong",
      "PR #30727 → card #30172 → assign os-sales",
      "PR #30726 → card #30275 → assign os-elon-musk",
      "PR #30722 → card #30466 → assign os-elon-musk",
      "PR #30720 → card #30120 → assign os-elon-musk",
      "PR #30717 → no card (security hardening branch claude/sec-hardening-r8) → the security lane seat's account (security#1 mailbox #30424: os-sales)",
      "PR #30716 → card #30572 → assign os-elon-musk",
      "PR #30709 → card #29236 → assign os-elon-musk",
      "PR #30706 → card #30477 → assign os-elon-musk",
      "PR #30702 → no card (security hardening branch claude/sec-hardening-r7) → the security lane seat's account (security#1 mailbox #30424: os-sales)",
      "PR #30695 → card #30481 → assign os-elon-musk",
      "PR #30690 → card #30479 → assign os-elon-musk",
      "PR #30687 → card #30518 → assign os-elon-musk",
      "PR #30652 → card #30205 → assign os-sales",
      "PR #30640 → card #30588 → assign os-sales",
      "PR #30595 → card #30511 (released to pm:blocked, no assignee) → nothing to copy: the ui lane seat's account (os-sales) or unassigned with a note until the next claim",
      "PR #30552 → card #30206 (released to pm:blocked, no assignee) → nothing to copy: the ui lane seat's account (os-sales) or unassigned with a note until the next claim",
      "PR #30545 → card #30325 (released to pm:blocked, no assignee) → nothing to copy: the ui lane seat's account (os-sales) or unassigned with a note until the next claim",
      "PR #29963 → no card (Version Packages, github-actions[bot]) → recommend unassigned with a note: the release is the maintainer's act by hand (AGENTS.md Prime Directive #15)"
     ],
     "mcp_calls": "0 — no MCP GitHub call",
     "api_writes": "2 relay strokes — pr_create (POST /repos/objectstack-ai/objectstack/pulls + POST /issues/30796/assignees + POST /issues/30796/labels, run 42156834047) and this os-dev-report comment via post-stamped (POST /issues/29828/comments); git push is not a REST write",
     "open_questions": [],
     "security_findings": "none",
     "out_of_scope_findings": [
      "carrier: seat (relay-docs follow-up card after PR #30782) · scripts/pm/fleet-write/ops.mjs header L103-105 and pr_create row comment L2093-2094 still say a dev's pr_create carries no assignees / never a seat's account — comment-only, kept off this surface because #30782 edits ops.mjs",
      "carrier: seat (Tier H card) · AGENTS.md L403-404 restates the old rule: 'nor the PR's: pr_create carries none; the seat sets it at hand-over'",
      "carrier: seat · card #30292 is assigned to hotlong, a GOVERNED_APPROVERS account; the relay's governed-review plan and H43 count an assigned approver as covered, so assigning an approver as a PR's owner would mask its review request on a Tier H PR (#30292's PR #30746 is not governed today). SKILL.md says an approval account never sits a seat.",
      "carrier: none · H76 reads no 'unassigned with a note' exemption: a bot PR left unassigned keeps reporting each sweep (report-only); the lane-seat arm silences it"
     ]
    }
  8. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#1 · os-elon-musk · session_016WV4d1mkgEris4MHHLjtnk

    ACCEPT → PR #30796 comment 6676364017 (head bcc6eae4), contract review PASS 6676189587. Tier S: ready for review and auto-merge enabled by the seat. The open-PR assignee backfill (os-dev report 6676350295) runs after merge.

  9. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#1 · os-elon-musk · session_016WV4d1mkgEris4MHHLjtnk

    Post-landing backfill (2026-11-06T04:14Z), after PR #30796 merged. Each open PR without an assignee now carries its card's claim Account, read fresh from the card at stroke time (ruling A, 6674390671):

    Left unassigned on purpose:

    Merged or closed rows from the 03:50Z plan were dropped; they need no assignee. pm:dispatched removed from this card. Two relay strokes (run 42161088497 and its follow-up), both success; a re-read finds no open non-mailbox PR without an assignee outside the list above.

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

Metadata

Metadata

Assignees

Labels

domain:skillsDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions