浏览代码

Refactor skills references and workflow checkpoints

lingfengQAQ 3 月之前
父节点
当前提交
de391ef4b9

+ 5 - 4
.claude/agents/context-agent.md

@@ -13,6 +13,7 @@ tools: Read, Grep, Bash
 
 - **Taxonomy**: `.claude/references/reading-power-taxonomy.md`
 - **Genre Profile**: `.claude/references/genre-profiles.md`
+- **Shared References**: `.claude/references/shared/` 为单一事实源;如需枚举/扫描参考文件,遇到 `<!-- DEPRECATED:` 的文件一律跳过。
 
 ## 输入
 
@@ -27,14 +28,14 @@ tools: Read, Grep, Bash
 
 ## 输出格式:创作任务书(7个板块)
 
-1. **本章核心任务**(冲突一句话、必须完成、绝对不能、反派层级)
+1. **本章核心任务**(目标/阻力/代价、冲突一句话、必须完成、绝对不能、反派层级)
 2. **接住上章**(上章钩子、读者期待、开头必须)
 3. **出场角色**(状态、动机、情绪底色、说话风格、红线)
 4. **场景与力量约束**(地点、可用能力、禁用能力)
 5. **风格指导**(本章类型、参考样本、最近模式、本章建议)
 6. **连续性与伏笔**(时间/位置/情绪连贯;必须处理/可选伏笔)
-7. **追读力策略**(章末钩子类型+强度、微兑现建议、差异化提示)
-   - 如存在债务/Override,仅在此板块补充“债务状态/偿还建议”。
+7. **追读力策略**(章末未闭合问题 + 钩子类型/强度、微兑现建议、差异化提示)
+    - 如存在债务/Override,仅在此板块补充“债务状态/偿还建议”。
 
 ---
 
