# Story Repo 格式规格（v7 草案 0.9）

> 状态：0.9。相对 0.8 的变更（2026-07-02 设计边界回顾，作者逐项确认，决策 27-32 见 §14）：
> - 收卷声明制：§4.1 增「收卷」字段、§7 细纲可提议收卷、§10 序 4 改按声明判定，`卷规模` 退为提示参考
> - §10 序 0 钉死"源文件"清单；序 3 细纲计入未完成流程并补续跑映射表
> - §3 book.yaml 增「体检周期」；§11 表清单补 entity_aliases（六表）
> - §2.2 依赖口径改「运行时直接依赖仅 js-yaml，其余零依赖」
>
> 0.8 相对 0.7 的变更：
> - 新增 D3 决策：未登记伏笔检测——事实审查增 `unregistered_thread` 候选项（§8 第 6 步），声明制补漏网，非阻断
> - 新增 D4 决策：设定↔大纲单向依赖入宪（不变量 13，§4.2 角色卡说明）
>
> 0.7 相对 0.6 的变更：
> - 补充 A1 决策：自动模式待定稿批次的版本链叠加机制（§8.1）
> - 更新 A2 决策：Node >= 22.13.0 运行时要求（§2.2）
> - 明确 A3 决策：履历证据的章节级验证范围（§5 线索条目格式，§11 缓存重建器职责）
> - 调整审稿定义：从三审改为两审（事实审查 + 编辑审），去掉读者审（§8 第 6 步）
> - 补充审稿终止机制：severity + blocking 规则（§8 第 6-7 步）
> - 澄清 B 类问题：缓存删除代价（§11）、关键词扫描边界（§4.3）、两审模式（§8 第 6 步）
> 
> 来源：2026-06-10「最正确架构」讨论 + PRD 1.0（2026-06-12 定稿）+ RFC 后续决策（2026-06-26）+ RFC 深度核验（2026-06-27，Discussion #118 第 8 条评论与 v7 逐条核验）+ 设计边界回顾（2026-07-02）。
> 地位：`v7-prd.md` 是产品法律文本，本规格是**格式法律文本**——两者冲突时以 PRD 为准并修订本规格。代码是格式的派生物：任何实现与本规格冲突时，改实现或改规格，不允许"代码里悄悄多存一份"。
> 范围：本规格管**格式层**（工作目录与 story repo 里有什么、长什么样、怎么变更），平台无关。宿主适配（SKILL.md 入口、subagent 壳、安装器）由 `multi-agent-adaptation-spec-2026-06-05.md`（v3.4）承接。

---

## 0. 一句话

一本书 = 一个 git 仓库。`定稿/` 存已审稿通过的事实与正文，`大纲/` 存作者意图与三类线索条目（伏笔/悬念/感情线），`文风/` 存品味，`工作区/` 存还没定稿的一切。定稿一章 = 一次原子 git commit。除一个可随时删除的缓存外，不存在任何持久派生物。

## 1. 设计不变量（法律条款）

1. **文件即真相**：全部状态是人可读、敢手改的中文 Markdown/YAML。系统检测手改并提议补登，永不报错拒绝。
2. **派生物可丢弃**：删光 `.cache/` 后，系统从源文件全量重建，所有查询照常回答。这是 CI 验收项。`books.jsonl` 的书单部分同理可由目录扫描重建。
3. **定稿只增不改**：已定稿章节的事实不可逆改。错别字修正例外；真要改设定走显式吃书（§9）。
4. **定稿原子性**：写章流程的定稿要么完成一次 commit，要么工作区原样保留，没有中间态。
5. **定稿权归作者**：系统没有任何不经作者确认就写入 `定稿/` 的路径。自动模式只是把确认粒度从逐章变为按批次（§8.1）。
6. **写评分离**：写稿与评审必须在不同上下文中进行；机检先于 AI 评审。
7. **升级原则**：脚本 < 模型 < 作者。**脚本能做的归脚本，做不到的归 AI 语义判断，必须分清楚；禁止用正则硬凑语义判断**。能数的不让模型估，能模型判的不打扰作者。
8. **git 隐身铁律**：作者永远不需要亲手敲 git 命令——真需要 git 操作时由 AI 代为运行；任何 git 异常都有人话修复流程（§10）。版本、审计、分支、回溯一律用 git，不自建提交链。
9. **容错读取**：解析任何源文件遇到未知字段，必须保留并原样写回。开源使用者会扩展格式，工具不得丢数据。
10. **对话即编辑器**：任何结构化数据的修改都可以用一句自然语言完成（"把伏笔-031 放弃了，理由是改走暗线"）。作者无须学习任何文件格式；手改文件永远只是逃生门。
11. **精准读取**：每类数据文件都有"精准读到所需一段"的脚本命令（§11.1）；AI 非必要不整文件读取，写作材料默认用精准片段。
12. **作者界面零机器味**：作者可见的目录、文件名、字段、文案遵守 PRD §8 术语表与命名四原则；财务/工程/数据库隐喻与自造精简词禁止出现。
13. **设定大纲单向依赖**：`定稿/设定/` 只记已发生的客观事实，不写排程或章节安排；依赖方向单向——`大纲/` 引用设定（正名），设定不反向引用大纲的条目编号或卷号排程。改文风/进度只动 `大纲/` 与 `文风/`，不牵连设定，避免双向交叉导致的"改一处牵连多文件"。

## 2. 目录总览（全中文）

### 2.0 工作目录层（安装布局）

