Skip to content

Commit f447dc3

Browse files
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/seat-lifecycle.md‎

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -49,18 +49,18 @@
4949

5050
## Epic 子树车道
5151

52-
- 大开发与跨层功能点(spec/运行时/前端)整体委托一个专职 PM 会话:`/pm-dispatch epic:#<n>`。
53-
- 委托信号成对落地:父单打 `pm:epic` + 正文写会话 ID 与声明的文件领地。
54-
- epic 立卡挂父单、打 `pm:epic`,⛔ 永不 `pm:queue`;`label:pm:epic` 即父子保留全集,域座位不取。
55-
- 队列 = 子树 open 未认领 sub-issue,每轮重读不缓存;其它 PM 候选获取跳过整棵子树。
56-
- 域座位批次选择读一次 `label:pm:epic` 索引,避开领地相交;epic PM 不兼任 `domain:*` 座位。
57-
- 认领纪律全套照做:先写标签、再 `Claim:`、再全线程重读;认领后 `pm:epic` 留在卡上。
58-
- 离开子树(交车道或转 spec 座位)同一笔标签写摘 `pm:epic` 加 `pm:queue`。
59-
- `pm:epic` + `pm:queue` 同卡 = 半状态(保留兼移交);后者即已移交,取回走全套认领协议含重读。
60-
- 单车道仓(无 `domain:*`)开卡即认领合法;多车道仓域标签前置照旧,子树标记即保留。
61-
- 新立 spec/公共契约 sub-issue 照旧转 spec 座位队列,epic 侧写 `Blocked-by:`;衍生按三分留席。
62-
- 每次分流留一行审计评论;父单维护 checklist 汇总评论,决策仍锚在具体 sub-issue。
63-
- 收尾四步、僵尸回收与领地防撞细则见 `references/seat-post-protocol.md`。
52+
- 专题 = 父单 + 里程碑表 + 负责车道(立卡车道):它拆卡并保持表现值;⛔ 无默认专题席。
53+
- 表四列 `Milestone | Child | Blocked-by | Lane`,一里程碑一组行,子卡格 `#<n>` 加一句话。
54+
- 父单挂 `tracking` + `area:*`,无 pm 状态标签与 `pm:epic`,永不派发;决策锚在子卡。
55+
- 子卡一律 `sub_issue_add` 挂父单、住车道队列,默认无 `pm:epic`;先后只写子卡 `Blocked-by:`。
56+
- 滚动拆卡:只当前与下一个里程碑是卡,余为表行;高风险专题拆前贴小结,维护者裁 go/no-go。
57+
- 专题次序 = 路线图表(云:`cloud/ROADMAP.md`;本仓列每日看板,直至有表);⛔ 无每账号上限。
58+
- 暂停:父单 `pm:on-hold` + `Restart-when:`(原话+理由);同笔当前与下个里程碑未起工子卡同挂。
59+
- 在飞子卡逐卡呈维护者:默认契约复审 PASS 者落地,余停手转 `pm:on-hold`。
60+
- 后续里程碑子卡先把目标、要裁与链接并入表,再关 not_planned。
61+
- 父单留检查点评论(发运/冻结件现状/风险);重启新读它后按表重拆,仍成立的旧卡可重开。
62+
- 总览单列暂停专题(天数、`Restart-when`);逾 30 天问一次,不续则父单连余卡关 not_planned。
63+
- 须一手到底的链:写成一卡有序步骤,或具名集中例外打 `pm:epic`(细则 `seat-post-protocol.md`)。
6464

6565
## 轮次报告与节奏
6666

‎.claude/skills/pm-dispatch/references/seat-post-protocol.md‎

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
- 写侧刷新三时刻:派发、收班、暂停或交接前;时间戳恒取自 `scripts/pm/post-stamped.mjs`。
3030
- 帖与卡正文首行恒为署名 `LANE#N · ACCOUNT · SESSION`;缺即写工具拒发(`post-stamped.mjs` 头注)。
3131
- PR 正文末非空行署 `<!-- signed: LANE#N · ACCOUNT · SESSION -->`,整篇经 `dispatch.mjs` 的 `issue_patch`。
32-
- PR 正文不送页脚:中继 `issue_patch` 存 = 送、无追加(`platform-readings.md` 中继行)。
3332
- 刷新前回执敲门;`--body` 拦截:评论晚于末次戳 ⇒ `--ack-through=ID`;空座欠账无卡号 ⇒ 拒写。
3433
- 耐久状态只住正文或以 App 写入;正文守中继上限 60,000 字节,超大贴由半状态巡查浮出。
3534
- 协议升级迁移状态、或巡检发现正文不符时,当场改正文 + 审计评论。
@@ -65,15 +64,16 @@
6564
- 档位按职责挑,⛔ 不按重要性挑;Routine 席的档位与 cron 是维护者在 UI 上的可调项。
6665
- 项目席巡查默认每小时(总监席无);存根记 `Patrol: TRIGGER_ID · CRON`、`Mailbox: PR #n`,放宽注由。
6766

68-
## Epic 车道收尾与僵尸回收
67+
## Epic 收尾与集中例外
6968

70-
- 收尾四步一组,缺一步就是过夜半状态。
71-
- 最后一个 sub-issue 关闭 → 父单留总结评论 → 关父单并摘 `pm:epic` → 领地段标注收官。
72-
- 僵尸判据:父单正文有登记,但整棵子树 ~48h 无任何认领、分支或 PR 动静。
73-
- 命中 ⇒ 分诊座位在父单评论询问,再静默一窗后摘 `pm:epic` 收回子树。
74-
- 子树内仍在飞的认领按认领协议由原认领者跟完。
69+
- 收尾:子卡全关且表完成 ⇒ 父单总结评论 → 关父单;例外领地段注收官。
70+
- 迁移:有在线专题席的旧式专题跑完当前里程碑,下个里程碑或离席时迁;孤儿专题即迁。
71+
- 例外走 `/pm-dispatch epic:#<n>`:父单打 `pm:epic`,只点名的链挂;epic PM 不兼 `domain:*` 座位。
72+
- 父单正文写会话 ID、例外理由与文件领地;领地越窄越诚实,越宽越要写明为什么。
73+
- 被保留卡 ⛔ 不 `pm:queue`,单卡离开子树同笔摘 `pm:epic` 加 `pm:queue`;域座位读索引避开领地。
74+
- 离席必移交:点名接班席与续点,或同笔未起工子卡摘 `pm:epic` 转 `pm:queue`,留 `Blocked-by:`。
75+
- 僵尸:保留卡 ~48h 无认领/分支/PR 且未移交 ⇒ 分诊在父单问,静默一窗后代做默认移交。
7576
- 领地防撞是声明式的,不是机械保证;撞上由合并队列兜底。
76-
- 领地声明越窄越诚实,越宽越要在父单正文里说明为什么。
7777

7878
## 发版板运维(`target:<major>`)
7979

‎.claude/skills/pm-dispatch/references/triage-duties.md‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,15 +63,15 @@
6363
- 路由属分诊技术判断,⛔ 不升级哪个仓的问题;父单永不派发,`pm:epic` 卡 `pm:retriage` 即答。
6464
- 算涉 cloud:亦含托管面(objectos-runtime)、`Blocked-by:` cloud 卡、病因在 cloud。
6565
- 不算涉 cloud:只在 cloud 测得而修复与验收全在本仓;仅引 cloud 卡作历史。
66-
- 父单已有子结构的:父单队列标签即可,分诊逐个展开路由、补 `Blocked-by:` 排序。
67-
- 跨层功能点(≥2 层)立父单带 `area:*`+`pm:epic`+清单项级,逐层子单按 `Blocked-by:` 排。
66+
- 父单已有子结构的:父单挂 `tracking`,分诊逐个展开子卡路由、补 `Blocked-by:` 排序。
67+
- 跨层功能点(≥2 层)立父单带 `area:*`+`tracking`+清单项级,逐层子单按 `Blocked-by:` 排。
6868
- 每张留一条英文审计评论(`Triage: lands in …; rationale: …`),可选带 `Size/model suggestion:` 行。
6969
- 改作者可写面(种类非 `none` 或带 `(narrowing)`)的卡,首触 done-when 写 skills + docs + eval 三项。
7070
- 查重/shadow 检查先按文件/机制查本仓与姊妹仓 open 卡(含 `pm:dispatched`),再跟引用与关键词。
7171
- 同文件同机制 = 同一发现,不分车道即并:证据搬先卡,后卡经中继 `issue_patch` 关 `duplicate`。
7272
- 同族发现并入收口卡,不开单点卡;在飞(assignee/open PR)永不并,`Blocked-by:` 不派;完工查过期。
7373
- 执行席 ⛔ 不并卡,疑重复挂 `pm:retriage` 写明哪两张同文件同机制;同 assignee 者自关后卡。
74-
- 关重复卡须目标具名且新读重叠;追踪父单 `Part of #n` 子卡全关、无 open 工作 ⇒ `completed`。
74+
- 关重复卡须目标具名且新读重叠;追踪父单 sub-issue 全关、无 open 工作 ⇒ `completed`。
7575
- 关卡先贴签名评论点名裁决与证据;⛔ 是非关、活认领卡、安全卡不在此权,归维护者。
7676
- 首触答责任三问:谁的代码出险/有正路否/谁可达且有人用否;据答改卡范围、域与路由。
7777
- 三类外不可逆或有硬时限(发版即固化、只被消费的文件、过窗不可补)⇒ 不关,报维护者。

0 commit comments

Comments
 (0)