Skip to content

pm-dispatch: project forms — lane project and director project, lanes read from the seat post's 🟢 line, the maintainer's one-sentence assignment, takeover of a walled account, mailbox PRs, generated roster board (maintainer's word 2026-10-23) #25412

Closed

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 in scripts/pm/check-skill-line-ratchet.mjs. Card thread at CONTRACT_REVIEW_TIER. Builds on #25379 (PR #25385 — still an OPEN draft at 12:55Z, waiting for the maintainer's naming; ⛔ correction of the first filing, which called it landed): that card gives the project-run seat its stub; this one gives the project layer itself. Land this PR after #25385, merging main once it is in.

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: 「批准账号永不跑席位」.)
我直接写 pm-dispatch 总监,pm-dispatch ui, pm-dispatch 分诊,这种应该都可以吧? 或者 fleet 总监 ?fleet ui ? (12:27Z — amendment: the project instruction IS the summon: 「pm-dispatch <席位…>」.)

The research memo these cards implement: https://claude.ai/artifact/VFTHWcmKkzbah17UM8KRqm (sections 6, 10–13; private to the maintainer's account).

What was measured (this project, 2026-10-22 14:22Z – 10-23 12:10Z)

  • A Claude Code project belongs to one account. The maintainer runs many 20x accounts and switches when a week's quota is spent, so no account is permanent and no lane→account table can be written down. What survives a switch is only what is on GitHub.
  • Which account holds a lane is already a GitHub fact: the seat post's 🟢 line (seat-post-protocol.md: 「🟢 后写召唤账号」); the three seats this project holds carry 「由 os-elon-musk 账户的项目负责」.
  • A walled account writes nothing, so a takeover cannot wait for its wall note. The protocol already has the pieces: 维护者强制接管令 (seat-lifecycle.md), 「认领人不可达(token 耗尽) ⇒ 接管」 (execution-duties.md L82), Release: + Resume-from: BRANCH@SHA (SKILL.md L317).
  • Cross-account messages: a thread subscribed to a PR is woken by comments on it. Measured on pm: mailbox PR for the cross-account wake test (never merged) #25392 (an empty-commit draft PR): a relay comment woke the subscribed thread 70 s after posting with the verbatim body (06:41Z); a comment by os-bill woke it within 4 s (11:44:30Z, comment 6364106224). Issue comments wake nothing. The subscription also applies the drive-to-green rules to the PR, and Check Changeset reddened on the empty diff.
  • Repo skills and settings.json hooks are not surfaced in a project rooted at the parent of several checkouts (ListSkills empty; CLAUDE_PROJECT_DIR unset in three readings); each repo's CLAUDE.md does load. So a project's instructions can be one sentence pointing at pm-dispatch, and nothing may rely on the SessionStart hook from pm-dispatch: a SessionStart hook prints the lane's seat-post stub and the SKILL.md pointer, because a multi-repo project's working directory does not surface the repo's .claude/skills (maintainer's word 2026-10-23) #25380 in that layout.
  • Protocol rule 5 (cross-repo-coordination.md): one board, no second tracker — any roster must be a generated view.

Wanted

