# Novel Main

> 番茄小说章节全流程创作 — 统筹调用所有子技能，按7步状态机完成从资料整理到备份的完整流程。支持中断恢复与自动/确认双模式

- Skill: `cwjdong-design/novel-main-2` (Agent Skill)
- Install (CLI): `npx skillmds@latest add cwjdong-design/novel-main-2`
- Raw SKILL.md: https://api.skillmd.com/api/skills/cwjdong-design/novel-main-2/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: cwjdong-design (https://skillmd.com/u/cwjdong-design)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/cwjdong-design/novel-main-2

---


# 番茄小说主技能（v2.0）

> 版本历史见 git 提交记录，不在技能正文维护。

## 触发条件

用户说「写第X章」「继续下一章」「生成一章」「续写」时使用本技能。

**🚫 硬性约束：用户未明确说"继续""写第X章"时，严禁擅自推进到下一章。写完当前章后必须等待用户确认，不得自动开始新章。**

## 前置检查

在进入状态机之前，执行以下检查：

0. **确保状态目录存在**：`mkdir -p ~/.hermes/skills/novel/_state/`。此目录用于存储进度文件和活跃书记录。同时确保 `~/novels/_shared/{logs,backups}` 存在（为 cron 预留）。
1. **确认工作书**：读取 `~/.hermes/skills/novel/_state/current_book.txt`，获取当前活跃书名。如果为空或不存在，提示用户选择书籍。
2. **确认目录存在**：检查 `~/novels/books/<书名>/` 目录存在（否则先调用 `novel-new-book`）。
3. **确认目标章节号**：
   - 用户明确说了第 X 章 → 使用 X
   - 用户说「继续写」「下一章」→ 读取 `01-正文存稿/` 下最大章节号 + 1
   - 都没有 → 询问用户「要写第几章？」

4. **尝试恢复中断任务**：检查 `~/.hermes/skills/novel/_state/<书名>_progress.json`，如果存在且 `status != 'completed'`：
   - 如果 `milestone_blocked == true`：拦截并提示「⚠️ 第 N 章里程碑审查未通过，请先修正阻塞问题后再继续。阻塞报告见 `00-大纲细纲/里程碑审查_第N章.md`」。不允许开始新章节。
   - 否则询问用户是否从中断点继续。


5. **检查章节规划内容**：读取 `00-大纲细纲/章节规划.md`，查找目标章节号对应行。
   - **「章节标题」列为空或占位**（如「待填写」「TBD」「—」等任何非实质内容）：
     - 拦截并提示「🛑 第 X 章的章节标题尚未填写，请先在 `00-大纲细纲/章节规划.md` 中为该章填写具体章节标题后再开始生成。」
   - **「核心事件」列为占位文本或空**（如「请填写第X章计划内容」「待填写」「TBD」「—」等任何非实质内容）：
     - **目标章节 = 1**：拦截并提示「🛑 第 1 章的核心事件尚未填写实质内容，请先在 `00-大纲细纲/章节规划.md` 中为第 1 章填写具体核心事件后再开始生成。」不允许从主线大纲自动提取替代——章节规划是硬性底线。
     - **目标章节 > 1**：拦截并提示「🛑 第 X 章的核心事件尚未填写实质内容，请先在 `00-大纲细纲/章节规划.md` 中填写该章计划后再生成。」等待用户补充后重新触发。
   - **表中无对应行**（目标章节 > 1）：提醒用户「⚠️ 第 X 章在章节规划中无对应行，请先在 `00-大纲细纲/章节规划.md` 中补充该章计划后再生成。」等待用户补充后重新触发。
   - **「章节标题」和「核心事件」均有实质内容**（非占位文本，且≥5个字的具体事件描述）：✅ 通过，继续进入 7 步循环。

---

## 7-8 步状态机

### 状态定义

```
IDLE → PREP → PLOT → DRAFT → REVIEW → POLISH → TRACK → [章节号%5==0 → MILESTONE] → BACKUP → COMPLETED
         ↓       ↓       ↓        ↓        ↓        ↓             ↓                 ↓
        (任意步骤失败可回退至 PREP 或用户取消，MILESTONE 阻塞时须回退修正对应章节后方可继续)
```

每个步骤有 3 种状态流转：
- `→ next`：正常进入下一步
- `↻ retry`：失败后重试（最多 2 次）
- `← rollback`：回退至 PREP 重新开始

**MILESTONE 特殊规则**：
- 仅当章节号是 5 的倍数（5, 10, 15...）时触发。其他章节跳过 MILESTONE，TRACK 后直接进入 BACKUP。
- MILESTONE 审查不通过 → ⚠️ **阻塞**，`current_step` 标记 `milestone_blocked`，状态机暂停。用户必须修正对应问题的章节后重新触发。
- MILESTONE 审查通过 → ✅ 正常进入 BACKUP。
- 阻塞期间不允许开始新章节的 7 步流程。用户说「继续写下一章」或「写第X章」时，先检查是否有未解决的 MILESTONE 阻塞。
```
---

### 步骤 1：PREP（资料整理）

**调用子技能**：`novel-prep` + `novel-character`（人物 Want/Need 追踪）

**传入参数**：
```json
{
  "book_name": "<书名>",
  "chapter_num": <章节号>
}
```

**🔒 加载书配置（不可跳过）**：
读取 `~/novels/books/<书名>/02-设定文档/书配置.md`，提取以下规则供后续步骤使用：
- 地名白名单（供 DRAFT 骨架生成和 REVIEW 扫描）
- 系统面板字段（供 DRAFT 骨架生成）
- 方言词表（供 DRAFT 和 POLISH）
- 作者风格（供 DRAFT 和 POLISH）
- 禁止措辞（供 REVIEW 扫描）

> ⚠️ 如果书配置.md 不存在，提示用户先创建（可参考 `novel-new-book` §3.35 模板）。

**人物 Want/Need 更新**（加载 `novel-character`）：
- 检查<主角>的 Want（外在目标）在最近 3 章是否有推进
- 检查 Need（内在需求）是否有变化信号
- 核心配角（从书配置人物库中读取主要配角）的致命缺陷是否有表现
- 输出一句话摘要：「本章主角 Want 推进到___，Need 信号：___」

**期望输出格式**：
```markdown
## 创作上下文（第 X 章）

### 前文关键信息
- 上一章结尾：<文本>
- 章末钩子：<文本>

### 人物当前状态
| 人物 | 状态 | 最近变化 |
|------|------|---------|
| ...  | ...  | ...     |

### 待回收伏笔（优先级排序）
1. [伏笔内容] — 计划第 Y 章回收（⚠️正常 / 🚨超期 Z 章）

### 本章大纲要点
<从章节规划提取>

### 近期修正反馈
<从错误库提取，如无则写「无」>
```


---

### 步骤 2：PLOT（剧情推演）

**调用子技能**：`novel-plot`

**传入参数**：
```json
{
  "大纲要点": "<从步骤1 prep_output 中提取的「本章大纲要点」区块>",
  "前文上下文": "<从步骤1 prep_output 中提取的完整上下文（人物状态、伏笔、修正反馈）>",
  "目标章节号": <章节号>
}
```

**🔒 跨章节奏门控（硬性，不可跳过）**：进入 PLOT 推演前，必须对最近 4 章（Ch.N-4 至 Ch.N-1）做情绪曲线分析，检测节奏衰退。检测方法：读取最近 4 章正文，逐章标注情绪类型（爽/建设/危机/压抑/调查），然后检查以下阈值：

| 信号 | 阈值 | 触发动作 |
|------|------|---------|
| 连续无打脸 | ≥ 3 章 | 🔴 本章 PLOT **必须**包含至少 1 次当众打脸（质疑→实力→闭嘴），否则退回重推 |
| 连续无正面胜利 | ≥ 3 章 | 🔴 本章 PLOT **必须**包含至少 1 次「赢」（对手退让/围观者认可/问题解决） |
| 连续同情绪类型 | ≥ 3 章 | 🔴 本章情绪类型**必须**切换（如连续压抑→本章必须有释放/反转） |
| 主角连续被动 | ≥ 3 章 | 🔴 本章 PLOT **必须**让主角主动出击（不是应对危机，是制造局面） |
| 反派隔空出手 | ≥ 3 章 | ⚠️ 本章**建议**让反派或其代理人正面出场 |

> 来源：`references/general/writing-rhythm.md`。MILESTONE 每 5 章才检测一次，但节奏衰退从第 3 章就开始可观测。PLOT 门控把检测前移到每章，防止「写完 5 章才发现无聊」。
>
> **与 MILESTONE 的分工**：PLOT 门控是**前瞻性**的——看前几章的症状，决定本章该怎么写；MILESTONE 是**回顾性**的——5章写完后整体验收质量。两者有交叉但不矛盾：PLOT 门控防患于未然，MILESTONE 兜底验收。同一类问题（如「连续重复」），PLOT 门控触发时强制本章变化，MILESTONE 触发时阻塞并要求回退修正。

**门控输出格式**（PLOT 推演前置区块）：
```markdown
### 跨章节奏诊断（Ch.N-4 ~ Ch.N-1）
| 章节 | 情绪类型 | 有打脸 | 有正面胜利 | 主角主动/被动 |
|------|---------|--------|-----------|-------------|
| Ch.N-4 | 建设/危机/... | ✅/❌ | ✅/❌ | 主动/被动 |
| ... | ... | ... | ... | ... |

**触发阈值**：<列出触发的🔴项及本章强制对策>
**本章情绪目标**：<如：连续3章压抑→本章必须有释放/反转>
```

**🔒 系统退化检测（与节奏门控并行执行）**：读取最近 5 章面板内容，检查系统是否退化为「计算器」（详见 `references/general/system-golden-finger-design.md` → 系统退化诊断清单 + `references/general/writing-rhythm.md` → 系统退化检测）。触发以下任一🔴→ 本章 PLOT **必须**让系统做至少一件不可替代的事（弹新维度/数字跳变/情报优势/格局重定义）：
- 连续 ≥ 3 章面板后 MC「收掉/看完不行动」
- 系统未弹新维度 ≥ 5 章
- 系统数字对 MC 决策无影响 ≥ 3 章
- **删系统测试**：把最近 5 章的系统删掉，故事走向是否不变？如果不变 → 🔴 系统彻底失败，本章必须让系统给出「没有系统就绝对不可能知道」的情报

**🔒 剧情推进速度检测（与节奏门控并行执行）**：读取章节规划和最近 20 章正文，检查整体推进速度（详见 `references/general/writing-rhythm.md` → 剧情推进速度检测）。触发以下任一🔴→ 本章 PLOT **必须**包含格局升级动作：
- 同一对手连续出场 ≥ 30 章
- 连续无格局升级 ≥ 20 章
- 建设章连续 ≥ 3 章

**期望输出格式**：
```markdown
## 第 X 章剧情推演