@@ -93,7 +94,7 @@ python "${CLAUDE_PLUGIN_ROOT}/scripts/extract_chapter_context.py" --chapter {NNN
 
 ### Step 1: 读取大纲与状态
 - 大纲:`大纲/卷N/第XXX章.md` 或 `大纲/第{卷}卷-详细大纲.md`
-  - 若大纲含“反派层级”,必须提取并写入任务书
+  - 必须优先提取并写入任务书:目标/阻力/代价/反派层级/本章变化/章末未闭合问题/钩子(若存在)
 - `state.json`:progress / protagonist_state / chapter_meta / project.genre
 
 ### Step 2: 追读力与债务(按需)

+ 313 - 0
.claude/references/shared/cool-points-guide.md

@@ -0,0 +1,313 @@
+---
+name: cool-points-guide
+purpose: 爽点设计参考,规划大纲时和写作时按需加载
+---
+
+<context>
+此文件用于爽点(cool-points)设计。Claude 已知基本叙事技巧,这里只补充网文特定的爽点工程方法论。
+注意:此文件为 shared 单一事实源;禁止在各 Skill 的 references 下复制修改。若需更新,请修改本文件。
+</context>
+
+<instructions>
+
+## 一、六种爽点执行模式
+
+### 1. 装逼打脸
+```
+对方轻视 → 主角展示实力 → 对方震惊/后悔
+```
+**适用**:都市、玄幻、职场
+
+### 2. 扮猪吃虎
+```
+表面弱小 → 关键时刻爆发 → 众人惊艳
+```
+**适用**:重生、隐藏身份、低调流
+
+### 3. 越级反杀
+```
+实力差距明显 → 主角逆袭 → 敌人不可置信
+```
+**适用**:玄幻、武侠、竞技
+
+### 4. 打脸权威
+```
+权威质疑 → 主角用实力证明 → 权威认可/尴尬
+```
+**适用**:职场、学院、技术流
+
+### 5. 反派翻车
+```
+反派得意 → 计划破产 → 反派狼狈
+```
+**适用**:所有题材
+
+### 6. 甜蜜超预期
+```
+平淡日常 → 意外惊喜 → 情感升温
+```
+**适用**:言情、甜宠
+
+---
+
+## 二、爽点三段式结构 (30/40/30公式)
+
+### 铺垫阶段 (Setup, 30%篇幅)
+- **建立预期**:读者应该期待什么
+- **制造反差**:当前状态 vs 即将展现的状态
+- **信息差设置**:读者知道什么?角色知道什么?
+
+### 兑现阶段 (Delivery, 40%篇幅)
+- **触发时机**:什么事件触发爽点
+- **展现方式**:用对话/动作/结果展现
+- **情绪高峰**:爽点的最高潮瞬间
+
+### 微反转阶段 (Twist, 30%篇幅)
+- **假结束**:读者以为爽点结束了
+- **还有一手**:其实还有更厉害的
+- **余韵**:微反转后的状态与暗示
+
+---
+
+## 三、压扬比例控制
+
+### 压扬比例标准
+| 题材类型 | 压扬比例 | 说明 |
+|---------|---------|------|
+| 传统爽文 | 压3扬7 | 轻度压迫,快速释放 |
+| 硬核正剧 | 压5扬5 | 平衡叙事 |
+| 虐恋/黑深残 | 压7扬3 | 长期压抑,爆发更爽 |
+
+### 压扬节奏控制
+```
+慢铺垫(压) → 快爆发(扬) → 停顿 → 再加速
+```
+
+### 句式节奏
+- **短句**:快节奏,动作密集
+- **长句**:慢节奏,细节描写
+- **交替**:制造节奏变化
+
+---
+
+## 四、爽点密度标准
+
+| 周期 | 要求 |
+|------|------|
+| 每章 | ≥1 个小爽点(单一模式) |
+| 每 5 章 | ≥1 个组合爽点(2种模式叠加) |
+| 每 10-15 章 | ≥1 个里程碑爽点(改变主角地位) |
+
+### 爽点强度分级
+| 级别 | 说明 | 频率 |
+|------|------|------|
+| 小爽点 | 单一模式,日常打脸,规模不大 | 每章1-2个 |
+| 组合爽点 | 2种以上模式叠加,重要转折 | 每5章1个 |
+| 里程碑爽点 | 改变主角地位的阶段性胜利 | 每10-15章1个 |
+
+---
+
+## 五、信息差设计
+
+### 信息差层级
+| 层级 | 说明 |
+|------|------|
+| 读者已知 | 读者通过前文已经知道的信息 |
+| 角色已知 | 场景中的角色知道的信息 |
+| 信息差核心 | 读者知道但角色不知道的关键信息 |
+| 反转信息 | 微反转时揭示的新信息 |
+
+### 信息差运用
+```
+读者知道主角是隐藏大佬 + 角色不知道 = 期待感
+角色嘲讽主角 + 读者知道主角实力 = 爽感积累
+主角展示实力 + 角色震惊 = 爽感释放
+```
+
+---
+
+## 六、打脸四步法(核心套路)
+
+**Step 1 铺垫**: 提前1-2章建立信息差(读者知道主角底牌,反派不知道)
+
+**Step 2 挑衅**: 至少3次嘲讽 + 对照组(反派被追捧 vs 主角被贬低)
+
+**Step 3 拉扯**: 2-3轮交锋,主角示弱 → 反派得意 → 期待拉满
+
+**Step 4 爆发**: 物理碾压 + 精神打击 + 围观群众反应 + 实质收获
+
+---
+
+## 七、微反转类型
+
+### 还有更强
+展示了一手,其实还有更厉害的
+```
+"你以为这就是我的全力?"
+```
+
+### 意外收获
+本来只想完成目标,结果还有意外好处
+```
+打败对手 → 获得宝物 → 宝物比预期更珍贵
+```
+
+### 对方更惨
+对方以为只是小失败,其实是大翻车
+```
+输了比赛 → 赌注曝光 → 身败名裂
+```
+
+### 情感升温
+本以为只是甜,其实更甜
+```
+以为只是普通礼物 → 发现是精心准备 → 感动落泪
+```
+
+### 真相揭示
+表面是A,其实是B,而且B更厉害
+```
+以为是普通玉佩 → 其实是上古神器 → 还认主了
+```
+
+---
+
+## 八、爽点升级路径
+
+### 维度1: 规模升级
+```
+打脸小流氓 → 打脸世家少爷 → 打脸宗门长老 → 覆灭一个帝国
+```
+
+### 维度2: 方式升级
+```
+暴力碾压 → 智谋碾压 → 规则掌控 → 因果抹杀
+```
+
+### 维度3: 受众升级
+```
+让邻居震惊 → 让全城震惊 → 让全国震惊 → 让诸天神魔战栗
+```
+
+---
+
+## 九、题材适配
+
+### 都市爽文
+- 注重装逼打脸
+- 用财力/人脉/身份反转
+- 社会地位碾压
+
+### 玄幻升级
+- 注重战力反转
+- 用实力碾压/等级差距打破
+- 越级战斗
+
+### 悬疑本格
+- 注重真相反转
+- 用证据/推理打脸
+- 智商碾压
+
+### 甜宠言情
+- 注重情感惊喜
+- 用意外浪漫/深情告白
+- 甜度超标
+
+---
+
+## 十、AI执行指令
+
+创作时必须遵守:
+
+1. **设计反转时**: 明确**信息差核心**(谁知道什么,谁不知道什么)
+2. **审核爽感时**: 爽感不足检查**铺垫篇幅(30%)**是否太少导致势能不足
+3. **节奏检查时**: 确保符合 30/40/30 公式分配
+
+---
+
+## 十一、伏笔三层级
+
+| 层级 | 回收周期 | 示例 |
+|------|----------|------|
+| 核心 | 50-300章 | 主角身世/终极敌人/金手指来历 |
+| 支线 | 30-100章 | 配角动机/神秘物品/师门秘密 |
+| 装饰 | 10-30章 | 场景细节/小习惯/路人提及 |
+
+</instructions>
+
+<examples>
+
+<example>
+<input>设计一个打脸爽点:主角在宗门大比被嘲笑</input>
+<output>
+**铺垫**(第45章): 主角已筑基但隐藏修为,王少以为主角只有练气七层
+**挑衅**: 王少当众嘲讽"废物也来参加?",长老们追捧王少
+**拉扯**: 第1轮主角用三成力被轻视,第2轮继续示弱,王少大笑"不过如此"
+**爆发**: 主角爆发筑基威压,一拳击飞王少,全场震惊"十八岁筑基天才!"
+**收获**: 晋升内门 + 5000灵石 + 女主好感度+20
+
+**压扬比例**: 压3扬7(铺垫2章+挑衅拉扯30% / 爆发+收获70%)
+</output>
+</example>
+
+<example>
+<input>设计越级反杀爽点:主角突破境界</input>
+<output>
+**困境**: 被追杀至悬崖,走投无路
+**机缘**: 发现隐藏洞府,获得天材地宝
+**突破**: 服用后突破至筑基期
+**展示**: 回头一掌拍飞追兵,"你们...还追吗?"
+
+**30/40/30分配**:
+- 30%: 被追杀过程,生死危机(压)
+- 40%: 发现洞府、突破过程(扬)
+- 30%: 反杀追兵、展示威风(爆)
+</output>
+</example>
+
+<example>
+<input>节奏脉冲示例</input>
+<output>
+【慢铺垫】
+"你?"王浩嗤笑一声,上下打量着萧炎,眼中满是不屑,"就凭你一个废物,也配站在这里?"
+
+【快爆发】
+萧炎动了。
+一步。
+王浩的笑容僵住。
+两步。
+他的瞳孔骤缩。
+三步。
+"砰!"
+
+【停顿】
+全场寂静。
+没有人说话。
+甚至没有人敢呼吸。
+
+【再加速】
+"还有谁?"萧炎淡淡开口,目光扫过全场。
+</output>
+</example>
+
+<example type="edge_case">
+<input>连续3章都是打脸,如何调整?</input>
+<output>
+❌ 继续打脸 → 审美疲劳
+✅ 第4章改为越级反杀或打脸权威
+✅ 或穿插 Fire Strand(感情线)调节节奏
+</output>
+</example>
+
+</examples>
+
+<errors>
+❌ 无铺垫的突然反转 → ✅ 提前1-2章埋信息差
+❌ 一招秒杀 → ✅ 至少2-3轮拉扯
+❌ 降智反派 → ✅ 基于已知信息的合理轻视
+❌ 打完无收获 → ✅ 必须有战利品/认可/资格
+❌ 缺少围观群众 → ✅ 侧面烘托震惊效果
+❌ 铺垫篇幅不足(<30%) → ✅ 势能不足,爽感打折
+❌ 压扬比例失衡 → ✅ 根据题材调整比例
+❌ 未标注信息差 → ✅ 明确读者和角色的认知差异
+</errors>

+ 91 - 0
.claude/references/shared/core-constraints.md

@@ -0,0 +1,91 @@
+---
+name: core-constraints
+purpose: 每次章节写作前加载,确保三大定律执行
+version: "5.4"
+---
+
+<context>
+此文件用于章节创作时的核心约束检查。Claude 已知一般写作规范,这里只补充网文特定的防幻觉协议。
+v5.4:版本号对齐,内容沿用 v5.2。
+注意:此文件为 shared 单一事实源;禁止在各 Skill 的 references 下复制修改。若需更新,请修改本文件。
+</context>
+
+<instructions>
+
+## 三大定律(低自由度 - 必须精确执行)
+
+| 定律 | 规则 | 检查方式 |
+|------|------|----------|
+| **大纲即法律** | 严格执行大纲,不得擅自发挥 | 审查时对照大纲 |
+| **设定即物理** | 实力/招式/物品 ≤ index.db 记录 | 写作前查询确认 |
+| **发明需识别** | 新实体由 Data Agent 自动提取 | 章节完成后处理 |
+
+## 新实体处理流程(v5.2 引入,v5.4 沿用)
+
+v5.2 引入的规则,v5.4 沿用:正文不再要求 XML 标签:
+
+1. **写作时**: 直接写纯正文,新角色/地点/物品正常描写
+2. **完成后**: Data Agent 自动识别新实体并写入 index.db
+3. **不确定实体**: Data Agent 标记为 uncertain,由人工确认
+
+## 钩子硬约束(新增)
+
+- 开头 120 字必须出现冲突/风险/强情绪之一
+- 结尾 80-150 字设置未闭合问题/危险逼近/信息反转
+- 禁止结束在“回去休息了”或类似收尾
+
+## 网文口感基准(新增)
+
+- 禁止连续 400 字纯解释/背景
+- 每 800-1200 字至少一次局面变化
+- 对话每句必须带意图
+
+## 爽点密度要求
+
+- 每章 ≥1 个小爽点(单一模式)
+- 每 5 章 ≥1 个组合爽点(2种模式叠加)
+- 每 10-15 章 ≥1 个里程碑爽点(改变主角地位)
+- 避免连续 3 章同类型
+
+## Strand 平衡警告
+
+| 情节线 | 警告条件 |
+|--------|----------|
+| Quest(主线) | 连续 5+ 章 |
+| Fire(感情线) | >10 章未出现 |
+| Constellation(世界观) | >15 章未出现 |
+
+## 禁止事项
+
+- `[待补充]`、`[TODO]`、`...(省略)...` → 必须完整写出
+- 战斗后无善后描述(都市异能题材)
+
+</instructions>
+
+<examples>
+
+<example>
+<input>主角需要使用"天雷掌"击败敌人</input>
+<output>
+1. 查询 index.db 中是否有"天雷掌"技能
+2. 若有:直接使用
+3. 若无:在正文中描写获得途径(如拜师/领悟/传承),Data Agent 会自动提取
+</output>
+</example>
+
+<example type="edge_case">
+<input>剧情需要主角展示筑基期实力,但 index.db 显示练气期</input>
+<output>
+❌ 直接写筑基期战力 → 违反"设定即物理"
+✅ 先安排突破场景,Data Agent 更新 index.db,再展示新实力
+</output>
+</example>
+
+</examples>
+
+<errors>
+❌ 新实体描写模糊(无法自动识别) → ✅ 确保新实体有明确名称和描写
+❌ 主角突然会新技能 → ✅ 先描写获得途径
+❌ 实力设定不一致 → ✅ 写作前查询 index.db 确认
+❌ 章末无钩子 → ✅ 重写结尾,制造未闭合问题/危险/反转
+</errors>

+ 111 - 0
.claude/references/shared/strand-weave-pattern.md

@@ -0,0 +1,111 @@
+---
+name: strand-weave-pattern
+purpose: 章节规划时检查三线平衡,避免节奏单调
+---
+
+<context>
+此文件用于情节线平衡控制。Claude 已知多线叙事技巧,这里只补充网文特定的三线交织机制和 state.json 中的追踪器结构。
+注意:此文件为 shared 单一事实源;禁止在各 Skill 的 references 下复制修改。若需更新,请修改本文件。
+</context>
+
+<instructions>
+
+## 三条线定义与占比
+
+| 线条 | 占比 | 定义 | 典型剧情 |
+|------|------|------|----------|
+| **Quest(主线)** | 55-65% | 核心任务、升级、战斗、夺宝 | 宗门大比、秘境、突破境界、复仇打脸 |
+| **Fire(感情线)** | 20-30% | 情感关系发展(爱情/友情/师徒) | 相识暧昧、英雄救美、确认关系 |
+| **Constellation(世界观线)** | 10-20% | 扩展设定、展示新势力/地点、势力关系、社交网络 | 揭示隐藏势力、介绍新大陆、主角身世 |
+
+## 交织规则(低自由度 - 必须执行)
+
+| 规则 | 警告条件 | 建议操作 |
+|------|----------|----------|
+| Quest 不连续超过 5 章 | chapters_since_switch >= 5 | 切换到 Fire 或 Constellation |
+| Fire 不超过 10 章不出现 | current - last_fire > 10 | 安排感情戏(小甜蜜/吃醋) |
+| Constellation 不超过 15 章不出现 | current - last_constellation > 15 | 展示新设定/势力/伏笔 |
+
+## state.json 中的 strand_tracker 结构
+
+```json
+{
+  "strand_tracker": {
+    "last_quest_chapter": 45,
+    "last_fire_chapter": 43,
+    "last_constellation_chapter": 40,
+    "current_dominant": "quest",
+    "chapters_since_switch": 3,
+    "history": [{"chapter": 46, "dominant": "quest"}, ...]
+  }
+}
+```
+
+兼容说明:
+- `history[].dominant` 为当前标准字段(update_state.py 写入)
+- 若项目存在旧数据 `history[].strand`,读取时应兼容映射到 dominant
+
+## 前 30 章织网模板
+
+```
+第 1-5 章:   Quest ×5(开局快速推进主线)
+第 6 章:     Fire(首次与女主相遇)
+第 7-10 章:  Quest ×4(宗门大比)
+第 11 章:    Fire(英雄救美)
+第 12-14 章: Quest ×3(秘境夺宝)
+第 15 章:    Constellation(揭示"圣地"存在)
+第 16-19 章: Quest ×4(击败强敌)
+第 20 章:    Fire(确认关系)
+第 21-24 章: Quest ×4(突破境界)
+第 25 章:    Constellation(发现主角身世线索)
+第 26-30 章: Quest ×5(卷末高潮)
+```
+
+</instructions>
+
+<examples>
+
+<example>
+<input>当前第 46 章,last_quest=45, last_fire=43, last_constellation=40, current_dominant="quest", chapters_since_switch=3</input>
+<output>
+**警告判断**:
+- Quest 连续 3 章 < 5 章 → 暂无警告
+- 距离 Fire 3 章 < 10 章 → 暂无警告
+- 距离 Constellation 6 章 < 15 章 → 暂无警告
+
+**本章建议**: 可继续 Quest,但建议下 1-2 章内安排 Fire 调节节奏
+</output>
+</example>
+
+<example>
+<input>当前第 55 章,last_fire=42,连续 13 章无感情线</input>
+<output>
+⚠️ **警告**: 距离上次感情线 > 10 章!
+
+**建议**: 本章安排 Fire 线
+- 选项 A: 女主出场,小甜蜜互动
+- 选项 B: 英雄救美场景
+- 选项 C: 吃醋/误会小剧情
+</output>
+</example>
+
+<example type="edge_case">
+<input>开局前 10 章需要快速建立主线,感情线可以少一点吗?</input>
+<output>
+✅ 可以。前 10 章占比可调整为:
+- Quest: 70-80%
+- Fire: 10-15%
+- Constellation: 5-10%
+
+但第 6-8 章必须安排至少 1 次 Fire(首次相遇/印象建立)
+</output>
+</example>
+
+</examples>
+
+<errors>
+❌ 连续 10 章纯 Quest → ✅ 最多 5 章后切换
+❌ 感情线超过 10 章不出现 → ✅ 每 5-10 章安排一次
+❌ 世界观线超过 15 章不出现 → ✅ 每 10-15 章展示新设定
+❌ 切换 Strand 后忘记更新 strand_tracker → ✅ 每章结束后自动更新
+</errors>

+ 49 - 0
.claude/scripts/data_modules/tests/test_extract_chapter_context.py

@@ -53,6 +53,55 @@ def test_extract_chapter_outline_supports_hyphen_filename(tmp_path):
     assert "测试大纲" in outline
 
 
+def test_extract_chapter_outline_prefers_state_volume_mapping(tmp_path):
+    scripts_dir = Path(__file__).resolve().parents[2]
+    if str(scripts_dir) not in sys.path:
+        sys.path.insert(0, str(scripts_dir))
+
+    from extract_chapter_context import extract_chapter_outline
+
+    webnovel_dir = tmp_path / ".webnovel"
+    webnovel_dir.mkdir(parents=True, exist_ok=True)
+    state = {
+        "progress": {
+            "volumes_planned": [
+                {"volume": 1, "chapters_range": "1-10"},
+                {"volume": 2, "chapters_range": "11-20"},
+            ]
+        }
+    }
+    (webnovel_dir / "state.json").write_text(json.dumps(state, ensure_ascii=False), encoding="utf-8")
+
+    outline_dir = tmp_path / "大纲"
+    outline_dir.mkdir(parents=True, exist_ok=True)
+    (outline_dir / "第2卷-详细大纲.md").write_text("### 第12章:V2标题\nV2大纲", encoding="utf-8")
+
+    outline = extract_chapter_outline(tmp_path, 12)
+    assert "### 第12章:V2标题" in outline
+    assert "V2大纲" in outline
+
+
+def test_extract_chapter_outline_falls_back_when_state_has_no_match(tmp_path):
+    scripts_dir = Path(__file__).resolve().parents[2]
+    if str(scripts_dir) not in sys.path:
+        sys.path.insert(0, str(scripts_dir))
+
+    from extract_chapter_context import extract_chapter_outline
+
+    webnovel_dir = tmp_path / ".webnovel"
+    webnovel_dir.mkdir(parents=True, exist_ok=True)
+    state = {"progress": {"volumes_planned": [{"volume": 1, "chapters_range": "1-10"}]}}
+    (webnovel_dir / "state.json").write_text(json.dumps(state, ensure_ascii=False), encoding="utf-8")
+
+    outline_dir = tmp_path / "大纲"
+    outline_dir.mkdir(parents=True, exist_ok=True)
+    (outline_dir / "第2卷-详细大纲.md").write_text("### 第60章:V2标题\nV2大纲", encoding="utf-8")
+
+    outline = extract_chapter_outline(tmp_path, 60)
+    assert "### 第60章:V2标题" in outline
+    assert "V2大纲" in outline
+
+
 def test_build_chapter_context_payload_includes_contract_sections(tmp_path):
     scripts_dir = Path(__file__).resolve().parents[2]
     if str(scripts_dir) not in sys.path:

+ 45 - 0
.claude/scripts/data_modules/tests/test_update_state_add_review_cli.py

@@ -0,0 +1,45 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+import json
+import sys
+
+
+def test_update_state_cli_add_review_writes_checkpoint(tmp_path, monkeypatch):
+    import update_state as update_state_module
+
+    webnovel_dir = tmp_path / ".webnovel"
+    webnovel_dir.mkdir(parents=True, exist_ok=True)
+
+    state = {
+        "project_info": {},
+        "progress": {"current_chapter": 1, "total_words": 0},
+        "protagonist_state": {
+            "power": {"realm": "炼气", "layer": 1, "bottleneck": None},
+            "location": "村口",
+        },
+        "relationships": {},
+        "world_settings": {},
+        "plot_threads": {},
+        "review_checkpoints": [],
+    }
+    state_file = webnovel_dir / "state.json"
+    state_file.write_text(json.dumps(state, ensure_ascii=False), encoding="utf-8")
+
+    # 避免在测试里创建备份目录/修改权限等非核心行为
+    monkeypatch.setattr(update_state_module.StateUpdater, "backup", lambda self: True)
+
+    report_file = "review/report_1_2.md"
+    monkeypatch.setattr(
+        sys,
+        "argv",
+        ["update_state", "--project-root", str(tmp_path), "--add-review", "1-2", report_file],
+    )
+    update_state_module.main()
+
+    updated = json.loads(state_file.read_text(encoding="utf-8"))
+    checkpoints = updated.get("review_checkpoints")
+    assert isinstance(checkpoints, list)
+    assert checkpoints[-1]["chapters"] == "1-2"
+    assert checkpoints[-1]["report"] == report_file
+

+ 66 - 3
.claude/scripts/extract_chapter_context.py

@@ -22,9 +22,9 @@ from typing import Any, Dict, List
 from runtime_compat import enable_windows_utf8_stdio
 
 try:
-    from chapter_paths import find_chapter_file
+    from chapter_paths import find_chapter_file, volume_num_for_chapter
 except ImportError:  # pragma: no cover
-    from scripts.chapter_paths import find_chapter_file
+    from scripts.chapter_paths import find_chapter_file, volume_num_for_chapter
 
 
 def _ensure_scripts_path():
@@ -33,6 +33,69 @@ def _ensure_scripts_path():
         sys.path.insert(0, str(scripts_dir))
 
 
+_CHAPTER_RANGE_RE = re.compile(r"^\s*(\d+)\s*-\s*(\d+)\s*$")
+
+
+def _parse_chapters_range(value: Any) -> tuple[int, int] | None:
+    if not isinstance(value, str):
+        return None
+    m = _CHAPTER_RANGE_RE.match(value)
+    if not m:
+        return None
+    try:
+        start = int(m.group(1))
+        end = int(m.group(2))
+    except ValueError:
+        return None
+    if start <= 0 or end <= 0 or start > end:
+        return None
+    return start, end
+
+
+def _volume_num_for_chapter_from_state(project_root: Path, chapter_num: int) -> int | None:
+    """
+    Prefer `.webnovel/state.json.progress.volumes_planned[].chapters_range` mapping.
+
+    Fallback is handled by caller (typically 50 chapters per volume).
+    """
+    state_path = project_root / ".webnovel" / "state.json"
+    if not state_path.exists():
+        return None
+    try:
+        state = json.loads(state_path.read_text(encoding="utf-8"))
+    except Exception:
+        return None
+
+    if not isinstance(state, dict):
+        return None
+
+    progress = state.get("progress")
+    if not isinstance(progress, dict):
+        return None
+
+    volumes_planned = progress.get("volumes_planned")
+    if not isinstance(volumes_planned, list):
+        return None
+
+    best: tuple[int, int] | None = None  # (start, volume) - prefer the latest start if overlaps exist
+    for item in volumes_planned:
+        if not isinstance(item, dict):
+            continue
+        volume = item.get("volume")
+        if not isinstance(volume, int) or volume <= 0:
+            continue
+        parsed = _parse_chapters_range(item.get("chapters_range"))
+        if not parsed:
+            continue
+        start, end = parsed
+        if start <= chapter_num <= end:
+            cand = (start, volume)
+            if best is None or cand[0] > best[0] or (cand[0] == best[0] and cand[1] < best[1]):
+                best = cand
+
+    return best[1] if best else None
+
+
 def find_project_root(start_path: Path | None = None) -> Path:
     """Find project root containing `.webnovel` directory."""
     if start_path is None:
@@ -53,7 +116,7 @@ def find_project_root(start_path: Path | None = None) -> Path:
 
 def extract_chapter_outline(project_root: Path, chapter_num: int) -> str:
     """Extract chapter outline segment from volume outline file."""
-    volume_num = (chapter_num - 1) // 50 + 1
+    volume_num = _volume_num_for_chapter_from_state(project_root, chapter_num) or volume_num_for_chapter(chapter_num)
     outline_candidates = [
         project_root / "大纲" / f"第{volume_num}卷-详细大纲.md",
         project_root / "大纲" / f"第{volume_num}卷 详细大纲.md",

+ 11 - 11
.claude/skills/webnovel-init/SKILL.md

@@ -26,24 +26,24 @@ Do not recursively chase references inside a reference file unless blocked.
 
 Path conventions:
 - `references/...` → relative to this skill directory (i.e. `.claude/skills/webnovel-init/references/...`)
-- `@templates/...` → relative to `.claude/templates/...` (project-level shared templates)
+- `templates/...` → relative to plugin root `.claude/templates/...`(建议用下方 Markdown 链接导航)
 
 ### L1 (minimum, wave-gated)
-- Before Wave 1: `references/genre-tropes.md`
+- Before Wave 1: [genre-tropes.md](references/genre-tropes.md)
 
 ### L2 (conditional)
-- After genre selection: `@templates/genres/{genre}.md` (only for selected genres in A+B)
-- Before Wave 3 (golden finger): `@templates/golden-finger-templates.md`
-- Before Wave 4 (world): `references/worldbuilding/faction-systems.md`
+- After genre selection: `templates/genres/{genre}.md` (only for selected genres in A+B)
+- Before Wave 3 (golden finger): [golden-finger-templates.md](../../templates/golden-finger-templates.md)
+- Before Wave 4 (world): [faction-systems.md](references/worldbuilding/faction-systems.md)
 - Before Wave 4 (constraints):
-  - `references/creativity/creativity-constraints.md`
-  - `references/creativity/anti-trope-xianxia.md` (修仙/玄幻/高武/西幻)
-  - `references/creativity/anti-trope-urban.md` (都市/历史)
-  - `references/creativity/anti-trope-game.md` (游戏/科幻/末世)
-  - `references/creativity/anti-trope-rules-mystery.md` (规则/悬疑/灵异)
+  - [creativity-constraints.md](references/creativity/creativity-constraints.md)
+  - [anti-trope-xianxia.md](references/creativity/anti-trope-xianxia.md) (修仙/玄幻/高武/西幻)
+  - [anti-trope-urban.md](references/creativity/anti-trope-urban.md) (都市/历史)
+  - [anti-trope-game.md](references/creativity/anti-trope-game.md) (游戏/科幻/末世)
+  - [anti-trope-rules-mystery.md](references/creativity/anti-trope-rules-mystery.md) (规则/悬疑/灵异)
 
 ### L3 (optional, explicit only)
-- `references/creativity/market-trends-2026.md`
+- [market-trends-2026.md](references/creativity/market-trends-2026.md)
 - If used, explicitly mark it as time-sensitive and verify freshness before relying on it.
 
 ## Questioning style

+ 74 - 24
.claude/skills/webnovel-plan/SKILL.md

@@ -11,32 +11,29 @@ Purpose: refine 总纲 into volume + chapter outlines. Do not redesign the globa
 - Must run inside a project containing `.webnovel/state.json`.
 - If missing, ask for the project path and `cd` into it.
 
+## References(按步骤导航)
+
+- Step 3(必读,节拍表模板):[大纲-卷节拍表.md](../../templates/output/大纲-卷节拍表.md)
+- Step 4(必读,题材配置):[genre-profiles.md](../../references/genre-profiles.md)
+- Step 4(必读,Strand 节奏):[strand-weave-pattern.md](../../references/shared/strand-weave-pattern.md)
+- Step 4(可选,爽点结构需要细化):[cool-points-guide.md](../../references/shared/cool-points-guide.md)
+- Step 5(可选,需要钩子/节奏细分):[reading-power-taxonomy.md](../../references/reading-power-taxonomy.md)
+- Step 4/5(可选,电竞/直播文/克苏鲁):[genre-volume-pacing.md](references/outlining/genre-volume-pacing.md)
+
 ## Reference Loading Levels (strict, lazy)
 
 Use progressive disclosure and load only what current step requires:
 - L0: No references before scope/volume is confirmed.
-- L1: Minimum set for current generation step.
-- L2: Conditional references only if constraints/genre details are needed.
-
-### L1 (step-gated minimum)
-- Before Step 3 (volume skeleton):
-  - `references/strand-weave-pattern.md`
-  - `.claude/references/genre-profiles.md`
-
-### L2 (conditional)
-- Before Step 3, load only if爽点结构需要细化:
-  - `references/cool-points-guide.md`
-- Before Step 4, load only if需要钩子/节奏细分:
-  - `.claude/references/reading-power-taxonomy.md`
-- Before Step 3/4, load only if题材为电竞/直播文/克苏鲁:
-  - `references/outlining/genre-volume-pacing.md`
+- L1: Before each step, load only the "必读" items in **References(按步骤导航)**.
+- L2: Load optional items only when the trigger condition applies.
 
 ## Workflow
 1. Load project data.
 2. Select volume and confirm scope.
-3. Generate volume skeleton.
-4. Generate chapter outlines in batches.
-5. Validate + save + update state.
+3. Generate volume beat sheet (节拍表).
+4. Generate volume skeleton.
+5. Generate chapter outlines in batches.
+6. Validate + save + update state.
 
 ## 1) Load project data
 ```bash
@@ -57,10 +54,45 @@ If 总纲.md lacks volume ranges / core conflict / climax, ask the user to fill
 - Confirm any special requirement (tone, POV emphasis, romance, etc.).
 If 总纲缺少卷名/章节范围/核心冲突/卷末高潮,先补问并更新总纲,再继续。
 
-## 3) Generate volume skeleton
+## 3) Generate volume beat sheet (节拍表)
+目标:先把本卷“承诺→危机递增→中段反转→最低谷→大兑现+新钩子”钉死,避免卷中段漂移。
+
+Load template:
+```bash
+cat "${CLAUDE_PLUGIN_ROOT}/templates/output/大纲-卷节拍表.md"
+```
+
+Must satisfy (hard requirements):
+- **中段反转(必填)**:不得留空;若无,写 `无(理由:...)`
+- **危机链**:至少 3 次递增(表格 1-3 行不得空)
+- **卷末新钩子**:必须能落到“最后一章的章末未闭合问题”
+
+Write output:
+```bash
+@'
+{beat_sheet_content}
+'@ | Set-Content -Encoding UTF8 "$PROJECT_ROOT/大纲/第{volume_id}卷-节拍表.md"
+```
+
+Completion criteria:
+- `大纲/第{volume_id}卷-节拍表.md` 存在且非空
+- Step 4/5 能直接引用 Catalyst / 中段反转 / 最低谷 / 大兑现 / 新钩子来锚定节奏
+
+## 4) Generate volume skeleton
 Load genre profile and apply standards:
 ```bash
-cat ".claude/references/genre-profiles.md"
+cat "${CLAUDE_PLUGIN_ROOT}/references/genre-profiles.md"
+cat "${CLAUDE_PLUGIN_ROOT}/references/shared/strand-weave-pattern.md"
+```
+
+Optional (only if爽点结构需要细化):
+```bash
+cat "${CLAUDE_PLUGIN_ROOT}/references/shared/cool-points-guide.md"
+```
+
+Load beat sheet (must exist):
+```bash
+cat "$PROJECT_ROOT/大纲/第{volume_id}卷-节拍表.md"
 ```
 
 Extract for current genre:
@@ -148,13 +180,18 @@ Use this template and fill from 总纲 + idea_bank:
 - 硬约束:贯穿全卷
 ```
 
-## 4) Generate chapter outlines (batched)
+## 5) Generate chapter outlines (batched)
 Batching rule:
 - ≤20 章:1 批
 - 21–40 章:2 批
 - 41–60 章:3 批
 - >60 章:4+ 批
 
+Optional (only if需要钩子/节奏细分):
+```bash
+cat "${CLAUDE_PLUGIN_ROOT}/references/reading-power-taxonomy.md"
+```
+
 ### Chapter generation strategy
 For each chapter, determine:
 
@@ -196,15 +233,21 @@ Chapter format (include 反派层级 for context-agent):
 ```markdown
 ### 第 {N} 章:{标题}
 - 目标: {20字以内}
+- 阻力: {20字以内}
+- 代价: {20字以内}
 - 爽点: {类型} - {30字以内}
 - Strand: {Quest|Fire|Constellation}
 - 反派层级: {无/小/中/大}
 - 视角/主角: {主角A/主角B/女主/群像}
 - 关键实体: {新增或重要出场}
+- 本章变化: {30字以内,优先可量化变化}
+- 章末未闭合问题: {30字以内}
 - 钩子: {类型} - {30字以内}
 ```
 
 **字段说明**:
+- **章末未闭合问题**:本章结尾必须保留的“未闭合决策/问题”,用于驱动读者点下一章。
+  - 规则:必须与 **钩子** 的类型/强度一致;不得出现“钩子很强但问题很虚”的错配。
 - **钩子**:本章应设置的章末钩子(规划用)
   - 例:悬念钩 - 神秘人身份即将揭晓
   - 意思是:本章结尾要设置这个悬念钩子
@@ -218,7 +261,7 @@ Save after each batch:
 '@ | Add-Content -Encoding UTF8 "$PROJECT_ROOT/大纲/第{volume_id}卷-详细大纲.md"
 ```
 
-## 5) Validate + save
+## 6) Validate + save
 ### Validation checks (must pass all)
 
 **1. 爽点密度检查**
@@ -248,11 +291,15 @@ If deviation > 15%, adjust chapter assignments.
 **5. 完整性检查**
 Every chapter must have:
 - 目标(20 字以内)
+- 阻力(20 字以内)
+- 代价(20 字以内)
 - 爽点(类型 + 30 字描述)
 - Strand(Quest/Fire/Constellation)
 - 反派层级(无/小/中/大)
 - 视角/主角
 - 关键实体(至少 1 个)
+- 本章变化(30 字以内)
+- 章末未闭合问题(30 字以内)
 - 钩子(类型 + 30 字描述)
 
 Update state (include chapters range):
@@ -264,13 +311,16 @@ python "${CLAUDE_PLUGIN_ROOT}/scripts/update_state.py" \
 ```
 
 Final check:
+- 节拍表文件已写入:`大纲/第{volume_id}卷-节拍表.md`
 - 章纲文件已写入:`大纲/第{volume_id}卷-详细大纲.md`
-- 每章包含:目标/爽点/Strand/反派层级/视角/关键实体/钩子
+- 每章包含:目标/阻力/代价/爽点/Strand/反派层级/视角/关键实体/本章变化/章末未闭合问题/钩子
 - 与总纲冲突/高潮一致,约束触发频率合理(如有 idea_bank)
 
 ### Hard fail conditions (must stop)
+- 节拍表文件不存在或为空
+- 节拍表中段反转缺失(未按“必填/无(理由)”规则填写)
 - 章纲文件不存在或为空
-- 任一章节缺少:目标/爽点/Strand/反派层级/视角/关键实体/钩子
+- 任一章节缺少:目标/阻力/代价/爽点/Strand/反派层级/视角/关键实体/本章变化/章末未闭合问题/钩子
 - 与总纲核心冲突或卷末高潮明显冲突
 - 约束触发频率不足(当 idea_bank 启用时)
 

+ 4 - 305
.claude/skills/webnovel-plan/references/cool-points-guide.md

@@ -3,310 +3,9 @@ name: cool-points-guide
 purpose: 爽点设计参考,规划大纲时和写作时按需加载
 ---
 
-<context>
-此文件用于爽点(cool-points)设计。Claude 已知基本叙事技巧,这里只补充网文特定的爽点工程方法论。
-</context>
+<!-- DEPRECATED: use .claude/references/shared/cool-points-guide.md -->
 
-<instructions>
+本文件已弃用,避免多份参考源导致漂移。
 
-## 一、六种爽点执行模式
-
-### 1. 装逼打脸
-```
-对方轻视 → 主角展示实力 → 对方震惊/后悔
-```
-**适用**:都市、玄幻、职场
-
-### 2. 扮猪吃虎
-```
-表面弱小 → 关键时刻爆发 → 众人惊艳
-```
-**适用**:重生、隐藏身份、低调流
-
-### 3. 越级反杀
-```
-实力差距明显 → 主角逆袭 → 敌人不可置信
-```
-**适用**:玄幻、武侠、竞技
-
-### 4. 打脸权威
-```
-权威质疑 → 主角用实力证明 → 权威认可/尴尬
-```
-**适用**:职场、学院、技术流
-
-### 5. 反派翻车
-```
-反派得意 → 计划破产 → 反派狼狈
-```
-**适用**:所有题材
-
-### 6. 甜蜜超预期
-```
-平淡日常 → 意外惊喜 → 情感升温
-```
-**适用**:言情、甜宠
-
----
-
-## 二、爽点三段式结构 (30/40/30公式)
-
-### 铺垫阶段 (Setup, 30%篇幅)
-- **建立预期**:读者应该期待什么
-- **制造反差**:当前状态 vs 即将展现的状态
-- **信息差设置**:读者知道什么?角色知道什么?
-
-### 兑现阶段 (Delivery, 40%篇幅)
-- **触发时机**:什么事件触发爽点
-- **展现方式**:用对话/动作/结果展现
-- **情绪高峰**:爽点的最高潮瞬间
-
-### 微反转阶段 (Twist, 30%篇幅)
-- **假结束**:读者以为爽点结束了
-- **还有一手**:其实还有更厉害的
-- **余韵**:微反转后的状态与暗示
-
----
-
-## 三、压扬比例控制
-
-### 压扬比例标准
-| 题材类型 | 压扬比例 | 说明 |
-|---------|---------|------|
-| 传统爽文 | 压3扬7 | 轻度压迫,快速释放 |
-| 硬核正剧 | 压5扬5 | 平衡叙事 |
-| 虐恋/黑深残 | 压7扬3 | 长期压抑,爆发更爽 |
-
-### 压扬节奏控制
-```
-慢铺垫(压) → 快爆发(扬) → 停顿 → 再加速
-```
-
-### 句式节奏
-- **短句**:快节奏,动作密集
-- **长句**:慢节奏,细节描写
-- **交替**:制造节奏变化
-
----
-
-## 四、爽点密度标准
-
-| 周期 | 要求 |
-|------|------|
-| 每章 | ≥1 个小爽点(单一模式) |
-| 每 5 章 | ≥1 个组合爽点(2种模式叠加) |
-| 每 10-15 章 | ≥1 个里程碑爽点(改变主角地位) |
-
-### 爽点强度分级
-| 级别 | 说明 | 频率 |
-|------|------|------|
-| 小爽点 | 单一模式,日常打脸,规模不大 | 每章1-2个 |
-| 组合爽点 | 2种以上模式叠加,重要转折 | 每5章1个 |
-| 里程碑爽点 | 改变主角地位的阶段性胜利 | 每10-15章1个 |
-
----
-
-## 五、信息差设计
-
-### 信息差层级
-| 层级 | 说明 |
-|------|------|
-| 读者已知 | 读者通过前文已经知道的信息 |
-| 角色已知 | 场景中的角色知道的信息 |
-| 信息差核心 | 读者知道但角色不知道的关键信息 |
-| 反转信息 | 微反转时揭示的新信息 |
-
-### 信息差运用
-```
-读者知道主角是隐藏大佬 + 角色不知道 = 期待感
-角色嘲讽主角 + 读者知道主角实力 = 爽感积累
-主角展示实力 + 角色震惊 = 爽感释放
-```
-
----
-
-## 六、打脸四步法(核心套路)
-
-**Step 1 铺垫**: 提前1-2章建立信息差(读者知道主角底牌,反派不知道)
-
-**Step 2 挑衅**: 至少3次嘲讽 + 对照组(反派被追捧 vs 主角被贬低)
-
-**Step 3 拉扯**: 2-3轮交锋,主角示弱 → 反派得意 → 期待拉满
-
-**Step 4 爆发**: 物理碾压 + 精神打击 + 围观群众反应 + 实质收获
-
----
-
-## 七、微反转类型
-
-### 还有更强
-展示了一手,其实还有更厉害的
-```
-"你以为这就是我的全力?"
-```
-
-### 意外收获
-本来只想完成目标,结果还有意外好处
-```
-打败对手 → 获得宝物 → 宝物比预期更珍贵
-```
-
-### 对方更惨
-对方以为只是小失败,其实是大翻车
-```
-输了比赛 → 赌注曝光 → 身败名裂
-```
-
-### 情感升温
-本以为只是甜,其实更甜
-```
-以为只是普通礼物 → 发现是精心准备 → 感动落泪
-```
-
-### 真相揭示
-表面是A,其实是B,而且B更厉害
-```
-以为是普通玉佩 → 其实是上古神器 → 还认主了
-```
-
----
-
-## 八、爽点升级路径
-
-### 维度1: 规模升级
-```
-打脸小流氓 → 打脸世家少爷 → 打脸宗门长老 → 覆灭一个帝国
-```
-
-### 维度2: 方式升级
-```
-暴力碾压 → 智谋碾压 → 规则掌控 → 因果抹杀
-```
-
-### 维度3: 受众升级
-```
-让邻居震惊 → 让全城震惊 → 让全国震惊 → 让诸天神魔战栗
-```
-
----
-
-## 九、题材适配
-
-### 都市爽文
-- 注重装逼打脸
-- 用财力/人脉/身份反转
-- 社会地位碾压
-
-### 玄幻升级
-- 注重战力反转
-- 用实力碾压/等级差距打破
-- 越级战斗
-
-### 悬疑本格
-- 注重真相反转
-- 用证据/推理打脸
-- 智商碾压
-
-### 甜宠言情
-- 注重情感惊喜
-- 用意外浪漫/深情告白
-- 甜度超标
-
----
-
-## 十、AI执行指令
-
-创作时必须遵守:
-
-1. **设计反转时**: 明确**信息差核心**(谁知道什么,谁不知道什么)
-2. **审核爽感时**: 爽感不足检查**铺垫篇幅(30%)**是否太少导致势能不足
-3. **节奏检查时**: 确保符合 30/40/30 公式分配
-
----
-
-## 十一、伏笔三层级
-
-| 层级 | 回收周期 | 示例 |
-|------|----------|------|
-| 核心 | 50-300章 | 主角身世/终极敌人/金手指来历 |
-| 支线 | 30-100章 | 配角动机/神秘物品/师门秘密 |
-| 装饰 | 10-30章 | 场景细节/小习惯/路人提及 |
-
-</instructions>
-
-<examples>
-
-<example>
-<input>设计一个打脸爽点:主角在宗门大比被嘲笑</input>
-<output>
-**铺垫**(第45章): 主角已筑基但隐藏修为,王少以为主角只有练气七层
-**挑衅**: 王少当众嘲讽"废物也来参加?",长老们追捧王少
-**拉扯**: 第1轮主角用三成力被轻视,第2轮继续示弱,王少大笑"不过如此"
-**爆发**: 主角爆发筑基威压,一拳击飞王少,全场震惊"十八岁筑基天才!"
-**收获**: 晋升内门 + 5000灵石 + 女主好感度+20
-
-**压扬比例**: 压3扬7(铺垫2章+挑衅拉扯30% / 爆发+收获70%)
-</output>
-</example>
-
-<example>
-<input>设计越级反杀爽点:主角突破境界</input>
-<output>
-**困境**: 被追杀至悬崖,走投无路
-**机缘**: 发现隐藏洞府,获得天材地宝
-**突破**: 服用后突破至筑基期
-**展示**: 回头一掌拍飞追兵,"你们...还追吗?"
-
-**30/40/30分配**:
-- 30%: 被追杀过程,生死危机(压)
-- 40%: 发现洞府、突破过程(扬)
-- 30%: 反杀追兵、展示威风(爆)
-</output>
-</example>
-
-<example>
-<input>节奏脉冲示例</input>
-<output>
-【慢铺垫】
-"你?"王浩嗤笑一声,上下打量着萧炎,眼中满是不屑,"就凭你一个废物,也配站在这里?"
-
-【快爆发】
-萧炎动了。
-一步。
-王浩的笑容僵住。
-两步。
-他的瞳孔骤缩。
-三步。
-"砰!"
-
-【停顿】
-全场寂静。
-没有人说话。
-甚至没有人敢呼吸。
-
-【再加速】
-"还有谁?"萧炎淡淡开口,目光扫过全场。
-</output>
-</example>
-
-<example type="edge_case">
-<input>连续3章都是打脸,如何调整?</input>
-<output>
-❌ 继续打脸 → 审美疲劳
-✅ 第4章改为越级反杀或打脸权威
-✅ 或穿插 Fire Strand(感情线)调节节奏
-</output>
-</example>
-
-</examples>
-
-<errors>
-❌ 无铺垫的突然反转 → ✅ 提前1-2章埋信息差
-❌ 一招秒杀 → ✅ 至少2-3轮拉扯
-❌ 降智反派 → ✅ 基于已知信息的合理轻视
-❌ 打完无收获 → ✅ 必须有战利品/认可/资格
-❌ 缺少围观群众 → ✅ 侧面烘托震惊效果
-❌ 铺垫篇幅不足(<30%) → ✅ 势能不足,爽感打折
-❌ 压扬比例失衡 → ✅ 根据题材调整比例
-❌ 未标注信息差 → ✅ 明确读者和角色的认知差异
-</errors>
+请改用 shared 单一事实源:
+- `.claude/references/shared/cool-points-guide.md`

+ 4 - 99
.claude/skills/webnovel-plan/references/strand-weave-pattern.md

@@ -3,104 +3,9 @@ name: strand-weave-pattern
 purpose: 章节规划时检查三线平衡,避免节奏单调
 ---
 
-<context>
-此文件用于情节线平衡控制。Claude 已知多线叙事技巧,这里只补充网文特定的三线交织机制和 state.json 中的追踪器结构。
-</context>
+<!-- DEPRECATED: use .claude/references/shared/strand-weave-pattern.md -->
 
-<instructions>
+本文件已弃用,避免多份参考源导致漂移。
 
-## 三条线定义与占比
-
-| 线条 | 占比 | 定义 | 典型剧情 |
-|------|------|------|----------|
-| **Quest(主线)** | 55-65% | 核心任务、升级、战斗、夺宝 | 宗门大比、秘境、突破境界、复仇打脸 |
-| **Fire(感情线)** | 20-30% | 情感关系发展(爱情/友情/师徒) | 相识暧昧、英雄救美、确认关系 |
-| **Constellation(世界观线)** | 10-20% | 扩展设定、展示新势力/地点、势力关系、社交网络 | 揭示隐藏势力、介绍新大陆、主角身世 |
-
-## 交织规则(低自由度 - 必须执行)
-
-| 规则 | 警告条件 | 建议操作 |
-|------|----------|----------|
-| Quest 不连续超过 5 章 | chapters_since_switch >= 5 | 切换到 Fire 或 Constellation |
-| Fire 不超过 10 章不出现 | current - last_fire > 10 | 安排感情戏(小甜蜜/吃醋) |
-| Constellation 不超过 15 章不出现 | current - last_constellation > 15 | 展示新设定/势力/伏笔 |
-
-## state.json 中的 strand_tracker 结构
-
-```json
-{
-  "strand_tracker": {
-    "last_quest_chapter": 45,
-    "last_fire_chapter": 43,
-    "last_constellation_chapter": 40,
-    "current_dominant": "quest",
-    "chapters_since_switch": 3,
-    "history": [{"chapter": 46, "strand": "quest"}, ...]
-  }
-}
-```
-
-## 前 30 章织网模板
-
-```
-第 1-5 章:   Quest ×5(开局快速推进主线)
-第 6 章:     Fire(首次与女主相遇)
-第 7-10 章:  Quest ×4(宗门大比)
-第 11 章:    Fire(英雄救美)
-第 12-14 章: Quest ×3(秘境夺宝)
-第 15 章:    Constellation(揭示"圣地"存在)
-第 16-19 章: Quest ×4(击败强敌)
-第 20 章:    Fire(确认关系)
-第 21-24 章: Quest ×4(突破境界)
-第 25 章:    Constellation(发现主角身世线索)
-第 26-30 章: Quest ×5(卷末高潮)
-```
-
-</instructions>
-
-<examples>
-
-<example>
-<input>当前第 46 章,last_quest=45, last_fire=43, last_constellation=40, current_dominant="quest", chapters_since_switch=3</input>
-<output>
-**警告判断**:
-- Quest 连续 3 章 < 5 章 → 暂无警告
-- 距离 Fire 3 章 < 10 章 → 暂无警告
-- 距离 Constellation 6 章 < 15 章 → 暂无警告
-
-**本章建议**: 可继续 Quest,但建议下 1-2 章内安排 Fire 调节节奏
-</output>
-</example>
-
-<example>
-<input>当前第 55 章,last_fire=42,连续 13 章无感情线</input>
-<output>
-⚠️ **警告**: 距离上次感情线 > 10 章!
-
-**建议**: 本章安排 Fire 线
-- 选项 A: 女主出场,小甜蜜互动
-- 选项 B: 英雄救美场景
-- 选项 C: 吃醋/误会小剧情
-</output>
-</example>
-
-<example type="edge_case">
-<input>开局前 10 章需要快速建立主线,感情线可以少一点吗?</input>
-<output>
-✅ 可以。前 10 章占比可调整为:
-- Quest: 70-80%
-- Fire: 10-15%
-- Constellation: 5-10%
-
-但第 6-8 章必须安排至少 1 次 Fire(首次相遇/印象建立)
-</output>
-</example>
-
-</examples>
-
-<errors>
-❌ 连续 10 章纯 Quest → ✅ 最多 5 章后切换
-❌ 感情线超过 10 章不出现 → ✅ 每 5-10 章安排一次
-❌ 世界观线超过 15 章不出现 → ✅ 每 10-15 章展示新设定
-❌ 切换 Strand 后忘记更新 strand_tracker → ✅ 每章结束后自动更新
-</errors>
+请改用 shared 单一事实源:
+- `.claude/references/shared/strand-weave-pattern.md`

+ 5 - 5
.claude/skills/webnovel-query/SKILL.md

@@ -36,12 +36,12 @@ Copy and track progress:
 - L2: 仅按查询类型加载对应专题参考。
 
 ### L1 (minimum)
-- `references/system-data-flow.md`
+- [system-data-flow.md](references/system-data-flow.md)
 
 ### L2 (conditional by query type)
-- 伏笔查询:`references/advanced/foreshadowing.md`
-- 节奏查询:`../webnovel-plan/references/strand-weave-pattern.md`
-- 标签格式查询:`references/tag-specification.md`
+- 伏笔查询:[foreshadowing.md](references/advanced/foreshadowing.md)
+- 节奏查询:[strand-weave-pattern.md](../../references/shared/strand-weave-pattern.md)
+- 标签格式查询:[tag-specification.md](references/tag-specification.md)
 
 Do not load two or more L2 files unless the user request clearly spans multiple query types.
 
@@ -70,7 +70,7 @@ cat "${CLAUDE_PLUGIN_ROOT}/skills/webnovel-query/references/advanced/foreshadowi
 
 **节奏查询额外执行**:
 ```bash
-cat "${CLAUDE_PLUGIN_ROOT}/skills/webnovel-plan/references/strand-weave-pattern.md"
+cat "${CLAUDE_PLUGIN_ROOT}/references/shared/strand-weave-pattern.md"
 ```
 
 **标签格式查询额外执行**:

+ 2 - 2
.claude/skills/webnovel-resume/SKILL.md

@@ -36,10 +36,10 @@ Copy and track progress:
 - L2: 仅在数据一致性检查时加载数据规范。
 
 ### L1 (minimum)
-- `references/workflow-resume.md`
+- [workflow-resume.md](references/workflow-resume.md)
 
 ### L2 (conditional)
-- `references/system-data-flow.md`(仅在需要核对状态字段/恢复策略时)
+- [system-data-flow.md](references/system-data-flow.md)(仅在需要核对状态字段/恢复策略时)
 
 ## Step 1: 加载恢复协议(必须执行)
 

+ 59 - 19
.claude/skills/webnovel-review/SKILL.md

@@ -12,6 +12,31 @@ allowed-tools: Read Grep Write Edit Bash Task AskUserQuestion
 - 若当前目录不存在该文件,先询问用户项目路径并 `cd` 进入
 - 进入后设置变量:`$PROJECT_ROOT = (Resolve-Path ".").Path`
 
+## 0.5 工作流断点(best-effort,不得阻断主流程)
+
+> 目标:让 `/webnovel-resume` 能基于真实断点恢复。即使 workflow_manager 出错,也**只记录警告**,审查继续。
+
+推荐(bash):
+```bash
+python "${CLAUDE_PLUGIN_ROOT}/scripts/workflow_manager.py" start-task --command webnovel-review --chapter {end} || true
+```
+
+Step 映射(必须与 `workflow_manager.py get_pending_steps("webnovel-review")` 对齐):
+- Step 1:加载参考
+- Step 2:加载项目状态
+- Step 3:并行调用检查员
+- Step 4:生成审查报告
+- Step 5:保存审查指标到 index.db
+- Step 6:写回审查记录到 state.json
+- Step 7:处理关键问题(AskUserQuestion)
+- Step 8:收尾(完成任务)
+
+Step 记录模板(bash,失败不阻断):
+```bash
+python "${CLAUDE_PLUGIN_ROOT}/scripts/workflow_manager.py" start-step --step-id "Step 1" --step-name "加载参考" || true
+python "${CLAUDE_PLUGIN_ROOT}/scripts/workflow_manager.py" complete-step --step-id "Step 1" --artifacts '{"ok":true}' || true
+```
+
 ## Review depth
 
 - **Core (default)**: consistency / continuity / ooc / reader-pull
@@ -19,32 +44,29 @@ allowed-tools: Read Grep Write Edit Bash Task AskUserQuestion
 
 ## Step 1: 加载参考(按需)
 
-## Reference Loading Levels (strict, lazy)
+## References(按步骤导航)
 
-- L0: 先确定审查深度(Core / Full),再加载参考。
-- L1: 每次只加载当前深度的最小文件。
-- L2: 仅在问题定位需要时加载扩展参考。
+- Step 1(必读,硬约束):[core-constraints.md](../../references/shared/core-constraints.md)
+- Step 1(可选,Full 或节奏/爽点相关问题):[cool-points-guide.md](../../references/shared/cool-points-guide.md)
+- Step 1(可选,Full 或节奏/爽点相关问题):[strand-weave-pattern.md](../../references/shared/strand-weave-pattern.md)
+- Step 1(可选,仅在返工建议需要时):[common-mistakes.md](references/common-mistakes.md)
+- Step 1(可选,仅在返工建议需要时):[pacing-control.md](references/pacing-control.md)
 
-### L1 (minimum)
-- Core 必读:`references/core-constraints.md`
+## Reference Loading Levels (strict, lazy)
 
-### L2 (conditional)
-- Full 或节奏/爽点相关问题时加载:
-  - `references/cool-points-guide.md`
-  - `references/strand-weave-pattern.md`
-- 仅在返工建议需要时加载:
-  - `references/common-mistakes.md`
-  - `references/pacing-control.md`
+- L0: 先确定审查深度(Core / Full),再加载参考。
+- L1: 只加载 References 区的“必读”条目。
+- L2: 仅在问题定位需要时加载 References 区的“可选”条目。
 
 **必读**:
 ```bash
-cat "${CLAUDE_PLUGIN_ROOT}/skills/webnovel-review/references/core-constraints.md"
+cat "${CLAUDE_PLUGIN_ROOT}/references/shared/core-constraints.md"
 ```
 
 **建议(Full 或需要时)**:
 ```bash
-cat "${CLAUDE_PLUGIN_ROOT}/skills/webnovel-review/references/cool-points-guide.md"
-cat "${CLAUDE_PLUGIN_ROOT}/skills/webnovel-review/references/strand-weave-pattern.md"
+cat "${CLAUDE_PLUGIN_ROOT}/references/shared/cool-points-guide.md"
+cat "${CLAUDE_PLUGIN_ROOT}/references/shared/strand-weave-pattern.md"
 ```
 
 **可选**:
@@ -117,13 +139,31 @@ cat "$PROJECT_ROOT/.webnovel/state.json"
 }
 ```
 
-保存审查指标:
+注意:此处只生成审查指标 JSON;落库见 Step 5。
+
+## Step 5: 保存审查指标到 index.db(必做)
+
 ```bash
-python -m data_modules.index_manager save-review-metrics --data '{...}' --project-root "."
+python -m data_modules.index_manager save-review-metrics --data '{...}' --project-root "${PROJECT_ROOT}"
 ```
 
-## Step 5: 处理关键问题
+## Step 6: 写回审查记录到 state.json(必做)
+
+将审查报告记录写回 `state.json.review_checkpoints`,用于后续追踪与回溯(依赖 `update_state.py --add-review`):
+```bash
+python "${CLAUDE_PLUGIN_ROOT}/scripts/update_state.py" --project-root "$PROJECT_ROOT" --add-review "{start}-{end}" "审查报告/第{start}-{end}章审查报告.md"
+```
+
+## Step 7: 处理关键问题
 
 如发现 critical 问题,询问用户:
 - A) 立即修复(推荐)
 - B) 仅保存报告,稍后处理
+
+## Step 8: 收尾(完成任务)
+
+```bash
+python "${CLAUDE_PLUGIN_ROOT}/scripts/workflow_manager.py" start-step --step-id "Step 8" --step-name "收尾" || true
+python "${CLAUDE_PLUGIN_ROOT}/scripts/workflow_manager.py" complete-step --step-id "Step 8" --artifacts '{"ok":true}' || true
+python "${CLAUDE_PLUGIN_ROOT}/scripts/workflow_manager.py" complete-task --artifacts '{"ok":true}' || true
+```

+ 4 - 305
.claude/skills/webnovel-review/references/cool-points-guide.md

@@ -3,310 +3,9 @@ name: cool-points-guide
 purpose: 爽点设计参考,规划大纲时和写作时按需加载
 ---
 
-<context>
-此文件用于爽点(cool-points)设计。Claude 已知基本叙事技巧,这里只补充网文特定的爽点工程方法论。
-</context>
+<!-- DEPRECATED: use .claude/references/shared/cool-points-guide.md -->
 
-<instructions>
+本文件已弃用,避免多份参考源导致漂移。
 
-## 一、六种爽点执行模式
-
-### 1. 装逼打脸
-```
-对方轻视 → 主角展示实力 → 对方震惊/后悔
-```
-**适用**:都市、玄幻、职场
-
-### 2. 扮猪吃虎
-```
-表面弱小 → 关键时刻爆发 → 众人惊艳
-```
-**适用**:重生、隐藏身份、低调流
-
-### 3. 越级反杀
-```
-实力差距明显 → 主角逆袭 → 敌人不可置信
-```
-**适用**:玄幻、武侠、竞技
-
-### 4. 打脸权威
-```
-权威质疑 → 主角用实力证明 → 权威认可/尴尬
-```
-**适用**:职场、学院、技术流
-
-### 5. 反派翻车
-```
-反派得意 → 计划破产 → 反派狼狈
-```
-**适用**:所有题材
-
-### 6. 甜蜜超预期
-```
-平淡日常 → 意外惊喜 → 情感升温
-```
-**适用**:言情、甜宠
-
----
-
-## 二、爽点三段式结构 (30/40/30公式)
-
-### 铺垫阶段 (Setup, 30%篇幅)
-- **建立预期**:读者应该期待什么
-- **制造反差**:当前状态 vs 即将展现的状态
-- **信息差设置**:读者知道什么?角色知道什么?
-
-### 兑现阶段 (Delivery, 40%篇幅)
-- **触发时机**:什么事件触发爽点
-- **展现方式**:用对话/动作/结果展现
-- **情绪高峰**:爽点的最高潮瞬间
-
-### 微反转阶段 (Twist, 30%篇幅)
-- **假结束**:读者以为爽点结束了
-- **还有一手**:其实还有更厉害的
-- **余韵**:微反转后的状态与暗示
-
----
-
-## 三、压扬比例控制
-
-### 压扬比例标准
-| 题材类型 | 压扬比例 | 说明 |
-|---------|---------|------|
-| 传统爽文 | 压3扬7 | 轻度压迫,快速释放 |
-| 硬核正剧 | 压5扬5 | 平衡叙事 |
-| 虐恋/黑深残 | 压7扬3 | 长期压抑,爆发更爽 |
-
-### 压扬节奏控制
-```
-慢铺垫(压) → 快爆发(扬) → 停顿 → 再加速
-```
-
-### 句式节奏
-- **短句**:快节奏,动作密集
-- **长句**:慢节奏,细节描写
-- **交替**:制造节奏变化
-
----
-
-## 四、爽点密度标准
-
-| 周期 | 要求 |
-|------|------|
-| 每章 | ≥1 个小爽点(单一模式) |
-| 每 5 章 | ≥1 个组合爽点(2种模式叠加) |
-| 每 10-15 章 | ≥1 个里程碑爽点(改变主角地位) |
-
-### 爽点强度分级
-| 级别 | 说明 | 频率 |
-|------|------|------|
-| 小爽点 | 单一模式,日常打脸,规模不大 | 每章1-2个 |
-| 组合爽点 | 2种以上模式叠加,重要转折 | 每5章1个 |
-| 里程碑爽点 | 改变主角地位的阶段性胜利 | 每10-15章1个 |
-
----
-
-## 五、信息差设计
-
-### 信息差层级
-| 层级 | 说明 |
-|------|------|
-| 读者已知 | 读者通过前文已经知道的信息 |
-| 角色已知 | 场景中的角色知道的信息 |
-| 信息差核心 | 读者知道但角色不知道的关键信息 |
-| 反转信息 | 微反转时揭示的新信息 |
-
-### 信息差运用
-```
-读者知道主角是隐藏大佬 + 角色不知道 = 期待感
-角色嘲讽主角 + 读者知道主角实力 = 爽感积累
-主角展示实力 + 角色震惊 = 爽感释放
-```
-
----
-
-## 六、打脸四步法(核心套路)
-
-**Step 1 铺垫**: 提前1-2章建立信息差(读者知道主角底牌,反派不知道)
-
-**Step 2 挑衅**: 至少3次嘲讽 + 对照组(反派被追捧 vs 主角被贬低)
-
-**Step 3 拉扯**: 2-3轮交锋,主角示弱 → 反派得意 → 期待拉满
-
-**Step 4 爆发**: 物理碾压 + 精神打击 + 围观群众反应 + 实质收获
-
----
-
-## 七、微反转类型
-
-### 还有更强
-展示了一手,其实还有更厉害的
-```
-"你以为这就是我的全力?"
-```
-
-### 意外收获
-本来只想完成目标,结果还有意外好处
-```
-打败对手 → 获得宝物 → 宝物比预期更珍贵
-```
-
-### 对方更惨
-对方以为只是小失败,其实是大翻车
-```
-输了比赛 → 赌注曝光 → 身败名裂
-```
-
-### 情感升温
-本以为只是甜,其实更甜
-```
-以为只是普通礼物 → 发现是精心准备 → 感动落泪
-```
-
-### 真相揭示
-表面是A,其实是B,而且B更厉害
-```
-以为是普通玉佩 → 其实是上古神器 → 还认主了
-```
-
----
-
-## 八、爽点升级路径
-
-### 维度1: 规模升级
-```
-打脸小流氓 → 打脸世家少爷 → 打脸宗门长老 → 覆灭一个帝国
-```
-
-### 维度2: 方式升级
-```
-暴力碾压 → 智谋碾压 → 规则掌控 → 因果抹杀
-```
-
-### 维度3: 受众升级
-```
-让邻居震惊 → 让全城震惊 → 让全国震惊 → 让诸天神魔战栗
-```
-
----
-
-## 九、题材适配
-
-### 都市爽文
-- 注重装逼打脸
-- 用财力/人脉/身份反转
-- 社会地位碾压
-
-### 玄幻升级
-- 注重战力反转
-- 用实力碾压/等级差距打破
-- 越级战斗
-
-### 悬疑本格
-- 注重真相反转
-- 用证据/推理打脸
-- 智商碾压
-
-### 甜宠言情
-- 注重情感惊喜
-- 用意外浪漫/深情告白
-- 甜度超标
-
----
-
-## 十、AI执行指令
-
-创作时必须遵守:
-
-1. **设计反转时**: 明确**信息差核心**(谁知道什么,谁不知道什么)
-2. **审核爽感时**: 爽感不足检查**铺垫篇幅(30%)**是否太少导致势能不足
-3. **节奏检查时**: 确保符合 30/40/30 公式分配
-
----
-
-## 十一、伏笔三层级
-
-| 层级 | 回收周期 | 示例 |
-|------|----------|------|
-| 核心 | 50-300章 | 主角身世/终极敌人/金手指来历 |
-| 支线 | 30-100章 | 配角动机/神秘物品/师门秘密 |
-| 装饰 | 10-30章 | 场景细节/小习惯/路人提及 |
-
-</instructions>
-
-<examples>
-
-<example>
-<input>设计一个打脸爽点:主角在宗门大比被嘲笑</input>
-<output>
-**铺垫**(第45章): 主角已筑基但隐藏修为,王少以为主角只有练气七层
-**挑衅**: 王少当众嘲讽"废物也来参加?",长老们追捧王少
-**拉扯**: 第1轮主角用三成力被轻视,第2轮继续示弱,王少大笑"不过如此"
-**爆发**: 主角爆发筑基威压,一拳击飞王少,全场震惊"十八岁筑基天才!"
-**收获**: 晋升内门 + 5000灵石 + 女主好感度+20
-
-**压扬比例**: 压3扬7(铺垫2章+挑衅拉扯30% / 爆发+收获70%)
-</output>
-</example>
-
-<example>
-<input>设计越级反杀爽点:主角突破境界</input>
-<output>
-**困境**: 被追杀至悬崖,走投无路
-**机缘**: 发现隐藏洞府,获得天材地宝
-**突破**: 服用后突破至筑基期
-**展示**: 回头一掌拍飞追兵,"你们...还追吗?"
-
-**30/40/30分配**:
-- 30%: 被追杀过程,生死危机(压)
-- 40%: 发现洞府、突破过程(扬)
-- 30%: 反杀追兵、展示威风(爆)
-</output>
-</example>
-
-<example>
-<input>节奏脉冲示例</input>
-<output>
-【慢铺垫】
-"你?"王浩嗤笑一声,上下打量着萧炎,眼中满是不屑,"就凭你一个废物,也配站在这里?"
-
-【快爆发】
-萧炎动了。
-一步。
-王浩的笑容僵住。
-两步。
-他的瞳孔骤缩。
-三步。
-"砰!"
-
-【停顿】
-全场寂静。
-没有人说话。
-甚至没有人敢呼吸。
-
-【再加速】
-"还有谁?"萧炎淡淡开口,目光扫过全场。
-</output>
-</example>
-
-<example type="edge_case">
-<input>连续3章都是打脸,如何调整?</input>
-<output>
-❌ 继续打脸 → 审美疲劳
-✅ 第4章改为越级反杀或打脸权威
-✅ 或穿插 Fire Strand(感情线)调节节奏
-</output>
-</example>
-
-</examples>
-
-<errors>
-❌ 无铺垫的突然反转 → ✅ 提前1-2章埋信息差
-❌ 一招秒杀 → ✅ 至少2-3轮拉扯
-❌ 降智反派 → ✅ 基于已知信息的合理轻视
-❌ 打完无收获 → ✅ 必须有战利品/认可/资格
-❌ 缺少围观群众 → ✅ 侧面烘托震惊效果
-❌ 铺垫篇幅不足(<30%) → ✅ 势能不足,爽感打折
-❌ 压扬比例失衡 → ✅ 根据题材调整比例
-❌ 未标注信息差 → ✅ 明确读者和角色的认知差异
-</errors>
+请改用 shared 单一事实源:
+- `.claude/references/shared/cool-points-guide.md`

+ 4 - 80
.claude/skills/webnovel-review/references/core-constraints.md

@@ -4,85 +4,9 @@ purpose: 每次章节写作前加载,确保三大定律执行
 version: "5.4"
 ---
 
-<context>
-此文件用于章节创作时的核心约束检查。Claude 已知一般写作规范,这里只补充网文特定的防幻觉协议。
-v5.4:版本号对齐,内容沿用 v5.2。
-</context>
+<!-- DEPRECATED: use .claude/references/shared/core-constraints.md -->
 
-<instructions>
+本文件已弃用,避免多份参考源导致漂移。
 
-## 三大定律(低自由度 - 必须精确执行)
-
-| 定律 | 规则 | 检查方式 |
-|------|------|----------|
-| **大纲即法律** | 严格执行大纲,不得擅自发挥 | 审查时对照大纲 |
-| **设定即物理** | 实力/招式/物品 ≤ index.db 记录 | 写作前查询确认 |
-| **发明需识别** | 新实体由 Data Agent 自动提取 | 章节完成后处理 |
-
-## 新实体处理流程(v5.2 引入,v5.4 沿用)
-
-v5.2 引入的规则,v5.4 沿用:正文不再要求 XML 标签:
-1. **写作时**: 直接写纯正文,新角色/地点/物品正常描写
-2. **完成后**: Data Agent 自动识别新实体并写入 index.db
-3. **不确定实体**: Data Agent 标记为 uncertain,由人工确认
-
-## 钩子硬约束(新增)
-
-- 开头 120 字必须出现冲突/风险/强情绪之一
-- 结尾 80-150 字设置未闭合问题/危险逼近/信息反转
-- 禁止结束在“回去休息了”或类似收尾
-
-## 网文口感基准(新增)
-
-- 禁止连续 400 字纯解释/背景
-- 每 800-1200 字至少一次局面变化
-- 对话每句必须带意图
-
-## 爽点密度要求
-
-- 每章 ≥1 个小爽点(单一模式)
-- 每 5 章 ≥1 个组合爽点(2种模式叠加)
-- 每 10-15 章 ≥1 个里程碑爽点(改变主角地位)
-- 避免连续 3 章同类型
-
-## Strand 平衡警告
-
-| 情节线 | 警告条件 |
-|--------|----------|
-| Quest(主线) | 连续 5+ 章 |
-| Fire(感情线) | >10 章未出现 |
-| Constellation(世界观) | >15 章未出现 |
-
-## 禁止事项
-
-- `[待补充]`、`[TODO]`、`...(省略)...` → 必须完整写出
-- 战斗后无善后描述(都市异能题材)
-
-</instructions>
-
-<examples>
-
-<example>
-<input>主角需要使用"天雷掌"击败敌人</input>
-<output>
-1. 查询 index.db 中是否有"天雷掌"技能
-2. 若有:直接使用
-3. 若无:在正文中描写获得途径,Data Agent 会自动提取
-</output>
-</example>
-
-<example type="edge_case">
-<input>剧情需要主角展示筑基期实力,但 index.db 显示练气期</input>
-<output>
-❌ 直接写筑基期战力 → 违反"设定即物理"
-✅ 先安排突破场景,Data Agent 更新 index.db,再展示新实力
-</output>
-</example>
-
-</examples>
-
-<errors>
-❌ 新实体描写模糊(无法自动识别) → ✅ 确保新实体有明确名称和描写
-❌ 主角突然会新技能 → ✅ 先描写获得途径
-❌ 章末无钩子 → ✅ 重写结尾,制造未闭合问题/危险/反转
-</errors>
+请改用 shared 单一事实源:
+- `.claude/references/shared/core-constraints.md`

+ 4 - 99
.claude/skills/webnovel-review/references/strand-weave-pattern.md

@@ -3,104 +3,9 @@ name: strand-weave-pattern
 purpose: 章节规划时检查三线平衡,避免节奏单调
 ---
 
-<context>
-此文件用于情节线平衡控制。Claude 已知多线叙事技巧,这里只补充网文特定的三线交织机制和 state.json 中的追踪器结构。
-</context>
+<!-- DEPRECATED: use .claude/references/shared/strand-weave-pattern.md -->
 
-<instructions>
+本文件已弃用,避免多份参考源导致漂移。
 
-## 三条线定义与占比
-
-| 线条 | 占比 | 定义 | 典型剧情 |
-|------|------|------|----------|
-| **Quest(主线)** | 55-65% | 核心任务、升级、战斗、夺宝 | 宗门大比、秘境、突破境界、复仇打脸 |
-| **Fire(感情线)** | 20-30% | 情感关系发展(爱情/友情/师徒) | 相识暧昧、英雄救美、确认关系 |
-| **Constellation(世界观线)** | 10-20% | 扩展设定、展示新势力/地点、势力关系、社交网络 | 揭示隐藏势力、介绍新大陆、主角身世 |
-
-## 交织规则(低自由度 - 必须执行)
-
-| 规则 | 警告条件 | 建议操作 |
-|------|----------|----------|
-| Quest 不连续超过 5 章 | chapters_since_switch >= 5 | 切换到 Fire 或 Constellation |
-| Fire 不超过 10 章不出现 | current - last_fire > 10 | 安排感情戏(小甜蜜/吃醋) |
-| Constellation 不超过 15 章不出现 | current - last_constellation > 15 | 展示新设定/势力/伏笔 |
-
-## state.json 中的 strand_tracker 结构
-
-```json
-{
-  "strand_tracker": {
-    "last_quest_chapter": 45,
-    "last_fire_chapter": 43,
-    "last_constellation_chapter": 40,
-    "current_dominant": "quest",
-    "chapters_since_switch": 3,
-    "history": [{"chapter": 46, "strand": "quest"}, ...]
-  }
-}
-```
-
-## 前 30 章织网模板
-
-```
-第 1-5 章:   Quest ×5(开局快速推进主线)
-第 6 章:     Fire(首次与女主相遇)
-第 7-10 章:  Quest ×4(宗门大比)
-第 11 章:    Fire(英雄救美)
-第 12-14 章: Quest ×3(秘境夺宝)
-第 15 章:    Constellation(揭示"圣地"存在)
-第 16-19 章: Quest ×4(击败强敌)
-第 20 章:    Fire(确认关系)
-第 21-24 章: Quest ×4(突破境界)
-第 25 章:    Constellation(发现主角身世线索)
-第 26-30 章: Quest ×5(卷末高潮)
-```
-
-</instructions>
-
-<examples>
-
-<example>
-<input>当前第 46 章,last_quest=45, last_fire=43, last_constellation=40, current_dominant="quest", chapters_since_switch=3</input>
-<output>
-**警告判断**:
-- Quest 连续 3 章 < 5 章 → 暂无警告
-- 距离 Fire 3 章 < 10 章 → 暂无警告
-- 距离 Constellation 6 章 < 15 章 → 暂无警告
-
-**本章建议**: 可继续 Quest,但建议下 1-2 章内安排 Fire 调节节奏
-</output>
-</example>
-
-<example>
-<input>当前第 55 章,last_fire=42,连续 13 章无感情线</input>
-<output>
-⚠️ **警告**: 距离上次感情线 > 10 章!
-
-**建议**: 本章安排 Fire 线
-- 选项 A: 女主出场,小甜蜜互动
-- 选项 B: 英雄救美场景
-- 选项 C: 吃醋/误会小剧情
-</output>
-</example>
-
-<example type="edge_case">
-<input>开局前 10 章需要快速建立主线,感情线可以少一点吗?</input>
-<output>
-✅ 可以。前 10 章占比可调整为:
-- Quest: 70-80%
-- Fire: 10-15%
-- Constellation: 5-10%
-
-但第 6-8 章必须安排至少 1 次 Fire(首次相遇/印象建立)
-</output>
-</example>
-
-</examples>
-
-<errors>
-❌ 连续 10 章纯 Quest → ✅ 最多 5 章后切换
-❌ 感情线超过 10 章不出现 → ✅ 每 5-10 章安排一次
-❌ 世界观线超过 15 章不出现 → ✅ 每 10-15 章展示新设定
-❌ 切换 Strand 后忘记更新 strand_tracker → ✅ 每章结束后自动更新
-</errors>
+请改用 shared 单一事实源:
+- `.claude/references/shared/strand-weave-pattern.md`

+ 52 - 25
.claude/skills/webnovel-write/SKILL.md

@@ -12,6 +12,25 @@ allowed-tools: Read Write Edit Grep Bash Task
 - 若当前目录不存在该文件,先询问用户项目路径并切换目录。
 - 进入后设置变量:`$PROJECT_ROOT = (Resolve-Path ".").Path`。
 
+## 0.5 工作流断点(best-effort,不得阻断主流程)
+
+> 目标:让 `/webnovel-resume` 能基于真实断点恢复。即使 workflow_manager 出错,也**只记录警告**,写作继续。
+
+推荐(bash):
+```bash
+# 启动任务(失败不阻断)
+python "${CLAUDE_PLUGIN_ROOT}/scripts/workflow_manager.py" start-task --command webnovel-write --chapter {chapter_num} || true
+
+# 每个 Step 开始/结束都记录(失败不阻断)
+python "${CLAUDE_PLUGIN_ROOT}/scripts/workflow_manager.py" start-step --step-id "Step 1" --step-name "Context Agent" || true
+python "${CLAUDE_PLUGIN_ROOT}/scripts/workflow_manager.py" complete-step --step-id "Step 1" --artifacts '{"ok":true}' || true
+
+# 全部结束后完成任务
+python "${CLAUDE_PLUGIN_ROOT}/scripts/workflow_manager.py" complete-task --artifacts '{"ok":true}' || true
+```
+
+注:`--step-id` 必须严格使用:`Step 1` / `Step 1.5` / `Step 2A` / `Step 2B` / `Step 3` / `Step 4` / `Step 5` / `Step 6`。
+
 ## 1. 模式定义
 
 | 模式 | 启用步骤 | 说明 |
@@ -20,27 +39,23 @@ allowed-tools: Read Write Edit Grep Bash Task
 | `/webnovel-write --fast` | Step 1 → 1.5 → 2A → 3 → 4 → 5 → 6 | 跳过 Step 2B |
 | `/webnovel-write --minimal` | Step 1 → 1.5 → 2A → 3(仅3个基础审查) → 4 → 5 → 6 | 跳过 Step 2B;不产出追读力数据 |
 
-## 2. 引用加载策略(严格按需)
-
-- L0:不提前加载参考。
-- L1:只加载当前步骤的最小必需文件。
-- L2:仅在触发条件满足时加载扩展参考。
+## References(按步骤导航)
 
-### L1 最小集合
+- Step 2A(必读,写作硬约束):[core-constraints.md](../../references/shared/core-constraints.md)
+- Step 4(必读,润色规则):[polish-guide.md](references/polish-guide.md)
+- Step 4(必读,排版规范):[typesetting.md](references/writing/typesetting.md)
+- Step 1.5(可选,题材/风格/钩子细化):[style-variants.md](references/style-variants.md)
+- Step 1.5(可选,题材/风格/钩子细化):[reading-power-taxonomy.md](../../references/reading-power-taxonomy.md)
+- Step 1.5(可选,题材/风格/钩子细化):[genre-profiles.md](../../references/genre-profiles.md)
+- Step 1.5(可选,电竞/直播文/克苏鲁钩子库):[genre-hook-payoff-library.md](references/writing/genre-hook-payoff-library.md)
+- Step 2B(可选,风格适配细则):[style-adapter.md](references/style-adapter.md)
+- Step 3(可选,审查指标 JSON 结构/流程细则):[workflow-details.md](references/workflow-details.md)
 
-- Step 2A 前:`references/core-constraints.md`
-- Step 4 前:`references/polish-guide.md`
-
-### L2 条件集合
+## 2. 引用加载策略(严格按需)
 
-- Step 1.5 需要题材/风格细化时:
-  - `references/style-variants.md`
-  - `.claude/references/reading-power-taxonomy.md`
-  - `.claude/references/genre-profiles.md`
-  - `references/writing/genre-hook-payoff-library.md`(电竞/直播文/克苏鲁优先)
-- 需要执行模板与细则时:
-  - `references/workflow-details.md`
-  - `references/writing/typesetting.md`
+- L0:不提前加载参考。
+- L1:执行某个 Step 前,只加载 References 区该 Step 的“必读”条目。
+- L2:仅在触发条件满足时加载 References 区该 Step 的“可选”条目。
 
 ## 3. 执行步骤
 
@@ -77,13 +92,17 @@ python "${CLAUDE_PLUGIN_ROOT}/scripts/extract_chapter_context.py" --chapter {cha
 - 开写前加载:
 
 ```bash
-cat "${CLAUDE_PLUGIN_ROOT}/skills/webnovel-write/references/core-constraints.md"
+cat "${CLAUDE_PLUGIN_ROOT}/references/shared/core-constraints.md"
 ```
 
 ### Step 2B:风格适配(`--fast` / `--minimal` 跳过)
 
 - 仅做风格转译,不改剧情事实。
-- 细则见:`references/workflow-details.md`、`references/style-adapter.md`。
+- 执行前加载(按需,若本章需要强网文化/去AI化处理则必读):
+
+```bash
+cat "${CLAUDE_PLUGIN_ROOT}/skills/webnovel-write/references/style-adapter.md"
+```
 
 ### Step 3:审查
 
@@ -91,6 +110,7 @@ cat "${CLAUDE_PLUGIN_ROOT}/skills/webnovel-write/references/core-constraints.md"
 
 - 必须使用 `Task` 工具调用各审查 subagent,禁止主流程直接内联“自审”替代。
 - 可并行发起审查 Task,全部返回后统一汇总 `issues/severity/overall_score`。
+- 审查汇总后必须将审查指标写入 `index.db.review_metrics`(包括 `--minimal` 模式)。
 
 默认核心 4 审查器:
 
@@ -106,6 +126,13 @@ cat "${CLAUDE_PLUGIN_ROOT}/skills/webnovel-write/references/core-constraints.md"
 
 `--minimal` 模式仅运行前三个基础审查器,不产出追读力数据。
 
+审查指标落库(必做):
+```bash
+python -m data_modules.index_manager save-review-metrics --data '{...}' --project-root "${PROJECT_ROOT}"
+```
+
+说明:`--minimal` 可只包含 3 维 `dimension_scores`(设定一致性/人物塑造/连贯性),但必须给出 `overall_score`。JSON 结构见 [workflow-details.md](references/workflow-details.md)。
+
 ### Step 4:润色
 
 ```bash
@@ -130,8 +157,8 @@ cat "${CLAUDE_PLUGIN_ROOT}/skills/webnovel-write/references/writing/typesetting.
 - state_file: .webnovel/state.json
 ```
 
-- `review_score` 优先使用 Step 3 的 `overall_score`;若最小模式未产出则传 `0` 并在 notes 标注 `minimal mode`
-- 债务利息默认关闭,仅在用户明确要求或开启追踪时执行(详见 `references/workflow-details.md`)。
+- `review_score` 必须使用 Step 3 汇总后的 `overall_score`(`--minimal` 也必须产出)
+- 债务利息默认关闭,仅在用户明确要求或开启追踪时执行(详见 [workflow-details.md](references/workflow-details.md))。
 
 ### Step 6:Git 备份
 
@@ -149,6 +176,6 @@ git add . && git commit -m "Ch{chapter_num}: {title}"
 
 ## 5. 参考入口
 
-- 执行模板与细节统一以 `references/workflow-details.md` 为准。
-- 写作硬约束以 `references/core-constraints.md` 为准。
-- 润色规则以 `references/polish-guide.md` 为准。
+- 执行模板与细节统一以 [workflow-details.md](references/workflow-details.md) 为准。
+- 写作硬约束以 `${CLAUDE_PLUGIN_ROOT}/references/shared/core-constraints.md` 为准。
+- 润色规则以 [polish-guide.md](references/polish-guide.md) 为准。

+ 4 - 81
.claude/skills/webnovel-write/references/core-constraints.md

@@ -4,86 +4,9 @@ purpose: 每次章节写作前加载,确保三大定律执行
 version: "5.4"
 ---
 
-<context>
-此文件用于章节创作时的核心约束检查。Claude 已知一般写作规范,这里只补充网文特定的防幻觉协议。
-v5.4:版本号对齐,内容沿用 v5.2。
-</context>
+<!-- DEPRECATED: use .claude/references/shared/core-constraints.md -->
 
-<instructions>
+本文件已弃用,避免多份参考源导致漂移。
 
-## 三大定律(低自由度 - 必须精确执行)
-
-| 定律 | 规则 | 检查方式 |
-|------|------|----------|
-| **大纲即法律** | 严格执行大纲,不得擅自发挥 | 审查时对照大纲 |
-| **设定即物理** | 实力/招式/物品 ≤ index.db 记录 | 写作前查询确认 |
-| **发明需识别** | 新实体由 Data Agent 自动提取 | 章节完成后处理 |
-
-## 新实体处理流程
-
-v5.2 引入的规则,v5.4 沿用:正文不再要求 XML 标签。新实体由 Data Agent 在章节完成后自动提取:
-
-1. **写作时**: 直接写纯正文,新角色/地点/物品正常描写
-2. **完成后**: Data Agent 自动识别新实体并写入 index.db
-3. **不确定实体**: Data Agent 标记为 uncertain,由人工确认
-
-## 钩子硬约束(新增)
-
-- 开头 120 字必须出现冲突/风险/强情绪之一
-- 结尾 80-150 字设置未闭合问题/危险逼近/信息反转
-- 禁止结束在“回去休息了”或类似收尾
-
-## 网文口感基准(新增)
-
-- 禁止连续 400 字纯解释/背景
-- 每 800-1200 字至少一次局面变化
-- 对话每句必须带意图
-
-## 爽点密度要求
-
-- 每章 ≥1 个小爽点(单一模式)
-- 每 5 章 ≥1 个组合爽点(2种模式叠加)
-- 每 10-15 章 ≥1 个里程碑爽点(改变主角地位)
-- 避免连续 3 章同类型
-
-## Strand 平衡警告
-
-| 情节线 | 警告条件 |
-|--------|----------|
-| Quest(主线) | 连续 5+ 章 |
-| Fire(感情线) | >10 章未出现 |
-| Constellation(世界观) | >15 章未出现 |
-
-## 禁止事项
-
-- `[待补充]`、`[TODO]`、`...(省略)...` → 必须完整写出
-- 战斗后无善后描述(都市异能题材)
-
-</instructions>
-
-<examples>
-
-<example>
-<input>主角需要使用"天雷掌"击败敌人</input>
-<output>
-1. 查询 index.db 中是否有"天雷掌"技能(v5.1 使用 SQLite)
-2. 若有:直接使用
-3. 若无:在正文中安排获得途径(如拜师/领悟/传承),Data Agent 会自动提取
-</output>
-</example>
-
-<example type="edge_case">
-<input>剧情需要主角展示筑基期实力,但 index.db 显示练气期</input>
-<output>
-❌ 直接写筑基期战力 → 违反"设定即物理"
-✅ 先安排突破场景,Data Agent 更新 index.db,再展示新实力
-</output>
-</example>
-
-</examples>
-
-<errors>
-❌ 主角突然会新技能 → ✅ 先在正文中安排获得途径
-❌ 实力设定不一致 → ✅ 写作前查询 index.db 确认
-❌ 章末无钩子 → ✅ 重写结尾,制造未闭合问题/危险/反转
-</errors>
+请改用 shared 单一事实源:
+- `.claude/references/shared/core-constraints.md`

+ 6 - 1
.claude/skills/webnovel-write/references/workflow-details.md

@@ -28,7 +28,12 @@ cat "${CLAUDE_PLUGIN_ROOT}/references/genre-profiles.md"
 cat "${CLAUDE_PLUGIN_ROOT}/skills/webnovel-write/references/writing/genre-hook-payoff-library.md"
 ```
 
-输出结构:
+输出结构(必须覆盖 Scene–Sequel 最小闭环):
+- 目标(20字以内)
+- 阻力(20字以内)
+- 代价(20字以内)
+- 本章变化(30字以内,优先可量化变化:关系/资源/风险/地位/能力)
+- 章末未闭合问题(30字以内;必须与钩子类型/强度一致)
 - 核心冲突一句话
 - 开头类型(冲突/悬疑/动作/对话/氛围)
 - 情绪节奏(低→高/高→低/低→高→低/平稳)

+ 6 - 2
.claude/templates/output/state-schema.md

@@ -18,7 +18,9 @@
     "last_updated": "",
     "volumes_completed": [],
     "current_volume": 1,
-    "volumes_planned": []
+    "volumes_planned": [
+      {"volume": 1, "chapters_range": "1-100", "planned_at": "2026-02-01"}
+    ]
   },
   "protagonist_state": {
     "name": "",
@@ -32,7 +34,9 @@
     "factions": [],
     "locations": []
   },
-  "review_checkpoints": [],
+  "review_checkpoints": [
+    {"chapters": "1-5", "report": "审查报告/第1-5章审查报告.md", "reviewed_at": "2026-02-26 20:00:00"}
+  ],
   "strand_tracker": {
     "last_quest_chapter": 0,
     "last_fire_chapter": 0,

+ 38 - 0
.claude/templates/output/大纲-卷节拍表.md

@@ -0,0 +1,38 @@
+# 第 {volume_id} 卷:{卷名} - 节拍表
+
+> 章节范围: 第 {start} - {end} 章
+> 核心冲突: {conflict}
+> 卷末高潮: {climax}
+
+## 1) 开卷承诺(Promise)
+- 本卷读者承诺(爽点/悬念/情绪):{1-3 条}
+- 主要兑现类型(信息/能力/关系/资源/认可/情绪):{1-2 类}
+
+## 2) 催化事件(Catalyst)
+- 事件:{一句话}
+- 不可逆变化:{一句话}
+- 主角当下目标:{一句话}
+
+## 3) 升级危机链(Fichtean 危机递增,至少 3 次)
+| 节点 | 危机/冲突 | 代价/风险升级 | 结果/变化(可量化优先) |
+|------|-----------|---------------|--------------------------|
+| 1 |  |  |  |
+| 2 |  |  |  |
+| 3 |  |  |  |
+| 4(可选) |  |  |  |
+| 5(可选) |  |  |  |
+
+## 4) 中段反转(必填)
+- 假胜利/假失败/反转事件:{一句话}
+- 反转带来的新认知/新代价:{一句话}
+- 若无:写 `无(理由:...)`
+
+## 5) 卷末最低谷(All Is Lost)
+- 最低谷事件:{一句话}
+- 代价:{一句话}
+- 主角选择:{一句话}
+
+## 6) 卷末大兑现 + 新钩子(Payoff + Next Promise)
+- 本卷兑现(对应 1) 开卷承诺):{2-3 条}
+- 新钩子(引入下一卷承诺):{一句话}
+- 章末未闭合问题(落到最后一章):{一句话}

+ 1 - 0
.gitignore

@@ -20,6 +20,7 @@ Thumbs.db
 
 # Workspace artifacts
 node_modules/
+.npm-cache/
 nul
 .tmp/
 .tmp_outline_check/

+ 6 - 1
CLAUDE.md

@@ -43,6 +43,10 @@
 │       ├── index_manager.py  # SQLite 管理
 │       └── ...
 ├── references/             # 写作指南
+│   ├── shared/             # 单一事实源(共享参考)
+│   │   ├── core-constraints.md
+│   │   ├── strand-weave-pattern.md
+│   │   └── cool-points-guide.md
 │   ├── reading-power-taxonomy.md  # 追读力分类标准
 │   ├── genre-profiles.md          # 题材配置档案
 │   └── ...
@@ -80,6 +84,7 @@
 - **webnovel-init Phase 6.5** - 创意约束生成(Deep 模式)
 - **webnovel-plan Phase 2.5** - 加载创意约束
 - **webnovel-plan Phase 7** - 约束继承检查
+- **webnovel-plan** - 新增卷节拍表产物:`大纲/第N卷-节拍表.md`
 
 ### 3. 新增文件
 - `.webnovel/idea_bank.json` - 创意银行(存储生成的创意包)
@@ -94,7 +99,7 @@ Step 1.5: 章节设计(按需,开头/钩子/爽点/微兑现)
 Step 2A: 生成粗稿
 Step 2B: 风格适配器