```text
工作目录/                      ← AI 工具唯一的启动位置；本身不是 git 仓库
├── AGENTS.md                  # 公约数层：没装插件的 AI 也能看懂这里是什么、入口在哪
├── .claude/  .codex/ …        # 各平台壳（安装时按检测到的环境生成）
├── .webnovel/                 # 插件本体：Node 脚本、角色定义、版本与模板哈希清单
│   └── books.jsonl            # 书目录登记：每行一本书（书名/目录/是否当前在写/最后打开）
├── 我的第一本书/               # 书仓库（独立 git 仓库，见 §2.1）
└── 我的第二本书/               # 多本书共用一套安装
```

- **只支持从工作目录启动**：各宿主只在启动目录自动加载 skills/配置，在书目录启动插件不会加载。脚本启动时校验当前目录含 `.webnovel/`，否则人话提示"请从工作目录启动"。
- **当前书与书单由 `books.jsonl` 解析**（机器域文件，作者不手编）：换书 = 作者一句话让 AI 改登记；登记缺失/损坏 → 扫描含 `book.yaml` 的子目录重建书单，"当前在写"标记请作者选一次。
- 宿主有 SessionStart hook 的（Claude Code），启动自动注入"当前在写哪本/共几本书/全书近况入口"；无 hook 宿主由状态机入口读同一文件，行为等价。
- 安装、升级（模板哈希追踪）、平台壳生成由多宿主 spec §8 承接。

### 2.1 书仓库目录

使用者全部是中文网文作者，**目录结构、文件名、作者可见的字段名一律中文**。ASCII 只保留给机器协议：commit 前缀（ch/vol/retcon/fix）、`spec_version`、技术文件（`book.yaml`、`.gitignore`、`.cache/`、`AGENTS.md`）。条目编号用**中文全称前缀**：伏笔-031、悬念-008、感情线-012、信息差-021——编号是作者天天要念的，必须是人话且不过度压缩。

```text
<书名>/
├── .git/
├── .gitignore                 # 至少含 .cache/ 与 工作区/
├── AGENTS.md                  # 指路文件（建书时自动生成）：误在书目录启动 AI 工具或
│                              #   单独 clone 时，指引"回上一层工作目录启动 / npx 重建"
├── book.yaml                  # 全书配置（§3）
├── 定稿/                       # ── 审稿通过后的一切，只进不改 ──
│   ├── 正文/
│   │   └── 0152-北境的雪.md    # 章节 + front matter（§4.1）
│   ├── 设定/
│   │   ├── 角色/
│   │   │   └── 林晚.md         # 角色卡（§4.2）
│   │   ├── 信息差/
│   │   │   └── 信息差-021-灭门真凶.md   # 每条一文件（§4.3）
│   │   ├── 世界观.md           # 世界规则、力量体系
│   │   ├── 时间线/
│   │   │   └── 第05卷.md       # 按卷拆分的 append-only 表（§4.4）
│   │   └── 名册.md             # 实体名册：正名/别名/首现章（§4.5）
│   └── 摘要/
│       ├── 章摘要/0152.md      # 定稿时写入（§4.6）
│       └── 卷摘要/第05卷.md    # 卷复盘时生成
├── 大纲/                       # ── 作者意图，随时可改 ──
│   ├── 总纲.md                 # 主题、金手指、结局
│   ├── 卷纲/
│   │   └── 第05卷.md           # 主线/支线的推进写在这里，不另设条目
│   ├── 灵感池.md               # 偏离大纲的素材与未用的好点子（§7）
│   ├── 伏笔/
│   │   └── 伏笔-031-灭门真凶.md  # 三类线索条目，每条一文件（§5）
│   ├── 悬念/
│   │   └── 悬念-008-神秘老者身份.md
│   └── 感情线/
│       └── 感情线-012-林晚主线.md
├── 文风/                       # ── 品味库 ──
│   ├── 文风铁律.md             # （§6.1）
│   └── 金句库/                 # 7.0 手动放入；自动收割见 §6.2 附录（7.x）
├── 工作区/                     # ── 还没定稿的一切，默认不入 git ──
│   ├── 细纲.md                 # （§7）
│   ├── 本章写作材料.md          # 本次写稿的材料包，留档供核查
│   ├── 草稿-A.md               # 关键章多稿时 A/B/C
│   ├── 审稿.md                 # 草稿+两审意见+待确认新专名+章摘要（§8 第 7 步）
│   ├── 评审报告/               # 机检与两审原始输出
│   ├── 待定稿/                 # 自动模式的批次暂存（§8.1）：每章一个子目录
│   └── 导出/                   # 干净正文导出落点（§4.7），不进 git
└── .cache/                     # 唯一允许的派生缓存（§11）
    └── index.db
```

### 2.2 中文路径的工程约束（规范性，CI 强制）

- **脚本运行时统一 Node ≥ 22.13.0**（运行时直接依赖仅 `js-yaml`——YAML 规范复杂不适合手写，解析用成熟库、序列化手写防呆方言，决策记录见 M1 任务 design §8.1；其余零依赖：`.cache/index.db` 用内置 `node:sqlite`，v22.13.0 起无需 `--experimental-sqlite` flag；装任何 agent CLI 的用户必有 Node；无 Python、无 pip、无 .env）。安装器检测 Node 版本，< 22.13.0 时人话提示升级。一切文件 IO 显式 UTF-8（Node 默认即是），禁止依赖系统 locale。
- 仓库初始化时设置 `git config core.quotepath false`（git log 里中文路径可读）。
- 文件排序一律靠零填充数字前缀（`0152-`、`第05卷`、`伏笔-031`），不依赖中文字典序。
- 实体引用一律用**正名**（中文），别名经名册（§4.5）解析。
- CI 必须包含 Windows 上中文路径的全链路测试（建库→写章→定稿→重建缓存）。

### 2.3 防呆方言（系统写出格式的规范性约束）

非程序员作者手改 YAML 的三大手滑是全角标点、缩进、类型惊喜。系统写出的一切结构化内容必须遵守以下方言：

