# M3 状态机单入口 + git 隐身全套

## Goal

给作者**一个入口和「继续」**：单入口状态机先跑 git 健康检查（作者永不直面 git 报错，不变量 8），再按序判定当前该做什么（spec §10 序 0-6，命中即停），把 v6 的 8 个命令全部内化为状态流转。状态机只管编排，不判业务、不调 AI（AI 动作备好 DTO 交 M4）。

> 上游法律文本：story-repo-spec §9（中环/外环/例外）、§10（启动序列与状态机）、不变量 8（作者不碰 git）。架构原则 v7-implementation-plan §1.5（状态机只管流程编排）。

## Background（已确认事实，来自 spec §9/§10 + M1/M2 成果）

**启动序列**（§10）：第 0 步前先跑 **git 健康检查**——半提交、合并冲突、锁文件、`.git` 损坏、网盘冲突副本（`xxx (1).md`），每种配自动修复或人话指引。然后按序判定，命中即停：

| 序 | 条件 | 动作 | 执行体 |
|----|------|------|--------|
| 0 | 任一源文件解析失败 | 修复确认（定位到行 + AI 提议修复 + 作者确认；全角冒号/逗号在结构位 = 确定性错误，预修复后只报不问；永不带栈崩） | 检测=脚本，提议=AI(M4) |
| 1 | 无书 / 当前书不存在 | 建书引导（问答生成 book.yaml/总纲/第一卷卷纲 + 指路 AGENTS.md + 登记 books.jsonl） | 问答=AI(M4)，脚手架=脚本 |
| 2 | 定稿/大纲有未登记手改 | 提议 fix 补登（`fix(设定): …`） | 脚本（git diff vs 缓存） |
| 3 | 工作区有未完成流程（含待定稿批次） | 从中断阶段继续 | 脚本（检测工作区状态） |
| 4 | 刚定稿是卷末章 | 卷复盘 | 清账=脚本，对谈=AI(M4) |
| 5 | 章号到体检周期 | 体检 | 条目活跃率/时间线孤儿=脚本，文体指纹=M3+/M4 |
| 6 | 其余 | 起草新章细纲（内环第 1 步） | 全书近况=脚本(M2 已有)，拟提案=AI(M4) |

**外环/例外流程**（§9）：
- 影响分析（**纯脚本**）：grep 正文+条目履历+时间线，列「哪些章建立在这个事实上」，分已发布/未发布两清单。
- 回到第 N 章（人话命令）：git 回滚包装，执行前展示影响范围 + 作者确认。
- 吃书 retcon：改定稿，commit `retcon(N): 原因`，设定/条目同步，留痕。
- 手改检测：即序 2。
- 分支试写：AI 代开 git 分支 `what-if/…`（git=脚本，推演=AI M4）。

**不变量 8**：作者全程不碰 git 命令，不直面 git 报错。

**M1/M2 已就绪可复用**：M1 读接口（grep-story 给影响分析、reports 给体检/近况）+ `.cache` 重建器；M2 `assembleBookStatus`（序 6 近况）、`finalizeChapter`（git 操作范式 + git.js 封装可扩展）、机检/备料。

**现有空壳**：`v7/src/state-machine/`、`v7/src/installer/`（M0 占位）。

## Requirements（待 brainstorm 收敛，先列骨架）

- R1 git 健康检查：检测半提交/冲突/锁/损坏/网盘副本，各配自动修复或中文指引，永不抛 git 原始报错
- R2 状态机单入口：按 §10 序 0-6 命中即停判定，返回「当前态 + 该做什么」；状态机不判业务、不调 AI
- R3 各态检测逻辑（脚本部分）：解析失败(0)、无书(1)、未登记手改(2)、工作区未完成(3)、卷末章(4)、体检周期(5)、其余(6)
- R4 外环纯脚本流程：影响分析、回到第 N 章、吃书 retcon、（分支试写 git 部分）
- R5 AI 态 DTO 缝：AI 动作（建书问答/修复提议/卷复盘对谈/细纲提案/推演）备好上下文 DTO，返回「需 AI」结果交 M4

## Acceptance Criteria（来自 §10 M3 出口，待细化）

- [ ] 7 个态各有端到端测试（构造命中各序的仓库样本，断言状态机判定正确）
- [ ] git 异常样本库逐个演练（半提交/冲突/锁/损坏/网盘副本），作者可见输出**零英文堆栈**
- [ ] 影响分析/回到第 N 章/吃书 纯脚本流程有测试
- [ ] 不破坏 M1/M2 不变量（删缓存可重建、定稿原子）

## Out of Scope

- ❌ AI 态的真实动作（建书问答/修复提议/卷复盘对谈/细纲提案/分支推演/圆设定）→ M4（M3 只备 DTO + 返回「需 AI」）
- ❌ 体检的文体指纹提取 → M3+/M4（M3 体检只做条目活跃率/时间线孤儿等脚本项）
- ❌ 自动模式连写/批次/污染传播 → M6
- ❌ SessionStart hook 注入实现 → M4/M5（M3 提供状态机入口等价路径）

## 决策记录（brainstorm）

- **D1 范围与粒度**：单任务分期（同 M1/M2）。M3 做满**全部脚本面**——git 健康检查（5 类异常 + 中文指引）、状态机路由器（序 0-6 命中即停）、7 态的检测逻辑、外环纯脚本流程（影响分析 / 回到第N章 / 吃书 retcon / 手改补登 / 分支试写 git 部分）。**AI 态动作（建书问答/修复提议/卷复盘对谈/细纲提案/推演/圆设定）→ 只做「检测 + 备 DTO + 返回需 AI」交 M4**；体检文体指纹提取推 M3+（M3 体检只做条目活跃率/时间线孤儿脚本项）。单入口 = 库函数 `determineNextState(ctx)` + 一个 CLI 命令，SessionStart hook 注入留 M4/M5。分期：git健康 → 路由+7态检测 → 外环脚本流程 → AI 态 DTO 缝。

- **D2 git 健康检查 = 激进自动修复（B）+ 可恢复安全网**：尽量自动修、少打扰作者，但**每个改 git 状态的修复前先做可恢复快照**（stash / 备份 ref / 文件挪到 `工作区/.救援/` 而非删除），修复后给中文小结「修了什么 + 怎么撤」。映射：陈旧锁文件→自动删；网盘副本→自动归档（不删）；半提交→自动 stash（可恢复）；merge 冲突→先备份再 `merge --abort`；`.git` 损坏→**例外**，无安全自动修，只检测 + 中文指引。激进但零数据丢失。

## Open Questions（brainstorm 待答）

- 无（DTO 形态、手改检测机制、影响分析「已发布」边界等技术细节于 design.md 决，按 M1/M2 风格）。
