diff --git a/.claude/skills/pm-dispatch/SKILL.md b/.claude/skills/pm-dispatch/SKILL.md index 9370e66344..6fdad6b72b 100644 --- a/.claude/skills/pm-dispatch/SKILL.md +++ b/.claude/skills/pm-dispatch/SKILL.md @@ -75,10 +75,10 @@ UI 创建并勾 GitHub 连接器、UI 钉模型(会话内 create_trigger 的Rout | **assignee 已设** | 已认领/在飞 —— 不是你的就永不碰 | | `pm:dispatched` | 已派发(派发评论记轮次);与摘 `pm:queue` **同一次标签写入**成对落地 | | `needs-user-decision` | 决定**待做** —— 永不派发、除已裁代裁通道外永不代答;维护者的收件箱 | -| `pm:on-hold` | 决定**已做**且答案是「不是现在」—— 不派发也不催;hold 评论带**日期、理由、重启条件** | +| `pm:on-hold` | 决定**已做**且答案是「不是现在」—— 不派发也不催;hold 评论带**日期、理由、具名重启条件、出处**(维护者裁或座位定级 —— 出处住评论,⛔ 不设第二个标签区分) | | `pm:blocked` + 正文行 `Blocked-by: #N` | 等上游 —— 选择期跳过,#N 关闭时由解锁扫描放回 | | `pm:blocking` | 有 open 下游依赖者(分诊 sweep 自 `Blocked-by:` 索引推导的缓存,⛔ 不手工挂);进选择优先级全序 | -| `finding` | 观察类记录 —— 持有态,待发现分诊轮定级,不占队列不进收件箱 | +| `finding` | 观察类记录,恒 = **待首次定级**(定级即离标:晋级换 `pm:queue` / 关闭 / hold 换 `pm:on-hold`;裸标签数即健康读数)—— 不占队列不进收件箱 | | `target:` | 发版阻塞 —— 每个 backlog 恰好一个生产者,见「发版板」 | | `pm:epic`(父单) | 子树已委托 epic PM(会话与领地在父单正文;`label:pm:epic` 即全量索引)—— 其它 PM 不把其 sub-issue 当候选 | | `pm:seat` | 座位登记贴 —— 协议载体,不是待分诊的工作 | @@ -255,13 +255,12 @@ UI 创建并勾 GitHub 连接器、UI 钉模型(会话内 create_trigger 的Rout (维护者 2026-08-13):维护者点名或 p0 嫌疑 ⇒ 立即起 `claude-fable-5` 分诊子代理,不等 Routine 班 次;授权面 = 分诊本身(定级/路由/标签/既有评论格式),⛔ 不写码不认领;产出落卡,与 Routine 分诊同格式同效力(细则见 `references/dispatch-runbook.md`)。 -**分类动作**(每张三选一 + 一个修复通道):**`pm:queue`** —— 有具名落点或复现的具体缺陷、范围明 -确的工具/门禁修复、恢复不变量的 finding、test-only pin,无可问之事; **`needs-user-decision`** -—— 设计卡、feature/契约形状提案、需要 appetite 的多周程序、碰存量数据迁移形状或删除已发布能 -力的,落卡时**必带四棱卡面块**(见「升级与决策」),⛔ 不留待有人接手再补;**`finding`** —— 观察 -类(死代码、未演练漂移、抛光;真实但今天没有用户撞上),持有态待定级;**Repair first** —— 正文 -被 sanitizer 截断的卡不可派发,评论修复指令后跳过;停摆指令判据必须比其它分类更硬(双读取),事 -后证伪同处公开作废。 +**分类动作**(每张三选一 + 一个修复通道):**`pm:queue`** —— 有具名落点或复现的具体缺陷、范围明确 +的工具/门禁修复、恢复不变量的 finding、test-only pin,无可问之事;**`needs-user-decision`** —— 设 +计卡、feature/契约形状提案、需要 appetite 的多周程序、碰存量数据迁移形状或删除已发布能力的,落卡时 +**必带四棱卡面块**(见「升级与决策」),⛔ 不留待有人接手再补;**`finding`** —— 观察类(死代码、未演 +练漂移、抛光;真实但今天没有用户撞上),待首次定级;**Repair first** —— 正文被 sanitizer 截断的卡不 +可派发,评论修复指令后跳过;停摆指令判据必须比其它分类更硬(双读取),事后证伪同处公开作废。 **原生 issue 类型 Bug/Feature/Task 是分诊的固定产出**(维护者 2026-08-12 裁定「同意」):分诊 座位是 `type` 字段的唯一权威生产者(立单者可预填,分诊校正 —— 与 `domain:*` 同一纪律);判据即 @@ -278,19 +277,19 @@ UI 创建并勾 GitHub 连接器、UI 钉模型(会话内 create_trigger 的Rout 。**「生产者在哪?」是常设分诊问题**:declared ≠ enforced 形状的卡先问谁在写这个字段 —— 答案通 常就是根因,并在派发前改变卡的范围与域标签。 -**发现分诊轮(队列的出水口)。** 触发:每 ~5 轮,或 `finding` 存量 >~15 插队。对每条先做过时前提 -检查(发现的准确性半衰期以天计),然后三选一:晋级(换 `pm:queue`)/ 关闭 not planned(附理由,列入 -轮次报告 —— 维护者可否决重开,PM 不等批准)/ 持有(记一行为什么还留着)。**判级发生在这里,不在 -立单时**(立单 dev 只有局部视野,照实立单不压级)。**sweep 打包晋级**(维护者 2026-08-07 批准)五 -条:同类才打包(全部命中同一判据);逐项清单(落点 | before | after)是 PR 正文必备件;N 项之外零 -改动且 PR 自证;范围外发现照旧单开;sweep 卡是认领对象,成员单保持标签但不再是可派发候选。 +**发现分诊轮(队列的出水口)。** `finding` 恒 = 待首次定级、定级即离标(维护者 2026-08-13 意见;换标 +与 hold 评论纪律见 State model,hold 重验只在具名重启条件命中时发生,⛔ 不设逐卡豁免评论)。**首触定 +级每轮跑**:预算 3–5 张、优先于一切旧卡重验,先过时前提检查再三选一 —— 晋级 / 关闭 not planned(维 +护者可否决重开,PM 不等批准)/ hold;**判级发生在这里,不在立单时**。车道座位可附证据/前提重验,⛔ +不定级不改标(唯一例外:skills 车道 finding 由该席自分诊,全仓轮跳过)。**自动集中轮**(常设授权,维 +护者 2026-08-13):`finding` >15 ⇒ 下一 fire 跑域分批集中轮,sweep 打包晋级五条照用;原话、批量参数与五条细则见 `references/dispatch-runbook.md`。 **发版板(`target:`;运维细则见 `references/seat-post-protocol.md`)。** 判据二元(⛔ 不 做优先级渐变 —— 渐变没人维护):「不修它,当前 RC 能不能发?」判阻塞四类:① 用户今天就撞的已发布 面缺陷;② 公开契约 declared≠enforced;③ 存量数据/迁移形状(发布后修不回);④ 发布说明里要为它道歉 的。拆分/分票时 `target:*` 随工作走,对每一半重跑二元判据,默认继承,不继承按四类写明理由。**每 -个 backlog 恰好一个生产者**,⛔ 谁都不扫别人的 backlog;「归零 = 可发版」指三张板都空。鲜度同发 -现分诊轮;**发版时刻 = 清板不是重扫**;清板三选一与 pin 前置细则见 references。 +个 backlog 恰好一个生产者**,⛔ 谁都不扫别人的 backlog;「归零 = 可发版」指三张板都空。鲜度每 +~5 轮;**发版时刻 = 清板不是重扫**;清板三选一与 pin 前置细则见 references。 **高置信决策卡的分诊代裁(维护者 2026-08-12 裁定)。** 出处原话:「让他帮我从实际业务需求出发, 从平台长远合理性出发,从避免ai写代码犯错的角度出发,从创业阶段不扩散需求的角度出发综合分析……很 @@ -522,8 +521,8 @@ You are the reviewer of record —— **对 GitHub 核验,不对报告的自述 ,加升级项、代裁清单(分诊)、awaiting a human merge 项。健康指标四个(总 open 数刻意不在其 中 —— 债密区发现快于关闭是循环在工作):**dispatchable inventory**(open `pm:queue` 未认领及趋 势);**decision inbox**(待维护者数;分诊简报还要点名带开放下游依赖的决策 -卡 —— 从 `Blocked-by:` 反向索引现算);**finding median age**(老化 = 发现分诊轮欠账);**release -blockers**(三仓 `target:`之和,归零 = 三张板都空)。 +卡 —— 从 `Blocked-by:` 反向索引现算);**finding 数与中位年龄**(裸标签数即未定级数,hold 已换标不 +在内;老化 = 首触欠账);**release blockers**(三仓 `target:`之和,归零 = 三张板都空)。 **波次收工点(维护者 2026-08-09 裁定)。** 班内节奏:一波处理完 → 收工存档 → `/compact` → 再继续, ⛔ 不跑到被自动压缩。四步有序:① 收工点 = 会话内在飞归零(⛔ 不在复核中途压缩;云卡不挡 —— 热移 @@ -535,7 +534,7 @@ blockers**(三仓 `target:`之和,归零 = 三张板都空)。 停:队列空或 `rounds` 用尽(**仅一次性调用适用**);一轮 ≥ 半数派发失败或升级(系统性问题,继续 烧 backlog 是浪费);维护者打断。**常设座位队列清空 ≠ 退场**,是切换待命姿态:巡检放宽 60–70 分 -钟(有在飞收紧回 ≤45),待命五项 —— findings 配合(补证据、上报异议)、`pm:blocked` 解锁扫描(含回 +钟(有在飞收紧回 ≤45),待命五项 —— findings 配合(附证据/前提重验,⛔ 不定级不改标)、`pm:blocked` 解锁扫描(含回 队前 ref 重验与扇出索引更新)、在飞/已入队 PR 跟到 MERGED、决策箱仅在报告中列出 ⛔ 不 nag、跨 车道备忘跟进。退场只有两个入口:维护者交接令(走交接收尾清单),或被惰性回收。 @@ -593,12 +592,13 @@ blockers**(三仓 `target:`之和,归零 = 三张板都空)。 改绑并删除 —— 不是对齐也不是双写;反向裁只在产品语义明确要求时成立且必须写进裁决正文;留着未治 理侧等于给权限闸留旁路。 -**落卡/升级流程**:① **先刷新卡片前提** —— 隔夜没动的卡默认按「前提未经验证」处理; **卡上每条 -前提行自带一条 re-check 命令**(`git log … -- `、REST compare、带引号精确名 grep、 -`ls-remote | grep `),复升级时逐条**跑**一遍,零命中/变形的就地改写或撤卡。② 决策默认 -**锚在所属 issue**(分析发评论、挂`needs-user-decision`、退出活动队列;标签就是维护者的收件箱, -答复后摘标回队);仅当决定无自然锚才单开 `[Decision] <一句话>` 卡。③ 分析(英文)含:背 -景 / 带 re-check命令的前提 / 具体问题 / 选项 / 推荐 / 相关单与 PR。 +**落卡/升级流程**:① **先刷新卡片前提** —— 隔夜没动的卡默认按「前提未经验证」处理;**卡上每条前提 +行自带一条 re-check 命令**(`git log … -- `、REST compare、带引号精确名 grep、`ls-remote | +grep `),复升级时逐条**跑**一遍,零命中/变形的就地改写或撤卡。② 决策默认**锚在所属 issue** +(分析发评论 —— 英文,模板见 references;挂 `needs-user-decision`、退出活动队列),无自然锚才单开 +`[Decision] <一句话>` 卡。③ **答复/代裁到手,裁决记录是一个原子动作,四件同笔**(维护者 2026-08-13) +:鲜度门(录前重读晚于正文最后编辑的评论,有修正的先调和正文)/ 状态转换同笔(决策标签或 finding 定 +级换结果态,永不留挂)/ `Blocked-by:` 活性现验(合并一半也算解除,耗尽行同笔删)/ 条件已判即判(输入已知的就地判掉);案例与机械两旗见 `references/dispatch-runbook.md`。 **每个方案必须沿三条固定评估轴分析,这是决策分析的核心原则,不是可选项:** - **实际业务需求** — 它服务的是**真实存在的业务场景**,还是投机性能力面?判据要求**实测**(谁在 diff --git a/.claude/skills/pm-dispatch/references/dispatch-runbook.md b/.claude/skills/pm-dispatch/references/dispatch-runbook.md index 734bdb0161..84d823b148 100644 --- a/.claude/skills/pm-dispatch/references/dispatch-runbook.md +++ b/.claude/skills/pm-dispatch/references/dispatch-runbook.md @@ -1,8 +1,9 @@ # 派发与收集运行细则(references —— 按需加载) -出处:主文件「候选与批次」「分诊座位职责」「标签纪律」「派发」「收集」。原则住在 -主文件;本表是选卡排序、紧急分诊、接手阻塞项、派发云卡、接手死 dev、处置停摆/重 -放/失报那一刻查阅的操作细则。⛔ 不引用 issue 编号。 +出处:主文件「候选与批次」「分诊座位职责」「标签纪律」「派发」「收集」「升级与决 +策」。原则住在主文件;本表是选卡排序、紧急分诊、发现分诊、落卡与裁决记录、接手阻 +塞项、派发云卡、接手死 dev、处置停摆/重放/失报那一刻查阅的操作细则。⛔ 不引用 +issue 编号。 ## 车道取卡全序与 `pm:blocking`(维护者 2026-08-13) @@ -35,6 +36,60 @@ - 单一生产者纪律照旧:与「代扫」同一条边界 —— 分诊座位在班且已在处理同一张卡即让 行;紧急通道改变的是节奏,不是分类生产者的数目。 +## 发现分诊轮细则(维护者 2026-08-13) + +出处原话(逐字,未译),同日三段:「Finding 很多,是否建议集中分诊」…「按照你的建 +议」= 域分批集中轮的常设授权;「还有这个积压时常态,是否应该优化。」= 结构修复 +令;「积压数字本身有误导 —— 47 张里大半是带重启条件的健康 hold(它们本来就该躺着), +那为什么标 finding」= 状态语义裁定,取代最初提议的「豁免评论 + 计数谓词」机制。 + +- **状态语义**:`finding` 曾同时编码「待首次定级」与「已定级 hold」两个状态,违反 + 「标签即状态机,必须诚实」—— 健康 hold 群把裸计数顶成常红,真未定级堆藏在里面, + 逐轮重验稳定 hold 又吃掉未定级卡需要的预算。修法是**状态转换,不是豁免评论**: + 任何一轮定级出 hold ⇒ 同笔 `finding` → `pm:on-hold`(域标签保留;hold 评论按其 + 既有纪律带日期/理由/具名重启条件,维护者裁 vs 座位定级的出处写在评论里,⛔ 不设 + 第二个标签区分)。座位定级的 hold 本就是座位裁量内的决定,恰合 `pm:on-hold` 的 + 声明语义;换标后继承其既有读者路径(派发前触发文件必查、具名重启条件),重验只 + 在具名重启命中时发生 —— 曾提议的逐卡豁免评论机制已废弃,⛔ 不复活。 +- **首触定级(每轮,预算 3–5 张)**:零定级评论的卡优先 —— 未定级卡的前提准确性半 + 衰期以天计,首触延迟是单卡最大成本(重验考古);旧 hold 重验不占这个预算。三选 + 一:晋级(换 `pm:queue`)/ 关闭 not planned(附理由,列入轮次报告 —— 维护者可否 + 决重开,PM 不等批准)/ hold(换标如上)。**判级发生在分诊轮,不在立单时** —— + 立单 dev 只有局部视野,照实立单不压级。 +- **自动集中轮**:诚实口径 `finding` >15 ⇒ 下一 fire 跑域分批集中轮,15–20 张、同 + 族卡同上下文读;常设授权见上,⛔ 不逐次请示。**sweep 打包晋级五条**(维护者 + 2026-08-07 批准):同类才打包(全部命中同一判据);逐项清单(落点 | before | + after)是 PR 正文必备件;N 项之外零改动且 PR 自证;范围外发现照旧单开;sweep 卡 + 是认领对象,成员单保持标签但不再是可派发候选。 +- **车道证据协议**:车道座位可在本车道 finding 上附证据/前提重验评论(待命五项之 + 一),⛔ 不定级、不改标签 —— 定级单一生产者是分诊席。唯一例外:skills 车道的 + finding 由该席自分诊(座位贴协议既有裁定),全仓分诊轮跳过该车道,防双生产者。 + +## 落卡与裁决记录细则(维护者 2026-08-13) + +出处原话(逐字,未译):「还有很多我发现分诊或者决裁后没有改状态,这个也是问题」… +「这个也需要更新项目经理技能」。实测失效形状(一张决策卡三个叠加半状态):裁决当 +刻标签换了,但推荐已被更早的评论用测量证伪而正文未调和 —— 裁决者读正文,接受了一 +个已不成立的推荐;正文 `Blocked-by:` 的目标已交付一半(测量半边已合并)却原样保 +留,裁决后换标 `pm:blocked` 指着已解除的阻塞;裁决自带的激活条件在记录时已不成 +立,记录步骤无人检查。 + +- **裁决记录四件(原子,记录座位全责;维护者裁与代裁同规)**:① 鲜度门 —— 录前重 + 读晚于正文最后编辑的评论,凡修正推荐/前提/选项的先调和正文(或在记录里内联声明 + 分歧),对过期正文记录的裁决按过期论;② 状态转换同笔 —— `needs-user-decision` + (或 finding 定级)换成结果态(`pm:queue`/`pm:blocked`/`pm:on-hold`/关闭),永 + 不留挂;③ `Blocked-by:` 活性现验 —— 保留或新设的行当场核目标的相关交付物仍未交 + 付(关单不是唯一解除方式,合并了一半也算解除),耗尽的行同笔删;④ 条件已判即判 + —— 条件性裁决在记录时评估其输入是否已知,已可判定的就地解决,⛔ 不留给未来静默 + 触发。 +- **机械两旗(report-only,归半状态巡查;接线是另一张卡的事,⛔ 不随协议文本改脚 + 本)**:旗一 —— open 卡标题带决策标记或线程含裁决记录、却仍挂 + `needs-user-decision`;旗二 —— `pm:blocked` 卡的 `Blocked-by:` 目标已关闭。 + 「交付了一半的阻塞」是判断不是 grep,归上面第③件,⛔ 不进机械旗。 +- **落卡分析模板**(主文件②的 references 细则;英文):背景 / 带 re-check 命令的 + 前提 / 具体问题 / 选项 / 推荐 / 相关单与 PR;标签就是维护者的收件箱,答复后按上 + 面四件录裁。 + ## 云卡(`mode:cloud`)四课 一次性云卡用 `create_session`,⛔ 不用 create_trigger+fire(维护者 2026-08-07 拍 diff --git a/.claude/skills/pm-dispatch/references/seat-post-protocol.md b/.claude/skills/pm-dispatch/references/seat-post-protocol.md index b96d708c16..81a54eec7b 100644 --- a/.claude/skills/pm-dispatch/references/seat-post-protocol.md +++ b/.claude/skills/pm-dispatch/references/seat-post-protocol.md @@ -101,8 +101,8 @@ 条);等价的 org 级搜索 `org:… label:target: is:open` 仅是备用写法。「归零 = 可发版」指三张板都空,单看主仓归零不是。⛔「姊妹仓命中即误标」的旧读法已废除 —— 它教读者销毁真实阻塞的唯一证据。 -- 鲜度:与发现分诊轮同节奏(每 ~5 轮)对板上 open 项做过时前提检查,已修/不成立的摘 - 牌 + 一句评论。 +- 鲜度:每 ~5 轮对板上 open 项做过时前提检查(原「与发现分诊轮同节奏」;首触定级改 + 为每轮后,本板自持此节奏),已修/不成立的摘牌 + 一句评论。 - 发版时刻 = 清板,不是重扫:板上每条三选一 —— 修掉 / 摘牌(不再成立)/ **明示接受 带病发布**(摘标签 + accepted-for-GA 评论留痕,进 release notes 的 known issues);三仓各自执行、读数回贴,⛔ 不因「前端仓/独立部署」整批默认接受。