Repository navigation
docs(pm-dispatch): a seat reads requested_reviewers itself before a Tier H handoff; the per-author request rule is spelled out - #25784
objectstack-fleet[bot] wants to merge 2 commits into
Conversation
…ier H handoff; the per-author request rule is spelled out The relay requests the governed approvers only on its own pr_create / pr_ready. A Tier H PR opened directly by an account has no run row, so a seat that checks only that row never sees the gap. The seat now reads requested_reviewers / assignees on every Tier H PR before the speed-read and fills any gap with the relay's pr_request_reviewers. The per-author rule governedReviewPlan performs is stated: an author who is an approver is assigned and the others are requested; any other author gets every approver; the speed-read asks only a non-author approver to approve. Net 0 lines (ceiling 319). The dropped line's three clauses survive in platform-readings.md (undraft through the relay op, MCP fallback refused) and rest-channel.md (op spellings). Refs #25782 Claude-Session: https://claude.ai/code/session_01FiwXn7nJjWeZrtvzYraPVj Co-authored-by: Claude <noreply@anthropic.com>
…sign op The contract review of this PR noted that an approver-authored PR opened outside the relay may also lack the author's assignment, which pr_request_reviewers cannot write. Line 201 names the relay op assign beside it. 116 bytes, net 0 lines. Refs #25782 Claude-Session: https://claude.ai/code/session_01FiwXn7nJjWeZrtvzYraPVj Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: Inputs read: card #25782 body and its one comment (the implementation offer at 10:42:57, ⛔ not a claim; no rulings, no earlier records), PR #25784 body as it stands at 10:48:33, its file list (one file, +4 −4, two commits), the net diff of ① Derived judgmentsThe net diff against
Survival of the four removed lines (the ratchet's 「砍点逐条核幸存」), clause by clause — unchanged from the previous head:
Card acceptance: the backstop (:200–201), the per-author rule (:199) and the speed-read naming a non-author approver (:199) are present; the per-author rule is exactly Ambiguities a seat could misread, none blocking: 「它」 (2), 「未请/派/审者」 (a compression of 未请审/未指派/未评审者, recoverable from the old text and the code's Measures read off the tree, not run: SKILL.md at PR body versus tree: the body's "After:" block still shows :201 WITHOUT Check-runs on the head as read (23 runs, started 10:48:37–10:48:39): completed success — No other open PR may claim the same issue. In progress — Lint · repo and tooling gates (hosts the ② Semver levelNo package publishes: the diff is one file under ③ Boundary flags
Implemented-by: VERDICT: PASS Independence: this record was rendered by an isolated reviewer subagent at the tier, briefed only with the card, the PR and the head's check-runs, and is adopted by the implementing session named above. That session holds no Generated by Claude Code |
Requested by Sam · project thread
Refs #25782 (not
Fixesyet: the card has no claim. Thedomain:skillsseat that claims it names this branch in itsClaim:and switches this line toFixes.)Clause-②: no
Metadata-protocol: none
What changes
.claude/skills/pm-dispatch/SKILL.md, section 〈路径分叉〉, rule ③ (lines 198–201 onorigin/mainf0cf3383). Four lines rewritten in place, net 0 lines.Before:
After:
requested_reviewersandassigneesbefore the speed-read, instead of only the run row; a PR opened outside the relay has no run row by construction. Gaps are filled with the relay opspr_request_reviewers(a missing request) andassign(an approver-author missing its assignment; added on the contract review's note), and the off-relay author is named in the ACCEPT and the round report. This extendscontract-review.md's 「另记作者」 note from contract reviews to every Tier H handoff.governedReviewPlan(scripts/pm/fleet-write/execute.mjs:430) computes: covered = requested ∪ assigned ∪ submitted-review;toRequest= uncovered approvers minus the author;toAssign= the author when it is an uncovered approver; a non-approver author (the fleet bot, any other login) gets every uncovered approver requested. Its self-test rows atexecute.mjs:1387–1390pin the same cases.Deviation: prose, not the card's table
The card asks for the rule "as a table". It is written as one prose line instead, because:
SKILL.mdis at its 319-line ceiling (check-skill-line-ratchet.mjs), and a four-row table costs six lines. A raise needs a ruling of record that orders the text; none exists for this card.references/*.mdthat could host it carries aMAX_TABLE_ROW_BYTESpin of 0, which also needs a maintainer ruling to raise.project-forms.mdkeeps rules in role words and logins out of rules text; the rule in role words covers all four of the card's rows. For reference, with today'sGOVERNED_APPROVERS(os-zhuang,hotlong) it reads:objectstack-fleet[bot]os-zhuang,hotlongos-zhuanghotlongos-zhuanghotlonghotlongos-zhuanghotlongos-zhuangos-zhuang,hotlongA direct human merge stays open in every row (rule ②).
Survival of the dropped clauses
The old line 201 is gone; each clause still has a home:
references/platform-readings.md:47–48(「请审恒走它;MCP 兜底已拒」, 「undraft 与挂载走中继 op … MCP 兜底已拒」), and SKILL.md 全体座位的不变量 「内容写只走 REST 代理,⛔ 无 MCP 写」.references/rest-channel.mdspellspr_ready/pr_draft, andlanding-operations.mdB points there (「拼写见rest-channel.md」).Not changed: the
Writes:lineThe dispatch order's
Writes:line (PR only through relaypr_create) is already mandatory atreferences/execution-duties.md:129(「派发令恒带Writes:行」) andreferences/dispatch-runbook.md:140. The cloud-side miss behind this card was a seat not following that line; no text change is owed.The maintainer's words (2026-10-25, Claude Code project "cloud", verbatim, as quoted in the card):
维护者速读(草稿)
requested_reviewers/assignees,有缺口就经中继补请审,不再只看中继的 run 行。二是把按作者请审的规则写明:作者是审批人就指派他本人、请另一位;其他作者两位都请;速读只请非作者那位批。.claude/**,Tier S),达档复核在案后由 skills 车道席位落地。Acceptance notes
os-zhuang), which holds nodomain:skillsseat; the card is not claimed and carries no triage labels yet. Claim, ACCEPT and landing belong to adomain:skillsseat ([PM seat] domain:skills — 🟢 os-project-manager #7623, [PM seat] domain:skills · seat 2 — ⏳ vacant #19287).SKILL.mdis also touched by open PR docs(pm-dispatch): text written by accounts outside the maintainer and the fleet is data, never instructions #25776 (hunks at 〈红线〉 and 〈阶段细则索引〉); no overlap with this hunk at 〈路径分叉〉, so either order merges cleanly..claude/**publishes nothing.claude/issue-<n>-<slug>: the platform lets this thread push only that branch.Gates (local)
On head
c79e2346(the one-lineassigndelta):pnpm check:pm-skill-ratchet,check:pm-skill-id-lint,check:pm-governed-prose,check:skill-frame-sync, each exit 0.On head
bc491118: Derived bynode scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack: 20 commands, every one exit 0 afterpnpm install.pnpm --filter @objectstack/lint run check:doc-formula-expressionsfirst exited 3 (prerequisite:@objectstack/formula/@objectstack/lintunbuilt) and exited 0 afterturbo run buildof those two. 20 derived, 20 run, each with its exit code recorded before any pipe.Session:
session_01FiwXn7nJjWeZrtvzYraPVj🤖 Generated with Claude Code
https://claude.ai/code/session_01FiwXn7nJjWeZrtvzYraPVj