- **一律平铺**：front matter 与 `book.yaml` 禁止嵌套映射，字段全部顶层。
- **列表一律块格式**（一行一条 `- 晚晚`），禁止行内 `[a, b]`。
- **危险值加引号**：写出时凡可能被 YAML 误判类型的字符串自动加引号。
- 缩进统一两空格；编码 UTF-8 无 BOM。
- 多条记录**永远每条一个文件**，禁止大一统数据文件；自由文本归 Markdown 正文，front matter 只承载少量平铺短字段。

## 3. book.yaml

全仓库唯一的纯 YAML 文件：低频、平铺。

```yaml
spec_version: "7.0"
书名: 示例书名
类型: 玄幻
每章目标字数: 3000
卷规模: 40                 # 参考值：仅供全书近况提示与细纲收卷提议（§7），不参与状态机判定
文体基线起: 1              # 文体指纹基线章区间，作者可改
文体基线止: 30
伏笔悬了太久章数: 10       # 超过亮"悬了太久"提醒（提醒不是错误）
悬念悬了太久章数: 10
感情线悬了太久章数: 30
连续弱钩上限: 3
体检周期: 50               # 手动模式每 N 章体检（§9）；连写时体检随批次（§8.1）
关键章稿数: 3              # 卷首/转折/高潮章 best-of-N
自动确认细纲: false        # true 时细纲默认采纳提案，跳过停顿点 2（§8.1）
连写批次大小: 8            # 自动模式一个批次的章数，也是连写体检周期（§8.1）
```

## 4. 定稿/

草稿在工作区，审稿通过后入定稿——目录名即心智模型。

### 4.1 章节文件 `定稿/正文/NNNN-标题.md`

文件名：四位零填充章号 + 短横 + 标题。front matter 携带本章档案——**章节自带自己的审稿记录**，核查不依赖外部表。本文件仅由定稿步骤写出（作者改的是正文，不是 front matter）。

```markdown
---
章号: 152
标题: 北境的雪
卷: 5
视角: 林晚
书内时间: 大历1023年冬月初三    # 自由文本，全书格式一致
字数: 3120
章定位: 推进                    # 推进|过渡|日常（细纲声明，§7）
钩子: 危机钩-强                 # 结尾钩子类型与强弱（章属性）
情绪定位: 压抑                  # 压抑|铺垫|小爽|大爽|转折（章属性）
收卷: 是                        # 可选，仅卷末章有：作者确认细纲的收卷提议后由定稿写出（§7、§10 序4）
伏笔:
  - 埋下 伏笔-058
  - 推进 伏笔-031
  - 回收 伏笔-019
悬念:
  - 推进 悬念-008
感情线:
  - 推进 感情线-012
本章要写到的事:                 # 确认细纲时点的清单（已经两审核对）
  - 林晚得知灭门真相的第一条实证
  - 伏笔-058 埋下：神秘老者来历
  - 结尾强钩：玄阶令牌现世
---
正文……
```

### 4.2 角色卡 `定稿/设定/角色/<正名>.md`

front matter 是机检消费的结构化字段（平铺、块列表）；正文是自由设定文本。客观事实（境界/位置/持有/状态）由定稿步骤增量更新——这是"客观事实记账"的落点。**只记设定原意与已发生事实，不写"第 N 章登场/第 M 卷洗白"这类排程**（不变量 13）——排程归 `大纲/卷纲`，角色的未来走向归感情线等线索条目。

```markdown
---
姓名: 林晚
别名:
  - 晚晚
  - 林师妹
状态: 在世                # 在世/已死/失踪/封印…
位置: 北境雪原            # 最后已知位置
境界: 筑基七层            # 量纲见 世界观.md
持有:
  - 青霜剑
  - 玄阶令牌
最后变更章: 152
---
## 设定
…自由文本…
## 典型对话
…该角色的原话样本（语气 few-shot 用，7.x 语气体检的数据源）…
## 关系
…自由文本，重要关系变化也应反映在时间线…
```

### 4.3 信息差 `定稿/设定/信息差/信息差-NNN-<短题>.md`

不追踪"每个角色知道哪些事件"，只登记**值得管理的信息差**，每条一个文件。机检的泄密扫描只产出**候选清单**（角色对白/内心戏命中其不知道的信息差关键词），是否真泄密由两审的事实审查判断，不拦截流程。"装逼打脸蓄积了多少章"是信息差的派生报表（§11），不另建机制。群像戏的"谁在场"由时间线在场列（§4.4）补足。

```markdown
---
知情人:
  - 大长老
  - 神秘老者
读者已知: false
登记章: 87
关键词:                   # 泄密扫描出候选用
  - 大长老
  - 灭门
  - 血书
---
## 内容
灭门真凶是大长老。当年血案的执行者是其门下死士。
```

### 4.4 时间线 `定稿/设定/时间线/第NN卷.md`

**按卷拆分**的 append-only Markdown 表，定稿时向当前卷文件追加一行。写作材料默认只带当前卷+上一卷；跨卷查询走 `.cache`（§11.1）。**在场列可空**：日常章不用填，群像戏、密谋戏建议填。

```markdown
| 章 | 书内时间 | 一句话事件 | 在场 |
|----|----------|------------|------|
| 152 | 1023冬月初三 | 林晚于北境得血书，玄阶令牌现世 | 林晚, 神秘老者 |
```

### 4.5 实体名册 `定稿/设定/名册.md`

防"同人异名/同名异人"。表：`| 正名 | 别名 | 类型 | 首现章 |`。机检在定稿前比对正文新专名与名册，未登记的专名进审稿单请作者确认（新实体 or 笔误）。

### 4.6 摘要层 `定稿/摘要/`

- `章摘要/NNNN.md`：≤200 字，定稿前由模型生成、**放进审稿单供作者扫一眼**（可顺手改），随定稿入档。
- `卷摘要/第NN卷.md`：≤500 字，卷复盘时生成：主线推进、关系变化、未收尾条目清单。
- 更长程的"全书骨架"是**派生物**：由卷摘要按需拼接压缩，不落盘。

### 4.7 干净导出（零 token 脚本）

一键导出去掉 front matter 的纯正文，支持单章 / 章范围 / 全书，落点 `工作区/导出/`（不进 git）。作者发布到平台（起点/番茄）本来就需要纯文本——发布与"正文文件无机器味"两个需求一个脚本解决。

## 5. 三类线索条目（`大纲/伏笔|悬念|感情线/`，每条一文件）

系统的心脏。**有"开启→推进→收尾"生命周期的才设条目**；三类共用同一套引擎（文件格式、履历、"悬了太久"提醒、定稿写入；机器内部状态同构 open/advance/resolve/drop），作者界面按类型用各自的名字和动词：

| 类型 | 编号 | 生命周期动词 | "悬了太久"默认 |
|---|---|---|---|
| 伏笔 | 伏笔-031 | 埋下 → 推进 → 回收 / 放弃 | 10 章（book.yaml 可改） |
| 悬念 | 悬念-008 | 设下 → 推进 → 揭晓 / 放弃 | 10 章 |
| 感情线 | 感情线-012 | 开启 → 推进 → 修成正果 / 无疾而终 | 30 章 |

**不设条目的，各归各位**：爽点是知识层（v6 追读力分类、爽点与节奏知识库、题材模板平移继承，喂给细纲与两审，§8）；钩子与情绪定位是章属性（§4.1）；主线/支线的推进写在总纲/卷纲正文里；冲突、立旗不设类。

文件名 `伏笔-031-灭门真凶.md`（全称编号-短题）；front matter 平铺短字段，描述、收尾计划、履历全是 Markdown 正文：

```markdown
---
强度: 高                  # 高|中|低
状态: 进行                # 进行|已收尾|已放弃
开启章: 12
预计收尾: 第7卷           # 卷号或章号；强度"高"时必填
最后推进章: 152
---
## 描述
灭门真凶的身份。

## 收尾计划
第七卷宗门大会当众揭穿。开新条目时必填，防悬空。

## 履历
- 第12章：埋下
- 第87章：推进——血书线索现世（见本章中段"血书残页"一节）
- 第152章：推进——林晚取得实证（见本章结尾对峙段）
```

**条目规则（声明制）**：

- **不设"每章必须推进条目"的硬门检**。细纲声明本章定位（推进章/过渡章/日常章，§7）——过渡章合法，消除模型造假账的动机。
- **履历行必须引用章内证据**（一句话指明出处），两审的事实审查核对引用是否属实——这是防假推进的真正防线。
  - **履历证据格式**（RFC 决策 A3）：`第152章：推进——林晚取得实证（见本章结尾对峙段）`
  - 格式：章节级别 + 自然语言描述（无段落编号）
  - 验证范围：
    - 重建器验证：章节文件是否存在（脚本能做的，§11）
    - 两审验证：读取整章验证语义正确性（AI 能做的，§8 第 6 步）
  - 理由：网文章节 2000-3000 字，全文读取压力可接受；避免段落编号维护的复杂性和易错性
- 开新条目必须写收尾计划；强度"高"必须填预计收尾。
- "悬了太久"= `当前章 − 最后推进章` 超过该类型阈值，在全书近况里亮提醒。**提醒不是错误**：有些伏笔收不了可以接受，系统不逼作者填所有坑。
- 放弃必须在履历留原因行（弃线也要留痕）。
- 汇总视图（到期清单、悬了太久、活跃率统计）由 `.cache/` 与全书近况提供，**不维护任何汇总文件**。
- 派生指标（不另建机制）：章尾力度 = 结尾未收尾条目的强度；追读风险 = 悬了太久数量 + 连续弱钩计数。

## 6. 文风/

### 6.1 文风铁律 `文风/文风铁律.md`

系统对作者品味的全部认知，作者可审可改。front matter 为机器消费部分（块列表；口癖按"角色：词条"平铺，不嵌套）：

```markdown
---
禁词:
  - 眸子一缩
  - 嘴角勾起一抹
禁句式:
  - '不是.*而是'
口癖:
  - 林晚：自称"本姑娘"
---
## 铁律
…
## 反和解（按题材配浓度）
反派恶意落到实处、冲突升级到底、禁说教式和解、禁主角圣母——AI 对齐训练的和解倾向对爽文是毒药，事后审查修不了，只能随写作材料前置反制（§8 第 3 步）。建书时按题材模板写入，作者可调浓度。
## 节奏偏好
…
## 来自否决的规则
- 不要用天气开篇（出处：第 89/103/121 章三次否决）
```

规则入铁律走"三次同类否决→系统提议→作者确认"的流程，每条带出处。

### 6.2 金句库 `文风/金句库/`

**7.0 范围**：目录与手动放入——作者把得意段落放进按场景分的文件（`战斗.md`、`对白.md`、`情感.md`……），写同类场景时作为 few-shot 注入。

**附录（7.x，自动收割，本节为预留设计不在 7.0 实现）**：自动判定只产生**候选**（作者改写且字数相近才候选，净删减不算）；作者在对话中夸某段（"那儿写得不错"）也触发候选；最终入库一律经作者审核（审稿时顺手勾选）——品味决策不交给阈值。每文件保留最近 20 条，旧的轮换归档。

## 7. 工作区/ 与细纲

工作区默认整体 gitignored——定稿前的一切允许丢失；"本章要写到的事"的最终归宿是章节 front matter（§4.1）。**想保留草稿史的使用者删掉 `.gitignore` 里那一行即可**，系统行为不变（实现不得假设工作区未被 git 跟踪）。

`工作区/细纲.md` 是写每一章前作者唯一需要看的文件，固定四段：

```markdown
# 第 152 章细纲
## 全书近况（脚本生成）
- 位置：第 5 卷 24/40 章
- 悬了太久：伏笔-031（高，12 章未动）
- 连续弱钩：2 章
## 本章提案
本章定位：推进章。推进伏笔-031（林晚取得实证）、顺手埋下伏笔-058、结尾玄阶令牌现世收钩。
## 本章要写到的事（确认即生效）
- [ ] 林晚得知灭门真相的第一条实证
- [ ] 伏笔-058 埋下：神秘老者来历
- [ ] 结尾强钩
## 备选
B 方案：本章纯感情线过渡（定位改"过渡章"），伏笔-031 推到下章（代价：悬了太久 +1）
```

作者动作只有三种：点头 / 改 / 选备选。改 = 直接编辑此文件，或一句话让系统改（不变量 10）。

**收卷提议（声明制）**：本章提案可声明"本章收卷"——AI 依据卷纲进度与 `卷规模`（参考值）提议，作者确认细纲即生效，定稿时写入章 front matter `收卷: 是`（§4.1），下次启动触发卷复盘（§10 序 4）。收不收卷是创作决策，只由作者确认；状态机不用章号整除推算卷末。

**大纲偏离是决策点不是 bug**：写稿偏离细纲/卷纲时，细纲下一章给三选——拉回 / 改纲 / 存进 `大纲/灵感池.md`（偏离素材与未用的好点子都归这里，卷复盘时翻一遍）。

## 8. 写章流程（内环，八阶段）

| # | 阶段 | 执行体 | 文件效果 |
|---|------|--------|----------|
| 1 | 起草细纲 | 脚本读全书近况 + AI 拟提案 | 生成 `工作区/细纲.md`，含本章定位声明（§7） |
| 2 | 确认细纲 | **作者** | 细纲的"要写到的事"固化（`自动确认细纲: true` 时默认采纳提案，跳过停顿） |
| 3 | 备料 | 脚本 | 组装 `工作区/本章写作材料.md`：全书近况+要写到的事+事实切片+信息差边界+近章结尾+反复读清单+文风锚点+反和解规则。**默认精准片段**（当前卷+上一卷时间线、按编号取条目、按需取正文段，§11.1） |
| 4 | 写稿 | AI（干净上下文） | `工作区/草稿-*.md`；关键章 best-of-N |
| 5 | 机检 | 脚本（零 token） | **只做可计数项**：字数、禁词/禁句式、复读检测、跨章高频意象统计（"空气仿佛凝固"全书 47 次这类）、句式体检（句长方差/段落长度分布/高频句式开头）、新专名比对名册、front matter 格式完整性、条目文件是否变动（只查形式不判内容）、信息差关键词命中（**只出候选清单，不拦截**）。不过关直接打回第 4 步，不打扰作者 |
| 6 | 两审 | AI ×2（各自新鲜上下文） | **事实审查**（v6 的 5 维度：设定一致性、时间线、叙事连贯、角色一致性、逻辑 + v7 特有项：①"要写到的事"逐条核对正文；②机检泄密候选是否真泄密；③条目履历引用的章内证据是否属实；④**未登记伏笔检测**：搭整章通读反查"正文里出现疑似伏笔但无对应条目"，只出候选不拦截，见下）、**编辑审**（结构、节奏、商业性、主角动机：主角每个主要行动是否有即时驱动、可见压力、预期收益、情绪原因，或明确标注为非理性行为）→ `工作区/评审报告/`。输出格式：结构化问题清单（severity + category + blocking），参考 v6 review schema。|
| 7 | 审稿 | **作者** | `工作区/审稿.md` = 草稿 + 三句话审意见 + 待确认新专名 + 章摘要（扫一眼可改）。动作：接受 / 改完接受 / 打回。手动模式逐章审；自动模式按批次审（§8.1）。**定稿永远需要作者敲定**（不变量 5） |
| 8 | 定稿 | 脚本，**原子** | 见下 |

**审稿终止机制**（防止无限循环，RFC 决策 D2）：

- 两审输出结构化问题清单，每个问题包含：
  - `severity`: critical / high / medium / low
  - `category`: 问题分类（事实审查：setting/timeline/continuity/character/logic/requirement/leak/evidence/unregistered_thread；编辑审：structure/pacing/commercial/motivation）
  - `blocking`: 是否阻断定稿（boolean）
  - `description`: 问题描述
  - `evidence`: 原文引用或数据对比
  - `fix_hint`: 修复方向
- **阻断规则**：
  - `severity=critical` 自动 `blocking=true`
  - 其他 severity 由 AI 根据上下文判断是否 blocking
  - 存在任何 `blocking=true` 的问题 → 作者审稿时看到明确标识
- **作者审稿选择**：
  - 接受当前版本（即使有非阻断问题）
  - 改完接受（修改后不重新审稿，直接定稿）
  - 打回重写
- **系统不强制完美**：非阻断问题作为"优化建议"，作者可以在审稿单上标注"已知问题，接受现状"并定稿。

**未登记伏笔检测**（D3，给纯声明制补漏网）：

v7 的伏笔/悬念/感情线是**声明制**——系统只跟踪细纲「本章要写到的事」声明、front matter 登记过的条目（§5/§7）。但写稿（第 4 步）是 AI 干净上下文，可能在正文里即兴埋钩子；这类坑无对应条目，不进"悬了太久"、卷复盘也扫不到，容易烂尾（Discussion #118 shuimushanjia 反馈）。