### 跨章节奏诊断（Ch.N-4 ~ Ch.N-1）
<门控输出>

### 核心事件
（一句话）

### 情节节点
| # | 阶段 | 字数 | 内容 |
|---|------|------|------|
| 1 | 开场 | 350  | ...  |
| 2 | 推进 | 1600 | ...  |
| 3 | 高潮 | 450  | ...  |
| 4 | 钩子 | 100  | ...  |

### 本章涉及的伏笔
- 新增铺垫：XXX（计划第 Y 章回收）
- 回收伏笔：XXX

### 人物情感弧线
- 主角：XXX → XXX
```


---

### 步骤 3：DRAFT（正文生成 — 骨架模式，v4.0）

**🚫 硬性约束：助理不得直接写正文。DRAFT = 生成骨架(预审) → Claude Code CLI 填肉。**

**🔒 容量预审（硬性，不可跳过）**：进入 DRAFT 前必须检查骨架容量：
- 至少 4 个有效剧情回合（冲突交锋、信息增量、利益博弈）
- 至少 3 次局势或利益变化
- 至少 1 次主角主动决策
- 容量不足时退回 PLOT/骨架补充有效回合，不得进入 DRAFT

**执行流程**：

1. **生成骨架**：基于 PREP 上下文，按 `novel-skeleton` 技能规范写骨架，存项目目录 `00-大纲细纲/章节骨架/第N章_骨架.md`。
2. **预审骨架**：`python3 ~/.hermes/skills/novel/scripts/review_scan.py <骨架路径> --book <书名>` — ⛔ 骨有毒肉全烂，必须零违禁。`--book` 参数用于从 `02-设定文档/书配置.md` 加载该书的地名白名单/黑名单/系统违禁词。
3. **派发 Claude Code CLI**（仅3条铁律，6KB铁律已固化在骨架中）：
   - 地名只用白名单。禁止真实地名。
   - 系统面板原封不动。
   - 字数/对话/粤语/冷感/格式。

**助理禁止**：直接写正文、改骨架中数字/地名/面板、delegate_task冒充、不预审派发。

**🔒 前置自检（不可跳过）**：无论 PREP 是否已执行，DRAFT 必须自动收集以下上下文后再构造 prompt：
```bash
# 1. 人物卡（如 PREP 未执行，自动拉取）
cat ~/novels/books/<书名>/02-设定文档/人物库/*.md 2>/dev/null || echo "⚠️ 人物库为空"

# 2. 前文时间线速查（如 TRACK 未执行，自动生成基础版）
cat ~/novels/books/<书名>/06-追踪记录/前文时间线速查.md 2>/dev/null || echo "⚠️ 时间线为空"

# 3. 章节规划
grep "第<X>章" ~/novels/books/<书名>/00-大纲细纲/章节规划.md 2>/dev/null || echo "⚠️ 无章节规划"

# 4. 最近3章正文（自动提取）
ls -t ~/novels/books/<书名>/01-正文存稿/第*.md | head -3 | xargs cat 2>/dev/null
```
> 以上收集到的内容**全部注入** DRAFT prompt 的对应区块。缺失项标注 ⚠️ 但不阻塞 DRAFT。

**命令（文件传参，避免 shell 转义）**：
```bash
# 1. 先将 prompt 写入临时文件
cat > /tmp/novel_chX_prompt.txt << 'PROMPT_EOF'
<完整 prompt 内容>
PROMPT_EOF

# 2. 通过 claude_runner 派发（含 idle-timeout 保护、stream-json 事件流、原子写盘）
python3 ~/.hermes/skills/novel/scripts/claude_runner.py \
  --prompt-file /tmp/novel_chX_prompt.txt \
  --model sonnet \
  --max-turns 15 \
  --allowed-tools Read,Write,Edit \
  --idle-timeout 120 \
  --exit-timeout 10 \
  --target-file ~/novels/books/<书名>/01-正文存稿/第N章.md \
  --events-file /tmp/novel_chX_events.jsonl \
  --output-file /tmp/novel_chX_result.json
```
> ⚠️ 切勿使用内联 `claude -p "prompt文本"` ——中文引号「」等字符会导致 shell 转义失败。
>
> ℹ️ 字数统计、违禁词扫描、系统面板验收由主 Agent 脚本在进程结束后执行，**不在 prompt 中要求 Claude 调用 Bash**。这避免了权限拒绝、无效轮次和超时误判。

**骨架模式 prompt 模板**（骨架已固化所有约束，仅需3条铁律）：

1. 先将 prompt 写入临时文件：
   ```
   你是番茄小说签约作者。按以下骨架写第N章正文。只填肉不改骨。直接输出正文。

   【骨架】
   <从 00-大纲细纲/章节骨架/第N章_骨架.md 读取>

   【铁律 — 只三条，骨架中已固化地名/数字/面板】
   1. 禁止任何真实中国地名。只使用 `02-设定文档/书配置.md` 的地名白名单字段中定义的架空地名。
   2. 系统面板原封不动放进去。不加减行。不修改数字。
   3. 字数2200—2400（目标2250）。对话40%以上。方言/口语点缀3-5处（具体见书配置）。冷感叙述。章末无结束标记。无HTML。

   【网文校准（必须遵循）】
   - 情绪直接给读者，不留白。对手被打脸后的反应要写透（震惊/不服/闭嘴），围观者要有反应。
   - 事件密度高：本章2-3个场景，每个场景都有信息增量和情绪变化。不要一章只写一件事。
   - 大白话叙述。比喻读者看不懂就不用。数字要具体。
   - 章末钩子要具体（谁来了/什么消息/什么危机），不要环境描写收尾。
   - MC台词短但每句有分量（判断/决定/指令），不是"嗯""好"这种无信息回复。
   ```
2. 派发（字数/违禁词/面板验收由主 Agent 脚本执行，不要求 Claude 自行 Bash）：
   ```bash
   python3 ~/.hermes/skills/novel/scripts/claude_runner.py \
     --prompt-file /tmp/novel_chX_prompt.txt \
     --model sonnet \
     --max-turns 15 \
     --allowed-tools Read,Write,Edit \
     --idle-timeout 120 \
     --exit-timeout 10 \
     --target-file ~/novels/books/<书名>/01-正文存稿/第N章.md \
     --events-file /tmp/novel_chX_events.jsonl \
     --output-file /tmp/novel_chX_result.json
   ```

> ⚠️ 旧版 6KB `opus铁律.md` **不再注入**骨架模式。约束已固化在骨架中。opus铁律.md 保留作为参考/review 用，不出现在 prompt 中。

**取回正文**：从 Claude Code CLI 的 stdout 中提取生成的正文内容。

> ℹ️ novel-draft 输出格式为 `## 第X章 <章节标题>` + 正文。novel-main 在最终报告中同样会输出章节标题，确保一致性。

**字数要求**：2200—2400字（番茄标准），目标2250字。DRAFT 设字数 + 有效密度双门槛：字数达标且有效内容达标才可进入 REVIEW。容量不足时退回 PLOT/骨架补充有效回合，不得进入 DRAFT。不能靠 POLISH 补环境细节凑字数。


---

### 步骤 4：REVIEW（合规审查）

**🚫 硬性约束：DRAFT 完成后必须立即执行 REVIEW，不得跳过。未输出审查报告前，禁止进入 POLISH/TRACK/BACKUP 及下一章。**

**执行方式**：三步流水线 + 可选跨文档校验，自动串联。

**第 0 步：跨文档一致性检查（每 5 章执行一次，约 2 秒）**
```bash
python3 ~/.hermes/skills/novel/scripts/consistency_check.py --book "<书名>"
```
- 仅在章节号是 5 的倍数（5/10/15...）时执行，避免每章重复校验
- 7 维交叉验证：人物卡↔总表 / 章节规划↔正文 / 故事线状态 / 前文时间线 / 伏笔表 / 正文人物注册 / 大纲分卷
- 发现 🔴 问题 → ⚠️ 不通过，阻塞 REVIEW，需先修复问题再继续
- 发现 🟡 问题 → 记录但不阻塞
- 通过（✅ 全绿）→ 继续

**第 1 步：自动扫描（3 秒，DRAFT 完成后立即执行）**
```bash
python3 ~/.hermes/skills/novel/scripts/review_scan.py ~/novels/books/<书名>/01-正文存稿/第X章.md --book <书名>
```
扫描通过（零真实问题）后，继续。

**第 2 步：爽点注入检查（强制 5 项）**

**爽点注入检查**（强制，加载 `novel-writing` → `references/case-studies/爽点注入方法论.md`）：
```markdown
[ ] 系统钱花出去了？花给谁？对方什么反应？
[ ] 有人不理解 MC 的能力/资源？MC 解释了吗？
[ ] 有打脸？（质疑→实力→闭嘴）
- [ ] 有收入对比？（书配置中的对照组 vs 系统收入）
[ ] 系统面板出现时 MC 是「行动」不是「算账」？
```
任一项「否」→ 该章需注入爽点后再次审查。

**跨章爽点衰减检查**（强制，与单章5项并行执行）：
检查最近 3 章（含本章）的爽点密度，触发以下任一阈值→**本章审查结论为 ⚠️ 不通过**，必须在 POLISH 中补足：
```markdown
[ ] 连续 ≥ 3 章无当众打脸？→ 🔴 本章必须补1次打脸场景
[ ] 连续 ≥ 3 章无正面胜利（对手退让/围观认可/问题解决）？→ 🔴 本章必须补1次「赢」
[ ] 连续 ≥ 3 章主角处于被动应对（危机来了→冷静处理→安排下一步）？→ 🔴 本章必须有主角主动出击
[ ] 连续 ≥ 3 章反派只隔空出手、从不正面出场？→ ⚠️ 本章建议让反派代理人正面出场
[ ] 连续 ≥ 3 章同一种叙事结构（如「危机→冷静→拒绝→安排」循环）？→ 🔴 本章结构必须变化
```
> 此检查与 PLOT 阶段的跨章节奏门控互为兜底：PLOT 门控在前端拦截，REVIEW 衰减检查在后端验证。如果 PLOT 门控触发了🔴但 DRAFT/正文未体现，REVIEW 必须拦截。

**读者视角审查**（每 3 章强制执行，`references/case-studies/读者审查标准.md`）：
单章写完后放在上下文中连读 3 章，用 Claude Code opus 以 20 年网文读者身份审查：
```bash
python3 ~/.hermes/skills/novel/scripts/claude_runner.py \
  --prompt-file /tmp/reader_review_N章.txt \
  --model sonnet \
  --max-turns 30 \
  --allowed-tools Read \
  --idle-timeout 120 \
  --exit-timeout 10 \
  --events-file /tmp/reader_review_N章_events.jsonl \
  --output-file /tmp/reader_review_N章_result.json
```
读者说「想弃」→ 重写，不修。读者说「想追」→ 保留结构，微调。

**广告打断点检查**（每 3 章，加载 `novel-platform`）：
- 第 3/6/9 章章末必须是强钩子（信息截断/视角切换/倒计时型）
- 广告点后第一章开头必须立刻接上悬念，不换场景
检查通过（零问题）再进入人工审查。

**调用子技能**：`novel-review`

**传入参数**：
```json
{
  "draft_output": "<步骤3 的完整输出>",
  "character_cards": "<人物库内容>",
  "foreshadow_table": "<伏笔追踪表内容>",
  "world_setting": "<世界观.md 内容>",
  "storyline_status": "<故事线状态.md 内容>",
  "recent_chapters": "<最近5章正文内容>"
}
```

**REVIEW 审查自检清单**（审查时必须逐条检查，不得跳过）：

- [ ] **时间线一致性**：本章日期/时间跨度与所有前章不矛盾（逐章比对，尤其关注跨章事件的时间先后顺序）
- [ ] **人物存活状态**：对话中引用或提及的人物均未在之前章节中死亡（交叉核验 `02-设定文档/人物库/` 中的人物状态）
- [ ] **字数在 2200—2400 字**：番茄显示字数（去掉首行标题和空白，保留标点/数字/字母）
- [ ] **禁用词零命中**：正文中不包含任何禁用词（参见 `04-错误库/禁用词表.md` 或知识库中的禁用词列表，注意区分对话中的口语化表达与叙事中的禁用词）
- [ ] **人物全部注册**：正文中出现的所有有名角色（含龙套有名字者）均在人物库中注册，无凭空出现的新角色
- [ ] **地名白名单**：正文仅使用 `02-设定文档/书配置.md` 的地名白名单字段中定义的架空地名，不包含任何真实中国地名（扫描 '港''城''市''县''镇' 等字眼，与白名单交叉核验）
- [ ] **系统面板合规**：①无「检测到」「建议」「任务」「预警」「解锁」「第二阶段」等主动措辞 ②结算数字与系数匹配（结算公式：结算基数 × 系数 × 结算比例，具体值见 `02-设定文档/书配置.md`）③结算仅在凌晨00:00弹出，其他时间面板仅被动统计 ④每章至少出现1次系统面板（面板字段从 `02-设定文档/书配置.md` 的系统面板字段读取）

> ⚠️ 审查报告必须先逐条列出以上 7 项的结果（✅/⚠️），再输出问题清单。任一项未通过（⚠️）则审查结论为 ⚠️ 不通过。
>
> 🚫 **硬性约束：DRAFT 完成后必须立即执行 REVIEW，不得跳过。未输出审查报告前，禁止进入 POLISH/TRACK/BACKUP 及下一章。**

**期望输出格式**：
```markdown
## 审查报告 — 第 X 章

### 总体结论
✅ 通过 / ⚠️ 不通过

### 问题清单
| 序号 | 等级 | 类型 | 位置 | 问题描述 | 修改建议 |
|------|------|------|------|---------|---------|
| 1    | 🔴严重 | OOC  | 第X段 | ...     | ...     |
| 2    | 🟡建议 | 节奏 | 第X段 | ...     | ...     |

### 质量评分
- 对话自然度：⭐/5
- 节奏把控：⭐/5
- 钩子吸引力：⭐/5
```

**通过/不通过判断**：
- 存在一级问题（🔴或🚨） → ⚠️ 不通过
- 仅存在二级问题（🟡建议） → ✅ 通过（问题记录，但不阻塞）


---

### 步骤 5：POLISH（内容打磨）

**执行方式**：派发给 Claude Code CLI 执行。

**🔒 修改前备份（强制，不可跳过）**：在执行 POLISH 修改之前，必须先备份当前章节到版本历史：
```bash
python3 ~/.hermes/skills/novel/scripts/backup_chapter.py ~/novels/books/<书名>/01-正文存稿/第X章.md
```
备份后文件存入 `03-版本备份/正文历史/第X章_YYYYMMDD_HHMMSS.md`。
> ⚠️ 没有备份就没有修改历史，改错了找不回来。此步骤不可跳过。

**命令（文件传参，避免 shell 转义）**：
```bash
# 1. 先将 prompt 写入临时文件
cat > /tmp/novel_chX_polish_prompt.txt << 'PROMPT_EOF'
<完整 prompt 内容>
PROMPT_EOF

# 2. 通过 claude_runner 派发（含 idle-timeout 保护、stream-json 事件流、原子写盘）
python3 ~/.hermes/skills/novel/scripts/claude_runner.py \
  --prompt-file /tmp/novel_chX_polish_prompt.txt \
  --model sonnet \
  --max-turns 15 \
  --allowed-tools Read,Write,Edit \
  --idle-timeout 120 \
  --exit-timeout 10 \
  --target-file ~/novels/books/<书名>/01-正文存稿/第N章.md \
  --events-file /tmp/novel_chX_polish_events.jsonl \
  --output-file /tmp/novel_chX_polish_result.json
```
> ⚠️ 切勿使用内联 `claude -p "prompt文本"` ——中文引号会导致 shell 转义失败。

**传入内容**（作为 prompt 传递）：
- book_name：`<书名>`
- draft_output：`<步骤3 的完整输出>`
- review_report：`<步骤4 的完整输出>`

**prompt 模板**：
```
你是一位番茄小说资深编辑。请根据审查报告打磨以下第X章正文：

【初稿】
{步骤3 的完整输出}

【审查报告】
{步骤4 的完整输出}

打磨原则：
- 审查通过的 → 执行标准打磨（对话 / 画面感 / 节奏 / 钩子强化）
- 审查不通过的 → 先修复审查问题，再标准打磨
- 打磨 ≠ 重写，保持原有剧情结构
- 作者风格：直接、不煽情、冷幽默、冷感叙述（具体风格参考书配置）
- 输出打磨后的完整定稿（Markdown，格式同初稿）
```

**取回正文**：从 Claude Code CLI 的 stdout 中提取打磨后的定稿。

**打磨原则**：
- 审查通过的 → 执行标准打磨（对话 / 画面感 / 节奏 / 钩子强化）
- 审查不通过的 → 先修复审查问题，再标准打磨
- **打磨 ≠ 重写**，保持原有剧情结构


**REVIEW↔POLISH 循环状态处理**：
- POLISH 完成后，若上轮 REVIEW 判定为 ⚠️ 不通过且循环未达 3 次上限，则自动回到步骤 4 REVIEW 重审。
- 回到 REVIEW 前，进度文件状态需回退：`current_step` 设为 `"review"`，`steps_completed` 数组中移除 `"review"` 和 `"polish"`，`retry_counts.review_polish_loop` 递增 1。
- 若 REVIEW 通过（✅）或循环已达 3 次上限，则正常进入步骤 6 TRACK。

---

### 步骤 6：TRACK（状态更新）

**调用子技能**：`novel-track` + `novel-platform`（章末读者互动模板）

**传入参数**：
```json
{
  "final_draft": "<步骤5 的定稿>",
  "plot_output": "<步骤2 的完整输出>",
  "book_name": "<书名>",
  "chapter_num": <章节号>
}
```

**章末读者互动**（如果本章是广告打断点（3/6/9章），加载 `novel-platform` 模板）：
- 引导评论（悬念型）：「这章结尾你们猜到了吗？评论区说说——」
- 引导追读（留存型）：「明天这一章，会揭晓那个电话是谁打的。提示：不是你们想的任何一个人。」
- 50-80 字，必须带行动号召，不道歉不卖惨不解释剧情

**期望输出格式**：
```markdown
## 更新确认 — 第 X 章

### 人物状态变更
- <人物名>：XXX → XXX

### 伏笔变更
- 新增：N 条
- 回收：N 条
- 🚨 超期未回收：N 条

### 主线进度
X / Y 章（XX%）

### 前文时间线速查（供下一章 DRAFT 使用）
<!-- 本区块输出后同时追加保存到 `06-追踪记录/前文时间线速查.md`，供步骤3 DRAFT 读取 -->
| 章节 | 标题 | 梗概（≤20字） | 时间标记 |
|------|------|--------------|----------|
| Ch.X-2 | `<标题>` | `<梗概>` | `<日期/时间>` |
| Ch.X-1 | `<标题>` | `<梗概>` | `<日期/时间>` |
| Ch.X   | `<标题>` | `<梗概>` | `<日期/时间>` |

> ℹ️ 首次写第1章时仅输出 Ch.1 行；第2章时输出 Ch.1–2；第3章起固定输出最近3章。每完成一章后，将此表追加/更新到 `06-追踪记录/前文时间线速查.md`（只保留最近3行）。
```


---

### 步骤 7：MILESTONE（里程碑审查）

> ⚠️ **条件触发**：在以下任一条件满足时执行本步骤：
> 1. `章节号 % 5 == 0`（即第 5、10、15、20...章）
> 2. **当前章节是所在卷的最后一章**（从分卷细纲/章节规划确认。卷末必须审查，不论章节号是否为5的倍数）
> 非上述情况的章节跳过本步骤，直接进入 BACKUP。

**调用子技能**：`novel-milestone`（若不存在则按以下规范内联执行）

**传入参数**：
```json
{
  "book_name": "<书名>",
  "current_chapter": <当前章节号>,
  "last_5_chapters": "<最近5章正文内容（第 N-4 至第 N 章）>",
  "track_output": "<步骤6 TRACK 的完整输出>",
  "foreshadow_table": "<06-追踪记录/伏笔追踪表.md 完整内容>",
  "main_outline": "<00-大纲细纲/主线大纲.md 内容>",
  "volume_outline": "<00-大纲细纲/分卷细纲.md 内容>",
  "timeline_tracker": "<06-追踪记录/前文时间线速查.md 完整内容>",
  "character_cards": "<02-设定文档/人物库/ 下所有文件内容>",
  "arc_tracker": "<06-追踪记录/人物弧线追踪.md（若有）>"
}
```

**审查维度**（5 项，必须逐条检查）：

1. **前后 5 章连贯性**：检查最近 5 章（Ch.N-4 至 Ch.N）之间剧情是否有跳跃（逻辑断层、场景突兀切换）或重复（同类型事件/对话/套路连续出现 ≥ 3 章）
2. **伏笔埋坑状态**：
   - 统计本节段内新增伏笔数量与 ID
   - 统计本节段内回收伏笔数量与 ID
   - **超期统计**：列出所有超过计划回收章节 ≥ 3 章仍未回收的伏笔（🚨严重），以及超过 1-2 章的伏笔（⚠️警告）
3. **人物弧线推进进度**：与 `00-大纲细纲/主线大纲.md` 中的人物弧线规划对照，检查主要人物（≥ 3 个）的阶段性推进是否达标（预期 vs 实际）
4. **主线进度**：与 `00-大纲细纲/分卷细纲.md` 对照，检查当前卷内进度（已完成章节数 / 本卷总章节数），确认主线事件完成度是否匹配规划
5. **时间线全链路一致性**：交叉验证最近 5 章 + 前文时间线速查中所有章节的时间标记，确认日期/时间跨度的先后顺序无矛盾，无跨越不可能的时间跳跃
6. **章节规划同步**（强制，不可跳过）：
   - **已完成章回填**：逐个检查 Ch.N-4 至 Ch.N 的章节规划行，标题和核心事件是否为占位文本（「待定」「待填写」「TBD」等）。若是 → 🚨 阻塞，必须用实际发生的标题和事件回填。
   - **未来章检查**：检查 Ch.N+1 至 Ch.N+5 是否在章节规划中有实质内容（标题非占位，核心事件≥5字）。若无 → ⚠️ 警告，提示需在下一批 5 章开始前补充。
   - **分卷细纲同步**：检查 `00-大纲细纲/分卷细纲/` 中对应卷的细纲，确认其章节段描述与最近 5 章实际内容不矛盾。若章节段内容明显过时（描述的事件已发生但完全不同）→ ⚠️ 警告，提示需更新。
   - **输出**：在里程碑报告中增加「第 6 项：章节规划同步」表格，逐章列出规划行状态（✅ 已回填 / 🚨 占位需回填 / ⚠️ 未来章需补充）。

**期望输出格式**：
```markdown
## 里程碑审查报告 — 第 N 章（第 N/5 次里程碑）

### 总体结论
✅ 通过 / ⚠️ 阻塞（一级问题）

### 逐项检查

#### 1. 前后 5 章连贯性
| 检查项 | 状态 | 说明 |
|--------|------|------|
| 剧情跳跃 | ✅/⚠️/🚨 | <具体说明> |
| 剧情重复 | ✅/⚠️/🚨 | <具体说明> |

#### 2. 伏笔埋坑状态
| 类型 | 数量 | 详情 |
|------|------|------|
| 新增 | N 条 | V01, V02, ... |
| 回收 | N 条 | VXX→第X章回收, ... |
| 🚨超期≥3章 | N 条 | VXX（计划Ch.Y，已超Z章） |
| ⚠️超期1-2章 | N 条 | VXX（计划Ch.Y，已超Z章） |

#### 3. 人物弧线推进
| 人物 | 预期阶段 | 实际进度 | 偏差 |
|------|---------|---------|------|
| <主角> | <弧线描述> | <实际表现> | ✅/⚠️ |
| <配角1> | <弧线描述> | <实际表现> | ✅/⚠️ |
| <配角2> | <弧线描述> | <实际表现> | ✅/⚠️ |

#### 4. 主线进度
- 本卷总章节：X 章
- 已完成：Y 章（YY%）
- 规划节点对比：<预期 vs 实际>
- 偏差评估：✅/⚠️/🚨

#### 5. 时间线全链路一致性
| 章节 | 时间标记 | 距前章间隔 | 一致性 |
|------|---------|-----------|--------|
| Ch.N-4 | <时间> | — | ✅ |
| ... | ... | ... | ... |
| Ch.N | <时间> | <间隔> | ✅/⚠️ |

### 阻塞问题清单（如有）
| 序号 | 等级 | 维度 | 涉及章节 | 问题描述 | 修正建议 |
|------|------|------|---------|---------|---------|
| 1 | 🔴阻塞 | 连贯性 | Ch.X-Y | ... | ... |
| 2 | 🚨严重 | 伏笔 | Ch.Z | ... | ... |

### 通过后的放行声明
> ✅ 第 N 章里程碑审查通过。第 N/5 批 5 章（Ch.N-4 ~ Ch.N）质量检验合格，允许进入第 N+1 ~ N+5 章的创作。
```

**通过/阻塞判断**：
- 存在一级问题（🔴阻塞 / 🚨严重）→ ⚠️ 阻塞，不允许进入下一批 5 章
- 仅存在二级问题（⚠️警告 / 💡建议）→ ✅ 通过，问题记录但不阻塞
- 阻塞 → 标记 `milestone_blocked`，展示阻塞问题清单，提示用户修正对应章节后重新触发里程碑审查

**阻塞时的处理流程**：
1. 将进度文件中 `current_step` 设为 `milestone_blocked`，`status` 设为 `failed`
2. 将里程碑审查报告保存到 `00-大纲细纲/里程碑审查_第N章.md`
3. 展示阻塞问题清单，给出每个问题的修正建议（回退到哪个章节 PREP 重新开始）
4. 用户修正后，从修正后的章节重新走 7 步流程，到该章的 TRACK 后再次触发 MILESTONE
5. 用户说「继续下一章」「写第 X 章」时，前置检查先检测 `milestone_blocked` 状态 → 若存在则拦截并提示「⚠️ 第 N 章里程碑审查未通过，请先修正阻塞问题」


---

### 步骤 8：BACKUP（自动备份）

**调用子技能**：`novel-backup`

**传入参数**：
```json
{
  "final_draft": "<步骤5 的定稿>",
  "book_name": "<书名>",
  "chapter_num": <章节号>,
  "word_count": <字数>,
  "mode": "chapter"
}
```

**期望输出格式**：
```markdown
✅ 备份完成
- 正文：01-正文存稿/第X章.md
- 设定快照：03-版本备份/设定快照_第X章/
- 备份版本：v<version>
```


---

## 最终输出格式（步骤 8 完成后）

```markdown
✅ 第 X 章《章节标题》完成！

📊 本章统计：
- 字数：XXXX
- 新增伏笔：N 条（V01-V0N）
- 回收伏笔：N 条
- 人物状态变更：N 人

📁 备份已保存 → 03-版本备份/设定快照_第X章/

🔄 下一步：说「继续下一章」写第 Y 章
```

**写入进度文件**：更新 `~/.hermes/skills/novel/_state/<书名>_progress.json`，标记 `status: 'completed'`。

---

## 中间状态保存与中断恢复

> 📄 完整机制（进度文件格式/状态枚举/保存时机/恢复流程/技能缓存）见 `references/general/progress-format.md`。

**核心要点：**
- 进度文件：`~/.hermes/skills/novel/_state/<书名>_progress.json`
- 每步完成后自动保存进度，中断后询问用户是否从断点继续
- `milestone_blocked` 状态拦截新章节，需先修正阻塞问题
- 前置检查阶段读取进度文件，检测 `milestone_blocked` 和 `status != 'completed'`

---

## 用户交互策略

| 步骤 | 自动化 | 需要确认 | 触发确认的条件 |
|------|--------|---------|---------------|
| 前置检查 | ✅ | — | 无活跃书 / 书不存在时询问 |
| 中断恢复 | — | ✅ 确认 | 检测到未完成进度 |
| PREP | ✅ | — | 仅在 fallback 时询问 |
| PLOT | ✅ | — | 仅在 fallback 时询问 |
| DRAFT | ✅ | — | 仅在字数严重异常时询问 |
| REVIEW | ✅ | ✅ 需确认 | 3 次审查仍不通过时 |
| POLISH | ✅ | — | 仅在打磨引入新问题时 |
| TRACK | ✅ | — | 仅在写入失败时 |
| MILESTONE | ✅ | ✅ 阻塞时 | 仅 5 的倍数章节触发；审查不通过时标记阻塞，需用户修正 |
| BACKUP | ✅ | — | 仅在打包失败时 |
| 最终统计 | ✅ | — | 自动展示 |

**总结**：正常流程下，用户说「写第 X 章」→ 全自动 7-8 步（5 的倍数章为 8 步）→ 看到完成报告。仅在异常或里程碑阻塞时才需要用户介入。

---

## 多书切换

在 PREP 开始前，检查当前活跃书。如果用户说「切到《XXX》写第 Y 章」：
1. 更新 `~/.hermes/skills/novel/_state/current_book.txt` 为 `<XXX>`
2. 保存当前书的进度（如果正在进行）
3. 对新书执行前置检查
4. 继续 7 步流程

---

## 注意事项

- **严格按序执行**：不跳过任何步骤，每步完成后检查子技能输出是否完整
- **REVIEW-POLISH 循环**：审查不通过 → 打磨 → 重回审查，最多 3 次
- **MILESTONE 阻塞机制**：每 5 章触发里程碑审查，一级问题标记阻塞（`milestone_blocked`），不允许进入下一批 5 章，必须先修正再继续
- **进度常保存**：每步完成后写入进度 JSON，确保中断可恢复
- **前置检查增强**：`milestone_blocked` 状态下的书籍，前置检查时必须拦截并提示「⚠️ 第 N 章里程碑审查未通过，请先修正阻塞问题」，不允许开始新章节
- **文件路径约定**：
  - 工作数据：`~/novels/books/<书名>/`
  - 技能与模板：`~/.hermes/skills/novel/`
  - 知识库：`~/.hermes/skills/novel/knowledge/`
  - 状态文件：`~/.hermes/skills/novel/_state/`
  - 全局日志与备份：`~/novels/_shared/logs/` 和 `~/novels/_shared/backups/`
- **DRAFT/POLISH 铁律**：这两步是文字创作，必须用 Claude Code CLI (`--model sonnet --max-turns 15`)，禁止用 delegate_task。delegate_task 的子代理不遵循创作规则，会自创地名/数字/系统功能。
- **里程碑审查报告归档**：报告保存至 `00-大纲细纲/里程碑审查_第N章.md`，方便后续回溯各批 5 章的质量评估历史

