# 关键风险如何验证

完整清单在 [risk-matrix.json](risk-matrix.json)。每项记录失败时应保持的结果、测试入口、适用配置与剩余限制。`python tools/risk_audit.py` 只验证清单可追溯；`verify.py` 在运行结束时还核对该配置的对应测试确实成功执行。不能把清单存在当成测试已运行。

| 风险 | 主要证据 |
| --- | --- |
| 畸形记录 / CRC；选择性读取冒充完整校验 | 单元测试、语料及 `reliability_workflows.py` |
| 旧索引 / 源身份变化；非法预算在 IO 前拒绝 | 历史兼容工作流、故障合同与风险单元测试 |
| 短写 / 零写、ENOSPC、同步/关闭/发布失败 | `fs_fault_workflows.py` 实际注入及结果断言；含 FD 立即复用回归 |
| async 任务取消、共享源与 sink 所有权 | `asyncio/cleanup_test.mbt`，区分取消与失败、清理一次和共享源保持可用 |
| 录制进程中断、批次非法状态或重复恢复 | 实际进程终止工作流、合法 CRC 但非法状态的回归 |
| HTTP / ETag / 缓存损坏；worker 预算与失败 | 本地真实 HTTP、实际 worker、损坏及中断工作流 |
| 文件原子输出与 stdout 部分结果 | CLI 失败合同，必须结合退出码判读 |
| 真实录制中的选择和部分恢复 | [SO-101](../examples/so101/README.md)，独立 Python MCAP 内容/顺序/CRC 对照 |

## 两种测量，分别判读

`python tools/coverage_audit.py` 生成 15 个风险文件的 MoonBit JS **单元测试行覆盖**，报告已覆盖/可执行行和未覆盖行号，包括读取、写入、源扫描、异步管道及 Node 适配层。不是分支覆盖，也没有合并命令行工作流或内嵌 JS。

`python tools/host_coverage.py` 执行文件系统故障、HTTP、worker、缓存四组真实工作流，另用 V8 记录 13 个选定宿主桥接函数的执行。报告绑定编译产物和函数体 SHA-256，保留正计数范围及零计数审阅候选；这些是**编译后 JavaScript 的观测**，不能加到 MoonBit 行覆盖上计算总覆盖率。原始 V8 文件不进入仓库或发布包。

V8 插桩会改变 worker 解压时延，所以原有大消息 deadline 断言保持无插桩运行；另用小型真实 worker 和明确的 15 秒超时测量宿主入口，断言确实提交给 worker。被终止的进程可能来不及写覆盖文件，故障结果仍以工作流断言为证。零计数不等于该源代码路径从未执行。

没有覆盖率百分比准入线。未覆盖位置用于选择后续高价值回归；不能通过重复实现、删除失败断言或把网络失败当成功来改善数字。实际进程终止不证明断电安全，受控 HTTP 不覆盖所有代理，任务取消也不撤回已接受的 host 写入。每个版本的确切平台、提交和报告见[验收入口](verification.md)。
