Skip to content

Commit 3f571a6

Browse files
claude[bot]claude
andauthored
fix(pm): ungate the blocker-liveness comment read, and pair it with a stale-body-line row (H28) (#11874)
`needsBlockedByComments()` returns false whenever the body carries any `Blocked-by:` line. That is correct for H4 — it asks only whether the line EXISTS, and a body line answers that without the network — but H19/H26 borrowed the same gathering to ask a different question: is what the line names still RUNNING. On a RE-PARK (body upstream closed, real prerequisite carded, new blocker written into a comment) the liveness read therefore resolved ONLY the spent body target, found it closed, and published "every target it names is closed" — a FALSE unlock candidate, on three consecutive sweeps, acted on once. The liveness read is now ungated (`needsBlockerLivenessComments` — the label alone), so every `pm:blocked` card contributes both channels. H4's gate is left exactly as-is; its cheap question stays cheap. Ungating alone only turns the false candidate into a PARTIAL one, so H28 is its pair: a body-named target that is CLOSED while a comment names an OPEN one that is absent from the body ⇒ the body line is stale, migrate the live blocker to the body (the canonical home). That enforces the canonical-home doctrine at the moment the wrong shape is written rather than by prose. Self-test 1058 -> 1102 cases, including both legs of the reverse verification over the measured card's recorded byte shape. Claude-Session: https://claude.ai/code/session_01RMTpSRF5CjMmQBFfPtPCwJ Co-authored-by: Claude <noreply@anthropic.com>
1 parent 311e207 commit 3f571a6

2 files changed

Lines changed: 321 additions & 22 deletions

File tree

.claude/skills/pm-dispatch/references/state-machine.md

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,33 +11,33 @@
1111
日期、理由、出处(维护者裁或座位定级,⛔ 不设第二个标签区分)。
1212
- **机会主义重启的触发文件**走同族正典行 **`Restart-touch: <仓内相对路径>`**(一行
1313
一路径,大小写敏感、行锚定,与 `Blocked-by:`/`Restart-when:` 同双通道 —— 正文或评
14-
论任一,H17 兼读 hold 评论;反引号/bullet 可容忍、值须为 tracked 文件)—— 喂半状
15-
态巡查 H17 的 on-hold 触发文件索引,抽取器已随巡查落地、采用即零代码;存量 hold
16-
⛔ 不迁移、不产 finding,散文锚词抽取兜底旧卡。
14+
论任一,H17 兼读 hold 评论;反引号/bullet 可容忍、值须为 tracked 文件)—— 喂巡查
15+
H17 的触发文件索引;存量 hold ⛔ 不迁移、不产 finding,散文锚词抽取兜底旧卡。
1716
- **放行双查(两查皆机械、零判断)**:① 只对**最近一次** `pm:on-hold`/`pm:blocked`
1817
转换评论所载条件放行,⛔ 永不对线程里更早的 blocker —— 已放行过的条件是花掉的,再
1918
点火就把过期前提立成现行;② 该转换评论之后卡上有**更新的 merged PR** ⇒ 拒绝放行
2019
—— 那是条件写下后卡已前进的信号(引用的事实可以为真而不再是现行条件)。
2120

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

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

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

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

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

3940
原定级在改判前仍是权威,并存让「排队但有异议」在列表上可见;挂标者 = 提出异议的席
4041
位,挂标与**异议评论同笔**(证据 + 建议定级),无证据评论的裸挂标不合法;摘标者 =
4142
分诊 Routine,每 fire 高优先重判、重判后摘标 —— 挂/摘分属两方、各自的转换不相交,这
42-
是本行的安全性;标签须五仓存在(分诊五仓统一职责,首次应用时创建);老化兜底归半状
43-
态巡查(年龄谓词随巡查另行落地)。
43+
是本行的安全性;标签须五仓存在(分诊五仓统一职责,首次应用时创建);老化兜底归 H18。

0 commit comments

Comments
 (0)