# $cm-prd Step 10.5 — 规格自检

输出摘要卡之前，先对刚生成的三件套与可选测试合同跑机器可查项。机器项由 AI
自行清干净；拆分审查补正的单次检查仍失败时，保留失败交人裁决。

## 通用自检项

- [ ] 任务依赖无环；单 feature ≤15 个任务；首次新计划中的相关低风险工作围绕同一可独立验证/回退目标合并，逐项 AC、原始测试和验证前提保留
- [ ] 高风险、风险未知、用户明确独立要求和不相关工作未被硬合并；同文件/组件不足以证明可合并，依据需求、设计和真实上下文检查，不用关键词代替风险判断
- [ ] 已生成草稿、自检修订、恢复、change 和在途任务未因上述合并原则重分；开发范围变化仍须显式 change 及重新批准
- [ ] 基线/度量任务仅在后续任务真正读取其产物时作为前置；接口签名已冻结且可分人时已先拆契约任务，实现方与调用方都依赖契约任务、彼此不依赖，调用方与实现方任务描述已说明「契约任务的占位体会抛错，这是预期状态，不要等待它被实现、不要因此报 blocked」；新增用例按任务独立测试文件，不向同一个已有测试文件追加
- [ ] 每个未作废任务都写了 `- 范围:`（具体相对文件路径，或列不出时写 `串行`）；测试文件在范围之内；要用设备的任务标了 `- 设备: 需要`（机器项，规则第 3 版）
- [ ] 每条 AC 都能回答“怎么验证”；验证方式不明的 AC 视为不过
- [ ] test-cases.json 语法/结构合法，AC→TC→Task 完整，用户用例未被弱化
- [ ] 任务产物查重：不与项目已有资产重复；有地图查 04/05/06，无地图用代码搜索核实
- [ ] **开发归属**（语义项）：浏览器或设备**人工**走查、材料阅读任务归属正确，人工走查单列为功能末任务并标 `- 开发: 会话`；只靠设备跑自动检查的任务不因 `- 设备: 需要` 改标会话；既改代码又要走查的混合任务已拆成「实现」和「走查」两个任务
- [ ] **会话任务位置**（机器项，随任务语法 3 与新版自检规则由宿主检查）：`- 开发: 会话` 的任务每个功能最多一个，且是该功能的最后一个任务、不在并行组里；已被语义项认定引用基线的用例，`taskIds` 含首个改代码任务

## 二开附加项（存在业务地图时）

- [ ] **引用真实性**：specs 提到的每个存量文件/函数/组件名都已用代码搜索核实
  真实存在（二开引用不存在的存量代码，人审通常发现不了、执行期才会失败）
- [ ] **B5 合规**：feature 未跨多条 07 业务线路；跨模块任务已列出模块清单
- [ ] **B3 合规**（语义项）：修改存量模块的 feature 有防护网基线。有可运行测试资产时，不单列基线任务，首个改代码任务的验证要求写了「宿主以改动前的代码重放项目检查，记录基线结果与可识别的测试计数」（开发方标 `run:"baseline"`），且前提写清：`verification:"auto"`、单代码根、相对路径命令覆盖存量测试；无测试资产时，首任务是现状快照测试
- [ ] **基线引用**（语义项）：`expected` 文字依赖基线的用例（如「用例数不少于基线」）已逐条找出，其 `taskIds` 含首个改代码任务，锚点写「首个改代码任务的宿主重放基线」；数值型基线要求已确认所选命令覆盖存量测试、能给出可比较的计数
- [ ] **B2 完整**：design.md 含「波及面」段，所列模块在地图/代码中真实存在

设计已接受后，只有整稿自检明确失败，才可在原重生成步骤修改同批已有 feature 的
requirements.md、design.md 正文；必须填写非空修订原因，不得增删 feature 或文件。
宿主把改动文件、前后摘要、原因、轮次和所回应的失败记录绑定到会话；通过重跑后用 save_draft 保存新版，
不先手改磁盘。失败记录与已用轮次保留，不能靠修订增加轮次；未知结果不算失败。

接受顺序为：已完成拆分处置的版本 → 已登记并保存的自检修订 → 原设计阶段版本。
拆分审查必须读取修订版；旧版审查不能授权新版。摘要在各 feature 的风险信息旁说明原因和改动文件，
明确这些改动由拆分审查审阅、未另做设计审查；这条说明本身不阻断交付，也不增加审查调用。

首次整稿有不过项时自行修正 specs 后重跑，最多 2 轮。2 轮后仍不过的项不得静默放行，
写入摘要卡「风险点」交人裁决。自检结果一行附在摘要卡底部。

拆分审查后的补正只检查一次，不适用上述两轮修正。明确失败由 `review_disposition` 记录
`self_check_failed`，失败项与证据进入摘要风险卡，再发布待审或受控修订；不能把失败改写成通过。
