Skip to content

Commit 24043c2

Browse files
os-zhuangclaude
andauthored
pm-dispatch: SKILL.md wave-2 family — two-tier triage inventory, decision re-read, subagent tier fuse, git-history guard index (#11091)
* pm-dispatch: two-tier triage inventory — hourly since-window rounds, one daily full four-repo reconciliation fire The triage round's four-repo FULL open-issue inventory becomes a daily reconciliation backstop; hourly fires run on since windows anchored to the previous round-close brief's timestamp (read from the seat post — the same reading the round-open mutex already takes). The daily tier is picked by fire-time-of-day, never a counter, and the brief states which tier ran. SKILL.md carries the principle; the since-equivalent readings, cost targets and daily-duty clustering live in references/dispatch-runbook.md. Both ratcheted files stay at their ceilings (682/682, 243/243), additions paid by in-file trims. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MsbKEG4LtERSLaDrbehM3e * pm-dispatch: decision re-read before writing a brief, symmetrical to the race re-read Before writing a dispatch brief, read the card's comments to the last page and quote any maintainer ruling verbatim into the brief's ruling partition as binding — or state that none exists. The race re-read answers 'is this card taken?'; it cannot answer 'has this been ruled?' (a ruling comment carries no session ID, and a ruled card put back in the queue is label- identical to a never-ruled one), and a brief written without it re-opens a closed fork and drops the ruling's own dispatch constraints. Nets -2 lines on the ratcheted SKILL.md (680/682 after this commit). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MsbKEG4LtERSLaDrbehM3e * pm-dispatch: the tier fuse is valid only for seat sessions — a subagent get_session reading measures the dispatching session State plainly in the contract-review chain that a mode:subagent get_session reading reports the DISPATCHING session's model (the two fields agreeing is one source quoted twice, not corroboration), so a subagent cannot attest the tier it actually ran at. Clause-② subagent dispatches therefore always keep needs:contract-review, and the dispatched-at-the-floor review skip is seat-session-only. SKILL.md at 681/682 after this commit. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MsbKEG4LtERSLaDrbehM3e * docs(agents): point seats at scripts/pm/git-history.mjs — guard-index row in the dispatch skill, windowed-history rule in AGENTS.md The prescribed shallow-history remedy was named in no instruction file, so a seat asking a windowed churn question had no way to find it: a shallow clone answers windowed git log/rev-list at exit 0 with no warning. AGENTS.md gains the rule (answer, or REFUSE; historyHorizon() is the read-only predicate), the pm-dispatch 机械守卫索引 gains the ratchet-paid row. Both files stay at their ceilings (961/961, 682/682), additions paid by in-file content trims. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MsbKEG4LtERSLaDrbehM3e --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent ab47f69 commit 24043c2

3 files changed

Lines changed: 60 additions & 60 deletions

File tree

.claude/skills/pm-dispatch/SKILL.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -139,9 +139,8 @@ session 的 `Claim:` 评论(拼写见「认领」,车道盘点已取)—— 标
139139
产品横跨三仓,依赖方向固定:`objectstack`(后端;`packages/spec` 是唯一契约)→ `objectui`(前端,构
140140
建产物经 `pnpm objectui:refresh` 回流)与 `cloud`。链外两仓不入依赖链:分诊照扫(分诊座位保持五仓唯
141141
一),各归同名 `repo:*` 执行座位,纪律即规则 4 姊妹仓执行座位一套(⛔ 此处不另抄)。第四仓 `objectos`
142-
(纯文档与站点,执行已自 `domain:devx` 迁出):座位由维护者 2026-08-18 亲自提前行使规则 4 预登记的升
143-
格开设(「objectos 是新开的项目经理,是不是少了座位帖。」);无 changeset 流、无 `packages/`;合并队
144-
列 + required `build` + `merge_group` 自 2026-08-18 起已上线 —— 派发预期照实设,⛔ 不要求不存在的机制。
142+
(纯文档与站点,执行已自 `domain:devx` 迁出):座位由维护者 2026-08-18 开设(「objectos 是新开的项目
143+
经理,是不是少了座位帖。」);无 changeset 流、无 `packages/`;合并队列 + required `build` + `merge_group` 已上线 —— 派发预期照实设,⛔ 不要求不存在的机制。
145144
第五仓 `hotcrm`(样板工程:元数据开发的 CRM 示例应用;岗位说明与裁决原文在 `references/lanes/hotcrm.md`):平台相关的功能在平台中实现 —— 建设 hotcrm 时发现的平台缺口按规则 1 落平台仓**普通卡**(非缝卡,⛔ 不在样板内绕行);`repo:hotcrm` 缝标签只给真协调卡。
146145
**objectui 卡按修复落点分流三流**(维护者 2026-08-21 裁定,`domain:ui` 唯一新增标签,命名定稿原话:「按 domain:ui 定稿」):`domain:devx`(工程面)/`domain:spec`(契约面)跨仓归各自车道,其余 —— 发布库与 apps —— `domain:ui` 归 objectui 执行席;症状位置不改流向,docs 随所记录的面走,落点不明留分诊首触 ⛔ 不猜。
147146
**车道可按仓分席(域×仓)**:忙时一个 domain 车道开多个按仓席位(如 devx@objectstack / devx@objectui;触发即规则 4 预登记的拆分条件),各席独立座位贴与 claim 互斥,闲时收归一席 —— 名册状态,不改协议文本;seam 卡单一归属:归修复落地仓的席,双仓皆动 objectstack 侧主导;`scripts/pm/**` 等住 objectstack 的全板工具链单写手恒为 objectstack 侧席,他侧上游立卡回链(hotcrm 宪章同款纪律)。
@@ -248,6 +247,8 @@ skills,类似分诊」)—— 贴内指针指向其车道文件,升级走技能
248247
**代裁权限唯一归本座位**,任何执行座位(含姊妹仓 `repo:*`)⛔ 不代裁。
249248
**工具加载纪律(fire 开局)**:互斥检查/自退判断只按名加载所需工具 —— `ToolSearch``select:mcp__github__list_issues,mcp__github__issue_read` 形式,判定「本轮有活」之后才加载其余;⛔ 开局不做泛关键词 ToolSearch(一次注入全家桶 schema —— 分诊席 2026-08-20 自测:空转轮 ~12 万 token,~8 万是这张门票);可验判据:空转轮 ~4 万以内,分诊下轮自测读数回报。只约束分诊 fresh session 的开局;执行座位(常驻会话)与 dev(需全工具面)不受此约束。
250249

