Skip to content

docs(pm-dispatch): a dispatched PR carries its card's assignee — set at pr_create, moved on takeover - #20066

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-20063-pr-assignee-mirrors-card
Sep 25, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-20063-pr-assignee-mirrors-card

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #20063
Clause-②: no

What this lands

Rule text only (the ruling: 「同意」 on the seat's recommendation quoted in the card) — no gate, no patrol row, no new tool.

  • .claude/skills/pm-dispatch/references/execution-duties.md, section 认领: the card assignee stays the PM's and the dev never writes it; the PR assignee equals the card's; the dev sets it in the same round as pr_create with label-write.mjs --issue PR_NUMBER --assign LOGIN; a seat's own PR is assigned to the seat; the takeover's step ② moves it in the same stroke; the reader is the filter is:pr is:open assignee:LOGIN.
  • .claude/agents/os-dev.md, rule 2: "never write the assignee" narrowed to the card's assignee, with the PR spelling beside it; the write-budget line names the PR-assignee write as part of the label-write slot it already had. The objectui clause (path labels belong to labeler.yml) is unchanged.

The measured spelling comes from the card's pilot: objectstack-ai/objectui PRs 10410, 10412 and 10413 carry the cards' assignee, set through the relay's assign op on a PR number.

Line budget (pnpm check:pm-skill-ratchet, both files at headroom 0)

file before after paid by
execution-duties.md 183 183 deleted, not re-wrapped: the clause 「原子对 step 1 设」 (line 60 of the same file states step ①), the clause 「跨账号 assignee 不是你 ⇒ 永不碰」 (SKILL.md's card-state row 「assignee 已设 … 不是你的就永不碰」 states it for every seat), and the line 「dev 每个可编译小步即 push …」 (a dev obligation that os-dev.md already carries as 「每个可编译小步即 commit + push … 接管只认远程分支最后 sha」)
os-dev.md 402 402 in-place rewrite of three existing lines, no line added

Every changed line is at most 120 bytes (the same gate's width rule). The takeover line (step ②, 118 bytes) had no room for the increment, so the takeover half of the rule is stated on the rewritten assignee line as 「接管 ② 同笔换」.

The line 「释放是显式动作 …」 was a first candidate for payment (state-machine.md repeats it) and was deliberately kept: scripts/pm/check-half-states.mjs quotes that exact line as the protocol's own words (RELEASE_ACT_RULE), so removing its source would make that quotation unanswerable.

Sweep: git grep -n assignee -- .claude AGENTS.md (at 6364f11)

hit decision
.claude/agents/os-dev.md :34, :36 (rule 2), :54 (write budget) changed
execution-duties.md :56 (assignee owner) changed, plus one new line after it
execution-duties.md :17, :55, :57, :58, :61, :78, :129 already consistent: each speaks of the card; :78 (takeover ②) is covered by the new 「接管 ② 同笔换」 clause
SKILL.md :29, :91, :92, :103, :104, :105, :143 already consistent: card-state table and state channels; :92 lists assignee as a use of the user account, which the PR assignee also is
SKILL.md :294 (check-half-states.mjs row) out of scope: the ruling adds no patrol row, so a PR without an assignee is not a half state
dispatch-runbook.md :50 out of scope: the seat post's assignee, not a card's
dispatch-runbook.md :155 already consistent: a continued claim moves nothing, card or PR
filing-gate.md :33, lanes/director.md :42, lanes/hotcrm.md :50 already consistent (card claim / scan / filed unassigned)
lanes/ui.md :23 already consistent: objectui assignee writes go through label-write.mjs --repo, which is exactly the PR-assignee route
platform-readings.md :135, :178, :179, :230, :240, :241, :246, :250 already consistent: platform readings; :250 (assignability is a repo + account property) is the precondition the pilot met
rest-channel.md :30, :45 already consistent: the channel table (POST …/issues/{n}/assignees is the same endpoint on a PR number)
seat-lifecycle.md :27, seat-post-protocol.md :11 out of scope: the seat post's assignee
state-machine.md :41 already consistent: the release act, card-scoped
triage-duties.md :71, :72, :83, :84 already consistent: card triage; :84 names label-write.mjs as the only assignee writer, which the new rule uses
AGENTS.md :398–:414 Tier H, not touched here. Its sentence "it ⛔ never writes the assignee" reads, in its paragraph, as the card's; a suggested wording for a separate maintainer-merged edit is in the report on the card

Gates (all at head 6364f11)

node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran → ✓ dispatch-gates --ran: 20 derived famil(ies) accounted for — 20 run, 0 NOT-MEASURED (a DERIVED zero — all 20 recorded an exit code and none of them is 3).

All twenty exit 0, among them check:pm-skill-ratchet (✓ check-skill-line-ratchet: declared cross-file moves: 2, total ceilings down 477 lines.), check:pm-skill-id-lint (✓ check-skill-id-lint: 34 file(s) clean), check:skill-frame-sync, check:doc-authoring, check:agent-model-declared, check:pm-governed-merges, check:nul-bytes, check:commit-card-trailers. check:doc-formula-expressions first exited 3 (a prerequisite not met: @objectstack/formula and @objectstack/lint were not built, so nothing was measured); it exited 0 after that build. Also run beyond the derivation: check:pm-settings-deny-roster and check:pm-governed-prose, both 0.

node scripts/pm/check-governed-merges.mjs --test on the two paths: GOVERNED — Tier S (both under .claude/**). This PR lands after an in-seat contract review at CONTRACT_REVIEW_TIER, then goes through the queue. Nothing here is published (.claude/**), so it takes skip-changeset.

Acceptance notes

  • A release of a card that still has an open PR (the card leaves ownership and nobody takes it over) is not covered by the ruling, so the PR assignee is left as it is. Only the takeover moves it.
  • os-dev.md's objectui clause (「派发词未点名即零写」) is about labels; the PR-assignee write is set by rule 2 and the write-budget line, not by that clause.

维护者速读(草稿)

  • 改了什么:派发出的 PR 现在带卡的 assignee(派发席的关联用户账号)。dev 开 PR 后同一轮用 label-write 设置;接管卡时 PR 的 assignee 跟卡一起换人;席位自己开的 PR 指派给席位自己。改动只有两个规则文件里的几句话。
  • 为什么改:所有 PR 都由车队 bot 提交,看不出是谁在处理。按 assignee 过滤(is:pr is:open assignee:LOGIN)就能看到每个人名下在飞的 PR。维护者已裁决「同意」。
  • 风险与代价(含回滚):两个文件行数不变。为腾出一行,删掉了三处在别的文件已写过的重复规则。没有新增门禁或巡查,所以漏设 assignee 的 PR 不会被自动发现。回滚方式:revert 本 PR。
  • 席位意见:
  • 你要做的:无需操作。本 PR 属 Tier S,由席位做达档复核后自行落地。AGENTS.md(Tier H)里 "never writes the assignee" 那句是否要写明「卡的」,由卡上的报告给出建议措辞,供你决定。

Generated by Claude Code

…at pr_create, moved on takeover

execution-duties.md (认领): the card assignee stays the PM's; the PR assignee
equals the card's, the dev sets it in the same round as pr_create through
label-write, a seat's own PR is assigned to the seat, the takeover's step two
moves it in the same stroke, and the reader is `is:pr is:open assignee:LOGIN`.
Paid in place: two clauses already stated elsewhere (the atomic pair's step one,
SKILL.md's never-touch-another's-assignee row) and the push-every-step line
that os-dev.md already carries as the dev's own rule.

os-dev.md: rule 2 narrows "never write the assignee" to the CARD's, and the
write budget's label-write slot names the PR-assignee write.

Claude-Session: https://claude.ai/code/session_01LNRg6FUMXYWgkAbDsfZpC8
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation labels Sep 25, 2026
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 25, 2026
@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review September 25, 2026 01:43
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Sep 25, 2026
Merged via the queue into main with commit 9b8c74c Sep 25, 2026
31 of 32 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-20063-pr-assignee-mirrors-card branch September 25, 2026 02:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants