Skip to content

docs(pm-dispatch): the project layer — one project form, 「pm-dispatch <席位…>」 as the summon, seats read from the seat posts' 🟢 line, takeover that never waits for a walled account, mailbox PRs, a generated roster board - #25427

Merged
objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/project-thread-s43tmc
Oct 23, 2026

Conversation

@os-elon-musk

@os-elon-musk os-elon-musk commented Oct 23, 2026 •

Copy link
Copy Markdown
Collaborator

Requested by Elon · project thread

Fixes #25412

Clause-②: no
Metadata-protocol: none

维护者速读(草稿)

  • 改了什么:pm-dispatch 技能新增一份参考 references/project-forms.md(54 行),把「项目层」写进仓库:只有一种车队项目,项目做什么全看它坐了哪些席;总监席、分诊席与车道席都是席位,由您在任一项目里写一行「pm-dispatch <席位…>」(如「pm-dispatch 总监」「pm-dispatch ui skills」)召唤;首词固定 pm-dispatch(不用 fleet,它已是 bot 与中继的名字);席位从座位贴的 🟢 行读出来、不另配;这一行写下或改写即指派;🟢 写着别的账号时这一行就是强制接管令,含在飞卡,不等撞墙账号写任何东西;台账只在 GitHub;每项目至多一个 pm:mailbox 信箱 PR 做跨账号非 PR 对话;置顶 issue「车队总表」是生成视图、永不手改;并发上限是您按项目定的姿态,不写进协议。SKILL.md 索引表加一行指向它,入口行旁注明项目指令行;另外三个参考各就地改一行、lanes/director.md 改两行,棘轮加一条封顶行。
  • 为什么改:您 2026-10-23 在「车队机制迁往 Projects」线程的原话:「如果我同意这一整套机制,相关的 skills 是不是都要修改,文件应该落在仓库中」「你立卡并派发处理所有相关任务,跟踪落地」;再按 12:25「为什么我们需要区分项目类型?任何一个项目中都可以召唤总监啊,任何一个项目中也可以召唤分诊」与 12:27「我直接写 pm-dispatch 总监,pm-dispatch ui,pm-dispatch 分诊,这种应该都可以吧?」两次修正写成。
  • 风险与代价(含回滚):纯规则文本,不碰代码与门禁逻辑;每个文件行数不变或为新文件,每行 ≤120 字节,无上限抬高;一次 revert 可回。三处要您知道:① docs(pm-dispatch): a project-run seat form beside the Routine form — the seat post as a stub, the dispatch order in the card thread, event wake plus one patrol per project, 项目总监 → 总监席 #25385(pm-dispatch: a project-run seat form — seat post as a stub, posture and ledger in the Claude Code project, dispatch order in the card thread, branch named before the thread opens; 项目总监 → 总监席 (maintainer's word 2026-10-23) #25379 的 PR)还没合,它把 SKILL.md 入口表写成「车道项目」「总监项目」两种项目,而您 12:25 已说只有一种;本 PR 避开它的 hunk,排在它之后落;它 14:44Z 合入后本 PR 已合 main 并补了一个提交(91e8600)把那四处改成单一形态;② 为付 SKILL.md 的一行,删了「一 PM 恰管一车道,一车道由一组座位管,一席一贴」这一行,三个子句分别住 cross-repo-coordination.md 规则 4 与分席行、seat-post-protocol.md,以及新文件的「每席恰一条席位线程、恰一车道,一席一贴」;③ lanes/director.md 改了两行而非一行:「⛔ 无 Routine/cron」与「未回字 = 停,⛔ 无巡检」都只对直连会话成立,否则项目里的总监席就跑不了每日摘要与每小时收件箱扫描。
  • 席位意见:席位 2 对 head b91d5d6 的契约复核 PASS(评论 6366112222);其边界项 1(席位词随 lanes/server.md)与 3(在飞卡按卡面无条件接管)已在跟进提交 91e8600 里改好,待席位对新 head 增量复核。
  • 你要做的(一个动作):无。您 14:14Z 已在席位线程授权「按 pm-dispatch 复核通过的 PR 都可以落地」;席位对新 head 复核 PASS、检查全绿后由席位落地。

What changed

