Repository navigation
Commit 5497d4a
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)
<!-- claude-projects-attribution: {"github_login":"os-elon-musk"} -->
_Requested by **Elon** · [project
thread](https://claude.ai/code/project/chan_01WedDzV26nniwxv7jC88B9D?thread=cmsg_01WedDzV26nniwxv7jC88B9DT9BzcHzTUTCpkAMQnkTEXC)_
Fixes #25414
Clause-②: no
Metadata-protocol: none
## 维护者速读(草稿)
- **改了什么**:把您 2026-10-23 在「车队机制迁往 Projects」线程的话写进 pm-dispatch 六个细则文件。①
项目席落地 Tier S 的前提多一条:契约复核记录的 `Reviewed-by:` 会话必须属于 PR 作者之外的账户(记录另带一行
`Reviewed-by-account:` 写复核账户的 login,须异于 PR 正文 attribution 的
github_login,与 #25415 队列守卫读的键一致);同账户的隔离子代理只算复核、不作落地记录;只动散文面的 PR
同样欠另一账户一条 TIER_DEFAULT 记录;过渡期没有另一账户在席时,替代是您本人在执行线程的话:逐个点名 PR 编号,或对该席位的
Tier S 长期授权(一句可撤;批 #7 卡 2 裁定 A)。② `pm:mailbox` 信箱 PR 不欠 CI、永不入队、台账查询排除。③
每个项目的巡查多一项:扫 `needs:contract-review` 的 open PR、剔除本账户署名的、留 Claim
形评论再复核、PASS 同笔摘标;总监席摘要列等候逾 24 小时的 PR。④ 分诊席缩为薄席:只做 objectstack、objectui
两仓裸卡的首触定级与路由、跨车道查重,只写标签与审计评论;半标卡归所属车道席补齐;应用仓无分诊席;发版板、pin
链、决策箱勤务移到总监席章程,fork PR 扫描与 hold 解锁重验移到车道巡查。⑤ 决策卡留在立卡仓,总监席扫全部仓的
`needs-user-decision` 按批呈您;pin 链扩到每个应用仓;新仓清单加 GOVERNED_REPOS、车队
App、车道宪章文件。
- **为什么改**:您的原话(卡 #25414
正文):「分诊不忙不如留给总监管」(12:08Z)、「为什么我们需要区分项目类型?任何一个项目中都可以召唤总监啊,任何一个项目中也可以召唤分诊」(12:25Z)、「你立卡并派发处理所有相关任务,跟踪落地」(12:13Z)。实测依据:06:04Z
至 06:16Z 三个席位的落地只在您本人逐个点名 PR 时放行;#25363 由另一账户复核后作者席位一分钟内自落,无人点名。
- **风险与代价(含回滚)**:纯规则文本;triage-duties.md 120→103 行,lanes/director.md
70→87 行,其余五个文件净零;棘轮以跨文件迁移申报付账,总上限不升;一次 revert 可回。两处要您知道:① 本 PR 在
#25412(项目形态,写 `project-forms.md`)之后落地,#25412 已先合入,main 已并进本
PR,lanes/director.md 的 project-forms.md 指针与「直连无 Routine」那行核对后无需再改;②
分诊席的人工决裁底线(风险判据、工作量判据、人工地板、不呈清单)原文未动。
- **席位意见**:席位增量复核 PASS(评论 6369430152,head 3e07aa8):FAIL-1 已按原句修正;裁定 A
原句逐字写入;47 项检查全部通过或跳过。同账户记录只算复核,落地依据是您 14:14Z 在席位线程的长期授权;过时的席外文字由 #25490
跟进。
- **你要做的(一个动作)**:无。您 15:55Z 的「25422 同意」已裁定过渡行,席位对新 head 增量复核 PASS、CI
全绿后,按您 14:14Z 在席位线程给的长期授权落地,不必再点名。本 PR 写的规则(另一账户的复核记录即放行)要等它自己合入才生效。
## What changed
Seven files under `.claude/skills/pm-dispatch/references/**` plus the
ceiling rows in `scripts/pm/check-skill-line-ratchet.mjs`; rule text
only; every edited line is at or under 120 bytes.
| File | Before | After |
|:--|:--|:--|
| `contract-review.md` 独立性对 (48 → 54, ceiling 60) | the pair is read off
`--template` | +3: a project seat's Tier S landing needs a
`Reviewed-by:` from an account other than the PR author's: the record
carries a `Reviewed-by-account:` line (the reviewing session's login)
beside `Reviewed-by:`, and it must differ from the PR body attribution
`github_login` (the same key and comparison the #25415 queue guard
reads); a same-account isolated subagent is a review, not the record; a
prose-only PR owes one cross-account `TIER_DEFAULT` record. +2 beside
落地前检: ① gains the account condition for project seats; the interim rule
while no other account is seated is the maintainer's own words in the
executing thread, either naming each PR number or a standing Tier S
authorization for that seat, revocable by one sentence (batch 7 item 2,
letter A, on the card; the line wraps once, 53 → 54). The card names
`landing-operations.md` for item 2, but the 落地前检两条 lines live here since
the rules-only rewrite, so the text went where the rule is |
| `landing-operations.md` 入队与落地 (101, net 0) | — | +1 `pm:mailbox`: owes
no CI, never queued, excluded from the landing ledger and orphan-PR
queries; paid by folding 「外部评审链降为可选事后审计」 into the design-fork line |
| `dispatch-runbook.md` (241, net 0) | 〈座位贴活性巡查(分诊轮常设项)〉, six lines run
by the triage Routine | 〈巡查常设项(每项目巡查与总监席摘要)〉: seat-post liveness goes to
the 总监席 digest (3 lines, same tests); the cross-account review pass (3
lines: the `is:pr is:open label:needs:contract-review` query minus this
account's attribution, the `Claim:`-shaped comment before reviewing,
review per `contract-review.md`, strip the marker on PASS, the digest
lists PRs waiting over 24 h); the lane patrol takes hold/closed
re-validation and the fork-PR sweep (1 line). Paid by merging two 读数成本
lines. 〈分诊两级盘点细则〉: 四仓 → 两仓; `Restart-when:` batch scan → lane patrol,
inbox back-fill → 总监席; sweep disjuncts ①②③ → ①② |
| `triage-duties.md` (120 → 103) | the full triage duty list | the seat
keeps bare-card first touch and cross-lane dedupe; disjunct ② stays
(queue label, no domain), the half-labelled ③④ go to the owning lane
seat; 全仓 → 两仓; the fork-PR sweep, the pin chain (6), the decision-inbox
duties (3), the closed/`Restart-when:` re-validation (2) and the release
board (5) leave; line 5 names where the release board and pin chain went
(总监席 digest, details now in `lanes/director.md`) and that the in-flight
liveness re-check goes to the same digest with its details staying here.
Lines 95–120 (人工地板, 风险判据, 工作量判据, 不呈 list, 例外一/二) are untouched |
| `lanes/triage.md` (7, net 0) | pickup alternation and the starvation
guard | summoned by the maintainer's sentence into any project, by
default beside the 总监席; labels and audit comments only, no PR, no claim;
scope = objectstack/objectui bare cards + cross-lane dedupe, app repos
have no triage seat; the alternation, 4 h starvation guard,
no-second-seat and no-frequency-change rules kept |
| `lanes/director.md` (70 → 87) | 决裁勤务 inbox line | +1 授权与形态: the 分诊席 is
summoned beside this seat by default, its hourly run may share the inbox
scan. 职责二 +2: the inbox is every repo's `needs-user-decision`, cards
stay in the repo they were filed in; the two 入箱勤务 lines moved from
triage-duties. New 职责四 (+12): the daily digest line (in-flight /
awaiting ruling / awaiting landing / wall notes, PRs waiting over 24 h
for review, release board, pin lag, cardless fork PRs); seat-post and
in-flight liveness; the release board (5 lines moved, main-repo producer
now this seat); the pin chain (3 lines, extended to every app repo); the
roster regenerated by the digest, pointing at `project-forms.md`
(sibling card #25412) |
| `cross-repo-coordination.md` (51, net 0) | 「决策收件箱按仓:平台在 objectstack /
objectui,元数据项目在本仓」 | 「决策卡留在立卡仓,总监席扫全部仓 `needs-user-decision` 呈批」; the
new-repo checklist gains `GOVERNED_REPOS`, the fleet App and the lane
charter file, and names 「应用仓无分诊席」; paid by merging the 准入 and
hotcrm-charter lines |
| `scripts/pm/check-skill-line-ratchet.mjs` | — | `triage-duties.md` 120
→ 103, `lanes/director.md` 70 → 87, declared as one CROSS_FILE_MOVE
(destination director.md, was 70; source triage-duties.md, was 120): +17
against a net source decrease of 17, map total unchanged |
Acceptance checks on this head: `git grep -n '决策收件箱按仓' --
.claude/skills` → no hit; `git grep -n 'os-bill\|hotlong\|os-elon-musk'
-- .claude/skills/pm-dispatch/references/` → no hit; no rule line names
a login.
## Line budget
| File | Lines | Ceiling | Net |
|:--|--:|--:|--:|
| `references/contract-review.md` | 54 | 60 | +6 (headroom was 12) |
| `references/landing-operations.md` | 101 | 101 | 0 (+1 −1) |
| `references/dispatch-runbook.md` | 241 | 241 | 0 (+1 −1, 4 edited in
place) |
| `references/triage-duties.md` | 103 | 103 (was 120) | −17 |
| `references/lanes/triage.md` | 7 | 7 | 0 (rewritten) |
| `references/lanes/director.md` | 87 | 87 (was 70) | +17 (cross-file
move) |
| `references/cross-repo-coordination.md` | 51 | 51 | 0 (+1 −1, 1
edited) |
`SKILL.md` untouched by this PR (318/318 after the `main` merge that
brought #25427). Widest edited line 120 bytes.
## Gates
On `3e07aa8` (after merging `main` with #25427): `pnpm
check:pm-skill-ratchet` ✓ (self-test 164 cases; declared cross-file
moves 3, total ceilings down 488; every covered file at or under its
ceiling), `pnpm check:pm-skill-id-lint` ✓ (87 files clean), `pnpm
check:skill-frame-sync` ✓, `pnpm check:skill-frame-freshness` ✓,
`scripts/check-commit-card-trailers.mjs --range origin/main..HEAD` ✓. No
published package moves (`.claude/**` and one ceiling file), so
`skip-changeset`.
## Ordering and open PRs
- Lands after #25412 (sibling card, `project-forms.md`): its PR merged
first and `main` is merged in here (clean, no conflict). The two spots
re-read after that merge need no edit: the `project-forms.md` pointer in
`lanes/director.md` 职责四 now resolves to the file that card added, and
the 授权面 line on `main` already reads 「直连 ⛔ 无 Routine/cron」, which leaves
the project-run 总监席's hourly inbox scan and daily digest
(`project-forms.md` 例行) intact. Post-merge counts: `SKILL.md` 318,
`lanes/director.md` 87, `seat-lifecycle.md` 95.
- Open PRs on the same tree at push time: #25385 (`dispatch-runbook.md`
〈卡线程〉 L141–L142, `lanes/director.md` L1), #25255 (new `coordinator.md`,
runbook L136), #25247 (lane files). This PR touches none of their hunks
(runbook L39–L46, L52–L53, L64, L69–L70; director.md L22, L51, L68).
## Acceptance notes
- The card's acceptance names a `record-recognisers.mjs --template` run
that shows where the account line goes;
`scripts/pm/record-recognisers.mjs` is outside this claim's file surface
(devx S card, same stroke as the queue-guard check). Until that lands,
the reviewer adds the `Reviewed-by-account:` line by hand beside
`Reviewed-by:`, as `contract-review.md` now says; the key name is the
one the #25415 queue guard reads, so the two PRs agree without waiting
for the template change.
- `seat-post-protocol.md` 发版板运维 still reads 「生产者:主仓归分诊座位」;
`seat-lifecycle.md` 〈座位贴协议〉 still says the triage round releases a
silent claim, and its 轮次报告 line still counts disjunct ④. All three files
are outside this claim's surface (and #25385 edits the first two);
one-line follow-ups for the seat: 「主仓归总监席」, 「由总监席摘要一笔中继释放」, 「析取④ →
车道席补齐」.
- The 在飞活性复查 lines (knock, `RECLAIM_AFTER_HOURS`, `Release:`) stay in
`triage-duties.md` because `seat-lifecycle.md` points there; line 5 of
that file names the 总监席 digest as the run that executes them.
- 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.
Governed surface `.claude/**` (Tier S): draft, awaiting the seat's
`CONTRACT_REVIEW_TIER` review and the maintainer's word; ⛔ not to be
flipped ready, queued or armed by this thread.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_011XvnQKt7WvdyvD2X4DLc8R
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent c5cbf7f commit 5497d4a
8 files changed
Lines changed: 80 additions & 46 deletions
File tree
- .claude/skills/pm-dispatch/references
- lanes
- scripts/pm
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
32 | 32 | | |
33 | 33 | | |
34 | 34 | | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
35 | 38 | | |
36 | 39 | | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
37 | 43 | | |
38 | 44 | | |
39 | 45 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
9 | 9 | | |
10 | 10 | | |
11 | 11 | | |
12 | | - | |
13 | | - | |
| 12 | + | |
| 13 | + | |
14 | 14 | | |
15 | 15 | | |
16 | 16 | | |
| |||
24 | 24 | | |
25 | 25 | | |
26 | 26 | | |
27 | | - | |
| 27 | + | |
28 | 28 | | |
29 | 29 | | |
30 | 30 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
36 | 36 | | |
37 | 37 | | |
38 | 38 | | |
39 | | - | |
| 39 | + | |
40 | 40 | | |
41 | | - | |
42 | | - | |
43 | | - | |
44 | | - | |
45 | | - | |
| 41 | + | |
| 42 | + | |
46 | 43 | | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
47 | 48 | | |
48 | 49 | | |
49 | 50 | | |
50 | 51 | | |
51 | 52 | | |
52 | | - | |
53 | | - | |
| 53 | + | |
54 | 54 | | |
55 | 55 | | |
56 | 56 | | |
| |||
61 | 61 | | |
62 | 62 | | |
63 | 63 | | |
64 | | - | |
| 64 | + | |
65 | 65 | | |
66 | 66 | | |
67 | 67 | | |
68 | 68 | | |
69 | | - | |
70 | | - | |
| 69 | + | |
| 70 | + | |
71 | 71 | | |
72 | 72 | | |
73 | 73 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
| 8 | + | |
8 | 9 | | |
9 | 10 | | |
10 | 11 | | |
| |||
15 | 16 | | |
16 | 17 | | |
17 | 18 | | |
18 | | - | |
19 | | - | |
| 19 | + | |
20 | 20 | | |
21 | 21 | | |
22 | 22 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
20 | 20 | | |
21 | 21 | | |
22 | 22 | | |
| 23 | + | |
23 | 24 | | |
24 | 25 | | |
25 | 26 | | |
| |||
48 | 49 | | |
49 | 50 | | |
50 | 51 | | |
51 | | - | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
52 | 55 | | |
53 | 56 | | |
54 | 57 | | |
| |||
65 | 68 | | |
66 | 69 | | |
67 | 70 | | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
68 | 85 | | |
69 | 86 | | |
70 | 87 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
4 | | - | |
5 | | - | |
6 | | - | |
7 | | - | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
5 | | - | |
| 5 | + | |
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
10 | | - | |
| 10 | + | |
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
14 | | - | |
15 | | - | |
| 14 | + | |
| 15 | + | |
16 | 16 | | |
17 | 17 | | |
18 | | - | |
19 | | - | |
| 18 | + | |
| 19 | + | |
20 | 20 | | |
21 | 21 | | |
22 | 22 | | |
23 | | - | |
24 | 23 | | |
25 | 24 | | |
26 | | - | |
27 | | - | |
28 | | - | |
29 | | - | |
30 | | - | |
31 | | - | |
32 | 25 | | |
33 | 26 | | |
34 | 27 | | |
| |||
50 | 43 | | |
51 | 44 | | |
52 | 45 | | |
53 | | - | |
54 | | - | |
55 | | - | |
56 | 46 | | |
57 | 47 | | |
58 | 48 | | |
| |||
72 | 62 | | |
73 | 63 | | |
74 | 64 | | |
75 | | - | |
76 | | - | |
77 | 65 | | |
78 | 66 | | |
79 | 67 | | |
| |||
87 | 75 | | |
88 | 76 | | |
89 | 77 | | |
90 | | - | |
91 | | - | |
92 | | - | |
93 | | - | |
94 | | - | |
95 | 78 | | |
96 | 79 | | |
97 | 80 | | |
| |||
0 commit comments