<!-- generated-by: codex / 2026-08-26 -->
# 第 13 章任务卡：证据式排查 B-17

## 1. 起点

批处理摘要中出现了范围外材料 B-17。你知道“它不该出现”，但还不知道哪一步让它进入结果。

## 2. 只读输入

- `inputs/chapter-13/allowed-scope.json`
- `inputs/chapter-13/B-17.md`
- `inputs/chapter-13/incident-request.md`
- 第 12 章结果、异常与决定

## 3. 唯一写入位置

只写 `workbench/incident/`。先保存的现场文件不得覆盖。

## 4. 本章唯一成果

交付 `symptom.md`、`timeline.md`、`hypotheses.md`、`before-summary.md`、`red.log`、`fix.md`、`after-summary.md`、`green.log` 和 `decision.md`。

## 5. 可复制给 Codex 的任务

```text
先把出现 B-17 的摘要原样保存为 workbench/incident/before-summary.md，并写现象、时间线和至少三个仍待验证的假设。运行 `node scripts/run-scope-test.mjs --expect-red workbench/incident/before-summary.md workbench/incident/red.log`；它必须检测到 B-17、直接退出 1，并把命令和失败信息写入 red.log。`run-scope-test.mjs` 是外层命令封装器；日志中的 `COMMAND` 记录它实际调用的底层 `scope-guard`，所以两行命令不同是预期。不要删现场，不要同时改多项。只把摘要生成器的范围过滤从宽泛模式改成 allowed-scope.json 的明确 ID 允许清单，保持其余输入和格式不变，生成 after-summary.md。用同一封装器的 `--expect-green` 再次运行守卫并写 green.log；比较前后允许 ID，写 fix.md 和证据强度诚实的 decision.md，最后运行 npm run check:13。
```

## 6. 你必须亲手完成

先阅读 RED，确认失败来自 B-17 越界而非命令错误；再逐行比较 before/after，确认唯一消失的是 B-17、允许材料仍在；最后把“证实了什么、仍不知道什么”写入 `decision.md`。

## 7. 你应该看到

- 原始现场和 B-17 输入都还在。
- RED 直接退出码为 1，并准确点名 B-17。
- 最小修复只改变范围过滤。
- GREEN 直接退出码为 0，允许 ID 没有丢失。

## 8. 三个真实坑

### 坑 1：先删现场

如果覆盖 `before-summary.md`，就没有可信起点。检查要求 `before-summary.md` 去掉 B-17 那一行后与 `after-summary.md` 保持一致；先保留 before，再运行 RED，才能证明只改变了范围选择。

### 坑 2：一次改多个变量

若同时改过滤、输入和摘要格式，无法归因。差异检查只允许范围选择逻辑和随之消失的 B-17 行变化。

### 坑 3：把解释当根因

假设文件故意列出多个可能。只有一变量复测支持的结论才能标为“已证实”，其余继续保留未知。

## 9. 复选框验收

- [ ] before 现场在任何修改前已保存。
- [ ] RED 因 B-17 越界退出 1。
- [ ] 最小修复只改变范围过滤。
- [ ] GREEN 退出 0 且允许材料完整。
- [ ] `npm run check:13` 通过。

## 10. 停止、回退与交接

无法保存现场、RED 原因不对、差异超过一个变量或允许材料丢失时停止。回退为恢复过滤基线并保留全部事件证据。交给第 14 章的是修复后的允许范围、前后摘要、RED/GREEN 与证据结论，不交一个被夸大的“全部解决”声明。