File Change
.claude/skills/pm-dispatch/references/project-forms.md (new, 54 lines) The project layer above the seats, six sections in the card's order: 一种项目形态 (one project form; what a project does is decided by the seats it holds; the only invariant is on the account and is already SKILL.md's 「批准账号永不跑席位」, restated in one line; role words only, logins only as evidence in ruling records) · 指令行即召唤 (the one-line instruction pm-dispatch <席位> [<席位>…], first token = the skill directory name, ⛔ not fleet; the seat-word mapping 总监 = lanes/director.md, 分诊 = lanes/triage.md, the rest by lane file name; several seat posts in one lane → the one whose 🟢 names this account, else the vacant one, else ask once; ⛔ no template pasted, ⛔ no account-level skill copy) · 席位是读出来的,不是配出来的 (seats = the seat posts whose 🟢 names this account; none ⇒ idle; the instruction line is the only assignment act, the long chat sentence is an equivalent form; on every coordinator start the line is compared with the posts, seat or take over per seat-post-protocol.md, one seat thread per seat; first seating creates the patrol routine every 2–4 h, the 总监席 adds the daily digest and hourly inbox scan, the 分诊席 the hourly bare-card run, shareable when both sit in one project; ⛔ no roster file; concurrency is a per-project posture, ⛔ not a protocol constant) · 接管不等撞墙账号 (a 🟢 naming another account makes the line the 维护者强制接管令, in-flight cards included; cross-account Release: + new Claim: with Resume-from: BRANCH@SHA, shape in execution-duties.md; ledger = labels + assignee + Claim: + head:claude/ PRs read by assignee:<old login>, ⛔ never project memory) · 信箱 PR (PR-bound talk needs nothing new; one draft PR per project labelled pm:mailbox on mailbox/<login>, subscribed by a resident thread, never merged, closed on handover, first body line To: <login>, owes no CI, excluded from landing and ledger queries) · 总表 (pinned 「车队总表」 issue, one row per seat, regenerated by the 总监席 digest and every seat/takeover/handover, a generated view ⛔ never hand-edited, cross-repo-coordination.md 规则 5).
.claude/skills/pm-dispatch/SKILL.md +1 〈阶段细则索引〉 row for the new file (reader: the coordinator on every start; a seat before seating, takeover, handover and opening a mailbox PR); the 〈入口与角色〉 opening line now reads 「/pm-dispatch [args] 或项目指令行 pm-dispatch <席位…>,…」 (93 bytes, in place); −1: the 〈全体座位的不变量〉 line 「一 PM 恰管一车道,一车道由一组座位管,一席一贴;PM Y 管什么恰一个答案」 — 一人恰一车道 and 一车道可坐多席 are cross-repo-coordination.md 规则 4 and its 分席 line, 一席一贴 is seat-post-protocol.md 〈贴的四段〉 L9, and the new reference carries 「每席恰一条席位线程、恰一车道,一席一贴」. 319/319.
references/seat-post-protocol.md 〈贴的四段与派生视图〉 「多场席(总监):🟢 后写召唤账号,状态块逐场一行(会话 ID + 锚);无在任者、无接管」 → 「直连多场总监席:🟢 后写召唤账号,逐场一行;项目席 🟢 即指派,接管见 project-forms.md」 (118 bytes, in place): the 🟢 account is the assignment and takeover is the maintainer's instruction line. Dropped from that line: 「(会话 ID + 锚)」 (format detail) and 「无在任者、无接管」, which lanes/director.md L8 and seat-lifecycle.md 〈开轮互斥〉 L12 both still state. 91/91.
references/seat-lifecycle.md 〈座位贴协议〉 「维护者强制接管令取席位、队列、未起工卡与待落地 PR;⛔ 不取在飞卡,由原认领者跟完」 → 「…;在飞卡归原认领者,不可达才接」 (118 bytes, in place): the takeover order reaches an in-flight card only when its claimer is unreachable (the walled-account case the card names; the reachable claimer keeps the card). Rewritten in the follow-up commit (seat review ③-3) to 「…取席位、队列、在飞卡、未起工卡与待落地 PR;⛔ 不等原认领者注记」 (118 bytes), the unconditional in-flight takeover the card's Wanted 5 states. Also L70 (from #25385): 「五项健康指标进总监项目的每日摘要」 → 「…进总监席的每日摘要」. 95/96.
references/lanes/director.md 〈授权与形态〉 L7 「授权面 = 人工定期召唤,…;⛔ 无 Routine、无 cron、无舰队位」 → 「授权面 = 人工召唤,任一项目可召;…;直连 ⛔ 无 Routine/cron」; L16 「未回字 = 不在 = 停,⛔ 无巡检…;⛔ 无任何例外」 → 「…;例外 = ../project-forms.md 例行」. Two lines instead of the card's one, both in place (114 / 120 bytes): with only one of them edited, the 「两条细则冲突 ⇒ 按更严的一条」 rule would switch the project 总监席's digest and inbox scan off. 70/70.
scripts/pm/check-skill-line-ratchet.mjs A CEILINGS row for the new file at its landed count (54) and a MAX_TABLE_ROW_BYTES pin of 0 (no table row), placed beside filing-gate.md so they sit in no open PR's hunk. A new file is not a raise and funds nothing; no other row moves.

Serial constraints and the landing order

Line budget

File Lines Ceiling Net
references/project-forms.md 54 54 (new row) new (1 edited in place in the follow-up)
SKILL.md 318 (319 before main shrank it) 318 0 (+1 row, −1 line, 4 edited in place)
references/seat-post-protocol.md 91 91 0 (1 edited in place)
references/seat-lifecycle.md 95 96 0 (2 edited in place)
references/lanes/director.md 70 70 0 (2 edited in place)

Widest added or edited prose line 120 bytes (lanes/director.md L16); the new file's widest line 120 bytes; the one added table row is 208 bytes against SKILL.md's 342-byte pin. No re-wrap used as payment.

Gates