250+
**两级盘点(two-tier inventory;维护者 2026-08-20:「每次都需要 四仓全量 open issue 盘点 … 吗?建议分诊多久执行一次」→「立卡」)**:小时轮以 `since` 窗口读增量 —— 锚 = 座位贴上一份收班简报的时间戳(互斥守卫同一读数,零新状态;标签写入刷新 `updated_at`,窗口锚在简报而非上次 fire,漏 fire 积压自动入窗);每日一 fire 跑四仓全量对账并归集日频职责;选层按 fire 时刻 ⛔ 不用计数器(fresh session 无计数器);简报写明本轮跑的层(下轮读者靠它知道窗口盖了什么)。从不更新的卡不入窗是设计:它上次变更时已被扫过,老化欠账归半状态巡查不归小时轮;守住小时 fire 的硬理由是契约复审时延(`since` 读法与成本对价见 runbook)。
251+
251252
**Backlog sweep(常设职责,不等请求)。** 每轮扫任一析取命中的卡:① 全裸(无`pm:*`
252253
`needs-user-decision`、无 `domain:*`);② 有 `pm:queue``domain:*`(**凡有车道标签的仓皆扫**,
253254
今日为主仓与 objectui —— 三流拆分见多仓协调;豁免仅余真无车道标签的仓 cloud、objectos,该形状在那里才是队列卡常态);③ 有 `domain:*` 无 pm-state。②③ 只取 `updated_at`
@@ -326,13 +327,11 @@ hold 评论纪律见状态模型,hold 重验只在 `Restart-when:` 命中时发
326327
**整车道一次读全,本地求交**(维护者 2026-08-11 接受):`list_issues``labels: [domain:X]` +
327328
最小字段一次拿回全车道 open 集,各状态本地求交 —— 按单一 pm 状态切片的查询看不见其它状态,是结
328329
构性盲区。候选 = open、未 assign、无`needs-user-decision`、无 `pm:retriage`;已排队父单的 open sub-issue 自动是
329-
候选(`pm:epic` 父单的子树除外)。**每张候选读全文 + 全部评论**(裁决落在评论区,跳过评论就是跳
330-
过裁决;评论还可能记着一半工作已交付);**派发前做前提过时检查(stale-premise check)—— 裁决同
330+
候选(`pm:epic` 父单的子树除外)。**每张候选读全文 + 全部评论,写派发词前补一次决策复读(decision re-read),与认领的竞态复读对称**:评论读到最后一页,凡维护者裁决**逐字引入派发词裁决分区**作约束,无则写明「无裁决」—— 竞态复读只答「被谁认领」答不了「已被裁过」(裁决评论不带 session ID,裁后回队的标签状态与从未裁过的卡同形,队列列表分不出),漏读的派发词把已闭分叉当开放问题重开、并丢掉裁决自带的实施约束;评论还可能记着一半工作已交付。**派发前做前提过时检查(stale-premise check)—— 裁决同
331331
**(裁决描述的也是当时的仓,写得权威、日期又近,恰恰更容易被当成现成事实),两半都查:**动作
332332
** —— `git log --oneline -20 -- <paths>` 之外,裁决实施卡再核被点名的动作在 `origin/main`
333333
还没被做掉;**卡引用面** —— 裁决/卡片点名为阻塞、认领面、协调对象或「落地即启用」依赖的每张
334-
issue,逐个读当前 open/closed/assignee,引用读到的现状 ⛔ 不引用裁决写作时的描述(树答不了「那
335-
张卡还开着吗」;过时动作断言 dev 动手即自纠,过时卡引用不变红)。花几分钟,不查则赔一次 agent 运行。
334+
issue,逐个读当前 open/closed/assignee,引用读到的现状 ⛔ 不引用裁决写作时的描述(过时动作断言 dev 动手即自纠,过时卡引用不变红)。花几分钟,不查则赔一次 agent 运行。
336335

