Skip to content

Commit 12ef21a

Browse files
docs(agents): a dispatched dev's pr_create carries the claim Account as PR assignee (#31307)
<!-- claude-projects-attribution: {"github_login":"huangyiirene"} --> _Requested by **Irene** · [project thread](https://claude.ai/code/project/chan_01TJXtQ1tVD26ecLDZxFS67x?thread=cmsg_01TJXtQ1tVD26ecLDZxFS67xVQzeHAefCAj1LT1qxPYafJ)_ Fixes #31190 Clause-②: no Metadata-protocol: none `dispatch-gates --tier` reads no path-derived model mandate for this diff. Any mandate above the thread's would be waived by the maintainer's standing order in this project (2026-11-03). This card ran on the project's default model, and the dispatching seat (domain:skills#3) runs the contract review. ## 维护者速读 - 改了什么:`AGENTS.md` L403 的括注改成「PR 的 assignee 是认领的 `Account:`,由 `pr_create` 带上;交棒归席位」,保留「⛔ 永不写卡的 assignee」半句;`scripts/pm/fleet-write/ops.mjs` 头注释与 `pr_create` 描述符上的内联注释同步改正,只改注释,不动代码。 - 为什么改:裁决 A(#29828,记录 6674390671,经 PR #30796 落地)与 `.claude/agents/os-dev.md` 第 2 条规定 dev 的 `pr_create` 给 PR 指派认领账号;`AGENTS.md` 仍写「`pr_create` 不带 assignee」,而它声称冲突时优先,已有派发的 dev 因此停工或开出无 assignee 的 PR(#31190)。 - 风险与回滚:纯文字;`AGENTS.md` 保持 1050 / 1050 行(无上限上调),只在原两行内重排,两行均在 120 字节内;`ops.mjs` 头注释多一行;不发版(`skip-changeset`);回滚即 revert。 - 先看:`AGENTS.md` L403-L404;然后 `scripts/pm/fleet-write/ops.mjs` L125-L128 与 L2126。 - 两分钟验证:`node scripts/pm/check-skill-line-ratchet.mjs`(AGENTS.md 1050 行,余量 0,无超宽行);对照 `.claude/agents/os-dev.md` L38 与 L63 读新句;`node scripts/pm/fleet-write/execute.mjs --self-test` 全绿。 - 需要你做的:`check-governed-merges` 判为 Tier H(`AGENTS.md`),需 `os-zhuang` 或 `hotlong` 批准;请在席位契约复核 ACCEPT 后再批。 ## What changed (ruling A on #29828, record 6674390671, landed by PR #30796) The ruling's home is `.claude/agents/os-dev.md` rule 2: "PR 派认领 `Account:`(`pr_create` 带),交棒归席位" (L38) and the write budget "`pr_create`(draft,含 labels 与 assignees)" (L63). `.claude/skills/pm-dispatch/references/execution-duties.md` L69 and pm-dispatch `SKILL.md` agree. None of those files is touched. ### `AGENTS.md` L403-L404 (Multi-agent, the dispatched executor) ```diff -writes the card's assignee (nor the PR's: `pr_create` carries none; the seat sets it at hand-over, +writes the card's assignee (the PR's is the claim's `Account:`, carried by `pr_create`; hand-over is the seat's, `.claude/agents/os-dev.md` rule 2) and ⛔ never yields a card it was dispatched to. Before writing code, re-read ``` The "⛔ never writes the card's assignee" half is kept. Line count unchanged (1050 / 1050). L403 is 112 bytes and L404 is 113 bytes, both under the ratchet's 120-byte line budget. ### `scripts/pm/fleet-write/ops.mjs` header, § The governed-review follow-up (L125-L128) ```diff - * nothing reads the pull's files there, and a dev's `pr_create` carries no - * `assignees` at all — the seat's own account is never assigned to or - * requested on a pull. The one follow-up left is `pr_ready`. The platform + * nothing reads the pull's files there, and a dev's `pr_create` carries the + * claim's `Account:` as its `assignees` (ruling A on #29828, os-dev.md rule 2; + * hand-over is the seat's) — the seat's own account is never requested on a + * pull as a reviewer. The one follow-up left is `pr_ready`. The platform ``` Kept as still true: the draft open summons nobody (no file read, no review request, no governed-review follow-up), and the seat never REQUESTS its own account as a reviewer (pm-dispatch `SKILL.md` L198, "⛔ 永不请席位自身账号"). Only the assignee half is corrected. ### `scripts/pm/fleet-write/ops.mjs` inline comment on the `pr_create` descriptor (L2126) The seat widened the claim to this site (claim 6714934662). ```diff // sees the pull at the seat's hand-off — `pr_request_reviewers` after ACCEPT + a same-head PASS — and a dev's - // create carries no `assignees`; the leg stays for the author-is-approver fallback, never for a seat's account. + // create carries the claim's `Account:` as `assignees` (ruling A on #29828); never a reviewer request on the seat. ``` No code changes. The descriptor already takes `assignees` as optional and sends the leg to the number the create answered. ## Other sites found Grep over `AGENTS.md`, `scripts/pm/**` and `.claude/**` for a sentence saying a dev's `pr_create` carries no assignee, or that a PR is never assigned the claim's account: 1. `scripts/pm/fleet-write/ops.mjs` L2124-L2125 (now L2126): the same stale claim. Fixed in this PR on the seat's widening. 2. `scripts/pm/fleet-write/execute.mjs` L1647 and L2012 ("no assignee"): these pin that the governed-review follow-up adds no assignee on a draft create when the caller spelled none. Still true. Checked and consistent, no action. 3. `scripts/pm/check-half-states.mjs` L15733 and L15763: already state the ruling (the dev's `pr_create` carries the claim's `Account:`, record 6674390671). Checked and consistent. 4. `.claude/agents/os-dev.md` L38 and L63, `.claude/skills/pm-dispatch/references/execution-duties.md` L69, pm-dispatch `SKILL.md`: agree with the ruling. Checked and consistent, untouched. 5. `scripts/pm/fleet-write/validate.mjs` L1247 pins that a `pr_create` without assignees or labels is one request. It describes the relay's behaviour, not who passes assignees. Consistent. ## Gates On head `b069bd29` (base `7c523aa1`): all 40 `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` commands exit 0. Also: `node scripts/pm/check-skill-line-ratchet.mjs` (exit 0, AGENTS.md 1050 / 1050), `node scripts/pm/fleet-write/dispatch.mjs --self-test` (exit 0, 331 cases), `validate.mjs --self-test` (exit 0, 340 cases), `execute.mjs --self-test` (exit 0, 284 cases), `node scripts/check-commit-card-trailers.mjs --range origin/main..HEAD` (exit 0). Changed lines: 11 (+6 / -5), 2 files. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01J8VVAm38fJUP5TCBNAD8RY Co-authored-by: Claude <noreply@anthropic.com>
1 parent 5277855 commit 12ef21a

2 files changed

Lines changed: 6 additions & 5 deletions

File tree

‎AGENTS.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -400,7 +400,7 @@ a PM dispatch sets the assignee (step 1) and posts the `Claim:` naming the dev's
400400
both on the dev's behalf. A dispatched executor inherits both records: it verifies that the
401401
newest `Claim:` names its branch (on a mismatch it stops and reports), posts no second claim —
402402
the dispatch's `Claim:` is its identity and its own record is the report comment — and it ⛔ never
403-
writes the card's assignee (nor the PR's: `pr_create` carries none; the seat sets it at hand-over,
403+
writes the card's assignee (the PR's is the claim's `Account:`, carried by `pr_create`; hand-over is the seat's,
404404
`.claude/agents/os-dev.md` rule 2) and ⛔ never yields a card it was dispatched to. Before writing code, re-read
405405
the comments — the comments decide, not the field: a `Claim:` from another session or branch
406406
(other than the dispatch that sent you) means taken whatever the field says — pick another or

