Skip to content

docs(agents): a dispatched dev's pr_create carries the claim Account as PR assignee - #31307

Merged
os-zhuang merged 1 commit into
mainfrom
claude/project-thread-w09ywe
Nov 8, 2026
Merged

os-zhuang merged 1 commit into
mainfrom
claude/project-thread-w09ywe

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Irene · project thread

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.

维护者速读

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)

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

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

     // 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.ai/code/session_01J8VVAm38fJUP5TCBNAD8RY

…as PR assignee

AGENTS.md (Multi-agent, the dispatched executor) and the fleet-write relay's
pr_create commentary still said a dev's pr_create carries no assignee. Ruling A
(record 6674390671, landed by PR #30796) and .claude/agents/os-dev.md rule 2 put
the claim's Account: on the PR through pr_create; the card's assignee stays the
PM's and hand-over stays the seat's. Comments and prose only; AGENTS.md keeps
its line count.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J8VVAm38fJUP5TCBNAD8RY
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Nov 8, 2026
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation labels Nov 8, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#3 · huangyiirene · session_01J8VVAj7CvjkGXvgXzd6RZ7

Contract-review-claim: session_01J8VVAj7CvjkGXvgXzd6RZ7 · head b069bd2 · 2026-11-08T00:30Z

Full contract review of PR #31307 (#31190, claim 6714934662). The seat review runs at CONTRACT_REVIEW_TIER in an isolated subagent.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#3 · huangyiirene · session_01J8VVAj7CvjkGXvgXzd6RZ7

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: b069bd2984aa1e307f9cae38b6d13d659073f3c2
Local-runs: none
Scope: AGENTS.md + .claude/agents/os-dev.md (rule 2, L36-L38, and the write budget L63), .claude/skills/pm-dispatch/references/execution-duties.md (§ 认领, L69), .claude/skills/pm-dispatch/SKILL.md (hand-off step ③, L196-L199), .claude/skills/pm-dispatch/references/dispatch-runbook.md (L137-L141, the thread's writes), ruling A on #29828 (record 6674390671), PR #30796 (its five rule-text and patrol patches and its Acceptance notes), scripts/pm/fleet-write/ops.mjs (the pr_create descriptor and its header § The rows whose later requests read the first's answer and § The governed-review follow-up), scripts/pm/fleet-write/validate.mjs (the pr_create shape pins L1150-L1161, L1229-L1248), scripts/pm/fleet-write/execute.mjs (header § The assignees and labels legs and § The governed-review follow-up, the pr_create batteries), scripts/pm/check-skill-line-ratchet.mjs (CEILINGS row ['AGENTS.md', 1050] and the 120-byte line cap). All read at the head. The head is one commit (b069bd298) on merge base 7c523aa1. origin/main is 007fdb1a, and none of these files changed between the two. The rest of the diff, the comment-only edits in scripts/pm/fleet-write/ops.mjs, is the lane seat's ACCEPT at TIER_DEFAULT.

① Derived judgments

Inputs: card #31190 (body, triage 6710211939, the repo:cloud#1 note 6712025747, the claim 6714934662), the PR body, its file list (2 files, +6 / -5), the net diff against main at the head, and the head's check-runs. Nothing was built, run or re-run. Line widths were measured by reading git show output.

Check-runs, read 2026-11-08T00:31Z and again at 00:33Z: 43 runs. At 00:33Z: 14 success, 20 skipped, 9 in progress, none failed.

  • Green: Governed Surface Queue Guard, PR-body guards, Check Changeset, Check PR Size, Lint · docs & code guards, Lint · scoped · tooling self-tests, Lint · scoped · query-options erasure, both Type Check · debt ledger and · workspace.
  • Still running: Lint · repo & tooling gates, Lint · PM dispatch-gates, Lint · ESLint, Lint · CI, release & engine gates, Lint · scoped · slot lookup & corpus, Test Core (1/8) and (2/8), Type Check · consumer gates and · source gates.
  • The line ratchet (check:pm-skill-ratchet) and check:pm-governed-prose run inside Lint · repo & tooling gates (lint.yml L1056, L1512). That job is still running, so this record does not stand in for those gates.

Accept-set and public-surface changes:

  • AGENTS.md L403: what a dispatched executor is told about the PR's assignee. RIGHT.
    • Before, it said pr_create carries no assignee and the seat sets one at hand-over.
    • Now it says the PR's assignee is the claim's Account:, carried by pr_create, and hand-over belongs to the seat.
    • This is ruling A's first and second bullets.
    • The "⛔ never writes the card's assignee" half is kept, so the card's assignee stays the PM's (L399, step 1).
  • The relay's accept set. UNCHANGED, and RIGHT to stay unchanged.
    • OPS.pr_create.optional already lists assignees.
    • The assignees leg is a POST to the created pull's issue-assignees path, at the number the create answered (fromAnswer: 'number', judged against assigned).
    • validate.mjs L1150-L1155 and L1247-L1248 pin that shape. execute.mjs pins the leg's landing (battery at L1919) and pins that a bare pr_create adds no assignee and summons nobody (L2012).
    • So the rule now asks for a write the relay already carries. No code moves.
  • Public surface. None. No package, schema, export or CLI flag is touched.
  • Empirical cross-check. This PR follows its own rule. It was opened through the relay (objectstack-fleet[bot]) as a draft, with assignee huangyiirene (the claim's Account:) and no requested reviewer.

② Semver level

skip-changeset is right. The diff touches AGENTS.md and comments in scripts/pm/, and neither ships in any package. Check Changeset is green. Clause-②: no and Metadata-protocol: none are right: no platform behaviour or metadata moves. Both lines start their own line in the PR body and in the claim, and the body also carries Fixes #31190.

③ Boundary flags

  • Claim. Both paths are inside the claim's file surface: the AGENTS.md L403 parenthesis, and the two ops.mjs comment sites. No code changed. The claim allowed a reflow within the existing lines, but only L403 changed, and L404 is byte-identical. No breach.
  • Card asks. The card's two "Wanted" items are both done. The repo:cloud#1 note (6712025747) asked for the relay header to agree in the same PR, and it does.
  • Dev flags and open_questions. The card has no dev report yet, so there is no open_questions entry to answer. The PR body's five "Other sites found" are each checked below. None is open.
    1. ops.mjs inline comment: fixed here.
    2. execute.mjs "no assignee" at L1647 and L2012: still true (a bare pr_create adds none).
    3. check-half-states.mjs: already states the ruling.
    4. os-dev.md, execution-duties.md and SKILL.md: agree with the ruling.
    5. validate.mjs L1247: still true.
      My own grep over AGENTS.md, CLAUDE.md, .claude/**, scripts/pm/** and docs/agents/** for the old wording finds no other stale site.
  • Tier. AGENTS.md is Tier H. Landing needs an APPROVED review from os-zhuang or hotlong, as the body's 「需要你做的」 says. Governed Surface Queue Guard is green.
  • Model-tier waiver. The body states it under the maintainer's standing order of 2026-11-03 and names no model.
  • Gates still running (00:33Z): see ①. This PASS is on the tree. Landing still needs every check green or skipped as expected.

④ Design judgment

No must-fix. No should-fix. The one hits file holds against the ruling, the three rule texts and the relay.

  • Against ruling A (6674390671). Holds. The ruling's binding bullets are: the dev's pr_create carries the claim's Account, and a hand-over re-assigns the PR. The new parenthesis states the first ("the claim's Account:, carried by pr_create") and gives the second to the seat ("hand-over is the seat's"). The ruling's other two bullets are the backfill and H76. They are seat and patrol duties and rightly stay out of the executor paragraph.
  • Sentence by sentence against os-dev.md rule 2, L38 (「恒不写卡的 assignee…;PR 派认领 Account:(pr_create 带),交棒归席位」):
    • never writes the card's assignee = 恒不写卡的 assignee;
    • the PR's is the claim's Account: = PR 派认领 Account:;
    • carried by pr_create = pr_create 带;
    • hand-over is the seat's = 交棒归席位.
    • It is a one-to-one match, and it cites rule 2 on L404. L63 (「pr_create(draft,含 labels 与 assignees)」) agrees.
  • Against execution-duties.md L69 (「卡 assignee 归 PM,dev 恒不写;PR 派认领账号,交棒同笔改」). Agrees. "Same stroke" is a seat duty, and AGENTS.md says only that hand-over is the seat's. That is a subset, not a contradiction.
  • Against SKILL.md L198-L199 (「⛔ 永不请席位自身账号」, 「pr_create 派不请」). Agrees. The parenthesis says what pr_create assigns and is silent on requests. Nothing in AGENTS.md tells an executor to request a reviewer.
  • Against dispatch-runbook.md L138 and L140 (the thread does not assign or request after a harness-opened PR; it does not write the card's assignee). No conflict. AGENTS.md puts the assignee on the pr_create stroke itself, never on a later write.
  • Against the rest of AGENTS.md. I checked every assignee or assign line: L394-L399, L407, L409-L410, and "State on your PR that you did not set belongs to another actor". None contradicts it.
    • L407's "⛔ never reassign" and L409's release are about the card.
    • The PR assignee is now state the dev itself set on pr_create.
  • "Hand-over" has two readings. In ruling A it means a takeover or release. In SKILL.md ③, 交棒 means the review hand-off. Both are seat acts, so the sentence is true under either reading.
  • Line ratchet. AGENTS.md has 1050 lines at the head and on main, against CEILINGS ['AGENTS.md', 1050], so headroom stays 0 and nothing was raised.
    • L403 is now 112 bytes (it was 98). L404 is unchanged at 113. Both are under the 120-byte cap.
    • The widest line in the file is still the 768-byte table row, which has its own pin.
  • Remainder (ops.mjs, TIER_DEFAULT, read, not judged here). It states the same rule truthfully.
    • It correctly drops "never assigned to", because the seat's account can now be the claim's Account:. It keeps "never requested as a reviewer".
    • The dropped clause "the leg stays for the author-is-approver fallback" was dubious anyway. That fallback is pr_ready's governed-review assignee leg, or the seat's assign, not pr_create's leg.

Nits, all optional:

  • nit N1: the actor is implicit. "carried by pr_create" is passive, and the reader infers that the executor is the one who spells assignees. Rule 2, cited on the next line, says so. "carried by its pr_create" costs 4 bytes, and L403 would still be 116 bytes.
  • nit N2: AGENTS.md never defines the claim's Account: line. L395-L396 says a claim carries the session ID and the branch. The Account: line is defined in the pm-dispatch claim template and in execution-duties.md L68. The rule 2 pointer covers it.
  • nit N3, older than this PR and outside the claim: L394-L395 has a stale premise. "Every agent here shares one GitHub identity, so the assignee field is only a presence bit" now sits beside a rule that assigns each PR to its claim's account, and claims name distinct accounts (huangyiirene, marchtian, os-zhuang). The two are not logically inconsistent, but the premise is stale. It is a candidate for a separate card.

Implemented-by: claude/project-thread-w09ywe
Reviewed-by: session_01J8VVAj7CvjkGXvgXzd6RZ7

VERDICT: PASS

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#3 · huangyiirene · session_01J8VVAj7CvjkGXvgXzd6RZ7

维护者速读

席位核对 — ACCEPT · domain:skills#3 · head b069bd2984aa1e307f9cae38b6d13d659073f3c2

  1. 形态: draft → main,Fixes #31190;skip-changeset,Clause-②: no,Metadata-protocol: none;作者 objectstack-fleet[bot],assignee huangyiirene(认领 Account:,本 PR 即按新规则开);2 个文件,恰为认领面(认领 6714934662,含线程问询后放宽的 pr_create 描述符注释)。模型豁免句不点模型名。
  2. 前提实测: main 7c523aa1 上 AGENTS.md L403 写「pr_create carries none」,os-dev.md 规则 2 写「pr_create 带」;ops.mjs 头注释与描述符注释重复旧说法。
  3. 门禁(钉 head b069bd29): dispatch-gates 派生 40 条全部 exit 0(/mnt/project-files/card-31190/gates-b069bd29.txt);line ratchet exit 0(1050/1050);fleet-write 自测 dispatch 331 / validate 340 / execute 284 全过;trailers exit 0;check-runs 46 条全部完成:26 success、20 skip、0 失败;check-governed-merges --pr 31307:GOVERNED Tier H。复核:全量 6715117981 PASS,无 must-fix / should-fix。
  4. 接受的偏差: 无。nit N1(「its pr_create」)、N2(AGENTS.md 未定义 Account: 行)不改。
  5. 范围外去向: N3,AGENTS.md L394-L395「assignee 只是在场位」一句早于本 PR、在认领面外,留作后续视需要立卡;无新卡。
  6. 落地条款: Tier H。保持 draft;批准后由维护者翻 ready 入队,或按 landing-operations.md 由本席落地。

@objectstack-fleet objectstack-fleet Bot added the pm:awaiting-merge PR only: landing waits on the maintainer's own review and merge (SKILL.md 复核 ②); never on an issue label Nov 8, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review November 8, 2026 00:52
@os-zhuang
os-zhuang enabled auto-merge November 8, 2026 00:52
@os-zhuang
os-zhuang added this pull request to the merge queue Nov 8, 2026
Merged via the queue into main with commit 12ef21a Nov 8, 2026
52 checks passed
@os-zhuang
os-zhuang deleted the claude/project-thread-w09ywe branch November 8, 2026 01:55
@objectstack-fleet objectstack-fleet Bot removed the pm:awaiting-merge PR only: landing waits on the maintainer's own review and merge (SKILL.md 复核 ②); never on an issue label Nov 8, 2026
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

Development

Successfully merging this pull request may close these issues.

AGENTS.md still says a dev's pr_create carries no assignee; os-dev.md and pm-dispatch (ruling A on #29828, PR #30796) put the claim Account on it

3 participants