-Step 3: 默认 4 Agent 审查(关键章扩展到 6)
+Step 3: 默认 4 Agent 审查(关键章扩展到 6)+ 保存审查指标(review_metrics)
 Step 4: 网文化润色

+ 18 - 8
README.md

@@ -77,7 +77,8 @@
 **节奏红线**:
 - Quest 连续不超过 5 章
 - Fire 断档不超过 10 章
-- 每章至少包含 2 种 Strand
+- Constellation 断档不超过 15 章
+- 每章声明 1 个主导 Strand(可交织其他 Strand)
 
 ---
 
@@ -222,8 +223,9 @@ export PYTHONPATH=".claude/scripts"
 ```
 
 **产出**:
+- `大纲/第N卷-节拍表.md`(Promise/Catalyst/危机递增/中段反转/最低谷/大兑现+新钩子)
 - `大纲/第N卷-详细大纲.md`
-- 每章目标、爽点设计、Strand 类型
+- 每章:目标/阻力/代价/本章变化/章末未闭合问题/爽点/Strand/钩子/反派层级/关键实体
 - 新增实体预告
 
 ---
@@ -248,7 +250,7 @@ Step 2A: 生成粗稿(3000-5000字)
 Step 2B: 风格适配器(网文化改写)
-Step 3: 默认 4 Agent 审查(关键章扩展到 6)
+Step 3: 默认 4 Agent 审查(关键章扩展到 6)+ 保存审查指标(review_metrics)
 Step 4: 网文化润色
@@ -284,6 +286,11 @@ Step 6: Git 自动提交备份
 - 人物 OOC 检测
 - 场景连贯性
 
+**产出**:
+- `审查报告/第{start}-{end}章审查报告.md`(审查报告正文)
+- `.webnovel/index.db`:写入 `review_metrics`(用于趋势统计与写作建议)
+- `.webnovel/state.json`:追加 `review_checkpoints`(记录已审查区间与报告路径)
+
 ---
 
 ### /webnovel-query [关键词] - 信息查询
@@ -568,7 +575,7 @@ context_max_urgent_foreshadowing = 5  # 最大紧急伏笔数
 
 ## 文档归类
 
-- 当前基线文档:`README.md`、`CLAUDE.md`、`.claude/references/*.md`
+- 当前基线文档:`README.md`、`CLAUDE.md`、`.claude/references/*.md`、`.claude/references/shared/*.md`
 - 历史归档文档:`docs/archive/reports/`
 - 文档状态规则:`docs/doc-lifecycle.md`
 - 本地未跟踪归类:`docs/untracked-classification.md`
@@ -615,10 +622,12 @@ your-novel-project/
 │   │       ├── 黑暗题材.md
 │   │       └── ...
 │   └── references/             # 写作指南
-│       ├── strand-weave.md
-│       ├── cool-points-guide.md
-│       ├── reading-power-taxonomy.md  # 追读力分类标准 (v5.3)
-│       ├── genre-profiles.md          # 题材配置档案 (v5.3)
+│       ├── shared/             # 单一事实源(共享参考)
+│       │   ├── core-constraints.md
+│       │   ├── strand-weave-pattern.md
+│       │   └── cool-points-guide.md
+│       ├── reading-power-taxonomy.md  # 追读力分类标准
+│       ├── genre-profiles.md          # 题材配置档案
 │       └── ...
 ├── .webnovel/                  # 运行时数据
 │   ├── state.json              # 权威状态 (含 chapter_meta)
@@ -632,6 +641,7 @@ your-novel-project/
 │   └── ...
 ├── 大纲/                       # 卷纲/章纲
 │   ├── 总纲.md
+│   ├── 第1卷-节拍表.md
 │   ├── 第1卷-详细大纲.md
 │   └── ...
 └── 设定集/                     # 世界观/角色/力量体系