Forráskód Böngészése

docs(write): 合并Step1.5到context-agent并输出Step2A直写执行包

lingfengQAQ 3 hónapja
szülő
commit
08df45f365

+ 66 - 23
.claude/agents/context-agent.md

@@ -1,18 +1,19 @@
 ---
 name: context-agent
-description: 上下文搜集Agent (v5.4),输出精简创作任务书(7板块),聚焦可直接开写的信息
+description: 上下文搜集Agent (v5.5),内置 Contract v2,输出可被 Step 2A 直接消费的创作执行包
 tools: Read, Grep, Bash
 ---
 
-# context-agent (上下文搜集Agent v5.4)
+# context-agent (上下文搜集Agent v5.5)
 
-> **Role**: 创作任务书生成器。目标是“能直接开写”,不堆信息。
+> **Role**: 创作执行包生成器。目标是“能直接开写”,不堆信息。
 > **Philosophy**: 按需召回 + 推断补全,确保接住上章、场景清晰、留出钩子。
 
 ## 核心参考
 
 - **Taxonomy**: `.claude/references/reading-power-taxonomy.md`
 - **Genre Profile**: `.claude/references/genre-profiles.md`
+- **Contract v2**: `.claude/skills/webnovel-write/references/step-1.5-contract.md`
 - **Shared References**: `.claude/references/shared/` 为单一事实源;如需枚举/扫描参考文件,遇到 `<!-- DEPRECATED:` 的文件一律跳过。
 
 ## 输入
@@ -26,16 +27,34 @@ tools: Read, Grep, Bash
 }
 ```
 
-## 输出格式:创作任务书(7个板块
+## 输出格式:创作执行包(Step 2A 直连
 
-1. **本章核心任务**(目标/阻力/代价、冲突一句话、必须完成、绝对不能、反派层级)
-2. **接住上章**(上章钩子、读者期待、开头建议)
-3. **出场角色**(状态、动机、情绪底色、说话风格、红线)
-4. **场景与力量约束**(地点、可用能力、禁用能力)
-5. **风格指导**(本章类型、参考样本、最近模式、本章建议)
-6. **连续性与伏笔**(时间/位置/情绪连贯;必须处理/可选伏笔)
-7. **追读力策略**(章末未闭合问题 + 钩子类型/强度、微兑现建议、差异化提示)
-    - 如存在债务/Override,仅在此板块补充“债务状态/偿还建议”。
+输出必须是单一执行包,包含 3 层:
+
+1. **任务书(7板块)**
+- 本章核心任务(目标/阻力/代价、冲突一句话、必须完成、绝对不能、反派层级)
+- 接住上章(上章钩子、读者期待、开头建议)
+- 出场角色(状态、动机、情绪底色、说话风格、红线)
+- 场景与力量约束(地点、可用能力、禁用能力)
+- 风格指导(本章类型、参考样本、最近模式、本章建议)
+- 连续性与伏笔(时间/位置/情绪连贯;必须处理/可选伏笔)
+- 追读力策略(未闭合问题 + 钩子类型/强度、微兑现建议、差异化提示)
+
+2. **Contract v2(内置 Step 1.5)**
+- 目标、阻力、代价、本章变化、未闭合问题、核心冲突一句话
+- 开头类型、情绪节奏、信息密度
+- 是否过渡章(必须按大纲判定,禁止按字数判定)
+- 追读力设计(钩子类型/强度、微兑现清单、爽点模式)
+
+3. **Step 2A 直写提示词**
+- 章节节拍(开场触发 → 推进/受阻 → 反转/兑现 → 章末钩子)
+- 不可变事实清单(大纲事实/设定事实/承接事实)
+- 禁止事项(越级能力、无因果跳转、设定冲突、剧情硬拐)
+- 终检清单(本章必须满足项 + fail 条件)
+
+要求:
+- 三层信息必须一致;若冲突,以“设定 > 大纲 > 风格偏好”优先。
+- 输出内容必须能直接给 Step 2A 开写,不再依赖额外补问。
 
 ---
 
@@ -84,14 +103,14 @@ tools: Read, Grep, Bash
 python -m data_modules.context_manager --chapter {NNNN} --project-root "{project_root}"
 ```
 