337336
**批次独立性。** 一批内任两单不得可能碰同一个包/registry/barrel/spec schema;拿不准就串行。**
338337
文件单跨轮硬串行;延后不是搁置**(被延后那一刻就把已知的坑记到该 issue 上)。**家族派发(family dispatch)是本条的范围澄清,不是豁免**:独立性防的是两个 agent 相撞同一区域,
@@ -423,8 +422,7 @@ dev 侧推分支要早 —— 远程分支是在飞工作最硬的证据。**死
423422
draft-only、tier 推导引用、棘轮实况、释义纪律)。无条件条款只住角色文件(冲突时它胜、错了修那里,
424423
⛔ 不靠派发词临时覆盖)。**终报要求随派发词带一句**:只收机器可核字段(gates/line_budget/
425424
deviations/files_changed),⛔ 复述 PR body 叙事。**清单、路径、行号在派发那一刻从树上取**,⛔ 不
426-
从卡片/上次派发/记忆抄(`node scripts/pm/dispatch-gates.mjs`,取数的是 PM 不是 dev —— dev 只跑
427-
被点名的族,全 farm 归 CI;点名单是线索不是规格,dev 同脚本对实际改动重取、补跑漏点名的族并报告,条款在 os-dev 定义);行级断言转述前必须自己重验。
425+
从卡片/上次派发/记忆抄(`node scripts/pm/dispatch-gates.mjs`,取数的是 PM;点名单是线索不是规格,dev 对实际改动重取补跑 —— 条款在 os-dev 定义,补遗见 runbook);行级断言转述前必须自己重验。
428426
- **`skills/**`(对外发布的技能包)的卡,派发词必带 PM 定的净增行数预算**(按 feature 大小定,小功能给小数);dev 装不下 ⇒ 停手回报,⛔ 不自行扩写、不自行抬预算(抬预算是维护者裁决)。
429427
**原则:对外发布的技能包是平台最大的对外价值,评估恒整包整体**(维护者 2026-08-21:「对外发布的 skills 是整个平台的最大价值,尤其要整体考虑和评估。」)。
430428
- **文件面写两句**(预期落点 + 生产者在别包时报备后按生产者侧修,⛔ 不在消费者侧打补丁
@@ -521,7 +519,8 @@ os-zhuang 审核。我的手机github 应该会收到推送消息吧」;当日
521519
**由声明行承载。档位以 dispatch-gates 常量 `CONTRACT_REVIEW_TIER` 为准(档位单源,⛔ 本文与标签不写模型名,模型升级只改一行一个文件)。派发席职责止于:卡上记一行认定、挂 `needs:contract-review`(标签命名审的对象,恒英文)——**PR 与卡双载体同笔挂**(维护者 2026-08-22:「简化一点是否可以直接挂 PR 侧」「两边都挂好」;PR 一存在即挂,报告先于 PR 到达则先挂卡侧、ACCEPT 时补齐 PR 侧),同笔在该 PR 上向复审席账号 request review(同裁决:「也可以直接要求复审」—— 仅通知,载体仍是标签)、停手;⛔ 禁止自查放行。
522520
- **`needs:contract-review` 复审链**:复审资格 —— ① 跑在契约复审档位,硬条件,认定只认降档保险丝的机读;② 非该卡派发席,已从资格条件放宽为路径偏好(维护者 2026-08-21,原话:「你自己就是 Fable,自己就可以审核」):经同一机读证实达档的派发席,可对自派的卡执行契约复审并清标(审的是低档实现者的契约增量,非自身产物 —— 派发席不写代码);放宽豁免的是独立席位,不是复审本身 —— 一行结论照样先落卡、后清标,上条「⛔ 禁止自查放行」禁的是免复审直放,不禁本路径;低于契约复审档位的席照旧留标等待。归属:常设 = 分诊席(Routine 模型由维护者在 Routines UI
523521
钉在契约复审档位),分诊轮子轮清该标签仍是默认清标路径(达档席自清仅是后备)—— 只审契约增量 diff、结论一行写在卡上、PASS 双载体同笔清标(PR 与卡各按标签纪律硬步骤)并清 review request 或留一条 review 评论,标清后卡方可入队;每小时一轮即天然攒批;过渡期(分诊 Routine 未建成前)由 skills 席代行。**降档保险丝**:
524-
子轮开场**必调一次 `get_session`**(claude-code-remote MCP,无参)读 `external_metadata.last_served_model`,⛔ 自述档位不是读数(静默降档腐蚀的恰是自述;实测与配置档陷阱见 platform-readings);读数 ≠ `CONTRACT_REVIEW_TIER` ⇒ 该子轮整体跳过、标签原样留置 —— 卡在队列外等待是安全态;契约复审 ⛔ 不适用额度耗尽豁免降档(豁免的对象是派发;复审的存在意义就是补偿一次低于地板的派发)。**载体不迁移**(维护者 2026-08-18,原话:「中期把闸门迁到 PR review 的 Request Changes 上 我觉得没必要」):闸门载体保持本标签,⛔ 不迁 PR review / Request Changes、不为迁移留门;挂与清皆按标签纪律的 read-modify-write 硬步骤写。
522+
子轮开场**必调一次 `get_session`**(claude-code-remote MCP,无参)读 `external_metadata.last_served_model`,⛔ 自述档位不是读数(静默降档腐蚀的恰是自述;实测与配置档陷阱见 platform-readings);读数 ≠ `CONTRACT_REVIEW_TIER` ⇒ 该子轮整体跳过、标签原样留置 —— 卡在队列外等待是安全态。
523+
**保险丝只对座位自会话有效**:`mode:subagent` 里的 `get_session` 量的是**派发会话**(实测:钉在地板档的子代理读回父会话的档位,`session_context.model``last_served_model` 一致只是同一来源引用两次,⛔ 不作互证)—— subagent 的实际服役档位现无法自证,条款②的 `mode:subagent` 派发因此恒保留 `needs:contract-review` 走复审链,「派发已在地板」的免审跳过仅座位自会话成立。契约复审 ⛔ 不适用额度耗尽豁免降档(豁免的对象是派发;复审的存在意义就是补偿一次低于地板的派发)。**载体不迁移**(维护者 2026-08-18,原话:「中期把闸门迁到 PR review 的 Request Changes 上 我觉得没必要」):闸门载体保持本标签,⛔ 不迁 PR review / Request Changes、不为迁移留门;挂与清皆按标签纪律的 read-modify-write 硬步骤写。
525524
- **碰生成物的 PR,入队前先同步 + 整体重生成**(os-regen 驱动零冲突标记地**静默丢掉一侧改动**):
526525
四步序已机械化 `bash scripts/pm/os-regen-merge.sh`;陷阱、断言措辞与锚点禁令见 landing-operations A。
527526
- **跟到 MERGED 为止;入队后的看护同归车道 PM 的落地窗口**:验收、首次入队 flip 定点、MERGED 两读
@@ -676,6 +675,7 @@ grep <branch>`),复升级时逐条**跑**一遍,零命中/变形的就地改写
676675
| `scripts/pm/check-half-states.mjs` | label/assignee/PR 半状态的 report-only 巡查(含已复核就绪却无人落地的孤儿 PR 检测) |
677676
| `scripts/pm/check-governed-merges.mjs` | governed 面合并清单的 report-only 审计(事后防线;轮报载体,本地枚举零 API,仅归因走查询) |
678677
| `scripts/pm/dispatch-gates.mjs` | 文件面 → 该跑的门禁族(派发令取数) |
678+
| `scripts/pm/git-history.mjs` | 窗口化 commit 计数:回答或 REFUSE —— 浅 clone 对窗口化 `git log`/`rev-list` 以 exit 0 无警告答错;`historyHorizon()` 是自答工具的只读谓词 |
679679
| `scripts/pm/os-regen-merge.sh` | 碰生成物 PR 的 merge 四步序(防静默吞并与锚点倒退) |
680680
| `scripts/pm/ensure-pm-labels.sh` | pm 标签词表的幂等一次性创建;退役车道刻意不在 ⛔ 不加回,理由与对象清理以脚本头为权威 |
681681
| `check:skill-frame-sync` / `-freshness` | 四维决策框架四份拷贝的同构与新鲜度 |

0 commit comments

Comments
 (0)