On head 91e8600b (b91d5d6 + the origin/main merge 7dd4eb61 at 6c2699b3 + the follow-up commit), run in this checkout with each exit code captured before any pipe; the same 42 commands were run the same way on b91d5d6 with the same result:

  • The four the card names: pnpm check:pm-skill-ratchet ✓ (self-test 164 cases; project-forms.md 54/54, SKILL.md 318/318, widest row 0/0; total ceilings unchanged, no row moved), pnpm check:pm-skill-id-lint ✓ (self-test 23), pnpm check:skill-frame-sync ✓ (91 markdown files scanned, 1 declared copy), pnpm check:skill-frame-freshness ✓. Also pnpm check:pm-governed-prose ✓.
  • node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack <the six changed paths> derives 42 commands; every one was run with its exit code captured before any pipe. First pass on a checkout with no node_modules: 31 exit 0, 11 PREREQUISITE (yaml / typescript not installed, one 240 s cap). After pnpm install --frozen-lockfile: 41 exit 0, and pnpm --filter @objectstack/lint run check:doc-formula-expressions still exit 3 as a PREREQUISITE (@objectstack/formula and @objectstack/lint unbuilt in a fresh checkout — the reading the sibling skill PRs recorded); after pnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lint it exits 0. 42 derived, 42 run, 42 × exit 0, 0 NOT-MEASURED. CI's check-runs on this head are the record either way.
  • git grep -n 'os-bill\|hotlong\|os-elon-musk' -- .claude/skills/pm-dispatch/references/project-forms.md → no hit (acceptance bullet 3).
  • No published package moves (.claude/** and one scripts/pm ledger row), so skip-changeset applies.

Acceptance notes

  • The body's first line is the HTML-comment attribution block the project session requires; os-dev.md 〈干净收尾〉 forbids HTML comments in GitHub text. Reported as a deviation, not hidden.
  • lanes/director.md carries two in-place edits where the claim's File surface says 「one line each」; the reason is in the table above. Reported as a deviation.
  • The card's 「Edits elsewhere」 list names dispatch-runbook.md 〈卡线程〉 and rest-channel.md; both lines already exist on docs(pm-dispatch): a project-run seat form beside the Routine form — the seat post as a stub, the dispatch order in the card thread, event wake plus one patrol per project, 项目总监 → 总监席 #25385's head and are not duplicated here (see Serial constraints).
  • Both commits carry the model-free trailer pair the pre-push hook requires and no card trailer; the merge commit is git's default message; the card relation is this body's Fixes line only.
  • Governed surface .claude/** (Tier S): draft, awaiting the seat's CONTRACT_REVIEW_TIER re-read of 91e8600b; landing by the seat under the maintainer's 14:14Z authorization in the seat thread; ⛔ not to be flipped ready, queued or armed by this thread.
  • Opened through the GitHub MCP, so the PR author is the login rather than the fleet bot; the seat ruled it stays as is, and every later write to this PR goes through the relay.

Generated by Claude Code

…tion line 「pm-dispatch <席位…>」 is the summon, seats read from the seat posts' 🟢 line, takeover that never waits for a walled account, mailbox PRs and a generated roster board

A new reference `references/project-forms.md` (54 lines) defines the
project layer above the seats on the maintainer's words of 2026-10-23,
as amended at 12:25Z (ONE project form; the 总监席 and 分诊席 are seats
like any other, summoned in whichever project the maintainer names) and
12:27Z (the project instruction IS the summon: 「pm-dispatch <席位…>」).

SKILL.md: the 〈阶段细则索引〉 row for the new file and the project
instruction line beside `/pm-dispatch [args]` in 〈入口与角色〉; paid by
deleting the 〈全体座位的不变量〉 line 「一 PM 恰管一车道 … 一席一贴」, whose
three clauses live in cross-repo-coordination.md 规则 4 and the 分席 line,
seat-post-protocol.md 〈贴的四段〉, and the new reference's per-seat-thread
line. 319/319.

seat-post-protocol.md: the 🟢 account is the assignment and the project
instruction line is the takeover order (one line, in place).
seat-lifecycle.md: the takeover order leaves in-flight cards with their
claimer only while the claimer is reachable (one line, in place).
lanes/director.md: the 总监席 can be summoned in any project; the
direct-session no-Routine rule and the 「未回字 = 停」 rule are scoped
to the direct session, with the project routines as the one exception.
check-skill-line-ratchet.mjs: a CEILINGS row (54) and a table-row pin
(0) for the new file; no other row moves.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UJebcS3m7vf3CYnTfBD5oH
@objectstack-fleet

Copy link
Copy Markdown
Contributor

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: b91d5d64232da3a128147a862fd463f0da11bd9e
Local-runs: none
Scope: .claude/skills/pm-dispatch/SKILL.md, .claude/skills/pm-dispatch/references/project-forms.md, .claude/skills/pm-dispatch/references/seat-post-protocol.md, .claude/skills/pm-dispatch/references/seat-lifecycle.md, .claude/skills/pm-dispatch/references/lanes/director.md + scripts/pm/check-skill-line-ratchet.mjs (the two added rows), references/cross-repo-coordination.md 规则 4 and L17, references/execution-duties.md L82, references/lanes/director.md L8, references/seat-lifecycle.md L12, and PR #25385 head f08bab5c742a98a922145efd0a1fffd17294bfef (the two one-line edits this PR drops)

Reviewed at 2026-10-23T13:33Z by an isolated reviewer of the domain:skills seat 2 session, from the card #25412 body with its 2026-10-23T12:25Z and 2026-10-23T12:27Z amendments, the seat claim (comment 6365006609), the diff f0fdd45bb..b91d5d642 (6 files, +67 −6) and the head's check-runs. The PR body's self-assessment was not trusted; every claim below was re-derived from the committed tree. Angle brackets are written as 〈 〉 in this record so the sanitizer keeps them.

① Derived judgments

Card Wanted items against references/project-forms.md (new, 54 lines, six sections in the card's order):

  1. One project form — L7 「车队项目 = 任一账号上、指令行指向 pm-dispatch 的 Claude Code 项目;⛔ 不分项目类型」; L8–L10 name 车道席 / 总监席 / 分诊席 as seats summoned by the maintainer into any project (「分诊与总监可召进任一项目,⛔ 不绑定项目」), carrying the 2026-10-23T12:25Z amendment. The account invariant is restated in one line, L11 「批准账号永不跑席位(SKILL.md 全体座位的不变量);本文不另加」, and SKILL.md L92 「批准账号永不跑席位或作其关联用户」 is untouched — not weakened. L12 confines logins to ruling records as evidence. Correct.
  2. Instruction line is the summon — L16 pm-dispatch 〈席位〉 [〈席位〉…] with the card's examples; L17 first token = the skill directory name, 「⛔ 不用 fleet,它已是 bot 与中继的名字」, carrying the 2026-10-23T12:27Z amendment; L18–L19 the one-line mapping (总监 = lanes/director.md, 分诊 = lanes/triage.md, the rest by lane file name); L20 the several-seat-posts rule (🟢 names this account → vacant → ask once); L21 ⛔ no pasted template, ⛔ no account-level skill copy. Correct against the card. See ③-1 on the enumerated lane words.
  3. Seats are read, not configured — L25 seats = the seat posts whose 🟢 names this account, read before any dispatch; L26 none ⇒ idle. Correct.
  4. The instruction line is the assignment — L27 the only assignment act; L28 the long chat sentence as an equivalent form; L29 compared with the seat posts on every coordinator start, seat or take over per seat-post-protocol.md; L30 the account written into 🟢, one seat thread per seat, ⛔ no roster file; L31–L32 the routines (patrol every 2–4 h; 总监席 daily digest + hourly inbox scan; 分诊席 hourly bare-card run). Correct.
  5. Takeover never waits for a walled account — L36 「🟢 行写着别的账号 ⇒ 指令行即维护者强制接管令,含在飞卡」; L37 never waits for the walled account's note; L38 cross-account Release: naming the old session and its 出处, new Claim: with Resume-from: BRANCH@SHA, the new dev continues the old branch; L39–L40 ledger = labels + assignee + Claim: + head:claude/ PRs read by assignee:〈旧登录名〉, ⛔ project memory and the shared directory are never the ledger. Correct.
  6. Mailbox PR — L44–L47: PR-bound talk needs nothing new; one draft PR per project, label pm:mailbox, branch mailbox/〈login〉, subscribed by a resident thread, never merged, closed on handover or account change, first body line To: 〈login〉, owes no CI, excluded from landing and ledger queries. Correct.
  7. Roster board — L51–L53: pinned 「车队总表」, one row per seat, regenerated by the 总监席 digest and by seating/takeover/handover, the card's ten columns, read from seat posts, labels, assignees and PR queries, 「生成视图 ⛔ 不手改(cross-repo-coordination.md 规则 5)」. Correct.
  8. Concurrency — L33 a per-project posture the maintainer sets, 「⛔ 不是协议常量,本文不写数字」. Correct; no number is written.

Edits elsewhere, each verified in place and line-neutral:

  • SKILL.md: +1 〈阶段细则索引〉 row for references/project-forms.md (208 bytes against the 342-byte row pin); L49 opening line now reads 「/pm-dispatch [args] 或项目指令行 pm-dispatch 〈席位…〉,自由组合,全部可选:」; −1 the 〈全体座位的不变量〉 line 「一 PM 恰管一车道,一车道由一组座位管,一席一贴;PM Y 管什么恰一个答案」. Each clause of the deleted line still lives on this head: 「一 PM 恰管一车道」 and 「PM Y 管什么恰一个答案」 (the same statement: a PM's lane is exactly one) = cross-repo-coordination.md L36 规则 4 「一人恰一车道,一车道可坐多席」; 「一车道由一组座位管」 = 规则 4's 「一车道可坐多席」 plus L17 「车道可分席…每席独立座位贴」; 「一席一贴」 = seat-post-protocol.md L9 「多席车道每席一贴」 and project-forms.md L26 「每席恰一条席位线程、恰一车道,一席一贴」. No rule is lost. SKILL.md 319/319 on the base f0fdd45.
  • seat-post-protocol.md L13: 「多场席(总监):🟢 后写召唤账号,状态块逐场一行(会话 ID + 锚);无在任者、无接管」 → 「直连多场总监席:🟢 后写召唤账号,逐场一行;项目席 🟢 即指派,接管见 project-forms.md」. The dropped 「无在任者、无接管」 for the direct-session 总监席 still stands at lanes/director.md L8 「⛔ 无接管无在任者」 and seat-lifecycle.md L12 「总监席多场并行、无在任者」; the dropped 「(会话 ID + 锚)」 is a format detail restated at lanes/director.md L19 「状态块逐场一行,各记己锚」. 91/91.
  • seat-lifecycle.md L28: 「⛔ 不取在飞卡,由原认领者跟完」 → 「在飞卡归原认领者,不可达才接」. Necessary: the base line directly contradicted Wanted 5's 「含在飞卡」, and 「不可达」 is the protocol's existing takeover predicate (execution-duties.md L82 「认领人不可达(token 耗尽/会话结束/身份退役)⇒ 接管」). 95/96. See ③-3 on the card's wording for this file.
  • lanes/director.md L7 「授权面 = 人工召唤,任一项目可召;…;直连 ⛔ 无 Routine/cron」 and L16 「…;例外 = ../project-forms.md 例行」. Two lines where the card said one — judged necessary: with L16's 「⛔ 无任何例外」 left standing, SKILL.md L45 「两条细则冲突 ⇒ 按更严的一条行动」 would switch off the project 总监席's daily digest and hourly inbox scan that Wanted 4 writes. L22 「维护者令「必须人工决裁」撤销「有把握自己决定」」 and the human floor are intact; no ruling path is reopened to a seat. 70/70.
  • dispatch-runbook.md 〈卡线程〉 and rest-channel.md are not touched here. Verified on docs(pm-dispatch): a project-run seat form beside the Routine form — the seat post as a stub, the dispatch order in the card thread, event wake plus one patrol per project, 项目总监 → 总监席 #25385's head f08bab5c: dispatch-runbook.md L140 「派发令由 coordinator 写进卡线程开场消息,⛔ 不落共享目录;卡上派发评论留一行指针」 and rest-channel.md L62 「看板(org Project)field_values…」 are already there, as the claim foresaw (「may already be written by docs(pm-dispatch): a project-run seat form beside the Routine form — the seat post as a stub, the dispatch order in the card thread, event wake plus one patrol per project, 项目总监 → 总监席 #25385; if so, drop it and say so」). Dropping them is correct; duplicating them would have conflicted.
  • scripts/pm/check-skill-line-ratchet.mjs: a CEILINGS row project-forms.md 54 (landed count, headroom 0) and a MAX_TABLE_ROW_BYTES row 0; no other row moves. Correct.

Surface and invariants: the six changed paths are all inside the claim's file surface; no Tier H path (AGENTS.md, CLAUDE.md, docs/**, skills/**, .github/workflows/**, CODEOWNERS) is touched; references/triage-duties.md is byte-identical to the base; git grep -n 'os-bill\|hotlong\|os-elon-musk' on project-forms.md at the head returns nothing; no rule line names a login as an assignment.

Budgets: project-forms.md 54 ≤ 60 with a ceiling row; SKILL.md 319/319, seat-post-protocol.md 91/91, seat-lifecycle.md 95/96, lanes/director.md 70/70 (ceilings read from the head's CEILINGS map); widest added or edited prose line 120 bytes (four lines at exactly 120: project-forms.md L11, L38, L53 and lanes/director.md L16), the one table row 208 bytes under the 342-byte pin.

Check-runs on the head: 52, all completed, none failed. Lint · repo & tooling gates (success) runs pnpm check:pm-skill-ratchet and pnpm check:pm-skill-id-lint (lint.yml L1035, L1045); Type Check · source gates (success) runs pnpm check:skill-frame-sync and the frame-freshness self-test and scan (lint.yml L5516, L5554). Lint & Repo Gates, TypeScript Type Check, Governed Surface Queue Guard and the four card/branch guards are success; the remaining jobs are success or skipped by path filter.

Merge compatibility (read-only git merge-tree --write-tree): against #25385's head f08bab5c clean, combined SKILL.md 318 lines, lanes/director.md 70; against #25422's head 03448dbb clean, combined SKILL.md 319, lanes/director.md 87; the three heads together clean (SKILL.md 318, lanes/director.md 87, seat-lifecycle.md 95); against the current main tip 77392e90 clean, combined SKILL.md 318 against main's ceiling 318.

② Semver level

Clause-②: no, Metadata-protocol: none — consistent with the tree: no published package moves (.claude/skills/pm-dispatch/** and one ledger file under scripts/pm), so no changeset is owed and skip-changeset is the right form. Face = governed rule text ⇒ CONTRACT_REVIEW_TIER, which this record serves.

③ Boundary flags

  1. Lane words overtaken by main (for the planned follow-up commit, ⛔ not a FAIL on this head). project-forms.md L19 enumerates 「ui、skills、devx、cli、engine、services、spec、hotcrm」 exactly as the card lists them, but docs(pm-dispatch): fold the engine, services and cli lanes into domain:server #25247 landed on main after this branch's base and folded lanes/cli.md, lanes/engine.md and lanes/services.md into lanes/server.md (SKILL.md on main now reads 「domain:engine/domain:services/domain:cli 读作 domain:server」). On the merged tree three of the eight words name charter files that no longer exist and server is missing. Exact fix, line-neutral, 113 bytes: 「- 其余席位词同 lanes/〈lane〉.md 文件名:ui、skills、devx、server、spec、hotcrm。」 — ride it on the post-docs(pm-dispatch): a project-run seat form beside the Routine form — the seat post as a stub, the dispatch order in the card thread, event wake plus one patrol per project, 项目总监 → 总监席 #25385 commit the PR body already plans, and the seat re-reads that head.
  2. Two-form vocabulary left on docs(pm-dispatch): a project-run seat form beside the Routine form — the seat post as a stub, the dispatch order in the card thread, event wake plus one patrol per project, 项目总监 → 总监席 #25385 — expected absence. docs(pm-dispatch): a project-run seat form beside the Routine form — the seat post as a stub, the dispatch order in the card thread, event wake plus one patrol per project, 项目总监 → 总监席 #25385's head still carries 「承办该车道的项目即「车道项目」」 (SKILL.md L54), 「所在项目即「总监项目」」 (L56), 「席位两形:Routine 席与项目席(会话是车道项目的线程)」 (L71) and 「五项健康指标进总监项目的每日摘要」 (seat-lifecycle.md L70), the vocabulary the maintainer withdrew at 2026-10-23T12:25Z. This head cannot touch them (they are docs(pm-dispatch): a project-run seat form beside the Routine form — the seat post as a stub, the dispatch order in the card thread, event wake plus one patrol per project, 项目总监 → 总监席 #25385's hunks); the PR body commits to rewording them in one commit after docs(pm-dispatch): a project-run seat form beside the Routine form — the seat post as a stub, the dispatch order in the card thread, event wake plus one patrol per project, 项目总监 → 总监席 #25385 lands. Listed here so the seat's landing check reads that commit, not this head, as the final one. Note also seat-lifecycle.md L26 and L95 and execution-duties.md L157 on docs(pm-dispatch): a project-run seat form beside the Routine form — the seat post as a stub, the dispatch order in the card thread, event wake plus one patrol per project, 项目总监 → 总监席 #25385 say 「项目席」, which is a seat form, not a project type, and may stand.
  3. seat-lifecycle.md: a different line than the card named. The card's one-line edit for this file (「the project forms do not use the self-bound cron or the cross-wall timer chain」) was already made by docs(pm-dispatch): a project-run seat form beside the Routine form — the seat post as a stub, the dispatch order in the card thread, event wake plus one patrol per project, 项目总监 → 总监席 #25385, which deleted those three lines; this PR instead reconciles the in-flight clause of the 强制接管令 line, which the card's Wanted 5 contradicted. The chosen wording 「在飞卡归原认领者,不可达才接」 conditions the in-flight takeover on unreachability, which the card states only through its premise (a walled account); for the case the maintainer described (switching when a week's quota is spent) the two lines agree. If the maintainer means the instruction line to take in-flight cards from a reachable account too, this line is the one to loosen; nothing in the card says so today.
  4. SKILL.md L49 is a third touch. The claim's SKILL.md surface reads 「the reference-table row only, paid by one deleted line」; the in-place edit of the 〈入口与角色〉 opening line (adding 「或项目指令行 pm-dispatch 〈席位…〉」) is inside the file, line-neutral, 93 bytes, reported in the PR body and carries Wanted 2 to the entry. Recorded as a surface deviation the seat should acknowledge in its ACCEPT, not as a breach that changes the verdict.
  5. PR body line that is stale. 「cross-repo-coordination.md 规则 5 still says 「org Project 只是维护者的聚合视图」; … left for the seat」 is true of main but not of docs(pm-dispatch): a project-run seat form beside the Routine form — the seat post as a stub, the dispatch order in the card thread, event wake plus one patrol per project, 项目总监 → 总监席 #25385's head, whose follow-up commit already carries 「看板(org Project)只是维护者的聚合视图」 at L44. No action beyond correcting the body.
  6. main moved since the base. docs(pm-dispatch): fold the engine, services and cli lanes into domain:server #25247, docs(pm-dispatch): a project-coordinator reference — the cross-lane scheduling rules a Claude Code project runs by, so its instructions name only its lanes #25255 and docs(os-dev): name the harness attribution-line exemption in 〈干净收尾〉; Check Changeset reads the PR body #25393 landed after f0fdd45; the head's CI ran against the earlier main. The merge is clean and SKILL.md lands at 318 against main's 318 ceiling, but the ratchet on the merged tree has no CI reading yet; the planned merge of main after docs(pm-dispatch): a project-run seat form beside the Routine form — the seat post as a stub, the dispatch order in the card thread, event wake plus one patrol per project, 项目总监 → 总监席 #25385 produces it.
  7. The PR body's first line is the project-session attribution HTML comment, reported by the thread as a deviation from os-dev.md 〈干净收尾〉; main (docs(os-dev): name the harness attribution-line exemption in 〈干净收尾〉; Check Changeset reads the PR body #25393) now names that exemption.

Independence: the diff was produced by the card thread on branch claude/project-thread-s43tmc (session session_01UJebcS3m7vf3CYnTfBD5oH); this record is rendered by an isolated subagent and adopted by the domain:skills seat 2 session named below. Both run under the same account as the PR author, so this is the seat's CONTRACT_REVIEW_TIER record, not the cross-account record #25422 will require once it lands; the card's own acceptance says the maintainer's 「#N 可以落地」 in the seat thread stands in until then.

Implemented-by: claude/project-thread-s43tmc
Reviewed-by: session_01REMuzhz6MWRjg8uohedMnM

VERDICT: PASS

…ords follow lanes/server.md; the takeover order reaches in-flight cards unconditionally

After the merge of main (which brought #25385), the four lines that named two project types take the one-form wording the maintainer settled on 2026-10-23 12:25Z: SKILL.md's `<domain>` row 「承办它的是坐该席的车队项目」, its `director` row 「人工召唤,任一车队项目可召」, the 席位两形 bullet 「会话是车队项目的线程」, and seat-lifecycle.md's round-report line 「五项健康指标进总监席的每日摘要」. 「项目席」 (a seat form) stays.

project-forms.md L19: the seat words now read 「ui、skills、devx、server、spec、hotcrm」 — main folded lanes/cli.md, lanes/engine.md and lanes/services.md into lanes/server.md after this branch's base (seat review ③-1). seat-lifecycle.md L28: the maintainer's takeover order takes in-flight cards as the card's Wanted 5 says, with no reachability condition, and waits for no note from the previous claimer (seat review ③-3).

All six edits in place and line-neutral; every edited prose line ≤120 bytes; SKILL.md 318/318 on the merged tree.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UJebcS3m7vf3CYnTfBD5oH
@objectstack-fleet

Copy link
Copy Markdown
Contributor

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 91e8600b55d9a61499653cf13c64795992fdab9a
Local-runs: none
Scope: .claude/skills/pm-dispatch/SKILL.md, .claude/skills/pm-dispatch/references/project-forms.md, .claude/skills/pm-dispatch/references/seat-post-protocol.md, .claude/skills/pm-dispatch/references/seat-lifecycle.md, .claude/skills/pm-dispatch/references/lanes/director.md + scripts/pm/check-skill-line-ratchet.mjs (the two added rows), references/execution-duties.md L82–L84, references/coordinator.md L10–L13, references/dispatch-runbook.md L140–L142 and .claude/agents/os-dev.md rule 1 (rulings 1A/2A of #25379), references/lanes/ (file list), .github/workflows/lint.yml (gate-to-job mapping), and the merge-tree results against #25422 head f779162f367e6b036ce489937f1af13464b33c3f and origin/main

Delta review written 2026-10-23T15:15Z by an isolated reviewer of the domain:skills seat 2 session, on top of the PASS record for b91d5d64232da3a128147a862fd463f0da11bd9e (comment 6366112222, 2026-10-23T13:33Z). Inputs: card #25412 with its 2026-10-23T12:25Z and 2026-10-23T12:27Z amendments, the seat claim (comment 6365006609), the maintainer ruling on #25379 (comment 6363872862), the two commits since the prior head (7dd4eb6118 merge of origin/main at 6c2699b3f4; 91e8600b55 follow-up), the head's check-runs. The PR body's self-assessment was not trusted; every claim below was re-derived from the committed tree with read-only git. Angle brackets are written as 〈 〉 so the sanitizer keeps them.

① Derived judgments

Merge commit 7dd4eb6118. Parents b91d5d6423 and 6c2699b3f4. git merge-tree --write-tree on those parents yields tree 5534517e04b8f4e09275d5763a7130cf9e7bc4bc, byte-identical to the merge commit's tree: no hand-resolved conflict, nothing from #25385 or any other main commit altered or dropped. git diff --stat 6c2699b3 7dd4eb61 is exactly the prior head's diff (6 files, +67 −6); the merge adds nothing of its own. Correct.

Follow-up commit 91e8600b55 (3 files, +6 −6, every edit in place and line-neutral):

  1. SKILL.md L54 〈domain〉 row: 「承办该车道的项目即「车道项目」」 → 「承办它的是坐该席的车队项目」 (137-byte table row, under the 341-byte pin). The row still says who runs the lane seat; only the two-type vocabulary goes. Correct.
  2. SKILL.md L56 director row: 「人工召唤;所在项目即「总监项目」;三职与章程见…」 → 「人工召唤,任一车队项目可召;三职与章程见…」 (136 bytes). Human summon kept, the 三职 pointer kept, the 12:25Z amendment carried. Correct.
  3. SKILL.md L71 席位两形 bullet: 「会话是车道项目的线程」 → 「会话是车队项目的线程」. The two seat forms (Routine 席 / 项目席) and the pointer to seat-lifecycle.md are unchanged. Correct.
  4. seat-lifecycle.md L70: 「五项健康指标进总监项目的每日摘要」 → 「…进总监席的每日摘要」. The five indicators still flow to the digest; only the owner word changes from a project type to the seat. Correct.
  5. project-forms.md L19: 「ui、skills、devx、cli、engine、services、spec、hotcrm」 → 「ui、skills、devx、server、spec、hotcrm」. references/lanes/ on this head holds exactly devx.md director.md hotcrm.md server.md skills.md spec.md triage.md ui.md, so the enumeration now matches the file names it claims to mirror (prior ③-1 resolved). Correct.
  6. seat-lifecycle.md L30: 「维护者强制接管令取席位、队列、未起工卡与待落地 PR;在飞卡归原认领者,不可达才接」 → 「维护者强制接管令取席位、队列、在飞卡、未起工卡与待落地 PR;⛔ 不等原认领者注记」 (118 bytes). This is the card's Wanted 5 verbatim in meaning (「covers in-flight cards … never waits for a walled account」) and now agrees with project-forms.md L37–L38 「指令行即维护者强制接管令,含在飞卡」 / 「接管永不等它的注记或简报」 (prior ③-3 resolved). Compatibility with execution-duties.md L82 「认领人不可达(token 耗尽/会话结束/身份退役)⇒ 接管:一条评论四件齐,⛔ 不判死活」: that line is a seat-initiated takeover whose trigger is unreachability; L30 is the maintainer's order, which needs no trigger. Both route through the same four-item comment (L83–L84: cross-account Release: with 出处三件, assignee swap, new Claim: with branch and sha), so the two are a trigger and a superset trigger sharing one shape, not a contradiction. coordinator.md L13 is a different matter, see ③-1.

git grep '车道项目\|总监项目' -- .claude/skills on the head: no hit. 「项目席」 remains at SKILL.md L71–L72, coordinator.md L3, execution-duties.md L157, seat-lifecycle.md L26/L70/L95, seat-post-protocol.md L13 — a seat form, not a project type, as the prior record anticipated.

Rulings 1A / 2A on #25379 (comment 6363872862) still hold. 1A: dispatch-runbook.md L140–L142 (「派发令由 coordinator 写进卡线程开场消息…」, 「coordinator 开线程即读线程分支交席位…」, 「席位写 assignee+pm:dispatched+带该 Branch: 的认领…」) and .claude/agents/os-dev.md L31 「卡线程分支由平台指定、harness 推送,⛔ 不推空分支」 are byte-identical between 6c2699b3 and the head (diff empty). 2A: SKILL.md L75 「分诊席跑直连会话、默认判断档;直连会话按召唤跑,⛔ 无自醒不常驻;裁决归总监席」 is untouched; the edited L71 bullet keeps 「Routine 席与项目席」 and does not reopen a self-wake for direct sessions; lanes/director.md L7 「直连 ⛔ 无 Routine/cron」 (prior head) is unchanged by the follow-up.

Budgets on the head (ceilings read from the head's CEILINGS map): SKILL.md 318/318 (main lowered it from 319 via #25247; the merge lands at the ceiling), project-forms.md 54/54, seat-post-protocol.md 91/91, seat-lifecycle.md 95/96, lanes/director.md 70/70. Widest added or edited line over the base 6c2699b3: 120 bytes in prose (project-forms.md L11/L38/L53, lanes/director.md L16); the three lines above 120 are all SKILL.md table rows (137, 136, 208 bytes) under the 341-byte MAX_TABLE_ROW_BYTES pin for SKILL.md. The ratchet rows for project-forms.md (54, 0) are unchanged from the prior head; no other row moves.

Surface and invariants: the six changed paths (git diff --stat 6c2699b3 91e8600b: 6 files, +71 −10) are inside the claim's file surface plus the SKILL.md in-place edits already recorded as a deviation in the prior record (③-4). No Tier H path (AGENTS.md, CLAUDE.md, docs/**, skills/**, .github/workflows/**, CODEOWNERS). references/triage-duties.md is byte-identical to 6c2699b3. git grep -n 'os-bill\|hotlong\|os-elon-musk' -- .claude/skills/pm-dispatch/references/project-forms.md: no hit. lanes/director.md L22 「维护者令「必须人工决裁」撤销「有把握自己决定」;⛔ 无裁决线程、代裁、置信门」 intact.

Check-runs on the head (read 2026-10-23T15:15Z): Lint · repo & tooling gates success — on this head's lint.yml that job (L535–L2027) runs pnpm check:pm-skill-ratchet (L1035), pnpm check:pm-skill-id-lint (L1045) and pnpm check:pm-governed-prose (L1553); Type Check · source gates success — runs pnpm check:skill-frame-sync (L5516) and the frame-freshness self-test and scan (L5554). TypeScript Type Check, Governed Surface Queue Guard, Check Documentation Links, the four card/branch guards, Lint · PM dispatch-gates, Lint · ESLint, Lint · docs & code guards, Lint · CI, release & engine gates, Type Check · workspace/debt ledger/consumer gates, Dogfood Regression Gate, Test Core 1–6/6: success; the rest skipped by path filter. ③-5 carries the final reading taken before posting.

Merge compatibility (read-only git merge-tree --write-tree): against #25422's current head f779162f (card #25414) clean, combined SKILL.md 318, seat-lifecycle.md 95, lanes/director.md 87 (#25422's raise); against the current origin/main tip 17ef0327 clean, combined SKILL.md 318 against the 318 ceiling.

② Semver level

Clause-②: no, Metadata-protocol: none — unchanged and still consistent with the tree: nothing under a published package moves (.claude/skills/pm-dispatch/** and one ledger file under scripts/pm), so no changeset is owed and skip-changeset is the right form. Face = governed rule text ⇒ CONTRACT_REVIEW_TIER, which this record serves.

③ Boundary flags

  1. coordinator.md L13 predates the unconditional takeover (outside this claim's surface, ⛔ not a FAIL). references/coordinator.md L12–L13 (from docs(pm-dispatch): a project-coordinator reference — the cross-lane scheduling rules a Claude Code project runs by, so its instructions name only its lanes #25255) read 「一条车道恒归一个项目:车道任一座位贴 🟢 标着另一项目 ⇒ 车道已有主,⛔ 不坐别席」 and 「另一项目在飞卡由其席跟完,其收班简报在即可坐」 — the no-order default, written before the card. With seat-lifecycle.md L30 and project-forms.md L37–L38 now saying the instruction line is the order and waits for nothing, a coordinator applying SKILL.md L45 「两条细则冲突 ⇒ 按更严的一条行动并立卡」 could still pick the wait. coordinator.md is not in the claim's file surface and the card's 「Edits elsewhere」 does not name it, so this head is correct as scoped; one-line follow-up for the seat (in place, ≤120 bytes): 「仲裁者是座位贴,⛔ 不是项目记忆;另一项目在飞卡由其席跟完;维护者指令行改写 ⇒ 按 project-forms.md 接管。」
  2. Prior ③-1 and ③-3 are closed by this head (L19 lane words; L30 unconditional in-flight takeover). Prior ③-2 (two-form vocabulary on docs(pm-dispatch): a project-run seat form beside the Routine form — the seat post as a stub, the dispatch order in the card thread, event wake plus one patrol per project, 项目总监 → 总监席 #25385) is closed by the four rewrites. Prior ③-5 (stale body sentence about 规则 5) is corrected in the current body. Prior ③-6 (main moved, no CI reading on the merged tree) is closed: the head's check-runs ran on the merged tree.
  3. PR author is the login, not the fleet bot. The PR was opened through the GitHub MCP by the project thread, so user.login is os-elon-musk rather than objectstack-fleet[bot]; the body's first line carries the project-session attribution block and the body reports both as deviations. Recorded, not a FAIL; the seat's ACCEPT should acknowledge it.
  4. SKILL.md carries five in-place touches on this head (L49, L54, L56, L71 plus the index row and the one deletion) where the claim's surface read 「the reference-table row only」. L54/L56/L71 are the one-form rewrites of docs(pm-dispatch): a project-run seat form beside the Routine form — the seat post as a stub, the dispatch order in the card thread, event wake plus one patrol per project, 项目总监 → 总监席 #25385's lines the card's 12:25Z amendment demands and the PR body foresaw; the surface deviation recorded at prior ③-4 widens by those three rows and stays a deviation to acknowledge, not a breach.
  5. Check-runs completed before posting. When the tree reading above was taken, Test Core (1/6) and Lint · scoped · tooling self-tests were still in_progress and the aggregate Lint & Repo Gates and Test Core jobs had not yet appeared. Re-read at 2026-10-23T15:15Z: 47 check-runs on 91e8600b, all completed, conclusions only success or skipped (Lint & Repo Gates, TypeScript Type Check, Test Core and Test Core (1/6) success). The head carries no pending or failed check.
  6. Independence pair unchanged: both the implementing thread and the adopting seat run under the same account as the PR author, so this is the seat's CONTRACT_REVIEW_TIER record and not the cross-account record docs(pm-dispatch): Tier S landed from a project needs a review of record by another account; the 分诊席 shrinks to bare cards; decision cards stay in their repo and the 总监席 scans every repo #25422 will require once it lands; until then the maintainer's 2026-10-23T14:14Z authorization in the seat thread (「按 pm-dispatch 复核通过的 PR 都可以落地」) stands in, as the card's acceptance says.

Independence: the diff was produced by the card thread on branch claude/project-thread-s43tmc (session session_01UJebcS3m7vf3CYnTfBD5oH); this record is rendered by an isolated subagent and adopted by the domain:skills seat 2 session named below.

Implemented-by: claude/project-thread-s43tmc
Reviewed-by: session_01REMuzhz6MWRjg8uohedMnM

VERDICT: PASS

@objectstack-fleet

Copy link
Copy Markdown
Contributor

席位核对

ACCEPT · domain:skills#2 · os-elon-musk · session_01REMuzhz6MWRjg8uohedMnM · 2026-10-23T15:17Z · head 91e8600b55d9a61499653cf13c64795992fdab9a · Tier S (check-governed-merges.mjs --pr 25427: .claude/** and one scripts/pm ceiling file, no Tier H path, +71 / −10)

Landing authority: the maintainer's own standing word in this seat's thread of the Claude Code project "Objectstack" (os-elon-musk account), 2026-10-23T14:14Z: 「后续按 pm-dispatch 规则审核通过的都可以落地」. This PR is Tier S and passed review under pm-dispatch, so it falls inside that word.

  1. Shape: draft, base main, Fixes #25412 the only closing keyword, skip-changeset (.claude/** and a ratchet ceiling row; no package).
  2. Premise measured: the card quotes the maintainer's words of 2026-10-23 with the 12:25Z (one project form) and 12:27Z (the instruction line 「pm-dispatch <席位…>」 is the summon) amendments.
  3. Gates (check-runs pinned to this head): 47 check-runs, all completed, none failed.
  4. Contract review: CONTRACT_REVIEW_TIER PASS on this head, record 6368204690; it carries forward the PASS on b91d5d64 (6366112222), whose ③ notes 1, 2, 3, 5 and 6 this head closes.
  5. Accepted deviations: SKILL.md is touched in place beyond the claim's 「reference-table row only」 (L49 summon clause, L54/L56/L71 one-form rewrites), all line-neutral; lanes/director.md two lines instead of one (needed so the stricter-rule clause does not switch off the 总监席's project routines). The PR was opened through GitHub MCP, so its author is the personal login, not objectstack-fleet[bot]; card pm-dispatch: card threads write to GitHub only through the relay (pr_create and the other ops), never GitHub MCP; the dispatch order carries that line verbatim; review flags a PR not authored by the fleet bot (maintainer's word 2026-10-23) #25457 writes the rule that closes that path.
  6. Out of scope, carried: references/coordinator.md L12–L13 still reads 「另一项目在飞卡由其席跟完…」 next to this PR's unconditional takeover (record ③-1); it rides card pm-dispatch: card threads write to GitHub only through the relay (pr_create and the other ops), never GitHub MCP; the dispatch order carries that line verbatim; review flags a PR not authored by the fleet bot (maintainer's word 2026-10-23) #25457 or a follow-up S card. docs(pm-dispatch): Tier S landed from a project needs a review of record by another account; the 分诊席 shrinks to bare cards; decision cards stay in their repo and the 总监席 scans every repo #25422 (card 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) merges main after this lands.
  7. Landing: merges cleanly onto main ab510f42e7 (git merge-tree, no conflict). This seat flips ready and arms auto-merge now.

Generated by Claude Code

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/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants