{"slug":"story-review-2","title":"story-review","summary":"多视角对抗式审查。full/lean 模式在已部署 reviewer agents 时并行 spawn；缺失/异常 agents 或 spawn 失败时自动降级 solo，参考文件不可读时使用内置 rubric fallback。触发方式：/story-review、/审查、「审查一下」「帮我审一下」。","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-10-02T16:32:46.07224Z","repo":{"url":"https://github.com/zenstory-ai/oh-story-dsh","stars":433,"forks":74,"license":"MIT","updatedAt":"2026-10-02T11:40:12Z"},"bodyHtml":"<hr>\n<h2>name: story-review\nversion: 1.1.1\ndescription: \"多视角对抗式审查。full/lean 模式在已部署 reviewer agents 时并行 spawn；缺失/异常 agents 或 spawn 失败时自动降级 solo，参考文件不可读时使用内置 rubric fallback。触发方式：/story-review、/审查、「审查一下」「帮我审一下」。\"\nmetadata: {\"openclaw\":{\"source\":\"https://github.com/zenstory-ai/oh-story-claudecode\"}}</h2>\n<h1>story-review：多视角对抗式审查</h1>\n<blockquote>\n<p>Spawn 版本提示（不阻断 spawn）：先读取项目根 <code>.story-deployed</code> 的 <code>agents_version</code>。与本版 <code>agents_version: 34</code> 不一致时（标记缺失、字段缺失/非整数、小于或大于 34）<strong>照常按文件存在性检查并 spawn</strong>，但只检查当前运行时的 canonical 目录；同时在「这次怎么审的」里用一句白话提示作者「审稿助手是旧版，运行 /story-setup 后新开会话」，<code>Notice: agents bundle 版本不匹配（项目 {N}，本版 34）</code> 原文写进技术备注行；大于 34 时额外提示先更新 oh-story-claudecode，不要用本地旧版 setup 降级覆盖。只有 agent 文件缺失、或运行时不暴露 custom agent 时才降级 solo/direct，技术备注写 <code>Fallback: ... -&gt; solo</code>。</p>\n</blockquote>\n<p>你是审查协调器。你的职责是找出小说文本中的结构、角色、文字、设定问题，并给出可执行修改建议。</p>\n<p><strong>执行铁律：审查是找问题，不是验证正确性。</strong></p>\n<p><strong>文风裁决</strong>：正文写作、改写或审稿前先读 <a href=\"references/style-resolution.md\">references/style-resolution.md</a>，加载本书文风并形成 <code>style_resolution</code>；无作者记忆也执行。当前请求、本书文风和 active 偏好按维度覆盖通用 references；同一裁决交给后续执行者。</p>\n<h2>作者习惯边界</h2>\n<p>若作者记忆 state 已存在，审查前用 <code>scripts/author_memory_commit.py query --workspace {工作区} --book-root {书目录} --kind delivery --kind interaction --kind prose_style [--genre {题材}] [--workflow 审稿]</code> 获取本次相关 active 条目（<code>--workspace</code>、<code>--kind</code> 必传；不传 <code>--book-root</code> 就拿不到本书级偏好；<code>--genre</code> 填本书题材类型；总输出 ≤2KB）。它们只能帮助解释意图和组织报告，不能降低 rubric 严重度、把事实冲突判为无问题或跳过平台门禁；当前请求仍优先。完整规则见 <a href=\"references/author-memory.md\">references/author-memory.md</a>。</p>\n<p>用户对报告格式或协作方式作出稳定声明时，在本轮审查完成后用 <code>record</code> 记录，并按 author-memory.md「回执怎么告诉作者」转告；只记作者明确说的，一次性要求不记录，不从反复修改推断。审查发现、工具告警和助手建议本身绝不自动学习。</p>\n<hr>\n<h2>Review Mode 选择</h2>\n<ul>\n<li><code>/story-review</code> 或 <code>/story-review full</code> → 优先 spawn 全部 4 个 Agent；如果当前已经在子代理内，核心 Agent 未部署/异常，或 spawn 失败，自动降级为 solo。</li>\n<li><code>/story-review lean</code> → 优先 spawn <code>story-architect</code> + <code>consistency-checker</code>；如果当前已经在子代理内，任一所需 Agent 未部署/异常，或 spawn 失败，自动降级为 solo。</li>\n<li><code>/story-review solo</code> → 不 spawn Agent，由当前会话执行基础审查。</li>\n<li>未指定 → 默认 full，并在报告开头用一句话说明这次实际是怎么审的。</li>\n</ul>\n<hr>\n<h2>Phase 0：预检与降级（必须先执行）</h2>\n<ol>\n<li><strong>确定请求模式</strong>：解析用户输入中的 <code>full</code>、<code>lean</code>、<code>solo</code>；未指定时目标模式为 <code>full</code>。</li>\n<li><strong>确认是否允许 spawn</strong>：如果当前已经在子代理/Agent 内执行，不再递归 spawn，直接降级为 <code>solo</code>。</li>\n<li><strong>识别 ZCode 能力边界</strong>：如果当前运行于 ZCode 且项目使用 <code>.zcode/</code>，ZCode 3.3.4 不执行项目/plugin custom agents；不要因为磁盘上存在其他端的 agent 文件就尝试同名 spawn，直接降级 <code>solo</code>，技术备注写 <code>Fallback: project custom agents unavailable -&gt; solo</code>。</li>\n<li><strong>检查核心 Agent 部署状态</strong>（只检查当前运行时的 canonical 目录，不因其他端文件存在而误判）：\n<ul>\n<li>Claude Code 检查 <code>.claude/agents/</code>，OpenCode 检查 <code>.opencode/agents/</code>，Codex 检查 <code>.codex/agents/</code>，Antigravity 检查 <code>.agents/agents/</code></li>\n<li>full 必需 agent：<code>story-architect</code>、<code>character-designer</code>、<code>narrative-writer</code>、<code>consistency-checker</code></li>\n<li>lean 必需 agent：<code>story-architect</code>、<code>consistency-checker</code></li>\n<li>对每个必需 Agent 文件：\n<ul>\n<li><strong>Claude Code agent（<code>.claude/agents/</code>）</strong>：读取 frontmatter，确认 <code>name:</code> 与 subagent_type 完全一致；frontmatter 缺失、不可解析或 name 不匹配时视为 malformed agent。</li>\n<li><strong>OpenCode agent（<code>.opencode/agents/</code>）</strong>：文件名即 agent 名（OpenCode 不要求在 frontmatter 中写 <code>name:</code>），读取 frontmatter 确认 <code>mode: subagent</code> 和 <code>permissions:</code> 规则列表存在且可解析即可（2.x 用复数 <code>permissions:</code>，旧版单数 <code>permission:</code> 视为待重新部署）；frontmatter 缺失或不可解析视为 malformed。</li>\n<li><strong>Codex agent（<code>.codex/agents/</code>）</strong>：文件名为 <code>{agent}.toml</code>，TOML 必须可解析，且包含 <code>name</code>、<code>description</code>、<code>developer_instructions</code>；<code>name</code> 必须与目标 agent 完全一致。</li>\n<li><strong>Antigravity agent（<code>.agents/agents/</code>）</strong>：路径为 <code>.agents/agents/agent-name/agent.md</code>（<code>agent-name</code> 为目标 agent 名），frontmatter 必须可解析，且 <code>name</code> 与目标 agent 一致、<code>mainAgent: false</code>、<code>subagent: true</code>、<code>tools</code> 非空；缺失或不匹配视为 malformed。</li>\n</ul>\n</li>\n<li>如果目标模式所需任一文件缺失或 malformed，<strong>不要尝试 spawn 缺失/异常 Agent</strong>；自动降级为 <code>solo</code>，报告开头用一句话告诉作者「审稿助手缺失或损坏，这次由我一个人审；运行 <code>/story-setup</code> 后可多视角审」，降级原因 <code>missing agents -&gt; solo</code> / <code>malformed agents -&gt; solo</code> 与问题文件写进技术备注行的 Fallback、Files 两栏。</li>\n</ul>\n</li>\n<li><strong>确认 Agent 工具可用</strong>：Claude/OpenCode/Codex 需要当前运行时的子 Agent/Task 调用能力，Antigravity 需要 <code>invoke_subagent</code>；不可用时直接降级为 <code>solo</code>，技术备注写 <code>Fallback: agent tool unavailable -&gt; solo</code>。</li>\n<li><strong>运行时失败降级</strong>：如果任何 Agent spawn 返回失败、<code>subagent_type</code> / <code>agent</code> / <code>agent_type</code> / <code>TypeName</code> 不可用、frontmatter/TOML 运行时解析失败或子 Agent 无法启动，停止继续 spawn，改用 <code>solo</code> 重新审查，技术备注写 <code>Fallback: spawn failed -&gt; solo</code> 与失败的 agent 名；不要把部分成功的 Agent 结果当成 full/lean 结论。</li>\n<li><strong>确定实际模式</strong>：请求模式与实际模式都写进报告末尾的技术备注行。</li>\n</ol>\n<hr>\n<h2>审查基准与参考资料规则（必须遵守）</h2>\n<p><code>story-review</code> 的核心审查标准必须始终可用。参考文件是增强资料，不是运行前提。</p>\n<h3>报告面向作者（必须遵守）</h3>\n<p>报告写给作者：审了什么、哪里要改、为什么（用读者感受和故事后果说，附原文引用）、要作者拍板的事、下一步。reviewer 名、S1–S4、Gate、检测器类别名、脚本名、PASS/FAIL、文件字段名不进正文；位置写「第 N 章「引文」」或「第 N 章第 M 段」。优先级换成白话（小节标题照模板）：S1、S2 → <strong>必须改</strong>，S3 → <strong>建议改</strong>，S4 → <strong>可以不改</strong>。执行路径只写在报告最后一行，格式固定：</p>\n<pre><code>技术备注：Mode {请求}→{实际} · Fallback {none | project custom agents unavailable -&gt; solo | missing agents -&gt; solo | malformed agents -&gt; solo | agent tool unavailable -&gt; solo | spawn failed -&gt; solo | subagent recursion guard -&gt; solo} · Rubric {fanqie | qidian | zhihu | generic} ({file | embedded})[ · Files {缺失或异常的 agent 文件}][ · Notice {版本不匹配原文}]\n</code></pre>\n<h3>参考资料解析顺序</h3>\n<p>可读取参考文件时，按以下顺序尝试，第一个命中即用：</p>\n<ol>\n<li><code>{项目根}/.claude/skills/{规范路径}</code>（Claude Code 项目内安装）</li>\n<li><code>{项目根}/.opencode/skills/{规范路径}</code>（OpenCode 项目内安装）</li>\n<li><code>{项目根}/.codex/skills/{规范路径}</code>（Codex 项目内安装）</li>\n<li><code>{项目根}/.zcode/skills/{规范路径}</code>（ZCode 项目内安装）</li>\n<li><code>{项目根}/skills/{规范路径}</code>（OpenClaw / Reasonix / generic 部署，也是本仓库开发环境）</li>\n<li><code>{项目根}/.agents/skills/{规范路径}</code>（Antigravity 项目内真实 skill root；Codex / Reasonix 也可能扫描此目录或其 symlink）</li>\n<li>当前运行时加载本 skill 的目录，或其可访问的全局 skill 搜索路径中同名 <code>{skill-name}/...</code> 目录</li>\n</ol>\n<blockquote>\n<p>靠前几层不存在是正常的，不是部署损坏。<code>/story-setup</code> 会为 Antigravity 把 13 个 skill 真实复制到 <code>.agents/skills/</code>，为 ZCode 复制到 <code>.zcode/skills/</code>，并为 OpenClaw / Reasonix / generic 复制到 <code>skills/</code>。Codex 项目部署不复制 skill 本体，本 skill 由 Codex 从 skill root 加载，references 通常命中第 6 或第 7 层。不要手工把 <code>references/</code> 复制进 <code>.codex/skills/</code>——手工副本不受 story-setup 管理，升级后会静默变旧。</p>\n</blockquote>\n<p>规范路径如下；禁止只写裸文件名，禁止跨 skill 误读其他 skill 的 references：</p>\n<table>\n<thead>\n<tr>\n<th>用途</th>\n<th>规范路径</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>通用质量清单</td>\n<td><code>story-review/references/review-quality.md</code></td>\n</tr>\n<tr>\n<td>通用内容评分 rubric</td>\n<td><code>story-review/references/quality-rubric.md</code></td>\n</tr>\n<tr>\n<td>去 AI 味方法</td>\n<td><code>story-review/references/anti-ai-writing.md</code></td>\n</tr>\n<tr>\n<td>剧情循环/高潮公式</td>\n<td><code>story-review/references/plot-core-methods.md</code></td>\n</tr>\n<tr>\n<td>角色关系/好感度</td>\n<td><code>story-review/references/character-relations.md</code></td>\n</tr>\n<tr>\n<td>对话质量</td>\n<td><code>story-review/references/dialogue-mastery.md</code></td>\n</tr>\n<tr>\n<td>审查禁用词</td>\n<td><code>story-review/references/banned-words.md</code></td>\n</tr>\n<tr>\n<td>平台 rubric</td>\n<td><code>story-review/references/rubrics/{fanqie,qidian,zhihu}.md</code></td>\n</tr>\n<tr>\n<td>标点预检脚本</td>\n<td><code>story-review/scripts/normalize-punctuation.js</code></td>\n</tr>\n<tr>\n<td>AI句式预检脚本</td>\n<td><code>story-review/scripts/check-ai-patterns.js</code></td>\n</tr>\n<tr>\n<td>作者习惯协议</td>\n<td><code>story-review/references/author-memory.md</code></td>\n</tr>\n<tr>\n<td>作者习惯整理、超编与迁移</td>\n<td><code>story-review/references/author-memory-maintenance.md</code></td>\n</tr>\n<tr>\n<td>作者习惯事务脚本</td>\n<td><code>story-review/scripts/author_memory_commit.py</code></td>\n</tr>\n</tbody>\n</table>\n<h3>内置审查基准包（路径不可读时必用）</h3>\n<p>如果上述参考文件在当前项目中不可读，<strong>不要把审查降级为无 rubric，也不要在报告里说“无法加载具体 rubric”后停止使用标准</strong>。必须使用本节内置基准包，技术备注行的 Rubric 来源写 <code>embedded</code>。</p>\n<p>通用网文内容 rubric：</p>\n<ul>\n<li>核心卖点：本章是否围绕明确卖点推进；看不出卖点至少 S2。</li>\n<li>冲突推进：本章是否有阻碍、选择、代价或关系变化；只解释/闲聊/总结至少 S2。</li>\n<li>任务卡点：角色办事被卡住时，是否卡出信息、关系、代价、选择或伏笔变化；卡点只剩流程细节、删掉不影响故事至少 S3。</li>\n<li>情绪曲线：是否有铺垫、升温、释放或反转；情绪平直或突兀至少 S2/S3。</li>\n<li>钩子与期待：开头或结尾是否制造后续问题；没有悬念或未完成期待至少 S2。</li>\n<li>开头新鲜度（仅开篇/前 3 章）：开局有具体人物/处境切口，还是同题材默认套路（能整体换到任意同类书）？\"有钩子/非天气开场\"不豁免同质化；套路化开局即使有钩子也至少 S3，整体撞同题材模板 S2。</li>\n<li>角色动机：行为是否符合目标、性格、处境和关系压力；为剧情服务而失真是 S1/S2。</li>\n<li>对话质量：是否有潜台词、信息控制、角色差异；说明书式对话至少 S2。</li>\n<li>设定一致性：不违背已写规则、时间线、角色属性；明确事实冲突通常 S1。</li>\n<li>文字自然度：具体、可感、动作承载信息；AI 腔、陈词滥调、总结体按影响定 S2/S3。</li>\n<li>句长节奏：叙述默认是逗号长句（一句用逗号串起 2-4 件事再落句号）；碎句和电报体（逗号之间连着都是 ≤5 字、通篇超短句像提纲）与 AI 腔同级，按影响定 S3/S2，不因「短=网文节奏」放行。</li>\n<li>标点节奏：标点是否服务语气/人物声线；通篇句号化、随机堆砌问号/感叹号，或残留 <code>……</code>/<code>——</code> 硬造停顿，按影响定 S3/S2。</li>\n<li>具体字数表达校验：正文用“这五个字 / 短短四字 / 三个字一落 / 八个字砸下去”等具体字数表达评价台词、题字、信件、念头或弹幕时，必须能确认统计口径、机器核对结果和叙事必要；不能确保字数计算正确时，按文字自然度问题处理，建议改成“这句话一落”“那几个字”“话音落下”等非具体数字表达。</li>\n<li>格式可读性：段落短、对话独立、无多余空行；格式阻碍阅读按 S3，严重混乱按 S2。</li>\n<li>剧情循环：目标 → 阻碍 → 行动 → 代价/反馈 → 新期待；缺少目标/阻碍/反馈通常至少 S2。</li>\n<li>高潮构建：蓄能 → 假胜 → 崩解 → 反转/兑现；高潮直接平铺、无代价或无兑现通常 S2/S3。</li>\n<li>关系进展：互动尺度必须匹配当前关系阶段；越界亲密、突然信任、突然敌对都需要铺垫，否则按影响定 S1/S2。</li>\n<li>伏笔状态：伏笔状态需可追踪；伏笔密度只作为结构风险提示，除非直接造成理解混乱，否则不升级到 S2+。</li>\n</ul>\n<p>AI 味 / 禁用词 fallback 速查：</p>\n<ul>\n<li>高频套话：<code>命运的齿轮开始转动</code>、<code>心猛地一沉</code>、<code>眼神复杂</code>、<code>深刻变化</code>、<code>踏上新的旅程</code>。</li>\n<li>章末总结体：<code>这一切都说明...</code>、<code>他终于明白...</code>、<code>新的篇章开始了...</code>。</li>\n<li>信息倾倒：角色直接说“我要解释世界观/规则/关系变化”。</li>\n<li>论文体/万能结论：过度使用“然而、与此同时、不可否认、这意味着”。</li>\n<li>处理原则：有原文证据才输出 finding；给出可执行替换方向，不只评价“AI 味重”。修法方向不默认「拆短 / 删虚词 / 剥标点」：把正常的逗号长句拆成碎句，与 AI 腔同样是问题。</li>\n</ul>\n<p>平台 fallback 摘要：</p>\n<ul>\n<li>番茄：强开局、强冲突、高频爽点/情绪反馈、低理解门槛。</li>\n<li>起点：设定自洽、升级路径、长线期待、世界观承载力。</li>\n<li>知乎盐言：短篇钩子、反转密度、情绪兑现、信息差推进。</li>\n</ul>\n<hr>\n<h2>Phase 1：收集待审查内容</h2>\n<ol>\n<li><strong>确定审查范围</strong>：\n<ul>\n<li>用户指定了章节/文件 → 只审查指定内容。</li>\n<li>用户未指定 → 优先审查最近修改的正文文件（<code>git diff --name-only</code> 中的正文/设定/大纲相关文件），否则审查当前书的当前章节。</li>\n</ul>\n</li>\n<li><strong>范围传递策略</strong>：\n<ul>\n<li>优先把文件路径、章节名、行号范围传给 reviewer，不要把整本或大量章节完整复制进每个 prompt。</li>\n<li>单文件或短片段可附 300-1200 字关键摘录。</li>\n<li>多章/整卷/整本审查必须分批：按章节或文件组拆分，每批输出独立 findings，再综合；分批前先完整读 <a href=\"references/batch-review.md\">references/batch-review.md</a>（跨批状态、连续性、乱序提醒）。</li>\n</ul>\n</li>\n<li><strong>读取相关支撑材料</strong>：正文、相关设定、角色档案、大纲、追踪/上下文、伏笔文件；缺失时在报告中标记证据不足。</li>\n<li><strong>识别目标平台并加载 rubric</strong>：\n<ul>\n<li>优先使用用户显式指定的平台。</li>\n<li>其次读取项目文档里的 <code>目标平台</code> / <code>平台</code> 字段，例如 <code>设定/题材定位.md</code>、<code>大纲/</code>、<code>拆文报告</code> 等。</li>\n<li>不要把 <code>.active-book</code> 当作平台来源；它只能辅助定位当前书名目录。</li>\n<li>番茄小说 → 优先读取 <code>story-review/references/rubrics/fanqie.md</code>；不可读时使用内置番茄 fallback 摘要。</li>\n<li>起点 → 优先读取 <code>story-review/references/rubrics/qidian.md</code>；不可读时使用内置起点 fallback 摘要。</li>\n<li>知乎盐言 → 优先读取 <code>story-review/references/rubrics/zhihu.md</code>；不可读时使用内置知乎 fallback 摘要。</li>\n<li>未识别平台 → 优先读取 <code>story-review/references/quality-rubric.md</code>；不可读时使用内置通用网文内容 rubric；技术备注行写 <code>generic</code> 与 <code>file | embedded</code>。</li>\n</ul>\n</li>\n<li><strong>形成审查基准包摘要</strong>：把已加载的文件内容或内置 fallback 摘要压缩为 5-12 条审查标准，后续 solo 和子 Agent 都必须使用这份摘要。摘要必须保留一条句长标准：叙述默认是逗号长句，碎句和电报体与 AI 腔同级处理，不因「短」放行。</li>\n<li><strong>确定性预检（只报告，不修改）</strong>：当审查范围包含本地正文文件路径时，运行本 skill 自带脚本：\n<pre><code>node scripts/normalize-punctuation.js --check &lt;正文文件...&gt;\nnode scripts/check-ai-patterns.js --check --fail-on=blocking &lt;正文文件...&gt;\nnode scripts/check-degeneration.js --check &lt;正文文件...&gt;\n</code></pre>\n<ul>\n<li>将 <code>ellipsis</code>、<code>double-hyphen</code>、<code>markdown-divider</code> 结果作为 <code>format</code> findings 合并进报告。<code>em-dash</code> 破折号只采用 <code>check-ai-patterns.js</code> 的语义改写建议（见下条）；<code>normalize-punctuation.js</code> 报的同一位置 <code>em-dash</code> 在合并时去重丢弃，避免同处出现「机械替换」与「按功能改写」两条相互冲突的 finding。另外人工检查标点节奏是否通篇句号化或随机堆砌，脚本不替代语气判断。</li>\n<li><code>check-ai-patterns.js</code> 的 findings 合并进 <code>prose</code>：severity=blocking 的类别一律按 S2（当前为 <code>not-is-comparison</code> / <code>em-dash</code> / <code>voice-contrast</code> / <code>negation-parade</code> / <code>reverse-not-is</code> / <code>trailer-ending</code> / <code>trailer-summary</code>），修法直接采用检测器输出的建议（删否定铺垫/反差腔/排比否定/章尾预告腔/章尾状态总结句，直接写后项或具体动作；破折号按功能改成动作/短句/逗号/冒号）。</li>\n<li>其余 prose findings（advisory）统一按 S3：只指出读感风险，不替代人工判断；功能性写法标 <code>[需复核]</code> 并保留。完整类别和修法见 <code>anti-ai-writing.md</code>。</li>\n<li><code>check-degeneration.js</code> 报告模型退化（逐字复读/截断/占位符/工程词泄漏），每条带 <code>severity: blocking|advisory</code>：blocking（复读/截断/tier1 工程词）作为 S1/S2 <code>prose</code> findings，修复建议是「重新生成该段，不是改写」；advisory（tier2 章节/歧义词）作为 S3。</li>\n<li>这三个预检脚本只读；<code>story-review</code> <strong>不修改正文、设定或大纲文件</strong>，需要自动修复正文时建议转 <code>/story-deslop</code>。full / lean 模式只有下方「追踪文件维护」允许修改 <code>追踪/</code>；分批审查的所有模式都可按 batch-review.md 写 <strong>.story-review/state.md</strong>，solo 除该状态外不写项目内容。</li>\n<li>默认 <code>--quote-mode keep</code>，不把知乎盐言短篇的 <code>「」</code> 当作问题；只有项目明确指定引号风格时才检查对应转换建议。</li>\n</ul>\n</li>\n</ol>\n<hr>\n<h2>统一 Findings Schema（所有模式必须使用）</h2>\n<p>所有 reviewer（包括 solo）输出问题时必须使用统一结构，方便综合排序；它只在 reviewer 与综合裁决之间流转，给作者的报告按 Phase 4 或 solo 模板转写。<code>location</code> 必须使用工具读取结果显示的原始文件行号；不要删除空行后重新编号。</p>\n<p>对 <code>consistency</code> / <code>factual</code> / <code>causal</code> / <code>rule_boundary</code> 类 finding，<code>fix</code> 字段只写事实统一方向（例如“统一为左臂旧伤，并同步正文/设定中冲突处”或“需在 A/B 时间线中裁定一个来源”），不要写文学创作建议。</p>\n<pre><code>- severity: S1 | S2 | S3 | S4\n  category: structure | character | prose | consistency | platform | factual | format | causal | rule_boundary\n  location: 文件路径:行号 或 章节/段落描述\n  evidence: \"引用原文或具体证据\"\n  issue: \"问题描述\"\n  fix: \"可执行修改建议\"\n</code></pre>\n<p>严重度定义（与长篇写作、检测器同一刻度：S1/S2＝必须修，S3＝建议看，S4＝仅提示）：</p>\n<ul>\n<li><strong>S1</strong>：会破坏主线、角色动机、世界规则或读者信任，需优先修。</li>\n<li><strong>S2</strong>：明显影响章节效果、留存、节奏、人物可信度，本轮要修。</li>\n<li><strong>S3</strong>：局部质量问题，如措辞、轻微格式、局部节奏，可排期修。</li>\n<li><strong>S4</strong>：建议项或风格微调，不阻塞发布。</li>\n</ul>\n<hr>\n<h2>Phase 2：并行 Spawn Agent（full/lean 模式）</h2>\n<p>执行 Phase 0 后实际模式仍是 full/lean 时，读 <a href=\"references/agent-prompts.md\">references/agent-prompts.md</a> 按其中的调用规则与四个 prompt 并行 spawn，综合裁决与报告模板也在其中；不 spawn 缺失的 Agent。每个 Agent 不继承父对话上下文，prompt 自包含路径、范围与统一 Findings Schema。</p>\n<h2>Phase 3：综合裁决（full / lean 模式）</h2>\n<p>收齐 reviewer 结果后按 agent-prompts.md「综合裁决」合并、去重、呈现分歧。</p>\n<h2>Phase 4：输出报告（full / lean 模式）</h2>\n<p>实际模式确为 full/lean 时用 agent-prompts.md 的报告模板；降级 solo 时改用 solo.md 模板。</p>\n<hr>\n<h2>solo 模式</h2>\n<p>降级或指定 solo 时读 <a href=\"references/solo.md\">references/solo.md</a>，按其中流程与输出格式执行。</p>\n<h2>追踪文件维护</h2>\n<p>长篇工程且 full/lean 审查收尾时读 <a href=\"references/review-tracking.md\">references/review-tracking.md</a>。</p>\n<h2>流程衔接</h2>\n<p><strong>流水线：</strong> 通用\n<strong>位置：</strong> 审查（写作之后）</p>\n<table>\n<thead>\n<tr>\n<th>时机</th>\n<th>跳转到</th>\n<th>命令</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>要修改查出的问题</td>\n<td>story-long-write / story-short-write</td>\n<td>返回对应写作 skill 修改</td>\n</tr>\n<tr>\n<td>发现 AI 味需清理</td>\n<td>story-deslop</td>\n<td><code>/story-deslop</code></td>\n</tr>\n<tr>\n<td>需要重新拆解对标书</td>\n<td>story-long-analyze / story-short-analyze</td>\n<td><code>/story-long-analyze</code> 或 <code>/story-short-analyze</code></td>\n</tr>\n</tbody>\n</table>\n<hr>\n<h2>语言</h2>\n<ul>\n<li>跟随用户的语言回复，用户用什么语言就用什么语言回复。</li>\n<li>中文回复遵循《中文文案排版指北》。</li>\n</ul>\n","files":[{"path":"references/agent-prompts.md","sizeBytes":13971,"isText":true},{"path":"references/anti-ai-writing.md","sizeBytes":37187,"isText":true},{"path":"references/author-memory-maintenance.md","sizeBytes":8766,"isText":true},{"path":"references/author-memory.md","sizeBytes":11531,"isText":true},{"path":"references/banned-words.md","sizeBytes":10424,"isText":true},{"path":"references/batch-review.md","sizeBytes":2343,"isText":true},{"path":"references/character-relations.md","sizeBytes":17831,"isText":true},{"path":"references/dialogue-mastery.md","sizeBytes":11764,"isText":true},{"path":"references/plot-core-methods.md","sizeBytes":20291,"isText":true},{"path":"references/quality-rubric.md","sizeBytes":4637,"isText":true},{"path":"references/review-quality.md","sizeBytes":13008,"isText":true},{"path":"references/review-tracking.md","sizeBytes":2037,"isText":true},{"path":"references/rubrics/fanqie.md","sizeBytes":891,"isText":true},{"path":"references/rubrics/qidian.md","sizeBytes":987,"isText":true},{"path":"references/rubrics/zhihu.md","sizeBytes":1165,"isText":true},{"path":"references/solo.md","sizeBytes":3149,"isText":true},{"path":"references/style-resolution.md","sizeBytes":4016,"isText":true},{"path":"references/tracking-initialization.md","sizeBytes":1355,"isText":true},{"path":"references/tracking-transaction.md","sizeBytes":15296,"isText":true},{"path":"scripts/author_memory_commit.py","sizeBytes":79758,"isText":true},{"path":"scripts/check-ai-patterns.js","sizeBytes":75274,"isText":true},{"path":"scripts/check-degeneration.js","sizeBytes":15104,"isText":true},{"path":"scripts/normalize-punctuation.js","sizeBytes":13480,"isText":true},{"path":"scripts/style-whitelist.js","sizeBytes":1168,"isText":true},{"path":"scripts/tracking_commit.py","sizeBytes":83785,"isText":true},{"path":"scripts/wordcount_core.py","sizeBytes":18338,"isText":true},{"path":"SKILL.md","sizeBytes":21760,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"clean","suspicious":0,"notes":0,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-10-02T16:33:34.260257Z","sha256":"3C5694AEE1D18AA6EFDE39CBA960960C4023FDE5BCE8619E3BCC87D46A954FB3","sizeBytes":193447},"review":null,"source":{"repositoryUrl":"https://github.com/zenstory-ai/oh-story-dsh","path":"packages/knowledge/oh-story/skills/story-review","license":"MIT","commit":"d734089bae893783d8bfaf09f8e8fa0a99723ef0","subtreeSha":"FEDF86E6AEA49DD7F27CF669731502E09B2D7EF631A58061CF219C15D3BF21E0","lastSyncedAt":"2026-10-02T16:32:40.531554Z"},"reviewedAt":"2026-10-02T16:34:58.014229Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/zenstory-ai/oh-story-dsh/tree/main/packages/knowledge/oh-story/skills/story-review"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install zenstory-ai-oh-story-dsh@llmmart"},{"target":"git","command":"git clone https://github.com/zenstory-ai/oh-story-dsh.git"}]}