A new reference references/project-forms.md, pointed at from SKILL.md's reference table, defining the project layer above seats:

  1. One project form (amended 12:25Z). A 车队项目 is any Claude Code project on any account whose instructions point at pm-dispatch. What it does is decided entirely by which seats it holds: lane seats (cards, PRs, cross-account review), the 总监席 (decision inbox + ruling batches drafted for the maintainer, releases, daily digest, roster board) and the 分诊席 (labels and audit comments only) are all seats, summoned by the maintainer's sentence in whichever project he names. The one invariant is on the account, not the project, and is already protocol: 「批准账号永不跑席位」 — the account that holds Tier H human approval sits no execution seat; the reference restates it in one line and adds nothing. Logins appear in rulings only as evidence of a past event.
  2. Project instructions are one line, and that line is the summon (amended 12:27Z): 「pm-dispatch <席位> [<席位>…]」, e.g. 「pm-dispatch 总监」, 「pm-dispatch ui」, 「pm-dispatch 分诊」, 「pm-dispatch ui skills」. The first token is the skill directory's own name (⛔ not fleet, which already names the bot and the relay); the seat tokens accept the Chinese name or the lane charter file name — the reference carries the one-line mapping (总监 = lanes/director.md, 分诊 = lanes/triage.md, ui/skills/devx/cli/engine/services/spec/hotcrm as their file names). A lane with several seat posts: the coordinator takes the one whose 🟢 line names this account, else the vacant one, else asks once. Everything else lives in this reference. ⛔ No template is pasted into a project; ⛔ no account-level skill copy.
  3. Seats are read, not configured. A project's seats (lane, 总监, 分诊) = the seat posts whose 🟢 line names this account. Before any dispatch the coordinator reads the seat posts; none ⇒ the project is idle.
  4. The instruction line is the assignment. The same 「pm-dispatch <席位…>」 line written (or rewritten) in a project by the maintainer is the only assignment act; a longer sentence in the project chat (「本账户坐 X;Y 的 PR 由本账户复审」) is an equivalent form. On every coordinator start the line is compared with the seat posts; the coordinator seats or takes over each named seat per seat-post-protocol.md, writes the account into the 🟢 line, opens one seat thread per seat, and on first use creates the project's routines (patrol every 2–4 h; a 总监席 adds the daily digest and the hourly inbox scan; a 分诊席 adds the hourly bare-card run). ⛔ No roster file.
  5. Takeover never waits for a walled account. When the 🟢 line names another account, the instruction line is the 维护者强制接管令 and covers in-flight cards: cross-account Release: naming the old session with its 出处, Resume-from: BRANCH@SHA, new dev continues the old branch. Ledger = labels + assignee + Claim: + head:claude/ PRs, read with assignee:<old login>; ⛔ never project memory.
  6. Mailbox PR. PR-bound talk needs nothing new (card threads subscribe their own PRs). For non-PR talk each project may open one draft PR labelled pm:mailbox on branch mailbox/<login>, subscribed by a resident thread, never merged, closed on handover; first body line To: <login>; a pm:mailbox PR owes no CI and is excluded from every landing ledger query (the exclusion itself is a devx S card filed in the same stroke).
  7. Roster board. A pinned objectstack issue 「车队总表」 whose body is regenerated by the 总监席's digest and by whoever seats/takes over/hands over, one row per seat (repo · lane · seat · account · in-flight · awaiting ruling · awaiting landing · wall note · last activity · mailbox PR), read from seat posts, labels, assignees and PR queries. A generated view, ⛔ never hand-edited (rule 5). The generator script is a devx S card filed in the same stroke.
  8. Concurrency is a per-project posture the maintainer sets in that project (today 6 card threads for this project); ⛔ not a protocol constant.

