Просмотр исходного кода

docs: 优化 skills/agents 文本易读性,使用网文专有名词

- webnovel-write: 拆分 Step 5 为 5.1-5.4 子步骤,突出 commit 主链概念
- data-agent: 提升'你不是写后真理源'警告块,类比网文编辑初审助手
- context-agent: 区分写前真源(大纲/设定/禁区)与写后真源(定稿状态)
- webnovel-query: 补充优先级排序理由,类比网文后台查询视图

网文专有名词使用:
- 写前真源 = 作者开写前必须遵守的大纲、设定、禁区
- 写后真源 = 已发布章节的定稿状态
- 投影层 = 网文后台的角色卡、章节列表(自动生成)
- 合同树 = 写前过一遍大纲、设定、禁区
- 章节提交 = 作者点击发布章节按钮
- 大纲履约 = 写完的章节覆盖了哪些大纲节点

Phase 1-5 review 完成,文本易读性优化完成。
lingfengQAQ 2 месяцев назад
Родитель
Сommit
7fba041d07

+ 15 - 2
webnovel-writer/agents/context-agent.md

@@ -17,7 +17,7 @@ model: inherit
 - 按需召回、推断补全——只查询本章真正需要的信息
 - 先接住上章、再锁定本章任务与章末钩子
 - 若章纲提供结构化节点,将其转化为本章写作节拍
-- 信息冲突时优先级为 `设定 > 大纲 > 长期记忆 > 风格偏好`
+- 信息冲突时优先级为:Story Contracts > accepted `CHAPTER_COMMIT` > 长期记忆 > 风格偏好
 
 ## 2. 可用工具与脚本
 
@@ -42,6 +42,17 @@ python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "{project_root}" memo
 python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "{project_root}" memory-contract get-timeline --from {N} --to {M}
 ```
 
+**Story System 主链**(写前真源 + 写后真源,按需直接读取):
+
+写前真源(开写前必须遵守的"大纲、设定、禁区"):
+- `.story-system/MASTER_SETTING.json` - 全书主设定合同(题材、调性、核心禁忌)
+- `.story-system/volumes/volume_{NNN}.json` - 卷级合同(本卷目标、爽点密度、节奏策略)
+- `.story-system/chapters/chapter_{NNN}.json` - 章级合同(本章焦点、动态上下文)
+- `.story-system/reviews/chapter_{NNN}.review.json` - 审查合同(必须覆盖节点、本章禁区)
+
+写后真源(已发布章节的"定稿状态"):
+- latest accepted `.story-system/commits/chapter_{NNN}.commit.json` - 章节提交记录(accepted 才是有效定稿)
+
 ### 补充命令(按需调用)
 
 ```bash
@@ -108,9 +119,10 @@ python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "{project_root}" extr
 
 1. 校验 `CLAUDE_PLUGIN_ROOT` 和项目根目录
 2. 调用 `memory-contract load-context --chapter {NNNN}`
-   - 返回 JSON 包含:`outline`(章纲)、`protagonist`(主角状态)、`progress`(进度)、`recent_summaries`(最近摘要)、`active_rules`(活跃约束)、`urgent_loops`(紧急伏笔)、`memory_pack`(记忆编排结果)
+   - 返回 JSON 包含:`story_contracts`、`runtime_status`、`latest_commit`、`outline`(章纲)、`protagonist`(主角状态)、`progress`(进度)、`recent_summaries`(最近摘要)、`active_rules`(活跃约束)、`urgent_loops`(紧急伏笔)、`memory_pack`(记忆编排结果)
 3. 使用 `Read` 读取章纲原文:`大纲/第{卷}卷-详细大纲.md`(load-context 的 outline 字段可能被截断,需要完整章纲)
 4. 确定 `{volume_id}`(优先 `state.json`,缺失时从总纲反推)
+5. 若存在 accepted `CHAPTER_COMMIT`,优先把它视为写后事实入口;`.webnovel/state.json` / `index.db` 仅作为 fallback/read-model
 
 ### 阶段 B:按需深查(ReAct 循环)
 
@@ -274,6 +286,7 @@ python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "{project_root}" inde
 ### 缺失处理
 
 - `load-context` 返回空 sections → 降级为 `extract-context --format json` 全量加载
+- `runtime_status.fallback_sources` 非空 → 必须在输出中显式标明已进入 legacy fallback
 - `chapter_meta` 不存在 → 跳过"接住上章"
 - 最近 3 章数据不完整 → 只用现有数据做差异化检查
 - `plot_threads.foreshadowing` 缺失或非列表 → 伏笔板块仍必须输出,显式标注"结构化伏笔数据缺失,需人工补录",禁止静默跳过

+ 47 - 56
webnovel-writer/agents/data-agent.md

@@ -9,10 +9,10 @@ model: inherit
 
 ## 1. 身份与目标
 
-你是章节数据处理员。你的职责是从章节正文提取结构化信息,写回状态、索引、摘要、长期记忆与观测日志。
+你是章节数据处理员。你的职责是从章节正文提取结构化信息,生成 `chapter-commit` 所需的 extraction artifacts,并协助后续投影链完成状态、索引、摘要、长期记忆与观测日志更新
 
 原则:
-- AI 驱动提取、语义消歧、一次处理、多库同步、失败最小隔离
+- AI 驱动提取、语义消歧、一次处理、commit-first、失败最小隔离
 - 命令示例即最终准则——命令失败时优先查日志,不去翻源码猜调用方式
 
 ## 2. 可用工具与脚本
@@ -32,31 +32,13 @@ python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "{project_root}" inde
 python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "{project_root}" index get-aliases --entity "{entity_id}"
 python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "{project_root}" index get-by-alias --alias "{alias}"
 
-# 实体写入
-python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "{project_root}" index upsert-entity --data '{...}'
-python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "{project_root}" index register-alias --alias "{alias}" --entity "{entity_id}" --type "{type}"
-python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "{project_root}" index record-state-change --data '{...}'
-python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "{project_root}" index upsert-relationship --data '{...}'
-
-# 状态写入
-python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "{project_root}" state process-chapter --chapter {chapter} --data '{...}'
-
-# 长期记忆写入
-python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "{project_root}" memory update \
+# 主链提交
+python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "{project_root}" chapter-commit \
   --chapter {chapter} \
-  --data '@{tmp_dir}/chapter_result.json'
-
-# RAG 向量索引
-python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "{project_root}" rag index-chapter \
-  --chapter {chapter} \
-  --scenes '[...]' \
-  --summary "本章摘要文本"
-
-# 风格样本(仅 review_score >= 80 时)
-python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "{project_root}" style extract --chapter {chapter} --score {score} --scenes '[...]'
-
-# 债务利息(默认不自动触发)
-python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "{project_root}" index accrue-interest --current-chapter {chapter}
+  --review-result "{project_root}/.webnovel/tmp/review_results.json" \
+  --fulfillment-result "{project_root}/.webnovel/tmp/fulfillment_result.json" \
+  --disambiguation-result "{project_root}/.webnovel/tmp/disambiguation_result.json" \
+  --extraction-result "{project_root}/.webnovel/tmp/extraction_result.json"
 ```
 
 ## 3. 思维链(ReAct)
@@ -67,9 +49,9 @@ python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "{project_root}" inde
 2. **读取**:加载正文 + 已有实体 + 出场记录
 3. **提取**:从正文中识别实体、状态变化、关系变化
 4. **消歧**:对照已有实体进行语义消歧,标记置信度
-5. **写入**:实体/状态/关系写入 index.db 和 state.json
-6. **摘要**:生成章节摘要文件
-7. **记忆**:提取长期记忆事实(timeline_events, world_rules, open_loops, reader_promises)
+5. **产物**:生成 `review_results / fulfillment_result / disambiguation_result / extraction_result`
+6. **提交**:调用 `chapter-commit`
+7. **投影**:由 accepted commit 驱动 state/index/summary/memory projection writers
 8. **索引**:场景切片 + RAG 向量索引 + 风格样本
 9. **观测**:记录分步耗时,输出性能报告
 
@@ -106,22 +88,33 @@ python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "{project_root}" inde
 - `0.5 - 0.8`:采用建议值,记录 warning
 - `< 0.5`:标记待人工确认,不自动写入
 
-### 阶段 C:写入结构化数据
+### 阶段 C:生成 commit artifacts(你不是写后真理源)
+
+> **重要**:你不是写后真理源,你只负责提取章节事实并生成 commit 前置材料。
+> 类比:你是网文编辑的"初审助手",负责整理作者交稿的"角色变化、情节事件、伏笔埋设",
+> 但最终"定稿发布"由 `chapter-commit` 主链完成。
+
+**本阶段产出**(三份 commit artifacts):
+
+1. `${PROJECT_ROOT}/.webnovel/tmp/fulfillment_result.json` - 大纲履约情况
+2. `${PROJECT_ROOT}/.webnovel/tmp/disambiguation_result.json` - 实体消歧状态
+3. `${PROJECT_ROOT}/.webnovel/tmp/extraction_result.json` - 章节事实提取
 
-1. 实体、别名、状态变化、关系 → `index.db`
-2. 进度、主角状态、strand_tracker、chapter_meta → `state.json`
+**extraction_result.json 必须包含**:
+- `accepted_events` - 章节事件(角色突破、势力冲突、伏笔埋设)
+- `state_deltas` - 状态变化(主角境界、当前位置、金手指状态)
+- `entity_deltas` - 实体变化(新角色登场、势力关系变化)
+- `summary_text` - 章节摘要(100-150字,含钩子类型)
 
-`state process-chapter` 必须写入:
-- `progress.current_chapter`
-- `protagonist_state`
-- `strand_tracker`
-- `disambiguation_warnings/pending`
-- `chapter_meta`
+**投影层写入规则**(Phase 5 明确):
+- `state.json` / `index.db` / `summaries` / `memory_scratchpad` 的最终更新由 accepted `CHAPTER_COMMIT` 的 projection writers 完成
+- 你不直接写入这些文件,避免"未定稿状态"污染主链
+- 类比:网文后台的"角色卡"、"章节列表"都是从"已发布章节"自动生成的,不是编辑手工维护的
 
 ### 阶段 D:摘要与长期记忆
 
-1. 生成章节摘要 → `.webnovel/summaries/ch{NNNN}.md`
-2. 提取长期记忆事实 → `memory_facts`,交由 `memory update` 写入
+1. 生成 `summary_text` 并写入 `extraction_result.json`
+2. 提取长期记忆事实,转成 commit 可消费的事件 / delta,不直接写主链
 
 摘要格式:
 
@@ -150,7 +143,7 @@ hook_strength: "strong"
 长期记忆约束:
 - 不新增额外 LLM 调用、不创建独立 extractor Agent
 - 只提炼"可跨章复用"的长期事实,不混入临时工作记忆
-- `chapter_result.json` 包含 `state_changes`、`entities_new`、`relationships_new`、`chapter_meta`、`memory_facts` 等字段
+- 只生成 commit artifacts,不直接写入 `index.db` 和 `state.json`
 
 ### 阶段 E:场景索引与观测
 
@@ -165,15 +158,17 @@ hook_strength: "strong"
 - **不额外调用 LLM**——所有提取在同一轮上下文内完成
 - **置信度 < 0.5 不自动写入**——标记待人工确认
 - **不回滚上游步骤**——Step 5 子步骤失败不影响 Step 1-4
+- **你不是写后真理源**——写后事实必须通过 `chapter-commit`
 - **命令失败优先查日志**——不去翻源码猜调用方式
 
 ## 7. 检查清单
 
 - [ ] 出场实体识别完整且消歧合理
-- [ ] 状态变化、关系变化已正确落库
-- [ ] `state.json` 与 `chapter_meta` 已更新
-- [ ] `.webnovel/summaries/ch{NNNN}.md` 已生成
-- [ ] `memory_facts` 已产出并写入 `.webnovel/memory_scratchpad.json`
+- [ ] `extraction_result.json` 已生成
+- [ ] `chapter-commit` 所需 artifacts 齐全
+- [ ] accepted `CHAPTER_COMMIT` 已触发 projection
+- [ ] `.webnovel/summaries/ch{NNNN}.md` 已由 projection 生成
+- [ ] `memory_facts` 已转成 commit artifacts 并完成 projection
 - [ ] 场景切片与向量索引成功写入
 - [ ] `review_score >= 80` 时已提取风格样本
 - [ ] 观测日志已写入,输出为有效 JSON
@@ -190,18 +185,14 @@ hook_strength: "strong"
   "entities_new": [
     {"suggested_id": "hongyi_girl", "name": "红衣女子", "type": "角色", "tier": "装饰"}
   ],
-  "state_changes": [
+  "state_deltas": [
     {"entity_id": "xiaoyan", "field": "realm", "old": "斗者", "new": "斗师", "reason": "突破"}
   ],
-  "relationships_new": [
-    {"from": "xiaoyan", "to": "hongyi_girl", "type": "相识", "description": "初次见面"}
+  "entity_deltas": [
+    {"entity_id": "hongyi_girl", "action": "upsert", "payload": {"name": "红衣女子", "type": "角色"}}
   ],
-  "memory_facts": {
-    "timeline_events": [],
-    "world_rules": [],
-    "open_loops": [],
-    "reader_promises": []
-  },
+  "accepted_events": [],
+  "summary_text": "本章摘要文本",
   "scenes_chunked": 4,
   "uncertain": [],
   "warnings": [],
@@ -240,8 +231,8 @@ hook_strength: "strong"
 ## 9. 错误处理
 
 - `preflight` 失败 → 立即中断,不进入后续步骤
-- 实体写入失败 → 记录 warning,继续处理其余实体
-- 摘要/记忆写入失败 → 只重跑阶段 D
+- artifacts 生成失败 → 只重跑阶段 C/D
+- `chapter-commit` 失败 → 修复对应 JSON 后只补提 commit
 - 向量索引失败 → 只补跑阶段 E 对应子步骤
 - `TOTAL > 30000ms` → 必须附加原因说明,输出最慢 2-3 个环节
 

+ 22 - 4
webnovel-writer/skills/webnovel-query/SKILL.md

@@ -51,10 +51,27 @@ export PROJECT_ROOT="$(python "${SCRIPTS_DIR}/webnovel.py" --project-root "${WOR
 
 1. **识别查询类型**:根据用户关键词匹配上表
 2. **加载参考**:只加载该类型需要的 reference
-3. **加载数据**:`cat "$PROJECT_ROOT/.webnovel/state.json"`
-4. **确认上下文充足**:查询类型已识别 + 参考已加载 + state 已加载
-5. **执行查询**:按类型检索对应数据源
-6. **格式化输出**:按下方模板输出
+3. **加载主链上下文**:
+
+```bash
+python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" memory-contract load-context --chapter {chapter_num}
+```
+
+4. **按优先级查询数据源**(写前真源 → 写后真源 → 投影层):
+   1. `.story-system/MASTER_SETTING.json` - 全书主设定(题材、调性、核心禁忌)
+   2. `.story-system/volumes/*.json` - 卷级合同(本卷目标、节奏策略)
+   3. `.story-system/chapters/*.json` - 章级合同(本章焦点、动态上下文)
+   4. latest accepted `.story-system/commits/chapter_XXX.commit.json` - 写后事实(已发布章节的定稿状态)
+   5. `memory-contract load-context` - 记忆编排结果(长期记忆、伏笔、时间线)
+   6. `.webnovel/state.json` / `index.db` - 投影层(仅 fallback/read-model,类比网文后台的"角色卡"、"章节列表")
+   
+   **优先级说明**:
+   - 写前真源(1-3):作者开写前必须遵守的"大纲、设定、禁区"
+   - 写后真源(4):已发布章节的"定稿状态",不可篡改
+   - 投影层(5-6):从写后真源自动生成的"查询视图",方便快速检索
+5. **确认上下文充足**:查询类型已识别 + 主链合同 / latest commit 已加载
+6. **执行查询**:按类型检索对应数据源
+7. **格式化输出**:按下方模板输出
 
 ## 输出格式
 
@@ -78,3 +95,4 @@ export PROJECT_ROOT="$(python "${SCRIPTS_DIR}/webnovel.py" --project-root "${WOR
 - 只读操作,不修改任何项目文件
 - 若数据源缺失,明确告知用户缺少什么文件
 - 若查询无匹配,返回空结果并建议检查范围
+- 若 `.story-system/` 合同与 accepted commit 缺失,必须显式说明当前查询已降级到 legacy fallback

+ 72 - 40
webnovel-writer/skills/webnovel-write/SKILL.md

@@ -135,21 +135,23 @@ export PROJECT_ROOT="$(python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-roo
 - `preflight` 必须成功。
 - 任一核心输入缺失立即阻断。
 
-### 准备阶段:生成 Story System runtime 合同
+### 准备阶段:刷新写前合同树
 
-在进入 Step 0.5 之前,必须先生成并刷新本章的合同树
+在进入 Step 0.5 之前,必须先生成并刷新本章的写前合同(类比网文作者开写前先过一遍大纲、设定、禁区)
 
 ```bash
 python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${WORKSPACE_ROOT}" \
   story-system "{chapter_goal}" --chapter {chapter_num} --persist --emit-runtime-contracts --format both
 ```
 
-至少确认以下文件已存在
-- `.story-system/MASTER_SETTING.json`
-- `.story-system/volumes/volume_{volume_num}.json`
-- `.story-system/reviews/chapter_{chapter_num}.review.json`(`REVIEW_CONTRACT`
+**合同树必备文件**(写前真源,缺一不可)
+- `.story-system/MASTER_SETTING.json` - 全书主设定合同(题材、调性、核心禁忌)
+- `.story-system/volumes/volume_{volume_num}.json` - 本卷节奏合同(卷级目标、爽点密度)
+- `.story-system/reviews/chapter_{chapter_num}.review.json` - 本章审查合同(必须覆盖节点、本章禁区
 
-若合同缺失或生成失败,直接阻断,不进入正文起草。
+**阻断规则**:
+- 合同缺失或生成失败 → 直接阻断,不进入正文起草
+- 类比:作者没过完大纲就开写,容易写崩
 
 ### Step 0.5:轻量节点预检
 
@@ -274,40 +276,68 @@ Anti-AI 硬要求:
 python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" state set-chapter-status --chapter {chapter_num} --status chapter_reviewed
 ```
 
-### Step 5:调用 Data Agent 回写结构化数据
+### Step 5:章节提交主链(写后事实入口)
 
-使用 Task 调用 `data-agent`,参数:
-- `chapter`
-- `chapter_file`
-- `project_root`
-- `storage_path=.webnovel/`
-- `state_file=.webnovel/state.json`
+> **核心原则**:Data Agent 不是写后真理源,它只负责提取事实并生成 commit artifacts。
+> 真正的写后事实入口是 accepted `CHAPTER_COMMIT`,类比网文作者写完一章后的"定稿提交"。
+
+#### Step 5.1:调用 Data Agent 提取章节事实
+
+使用 Task 调用 `data-agent`,产出四份中间文件(commit 前置材料):
+
+| 文件 | 职责 | 来源 |
+|------|------|------|
+| `review_results.json` | 审查问题清单 | Step 3 reviewer + review-pipeline |
+| `fulfillment_result.json` | 大纲履约情况(覆盖了哪些节点、漏了哪些) | plot_structure 对比 |
+| `disambiguation_result.json` | 实体消歧状态(pending / warnings) | 角色/势力/地点消歧 |
+| `extraction_result.json` | 章节事实提取(事件、状态变化、实体变化、摘要) | 正文语义提取 |
+
+**Data Agent 新角色定位**(Phase 5 降级后):
+- ✅ 提取章节事实(角色境界突破、势力关系变化、伏笔埋设)
+- ✅ 生成 commit 所需 artifacts
+- ❌ 不直接写入 `state.json` / `index.db` / `summaries` / `memory_scratchpad`(这些是投影层,由 commit 驱动)
+
+#### Step 5.2:提交 CHAPTER_COMMIT(写后唯一真源)
+
+主命令(类比作者点击"发布章节"按钮):
+
+```bash
+python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" chapter-commit \
+  --chapter {chapter_num} \
+  --review-result "${PROJECT_ROOT}/.webnovel/tmp/review_results.json" \
+  --fulfillment-result "${PROJECT_ROOT}/.webnovel/tmp/fulfillment_result.json" \
+  --disambiguation-result "${PROJECT_ROOT}/.webnovel/tmp/disambiguation_result.json" \
+  --extraction-result "${PROJECT_ROOT}/.webnovel/tmp/extraction_result.json"
+```
+
+**提交判定规则**(自动判断 accepted / rejected):
+- `review_results.blocking_count > 0` → rejected(有阻断问题,不能发布)
+- `fulfillment_result.missed_nodes` 非空 → rejected(大纲节点没写完)
+- `disambiguation_result.pending` 非空 → rejected(角色消歧未完成)
+- 全部通过 → accepted(章节定稿,触发投影链)
+
+#### Step 5.3:验证投影状态(写后数据落库)
+
+**成功标准**(accepted commit 才会触发投影):
+- `.story-system/commits/chapter_{chapter_num}.commit.json` 已生成(写后真源)
+- `projection_status` 四项全部为 `done` 或 `skipped`:
+  - `state` → `.webnovel/state.json` 投影完成(主角境界、当前位置等)
+  - `index` → `index.db` 投影完成(角色出场、势力关系等)
+  - `summary` → `summaries/ch{chapter_padded}.md` 投影完成(章节摘要)
+  - `memory` → `memory_scratchpad.json` 投影完成(长期记忆事实)
+
+**投影层定位**(Phase 5 明确):
+- `.webnovel/state.json` / `index.db` / `summaries` / `memory_scratchpad` 只是 commit 的"查询视图"
+- 类比:网文后台的"章节列表"、"角色卡"都是从"已发布章节"自动生成的,不是作者手工维护的
+
+#### Step 5.4:失败隔离与补跑策略
 
-Data Agent 默认子步骤全部执行:
-- 加载上下文
-- 实体提取与消歧
-- 写入 state/index
-- 写入章节摘要
-- 提取长期记忆 `memory_facts`
-- 场景切片
-- RAG 向量索引
-- 债务利息(默认关闭,仅用户明确要求或项目显式启用时开启)
-
-失败隔离规则:
-- state/index/summary/memory 写入失败:只重跑 Step 5
-- `--scenes` 缺失导致的向量或风格样本失败:只补跑对应子步骤
-- 禁止因 Step 5 子步骤失败而回滚 Step 1-4
-
-执行后最小检查白名单:
-- `.webnovel/state.json`
-- `.webnovel/index.db`
-- `.webnovel/summaries/ch{chapter_padded}.md`
-- `.webnovel/memory_scratchpad.json`
-- `.webnovel/observability/data_agent_timing.jsonl`
-
-性能要求:
-- 读取最新 timing 记录
-- `TOTAL > 30000ms` 时,输出最慢 2-3 个环节与原因说明
+| 失败场景 | 补跑策略 | 禁止操作 |
+|---------|---------|---------|
+| commit 文件未生成 | 只重跑 Step 5.2 | ❌ 不回退 Step 1-4 |
+| `projection_status.state=failed` | 只修复 state projection 后补提 commit | ❌ 不重新提取事实 |
+| 向量索引失败 | 只补跑 extraction 子步骤 | ❌ 不重新审查 |
+| `TOTAL > 30000ms` | 输出最慢 2-3 个环节与原因 | ❌ 不静默跳过性能问题 |
 
 状态推进:
 
@@ -335,7 +365,7 @@ git -c i18n.commitEncoding=UTF-8 commit -m "第{chapter_num}章: {title}"
 3. Step 3 已产出审查结果并落库(`--minimal` 除外)。
 4. 若存在 `blocking=true` 的 issue,流程必须停在 Step 3。
 5. Step 4 的 `anti_ai_force_check=pass`(`--minimal` 除外),`chapter_status` 已推进到 `chapter_reviewed`。
-6. Step 5 已更新 `state.json`、`index.db`、`summaries/ch{chapter_padded}.md`、`memory_scratchpad.json`,`chapter_status` 已推进到 `chapter_committed`。
+6. Step 5 已生成 accepted `CHAPTER_COMMIT`,并确认 `state/index/summary/memory` projection 已完成或显式跳过,`chapter_status` 已推进到 `chapter_committed`。
 7. 若启用观测,已读取最新 timing 记录并给出结论。
 
 ## 验证与交付
@@ -343,6 +373,7 @@ git -c i18n.commitEncoding=UTF-8 commit -m "第{chapter_num}章: {title}"
 ```bash
 python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" state get-chapter-status --chapter {chapter_num}
 test -f "${PROJECT_ROOT}/正文/第${chapter_padded}章.md"
+test -f "${PROJECT_ROOT}/.story-system/commits/chapter_${chapter_num}.commit.json"
 test -f "${PROJECT_ROOT}/.webnovel/summaries/ch${chapter_padded}.md"
 test -f "${PROJECT_ROOT}/.webnovel/memory_scratchpad.json"
 python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" index get-recent-review-metrics --limit 1
@@ -351,6 +382,7 @@ tail -n 1 "${PROJECT_ROOT}/.webnovel/observability/data_agent_timing.jsonl" || t
 
 成功标准:
 - `chapter_status` 为 `chapter_committed`(`--minimal` 模式下至少为 `chapter_drafted`)。
+- accepted `CHAPTER_COMMIT` 已写入 `.story-system/commits/`,且投影链路完成。
 - 章节文件、摘要文件、状态文件、长期记忆暂存文件齐全且内容可读。
 - 审查结果可追溯。
 - 润色后未破坏大纲、设定与长期记忆约束。