Skip to content

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

Open

Description

@objectstack-fleet

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)

Wanted

  1. contract-review.md, 独立性对: when the landing seat is a project thread (mode:thread), a Tier S PR's review of record must carry a Reviewed-by: session that belongs to a different account from the PR's author (account read from the PR body's attribution github_login line 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 at TIER_DEFAULT (one comment), because the classifier makes no exception for prose.
  2. landing-operations.md 落地前检两条: ① becomes 「达档复核 PASS 在案,且 Reviewed-by: 属另一账户(项目形态)」; a pm:mailbox PR 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.
  3. dispatch-runbook.md patrol: every project's patrol also runs is:pr is:open label:needs:contract-review, drops PRs whose attribution login is this account's, leaves a Claim:-shaped comment before reviewing (no double work), reviews per contract-review.md, removes the marker in the same stroke on PASS. The 总监席's digest lists PRs waiting > 24 h.
  4. 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 (no pm:*, no domain:*, no needs-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.
  5. Decision inbox. cross-repo-coordination.md: 「决策收件箱按仓」→「决策卡留在立卡的仓;总监席扫全部仓的 needs-user-decision,按批呈维护者」; lanes/director.md gains 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 to GOVERNED_REPOS, install the fleet app, write lanes/<repo>.md.
  6. Naming: 「车道账户」 / 「总监账户」 by role; ⛔ no login in rule text.

Acceptance

  • The six files above carry the text; pnpm check:pm-skill-ratchet green with ceilings lowered where files shrank (triage-duties.md is expected to shrink); check:pm-skill-id-lint, check:skill-frame-sync, check:skill-frame-freshness green.
  • git grep -n '决策收件箱按仓' -- .claude/skills returns nothing.
  • A ## Contract review record 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

  1. objectstack-fleet commented on Oct 23, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  2. objectstack-fleet commented on Oct 23, 2026

    @objectstack-fleet
    ContributorAuthor

    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's needs:contract-review pass, 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 of domain:skills seat 2, seat session session_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:skills
    Seat: 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.md only 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.md and the project layer (sibling card #25412); the queue-guard check and any other scripts/** (devx cards); the seat posts themselves. ⛔ The human-ruling floor in triage-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.md at f0fdd45bb: "MANDATORY"), effort: high (M). Governed surface .claude/** is Tier S: a CONTRACT_REVIEW_TIER PASS 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 main f0fdd45bb). Open PRs on .claude/skills/pm-dispatch/** at claim time: #25385 (card #25379; dispatch-runbook.md L141–L142, lanes/director.md), #25255 (new coordinator.md, runbook), #25247 (lane files). Start from main, keep out of their hunks, merge main after each lands, and re-check the open-PR list before your first push.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions