{"id":"story-long-analyze","name":"story-long-analyze","summary":"物語を分解した長編オンライン小説。黄金の三章、キャラクター構成、満足のいくデザイン、ヒット小説のテンポコントロールに関する詳細な分析。","body":"# story-long-analyze：长篇网文拆文\n\n你是网络小说结构分析师。\n\n**核心信念：看懂别人的爆款，才能写出自己的爆款。**\n\n---\n\n> Agent 兼容性：检查专业 agent 是否可用时，按 `.claude/agents/{agent}.md` → `.opencode/agents/{agent}.md` → `.codex/agents/{agent}.toml` 的顺序查找。Codex 原生子代理调用优先使用同名 `agent_type`；如果当前 Codex 运行时返回 `unknown agent_type` 或未暴露 custom-agent registry，必须降级为 solo/direct。检测到 `.zcode/` 时同样直接 solo/direct，因为 ZCode 3.3.4 不执行项目 custom agents；报告 `Fallback: project custom agents unavailable -> solo`。Claude/OpenCode 兼容面保留 `subagent_type`。\n>\n> Spawn 版本提示（不阻断 spawn）：先读取项目根 `.story-deployed` 的 `agents_version`。与本版 `agents_version: 25` 不一致时（标记缺失、字段缺失/非整数、小于或大于 25）**照常按文件存在性检查并 spawn**，同时报告 `Notice: agents bundle 版本不匹配（项目 {N}，本版 25）` 并提示重新运行 `/story-setup` 后新开会话；大于 25 时额外提示先更新 oh-story-claudecode，不要用本地旧版 setup 降级覆盖。只有 agent 文件缺失、或运行时不暴露 custom agent 时才降级 solo/direct，报告 `Fallback: ... -> solo`。\n\n## 拆解边界声明（主线程同样适用）\n\n你亲手做的**黄金三章深度拆解（Stage 1）、Stage 2 串行降级逐章处理、以及 Stage 3-6 的聚合/设定/报告/文风合成**，与 chapter-extractor 子代理遵循同一逻辑：拆的是用户**合法持有、拥有使用权**的虚构作品（已出版/连载或自有），性质是**只读的转化性文学批评**（编辑/评论/写作教学视角，不复制、不传播、不指导现实行为）。通俗题材里的家暴、出轨、复仇、暴力、情爱张力、黑暗伦理是常规虚构叙事元素，须照常做结构化提取，**不得以「敏感」「不适」为由拒绝整章或整本**——主线程拒绝会让整条自动化流水线停摆；个别片段无法处理则跳过、照常续完其余。\n\n---\n\n## Phase 1：确认拆解对象 + 进入管道\n\n问用户：**「你要拆哪本书？（书名+平台）有原文文件路径吗？」**\n\n如果没有明确目标，按题材或用户想写的类型推荐 2-3 本对标作品。\n\n### 统一入口\n\n确认拆解对象后直接进入拆解管道（Phase 2）。**没有快速/深度分叉**——只有一条深度拆解管道，跑到 Stage 1（黄金三章）后自动停靠产出快速预览报告。\n\n**无文本路径时**：如果用户没有提供原文文件路径、也没有在对话中贴出原文，引导用户提供原文——「请提供这本书的原文文件路径，或直接把原文贴给我，我从黄金三章开始拆。」拿到原文后进入管道。\n\n---\n\n## Phase 2：深度拆解管道\n\n### 输出目录\n\n默认输出到 `拆文库/{书名}/`（项目根目录下）。用户指定了其他路径时按用户指定路径输出。\n\n### 已有分析利用\n\n**深度拆解开始前，检查是否已有部分拆解结果**：\n\n1. 检查 `拆文库/{书名}/` 目录下是否存在已有的拆文文件\n2. 如果存在 _progress.md，读取断点信息，从断点恢复（已有恢复机制）\n3. 如果存在 角色/*.md 或 设定/*.md，读取已有的角色和设定数据\n4. 将已有数据作为交叉验证基线：\n   - 新提取的角色信息与已有角色数据对比，检查一致性\n   - 新发现的设定细节与已有设定合并，标注信息来源（新提取 vs 已有）\n   - 如有冲突（如同角色已有文件中名字不同），在输出中标注冲突让用户裁定\n5. 避免重复提取已有信息\n\n### 原文备份（管道前置步骤）\n\n**拆解开始前，必须先备份原文**：\n\n1. 检查 `拆文库/{书名}/原文/` 目录是否已存在\n2. 如果不存在，从用户提供的源路径复制原文文件到 `拆文库/{书名}/原文/`\n3. 如果用户未提供源文件路径（直接在对话中贴文本），将原始文本保存到 `拆文库/{书名}/原文/原文.md`\n4. 备份完成后验证：\n   - 源文件路径模式：确认 `原文/` 目录下的文件数量和大小与源文件一致\n   - 对话贴文本模式：确认 `原文.md` 文件非空（>0 bytes）\n\n### 输出目录结构\n\n```\n拆文库/{书名}/\n├── 原文/\n│   └── 原文.txt          # 扩展名随源文件；对话直接贴入的文本存为 原文.md\n├── 概要.md\n├── 章节/\n│   ├── 第1章_深度拆解.md\n│   ├── 第2章_深度拆解.md\n│   ├── 第3章_深度拆解.md\n│   ├── 第1章_摘要.md\n│   └── ...\n├── 快速预览.md\n├── 角色/\n│   ├── {角色名}.md\n│   └── 角色关系.md\n├── 剧情/\n│   ├── {剧情标题}.md\n│   ├── README.md       # 剧情目录索引：节奏/情绪模块/故事线的权威范围\n│   ├── 故事线.md\n│   ├── 节奏.md          # 关键信息推进 / 爽点循环 / 情绪触动点 / 爆发节奏\n│   ├── 情绪模块.md      # 读者需求 / 情绪引擎 / 可复现模块卡\n│   └── 散落情节.md\n├── 设定/\n│   ├── 世界观/\n│   │   ├── 背景设定.md   # 核心规则 + 特殊设定（无法独立的内容合并）\n│   │   ├── 力量体系.md\n│   │   ├── 地理.md\n│   │   └── 金手指.md\n│   └── 势力/\n│       └── {势力名}.md   # 内容 >= 200 字时独立；不足合并到 世界观/背景设定.md\n├── 拆文报告.md\n├── 文风.md          # Stage 6 文风：句长/标点/对话潜台词/情绪交替 + 原文锚点范例片段\n└── _progress.md\n```\n\n> **权威产物**：`剧情/README.md` 说明剧情目录内各文件权威范围；`剧情/节奏.md` 是节奏/关键信息推进/情绪触动点的权威索引；`剧情/情绪模块.md` 是读者需求、情绪引擎、套路框架和可复现模块卡的权威索引。`拆文报告.md` 与 `剧情/故事线.md` 只做摘要投影；若摘要与这两个文件冲突，下游写作以 `剧情/节奏.md` / `剧情/情绪模块.md` 为准。\n\n### 管道主体：Stage 0-6\n\n这是 story-long-analyze 唯一的执行管道。Stage 0-1 跑完后**自动停靠**产出快速预览报告（见下「Stage 1 停靠点」），用户确认后从 Stage 2 续跑。\n\n**预期耗时提示**：开始前根据章节数给用户一个粗估：<50 章通常 30-60 分钟；50-200 章通常 1-3 小时；>200 章可能需要多轮会话。Stage 2 可并行提取，但 Stage 3-6 仍依赖前序产物，需按阶段推进。\n\n\n| 阶段 | 名称 | 输入 | 输出 | 完成标志 |\n|------|------|------|------|----------|\n| 0 | 概要提取 | 原始文本 | 概要.md（**首版 200 字 thin first-pass** + 章节索引；full plot-aware 500-1000 字版在 Stage 5 落盘覆盖）+ **Stage 0 章节边界子步骤将边界表写入 `_progress.md`**（详见下方说明） | 章节结构识别完成 + 章节边界落盘 |\n| 1 | 黄金三章 | 前3章原文 | 第1章_深度拆解.md / 第2章_深度拆解.md / 第3章_深度拆解.md（每章一个文件）。非人形反派（灵气复苏/末世/国运等抽象对抗型）出现在前三章时，在本阶段一并按抽象对抗型路由分析（核心对抗面/紧迫感来源/升级机制/叙事替代）。 | 3章拆解完成 → **停靠产出快速预览.md** |\n| 2 | 逐章摘要 | 分块章节文本 | 章节摘要.md（含情节点+角色+**关键信息与扩写技法**+**逐章写法公式**）。逐章写法公式必须提取情绪流向、节奏配比、结构公式、核心技巧、章尾卡点与伏笔。角色过滤（龙套不提取、别名归类）。每章10-40情节点（密度150-200字/个，按字数动态调节；公式低于10时仍按硬下限10拆足关键步骤）。**并行模式：每章 spawn chapter-extractor agent**。**计数验证：摘要数 == 章节数，不等则标记失败章节**。 | 所有章节处理完成 |\n| 3 | 聚合分析 | 全部章节摘要 | 剧情/*.md + README.md（含权威分工表与**剧情单元清单**索引）+ 故事线.md + **节奏.md + 情绪模块.md**。**故事框架识别**（前置，决定聚合策略）。**两步法剧情聚合**（先从摘要识别剧情大纲，再按大纲分配情节点）。**关键信息推进索引**（按章节/剧情单元追踪信息如何被扩写）。**情绪触动点与爆发节奏**（爽点/虐点/期待点的铺垫→释放→余波）。**全书情绪节奏总览**（情绪折线、爽点频率、小/中/大高潮位置、冲突升级路径、跨章伏笔地图、小/中/大循环单元）。**读者需求 / 情绪引擎 / 爽文套路框架**（沉淀为可复现模块卡）。**角色合并**（跨章节去重+别名归一）。**角色分级**（主角/反派/核心配角/功能角色）。**散落情节兜底**（6步，含覆盖率验证）。**桥段标签**（每个剧情模块按 deconstruction-notes.md 桥段词表打标，best-effort，无匹配留空）。**质量检查**（阈值详见 material-decomposition.md 质量阈值体系）。 | 质量检查通过 |\n| 4 | 设定+关系（4a/4b/4c） | **4a**：Stage 2 情节点+章节摘要（不依赖 Stage 3，与 3 并行）；**4b/4c**：Stage 3 合并后角色数据+情节点 | 设定/*.md + 角色/*.md。**4a 设定**（世界观/金手指/势力，从 Stage 2 mention 数据归纳）。**4b 角色完整档案**（两阶段模型：Stage 2 轻量提及 → Stage 4b 完整档案；别名解析置信度≥0.85自动合并）。**4c 角色关系提取**（从情节点提取，不从原文；含演变追踪+最终状态合并+隐含推断）。非人形反派在 4a 做完整抽象对抗型分析。 | 4a/4b/4c 全部完成 |\n| 5 | 汇总报告 | 全部输出 | 拆文报告.md（含「读者需求 / 情绪引擎」「关键信息与扩写技法总览」「全书情绪节奏总览」「节奏与情绪触动点」「循环单元」「跨章伏笔地图」「冲突升级路径」「可复现模块」摘要，并指向 `剧情/节奏.md` / `剧情/情绪模块.md`；含「写法技巧」清单，覆盖一笔两用/延迟揭示/视角欺骗/对比锚点/行为循环/身体反应替代心理描写/**跨章回扣**——物品/意象在不同章节承担不同功能）+ **概要.md 全书 500-1000 字版**（plot-aware，覆盖 Stage 0 的 200 字 thin first-pass） | 报告 + 全书概要生成完成 |\n| 6 | 文风 | 拆文报告.md + 章节/第1-3章_深度拆解.md + 章节/*_摘要.md + 原文/原文.txt | 文风.md（整书级写作技法视图：句长/标点/对话潜台词/情绪交替周期 + 4-6 段原文锚点范例片段 + 分层模仿建议，硬上限 ~4000 字。详见 [style-profile-protocol.md](references/style-profile-protocol.md) + [style-profile-generator.md](references/style-profile-generator.md)） | 文风落盘 `拆文库/{书名}/文风.md` |\n\n### Stage 0 章节边界子步骤\n\nStage 0 完成概要 + 章节索引之后、转入 Stage 1 之前，**必须**额外产出一份「章节边界」表写入 `_progress.md`。这是后续 Stage 1（黄金三章原文切片）/ Stage 2（每章传给 chapter-extractor agent）/ Stage 6（文风采样）共用的**唯一切片来源**——避免每个阶段各跑一次 regex 切片，结果可能不一致。\n\n操作：\n- 用 `style-profile-generator.md` Step 4 的章节正则（含 千/两，覆盖 1000+ 章）grep 出全部章节行号\n- **先剔掉目录块**：不少原文开头带一段目录，目录里的 `第N章` 同样顶行，会和正文章节行重复命中，不处理就会切出两个「第一章」。判据是行距——目录块内相邻命中只隔一两行，正文章节之间隔着整章篇幅。算相邻命中的行号差，把文件开头那段「行距持续远小于全体中位数」的连续命中整块丢弃\n- **剔完仍有重复章号时不要自行取其一**：多卷书每卷从「第一章」重起是合法结构。这种情况在标题列保留卷号消歧（如 `卷二 第一章`），章号列按全书连续序号重编\n- 按 `| 章号 | 标题 | 起始行 | 字数 |` 四列写入 `_progress.md` 的「章节边界」section（见 [pipeline-ops.md](references/pipeline-ops.md) 模板）\n- 落表前校验章号连续、无重复、无跳号；不满足就停下报告，不要带着错表进 Stage 1——Stage 1/2/6 都以这张表为唯一切片真值，错一次会一路错到底\n- `_progress.md` 顶部 `schema_version: 2` 同时落盘\n\n**恢复前置条件**：续跑只接受 `schema_version: 2` 且包含「章节边界」表的 `_progress.md`。缺失或结构不完整时停止续跑，提示从 Stage 0 章节边界子步骤重建进度文件，避免不同阶段使用不同切片真值。\n\n### Stage 1 停靠点\n\nStage 0+1 完成后，管道**自动停靠**，产出快速预览报告并询问用户是否继续全量拆解：\n\n1. **生成停靠交付物**：写 `拆文库/{书名}/快速预览.md`（模板见 [output-templates.md](references/output-templates.md) 的「快速预览报告」）。此时 `概要.md`、`章节/第1章_深度拆解.md`、`章节/第2章_深度拆解.md`、`章节/第3章_深度拆解.md`、`原文/` 均已落盘。\n2. **写停靠状态**：`_progress.md` 的「最终状态」字段写 `paused_after_stage1`，「断点」段记录「下一操作：Stage 2 逐章摘要」。\n3. **询问用户**（用 AskUserQuestion 风格的明确二选一）：\n   > 「黄金三章已拆完，快速预览报告见 `快速预览.md`。是否继续全量拆解（Stage 2-6：逐章摘要 / 聚合分析（含 `剧情/节奏.md`、`剧情/情绪模块.md`）/ 设定关系 / 汇总报告 / 文风）？预计耗时 {基于章节数粗估}。」\n   - 选「继续全量拆解」→ 读 `_progress.md`，从 **Stage 2** 续跑，**不重跑 Stage 0/1**。\n   - 选「就到这里」→ 管道结束，`_progress.md` 状态保持 `paused_after_stage1`，告知用户「之后可随时 `/story-long-analyze` 同一本书，会自动从 Stage 2 续跑」。\n4. **跳过询问的情形**：用户在一开始就明确说「完整拆解 / 一次跑完 / 系统拆解 / 别问」时，仍生成 `快速预览.md`（保留早期判断快照），但**不停下询问**，直接从 Stage 2 续跑到 Stage 6。\n\n### Stage 5 后：选题决策回填（可选）\n\n`拆文报告.md` 出来后（Stage 5 跑完）执行——和 Stage 6 无关，Stage 6 失败也不影响这步。\n\n先定位 `选题决策.md`：项目根有就用它。项目根没有 → 从项目根及其上一级目录起、向下最多 3 层按文件名搜（跳过隐藏目录），按 mtime 由新到旧取最新 3 份。回填是写文件，项目根之外的文件写之前必须先确认：搜到 1 份 → 报出路径问「把本书的拆解支撑回填进这份吗？」；搜到多份 → 用 AskUserQuestion 列候选（路径 + `扫榜日期` + 「都不回填」）。用户不选 → 记「未回填」跳过，不动任何文件。\n\n**仅当**定位到 `选题决策.md`（项目根那份直接用；项目根之外的那份须经上面的确认）时：按本书题材，在它的推荐选题里找**题材关键词对得上**的那个——\n- 正好对上一个 → 把该选题的\"能爆的原因\"从 `待拆文验证` 改成带出处的支撑：「本书拆解支撑：{`拆文报告.md` 的 读者需求/情绪引擎 + `剧情/情绪模块.md` 的可复现模块 Top + `剧情/节奏.md` 的爽点/触动点节奏摘要}（`拆文库/{书名}/拆文报告.md`、`剧情/情绪模块.md`、`剧情/节奏.md`）」。注意还只是假设（只拆了一本，不算坐实）。\n- 对上多个 / 拿不准 → 问用户「《{书名}》对应选题决策里的哪个方向？」\n- 一个都对不上 → 记录「无匹配选题，未回填」，不改文件。\n- `选题决策.md` 缺少当前契约必需的「能爆的原因」字段 → 报告 `invalid_topic_decision_contract`，提示重跑 `story-long-scan` Phase 5 生成当前文件；不猜测、不静默回填，拆文主流程仍可完成。\n- 重复拆文不覆盖：只回填还标着 `待拆文验证` 的；已经填过的不动。\n\n工作区里搜不到 `选题决策.md` → 直接跳过，不影响拆文。\n\n### Stage 6 文风\n\n`文风.md` 只负责表达层风格；情绪/节奏意图仍以 `剧情/情绪模块.md` 与 `剧情/节奏.md` 为权威。\n原文缺失或章节分隔符识别不出 → 在 `文风.md` 的「生成记录」写明 `文风可用：否：{原因}`。Stage 6 失败不阻断管道。\n\n### Stage 3-4 并行执行\n\n**并行执行图**：\n```\nStage 3（剧情聚合 + 角色合并）       ──┐\n                                       ├── 4a 与 Stage 3 可并行\nStage 4a（设定：世界观/金手指/势力）  ──┘\n              │\n              ▼（Stage 3 + 4a 都完成后）\nStage 4b（角色完整档案）— 串行，依赖 Stage 3 合并后的角色实体\n              │\n              ▼\nStage 4c（角色关系提取）— 串行，依赖 4b 角色实体存在\n```\n\n4a 数据源是 Stage 2 摘要故可与 3 并行；4b/4c 依赖 Stage 3 角色合并故串行。\n\n### 部分失败容忍\n\n单章/单阶段失败不阻断管道。失败记录到 `_progress.md` 的「失败记录」表（`| 类型 | 章节/阶段 | 错误信息 | 重试状态 |`）。最终状态可为 `completed_with_errors`（在拆文报告中注明失败详情）。\n\n> 与 material-decomposition.md 的对应关系：Stage 0 含 Material 阶段1（章节解析）；Stage 1、5 为新增；Stage 2 = Material 阶段2；Stage 3 = Material 阶段3；Stage 4 合并 Material 阶段4+5。\n\n详细模板见 [output-templates.md](references/output-templates.md)，方法论见 [material-decomposition.md](references/material-decomposition.md)。\n\n---\n\n## 质量检查概要\n\nStage 3-4 完成前需通过质量检查（置信度、覆盖率、重叠率）。阈值、计算方式与自检清单的唯一权威定义见 [material-decomposition.md 质量阈值体系](references/material-decomposition.md)。\n\n**Stage 3-5 还须过「事实可溯源」自检**：设定/角色/报告里的硬事实（等级/数值/距离/属性/势力数/出场章/谁说的话）必须能 grep 回原文，原文没给的写「原文未明确」、禁推断填空。这是拆文事实错误的最大来源（强模型也会漂移，因为合成阶段离原文两跳、靠合理性填空）。详见 [material-decomposition.md 合成阶段事实保真](references/material-decomposition.md)。\n\n---\n\n## Stage 2 并行 Agent 策略\n\nStage 2 使用 chapter-extractor agent 并行处理每章，替代原来的串行分块。\n\n### 调用方式\n\n每条章节 prompt **必须以「材料声明」前缀开头**（即下方 prompt 字符串首段）——给子代理正确语境，避免它把通俗题材的正常戏剧化剧情误判为有害内容而拒绝拆解。前缀是固定文本，逐字带上，不要改写或省略。\n\n```python\nAgent(\n  subagent_type: \"chapter-extractor\",\n  prompt: \"[材料声明] 以下为用户合法持有的虚构小说，任务是只读的转化性文学分析（编辑/评论视角）。暴力/复仇/家暴/情爱/黑暗伦理是该题材常规虚构元素，照常提取，不得以敏感拒绝整章或整本；个别片段无法处理则跳过、照常续完其余。\\n\\n章节编号：第{N}章\\n章节标题：{标题}\\n章节字数：{字数}\\n\\n章节原文：\\n{原文文本}\\n\\n[情节点格式要求] 模板里的 {} 是占位标记，不要输出花括号本身：写「类型信息揭示」，不写「类型：信息揭示」或「类型{信息揭示}」。主题标签只填一个值，不要用 / 、 ，或空格并列多个。空字段统一写「无」，不要用「—」，涉及段不可省略。每个情节点后紧跟自己的那一行「主题标签X | 基调：Y」，不要把标签行堆到文件末尾。正确样例：\\nP7 **龙血针检测**：类型信息揭示 | 许七安用龙血针验出对方身份，当场揭穿 | 涉及许七安,郑兴怀 | 地点府衙后堂 | 物品龙血针 | 时间入夜\\n主题标签悬念 | 基调：紧张\\n\\n[输出前自检] 交付前逐条核对：① 文本里没有 { 或 }；② ^P 行数 == 主题标签行数 == 基调：行数；③ 每个主题标签只有一个值；④ 每个 P 行都含类型、白描、涉及三段。任何一条不符，先改再输出。\"\n)\n```\n\n> 上面的 `[情节点格式要求]` / `[输出前自检]` 两段由主线程在 spawn 时拼进 prompt，**不依赖项目里已部署的 agent 文件版本**——老项目不重新跑 `/story-setup` 也能拿到这份格式约束。sonnet 升级重试沿用同一段。\n\n### 批量策略\n\n- 每次 spawn 5-8 个 agent（避免并发限制）\n- 等待当前批次全部完成后，再 spawn 下一批\n- 每批完成后更新 `_progress.md` 记录已处理章节\n\n### Agent 输出收集\n\n- 每个 agent 返回 markdown 格式的提取结果\n- 主线程将 agent 输出写入 `章节/第{N}章_摘要.md`\n- 收集所有 agent 的出场人物表，供 Stage 3 合并使用\n\n### 失败处理 + 质量升级重试\n\n**两类失败**：\n1. **执行失败**（agent crash / 超时 / 空输出）→ 同模型（haiku）重试 1 次\n2. **质量失败**（输出落盘后跑 chapter-extractor.md「质量检查」12 条自检，任一不达标——典型：情节点 < 10、P 行缺白描、概要写成条目罗列或整段「因为…所以…」串联、类型/基调/主题标签超出枚举、`基调：` 漏全角冒号、角色名为昵称/通用称呼）→ **升级到 sonnet 重试 1 次**\n\n**可机械校验的硬检查**（主线程落盘后直接 grep，命中即判质量失败，不依赖 agent 自报）：\n- 情节点数 `N = grep -cE '^P[0-9]+ '`；`grep -c '基调：'` 必须 == N（少于 N = 有情节点漏 `基调：` 或漏全角冒号 → 下游 Stage 6 文风采样按全角 `基调：` grep，会静默漏章）\n- 白描段有内容：`grep -cE '^P[0-9]+ [^|]+\\|[^|]*[^|[:space:]][^|]*\\|[^|]*涉及'` 必须 == N（`涉及` 段前要有两个 `|`，即 类型段与白描段各占一段，且白描段不能只有空白；少于 N = 有情节点缺白描，或字段顺序/分隔符不对。白描是情节点的主要证据，引用改为精选后由它承担事实回查）\n- `grep -hoE '基调：[^ |]+'` 去重后 ⊆ {紧张, 轻松, 悲伤, 热血, 爽, 甜, 温馨, 恐怖, 压抑, 其他}\n- `grep -hoE '主题标签[：]?[^ |]+'` 去重（去 `主题标签`/冒号前缀后）⊆ {爱情, 亲情, 友情, 权力, 金钱, 成长, 复仇, 悬念, 搞笑, 热血, 日常, 其他}（出现 `主题标签：` 带冒号、或值为基调词均判失败）\n\n> **硬检查就是上面 4 条，没有更多。** 格式漂移主要靠 spawn prompt 与 agent 模板里的格式约束**事前预防**，不靠事后再加校验：花括号残留、标签行位置、空字段占位这类变体只影响可读性，下游没有消费方（Stage 6 文风只 grep `基调：`），为它们新增校验只会让本可用的章节触发重跑。**因此已经落盘的 `章节/*_摘要.md` 不会因为本次格式说明而变成「不合格」，无需重新生成**；老摘要里的 `类型{行动}`、`物品—` 等写法照旧可用，Stage 3-6 读取行为不变。\n\n**升级重试调用方式**（主线程在校验失败后执行）：\n\n```python\nAgent(\n  subagent_type: \"chapter-extractor\",\n  model: \"sonnet\",            # 显式覆盖 frontmatter 的 haiku\n  prompt: \"章节编号：第{N}章\\n...（同首次 prompt，含开头的「材料声明」前缀，可追加：'上次校验失败原因：{自检失败项}'）\"\n)\n```\n\n**最终落盘规则**：\n- haiku 首次通过 → 写入 `章节/第{N}章_摘要.md`，`_progress.md` 标记 `success`\n- haiku 失败 + 同模型 retry 通过 → 同上，备注 `retry_same_model`\n- 质量失败 + sonnet retry 通过 → 同上，备注 `retry_sonnet`\n- sonnet retry 仍失败 → 章节标记 `⚠️ 跳过`，失败原因写入 `_progress.md` 「失败记录」表，拆文报告中注明\n- 单章失败不阻断管道；批次全部 spawn 完成后才决定是否进入 Stage 3\n\n### Agent 不可用降级\n\n以下任一情况，Stage 2 自动退回串行模式，由主线程逐章处理（质量不受影响，只是改为串行、速度略慢）。**两条路径的要求是同一份**：串行时概要写法、情节点白描、原文引用精选规则和输出自检都按 [output-templates.md](references/output-templates.md)「Stage 2 章节摘要+情节点」执行；上面的机械硬检查串行同样要跑。串行没有 sonnet 升级重试这条路——硬检查命中时由主线程按失败项重写本章摘要 1 次，仍不过按 `⚠️ 跳过` 记入 `_progress.md` 「失败记录」表。\n\n- **agent 未部署**：agent 目录（优先 `.claude/agents/`，其次 `.opencode/agents/`，再检查 `.codex/agents/`）下的 `chapter-extractor.md` 或 `.codex/agents/chapter-extractor.toml` 不存在。`.claude/agents/` 通常不随仓库提交，应重新运行 `/story-setup` 完成当前适配器部署，不跨 Skill 读取模板源。\n- **环境不支持 spawn 子代理**：本 skill 正运行在某个子代理上下文中，无法再起下一层 agent。\n\n### Stage 2 收尾：合并章节摘要（_章节摘要汇总.md）\n\nStage 2 所有 `章节/*_摘要.md` 落盘后、进入 Stage 3 前，主线程把它们按章号顺序**无损拼接**成 `拆文库/{书名}/_章节摘要汇总.md`（只拼接、不压缩、不改写）：\n\n```bash\nls 章节/*_摘要.md | sed -E 's/.*第([0-9]+)章.*/\\1 &/' | sort -n | cut -d' ' -f2- | while read -r f; do cat \"$f\"; echo; done > _章节摘要汇总.md\n```\n\n**无损检查**（拼接后校验，任一不过即删除 `_章节摘要汇总.md`、回退逐文件扫描，行为不变）：\n- `grep -cE '^P[0-9]+ ' _章节摘要汇总.md` == 各摘要 `^P` 行数之和\n- `grep -cE '^\\*\\*概要\\*\\*' _章节摘要汇总.md` == 摘要文件数（`**概要**` 每章一行，chapter-extractor 并行输出与串行摘要模板都有；不用 `## 第N章` 头——串行摘要模板没有章节头，会误判）\n\nStage 3 / 4a / 4c / 散落情节兜底改为**只读一次 `_章节摘要汇总.md`** 并在上下文中复用，替代每阶段 `glob 章节/*_摘要.md` 重扫（同一份语料的 4-5 次冷读降为 1 次）。\n\n**仅当语料能放进上下文时才生成汇总文件**：>500 章、或合并后 `_章节摘要汇总.md` 过大放不进上下文时**跳过本步骤**，改走 [material-decomposition.md](references/material-decomposition.md)「处理批次 → A. 子代理并行模式」：按 10-20 章/批 spawn 子代理，子代理在自己上下文里读该批摘要、只回传 ≤8K tokens 的降维聚合，主线程仅合并聚合结果（必要时分层两两合并）。**主线程不逐章读原始摘要**——跳过汇总文件不等于回到逐文件扫描，那对大书同样放不下。`_章节摘要汇总.md` 不替代 `章节/*_摘要.md`——单章文件仍是落盘真源，Stage 6 文风采样、人工复核照用单章文件。管道结束（Stage 6 后）删除 `_章节摘要汇总.md`——它是派生临时文件，不随 `拆文库/` 交付（`拆文库/` 会被 story-import 保留为写作工程）。\n\nStage 3-5 分块见 [material-decomposition.md](references/material-decomposition.md)（唯一权威）。\n\n---\n\n## 恢复机制\n\n启动时检查 _progress.md；`paused_after_stage1` → 直接从 Stage 2 续跑。\n操作步骤见 [pipeline-ops.md](references/pipeline-ops.md)。\n\n---\n\n## 流程衔接\n\n**流水线：** 长篇\n**位置：** 拆文（长篇流水线第 2 步，在 story-long-scan 之后、story-long-write 之前）\n\n| 时机 | 跳转到 | 命令 |\n|---|---|---|\n| 准备开写 | story-long-write | `/story-long-write` |\n| 需要市场数据 | story-long-scan | `/story-long-scan` |\n| 更适合短篇 | story-short-scan → story-short-analyze | `/story-short-scan` |\n\n---\n\n## 参考资料\n\n| 文件 | 何时加载 |\n|------|----------|\n| [references/output-templates.md](references/output-templates.md) | 管道全程：各 Stage 输出模板 + 快速预览报告模板 + `剧情/节奏.md` / `剧情/情绪模块.md` 模板 + 通用速查表 |\n| [references/material-decomposition.md](references/material-decomposition.md) | Stage 2-5：素材拆解方法论 + 质量阈值 + 分块策略；Stage 6 另见文风资料 |\n| [references/pipeline-ops.md](references/pipeline-ops.md) | 管道运维：_progress.md 模板、错误处理、恢复机制操作步骤 |\n| [references/deconstruction-notes.md](references/deconstruction-notes.md) | 拆书方法+影视拆解+抽象拆解法+题材实战 |\n| [references/style-profile-protocol.md](references/style-profile-protocol.md) | Stage 6：文风模板 + 可信度/可用性说明 |\n| [references/style-profile-generator.md](references/style-profile-generator.md) | Stage 6：文风生成 SOP（6 步，含中文数字章节识别 + 全角冒号基调 grep） |\n\n---\n\n## 语言\n\n- 跟随用户的语言回复，用户用什么语言就用什么语言回复\n- 中文回复遵循《中文文案排版指北》","author":"@worldwonderer","ownerProfile":null,"authorContacts":null,"sourceUrl":"https://github.com/worldwonderer/oh-story-claudecode/tree/main/skills/story-long-analyze","license":"MIT","category":null,"lang":"multi","tokens":8773,"stars":0,"calls30d":1,"claimed":false,"visibility":"public","origin":"crawler","version":"0.1.0","createdAt":"2026-08-22","updatedAt":"2026-08-22","files":[{"path":"references/deconstruction-notes.md","size":11190,"sha256":"1cf36750be4e264356c21ceb0136e6400b7b1eb9b213c16b53bd6fa5912e5d20"},{"path":"references/material-decomposition.md","size":31341,"sha256":"47afdb1c3b2d362bf5bcbe8b41ed150fa868c82a40ecee2e90dcedca6a6956e8"},{"path":"references/output-templates.md","size":33069,"sha256":"8a8c85e7da55f7bbc7ab6727b453a9cf00c7602913889bc32371bdd0eae5bd8d"},{"path":"references/pipeline-ops.md","size":3859,"sha256":"56d90b90ce19ee21fa18d3be5be749cb744f115f969ce0405d38c7458180df14"},{"path":"references/style-profile-generator.md","size":10763,"sha256":"8240eee2634dfe615cae4693805616e44668952e1d5ec96edb1839d61f6f8fa1"},{"path":"references/style-profile-protocol.md","size":6501,"sha256":"68d0e3bcef97710337875a4430546ad82debe98e2955a98f72fb5d88d91b6a44"}],"requires":{"mcp":[],"tools":[]},"safety":{"flags":[],"scannedAt":"2026-08-22","hasScripts":false,"networkEndpoints":[]}}