- **机制**：事实审查本就通读整章（验证履历证据），顺带反查——正文里出现**疑似伏笔信号但无对应条目**的，产出 `category=unregistered_thread` 候选。与信息差泄密扫描同款（§4.3）：**只出候选清单，永不拦截**。
- **判定门槛保守**：仅捞同时满足"刻意强调 + 明显悬置 + 本章无即时解释 + 结构像 setup"者。`severity` 取 low/medium，**`blocking` 恒为 false**——即兴伏笔可能是神来之笔，不是缺陷。
- **作者裁决**（第 7 步审稿单）：登记成条目（触发"开新条目必须写收尾计划"，自动防悬空）/ 忽略（普通描写）/ 删掉。
- 边界：系统只负责"像伏笔但没登记"的提醒，不判断"这个伏笔好不好"。

**定稿的一次 commit 包含**：草稿 → `定稿/正文/`（front matter 写入章档案与条目变动）；`设定/` 变更（位置/状态/境界/持有/信息差/名册/时间线追加）；涉及的三类条目文件更新（front matter + 履历追加）；`摘要/章摘要/`（审稿单定稿版）；工作区清空。

**commit message 约定**（前缀 ASCII 是机器协议，便于 `git log --grep`）：

```text
ch(152): 北境的雪

条目: +伏笔-058 ~伏笔-031 ~感情线-012 $伏笔-019     # + 开启 ~ 推进 $ 收尾
设定: 林晚.位置=北境雪原; 信息差+信息差-021
```

### 8.1 自动模式（连写，按批次定稿）

**全自动 ≠ 无控制，是控制上移到大纲层**：作者逐卷确认卷纲，一次确认管几十章。**自动模式与手动模式的差异只是确认粒度：逐章 vs 按批次**——状态机与八阶段零改动，没有"自动定稿"。

- `自动确认细纲: true` → 第 2 步默认采纳细纲提案（提案必须含定位声明）。
- **批次运行**：连写 `连写批次大小`（默认 8）章。每章走完 1-6 步后**不定稿**，草稿、审稿单、预登记数据存入 `工作区/待定稿/NNNN-标题/`。
- **叠加视图与版本链**（规范性要求，RFC 决策 A1）：写批内后续章时，备料脚本组装"`定稿/` + 待定稿批次预登记"的叠加视图——批内前章的设定变更、条目推进、时间线行在工作区就位，定稿时原样转正。**支持批次内依赖**：第 K+1 章可以使用第 K 章的预登记事实。当第 K 章被作者打回时，标记 K+1 到 N 章为"受影响"，需重新审核或重写（具体污染传播机制由 M6 实施时设计）。
- **停止条件**（命中即停转人工）：批次写满 / 体检不过线 / 卷纲耗尽（**绝不让模型裸奔编纲**）/ 连续 3 章（可配）无条目变动。
- **批量审稿与定稿**：批次结束 → 体检 → 作者过一遍攒下的审稿单（整批接受 / 改某几章 / 从某章起打回重写）→ 作者敲定后**逐章按序定稿**（原子性按章保留）→ 下一批次。批内错误未定稿，直接改，影响最多波及一个批次。
- 整批不要 → "回到第 N 章"（§9）；已发布后才发现的错误 → 影响分析 + 顺势圆（§9）。

两个开关全关 = 逐章交互流程，行为完全不变。

## 9. 中环、外环与例外流程

- **卷复盘** `vol(05): 复盘与下卷规划`：三类条目清账（本卷开/收/悬了太久清单）→ `摘要/卷摘要/` → 翻一遍灵感池 → 与作者对谈产出 `大纲/卷纲/第06卷.md` → 顺手做伏笔机会扫描（模型提 3-5 个"本卷可埋、N 卷后响"候选，必须引用总纲的具体远期节点，作者勾选后生成条目文件）。
- **体检**（手动模式每 50 章；连写中每批次一次）：文体指纹 vs 基线区间的漂移报告 + 条目活跃率与悬了太久清单 + 时间线孤儿 → 报告进工作区，不入档；作者决定回拉或更新基线。
- **吃书**（作者界面叫吃书，commit 前缀仍 retcon）：`retcon(87): 修正大长老境界设定`——显式流程，允许改定稿，要求 commit message 写明原因，设定/条目同步，留痕可查。
- **影响分析**（脚本）：改设定/吃书前，grep 正文+条目履历+时间线，列出"哪些章建立在这个事实上"，分已发布/未发布两清单。未发布 → 直接改或吃书；**已发布 → 顺势圆**（生成向后兼容错误的圆设定方案——"已发布不可改"是网文铁律，顺势圆是主路径）。
- **"回到第 N 章"**（人话命令）：git 回滚的包装，自动模式跑废了一键回到批次起点或任意已定稿章。执行前展示影响范围，作者确认。
- **手改检测**：每次启动发现定稿/大纲有未登记的手改 → 细纲前问一句"补登吗"，确认后 `fix(设定): …` 入档。**系统适应作者，不报错。**
- **分支试写**：作者想试另一条线 → AI 代为开 git 分支（如 `what-if/林晚黑化`），各推演 3 章纲要，读完合并或丢弃——作者全程不碰 git 命令（不变量 8）。

## 10. 启动序列与状态机（单入口）

**第 0 步之前先跑 git 健康检查**：半提交、合并冲突、锁文件、.git 损坏、网盘冲突副本（"xxx (1).md"）——每种配自动修复或人话指引，**作者永远不直面 git 报错**（不变量 8）。

然后按序判定，命中即停：

