scripts/pm/check-half-states.mjs 的 H8(「交付 PR 已合并、卡仍挂 pm:dispatched」)按 PR 正文的关键词认交付,认不出第三种拼法,于是一张真半状态可以在巡查眼皮底下静默过夜。
未认领,只作记录。
机制(读码)
h8MergedPrStillDispatched(scripts/pm/check-half-states.mjs:1158)判定「PR 交付了卡 N」的唯一依据是正文:
if(partOfTargets(body).has(n)||closingKeywordTargets(body).has(n)){delivering.push(pr);}⇒ 只认 Part of #N 与 closing keyword。分支名不读,尽管每个 PR 行都带着 head.ref,而本仓的开发分支恒为 claude/issue-<n>-<slug>。
| 事实 | 读数 |
|---|
| 交付 PR | #10824,merged: true,2026-08-21T14:00:28Z |
| 分支 | claude/issue-10757-dedupe-per-request-queries |
| 正文首行 | Refs #10757 —— 两种被认拼法都不是 |
| 卡状态 | 持续 pm:dispatched,直到 2026-08-22 约 12:40 被人工回标(约 22 小时) |
| 巡查 2026-08-22T07:49:49Z(锚 #9857) | 对本卡只报了 H2(有 assignee 无认领评论),无 H8 行 |
同一轮 sweep 对 #9968 / #10497 / #10534 / #10556 / #10638 / #10678 都正常报出了 H8,所以谓词跑了 —— 只有这一笔交付对它不可见。
用另一种口径复测总体
对两仓所有仍挂 pm:dispatched 的开放卡,改用分支前缀head:claude/issue-<n>- 反查交付:
即:这一轮 H8 的漏报率是 1/7(把窗口外的两张排除后)。
修法的形状(是建议,不是处方)
给 H8 加一条分支名兜底:一个已合并 PR 的 head ref 命中 claude/issue-<n>- 时,即使正文没有任何被认拼法,也算交付卡 N。成本低 —— sweep 已经在列 closed PR,行里就带 head.ref。
⚠️ 它放宽了「交付」这个关系:一个以某卡命名、后来被重新划范围的分支,从此会被算作那张卡的交付。所以两个方向都要进脚本自己的 self-test(H8 的用例在 :4963):命中要报,改过范围的反例不能报。
相邻但不是同一个缺陷
scripts/check-partof-closing-keyword.mjs 无法区分「只写了 Fixes 的部分范围 PR」与「完整交付的 PR」—— services 席已在 #10534 的 5377191597 里作为 finding 记下(那条自述 :246 的 self-test 正好断言了反例是 clean)。下手前先查它是否已立卡,别造重复。
没测的
域标签
刻意留空 —— domain:* 只由分诊席产出。我的读法是它的 SUBJECT 是派发协议自身的门禁(比照 scripts/pm/check-governed-merges.mjs 归 domain:skills 的先例),而不是一般开发工具面(domain:devx),但这一判归分诊。
⛔ 顺带排除一个读法:这不是 skills 文本要改的东西。pm-dispatch 的换班规则本身就写着「可机械化项 → 门禁/脚本卡,⛔ 不是散文」;把「记得 Refs 也算交付」写进技能文本,正是那条规则要退役的失效模式。
scripts/pm/check-half-states.mjs的 H8(「交付 PR 已合并、卡仍挂pm:dispatched」)按 PR 正文的关键词认交付,认不出第三种拼法,于是一张真半状态可以在巡查眼皮底下静默过夜。未认领,只作记录。
机制(读码)
h8MergedPrStillDispatched(scripts/pm/check-half-states.mjs:1158)判定「PR 交付了卡 N」的唯一依据是正文:⇒ 只认
Part of #N与 closing keyword。分支名不读,尽管每个 PR 行都带着head.ref,而本仓的开发分支恒为claude/issue-<n>-<slug>。标本:#10757
merged: true,2026-08-21T14:00:28Zclaude/issue-10757-dedupe-per-request-queriesRefs #10757—— 两种被认拼法都不是pm:dispatched,直到 2026-08-22 约 12:40 被人工回标(约 22 小时)同一轮 sweep 对 #9968 / #10497 / #10534 / #10556 / #10638 / #10678 都正常报出了 H8,所以谓词跑了 —— 只有这一笔交付对它不可见。
用另一种口径复测总体
对两仓所有仍挂
pm:dispatched的开放卡,改用分支前缀head:claude/issue-<n>-反查交付:verifiedfrom the previous enrollment #10994 07:54、fix(cli): retire theagentgenerator —os g agentnow names ADR-0063 and points at skills #11028 10:31)是在 sweep 跑完之后才合并的 —— 属 H8 自述的窗口边界,不是缺陷;Authenticated data requests issue ~20 DB queries in ~17 sequential legs — per-request auth/session/localization/metadata resolution has no cross-request caching, costing ~1.5s/request on remote Postgres #10757 是真漏报。skip-changeset标签两次由 dev 声明却未落到 PR 上 —— 疑似 os-dev 定义/工具面缺口,每次都靠 PM 兜底 + 烧一轮门禁红 #5559 / check:engine-double-contract 看不见「delete 少于两个形参」的假引擎 —— 实测 150 个 double 里 91 个(49 个文件)因此不在扫描面内 #5629)。该仓的 sweep 覆盖本次没查。即:这一轮 H8 的漏报率是 1/7(把窗口外的两张排除后)。
修法的形状(是建议,不是处方)
给 H8 加一条分支名兜底:一个已合并 PR 的 head ref 命中
claude/issue-<n>-时,即使正文没有任何被认拼法,也算交付卡 N。成本低 —— sweep 已经在列 closed PR,行里就带head.ref。:4963):命中要报,改过范围的反例不能报。相邻但不是同一个缺陷
scripts/check-partof-closing-keyword.mjs无法区分「只写了Fixes的部分范围 PR」与「完整交付的 PR」—— services 席已在 #10534 的5377191597里作为 finding 记下(那条自述:246的 self-test 正好断言了反例是 clean)。下手前先查它是否已立卡,别造重复。没测的
Refs #N拼法的交付:只查了当前仍挂pm:dispatched的卡。pm:dispatchedleaves the patrol's view forever; 129 have #10688 已记),那类本来就在它视野外。域标签
刻意留空 ——
domain:*只由分诊席产出。我的读法是它的 SUBJECT 是派发协议自身的门禁(比照scripts/pm/check-governed-merges.mjs归domain:skills的先例),而不是一般开发工具面(domain:devx),但这一判归分诊。⛔ 顺带排除一个读法:这不是 skills 文本要改的东西。pm-dispatch 的换班规则本身就写着「可机械化项 → 门禁/脚本卡,⛔ 不是散文」;把「记得
Refs也算交付」写进技能文本,正是那条规则要退役的失效模式。