-### Step 0.5: Contract v2 上下文包
+### Step 0.5: Contract v2 上下文包(内置)
 ```bash
 python "${CLAUDE_PLUGIN_ROOT}/scripts/extract_chapter_context.py" --chapter {NNNN} --project-root "{project_root}" --format json
 ```
 
 - 必须读取:`writing_guidance.guidance_items`
 - 推荐读取:`reader_signal` 与 `genre_profile.reference_hints`
-- 条件读取:`rag_assist`(当 `invoked=true` 且 `hits` 非空时,优先提炼为“接住上章/角色动机/场景约束”的证据
+- 条件读取:`rag_assist`(当 `invoked=true` 且 `hits` 非空时,必须提炼成可执行约束,禁止只贴检索命中
 
 ### Step 1: 读取大纲与状态
 - 大纲:`大纲/卷N/第XXX章.md` 或 `大纲/第{卷}卷-详细大纲.md`
@@ -140,8 +159,8 @@ python -m data_modules.index_manager recent-appearances --limit 20 --project-roo
   - 情绪底色 = 上章结束情绪 + 事件走向
   - 可用能力 = 当前境界 + 近期获得 + 设定禁用项
 
-### Step 5: 组装任务书
-输出 7 个板块的创作任务书
+### Step 5: 组装创作执行包(任务书 + Contract v2 + 直写提示词)
+输出可直接供 Step 2A 消费的单一执行包,不拆分独立 Step 1.5
 
 - 第 6 板块必须包含“伏笔优先级清单”:
   - `必须处理(本章优先)`:`remaining <= 5` 或已超期(`remaining < 0`),全部列出不截断
@@ -153,14 +172,38 @@ python -m data_modules.index_manager recent-appearances --limit 20 --project-roo
   - 若 `可选伏笔` 超过 5 条:展示前 5 条并标注“其余 N 条可选伏笔已省略”
   - 若 `foreshadowing_data_missing=true`:明确输出“结构化伏笔数据缺失,当前清单仅供占位”
 
+Contract v2 必须字段(不可缺):
+- `目标` / `阻力` / `代价` / `本章变化` / `未闭合问题`
+- `核心冲突一句话`
+- `开头类型` / `情绪节奏` / `信息密度`
+- `是否过渡章`
+- `追读力设计`
+
+### Step 6: 逻辑红线校验(输出前强制)
+对执行包做一致性自检,任一 fail 则回到 Step 5 重组:
+
+- 红线1:不可变事实冲突(大纲关键事件、设定规则、上章既有结果)
+- 红线2:时空跳跃无承接(地点/时间突变且无过渡)
+- 红线3:能力或信息无因果来源(突然会/突然知道)
+- 红线4:角色动机断裂(行为与近期目标明显冲突且无触发)
+- 红线5:合同与任务书冲突(例如“过渡章=true”却要求高强度高潮兑现)
+
+通过标准:
+- 红线 fail 数 = 0
+- 执行包内包含“不可变事实清单 + 章节节拍 + 终检清单”
+- Step 2A 在不补问情况下可直接起草正文
+
 ---
 
 ## 成功标准
 
-1. ✅ 创作任务书包含 7 个板块
-2. ✅ 上章钩子与读者期待明确(若存在)
-3. ✅ 角色动机/情绪为推断结果(非空)
-4. ✅ 最近模式已对比,给出差异化建议
-5. ✅ 章末钩子建议类型明确
-6. ✅ 反派层级已注明(若大纲提供)
-7. ✅ 第 6 板块已基于 `plot_threads.foreshadowing` 按紧急度排序输出
+1. ✅ 创作执行包可直接驱动 Step 2A(无需补问)
+2. ✅ 任务书包含 7 个板块
+3. ✅ 上章钩子与读者期待明确(若存在)
+4. ✅ 角色动机/情绪为推断结果(非空)
+5. ✅ 最近模式已对比,给出差异化建议
+6. ✅ 章末钩子建议类型明确
+7. ✅ 反派层级已注明(若大纲提供)
+8. ✅ 第 6 板块已基于 `plot_threads.foreshadowing` 按紧急度排序输出
+9. ✅ Contract v2 字段完整且与任务书一致
+10. ✅ 逻辑红线校验通过(fail=0)

+ 244 - 113
.claude/skills/webnovel-write/SKILL.md

@@ -1,182 +1,313 @@
 ---
 name: webnovel-write
-description: Writes webnovel chapters (3000-5000 words). Use when the user asks to write a chapter or runs /webnovel-write. Runs context, drafting, review, polish, and data extraction.
+description: Writes webnovel chapters (default 2000-2500 words). Use when the user asks to write a chapter or runs /webnovel-write. Runs context, drafting, review, polish, and data extraction.
 allowed-tools: Read Write Edit Grep Bash Task
 ---
 
-# Chapter Writing Skill
+# Chapter Writing (Structured Workflow v2)
+
+## 目标
+
+- 以稳定流程产出可发布章节:`正文/第{NNNN}章.md`。
+- 默认章节字数目标:2000-2500(用户或大纲明确覆盖时从其约定)。
+- 保证审查、润色、数据回写完整闭环,避免“写完即丢上下文”。
+- 输出直接可被后续章节消费的结构化数据:`review_metrics`、`summaries`、`chapter_meta`。
+
+## 执行原则
+
+1. 先校验输入完整性,再进入写作流程;缺关键输入时立即阻断。
+2. 审查与数据回写是硬步骤,`--fast`/`--minimal` 只允许降级可选环节。
+3. 参考资料严格按步骤按需加载,不一次性灌入全部文档。
+4. Step 2B 与 Step 4 职责分离:2B 只做风格转译,4 只做问题修复与质控。
+5. 任一步失败优先做最小回滚,不重跑全流程。
+
+## 模式定义
+
+- `/webnovel-write`:Step 1 → 2A → 2B → 3 → 4 → 5 → 6
+- `/webnovel-write --fast`:Step 1 → 2A → 3 → 4 → 5 → 6(跳过 2B)
+- `/webnovel-write --minimal`:Step 1 → 2A → 3(仅3个基础审查)→ 4 → 5 → 6
+
+最小产物(所有模式):
+- `正文/第{NNNN}章.md`
+- `index.db.review_metrics` 新纪录(含 `overall_score`)
+- `.webnovel/summaries/ch{NNNN}.md`
+- `.webnovel/state.json` 的进度与 `chapter_meta` 更新
+
+## 引用加载等级(strict, lazy)
+
+- L0:未进入对应步骤前,不加载任何参考文件。
+- L1:每步仅加载该步“必读”文件。
+- L2:仅在触发条件满足时加载“条件必读/可选”文件。
+
+路径约定:
+- `references/...` 相对当前 skill 目录。
+- `../../references/...` 指向全局共享参考。
+
+## References(逐文件引用清单)
+
+### 根目录
+
+- `references/step-3-review-gate.md`
+  - 用途:Step 3 审查调用模板、汇总格式、落库 JSON 规范。
+  - 触发:Step 3 必读。
+- `references/step-5-debt-switch.md`
+  - 用途:Step 5 债务利息开关规则(默认关闭)。
+  - 触发:Step 5 必读。
+- `../../references/shared/core-constraints.md`
+  - 用途:Step 2A 写作硬约束(大纲即法律 / 设定即物理 / 发明需识别)。
+  - 触发:Step 2A 必读。
+- `references/polish-guide.md`
+  - 用途:Step 4 问题修复、Anti-AI 与 No-Poison 规则。
+  - 触发:Step 4 必读。
+- `references/writing/typesetting.md`
+  - 用途:Step 4 移动端阅读排版与发布前速查。
+  - 触发:Step 4 必读。
+- `references/style-adapter.md`
+  - 用途:Step 2B 风格转译规则,不改剧情事实。
+  - 触发:Step 2B 执行时必读(`--fast`/`--minimal` 跳过)。
+- `references/style-variants.md`
+  - 用途:Step 1(内置 Contract)开头/钩子/节奏变体与重复风险控制。
+  - 触发:Step 1 当需要做差异化设计时加载。
+- `../../references/reading-power-taxonomy.md`
+  - 用途:Step 1(内置 Contract)钩子、爽点、微兑现 taxonomy。
+  - 触发:Step 1 当需要追读力设计时加载。
+- `../../references/genre-profiles.md`
+  - 用途:Step 1(内置 Contract)按题材配置节奏阈值与钩子偏好。
+  - 触发:Step 1 当 `state.project.genre` 已知时加载。
+- `references/writing/genre-hook-payoff-library.md`
+  - 用途:电竞/直播文/克苏鲁的钩子与微兑现快速库。
+  - 触发:Step 1 题材命中 `esports/livestream/cosmic-horror` 时必读。
+
+### writing(问题定向加读)
+
+- `references/writing/combat-scenes.md`
+  - 触发:战斗章或审查命中“战斗可读性/镜头混乱”。
+- `references/writing/dialogue-writing.md`
+  - 触发:审查命中 OOC、对话说明书化、对白辨识差。
+- `references/writing/emotion-psychology.md`
+  - 触发:情绪转折生硬、动机断层、共情弱。
+- `references/writing/scene-description.md`
+  - 触发:场景空泛、空间方位不清、切场突兀。
+- `references/writing/desire-description.md`
+  - 触发:主角目标弱、欲望驱动力不足。
+
+## 工具策略(按需)
+
+- `Read/Grep`:读取 `state.json`、大纲、章节正文与参考文件。
+- `Bash`:运行 `extract_chapter_context.py`、`index_manager`、`workflow_manager`。
+- `Task`:调用 `context-agent`、审查 subagent、`data-agent` 并行执行。
+
+## 交互流程
+
+### Step 0:预检与上下文最小加载
+
+必须做:
+- 校验项目根:`.webnovel/state.json` 存在。
+- 校验核心输入:`大纲/总纲.md`、`.claude/scripts/extract_chapter_context.py` 存在。
+- 规范化变量:
+  - `PROJECT_ROOT`:当前项目绝对路径
+  - `chapter_num`:当前章号(整数)
+  - `chapter_padded`:四位章号(如 `0007`)
+
+输出:
+- “已就绪输入”与“缺失输入”清单;缺失则阻断并提示先补齐。
+
+### Step 0.5:工作流断点记录(best-effort,不阻断)
 
-## 0. 项目根校验(必须)
-
-- 必须在项目根目录执行(需存在 `.webnovel/state.json`)。
-- 若当前目录不存在该文件,先询问用户项目路径并切换目录。
-- 进入后设置变量:`$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 开始/结束都记录(失败不阻断)
+# 进入某一步(示例:Step 1)
 python "${CLAUDE_PLUGIN_ROOT}/scripts/workflow_manager.py" start-step --step-id "Step 1" --step-name "Context Agent" || true
+
+# Step 1 完成后记录(每个 Step 结束都要调用)
 python "${CLAUDE_PLUGIN_ROOT}/scripts/workflow_manager.py" complete-step --step-id "Step 1" --artifacts '{"ok":true}' || true
 
-# 全部结束后完成任务
+# 全部 Step 结束后,再结束整条任务
 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. 模式定义
-
-| 模式 | 启用步骤 | 说明 |
-|------|---------|------|
-| `/webnovel-write` | Step 1 → 1.5 → 2A → 2B → 3 → 4 → 5 → 6 | 标准流程 |
-| `/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;不产出追读力数据 |
-
-## References(按步骤导航)
-
-- 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)
-
-## 2. 引用加载策略(严格按需)
-
-- L0:不提前加载参考。
-- L1:执行某个 Step 前,只加载 References 区该 Step 的“必读”条目。
-- L2:仅在触发条件满足时加载 References 区该 Step 的“可选”条目。
-
-## 3. 执行步骤
-
-### Step 1:Context Agent(生成创作任务书)
-
-使用 Task 调用 `context-agent`:
-
-```
-调用 context-agent,参数:
-- chapter: {chapter_num}
-- project_root: {PROJECT_ROOT}
-- storage_path: .webnovel/
-- state_file: .webnovel/state.json
-```
-
 要求:
+- `--step-id` 仅允许:`Step 1` / `Step 2A` / `Step 2B` / `Step 3` / `Step 4` / `Step 5` / `Step 6`。
+- 任何记录失败只记警告,不阻断写作。
+- 每个 Step 执行结束后,同样需要 `complete-step`(失败不阻断)。
 
-- 大纲或 state 缺失时,明确提示先初始化。
-- 任务书必须包含“反派层级”(无则标注“无”)。
+### Step 1:Context Agent(内置 Contract v2,生成直写执行包)
 
-### Step 1.5:Contract v2 Guidance 注入
+使用 Task 调用 `context-agent`,参数:
+- `chapter`
+- `project_root`
+- `storage_path=.webnovel/`
+- `state_file=.webnovel/state.json`
 
-```bash
-python "${CLAUDE_PLUGIN_ROOT}/scripts/extract_chapter_context.py" --chapter {chapter_num} --project-root "{PROJECT_ROOT}" --format json
-```
+硬要求:
+- 若 `state` 或大纲不可用,立即阻断并返回缺失项。
+- 输出必须同时包含:
+  - 7 板块任务书(目标/冲突/承接/角色/场景约束/伏笔/追读力);
+  - Contract v2 全字段(目标/阻力/代价/本章变化/未闭合问题/开头类型/情绪节奏/信息密度/过渡章判定/追读力设计);
+  - Step 2A 可直接消费的“写作执行包”(章节节拍、不可变事实清单、禁止事项、终检清单)。
+- 合同与任务书出现冲突时,以“大纲与设定约束更严格者”为准。
 
-- 必读:`writing_guidance.guidance_items`
-- 选读:`reader_signal`、`genre_profile.reference_hints`
-- 条件必读:`rag_assist`(当 `invoked=true` 且 `hits` 非空,必须把检索命中转成可执行写作约束)
+输出:
+- 单一“创作执行包”(任务书 + Contract v2 + 直写提示词),供 Step 2A 直接消费,不再拆分独立 Step 1.5。
 
 ### Step 2A:正文起草
 
-- 遵循三原则:大纲即法律 / 设定即物理 / 发明需识别。
-- 输出纯正文:`正文/第{NNNN}章.md`
-- 开写前加载:
-
+执行前必须加载:
 ```bash
 cat "${CLAUDE_PLUGIN_ROOT}/references/shared/core-constraints.md"
 ```
 
-### Step 2B:风格适配(`--fast` / `--minimal` 跳过)
+硬要求:
+- 只输出纯正文到 `正文/第{chapter_padded}章.md`。
+- 默认按 2000-2500 字执行;若大纲为关键战斗章/高潮章/卷末章或用户明确指定,则按大纲/用户优先。
+- 禁止占位符正文(如 `[TODO]`、`[待补充]`)。
+- 保留承接关系:若上章有明确钩子,本章必须回应(可部分兑现)。
+
+输出:
+- 章节草稿(可进入 Step 2B 或 Step 3)。
 
-- 仅做风格转译,不改剧情事实。
-- 执行前加载(按需,若本章需要强网文化/去AI化处理则必读):
+### Step 2B:风格适配(`--fast` / `--minimal` 跳过)
 
+执行前加载:
 ```bash
 cat "${CLAUDE_PLUGIN_ROOT}/skills/webnovel-write/references/style-adapter.md"
 ```
 
-### Step 3:审查
+硬要求:
+- 只做表达层转译,不改剧情事实、事件顺序、角色行为结果、设定规则。
+- 对“模板腔、说明腔、机械腔”做定向改写,为 Step 4 留出问题修复空间。
 
-调用约束:
+输出:
+- 风格化正文(覆盖原章节文件)。
 
-- 必须使用 `Task` 工具调用各审查 subagent,禁止主流程直接内联“自审”替代。
-- 可并行发起审查 Task,全部返回后统一汇总 `issues/severity/overall_score`。
-- 审查汇总后必须将审查指标写入 `index.db.review_metrics`(包括 `--minimal` 模式)。
+### Step 3:审查(auto 路由,必须由 Task 子代理执行)
 
-默认核心 4 审查器:
+执行前加载:
+```bash
+cat "${CLAUDE_PLUGIN_ROOT}/skills/webnovel-write/references/step-3-review-gate.md"
+```
 
+调用约束:
+- 必须用 `Task` 调用审查 subagent,禁止主流程伪造审查结论。
+- 可并行发起审查,统一汇总 `issues/severity/overall_score`。
+- 默认使用 `auto` 路由:根据“本章执行合同 + 正文信号 + 大纲标签”动态选择审查器。
+
+核心审查器(始终执行):
 - `consistency-checker`
 - `continuity-checker`
 - `ooc-checker`
-- `reader-pull-checker`
-
-关键章/卷末/用户明确要求时追加:
 
+条件审查器(`auto` 命中时执行):
+- `reader-pull-checker`
 - `high-point-checker`
 - `pacing-checker`
 
-`--minimal` 模式仅运行前三个基础审查器,不产出追读力数据。
+模式说明:
+- 标准/`--fast`:核心 3 个 + auto 命中的条件审查器
+- `--minimal`:只跑核心 3 个(忽略条件审查器)
 
 审查指标落库(必做):
 ```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)。
+硬要求:
+- `--minimal` 也必须产出 `overall_score`。
+- 未落库 `review_metrics` 不得进入 Step 5。
 
-### Step 4:润色
+### Step 4:润色(问题修复优先)
 
+执行前必须加载:
 ```bash
 cat "${CLAUDE_PLUGIN_ROOT}/skills/webnovel-write/references/polish-guide.md"
 cat "${CLAUDE_PLUGIN_ROOT}/skills/webnovel-write/references/writing/typesetting.md"
 ```
 
-- 先修复 critical/high,再处理 medium/low。
-- 这里执行去AI化与毒点规避规则(见 `polish-guide.md`)。
+执行顺序:
+1. 修复 `critical`(必须)
+2. 修复 `high`(不能修复则记录 deviation)
+3. 处理 `medium/low`(按收益择优)
+4. 执行 Anti-AI 与 No-Poison 全文终检(必须输出 `anti_ai_force_check: pass/fail`)
 
-### Step 5:Data Agent
+输出:
+- 润色后正文(覆盖章节文件)
+- 变更摘要(至少含:修复项、保留项、deviation、`anti_ai_force_check`)
 
-使用 Task 调用 `data-agent`:
+### Step 5:Data Agent(状态与索引回写)
 
-```
-调用 data-agent,参数:
-- chapter: {chapter_num}
-- chapter_file: "正文/第{NNNN}章.md"
-- review_score: {overall_score from Step 3}
-- project_root: {PROJECT_ROOT}
-- storage_path: .webnovel/
-- state_file: .webnovel/state.json
-```
+使用 Task 调用 `data-agent`,参数:
+- `chapter`
+- `chapter_file="正文/第{chapter_padded}章.md"`
+- `review_score=Step 3 overall_score`
+- `project_root`
+- `storage_path=.webnovel/`
+- `state_file=.webnovel/state.json`
+
+执行后检查(最小白名单):
+- `.webnovel/state.json`
+- `.webnovel/index.db`
+- `.webnovel/summaries/ch{chapter_padded}.md`
+- `.webnovel/observability/data_agent_timing.jsonl`(观测日志)
 
-- `review_score` 必须使用 Step 3 汇总后的 `overall_score`(`--minimal` 也必须产出)。
-- 债务利息默认关闭,仅在用户明确要求或开启追踪时执行(详见 [workflow-details.md](references/workflow-details.md))。
+性能要求:
+- 读取 timing 日志最近一条;
+- 当 `TOTAL > 30000ms` 时,输出最慢 2-3 个环节与原因说明。
 
-### Step 6:Git 备份
+债务利息:
+- 默认关闭,仅在用户明确要求或开启追踪时执行(见 `step-5-debt-switch.md`)。
+
+### Step 6:Git 备份(可失败但需说明)
 
 ```bash
-git add . && git commit -m "Ch{chapter_num}: {title}"
+git add .
+git commit -m "Ch{chapter_num}: {title}"
 ```
 
-## 4. 最小交付检查
+规则:
+- 若 commit 失败,必须给出失败原因与未提交文件范围。
+
+## 充分性闸门(必须通过)
 
-- [ ] 正文文件已生成(章节编号正确)。
-- [ ] 审查已执行(模式对应的最小集合)。
-- [ ] 润色已处理 critical/high。
-- [ ] data-agent 已回写状态与索引。
-- [ ] Git 备份成功或已说明失败原因。
+未满足以下条件前,不得结束流程:
 
-## 5. 参考入口
+1. 章节正文文件存在且非空:`正文/第{chapter_padded}章.md`
+2. Step 3 已产出 `overall_score` 且 `review_metrics` 成功落库
+3. Step 4 已处理全部 `critical`,`high` 未修项有 deviation 记录
+4. Step 4 的 `anti_ai_force_check=pass`(基于全文检查;fail 时不得进入 Step 5)
+5. Step 5 已回写 `state.json`、`index.db`、`summaries/ch{chapter_padded}.md`
+6. 若开启性能观测,已读取最新 timing 记录并输出结论
+
+## 验证与交付
+
+执行检查:
+
+```bash
+test -f ".webnovel/state.json"
+test -f "正文/第{chapter_padded}章.md"
+test -f ".webnovel/summaries/ch{chapter_padded}.md"
+python -m data_modules.index_manager get-recent-review-metrics --limit 1 --project-root "${PROJECT_ROOT}"
+tail -n 1 ".webnovel/observability/data_agent_timing.jsonl" || true
+```
 
-- 执行模板与细节统一以 [workflow-details.md](references/workflow-details.md) 为准。
-- 写作硬约束以 `${CLAUDE_PLUGIN_ROOT}/references/shared/core-constraints.md` 为准。
-- 润色规则以 [polish-guide.md](references/polish-guide.md) 为准。
+成功标准:
+- 章节文件、摘要文件、状态文件齐全且内容可读。
+- 审查分数可追溯,`overall_score` 与 Step 5 输入一致。
+- 润色后未破坏大纲与设定约束。
+
+## 失败处理(最小回滚)
+
+触发条件:
+- 章节文件缺失或空文件;
+- 审查结果未落库;
+- Data Agent 关键产物缺失;
+- 润色引入设定冲突。
+
+恢复流程:
+1. 仅重跑失败步骤,不回滚已通过步骤。
+2. 常见最小修复:
+   - 审查缺失:只重跑 Step 3 并落库;
+   - 润色失真:恢复 Step 2A 输出并重做 Step 4;
+   - 摘要/状态缺失:只重跑 Step 5;
+3. 重新执行“验证与交付”全部检查,通过后结束。

+ 49 - 0
.claude/skills/webnovel-write/references/step-1.5-contract.md

@@ -0,0 +1,49 @@
+# Step 1.5 Contract Template
+
+## 目标
+
+把 `extract_chapter_context.py` 的上下文与 guidance 收束成“可执行合同”,直接驱动 Step 2A。
+
+## 必填输出结构(Scene-Sequel 最小闭环)
+
+- 目标(20字内)
+- 阻力(20字内)
+- 代价(20字内)
+- 本章变化(30字内,优先可量化:关系/资源/风险/地位/能力)
+- 未闭合问题(30字内,后段或章末)
+- 核心冲突一句话
+- 开头类型(冲突/悬疑/动作/对话/氛围)
+- 情绪节奏(低→高/高→低/低→高→低/平稳)
+- 信息密度(low/medium/high)
+- 是否过渡章(true/false,必须按大纲判定,不按字数判定)
+- 追读力设计(钩子类型/强度、微兑现清单、爽点模式)
+
+过渡章判定规则(强制):
+- 依据章纲/卷纲中的章节功能标签与目标(铺垫/转场/承接/回收等)。
+- 若大纲未显式标注,由“本章核心目标是否以推进主冲突为主”判定。
+- 禁止使用字数阈值判定过渡章。
+
+## 差异化检查
+
+- 钩子类型优先避免与最近 3 章重复。
+- 开头类型优先避免与最近 3 章重复。
+- 爽点模式优先避免与最近 5 章重复。
+
+若必须重复,必须记录 Override 理由,并至少变更以下一项:
+- 对象
+- 代价
+- 结果
+
+## 题材快速调用(仅命中时)
+
+命中题材:`esports` / `livestream` / `cosmic-horror`
+
+执行:
+1. 从 `writing/genre-hook-payoff-library.md` 选 1 条期待锚点(优先章末,也可后段)。
+2. 选 1-2 条微兑现,优先与本章核心冲突同方向。
+
+## 读取优先级
+
+1. 必读:`writing_guidance.guidance_items`
+2. 条件必读:`rag_assist`(`invoked=true` 且 `hits` 非空)
+3. 选读:`reader_signal`、`genre_profile.reference_hints`