fix(w05): S2 测试的 stepOf 类型保护改用泛型 Extract,补 {} 兜底的第二个坑

评审判定 PlanStep 标注太松:.fields 落在契约的开放索引签名上,拼写保护回来了但
14 处方括号取值(含 S1 既有三条)全部失去编译期拼写检查。换成泛型 Extract 版
(case-model.ts 四处 item 补 as const 配合),按查的 item 精确narrow 到那一步自己的形状。

Extract 单独应用后 tsc 仍报 13 个错——根因是 brief 给的 7 处测试断言用 `: {}` 兜底,
而"有形对象类型 | {}"在 TS 里恒被吸收成裸 {}(与 stepOf 精不精确无关,5 个隔离复现验证过),
S1 既有断言用的是 `: undefined` 从未踩过。补齐 `: {}` → `: undefined` + `?.` 与两处
for-of 数组补 as const 后,拼错实验复现 TS2551 + "Did you mean" 建议,改回后零错误。

debt.md 补一条:analyze 出参靠 requiredWhen 兜底的字段漏填时,全 auto 步没有就近恢复点
(ADR-014 通用特性,不是 W05 的病)。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LKMZDwMbyKzjw6Hembwvet
This commit is contained in:
xcs
2026-08-29 16:18:46 +08:00
co-authored by Claude Opus 5
parent 89f0be8b81
commit 1c6978818c
3 changed files with 73 additions and 34 deletions
+21
View File
@@ -1410,3 +1410,24 @@ loop-engine/__tests__/` import 它们是 `apps → apps`,两条隔离规则一
`w05-gate-reason-order.test.ts`,核一遍 `ACT_*` 六个常量描述的地址/字段写法是否还能代表
`case-model.ts` 当前用到的构造种类;不必逐字同步(那不是这份测试的目标),但要能回答
"如果生产那边这一类写法出了刷新时机的 bug,这份镜像能不能测得出来"。
## `analyze` 出参靠 `requiredWhen` 兜底的字段,漏填时全 auto 步没有就近恢复点(2026-08-29,Task 5 评审)
`S2_assess` 的 `analyze` 出参 schema 里 `unknown_disposition` 不在 `required` 名单——只靠提示词
约束模型「判了 unknown 就必须在这一格写清楚」,漏填由 `manifest.ts:397` 的
`requiredWhen: {column: 'difference_status', value: 'unknown'}` 兜底拦成
`substitution_difference_item_missing > 0`(评审已核过:机制是对的,提交闸与放行门都看得见)。
但 `S2_assess` 全程 `auto`、零 `guide`、零人工卡口——模型这一拍真漏填,当下没有任何东西能就近
接住它,只能等清单声明的 `harness`(`memoryWindow:24, stallAfter:'PT4H',
nudge:[{after:'PT2H',action:'nudge'}], retry:{times:2,backoff:'PT30S'}`)慢慢兜底,
比人工激活步「重发已答过的卡=无事发生」那类近距离恢复慢得多。
**这是 ADR-014 `analyze` 动词的通用基础设施特性,不是 W05 这一个活动的病**——凡是拿 `analyze`
出参配合 `requiredWhen` 兜底可选字段的活动,都会有同一个洞。**把它改进 `required` 是错的**:
`unknown_disposition` 只有 `difference_status = unknown` 的那几行才该填,MATCH 的行填了反而是
编造,逼模型给不需要的行也填一格。
**要治得在 ADR-014 层面**:给 `analyze` 一个「出参不合规(含 `requiredWhen` 这类 JSON Schema
本身表达不了的跨字段约束)就地重问一次」的档,与 `agent-runner` 对模型输出解析不成形时
「就地重问一次,原文经 `note` 存工作日志内部痕,第二次仍不成形才交人」同一族做法
(2026-08-03,见 CLAUDE.md「兜底卡不再摆模型原话」条)——`analyze` 目前没有对应机制。