Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 34 additions & 34 deletions .claude/skills/pm-dispatch/references/state-machine.md
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,43 @@
# 状态机细则(references —— 按需加载)

出处:主文件「状态模型」表(语义一行在表上,本表承载四个长状态的机制细则),做对应
转换、放行或巡查的那一刻查阅;⛔ 不引用 issue 编号。
出处:主文件「状态模型」表,做对应转换、放行或巡查的那一刻查阅;⛔ 不引用 issue 编号。

## 通则 —— 跨状态不变量(判定以 `check-half-states.mjs` H29/H30/H31 为权威)

- **六态 ONE-OF**:`pm:{queue,dispatched,blocked,on-hold,awaiting-maintainer}` +
`needs-user-decision` 互斥;成因恒是半写的转换,故**一笔 replace**、⛔ 不 add。
- **`pm:queue` 腐化视界 3 天**:队列是唯一「等待不是一种状态」的态,越界即欠**一次显
式转换**(派发 / 转 `needs-user-decision` / 停放 / 撤单 / 改写前提),⛔ 不是排期。
- **`needs:contract-review` 双载体**:卡与交付 PR 两边都挂好、挂与清各一笔、两向都读
回(被剥不是红灯是放行);卡侧先挂而 PR 尚不存在是合法中间态,不是半写。

## `pm:on-hold` —— 重启条件、触发文件与放行双查

- **合法性**:仅当正文或评论带机器可读行 `Restart-when: closed <owner/repo>#N`(由
`Blocked-by:` 的同一遍解锁扫描点火、同双通道契约 —— 正文或评论任一即为行,评论停
靠的出口曾静默过期两天)或 `Restart-when: <一行可执行判据>` 时才合法;hold 评论带
日期、理由、出处(维护者裁或座位定级,⛔ 不设第二个标签区分)。
- **机会主义重启的触发文件**走同族正典行 **`Restart-touch: <仓内相对路径>`**(一行
一路径,大小写敏感、行锚定,与 `Blocked-by:`/`Restart-when:` 同双通道 —— 正文或评
论任一,H17 兼读 hold 评论;反引号/bullet 可容忍、值须为 tracked 文件)—— 喂巡查
H17 的触发文件索引;存量 hold ⛔ 不迁移、不产 finding,散文锚词抽取兜底旧卡。
- **放行双查(两查皆机械、零判断)**:① 只对**最近一次** `pm:on-hold`/`pm:blocked`
转换评论所载条件放行,⛔ 永不对线程里更早的 blocker —— 已放行过的条件是花掉的,再
点火就把过期前提立成现行;② 该转换评论之后卡上有**更新的 merged PR** ⇒ 拒绝放行
—— 那是条件写下后卡已前进的信号(引用的事实可以为真而不再是现行条件)。
`Blocked-by:` 的同一遍解锁扫描点火)或 `Restart-when: <一行可执行判据>` 时才合法;
hold 评论带日期、理由、出处(维护者裁或座位定级,⛔ 不设第二个标签区分)。
- **机会主义重启的触发文件**走同族正典行 **`Restart-touch: <仓内相对路径>`**(一行一
路径,大小写敏感、行锚定,与 `Blocked-by:`/`Restart-when:` 同双通道;值须为 tracked
文件)—— 喂巡查 H17 的触发文件索引;存量 hold ⛔ 不迁移、不产 finding。
- **放行双查(两查皆机械、零判断)**:① 只对**最近一次** `pm:on-hold`/`pm:blocked` 转
换评论所载条件放行,⛔ 永不对更早的 blocker —— 已放行过的条件是花掉的,再点火就把
过期前提立成现行;② 该转换评论之后卡上有**更新的 merged PR** ⇒ 拒绝放行。

## `pm:blocked` —— 正典标记、完工停放(`Unlock-action:`)、上游已关

- **正典标记 = 行首 `Blocked-by: #N`(跨仓 `owner/repo#N`)、无装饰**;2026-08-24
实测:四种普查拼法三种已解析,第四种句中提及**刻意拒收** —— 指令是行,提及是散文。
- **工已完、PR 被外部门禁缺陷卡住的卡同用本态,⛔ 不设新标签**:`Blocked-by:` 指向
门禁缺陷卡,正文另加机器可读行 `Unlock-action: re-check PR #M` —— 解锁扫描据此把
解锁动作从「回队重派」换成「重查该 PR 落地」(回队前提检查见到已完工的 open PR 即
按落地工作处理,⛔ 永不给完工卡重派 dev);停放 PR 正文须点名门禁卡,让链路两端可读。
- **上游已关 ⇒ 先重新推导再决定**:改判是否有**新**阻塞并改写该行,⛔ 不反射式放行;
正文是正典家 —— 新 blocker 停评论、正文留已关旧目标,巡查报 stale 并要求迁回。

## `pm:awaiting-maintainer` —— 互斥与出口

与 `pm:queue`/`pm:dispatched`/`pm:blocked`/`pm:on-hold`/`needs-user-decision` **互
斥**(并存即误标);出口 = 维护者完成该操作、座位摘标 + 证据评论同笔 —— **无机器出
口,by construction**,在飞视图计停放库存(细节以 `check-half-states.mjs` 为权威)。

## `pm:retriage` —— 挂/摘两方机制

原定级在改判前仍是权威,并存让「排队但有异议」在列表上可见;挂标者 = 提出异议的席
位,挂标与**异议评论同笔**(证据 + 建议定级),无证据评论的裸挂标不合法;摘标者 =
分诊 Routine,每 fire 高优先重判、重判后摘标 —— 挂/摘分属两方、各自的转换不相交,这
是本行的安全性;标签须五仓存在(分诊五仓统一职责,首次应用时创建);老化兜底归 H18。
- **正典标记 = 行首 `Blocked-by: #N`(跨仓 `owner/repo#N`)、无装饰**;句中提及**刻意
拒收** —— 指令是行,提及是散文。
- **工已完、PR 被外部门禁缺陷卡住的卡同用本态,⛔ 不设新标签**:`Blocked-by:` 指向门禁
缺陷卡,正文另加机器可读行 `Unlock-action: re-check PR #M` —— 解锁扫描据此把解锁
动作从「回队重派」换成「重查该 PR 落地」(回队前提检查见到已完工的 open PR 即按落
地工作处理,⛔ 永不给完工卡重派 dev);停放 PR 正文须点名门禁卡,让链路两端可读。
- **上游已关 ⇒ 先重新推导再决定**:改判是否有**新**阻塞并改写该行,⛔ 不反射式放行;正
文是正典家 —— 新 blocker 停评论、正文留已关旧目标,巡查报 stale 并要求迁回。

## `pm:awaiting-maintainer` 与 `pm:retriage` —— 出口、挂/摘两方

- **awaiting 出口** = 维护者完成该操作、座位摘标 + 证据评论同笔 —— **无机器出口,
by construction**,在飞视图计停放库存(互斥归上面的 ONE-OF 行)。
- **retriage 挂/摘分属两方**:原定级在改判前仍是权威;挂标者 = 提出异议的席位,挂标与
**异议评论同笔**(证据 + 建议定级),无证据评论的裸挂标不合法;摘标者 = 分诊 Routine,
每 fire 高优先重判、重判后摘标;标签须五仓存在(首次应用时创建);老化兜底归 H18。
Loading