| 序 | 条件 | 下一步 |
|----|------|--------|
| 0 | 任一源文件解析失败 | **修复确认**：定位到行、展示上下文、AI 提议保留意图的修复、作者确认。全角冒号/逗号出现在结构位置属确定性错误，直接预修复后只报不问。**永不带堆栈崩溃** |
| 1 | 工作目录无任何书 / 当前书不存在 | **建书引导**：问答式生成 book.yaml、总纲、第一卷卷纲，生成书仓库（含指路 AGENTS.md），登记进 `books.jsonl` |
| 2 | 定稿/大纲有未登记手改 | 提议 fix 补登 |
| 3 | 工作区有未完成流程（细纲/材料/草稿/审稿，含待定稿批次） | 按续跑映射表从中断的阶段继续（见下） |
| 4 | 最新定稿章声明了收卷（front matter `收卷: 是`，§4.1/§7） | 卷复盘 |
| 5 | 距上次体检已满「体检周期」章（体检记录存 `.cache`，丢失则重测，无害） | 体检 |
| 6 | 其余 | 起草新章细纲（内环第 1 步） |

**序 0 的"源文件"清单（钉死范围，实现不得自行增减）**：`定稿/正文`、`大纲/伏笔|悬念|感情线`、`定稿/设定/角色`、`定稿/设定/信息差` 的 front matter；`book.yaml`；`文风/文风铁律.md` 的 front matter；`定稿/设定/名册.md` 与 `定稿/设定/时间线/` 的表格。清单之外不属序 0 扫描范围（总纲/卷纲/摘要是自由 Markdown，无可失败的结构）。**任一清单文件解析失败都不得静默降级为默认值**——必须进修复确认。

**序 3 的续跑映射**（`细纲.md` 计入未完成流程——已确认的细纲是作者决策，不得被序 6 重新起草覆盖）：

| 工作区现存 | 从哪继续 |
|---|---|
| 仅 细纲.md | 出示细纲请作者过目，然后备料（§8 第 3 步） |
| + 本章写作材料.md | 写稿（第 4 步） |
| + 草稿-*.md | 机检 / 两审（第 5-6 步） |
| + 审稿.md | 等作者裁决（第 7 步） |
| 待定稿/ 有批次 | 自动模式批次续跑（§8.1） |

v6 的 8 个命令全部内化为以上状态。作者只需要一个入口和"继续"。

## 11. 派生缓存 `.cache/index.db`

唯一允许的持久派生物（`node:sqlite`），gitignored，任何时刻可删。首查重建，重建器只读 定稿/大纲/文风 源文件。表（机器域，表名英文）：`chapters`（front matter 展开，含章定位/钩子/情绪定位/收卷）、`threads`（三类条目统一存放，类型为列）、`secrets`（信息差，含"读者已知"与蓄积章数）、`entities`（名册与角色卡）、`entity_aliases`（别名 → 正名索引，供别名解析与唯一性校验）、`fingerprints`（文体指纹历史）。列定义以 `cache-design-2026-06-26.md` 为准。**重建器即格式的参考实现**——能完整重建，说明格式自洽。

**删除 `.cache/` 后的行为**（RFC 澄清 B1）：
- 系统从源文件全量重建缓存（所有查询照常回答，这是 CI 验收项，不变量 2）
- 首次查询会触发冷重建（可能需数秒，视书籍体量），或临时降级为全文件扫描并给出提示
- 不应暗示"删除缓存零代价"——重建需要时间，但系统保证功能不受影响

### 11.1 精准读取接口（不变量 11 的落地）

每类源文件配"定位读取"脚本命令，AI 默认用它们取片段、不整文件读取。初版清单（实现可扩充，不可削减）：

| 目标 | 示例 |
|---|---|
| 条目 | 读伏笔-031 的履历 / 读感情线-012 的当前状态与收尾计划 |
| 大纲 | 读第 5 卷卷纲的指定小节 / 读总纲的结局段 |
| 正文 | 读 0152 章结尾 500 字 / 读 0148-0152 章的章摘要 |
| 时间线 | 读当前卷+上一卷 / 按"在场含某人"过滤 |
| 设定 | 读林晚角色卡的 front matter / 读世界观的指定小节 |
| 全文检索 | 查"玄阶令牌"在全书的出现章与上下文（Grep 正文——正文本身就是无损数据库） |
| 报表 | 悬了太久清单 / 信息差蓄积报表（"读者还不知道主角底牌已 23 章"） |

写作材料组装（§8 第 3 步）默认只用以上接口取片段。

## 12. 迁移映射（v6 → v7，一次性脚本）

迁移引导首先处理**市场版插件卸载 + npx 重装**（v7 不再走插件市场），然后：

| v6 | v7 |
|----|----|
| `正文/` | `定稿/正文/`（补 front matter，"要写到的事"标"迁移"） |
| `设定集/` | `定稿/设定/`（角色卡补 front matter） |
| `大纲/`（总纲、卷纲） | `大纲/总纲.md`、`大纲/卷纲/` |
| foreshadowing | `大纲/伏笔/` 逐条成文件 |
| plot_threads | 并入卷纲正文（不设条目） |
| chase_debt / reading_power | 知识层与章属性（不设条目） |
| `.webnovel/state.json` | 一次性展开进 `定稿/设定/` |
| `summaries/` | `定稿/摘要/` |
| project_memory patterns / scratchpad | `文风/文风铁律.md`（人工过一遍再入） |
| references（题材模板/追读力/爽点节奏） | 知识层平移继承 |
| `.story-system/` 提交链 | 压成初始 commit，原目录只读归档 |
| index.db / vectors.db / projection_log | 删除（缓存重建；向量为可选插件） |

迁移不丢任何一个字；失败可整体回退。

## 13. 不做清单

- ❌ 大一统 YAML 数据文件（多条记录一律每条一个 Markdown 文件）
- ❌ 事件日志表与逐事件 witnesses 投影（被 信息差/ + 时间线在场列 取代）
- ❌ 持久向量库（语义检索 = 可选插件，永不做事实召回主路径）
- ❌ 常驻服务（浏览级信息 = 按需静态简报：零 token 脚本渲染单文件 HTML，只读 story repo，7.x）
- ❌ 自建提交链 / projection_log / scratchpad
- ❌ 模型自由评"文笔好坏"（两审职责里明确排除）
- ❌ 模型裸奔编纲（连写硬停止条件：卷纲耗尽即停，§8.1）
- ❌ 不经作者确认写入 `定稿/` 的任何路径（不变量 5）

