依据:两份既有 review 的交集与差异合并而成。这里保留我自己的判断:把“会让主循环跑不起来”的问题放到最前,
F1级别的宿主 CLI 缝降为 follow-up,不抢 blocker 位。
整体上,M1-M4 的架构方向是对的:DTO 隔离、确定性编排、宿主壳生成、知识迁移这几条主线都立住了。
但如果按“真实作者流程能不能稳定跑通”来审,当前仍有几处会直接卡住主循环,不能算完全收口。
结论分层:
next 可能重抄旧章finalize 写入新正文后没有同步刷新 .cache/index.db,而 next 侧只会在缓存缺失/损坏/空表时重建。
这会导致磁盘已经写了新章,但状态机仍按旧 MAX(chapter_num) 继续跑,出现“已定稿第 3 章,却又起第 3 章细纲”的回环。
这是主循环级问题,不是 smoke 推迟能覆盖掉的。
当前 persistCreateBook 只写 book.yaml / 总纲.md / 第01卷.md,没有把 git init、core.quotepath false、.gitignore 这几件事真正落地。
结果是新书仓库未必可直接定稿,缓存也可能被错误跟踪,后续写章和提交链路会断。
persistCreateBook、persistVolumeReview、persistRepair、persistReviewReport 都是顺序写多个文件。中途失败会留下半套产物。
这和“定稿必须原子”“多文件写入要么全成要么原样保留”的规范冲突,属于实打实的数据完整性风险。
两审输入里,设计要求的 相关条目、名册待确认新专名 还没有真正进入 DTO。
另外,相关角色靠 草稿全文.includes(name) 按文件名正名命中,别名不会被纳入。这样会让审查上下文缺料,尤其是作者正文里常用别名时。
validateReviewReport 默认假设 issues 里的每个元素都是对象。只要混进 null、字符串或别的坏值,就可能直接抛异常。
同时 blocking 现在是 !!issue.blocking,字符串 "false" 这类值会被当成真,语义上太松。
设计文档写的是保存 raw output,但当前 评审报告/事实审查.json、编辑审.json 实际写入的是校验器复算后的对象。
这会让后续排查模型漂移、对比原始输出变难。
books.jsonl 部分损坏时没有触发真正的自愈现在只要 books.jsonl 还能读出部分有效行,就不会进入扫描重建。坏行会被吞掉,但不会回写修复。
这会让书单长期处在“半坏不坏”的状态。
host shell validator 里的绝对路径正则只覆盖少数 Windows/Linux 用户目录形态,像 /tmp/...、/opt/...、UNC 路径、C:/... 这类都可能漏掉。
这会削弱“生成物不带本机绝对路径”的保证。
规范里列的是五张表,但实现里实际上还有 entity_aliases。
这不是代码错,是 spec 漏列了,后续如果不回填,所有审查都会在这里卡一次。
规范一边说未知字段要保留原样写回,一边又禁止嵌套映射。
这两个约束现在没有明确边界,作者一旦加自定义嵌套字段,脚本会和规范互相打架。
core.quotepath false 的责任方没明确规范要求它必须设置,但没有说明是建书、安装器还是别的入口负责。
没有责任方,就很容易像现在这样没人真正实现。
错误处理规范要求多文件写入原子,但 review / persist 这条链路天然就是多文件。
规范要么补豁免边界,要么补统一的原子写入模式,否则实现永远会显得“不合规”。
数据库列定义、错误退出码、AI 调用预算、日志/CLI 约定等都还停在“待增量补充”。
M1-M4 已经推进到能跑主流程的阶段,这些空白该回填,不然后续任务的依据会一直悬着。
第一份 review 提到的“宿主 CLI 缝”和真模型 smoke 推迟,我保留,但它更像后续接线问题,不是当前最核心的阻断项。
第二份 review 抓到的主循环缺口更重,所以最终版应以前者为 follow-up、以后者为 blocker。