‎scripts/pm/fleet-write/ops.mjs‎

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,10 @@
122122
* author (pm-dispatch SKILL.md, ACCEPT 之后的路径分叉 ③). The maintainer,
123123
* verbatim: 「应该是开发完了你审核通过才会推送给我审核」. So the draft open
124124
* summons nobody: a `pr_create` is the create plus the legs the caller spelled,
125-
* nothing reads the pull's files there, and a dev's `pr_create` carries no
126-
* `assignees` at all — the seat's own account is never assigned to or
127-
* requested on a pull. The one follow-up left is `pr_ready`. The platform
125+
* nothing reads the pull's files there, and a dev's `pr_create` carries the
126+
* claim's `Account:` as its `assignees` (ruling A on #29828, os-dev.md rule 2;
127+
* hand-over is the seat's) — the seat's own account is never requested on a
128+
* pull as a reviewer. The one follow-up left is `pr_ready`. The platform
128129
* summons a code owner only when a pull is opened READY or marked ready for
129130
* review — measured on this repository's own Tier H pulls, the CODEOWNERS
130131
* request arrived at `ready_for_review` and never at the draft create — and a
@@ -2122,7 +2123,7 @@ export const OPS = Object.freeze({
21222123
optional: Object.freeze(['body', 'assignees', 'labels']),
21232124
// ⛔ No `governedReview` here (header: "The governed-review follow-up"): the draft open summons nobody. A human
21242125
// sees the pull at the seat's hand-off — `pr_request_reviewers` after ACCEPT + a same-head PASS — and a dev's
2125-
// create carries no `assignees`; the leg stays for the author-is-approver fallback, never for a seat's account.
2126+
// create carries the claim's `Account:` as `assignees` (ruling A on #29828); never a reviewer request on the seat.
21262127
// `draft: true` is FORCED — a seat cannot open a ready PR through the relay.
21272128
requests: (a, repo) => [
21282129
{ verb: 'POST', path: `/repos/${repo}/pulls`, body: { title: a.title, head: a.head, base: a.base, ...('body' in a ? { body: a.body } : {}), draft: true } },

0 commit comments

Comments
 (0)