Repository navigation
pm-dispatch: Tier S PR landed from a project needs a contract-review record by another account; triage shrinks to bare cards in the director project; decision cards stay in their repo, the director scans every repo (maintainer's word 2026-10-23) #25414
Description
Filing gate ③: a maintainer-direct task, the maintainer's words quoted verbatim. Filed from the Claude Code project "Objectstack" (account os-elon-musk) by the research thread 车队机制迁往 Projects on the maintainer's word there. ⛔ Not a claim. Lane self-applied under exception 二; grade suggested p2; triage may regrade.
Reader (who acts): the domain:skills seat 2 (seat post #19287), in one PR on .claude/skills/pm-dispatch/** (Tier S) plus ratchet ceiling rows. Card thread at CONTRACT_REVIEW_TIER. Sibling of the project-forms card filed in the same stroke; land this one second if SKILL.md line budget forces an order.
The maintainer's words (2026-10-23, project thread 车队机制迁往 Projects, verbatim)
我的账户清单不固定的, 20x 周流量用完了,我就会换另外一个账户。 (06:27Z)
具体的分配应该是我人工制定的。 (06:27Z)
元数据项目应该各自分诊,但是决裁可以统一报总监。 (06:32Z)
管理者不是 bill 是 hotlong / 或者你不要强调是谁 (11:45Z, 11:46Z)
全项目并发上限 6 (11:46Z)
分诊不忙不如留给总监管 (12:08Z)
如果我同意这一整套机制,相关的 skills 是不是都要修改,文件应该落在仓库中 (12:10Z)
你立卡并派发处理所有相关任务,跟踪落地 (12:13Z)
为什么我们需要区分项目类型?任何一个项目中都可以召唤总监啊,任何一个项目中也可以召唤分诊 (12:25Z — amendment: there is ONE project form; 总监席 and 分诊席 are seats like any other, summoned by the maintainer's sentence in whichever project he names. The only invariant is on the account, already in the protocol: 「批准账号永不跑席位」.)
The research memo these cards implement: https://claude.ai/artifact/VFTHWcmKkzbah17UM8KRqm (sections 6, 10–13; private to the maintainer's account).
What was measured (2026-10-23)
- Landing. Three seats on this account ran the same relay call (
dispatch.mjspr_ready+automerge_enable) after the maintainer said 「可以落地」 at 06:04Z. Relayed words and a decision-card tap were refused ([Self-Approval]); his bare words passed only the PRs the seat's latest ask had named by number (hotcrm 4/4, devx 1/8); his message naming each PR (「docs(pm-dispatch): revoke every autonomous-adjudication channel — a seat analyses and recommends, every needs_decision goes to the maintainer's ruling batch #25348 docs(pm-dispatch): platform-readings line 403 follows the ADR-0131 D9/D13 schema rule, not the retired tenancy ledger #25254 feat(hooks): SessionStart hook prints the pm-dispatch pointer, its SKILL.md touch sha and the lane’s seat-post line #25386 可以落地」, 06:16Z) passed all three, two of them under.claude/**. Repo and surface are not variables; the classifier binds the user's own authorization to named objects. This is a cost of one human sentence per PR, forever, as long as implementer, reviewer, seat and PR share one account. - The protocol already has the fix and this project simply did not meet it: the independence pair
Implemented-by:/Reviewed-by:(contract-review.md独立性对). Sample: PR feat(spec): ExecutionStatus gains missed, a scheduled due time that passed while no kernel was ticking #25363 was built by anos-billseat, reviewed by this account's project (record 6357150459,Reviewed-by:this session), and one minute later Bill's seat ranpr_ready+automerge_enablethrough the relay with no human sentence (ACCEPT 6357165210 says so); merged 04:46Z. - Triage.
triage-duties.mdis 120 lines of hourly duties; the two multi-lane repos see single digits to low tens of bare cards a day. Single-lane repos already self-triage (cross-repo-coordination.md机械三务). Issue events cannot wake a thread, so triage is the one duty that must poll. - Decision inbox.
cross-repo-coordination.mdsays 「决策收件箱按仓:平台在 objectstack / objectui,元数据项目在本仓」; in practice hotcrm#2194 was ruled through the director batch (pm-dispatch: revoke every autonomous-adjudication channel — a seat analyses and recommends, everyneeds_decisiongoes to the maintainer's director ruling batch (maintainer's word 2026-10-23) #25344's director lane) and the maintainer wants that to be the rule.
Wanted
contract-review.md, 独立性对: when the landing seat is a project thread (mode:thread), a Tier S PR's review of record must carry aReviewed-by:session that belongs to a different account from the PR's author (account read from the PR body's attributiongithub_loginline and the relay sender; the record's independence paragraph states both). A same-account isolated subagent is still a review, ⛔ not the review of record for landing. Prose-face PRs (content/docs/**,.changeset, release text) that owe no contract review get the same cross-account record atTIER_DEFAULT(one comment), because the classifier makes no exception for prose.landing-operations.md落地前检两条: ① becomes 「达档复核 PASS 在案,且Reviewed-by:属另一账户(项目形态)」; apm:mailboxPR owes no CI and is never enqueued; the interim rule while no other account is seated: the maintainer's own message in the executing thread naming each PR number.dispatch-runbook.mdpatrol: every project's patrol also runsis:pr is:open label:needs:contract-review, drops PRs whose attribution login is this account's, leaves aClaim:-shaped comment before reviewing (no double work), reviews percontract-review.md, removes the marker in the same stroke on PASS. The 总监席's digest lists PRs waiting > 24 h.- Triage shrinks (amended 12:25Z: it stays a seat, summoned in whichever project the maintainer names; by default alongside the 总监席).
lanes/triage.md+triage-duties.md: the 分诊席 writes labels and audit comments only, no PRs, so no self-approval; its duty is bare cards (nopm:*, nodomain:*, noneeds-user-decision) first-touch grading and routing, plus cross-lane dedupe /duplicate_of, in objectstack and objectui only; half-labelled cards are completed by the owning lane seat; seat-filed cards are born with all three per the filing gate; app repos have no triage seat. The hourly run may share one routine with the 总监席's decision-inbox scan when both sit in one project. Daily duties (release board, pin chain, liveness re-check, fork-PR sweep) move to the 总监席's digest and the lane patrols; name where each goes. - Decision inbox.
cross-repo-coordination.md: 「决策收件箱按仓」→「决策卡留在立卡的仓;总监席扫全部仓的needs-user-decision,按批呈维护者」;lanes/director.mdgains that scan, the thin triage, the digest and the roster. The pin chain (triage-duties.md跨仓 pin 链) extends from objectui/cloud to every app repo (hotcrm#2230 waiting on 18.1.0 is the live case). The new-repo checklist gains: add toGOVERNED_REPOS, install the fleet app, writelanes/<repo>.md. - Naming: 「车道账户」 / 「总监账户」 by role; ⛔ no login in rule text.
Acceptance
- The six files above carry the text;
pnpm check:pm-skill-ratchetgreen with ceilings lowered where files shrank (triage-duties.mdis expected to shrink);check:pm-skill-id-lint,check:skill-frame-sync,check:skill-frame-freshnessgreen. git grep -n '决策收件箱按仓' -- .claude/skillsreturns nothing.- A
## Contract reviewrecord template run (record-recognisers.mjs --template) shows where the account line goes; the queue-guard check itself is a devx S card filed in the same stroke. - Tier S landing of this PR follows the rule it writes: a review of record by another account's session, then the owning seat lands; fallback the maintainer's 「#N 可以落地」.
Dedupe
MCP search_issues, objectstack, "contract review independence reviewer different account self-approval landing precondition Tier S cross-account Reviewed-by" → 21 hits; top: #23578 (closed, mixed-diff tier), #23426, #21187 (closed, narrowed prose faces — this card re-adds a one-comment cross record for prose, for the classifier, not for the contract), #19133 (closed, Tier S lands on the seat's PASS — this card adds whose PASS), #18382 (closed, self-review predicate), #25344 (closed, revoked autonomous adjudication), #23692, #17285, #16905, #23352. A second search "triage seat thin bare cards only director decision inbox cross repo needs-user-decision app repos self triage pin bump chain hotcrm" → 34 hits; top: #25342, #25321, #21467, #20791, #19931 (closed, hotcrm allow-list), #15936, #24686 (closed, single-lane qualifier), #24589, #24517, #23733 (closed, self-labelled cards accepted by lanes — this card keeps that). None thins triage to bare cards or makes the reviewer's account a landing condition. New.
Dedupe words: Reviewed-by another account landing precondition · thin triage 分诊席 labels only · decision inbox 总监扫全仓 · pin chain app repos.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 23, 2026
Amended 2026-10-23 12:33Z on the maintainer's word 「为什么我们需要区分项目类型?任何一个项目中都可以召唤总监啊,任何一个项目中也可以召唤分诊」 (12:25Z): the body no longer speaks of a lane project and a director project. There is one project form, 「车队项目,规则见 pm-dispatch。」; 总监席 and 分诊席 are seats summoned by the maintainer's sentence in any project; the only invariant is the protocol's existing 「批准账号永不跑席位」 on the approving account. Body edited in place by the filing thread (relay
issue_patch); the quoted words are added to the maintainer's-words block.Generated by Claude Code
objectstack-fleet commentedon Oct 23, 2026
Claim: PM loop round 1 (card thread) · 2026-10-23T12:36Z · p2,
tooling,domain:skills. Writes the maintainer's 2026-10-23 words quoted on the card (amended 12:25Z: the 分诊席 stays a seat, summoned where the maintainer names): a cross-account review of record for Tier S landing from a project, the patrol'sneeds:contract-reviewpass, the 分诊席 shrunk to bare cards, decision cards kept in their own repo with the 总监席 scanning every repo, the pin chain extended to app repos, and the new-repo checklist.Session:
session_011XvnQKt7WvdyvD2X4DLc8R(card thread ofdomain:skillsseat 2, seat sessionsession_01REMuzhz6MWRjg8uohedMnM)Account:
os-elon-musk(the seat's linked user; always the card's assignee)Branch:
claude/project-thread-e8y326(the card thread's designated push branch, platform-assigned at thread creation and read by the seat from the thread's session record per ruling 1A of #25379, comment 6363872862; the thread checks that this newest claim names its branch before it starts)Worktree: the card thread's own checkout
Domain:
domain:skillsSeat:
domain:skills#2(seat post #19287)File surface:
.claude/skills/pm-dispatch/references/contract-review.md(独立性对),references/landing-operations.md(落地前检两条),references/dispatch-runbook.md(patrol line),references/lanes/triage.md,references/triage-duties.md,references/cross-repo-coordination.md,references/lanes/director.md;.claude/skills/pm-dispatch/SKILL.mdonly if a line is paid in the same file;scripts/pm/check-skill-line-ratchet.mjs(ceiling rows, lowered where files shrink). (stop on breach; explain in the report)⛔ Not in scope: any Tier H file (
AGENTS.md,CLAUDE.md,docs/**,skills/**,.github/workflows/**, CODEOWNERS);references/project-forms.mdand the project layer (sibling card #25412); the queue-guard check and any otherscripts/**(devx cards); the seat posts themselves. ⛔ The human-ruling floor intriage-duties.md(director batch #3, ruled on #25344 comment 6356061991: the risk tests, workload tests, extra classes and do-not-escalate list) moves or shrinks only with its full text kept, and no ruling path is reopened to a seat (「必须人工决裁」 stands). ⛔ No rule lets a same-account review stand in for the maintainer's word; no rule text names a login.Container & model:
M,mode:thread(the maintainer's word: one project thread per M-or-larger or p1 card),model: CONTRACT_REVIEW_TIER(dispatch-gates.mjs --tier --repo objectstack-ai/objectstack .claude/skills/pm-dispatch/SKILL.mdatf0fdd45bb: "MANDATORY"),effort: high(M). Governed surface.claude/**is Tier S: aCONTRACT_REVIEW_TIERPASS record on the PR's head plus all-green checks; landing waits for the maintainer's own words in the seat thread naming this PR (the rule this card writes is not in force until it lands).Clause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card (a maintainer word not yet written into the skill)
Thread-read: none
Serial constraints cleared: lands after #25412 (SKILL.md 319/319 on
mainf0fdd45bb). Open PRs on.claude/skills/pm-dispatch/**at claim time: #25385 (card #25379;dispatch-runbook.mdL141–L142,lanes/director.md), #25255 (newcoordinator.md, runbook), #25247 (lane files). Start frommain, keep out of their hunks, mergemainafter each lands, and re-check the open-PR list before your first push.Generated by Claude Code