# M6 实施清单

执行方式：inline（M1-M5.5 先例），四期每期一 commit，期末验证绿才进下期。上下文顺序：prd → design → 本清单；Phase 2 起步走 trellis-before-dev。

## P1 staging 模块 + stage/status 命令

- [x] P1.0 前置缺口修复（prd 决策 D7）：`ThreadLedgerWriter.createThread({id, frontMatter, body, 短题})`（拒绝已存在编号/非法类型）+ `finalizeChapter` payload 增 `threadCreates`（进同一 stage/rollback 集合）；`v7/test/finalize/` 补"埋下→定稿→条目文件在→缓存含新条目→下一章推进机检零误报"接力用例
- [x] P1.1 `v7/src/staging/index.js`：readBatch / stagedFacts / stageChapter / judgeStop / judgeBatchQuality / rejectFrom / discardBatch（契约 design §2.1-2.4、§2.7）；目录名净化与 ChapterWriter 同源（抽 `src/util/filename.js` 或等价，两处共用）
- [x] P1.2 BookConfigReader defaults 加 `连写无条目变动上限: 3`
- [x] P1.3 `v7/src/commands/stage-chapter.js` + `batch-status.js`（薄壳，`--payload` 走 readJsonInput 先例）；bin 注册
- [x] P1.4 `v7/test/staging/index.test.js` + `v7/test/commands/stage-chapter.test.js`：
  - 章号连续性（跳章/重章拒绝；批内已存在章号=覆盖重暂存）
  - 前置校验零写入；审稿单缺失拒绝
  - 落盘三件套 + 批次.json 状态/计数；工作区单章文件清干净
  - judgeStop 四件套逐一（写满/收卷/卷纲耗尽/连续无条目变动）；judgeBatchQuality 三判据（弱钩尾/缺书内时间/句式 vs 基线 29% 不停 31% 停）
  - 批次.json 损坏 → 扫描重建、状态保守回「受影响」

验证：`node --test v7/test/staging/ v7/test/commands/stage-chapter.test.js`（注意目录参数怪癖，必要时列文件）
提交：`feat(v7): M6 P1——staging 批次模块与 stage-chapter/batch-status`

## P2 叠加视图三消费点

- [x] P2.1 `prep/index.js`：近章结尾/时间线/信息差/全书近况叠加（design §2.5）；无批次零变化
- [x] P2.2 `review/index.js assembleReviewInput`：相关条目/名册/相关角色/时间线/信息差/近况叠加
- [x] P2.3 `mechanical-check/index.js`：三个 known 集合并入 staged 事实
- [x] P2.4 测试：`v7/test/prep/`、`v7/test/review/`、`v7/test/mechanical-check/` 各补批次两态用例——AC2 批内依赖主用例（K 章埋伏笔+新角色+时间线行 → K+1 备料/审稿输入/机检三面验证）；AC7 前半（批次进行中删缓存重建 → 叠加输出深等不变）（集中在 `test/staging/overlay.test.js`，另含重审不倒灌用例——stagedFacts 增 before 过滤）
- [x] P2.5 既有测试零改动仍绿（AC5 全关矩阵的回归面）——全量 398 绿

验证：`node --test v7/test/prep/ v7/test/review/ v7/test/mechanical-check/`（列文件跑）
提交：`feat(v7): M6 P2——备料/审稿输入/机检叠加视图（批内依赖）`

## P3 批量定稿与污染传播

- [x] P3.1 `staging.finalizeBatch`（design §2.6：入口硬校验全待审收、升序逐章原子、失败停在该章、`--until`、尾部例行体检提示）+ `v7/src/commands/finalize-batch.js`
- [x] P3.2 `batch-reject` / `batch-restage` / `batch-discard` 命令 + rejectFrom 污染标记（K 打回清工件、K+1..N 受影响）
- [x] P3.3 测试 `v7/test/staging/finalize-batch.test.js`（gitBookCtx 先例）：
  - AC1 端到端：stage×3 → finalize-batch → 三 commit 按序、入档内容与手动 finalizeChapter 逐字段一致、批次清空、next 报下一章
  - AC3 注入错误恢复演练：打回第 2 章 → 3..N 受影响 → finalize-batch 拒绝（人话列障碍）→ 重写重审回待审收 → 成功；grep 全部 commit 确认打回章旧内容零泄漏
  - 中途失败按章保留（坏定稿包注入第 4 章，等价 faultAfterWrite）：第 3 章已入档保留、失败章留批次、报告如实
  - AC6 batch-discard：定稿零变化、工作区净、next 回序 6
  - AC7 后半：全程 fingerprints/meta imagery_top 无 staged 数据断言
  - 追加：--until 截断转正 + next 报批次续跑

验证：`node --test v7/test/staging/`（列文件）
提交：`feat(v7): M6 P3——finalize-batch 逐章原子转正与打回污染传播`

## P4 状态机/宿主接线 + 收口

- [x] P4.1 序 3 dto 批次明细 + 序 6 dto `自动确认细纲` 标志（design §2.8）；`v7/test/state-machine/` 补用例，router.test.js 既有断言不改
- [x] P4.2 SKILL.md「自动模式（连写）」段 + 三平台壳重渲染（`node scripts/build-host-shells.mjs`）+ drift check 绿；批次五命令入 SKILL 写章流程/例外流程表
- [x] P4.3 开关矩阵测试（AC5）：四组合行为断言（全关=现状包含在既有回归；单开各一用例；全开=AC1 引用）——`test/state-machine/auto-mode.test.js`
- [x] P4.4 全量 `node --test`（Windows 本机）407 绿 + AC1-AC8 复核、prd.md 打勾（AC8 CI 部分待 push）
- [x] P4.5 spec 回填（Phase 3.3）：story-repo-spec 0.12（§3 `连写无条目变动上限` 键；§8.1 实现口径——批次三件套/三态/污染传播/stage 前置审稿单/质检判据；§8 第 8 步条目创建；决策 36-37）；multi-agent spec v3.7（SKILL 自动模式段 + §5.1 批次不开第二条写入路径）；v7-implementation-plan §M6 出口标注（含两处实现偏离记录）；backend database-guidelines 增 §7 工作区暂存数据四条
- [x] P4.6 commit + push（28acfd2 代码 / f514a31 spec 回填），CI 双平台绿（run 28732587038 六 job）；prd.md AC8 已回填 run 号

提交：`feat(v7): M6 P4——状态机批次感知、SKILL 自动模式段与开关矩阵` + `docs(v7): M6 spec 回填`

## 风险与回滚点

- 机检/备料/审稿是主循环热路径——叠加必须以 `readBatch().exists` 为总开关，无批次分支零额外 IO（AC5 全关矩阵 + 既有全量测试把关）
- `finalizeChapter` 复用时 workspaceFiles 语义：批次章的工作区文件已在 stage 时清过，payload 转正时 workspaceFiles 应为空/仅剩批次目录——finalize-batch 负责置空并自管批次目录删除，防误删他章工件
- 批次.json 是单点：损坏走扫描重建（保守回受影响），测试覆盖
- 每期独立 commit 可 revert；批次数据在工作区，代码回退无残留
