# M1-M4 合并 Review（最终版）

> 依据：两份既有 review 的交集与差异合并而成。这里保留我自己的判断：把“会让主循环跑不起来”的问题放到最前，`F1` 级别的宿主 CLI 缝降为 follow-up，不抢 blocker 位。

## 结论

整体上，M1-M4 的架构方向是对的：DTO 隔离、确定性编排、宿主壳生成、知识迁移这几条主线都立住了。  
但如果按“真实作者流程能不能稳定跑通”来审，当前仍有几处会直接卡住主循环，不能算完全收口。

**结论分层：**
- **Blocker**：主循环与持久态一致性问题，必须先修。
- **高优先级问题**：review / session / validator 的健壮性缺口，会导致静默漏料或错误接受。
- **Spec 问题**：规范本身有矛盾或责任方未钉死，需要回填，否则后续实现会继续漂。

## Blocker

### B1. 定稿后缓存不重建，`next` 可能重抄旧章

`finalize` 写入新正文后没有同步刷新 `.cache/index.db`，而 `next` 侧只会在缓存缺失/损坏/空表时重建。  
这会导致磁盘已经写了新章，但状态机仍按旧 `MAX(chapter_num)` 继续跑，出现“已定稿第 3 章，却又起第 3 章细纲”的回环。

这是主循环级问题，不是 smoke 推迟能覆盖掉的。

### B2. 建书流程没有把 git 仓库初始化责任落到生产代码

当前 `persistCreateBook` 只写 `book.yaml` / `总纲.md` / `第01卷.md`，没有把 `git init`、`core.quotepath false`、`.gitignore` 这几件事真正落地。  
结果是新书仓库未必可直接定稿，缓存也可能被错误跟踪，后续写章和提交链路会断。

### B3. 多文件写入没有原子边界

`persistCreateBook`、`persistVolumeReview`、`persistRepair`、`persistReviewReport` 都是顺序写多个文件。中途失败会留下半套产物。  
这和“定稿必须原子”“多文件写入要么全成要么原样保留”的规范冲突，属于实打实的数据完整性风险。

## 高优先级问题

### H1. ReviewInput 组装不全，且角色命中只认正名

两审输入里，设计要求的 `相关条目`、`名册待确认新专名` 还没有真正进入 DTO。  
另外，相关角色靠 `草稿全文.includes(name)` 按文件名正名命中，别名不会被纳入。这样会让审查上下文缺料，尤其是作者正文里常用别名时。

### H2. Review schema 对坏输入不够安全

`validateReviewReport` 默认假设 `issues` 里的每个元素都是对象。只要混进 `null`、字符串或别的坏值，就可能直接抛异常。  
同时 `blocking` 现在是 `!!issue.blocking`，字符串 `"false"` 这类值会被当成真，语义上太松。

### H3. 审稿报告保存的是归一化结果，不是原始输出

设计文档写的是保存 raw output，但当前 `评审报告/事实审查.json`、`编辑审.json` 实际写入的是校验器复算后的对象。  
这会让后续排查模型漂移、对比原始输出变难。

### H4. `books.jsonl` 部分损坏时没有触发真正的自愈

现在只要 `books.jsonl` 还能读出部分有效行，就不会进入扫描重建。坏行会被吞掉，但不会回写修复。  
这会让书单长期处在“半坏不坏”的状态。

### H5. 绝对路径检测范围太窄

host shell validator 里的绝对路径正则只覆盖少数 Windows/Linux 用户目录形态，像 `/tmp/...`、`/opt/...`、UNC 路径、`C:/...` 这类都可能漏掉。  
这会削弱“生成物不带本机绝对路径”的保证。

## Spec 问题

### S1. 数据表定义与实现不一致

规范里列的是五张表，但实现里实际上还有 `entity_aliases`。  
这不是代码错，是 spec 漏列了，后续如果不回填，所有审查都会在这里卡一次。

### S2. “未知字段保留” 与 “禁止嵌套映射” 的边界没钉死

规范一边说未知字段要保留原样写回，一边又禁止嵌套映射。  
这两个约束现在没有明确边界，作者一旦加自定义嵌套字段，脚本会和规范互相打架。

### S3. `core.quotepath false` 的责任方没明确

规范要求它必须设置，但没有说明是建书、安装器还是别的入口负责。  
没有责任方，就很容易像现在这样没人真正实现。

### S4. 多文件原子性边界未豁免或未收口

错误处理规范要求多文件写入原子，但 review / persist 这条链路天然就是多文件。  
规范要么补豁免边界，要么补统一的原子写入模式，否则实现永远会显得“不合规”。

### S5. 一些“待增量补充”长期未闭环

数据库列定义、错误退出码、AI 调用预算、日志/CLI 约定等都还停在“待增量补充”。  
M1-M4 已经推进到能跑主流程的阶段，这些空白该回填，不然后续任务的依据会一直悬着。

## 需要保留的判断

第一份 review 提到的“宿主 CLI 缝”和真模型 smoke 推迟，我保留，但它更像后续接线问题，不是当前最核心的阻断项。  
第二份 review 抓到的主循环缺口更重，所以最终版应以前者为 follow-up、以后者为 blocker。

## 最终排序

1. 先修 B1/B2/B3，保证主循环和持久态不再断。
2. 再补 H1-H5，把 review / session / validator 的漏口堵上。
3. 同步回填 S1-S5，免得后续实现继续和 spec 打架。
4. F1 级别的宿主 CLI 缝继续保留为 follow-up，不抢 blocker 位。