## 14. 决策记录

### 0.8 → 0.9（依据：2026-07-02 设计边界回顾，作者逐项确认）

| # | 变更 | 落点 | 来源 |
|---|------|------|------|
| 27 | 收卷声明制：卷末由作者在细纲确认收卷提议、定稿写入 front matter `收卷: 是`；序 4 按声明判定；`卷规模` 退为全书近况提示与提议参考 | §3、§4.1、§7、§10 | 边界回顾 #5（代码 `章号 % 卷规模` 整除启发式与"卷规模是参考值"矛盾，且 spec 未定义卷末判定） |
| 28 | 序 0 "源文件"清单钉死：book.yaml/文风铁律/名册/时间线入列，解析失败不得静默降级 | §10 | 边界回顾 #6（book.yaml 解析失败曾静默用默认值跑） |
| 29 | 序 3：`细纲.md` 计入未完成流程 + 续跑映射表；序 5 体检判定改"距上次体检已满周期" | §10 | 边界回顾 #7（已确认细纲曾被序 6 重新起草覆盖） |
| 30 | book.yaml 增 `体检周期`（策略参数，作者可调） | §3 | 边界回顾 #4（代码已读此字段，规范缺位） |
| 31 | 缓存表清单补 `entity_aliases`（六表），列定义以 cache-design 为准 | §11 | M4 review S1 回填补位（此前只进了 backend 规范） |
| 32 | 依赖口径：运行时直接依赖仅 `js-yaml`，其余零依赖 | §2.2 | 边界回顾 #13（M1 任务 design §8.1 决策补入法律文本；PRD §5 同步修订） |

### 0.7 → 0.8（依据：RFC 深度核验 2026-06-27，Discussion #118 第 8 条评论 + v7 逐条核验）

| # | 变更 | 落点 | 来源 |
|---|------|------|------|
| 25 | D3 未登记伏笔检测：事实审查增 `unregistered_thread` 候选项，搭整章通读反查"正文疑似伏笔但无条目"，门槛保守、恒非阻断、作者裁决 | §8 第 6 步 | Discussion #118 shuimushanjia（06-22） |
| 26 | D4 设定大纲单向依赖入宪：设定层只记客观事实不写排程，依赖单向（大纲→设定） | 不变量 13、§4.2 | Discussion #118 freezero2020（06-26） |

### 0.1 → 0.5

历史决策 1-15 见 git 历史中的 0.5 版（要点：全中文目录；工作区默认不入 git；信息差轻量登记；章摘要作者过目；每条一文件 + 防呆方言 + 修复确认；「正典」→「定稿」；自动模式入规；运行时 Node；多宿主分层留白；机检扩充；反和解入律）。其中"每章必须结转承诺 + 豁免"已被 0.6 的声明制取代（见 16-18）。

### 0.5 → 0.6（依据：PRD 1.0 §10.1，作者 2026-06-11/12 逐项拍板）

| # | 变更 | 落点 | PRD 依据 |
|---|------|------|---------|
| 16 | 术语表全文贯彻（定稿动词/写章流程/全书近况/本章写作材料/本章要写到的事/两审/文风铁律/细纲/审稿/修复确认/吃书/摘要/悬了太久；"卡"与"棘轮"退场） | 全文 | §8 术语表、ADR 术语-1/2 |
| 17 | 「承诺」大一统拆为三类条目：伏笔/悬念/感情线，统一引擎分类型目录；爽点归知识层、钩子归章属性、主线支线归卷纲 | §5、§2.1、§4.1 | ADR 账本-1 |
| 18 | "每章必须推进"硬门检 + 豁免机制 → **声明制**（细纲声明章定位；履历须引用章内证据） | §5、§7 | ADR 机制-2 |
| 19 | 条目编号中文全称（伏笔-031/信息差-021），"编号保留 ASCII"废止 | §2.1、§5 | ADR 术语-3 |
| 20 | 自动模式重写：**删除自动验收，定稿永远归作者**；按批次审稿与定稿；叠加视图；停止条件 +"连续 3 章无条目变动" | §8.1、不变量 5、§3 | ADR 机制-6 |
| 21 | 机检/两审职责重划：机检只做可计数项（含高频意象/句式体检），"要写到的事"核对与泄密判断移给事实审查（机检只出候选） | §8 第 5/6 步 | ADR 机制-1 |
| 22 | git 隐身铁律入宪 + 启动前 git 健康检查 + 影响分析/顺势圆/"回到第 N 章" | 不变量 8、§9、§10 | ADR 机制-3/4 |
| 23 | 新增工作目录层：工作目录 ⊃ 书目录、唯一启动点、`books.jsonl` 登记 + hook 注入、书仓库指路 AGENTS.md；Node ≥ 22（node:sqlite） | §2.0、§2.2 | ADR 安装-1/2/3、技术-1 |
| 24 | 时间线按卷拆分；`记忆/`→`摘要/`；新增导出命令、灵感池、精准读取接口、建书态；金句库自动收割移 7.x 附录 | §4.4/4.6/4.7、§6.2、§7、§10、§11.1 | ADR 格式-1/2/3、机制-5、原则-1、范围-1/2 |

**落地备忘**（不进格式法律文本，实现时别丢）：题材平台预设（番茄/起点节奏差异）、许可证 MIT/Apache-2.0、AI 味承诺口径（"读者不出戏"，不承诺过检测器）、每章 AI 调用次数预算上限（实现时定数）。
