Browse Source

Refactor skills references and workflow checkpoints

lingfengQAQ 3 tháng trước cách đây
mục cha
commit
de391ef4b9

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

@@ -13,6 +13,7 @@ tools: Read, Grep, Bash
 
 
 - **Taxonomy**: `.claude/references/reading-power-taxonomy.md`
 - **Taxonomy**: `.claude/references/reading-power-taxonomy.md`
 - **Genre Profile**: `.claude/references/genre-profiles.md`
 - **Genre Profile**: `.claude/references/genre-profiles.md`
+- **Shared References**: `.claude/references/shared/` 为单一事实源;如需枚举/扫描参考文件,遇到 `<!-- DEPRECATED:` 的文件一律跳过。
 
 
 ## 输入
 ## 输入
 
 
@@ -27,14 +28,14 @@ tools: Read, Grep, Bash
 
 
 ## 输出格式:创作任务书(7个板块)
 ## 输出格式:创作任务书(7个板块)
 
 
-1. **本章核心任务**(冲突一句话、必须完成、绝对不能、反派层级)
+1. **本章核心任务**(目标/阻力/代价、冲突一句话、必须完成、绝对不能、反派层级)
 2. **接住上章**(上章钩子、读者期待、开头必须)
 2. **接住上章**(上章钩子、读者期待、开头必须)
 3. **出场角色**(状态、动机、情绪底色、说话风格、红线)
 3. **出场角色**(状态、动机、情绪底色、说话风格、红线)
 4. **场景与力量约束**(地点、可用能力、禁用能力)
 4. **场景与力量约束**(地点、可用能力、禁用能力)
 5. **风格指导**(本章类型、参考样本、最近模式、本章建议)
 5. **风格指导**(本章类型、参考样本、最近模式、本章建议)
 6. **连续性与伏笔**(时间/位置/情绪连贯;必须处理/可选伏笔)
 6. **连续性与伏笔**(时间/位置/情绪连贯;必须处理/可选伏笔)
-7. **追读力策略**(章末钩子类型+强度、微兑现建议、差异化提示)
-   - 如存在债务/Override,仅在此板块补充“债务状态/偿还建议”。
+7. **追读力策略**(章末未闭合问题 + 钩子类型/强度、微兑现建议、差异化提示)
+    - 如存在债务/Override,仅在此板块补充“债务状态/偿还建议”。
 
 
 ---
 ---
 
 
@@ -93,7 +94,7 @@ python "${CLAUDE_PLUGIN_ROOT}/scripts/extract_chapter_context.py" --chapter {NNN
 
 
 ### Step 1: 读取大纲与状态
 ### Step 1: 读取大纲与状态
 - 大纲:`大纲/卷N/第XXX章.md` 或 `大纲/第{卷}卷-详细大纲.md`
 - 大纲:`大纲/卷N/第XXX章.md` 或 `大纲/第{卷}卷-详细大纲.md`
-  - 若大纲含“反派层级”,必须提取并写入任务书
+  - 必须优先提取并写入任务书:目标/阻力/代价/反派层级/本章变化/章末未闭合问题/钩子(若存在)
 - `state.json`:progress / protagonist_state / chapter_meta / project.genre
 - `state.json`:progress / protagonist_state / chapter_meta / project.genre
 
 
 ### Step 2: 追读力与债务(按需)
 ### 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
     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):
 def test_build_chapter_context_payload_includes_contract_sections(tmp_path):
     scripts_dir = Path(__file__).resolve().parents[2]
     scripts_dir = Path(__file__).resolve().parents[2]
     if str(scripts_dir) not in sys.path:
     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
 from runtime_compat import enable_windows_utf8_stdio
 
 
 try:
 try:
-    from chapter_paths import find_chapter_file
+    from chapter_paths import find_chapter_file, volume_num_for_chapter
 except ImportError:  # pragma: no cover
 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():
 def _ensure_scripts_path():
@@ -33,6 +33,69 @@ def _ensure_scripts_path():
         sys.path.insert(0, str(scripts_dir))
         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:
 def find_project_root(start_path: Path | None = None) -> Path:
     """Find project root containing `.webnovel` directory."""
     """Find project root containing `.webnovel` directory."""
     if start_path is None:
     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:
 def extract_chapter_outline(project_root: Path, chapter_num: int) -> str:
     """Extract chapter outline segment from volume outline file."""
     """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 = [
     outline_candidates = [
         project_root / "大纲" / f"第{volume_num}卷-详细大纲.md",
         project_root / "大纲" / f"第{volume_num}卷-详细大纲.md",
         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:
 Path conventions:
 - `references/...` → relative to this skill directory (i.e. `.claude/skills/webnovel-init/references/...`)
 - `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)
 ### L1 (minimum, wave-gated)
-- Before Wave 1: `references/genre-tropes.md`
+- Before Wave 1: [genre-tropes.md](references/genre-tropes.md)
 
 
 ### L2 (conditional)
 ### 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):
 - 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)
 ### 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.
 - If used, explicitly mark it as time-sensitive and verify freshness before relying on it.
 
 
 ## Questioning style
 ## 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`.
 - Must run inside a project containing `.webnovel/state.json`.
 - If missing, ask for the project path and `cd` into it.
 - 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)
 ## Reference Loading Levels (strict, lazy)
 
 
 Use progressive disclosure and load only what current step requires:
 Use progressive disclosure and load only what current step requires:
 - L0: No references before scope/volume is confirmed.
 - 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
 ## Workflow
 1. Load project data.
 1. Load project data.
 2. Select volume and confirm scope.
 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
 ## 1) Load project data
 ```bash
 ```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.).
 - Confirm any special requirement (tone, POV emphasis, romance, etc.).
 If 总纲缺少卷名/章节范围/核心冲突/卷末高潮,先补问并更新总纲,再继续。
 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:
 Load genre profile and apply standards:
 ```bash
 ```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:
 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:
 Batching rule:
 - ≤20 章:1 批
 - ≤20 章:1 批
 - 21–40 章:2 批
 - 21–40 章:2 批
 - 41–60 章:3 批
 - 41–60 章:3 批
 - >60 章:4+ 批
 - >60 章:4+ 批
 
 
+Optional (only if需要钩子/节奏细分):
+```bash
+cat "${CLAUDE_PLUGIN_ROOT}/references/reading-power-taxonomy.md"
+```
+
 ### Chapter generation strategy
 ### Chapter generation strategy
 For each chapter, determine:
 For each chapter, determine:
 
 
@@ -196,15 +233,21 @@ Chapter format (include 反派层级 for context-agent):
 ```markdown
 ```markdown
 ### 第 {N} 章:{标题}
 ### 第 {N} 章:{标题}
 - 目标: {20字以内}
 - 目标: {20字以内}
+- 阻力: {20字以内}
+- 代价: {20字以内}
 - 爽点: {类型} - {30字以内}
 - 爽点: {类型} - {30字以内}
 - Strand: {Quest|Fire|Constellation}
 - Strand: {Quest|Fire|Constellation}
 - 反派层级: {无/小/中/大}
 - 反派层级: {无/小/中/大}
 - 视角/主角: {主角A/主角B/女主/群像}
 - 视角/主角: {主角A/主角B/女主/群像}
 - 关键实体: {新增或重要出场}
 - 关键实体: {新增或重要出场}
+- 本章变化: {30字以内,优先可量化变化}
+- 章末未闭合问题: {30字以内}
 - 钩子: {类型} - {30字以内}
 - 钩子: {类型} - {30字以内}
 ```
 ```
 
 
 **字段说明**:
 **字段说明**:
+- **章末未闭合问题**:本章结尾必须保留的“未闭合决策/问题”,用于驱动读者点下一章。
+  - 规则:必须与 **钩子** 的类型/强度一致;不得出现“钩子很强但问题很虚”的错配。
 - **钩子**:本章应设置的章末钩子(规划用)
 - **钩子**:本章应设置的章末钩子(规划用)
   - 例:悬念钩 - 神秘人身份即将揭晓
   - 例:悬念钩 - 神秘人身份即将揭晓
   - 意思是:本章结尾要设置这个悬念钩子
   - 意思是:本章结尾要设置这个悬念钩子
@@ -218,7 +261,7 @@ Save after each batch:
 '@ | Add-Content -Encoding UTF8 "$PROJECT_ROOT/大纲/第{volume_id}卷-详细大纲.md"
 '@ | Add-Content -Encoding UTF8 "$PROJECT_ROOT/大纲/第{volume_id}卷-详细大纲.md"
 ```
 ```
 
 
-## 5) Validate + save
+## 6) Validate + save
 ### Validation checks (must pass all)
 ### Validation checks (must pass all)
 
 
 **1. 爽点密度检查**
 **1. 爽点密度检查**
@@ -248,11 +291,15 @@ If deviation > 15%, adjust chapter assignments.
 **5. 完整性检查**
 **5. 完整性检查**
 Every chapter must have:
 Every chapter must have:
 - 目标(20 字以内)
 - 目标(20 字以内)
+- 阻力(20 字以内)
+- 代价(20 字以内)
 - 爽点(类型 + 30 字描述)
 - 爽点(类型 + 30 字描述)
 - Strand(Quest/Fire/Constellation)
 - Strand(Quest/Fire/Constellation)
 - 反派层级(无/小/中/大)
 - 反派层级(无/小/中/大)
 - 视角/主角
 - 视角/主角
 - 关键实体(至少 1 个)
 - 关键实体(至少 1 个)
+- 本章变化(30 字以内)
+- 章末未闭合问题(30 字以内)
 - 钩子(类型 + 30 字描述)
 - 钩子(类型 + 30 字描述)
 
 
 Update state (include chapters range):
 Update state (include chapters range):
@@ -264,13 +311,16 @@ python "${CLAUDE_PLUGIN_ROOT}/scripts/update_state.py" \
 ```
 ```
 
 
 Final check:
 Final check:
+- 节拍表文件已写入:`大纲/第{volume_id}卷-节拍表.md`
 - 章纲文件已写入:`大纲/第{volume_id}卷-详细大纲.md`
 - 章纲文件已写入:`大纲/第{volume_id}卷-详细大纲.md`
-- 每章包含:目标/爽点/Strand/反派层级/视角/关键实体/钩子
+- 每章包含:目标/阻力/代价/爽点/Strand/反派层级/视角/关键实体/本章变化/章末未闭合问题/钩子
 - 与总纲冲突/高潮一致,约束触发频率合理(如有 idea_bank)
 - 与总纲冲突/高潮一致,约束触发频率合理(如有 idea_bank)
 
 
 ### Hard fail conditions (must stop)
 ### Hard fail conditions (must stop)
+- 节拍表文件不存在或为空
+- 节拍表中段反转缺失(未按“必填/无(理由)”规则填写)
 - 章纲文件不存在或为空
 - 章纲文件不存在或为空
-- 任一章节缺少:目标/爽点/Strand/反派层级/视角/关键实体/钩子
+- 任一章节缺少:目标/阻力/代价/爽点/Strand/反派层级/视角/关键实体/本章变化/章末未闭合问题/钩子
 - 与总纲核心冲突或卷末高潮明显冲突
 - 与总纲核心冲突或卷末高潮明显冲突
 - 约束触发频率不足(当 idea_bank 启用时)
 - 约束触发频率不足(当 idea_bank 启用时)
 
 

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

@@ -3,310 +3,9 @@ name: cool-points-guide
 purpose: 爽点设计参考,规划大纲时和写作时按需加载
 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: 章节规划时检查三线平衡,避免节奏单调
 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: 仅按查询类型加载对应专题参考。
 - L2: 仅按查询类型加载对应专题参考。
 
 
 ### L1 (minimum)
 ### L1 (minimum)
-- `references/system-data-flow.md`
+- [system-data-flow.md](references/system-data-flow.md)
 
 
 ### L2 (conditional by query type)
 ### 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.
 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
 ```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: 仅在数据一致性检查时加载数据规范。
 - L2: 仅在数据一致性检查时加载数据规范。
 
 
 ### L1 (minimum)
 ### L1 (minimum)
-- `references/workflow-resume.md`
+- [workflow-resume.md](references/workflow-resume.md)
 
 
 ### L2 (conditional)
 ### L2 (conditional)
-- `references/system-data-flow.md`(仅在需要核对状态字段/恢复策略时)
+- [system-data-flow.md](references/system-data-flow.md)(仅在需要核对状态字段/恢复策略时)
 
 
 ## Step 1: 加载恢复协议(必须执行)
 ## Step 1: 加载恢复协议(必须执行)
 
 

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

@@ -12,6 +12,31 @@ allowed-tools: Read Grep Write Edit Bash Task AskUserQuestion
 - 若当前目录不存在该文件,先询问用户项目路径并 `cd` 进入
 - 若当前目录不存在该文件,先询问用户项目路径并 `cd` 进入
 - 进入后设置变量:`$PROJECT_ROOT = (Resolve-Path ".").Path`
 - 进入后设置变量:`$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
 ## Review depth
 
 
 - **Core (default)**: consistency / continuity / ooc / reader-pull
 - **Core (default)**: consistency / continuity / ooc / reader-pull
@@ -19,32 +44,29 @@ allowed-tools: Read Grep Write Edit Bash Task AskUserQuestion
 
 
 ## Step 1: 加载参考(按需)
 ## 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
 ```bash
-cat "${CLAUDE_PLUGIN_ROOT}/skills/webnovel-review/references/core-constraints.md"
+cat "${CLAUDE_PLUGIN_ROOT}/references/shared/core-constraints.md"
 ```
 ```
 
 
 **建议(Full 或需要时)**:
 **建议(Full 或需要时)**:
 ```bash
 ```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
 ```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 问题,询问用户:
 如发现 critical 问题,询问用户:
 - A) 立即修复(推荐)
 - A) 立即修复(推荐)
 - B) 仅保存报告,稍后处理
 - 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: 爽点设计参考,规划大纲时和写作时按需加载
 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"
 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: 章节规划时检查三线平衡,避免节奏单调
 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`。
 - 进入后设置变量:`$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. 模式定义
 ## 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 --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;不产出追读力数据 |
 | `/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. 执行步骤
 ## 3. 执行步骤
 
 
@@ -77,13 +92,17 @@ python "${CLAUDE_PLUGIN_ROOT}/scripts/extract_chapter_context.py" --chapter {cha
 - 开写前加载:
 - 开写前加载:
 
 
 ```bash
 ```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` 跳过)
 ### 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:审查
 ### Step 3:审查
 
 
@@ -91,6 +110,7 @@ cat "${CLAUDE_PLUGIN_ROOT}/skills/webnovel-write/references/core-constraints.md"
 
 
 - 必须使用 `Task` 工具调用各审查 subagent,禁止主流程直接内联“自审”替代。
 - 必须使用 `Task` 工具调用各审查 subagent,禁止主流程直接内联“自审”替代。
 - 可并行发起审查 Task,全部返回后统一汇总 `issues/severity/overall_score`。
 - 可并行发起审查 Task,全部返回后统一汇总 `issues/severity/overall_score`。
+- 审查汇总后必须将审查指标写入 `index.db.review_metrics`(包括 `--minimal` 模式)。
 
 
 默认核心 4 审查器:
 默认核心 4 审查器:
 
 
@@ -106,6 +126,13 @@ cat "${CLAUDE_PLUGIN_ROOT}/skills/webnovel-write/references/core-constraints.md"
 
 
 `--minimal` 模式仅运行前三个基础审查器,不产出追读力数据。
 `--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:润色
 ### Step 4:润色
 
 
 ```bash
 ```bash
@@ -130,8 +157,8 @@ cat "${CLAUDE_PLUGIN_ROOT}/skills/webnovel-write/references/writing/typesetting.
 - state_file: .webnovel/state.json
 - 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 备份
 ### Step 6:Git 备份
 
 
@@ -149,6 +176,6 @@ git add . && git commit -m "Ch{chapter_num}: {title}"
 
 
 ## 5. 参考入口
 ## 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"
 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"
 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": "",
     "last_updated": "",
     "volumes_completed": [],
     "volumes_completed": [],
     "current_volume": 1,
     "current_volume": 1,
-    "volumes_planned": []
+    "volumes_planned": [
+      {"volume": 1, "chapters_range": "1-100", "planned_at": "2026-02-01"}
+    ]
   },
   },
   "protagonist_state": {
   "protagonist_state": {
     "name": "",
     "name": "",
@@ -32,7 +34,9 @@
     "factions": [],
     "factions": [],
     "locations": []
     "locations": []
   },
   },
-  "review_checkpoints": [],
+  "review_checkpoints": [
+    {"chapters": "1-5", "report": "审查报告/第1-5章审查报告.md", "reviewed_at": "2026-02-26 20:00:00"}
+  ],
   "strand_tracker": {
   "strand_tracker": {
     "last_quest_chapter": 0,
     "last_quest_chapter": 0,
     "last_fire_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
 # Workspace artifacts
 node_modules/
 node_modules/
+.npm-cache/
 nul
 nul
 .tmp/
 .tmp/
 .tmp_outline_check/
 .tmp_outline_check/

+ 6 - 1
CLAUDE.md

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

+ 18 - 8
README.md

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