Edits elsewhere, one line each: seat-post-protocol.md (the 🟢 line is the assignment; takeover on the maintainer's sentence), seat-lifecycle.md (the project forms do not use the self-bound cron or the cross-wall timer chain), dispatch-runbook.md 〈卡线程〉 (orders in the thread's opening message, per #25379), lanes/director.md (the 总监席 is a seat summoned in any project; see the sibling card for the triage text), rest-channel.md (GitHub org Project →「看板」 if #25379 left it).

Out of scope here: the review/landing rule, triage duties and the decision inbox (sibling skills card filed in the same stroke); scripts (three devx cards).

Acceptance

  • references/project-forms.md exists, ≤ 60 lines, with a ceiling row; SKILL.md's reference table names it (SKILL.md is at 319/319, so one line is paid by one deleted line).
  • pnpm check:pm-skill-ratchet, check:pm-skill-id-lint, check:skill-frame-sync, check:skill-frame-freshness green; new lines paid by deleting Routine-seat-only lines made conditional.
  • The reference names no login as an assignment; git grep -n 'os-bill\|hotlong\|os-elon-musk' -- .claude/skills/pm-dispatch/references/project-forms.md returns nothing.
  • Tier S landing: CONTRACT_REVIEW_TIER PASS by a session of another account (the rule the sibling card writes; until it lands, the maintainer's own 「#N 可以落地」 in the seat thread), then the owning seat lands.

Dedupe

MCP search_issues, objectstack, "pm-dispatch project forms director project lane project account rotation seat post assignment mailbox PR roster board" → 52 hits; top ten: #25379 (open at search time, PR #25385 landed — the stub this card builds on), #25219 (open, PR #25255 coordinator reference — this card supersedes its lane list by reading seat posts), #23827, #6025, #24145, #21118, #22648, #19287, #20966 (seat posts), #20063 (closed, PR assignee rule). None defines the project layer, the assignment sentence, takeover-without-waiting, mailbox PRs or a generated roster. New.

Dedupe words: project-forms.md · pm-dispatch <席位> instruction line · assignment sentence 本账户坐 · mailbox PR pm:mailbox · 车队总表 roster board.


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

    Amended again 2026-10-23 12:35Z on the maintainer's word 「我直接写 pm-dispatch 总监,pm-dispatch ui, pm-dispatch 分诊,这种应该都可以吧?或者 fleet 总监?fleet ui?」 (12:27Z): the project instruction is now the summon itself, 「pm-dispatch <席位…>」 (items 2, 4, 5 of Wanted rewritten); fleet rejected as the first token because it already names the bot and the relay. Body edited in place by the filing thread (relay issue_patch).


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 23, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 (card thread) · 2026-10-23T12:35Z · p2, tooling, domain:skills. Writes the project layer into pm-dispatch on the maintainer's 2026-10-23 words quoted on the card, as amended at 12:25Z (one project form; 总监席 and 分诊席 are seats like any other) and 12:27Z (the project instruction line 「pm-dispatch <席位…>」 is the summon): new references/project-forms.md, its SKILL.md reference-table pointer, and the one-line edits the card lists.
    Session: session_01UJebcS3m7vf3CYnTfBD5oH (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-s43tmc (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/project-forms.md (new, ≤ 60 lines); .claude/skills/pm-dispatch/SKILL.md (the reference-table row only, paid by one deleted line; ⛔ not the 〈域车道〉 lane table); one line each in references/seat-post-protocol.md, references/seat-lifecycle.md, references/dispatch-runbook.md 〈卡线程〉, references/lanes/director.md, references/rest-channel.md; scripts/pm/check-skill-line-ratchet.mjs (the new file's ceiling row; other rows lowered or at landed count). (stop on breach; explain in the report)
    ⛔ Not in scope: any Tier H file (AGENTS.md, CLAUDE.md, docs/**, skills/**, .github/workflows/**, CODEOWNERS); the review/landing rule, triage duties and the decision inbox (sibling card #25414); references/triage-duties.md and its human-ruling floor; any other scripts/** (the generator and mailbox-exclusion scripts are devx cards); the seat posts themselves; .claude/settings.json and .claude/hooks/**; any login named as an assignment in rule text.
    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.
    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: SKILL.md is 319/319 on main f0fdd45bb. Open PRs on .claude/skills/pm-dispatch/** at claim time: #25385 (card #25379, NOT yet landed — the card body's 「PR #25385, landed 06:16Z」 is wrong; it touches SKILL.md L74, seat-lifecycle.md, seat-post-protocol.md, dispatch-runbook.md 〈卡线程〉 L141–L142, lanes/director.md, rest-channel.md), #25255 (new coordinator.md, SKILL.md 入口与角色 row), #25247 (SKILL.md 〈域车道〉, lane files; SKILL.md ceiling 318). Start from main, keep out of their hunks, merge main after each lands, and re-check the open-PR list before your first push. The 〈卡线程〉 line the card asks for may already be written by #25385; if so, drop it and say so. This card lands before #25414.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 23, 2026

    @objectstack-fleet
    ContributorAuthor

    Correction 2026-10-23 12:58Z: the first filing said #25379's PR #25385 had landed at 06:16Z. It had not — the maintainer's 06:16Z naming covered #25348 #25254 #25386; #25385 is still an open draft awaiting his word. Reader line fixed in place; this PR lands after #25385.


    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