Skip to content

docs(pm-dispatch): runbook patrol names the per-seat patrol and dedupes review claims by seat - #28759

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-28740-runbook-patrol-per-seat
Nov 1, 2026
Merged

os-zhuang merged 1 commit into
mainfrom
claude/issue-28740-runbook-patrol-per-seat

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by 田騏 · project thread
Fixes #28740
Clause-②: no
Metadata-protocol: none

维护者速读

  • 改了什么:派发手册〈巡查常设项〉三行措辞:标题与跨账户复审行由「每项目巡查」改为「每席巡查」,复核认领去重从「他账户」改为「他席(同账户亦然)」。
  • 为什么改:技能其余处已是「每席一个巡查」;旧去重按账户判,同一账户在同项目坐多席时两席都会放行,可能对同一 PR 重复复核。
  • 风险与回滚:纯文面改动,不动脚本与门禁;「剔除本账户署名的 PR」这条复核独立性规则保持按账户不变。回滚即还原这一个提交。
  • 先看:.claude/skills/pm-dispatch/references/dispatch-runbook.md 第 45 行(去重键从账户改为席位)。
  • 两分钟验证:git grep 每项目巡查 -- .claude 应零命中;pnpm check:pm-skill-ratchet 应通过(净行数 0)。
  • 需要你做的:审阅并批准本 PR(规则文本改动以维护者批准为裁决),之后由席位落地。

What changes

.claude/skills/pm-dispatch/references/dispatch-runbook.md, section 巡查常设项, three lines (3 insertions, 3 deletions, net 0):

  • L39 heading: 「每项目巡查与总监席摘要」 becomes 「每席巡查与总监席摘要」.
  • L44 cross-account review line: 「每项目巡查跑」 becomes 「每席巡查跑」. Its exclusion 「剔除本账户署名的 PR」 is the review-independence rule and stays keyed to the account.
  • L45 review-claim dedupe: 「已有他账户的认领即跳过」 becomes 「已有他席认领即跳过(同账户亦然)」, so a PR already claimed by another seat is skipped even when that seat sits on the same account. The Claim: form (会话、账户) is unchanged; no new field.

Tests

Prose-only change to a governed skill reference; no code, no package, no test surface. skip-changeset: nothing publishes.

Acceptance notes

  • Byte widths after the edit: L39 50 B, L44 108 B, L45 119 B, all within the 120-byte cap (check-skill-line-ratchet.mjs). The first L45 spelling measured 122 B and was shortened by dropping one particle.
  • git grep 每项目巡查 over the whole tree: 0 hits after the edit. The only other mention of the section, lanes/director.md L74, cites it as 巡查常设项 and still resolves.
  • Read against contract-review.md and seat-lifecycle.md: neither keys reviewer independence or the review-claim dedupe differently; cross-repo-coordination.md already uses 他席 for another seat's claim.

Verification

Local gate subset at head 640da54552, derived by node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, every exit code captured before any pipe.

17 derived families + 3 named by the order, all exit 0
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/pm/check-harness-current.mjs --self-test :: exit 0
pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0 (first run exit 3, prerequisite not built; rerun after building formula + lint)
pnpm check:agent-test-spelling :: 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:gitlink-declared :: exit 0
pnpm check:nul-bytes :: exit 0
pnpm check:pm-governed-merges :: exit 0
pnpm check:pm-skill-id-lint :: exit 0
pnpm check:pm-skill-ratchet :: exit 0
pnpm check:refd-timer-probe :: exit 0
pnpm check:skill-frame-sync :: exit 0
pnpm check:watch-hint-literal :: exit 0
pnpm check:pm-governed-prose :: exit 0
pnpm check:pm-settings-deny-roster :: exit 0
node scripts/check-skills-token-ratchet.mjs :: exit 0

--ran reconciliation: 17 derived, 17 run, 0 NOT-MEASURED, 0 UNRUN (a derived zero: all 17 carry an exit code).

🤖 Generated with Claude Code

…es review claims by seat

The 巡查常设项 heading and the cross-account review line now say 每席巡查, matching
the one-patrol-per-seat rule elsewhere in the skill. The review-claim dedupe skips
a PR already claimed by another seat, same account included, so two seats of one
account no longer both pass it. The own-account exclusion on the review line stays
account-keyed. Net line count 0; every edited line is within the 120-byte cap.

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

Copy link
Copy Markdown
Contributor Author

domain:skills#2 · marchtian · session_017ihL2g7RyXa8ErM6GAkHyc

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 640da545520f11f7da2eef68839b7048ad61922b
Local-runs: none
Scope: .claude/skills/pm-dispatch/references/dispatch-runbook.md + .claude/skills/pm-dispatch/SKILL.md (L72, L303–309), references/seat-lifecycle.md (L8–13, L29, L41), references/contract-review.md (L20–28, L43–46, L56–60), references/cross-repo-coordination.md (L13–14), references/lanes/director.md (L7, L23, L74), scripts/pm/record-recognisers.mjs (CONTRACT_REVIEW_CLAIM_TEMPLATE, readContractReviewClaim), scripts/pm/check-owed-reviews.mjs (header, WAITING_LABEL), scripts/pm/post-stamped.mjs (signature contract, L471) — all read, none reviewed.

Inputs: card #28740 body and its three comments (triage 6561015247, claim 6561613036, dev report 6561774263); PR #28759 body, file list (one file, +3/−3) and the net diff against main at the head; the check-runs on the head. Remainder of the diff outside hits: none — the whole diff is the rules face.

① Derived judgments

  • Accept set / public surface: none changes. One file under .claude/**; no package, exports, schema, CLI or docs path in the committed tree. Right.
  • Face: reviewFace hits = the runbook (governed path) ⇒ rules face, CONTRACT_REVIEW_TIER. Tier S by the register; triage's Tier H plus maintainer approval as the ruling for a rule-text change is the stricter path the claim took. Right.
  • Line ratchet: 245 → 245 lines (read from both trees), net 0; byte widths of the three changed lines read from the head tree 50 / 108 / 119 B, cap 120. Right.
  • 每项目巡查: zero hits over the whole tree at the head (git grep on the branch). Right.
  • lanes/director.md L74 cites the section by its name 巡查常设项, which the heading keeps; the parenthetical only changed. Still resolves. Right.
  • Gates: the head's check-runs read at 2026-11-01T18:14Z — see the line below ④; every derived family on the head concluded success, none failure, none pending at the read; the remaining runs are skipped (no product path touched, so core/UI/docs/E2E/changeset/size shards do not fire).

② Semver level

skip-changeset label on the PR, Clause-②: no, Metadata-protocol: none on the body — matches the diff: nothing publishes, no metadata an author writes changes. Right.

③ Boundary flags

  • open_questions Q1 (add the seat number to the claim form?) — A, leave it. The seat is already machine-readable on every seat-written comment: post-stamped.mjs refuses any body that does not open with LANE#N · ACCOUNT · SESSION, and every first-line reader in record-recognisers.mjs / check-half-states.mjs strips exactly one such signature line before reading the key line. A new field is out of this card's wording-only scope and would be a second spelling of a fact the signature already carries. (The card-claim template in SKILL.md L309 even has Seat: for cards; the review claim has a different line — see ④ should-fix 1.)
  • Dev deviation 1 (PR body ends with the generated-with line, not the session-URL footer): accepted, not escalated — the body carries the project-thread link and the fleet attribution; no gate or recogniser reads the footer.
  • Dev deviation 2 (attribution HTML comment as the body's first line): the harness/seat attribution exception; fine.
  • Author: PR user.login is objectstack-fleet[bot] ⇒ no author note owed.
  • Dev report said CI was in progress and not awaited: answered by the gate reading in ① — all concluded, none red.

④ Design judgment

.claude/skills/pm-dispatch/references/dispatch-runbook.md 〈巡查常设项〉, judged against the per-seat patrol it teaches and the double-review scenario the card accepts it against (one account sitting spec#4, devx#2 and skills#2 in one project).

  • L39 heading 「每席巡查与总监席摘要」 — holds. SKILL.md L72 (每席一个自建自绑巡查 routine,总监席除外) and seat-lifecycle.md L41 (坐席同笔建自绑巡查 routine) are per seat; the director has no routine (director.md L7, L23), so 每席巡查 reads as every non-director seat while the director's items in the same section stay under 总监席摘要. Consistent.
  • L44 「每席巡查跑 …,剔除本账户署名的 PR」 — holds, and keeping the self-exclusion account-keyed is right: (a) a PR's 署名 is its attribution login (claude-projects-attribution / Requested by), there is no seat number on a PR to key on; (b) this item is the 跨账户 backstop, not the owed review — the owed review of a same-account PR stays with its dispatching seat in-seat (contract-review.md L20, L26–28 车道胜) and, failing that, with triage under (a)(b)(c), a different account — so excluding sibling seats of one account opens no coverage gap; (c) it is stricter than, not contrary to, the agent-level independence contract-review.md L45–46 requires of the record pair. I tried the opposite reading (seat-keyed exclusion, letting devx#2 patrol-review skills#2's PR): permitted by L46 but it buys nothing the lane seat's own in-seat review does not already give, and it would need a seat on the PR that is not there.
  • L45 「已有他席认领即跳过(同账户亦然)」 — holds. This is exactly the hole the card names: under 他账户, two seats of one account both passed the dedupe. 他席 is the vocabulary cross-repo-coordination.md L13–14 already uses for another seat's claim, and the seat is read off the enforced signature line, so no new field is needed. Net 0, no gate touched.

Findings (none must-fix):

  • should-fix 1 — L45 still names the review claim as a Claim: 形评论(会话、账户), i.e. the card-claim form (SKILL.md L303). The review claim contract-review.md L26–28 defines, and record-recognisers.mjs pins verbatim (Contract-review-claim: session · head full sha · UTC, lapses on a moved head or after 2 h, lane wins a tie), is a different line: readContractReviewClaim returns missing for a Claim: comment, so check-owed-reviews.mjs prints claim: none and a reviewer following contract-review.md does not see the runbook-form claim — the ⛔ 不双做 then rests on prose reading alone. The key also differs at the edge: 他席 lets a new session of the same seat proceed, contract-review.md L26 says any live claim ⇒ do not start (runbook L46 defers to it). Pre-existing on main, not introduced or widened by this diff, and outside the card's three wordings — so not a FAIL here; the line should point at contract-review.md's claim line and lapse, keeping 「他席(同账户亦然)」 as the read of that line's signature. Worth a card on the skills lane, net 0.
  • should-fix 2 — L44's read is the label search alone (label:needs:contract-review), while contract-review.md L25 names check-owed-reviews.mjs as the owed list (faces owed without the label, hand-off lines, holds, lapsed claims). A patrol that only searches the label misses a face-owed PR nobody labelled. Pre-existing, unchanged here; fold into the same card.

Gate read (head check-runs, 2026-11-01T18:14Z): Lint · PM dispatch-gates, Lint · docs & code guards, Lint · CI, release & engine gates, Lint · repo & tooling gates, Lint · ESLint, Type Check · source gates, Type Check · debt ledger, Type Check · consumer gates, Type Check · workspace, Governed Surface Queue Guard, PR-body guards, Lint & Repo Gates and the other derived runs — 23 runs completed / success; 22 runs skipped by path; 0 failure, 0 pending.

Implemented-by: claude/issue-28740-runbook-patrol-per-seat
Reviewed-by: session_017ihL2g7RyXa8ErM6GAkHyc

VERDICT: PASS

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#2 · marchtian · session_017ihL2g7RyXa8ErM6GAkHyc

维护者速读(席位终稿 · head 640da545520f11f7da2eef68839b7048ad61922b)

席位意见:ACCEPT.

席位核对

@objectstack-fleet objectstack-fleet Bot added the needs-user-decision Blocked on a maintainer decision — do not dispatch; decision cards only, never on a PR label Nov 1, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review November 1, 2026 20:49
@os-zhuang
os-zhuang enabled auto-merge November 1, 2026 20:49
@objectstack-fleet objectstack-fleet Bot removed the needs-user-decision Blocked on a maintainer decision — do not dispatch; decision cards only, never on a PR label Nov 1, 2026
@os-zhuang
os-zhuang added this pull request to the merge queue Nov 1, 2026
Merged via the queue into main with commit 516119d Nov 1, 2026
54 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-28740-runbook-patrol-per-seat branch November 1, 2026 21:06
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/xs 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.

pm-dispatch(runbook): 〈巡查常设项〉 still names the patrol per project, and its cross-account review dedupe is keyed to the account

2 participants