Repository navigation
Commit e073455
docs(pm-dispatch): every card carries a business rationale the 分诊席 judges, every card is triaged (pre-applied labels are a suggestion), and a seat verifies a card's premise before dispatch (#25552)
<!-- claude-projects-attribution: {"github_login":"os-elon-musk"} -->
_Requested by **Elon** · [project
thread](https://claude.ai/code/project/chan_01WedDzV26nniwxv7jC88B9D?thread=cmsg_01WedDzV26nniwxv7jC88B9DUiuRwAvJHZThcC1wdYPpPe)_
Fixes #25507
Clause-②: no
Metadata-protocol: none
## 维护者速读(草稿)
- **改了什么**:把您 2026-10-23 16:43–16:45Z 的三句话写进
pm-dispatch:①「我说的是业务需求上的合理性,谁来判断」+「立卡」⇒
立卡门从三答变四答,多一栏「业务理由」(谁受益、什么场景、不做会怎样);分诊首触先读它,三个出口:清楚且合北极星方向 ⇒
照常定级入队;缺失或站不住 ⇒ `Triage: returned` 退回立卡人补,卡留 `finding`、不入队,分诊 ⛔ 不代写、⛔
不因此关卡;涉及产品取舍或方向不明 ⇒ `needs-user-decision`,由总监席按批呈您;批量立卡(一次 ≥10 张)审计评论带
`Batch-of:`,总监席每源抽 ≤5 张给您过目。②「分诊应该所有卡都分诊,因为有的车道在立卡的时候就打上了标签」⇒
预贴的标签只算建议,`pm:queue`/`priority:*`
只由分诊首触落笔;与建卡同分钟出现的队列/级别标签视作未分诊;无分诊审计评论的卡不是候选、不得认领;skills 车道「finding
自分诊」的例外撤销;单车道仓(hotcrm 等)席位自己做的首触也含业务理由。③「并且立刻派发」所批的派发前核实 ⇒
席位派发前起只读子代理核实前提(卡线程卡在交候选之前做):成立 ⇒ 派;不成立但改法明确(目标不变,只换落点或修法)⇒
评论记改法与读数、改正文,再派;判不了 ⇒ 入决策箱,不占卡线程槽;砍范围、降级、关卡仍是卡的命运,归人工地板。
- **为什么改**:现状没有人判断需求合不合理,卡的来源写什么就当什么;卡线程发现前提不成立时已经占了一个名额。两条都是您 16:43Z
起在项目聊天里点的。
- **风险与代价(含回滚)**:纯规则文本;`filing-gate.md` 64→68、`dispatch-runbook.md`
241→245 两处抬上限引您的原话,其余七个文件就地改、行数不变;人工决裁底线(`triage-duties.md` 末 26
行)逐字节未动;一次 revert 可回。要您知道的三处:(a) 本 PR 改写了 #25422
一分钟前落地的一行「半标卡归所属车道席补齐」,析取 ③④ 回到分诊席,依据是您 16:44:57Z 的原话,不是静默覆盖;(b)
SKILL.md 域车道「例外二」(自贴标签且三件齐 ⇒ 执行席直接认领)被撤,它不是批 #3 保留的那条「例外二」(那条是门禁翻
report-only,原文未动);(c)
应用仓没有分诊席,业务理由由仓席自己在首触里读,立卡人与判断人可能是同一席,您若要独立一眼,得把分诊席扩到应用仓,那是另一张卡。
- **席位意见**:席位契约复核两轮,首轮 6377274688 唯一 FAIL(全预贴卡没有 sweep 人口)已修,次轮
6377468190 在 head c9dae42 上 **PASS**,CI 47 项全绿;复核同时提醒:应用仓无分诊席(上面
(c))、`Premise:` 行未进 SKILL.md 认领模板(一行后续)、卡 #25490 派发前应重读正文(其六项中两项已被本 PR
做空)。
- **你要做的(一个动作)**:无。您 14:14Z 已在 Skills 席位线程授权「后续按 pm-dispatch
规则审核通过的都可以落地」;复核已 PASS、CI 全绿,现受您 2026-10-24
00:00Z「准备发版本,暂停合并新的pr」约束,解冻后由席位落地。
## What changed
Nine files: eight rule-text files under `.claude/skills/pm-dispatch/**`
and two ceiling rows in `scripts/pm/check-skill-line-ratchet.mjs`. Every
edited rule line is at or under 120 bytes.
| File | Before | After |
|:--|:--|:--|
| `references/filing-gate.md` 立卡门 (64 → 68) | 「POST 前正文答三件:类别
①–④、动手的读者、查重查询与命中数(含 closed)」; ③ and ④ on two lines | 四件
(类别、业务理由、动手的读者、查重查询与命中数); +5 lines: the field (who benefits, the
scenario, the cost of not doing it; ③ answers with the maintainer's
words, ④ inherits the parent; triage never writes it for the filer), the
three triage exits (clear and on the North-Star direction ⇒ queue;
missing or not holding ⇒ `Triage: returned`, card kept `finding`,
re-read after the body changes, never written for them and never closed
on it; a product trade-off or unclear direction ⇒ `needs-user-decision`,
the 总监席 presents it), and the batch rule (≥10 cards at once ⇒
`Batch-of:` on the audit comment, the 总监席 samples ≤5 per source to the
maintainer). Paid in place: ③ and ④ merged onto one line (110 bytes) |
| `references/triage-duties.md` (103 → 103) | 析取 ② only; 「有 `domain:*` 无
pm-state,或 … 无 `priority:*` 的半标卡,归所属车道席补齐」 (#25422);
「自贴卡抽查:…同分钟,逐张核车道、补齐三件」; 「skills 车道 finding 由该席自分诊,全仓轮跳过」; pointer
「三答与配额见 filing-gate.md」 | 析取 ③ and ④ back on the triage seat with ②'s
two-minute window; L17 「析取 ⑤:窗内新建且 `pm:queue`/`priority:*`
与建卡同分钟,照未分诊首触;⛔ 不凭 actor」 (the same-minute rule with its own sweep
population; review fix `c9dae42` after FAIL-1 of 6377274688; the
「预贴标签只是建议」 clause lives in `SKILL.md` L172 and `execution-duties.md`
L9), L19 五析取 sweep; 「每张卡欠一次分诊首触,车道 ⛔ 不自分诊」; +1 line
「首触先按业务理由三出口分流,再定级路由;批量卡审计评论带 `Batch-of:` 行」 after the pointer, which
now names 四答 and 理由判据; paid by merging 「分类动作每张三选一…」 with 「裁定写方向、给六态之一」.
Lines 78–103 (裁决恒归维护者人工, 人工地板, 风险判据, 工作量判据, 不呈, 例外一/二, 请示纪律) are
byte-identical to `main` |
| `SKILL.md` 域车道 (318, in place) | 「例外二:立卡人自贴而车道合上表、正文齐立卡门三件 ⇒
执行席直接认领,分诊事后抽查」 | 「预贴标签只是建议,队列与级别只由分诊落笔(例外一同承);无分诊审计评论 ⛔ 不得认领」 |
| `references/execution-duties.md` 候选 (in place) | 「自贴 `domain:*`
卡:合域表且齐立卡门三件 ⇒ 候选;缺一 ⇒ 挂 `pm:retriage`」 | 「无分诊审计评论的卡不是候选,预贴 `pm:queue`
视同无;例外一的 sub-issue 承父卡首触」 |
| `references/lanes/triage.md` (in place) | 「范围 = … 的裸卡首触(定级、路由、三件)…」 |
「范围 = objectstack、objectui 每张卡首触(业务理由与定级)与跨车道查重;应用仓无分诊席」 |
| `references/lanes/skills.md` (in place, 2 lines) | 「唯一例外:本车道 finding
自分诊,全仓轮跳过」 + the 仪器 question asked by the self-triage | the lane's
findings take the triage seat's first touch like every card; the seat
may attach evidence and its answer to 「仪器为车队服务」; a finding with no
answer ⇒ the seat suggests p3 or not doing it, ⛔ never queues it itself;
the grade stays with triage |
| `references/cross-repo-coordination.md` (in place) | 「机械三务 = 自扫
sweep、自打 `type`、自做 `finding` 首触定级」 | 「… 自做首触(含 `finding`
与业务理由,判据评论同分诊)」: a single-lane repo's seat reads the business rationale
in its own first touch and leaves the same audit comment |
| `references/dispatch-runbook.md` (241 → 245) | 「## subagent
批派发前置:先把本地检出钉到 main」; 「sweep 析取①②」 | heading renamed in place 「##
派发前置:前提核实,再把本地检出钉到 main」; +4 lines at its head: the read-only subagent
at the floor tier, run for a card-thread card before the candidate is
handed to the coordinator; the three exits (holds ⇒ dispatch; false with
a clear fix ⇒ correct the card then dispatch; cannot judge ⇒ decision
inbox, no card-thread slot); 「改法明确 = 目标不变,只换落点或修法」 with the comment that
records the old premise, the reading and the change before the body
edit; scope cuts, downgrades and closes are the card's fate on the human
floor, and the reading lands on a `Premise:` claim line. 「析取①–⑤」 in
place |
| `scripts/pm/check-skill-line-ratchet.mjs` | filing-gate.md 64,
dispatch-runbook.md 241 | 68 and 245, each row's comment quoting the
maintainer's word and the measured delta; neither file is a
`CROSS_FILE_MOVES` participant. `triage-duties.md` is the declared
source of the director.md move (120 → 103), so its ceiling is not
raised: its one new line is paid in place |
Acceptance reads on this head: `git grep -n '例外二' --
.claude/skills/pm-dispatch` → one hit, `triage-duties.md` L92 (the
report-only valve batch #3 kept); `git grep -n '自分诊' --
.claude/skills/pm-dispatch` → two hits, both ⛔ lines; `git grep -n '三件'
-- .claude/skills/pm-dispatch` → 出处三件 lines and `filing-gate.md` L30
「可推三件」 (the three answers triage may derive; the business rationale is
the one it may not); `git diff main --
.claude/skills/pm-dispatch/references/triage-duties.md | grep '^[-+]' |
grep -c '人工地板\|风险判据\|工作量判据'` → 0.
## Line budget
| File | Lines | Ceiling | Net |
|:--|--:|--:|--:|
| `references/filing-gate.md` | 68 | 68 (was 64) | +4 (+5 −1), ruled
raise |
| `references/triage-duties.md` | 103 | 103 | 0 (+1 −1, 7 edited in
place) |
| `references/dispatch-runbook.md` | 245 | 245 (was 241) | +4, ruled
raise; 2 edited in place |
| `SKILL.md` | 318 | 318 | 0 (1 edited in place) |
| `references/execution-duties.md` | 188 | 188 | 0 (1 edited in place;
187 → 188 is #25474's) |
| `references/lanes/triage.md` | 7 | 7 | 0 (1 edited in place) |
| `references/lanes/skills.md` | 32 | 33 | 0 (2 edited in place) |
| `references/cross-repo-coordination.md` | 51 | 51 | 0 (1 edited in
place) |
The two raises are ordinary ruled raises under the ratchet header's
maintainer exit: the ruling of record is the maintainer's word of
2026-10-23 quoted verbatim on card #25507 (「我说的是业务需求上的合理性,谁来判断」, 「立卡」,
「并且立刻派发」, 「而且分诊应该所有卡都分诊,因为有的车道在立卡的时候就打上了标签」) and in the seat's claim,
comment 6370029859 (corrected by 6370094728); measured deltas +4 and +4,
each row moved by exactly that. Paying them by deletion was tried first:
every bullet pair in both files that would merge under 120 bytes was
measured, one merge per file was available and both were taken; the
remaining lines are the rule text the word orders. Widest edited line
120 bytes (`filing-gate.md` 四件 line).
## Gates
On head `c9dae42` (the rule commit `7a21474`, the `main` merge `2ab989f`
that brings #25474 and #25506 in, which touches `execution-duties.md`
and `dispatch-runbook.md` in hunks this PR's diff does not, and the
review fix `c9dae42` for FAIL-1 of contract review 6377274688: a card
filed with `domain:*` + `pm:queue` + `priority:*` in the same minute
matched none of disjuncts ①–④, so `triage-duties.md` L17 now names 析取 ⑤
「窗内新建且 `pm:queue`/`priority:*` 与建卡同分钟,照未分诊首触;⛔ 不凭 actor」, L19 五析取,
`dispatch-runbook.md` L64 析取①–⑤, all in place, 103/103 and 245/245
held), each exit code captured before any pipe:
- The four the card names: `pnpm check:pm-skill-ratchet` ✓ (self-test
green; `filing-gate.md` 68/68, `triage-duties.md` 103/103,
`dispatch-runbook.md` 245/245, `SKILL.md` 318/318, `execution-duties.md`
188/188, `lanes/triage.md` 7/7, `lanes/skills.md` 32/33,
`cross-repo-coordination.md` 51/51; the director.md move still reads +17
against its source's −17), `pnpm check:pm-skill-id-lint` ✓, `pnpm
check:skill-frame-sync` ✓, `pnpm check:skill-frame-freshness` ✓. Also
`pnpm check:pm-governed-prose` ✓ and `node
scripts/check-commit-card-trailers.mjs --range origin/main..HEAD` ✓, all
re-run after the `main` merge.
- `node scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack <the nine changed paths>` derives 52 commands
(the ratchet script's path pulls in the `scripts` roster families).
After `pnpm install --frozen-lockfile`: **47 × exit 0; 3 × exit 2**
(`check-closing-target-claim`, `check-partof-closing-keyword`,
`check-single-claim-paths`: usage exits, they read a PR number or body
from CI's environment; `check-partof-closing-keyword` re-run with this
body as `PR_BODY` exits 0); **2 × exit 3** (`check:dts-closure`,
`check:published-readme-exports`: PREREQUISITE, they read built `dist/`,
which this card's text does not touch and this thread did not build).
CI's check-runs on this head are the record either way.
- No published package moves (`.claude/**` and one ceiling file), so
`skip-changeset`.
## Ordering and open PRs
- Built on `main` after #25422 (card #25414) and #25474 (card #25457)
landed; `main` merged in at `2ab989f` (clean, no conflict). #25474's
hunks (`execution-duties.md` 派发 L121–L130, `dispatch-runbook.md` 〈卡线程〉
L140) and this PR's (`execution-duties.md` L9, `dispatch-runbook.md` L64
and L149–L153) do not touch.
- Card #25490 (queued, five stale triage lines in
`seat-post-protocol.md`, `seat-lifecycle.md`,
`cross-repo-coordination.md` L7) shares `cross-repo-coordination.md`
with this PR; this PR edits L10 only.
- The claim's file surface was widened by comment 6370094728 to the
three in-place lines the 「所有卡都分诊」 rule needs (`execution-duties.md` L9,
`lanes/skills.md` L22–L23, `cross-repo-coordination.md` L10); nothing
outside the widened surface is touched.
## Acceptance notes
- **Supersedes one line of #25422 and one of batch #3's untouched
context, on the maintainer's later word.** #25422 (landed 16:46Z) sent
the half-labelled disjuncts ③④ to the owning lane seat; the maintainer's
16:44:57Z sentence orders every card through triage, so ③④ return to the
triage seat and the 自贴卡 spot-check becomes the rule. SKILL.md 域车道 例外二
(self-labelled ⇒ direct claim) is withdrawn for the same reason; it is
not the `triage-duties.md` 例外二 (the report-only valve) that batch #3
item 1.2 kept, which is byte-identical. Both are said here so the
reviewer can hold them against the word, not discover them.
- **The `Premise:` claim line is prescribed in the runbook but not yet
in the SKILL.md claim template** (318/318, no line in the file merges
under 120 bytes). The claim-reading gates read only
`Branch:`/`Clause-②:`/`Metadata-protocol:`, so an extra line is legal
today; the template line is a one-line follow-up for the seat when
SKILL.md next has a line to pay.
- **Single-lane repos have no triage seat**
(`cross-repo-coordination.md`, #25422): their `repo:*` seat reads the
business rationale in its own first touch, so filer and judge can be the
same seat there. Named in the 速读 for the maintainer; widening the triage
seat to app repos would be its own card.
- **A returned card is kept `finding`**, the label the state model
already defines as 「待首次定级」, instead of a new label: it keeps the card
out of the queue and the inbox and inside the finding round, which
re-reads it only after the body changes. `sweep-stale-finding.mjs`
strips `finding` only from cards that already carry a grade, so a
returned card is never swept.
- 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.
- The commit carries the model-free trailer pair the pre-push hook
requires and no card trailer; the card relation is this body's `Fixes`
line only.
- Opened through the fleet-write relay `pr_create`, so the author is
`objectstack-fleet[bot]`; every later write to this PR goes through the
relay too.
- Governed surface `.claude/**` (Tier S): draft, awaiting the seat's
`CONTRACT_REVIEW_TIER` review; landing by the seat under the
maintainer's 14:14Z standing word in the skills seat thread; ⛔ 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_014kfbihfYYkWDWee41PM2Gn
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent df893f6 commit e073455
9 files changed
Lines changed: 51 additions & 22 deletions
File tree
- .claude/skills/pm-dispatch
- references
- lanes
- scripts/pm
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
169 | 169 | | |
170 | 170 | | |
171 | 171 | | |
172 | | - | |
| 172 | + | |
173 | 173 | | |
174 | 174 | | |
175 | 175 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
10 | | - | |
| 10 | + | |
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
61 | 61 | | |
62 | 62 | | |
63 | 63 | | |
64 | | - | |
| 64 | + | |
65 | 65 | | |
66 | 66 | | |
67 | 67 | | |
| |||
146 | 146 | | |
147 | 147 | | |
148 | 148 | | |
149 | | - | |
| 149 | + | |
150 | 150 | | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
151 | 155 | | |
152 | 156 | | |
153 | 157 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
9 | | - | |
| 9 | + | |
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
15 | 15 | | |
16 | 16 | | |
17 | 17 | | |
18 | | - | |
19 | | - | |
| 18 | + | |
20 | 19 | | |
21 | 20 | | |
22 | 21 | | |
23 | 22 | | |
24 | 23 | | |
25 | | - | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
26 | 30 | | |
27 | 31 | | |
28 | 32 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
19 | 19 | | |
20 | 20 | | |
21 | 21 | | |
22 | | - | |
23 | | - | |
| 22 | + | |
| 23 | + | |
24 | 24 | | |
25 | 25 | | |
26 | 26 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
5 | | - | |
| 5 | + | |
6 | 6 | | |
7 | 7 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
14 | | - | |
15 | | - | |
| 14 | + | |
| 15 | + | |
16 | 16 | | |
17 | | - | |
18 | | - | |
19 | | - | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
20 | 20 | | |
21 | 21 | | |
22 | 22 | | |
23 | 23 | | |
24 | 24 | | |
25 | | - | |
26 | | - | |
| 25 | + | |
27 | 26 | | |
28 | 27 | | |
29 | 28 | | |
| |||
32 | 31 | | |
33 | 32 | | |
34 | 33 | | |
35 | | - | |
| 34 | + | |
| 35 | + | |
36 | 36 | | |
37 | 37 | | |
38 | 38 | | |
| |||
71 | 71 | | |
72 | 72 | | |
73 | 73 | | |
74 | | - | |
| 74 | + | |
75 | 75 | | |
76 | 76 | | |
77 | 77 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
418 | 418 | | |
419 | 419 | | |
420 | 420 | | |
421 | | - | |
| 421 | + | |
| 422 | + | |
| 423 | + | |
| 424 | + | |
| 425 | + | |
| 426 | + | |
| 427 | + | |
| 428 | + | |
| 429 | + | |
| 430 | + | |
422 | 431 | | |
423 | 432 | | |
424 | 433 | | |
| |||
1341 | 1350 | | |
1342 | 1351 | | |
1343 | 1352 | | |
1344 | | - | |
| 1353 | + | |
| 1354 | + | |
| 1355 | + | |
| 1356 | + | |
| 1357 | + | |
| 1358 | + | |
| 1359 | + | |
| 1360 | + | |
| 1361 | + | |
| 1362 | + | |
| 1363 | + | |
| 1364 | + | |
| 1365 | + | |
1345 | 1366 | | |
1346 | 1367 | | |
1347 | 1368 | | |
| |||
0 commit comments