Repository navigation
Commit f447dc3
docs(pm-dispatch): write the epic working mode (lanes take the children) (#31610)
<!-- claude-projects-attribution: {"github_login":"zhuangjianguo"} -->
_Requested by **Steedos** · [project
thread](https://claude.ai/code/project/chan_018ETKaNwMZCNRYD7D8Q9Ubb?thread=cmsg_018ETKaNwMZCNRYD7D8Q9Ubb1mwcDLoNPHAa92Ln1roW3J)_
Fixes #31502
Clause-②: no
Metadata-protocol: none
## 维护者速读
- 改了什么:把已裁的专题工作方式写进座位规则。专题 = 父单 + 里程碑表 + 负责车道;子卡用 sub-issue
挂上、住各车道队列、默认不打 `pm:epic`,先后靠
`Blocked-by:`;只拆当前和下一个里程碑;暂停(当前与下个里程碑子卡挂起,更后里程碑子卡并入表后关闭)、检查点、里程碑间
go/no-go 与 30 天复查;在线专题跑完当前里程碑再迁、孤儿专题即迁;专题次序 = 路线图表,不设每账号上限。`pm:epic`
只留给具名的集中例外,其席位离开必须移交。
- 为什么改:落实 #31502 的两份裁决(记录 6723874343:A′ + 暂停补充 + 第 2、3 点;记录
6724302769:暂停时的子卡去留)。旧规则让每张子卡都挂 `pm:epic`、由专职专题席保留,席位一走子卡就被锁死(#8345
停了三天)。
-
风险与回滚:只改席位读的规则文字,不动任何脚本、门禁或标签;两个文件行数不变(98/98、88/88),为此删掉了被新规则取代的旧模式行和一行在别处已有的重复文字。回滚即
revert 本 PR。
- 先看:`seat-lifecycle.md` L52–63(新〈Epic 子树车道〉)、`seat-post-protocol.md`
L67–76(收尾与集中例外),以及下文「解读」一节(默认父单挂 `tracking`)。
- 两分钟验证:`pnpm check:pm-skill-ratchet && pnpm
check:pm-skill-id-lint`,预期两个都 exit 0,两个文件行数不超上限、无超 120 字节行、无卡号。
- 需要你做的:无,席位落地(Tier S,待契约档复核)。
## What changes
Three files under `.claude/skills/pm-dispatch/references/`, line-neutral
in each.
- **`seat-lifecycle.md` 〈Epic 子树车道〉 (L52–63, 98 → 98, ceiling 98).** The
twelve old-mode bullets (every child reserved with `pm:epic`, never
`pm:queue`, a dedicated epic PM per subtree) are replaced by the ruled
mode: epic = parent + milestone table + owning lane (L52); the template
(L53); the parent's labels (L54); children as sub-issues in the lane
queues with no `pm:epic` by default, ordered only by `Blocked-by:`
(L55); rolling split plus the go/no-go for high-risk epics (L56); the
roadmap order and no per-account cap (L57); the pause rules (L58–62);
the concentration exception and the pointer to its details (L63).
- **`seat-post-protocol.md` (88 → 88, ceiling 88).** 〈Epic 车道收尾与僵尸回收〉
becomes 〈Epic 收尾与集中例外〉 (L67–76): closure (L69), the transition for live
epics (L70), the exception's delegation shape (L71–73, the old paired
signal, kept whole), the mandatory hand-over (L74), zombie recovery now
does the hand-over's default arm (L75), and the territory line (L76).
- **`triage-duties.md` (100 → 100).** L67: a cross-layer parent is filed
with `area:*` + `tracking` instead of `area:*` + `pm:epic`. L66: a
parent that already has children gets `tracking`, not a queue label, and
triage routes the children one by one with `Blocked-by:`. L74: a
tracking parent's children are counted by sub-issue, not by `Part of`
prose.
- **Template, smallest form:** one prose line naming #27293's four
columns (`Milestone | Child | Blocked-by | Lane`, one row group per
milestone, a child cell is the card number plus one sentence). Both
files pin zero markdown table rows (`MAX_TABLE_ROW_BYTES` is 0 for
each), so a table is not available there.
### Ruling item → file:line
| Ruled item (record 6723874343) | Where |
|:--|:--|
| A′ 1 parent + milestone table + owning lane | seat-lifecycle L52, L53
(template), L54; triage-duties L66, L67 |
| A′ 2 children are sub-issues in lane queues, no `pm:epic` by default |
seat-lifecycle L55; triage-duties L74 |
| A′ 3 ordering is `Blocked-by:`, released by the unlock sweep |
seat-lifecycle L55 (release survives at `SKILL.md:110`) |
| A′ 4 `pm:epic` only for a named concentration exception, mandatory
hand-over | seat-lifecycle L63; seat-post-protocol L71–75 |
| A′ 5 rolling split | seat-lifecycle L56 |
| Pause 1–2 parent `pm:on-hold` + `Restart-when:`; current and next
milestone's not-started children held in the same write (as ruled in
6724302769) | seat-lifecycle L58 |
| Pause 3 in-flight children to the maintainer card by card |
seat-lifecycle L59 |
| Pause 5 (6724302769) later milestones' children folded into the table,
then closed `not_planned` | seat-lifecycle L60 |
| Pause 4 checkpoint comment; restart re-splits from the table after a
fresh read, may reopen a card whose text holds (6724302769) |
seat-lifecycle L61 |
| Pause 6 go/no-go between milestones for high-risk epics |
seat-lifecycle L56 |
| Pause 7 paused epics listed apart; 30-day question, "do not continue"
closes parent and remaining children `not_planned` (6724302769) |
seat-lifecycle L62 |
| Point 2 online seat finishes its milestone, orphaned epic moves now |
seat-post-protocol L70 |
| Point 3 roadmap table is the order, no per-account cap |
seat-lifecycle L57 |
### Line payment (deleted text and its survivors)
- Old seat-lifecycle L59 (`pm:epic` + `pm:queue` on one card is a half
state) survives at `SKILL.md:116` ("⛔ 永不与 `pm:queue` 同挂") and
`scripts/pm/check-half-states.mjs` H45.
- Old seat-lifecycle L57 (full claim discipline) survives at
`AGENTS.md:394-411`; L62's per-routing audit comment at
`triage-duties.md:68`; L62's checklist summary comment is replaced by
the milestone table (ruled).
- Old seat-lifecycle L61 (spec sub-issues go to the spec seat queue) and
L60 (single-lane repo claim shortcut) are old-mode lines the ruled
default replaces: every child now lives in its lane queue.
- Old seat-post-protocol L74 (in-flight claims are followed by their
claimant) survives at `SKILL.md:105` (在飞卡跟到 MERGED).
- Old seat-lifecycle L56's second half (successor `pm:blocked` until the
predecessor closes, released by the unlock sweep) survives at
`SKILL.md:110`; that paid the fifth pause line ruling 6724302769 added.
- seat-post-protocol L32 ("PR 正文不送页脚: relay `issue_patch` stores what it
is sent") survives at `platform-readings.md:335` and
`platform-readings.md:343`.
- No re-wrap, no sentence split across two bullets, every touched line ≤
120 B.
### Interpretation (agreed with the seat before writing; please judge
it)
The ruling says children carry no `pm:epic` by default and `pm:epic` is
only for a named exception; it does not name the default parent's
labels. This PR reads it as: the default parent carries `tracking` +
`area:*`, no pm state label and no `pm:epic`, and is never dispatched; a
concentration exception keeps the old delegation shape whole (parent
`pm:epic` + session registration + territory, only the named chain
reserved). Measured script facts behind it, none changed:
- `check-half-states.mjs` H45 reads every `pm:epic` carrier: a top-level
one with sub-issues or a `session_` registration is clean, and a
`pm:epic` child whose parent lacks `pm:epic` is a finding. So the
exception must put `pm:epic` on the parent, and a default parent without
it trips nothing.
- `fleet-roster.mjs` (L30–42, L286–297) builds an epic row only from an
open `pm:epic` parent with sub-issues and a registration, so default
epics show no seat row, which matches "no default epic seat".
- `tracking` is the existing H13- and H74-exempt "stays open by design"
label (`TRACKING_ANCHOR_LABEL`), excluded from triage's sweep at
`triage-duties.md:15`.
## Acceptance notes
- **Not changed, by order:** the four scripts that read `pm:epic`
(`check-half-states.mjs`, `fleet-roster.mjs`, `mailbox-open.mjs`,
`close-cards.mjs`). None enforces the old mode against the ruling
(details in the report's `out_of_scope_findings`). Moving live epics
(#8345 and others) is triage's; cloud#3823 / cloud#3820 and every cloud
file are out of scope.
- Review nits: the closure line no longer removes `pm:epic` on close
(`close-cards.mjs` keeps identity stickers); "每日看板" at L57 is the
ruling's own wording ("the daily dashboard") and is left, since naming
an owner for it is not in either ruling.
- `SKILL.md:54`, `SKILL.md:116` and `project-forms.md:36` describe
`pm:epic` / `epic:#N#K` seats and stay true for the exception, so they
are unchanged.
- Tier S (`.claude/**`): lands after a contract-tier review of record
for the head; the seat routes it. `skip-changeset`: nothing here
publishes.
## Verification
Derived gate set (`node scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack`) at the head `88e8137a`: 19 derived, 19 run,
all exit 0 (ratchet and id-lint among them); `--ran` reconciliation
19/19, 0 NOT-MEASURED. The first round ran the same 19 at `3865f7ce`.
Full log in the os-dev report on the card.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01QsR2jS8EUVvh8TAp5aMkjW)_
<!-- signed: domain:skills#2 · zhuangjianguo ·
session_01QsR2jT34CXs5fCn3BDirZw -->
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent dced781 commit f447dc3
3 files changed
Lines changed: 23 additions & 23 deletions
File tree
- .claude/skills/pm-dispatch/references
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
49 | 49 | | |
50 | 50 | | |
51 | 51 | | |
52 | | - | |
53 | | - | |
54 | | - | |
55 | | - | |
56 | | - | |
57 | | - | |
58 | | - | |
59 | | - | |
60 | | - | |
61 | | - | |
62 | | - | |
63 | | - | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
64 | 64 | | |
65 | 65 | | |
66 | 66 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
29 | 29 | | |
30 | 30 | | |
31 | 31 | | |
32 | | - | |
33 | 32 | | |
34 | 33 | | |
35 | 34 | | |
| |||
65 | 64 | | |
66 | 65 | | |
67 | 66 | | |
68 | | - | |
| 67 | + | |
69 | 68 | | |
70 | | - | |
71 | | - | |
72 | | - | |
73 | | - | |
74 | | - | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
75 | 76 | | |
76 | | - | |
77 | 77 | | |
78 | 78 | | |
79 | 79 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
63 | 63 | | |
64 | 64 | | |
65 | 65 | | |
66 | | - | |
67 | | - | |
| 66 | + | |
| 67 | + | |
68 | 68 | | |
69 | 69 | | |
70 | 70 | | |
71 | 71 | | |
72 | 72 | | |
73 | 73 | | |
74 | | - | |
| 74 | + | |
75 | 75 | | |
76 | 76 | | |
77 | 77 | | |
| |||
0 commit comments