# v7 边界收口:格式对齐与状态机判定修复 > 来源:2026-07-02 设计边界回顾(作者逐项确认)。文档侧裁决已由 `07-02-v7-boundary-doc-backfill` 落进 spec 0.9 / PRD 1.1 / multi-agent v3.5 / 实施计划 0.3(commit 871c448)——**本任务以 spec 0.9 为依据改代码**。 > 定位:M5 安装器的前置(实施计划 0.3 §0 已登记)。deep review 的判断同样适用:"否则 M5 安装器接一个跑不通的循环"。 ## Goal 消除"格式法律文本 ↔ 参考实现"漂移中该改代码的一侧(3 项),修复状态机三个判定边界 bug(含收卷声明制落地),补齐机检/备料/ReviewInput 三处缺料。九项全部对齐 spec 0.9。 ## Requirements ### A. 格式对齐(spec 0.9 §2.1/§4.3/§4.6,改代码从 spec) - A1 **卷纲路径**:`大纲/第NN卷.md` → `大纲/卷纲/第NN卷.md`。涉及 `OutlineReader`(读取与 `listVolumes` 正则)、`persist.js`(`persistCreateBook`/`persistVolumeReview`)、测试 fixtures、相关测试。 - A2 **卷摘要文件名**:`定稿/摘要/卷摘要/NN.md` → `第NN卷.md`(与时间线、卷纲同形态)。 - A3 **信息差字段名**:`谁知道`/`读者知道` → `知情人`/`读者已知`(spec §4.3)。涉及 `rebuilder.js`、`SecretWriter`/`SecretReader` 及注释、fixtures、机检测试。无存量用户数据,直接切换、不做旧字段兼容读取。 ### B. 状态机判定(spec 0.9 §10) - B1 **收卷声明制**(决策 27):序 4 判定由 `maxChapter % 卷规模 === 0` 改为"最新定稿章 front matter `收卷: 是`"。链路:`chapters` 缓存表加收卷列(重建器填充;缓存可删重建,无迁移问题)→ `detectors`/状态机改判定 → 序 6 细纲 DTO 的期望产物文案补"可含收卷提议(依据卷纲进度与卷规模参考值)"。 - B2 **序 5 体检判定**(决策 29):`% 体检周期 === 0` 改"距上次体检 ≥ 体检周期";上次体检章号存 `.cache`(丢失重测无害,符合派生物语义)。**必须配最小体检执行点**,否则新语义下序 5 自第 50 章起每次启动命中、主循环卡死:新增 `health-check` 脚本命令(零 token),汇总既有报表(悬了太久、条目活跃率、连续弱钩)落 `工作区/体检报告.md` 并记录上次体检章号;文体统计项标注"随 M5.5"。 - B3 **序 0 源文件清单**(决策 28):`detectParseFailures` 按 spec 清单补扫 `book.yaml`、`文风/文风铁律.md` front matter、`定稿/设定/名册.md` 表、`定稿/设定/时间线/` 表;解析失败进序 0 修复确认,不再静默降级为默认值。 - B4 **序 3 未完成流程**(决策 29):`hasUnfinishedWork` 把 `细纲.md`、`本章写作材料.md` 计入(对齐 spec 续跑映射表),已确认细纲不再被序 6 覆盖。 ### C. 缺料补齐(spec 0.9 §8) - C1 **机检补"条目变动形式检查"**(§8 第 5 步;M2 D2 七项之一,漏做):草稿 front matter 声明的条目变动做两条纯形式校验——①声明的条目 ID 在 `threads` 表存在("埋下"相反:要求 ID 不存在);②生命周期动词与条目当前状态兼容(推进/回收/揭晓等要求状态=进行)。查表即可,不判语义。 - C2 **备料信息差边界补内容**(§8 第 3 步;PRD §4 #3"注入出场人物知识边界"):每条未揭晓信息差由只给 ID 改为注入 短题+知情人+关键词+内容首句,并明示"除知情人的对话与视角外不得出现"。 - C3 **ReviewInput 补 evidence 维度数据**(§8 第 6 步③):相关条目由纯元数据扩为附 履历尾部 N 行;新增"拟条目变动"(来自草稿 front matter 的 伏笔/悬念/感情线 声明)。`roles/事实审查.md` 输入清单同步补"相关条目(含拟变动与近期履历)"。边界说明:含证据引用的"拟履历行"起草与核对随 M5 F1 接线(`save-review`/`finalize` 通道),不在本任务。 ## Constraints - 依据只认 spec 0.9 文本;实现与 spec 再冲突时停下来改 spec(走决策记录),不得代码侧自行发挥。 - 零新增运行时依赖;错误全中文、永不带堆栈(既有规范)。 - 测试是探针不是约束:过时的路径/字段断言随格式对齐一并改;新判定逻辑各配正反用例。 - roles 单源改动后跑 drift check / package validator(`v7/scripts/`),dist 生成物不提交。 - Windows 中文路径 CI(双平台矩阵)保持绿。 ## Acceptance Criteria - [x] AC1 格式三项与 spec 0.9 一致:全库 grep 无扁平卷纲路径、无 `谁知道`/`读者知道`;卷摘要写出 `第NN卷.md`。fixtures 同步。 - [x] AC2 收卷链路端到端:定稿一章带 `收卷: 是` → 重建缓存 → `next` 判序 4 卷复盘;不带收卷的第 40/80 章 → 不触发卷复盘(旧整除行为消失)。 - [x] AC3 体检按"距上次体检 ≥ 周期"触发;体检记录随 `.cache` 删除后重测不报错。 - [x] AC4 序 0 用例:损坏的 book.yaml / 文风铁律 / 名册 / 时间线 各注入一例 → `next` 返回序 0 修复确认;不再出现"静默用默认值"路径。 - [x] AC5 序 3 用例:工作区仅存 细纲.md → `next` 返回序 3(续跑),细纲文件未被改写。 - [x] AC6 机检条目形式检查:声明不存在 ID、动词与状态不兼容、"埋下"撞已有 ID 三类各有用例并报 issue。 - [x] AC7 备料产物含信息差 短题/知情人/关键词/内容首句;ReviewInput 含拟条目变动与履历尾部(测试断言)。 - [x] AC8 全量 `node --test` 绿;「删光 `.cache` 全量重建」用例绿;drift check + validator 绿。 ## Out of Scope - F1 宿主 CLI 缝(`next --json`/`review-input`/`save-review`/`persist-*`/`finalize` 命令)→ M5(实施计划 0.3 已列清单)。 - 体检统计项实现(高频意象/句式体检/指纹提取)→ M5.5。 - 拟履历行的起草流程 → M5 F1 接线。