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

新增完成度评估与优化分析报告,恢复设计规格文档

Mochocyang 2 месяцев назад
Родитель
Сommit
6fac0487a2

+ 656 - 0
docs/superpowers/specs/2026-07-09-ai-outline-intent-staged-workflow-audit.html

@@ -0,0 +1,656 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+<meta charset="UTF-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<title>AI大纲会话窗口交互重构 — 完成度评估与优化分析报告</title>
+<style>
+  :root {
+    --bg: #0f1117;
+    --surface: #1a1d27;
+    --surface-2: #232733;
+    --border: #2d3142;
+    --text: #e6e8ed;
+    --text-muted: #9aa0ae;
+    --accent: #6cb6ff;
+    --accent-2: #8b7bf0;
+    --success: #4ade80;
+    --warning: #fbbf24;
+    --danger: #f87171;
+    --amber: #f59e0b;
+  }
+  * { box-sizing: border-box; margin: 0; padding: 0; }
+  body {
+    background: var(--bg);
+    color: var(--text);
+    font-family: -apple-system, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif;
+    line-height: 1.7;
+    padding: 2rem;
+    max-width: 1080px;
+    margin: 0 auto;
+  }
+  h1 { font-size: 1.8rem; margin-bottom: 0.5rem; }
+  h2 { font-size: 1.4rem; margin-top: 2.5rem; margin-bottom: 1rem; color: var(--accent); border-bottom: 1px solid var(--border); padding-bottom: 0.5rem; }
+  h3 { font-size: 1.15rem; margin-top: 1.8rem; margin-bottom: 0.8rem; color: var(--accent-2); }
+  h4 { font-size: 1rem; margin-top: 1.2rem; margin-bottom: 0.5rem; color: var(--text); }
+  p { margin-bottom: 0.8rem; }
+  ul, ol { margin-left: 1.5rem; margin-bottom: 0.8rem; }
+  li { margin-bottom: 0.3rem; }
+  code {
+    background: var(--surface-2);
+    padding: 0.15rem 0.4rem;
+    border-radius: 4px;
+    font-family: "JetBrains Mono", "Fira Code", "Consolas", monospace;
+    font-size: 0.88em;
+    color: var(--amber);
+  }
+  table { width: 100%; border-collapse: collapse; margin: 1rem 0; }
+  th, td { border: 1px solid var(--border); padding: 0.6rem 0.8rem; text-align: left; }
+  th { background: var(--surface-2); color: var(--accent); font-weight: 600; }
+  tr:nth-child(even) { background: var(--surface); }
+  .meta { color: var(--text-muted); font-size: 0.9rem; margin-bottom: 1.5rem; }
+  .callout { background: var(--surface); border-left: 3px solid var(--accent); padding: 0.8rem 1rem; border-radius: 0 6px 6px 0; margin: 1rem 0; }
+  .callout-warn { border-left-color: var(--warning); }
+  .callout-danger { border-left-color: var(--danger); }
+  .callout-success { border-left-color: var(--success); }
+  .badge { display: inline-block; padding: 0.15rem 0.5rem; border-radius: 4px; font-size: 0.8rem; font-weight: 600; }
+  .badge-full { background: rgba(74,222,128,0.15); color: var(--success); }
+  .badge-partial { background: rgba(251,191,36,0.15); color: var(--warning); }
+  .badge-missing { background: rgba(248,113,113,0.15); color: var(--danger); }
+  .badge-low { background: rgba(107,182,255,0.15); color: var(--accent); }
+  .progress-bar { background: var(--surface-2); border-radius: 8px; height: 20px; overflow: hidden; margin: 0.5rem 0; }
+  .progress-fill { height: 100%; border-radius: 8px; transition: width 0.3s; }
+  .progress-fill.green { background: linear-gradient(90deg, #22c55e, #4ade80); }
+  .progress-fill.yellow { background: linear-gradient(90deg, #eab308, #fbbf24); }
+  .progress-fill.red { background: linear-gradient(90deg, #ef4444, #f87171); }
+  .severity-critical { color: var(--danger); font-weight: 700; }
+  .severity-high { color: #fb923c; font-weight: 700; }
+  .severity-medium { color: var(--warning); font-weight: 700; }
+  .severity-low { color: var(--accent); font-weight: 700; }
+</style>
+</head>
+<body>
+
+<h1>AI大纲会话窗口交互重构 — 完成度评估与优化分析</h1>
+<p class="meta">
+  审查日期:2026-07-10<br>
+  审查范围:方案B(显式意图闸门阶段 + 独立阶段状态机)全部实现<br>
+  对照文档:2026-07-09-ai-outline-intent-staged-workflow-design.html
+</p>
+
+<h2 id="completion">一、完成度评估</h2>
+
+<h3>总体完成度</h3>
+
+<div class="progress-bar"><div class="progress-fill green" style="width: 72%"></div></div>
+<p style="text-align: center; margin-top: 0.3rem;"><strong>72%</strong> — 框架已搭建,核心流程可运行,但关键交互细节和运行时数据填充存在明显缺口</p>
+
+<h3>逐项完成度评估表</h3>
+
+<table>
+  <tr><th>功能需求</th><th>设计规格要求</th><th>实际实现</th><th>完成度</th></tr>
+
+  <tr>
+    <td><strong>意图清晰度分析层</strong></td>
+    <td>点击模块按钮→意图分析prompt→AI输出intent_clarity JSON→前端解析决定分支</td>
+    <td>parseIntentClarity + buildIntentAnalysisPrompt 已实现;handleGenerateSection 已改造为两阶段;流结束回调中解析 clear 自动注入生成</td>
+    <td><span class="badge badge-full">85%</span></td>
+  </tr>
+  <tr>
+    <td>needs_input 推荐选项渲染</td>
+    <td>AI提供4类推荐选项(A/B/C/D),用户点选后自动构造对应模块prompt并发送</td>
+    <td>推荐选项卡片已渲染,但点击回调仅通过 addMessage 注入用户消息文本,<strong>未调用 handleGenerateSection</strong>,无法触发完整两阶段流程</td>
+    <td><span class="badge badge-partial">40%</span></td>
+  </tr>
+  <tr>
+    <td>"自定义"选项聚焦输入框</td>
+    <td>选择D时聚焦输入框,等待用户自由输入</td>
+    <td>仅注释"聚焦输入框(暂不实现)",<strong>无任何实现</strong></td>
+    <td><span class="badge badge-missing">0%</span></td>
+  </tr>
+  <tr>
+    <td>防无限循环</td>
+    <td>用户回复后直接注入生成prompt,不再二次分析</td>
+    <td>clear 分支自动注入生成,但 needs_input 用户选择后只添加文本消息,未跳过意图分析直接进入生成</td>
+    <td><span class="badge badge-partial">50%</span></td>
+  </tr>
+  <tr>
+    <td><strong>渐进式阶段展示</strong></td>
+    <td>7阶段按事件驱动出现,hidden不渲染,done折叠摘要,active展开详情</td>
+    <td>buildOutlineStages 实现7阶段+hidden/active/done 状态;OutlineWorkflowStages 组件渲染折叠/展开</td>
+    <td><span class="badge badge-partial">60%</span></td>
+  </tr>
+  <tr>
+    <td>阶段摘要信息</td>
+    <td>✓ 任务理解 · {意图标签}(置信度{百分比}) · {耗时}</td>
+    <td>summary 和 details 字段始终为空字符串/空数组,<strong>无运行时数据填充</strong></td>
+    <td><span class="badge badge-missing">5%</span></td>
+  </tr>
+  <tr>
+    <td>阶段过渡动画</td>
+    <td>opacity 0→1 + translateY(4px→0),250ms ease-out</td>
+    <td>CSS fadeIn keyframe 实现了 opacity + translateY 动画,但 translateY 初始值为 1(Tailwind单位)而非 4px</td>
+    <td><span class="badge badge-partial">80%</span></td>
+  </tr>
+  <tr>
+    <td><strong>文件输出结构</strong></td>
+    <td>每章/每项一个独立文件,outputMode配置(per_chapter/per_item/single)</td>
+    <td>outputMode 字段已在 configs 中定义,但 <strong>生成流程未使用 outputMode</strong> 控制实际输出行为</td>
+    <td><span class="badge badge-partial">30%</span></td>
+  </tr>
+  <tr>
+    <td><strong>批量保存确认</strong></td>
+    <td>支持部分取消,用户可取消勾选其中部分文件</td>
+    <td>deselectedFiles + checkbox 完整实现,确认按钮正确过滤</td>
+    <td><span class="badge badge-full">100%</span></td>
+  </tr>
+  <tr>
+    <td><strong>下一步推荐机制</strong></td>
+    <td>AI输出next_step JSON,前端渲染推荐卡片,点击触发对应模块生成</td>
+    <td>parseNextStep + isRecommendationForbidden 已实现;推荐卡片已渲染;但点击回调仅注入文本消息,<strong>未调用 handleGenerateSection</strong></td>
+    <td><span class="badge badge-partial">50%</span></td>
+  </tr>
+  <tr>
+    <td>严禁推荐正文生成</td>
+    <td>AI大纲面板禁止推荐正文生成</td>
+    <td>isRecommendationForbidden 正则匹配6种模式,buildNextStepPromptSuffix 明确约束</td>
+    <td><span class="badge badge-full">95%</span></td>
+  </tr>
+  <tr>
+    <td><strong>状态机扩展</strong></td>
+    <td>新增 intent_analysis / waiting_user_input 阶段及转移规则</td>
+    <td>类型定义和 ALLOWED_TRANSITIONS 已更新,但 <strong>核心面板未实际使用状态机</strong>驱动流程</td>
+    <td><span class="badge badge-partial">35%</span></td>
+  </tr>
+  <tr>
+    <td><strong>系统提示词改造</strong></td>
+    <td>新增意图分析阶段约束和 intent_clarity / next_step 输出格式</td>
+    <td>buildOutlineAgentSystemPrompt 新增了意图分析和下一步推荐输出约束</td>
+    <td><span class="badge badge-full">90%</span></td>
+  </tr>
+  <tr>
+    <td>不改动共享文件</td>
+    <td>workflow-trace.ts / agent-workflow-panel.tsx 不修改</td>
+    <td>经 git diff 验证,共享文件未被修改</td>
+    <td><span class="badge badge-full">100%</span></td>
+  </tr>
+  <tr>
+    <td>TypeScript 类型安全</td>
+    <td>所有新增和修改文件通过 typecheck</td>
+    <td>tsc --noEmit 通过,无类型错误</td>
+    <td><span class="badge badge-full">100%</span></td>
+  </tr>
+</table>
+
+<h2 id="gaps">二、设计偏差与未实现项</h2>
+
+<table>
+  <tr><th>#</th><th>偏差项</th><th>设计要求</th><th>实际实现</th><th>影响</th></tr>
+
+  <tr>
+    <td>1</td>
+    <td>推荐选项点击回调</td>
+    <td>点击推荐后自动构造对应模块的生成prompt并通过 handleGenerateSection 触发</td>
+    <td>点击后仅通过 addMessage 注入文本消息,无法触发两阶段流程</td>
+    <td class="severity-critical">核心交互断裂</td>
+  </tr>
+  <tr>
+    <td>2</td>
+    <td>"自定义"选项行为</td>
+    <td>选择D时聚焦输入框,等待用户自由输入</td>
+    <td>完全未实现</td>
+    <td class="severity-high">用户无法自定义范围</td>
+  </tr>
+  <tr>
+    <td>3</td>
+    <td>防无限循环机制</td>
+    <td>用户选择后直接注入生成prompt,不再做意图分析</td>
+    <td>needs_input 用户选择后仅添加文本消息,下一轮仍可能触发意图分析</td>
+    <td class="severity-critical">可能陷入循环</td>
+  </tr>
+  <tr>
+    <td>4</td>
+    <td>阶段摘要数据</td>
+    <td>✓ 任务理解 · {意图标签}(置信度{百分比}) · {耗时}</td>
+    <td>summary/details 始终为空,用户只看到阶段标题</td>
+    <td class="severity-high">用户体验缺失</td>
+  </tr>
+  <tr>
+    <td>5</td>
+    <td>outputMode 实际使用</td>
+    <td>per_chapter 生成多文件,per_item 每项一文件</td>
+    <td>outputMode 字段已定义但生成流程未读取,实际行为仍依赖AI自觉</td>
+    <td class="severity-medium">功能未落地</td>
+  </tr>
+  <tr>
+    <td>6</td>
+    <td>状态机实际驱动</td>
+    <td>outline-workflow-state 的阶段转换驱动面板UI</td>
+    <td>状态机类型和转换已定义,但面板未使用它,仍用 intentPhase 字段手动控制</td>
+    <td class="severity-medium">架构未闭环</td>
+  </tr>
+  <tr>
+    <td>7</td>
+    <td>intent_clarity 显示内容清理</td>
+    <td>clear 时 AI 只输出 JSON 不生成正文,前端应隐藏 JSON 块</td>
+    <td>显示内容中仍包含 <!-- intent_clarity --> JSON 块文本</td>
+    <td class="severity-high">UI 展示混乱</td>
+  </tr>
+  <tr>
+    <td>8</td>
+    <td>next_step 显示内容清理</td>
+    <td>next_step JSON 块不应出现在正文显示中</td>
+    <td>显示内容中仍包含 <!-- next_step --> JSON 块文本</td>
+    <td class="severity-high">UI 展示混乱</td>
+  </tr>
+</table>
+
+<h2 id="optimization">三、六维优化分析</h2>
+
+<h3>3.1 功能完整性</h3>
+
+<table>
+  <tr><th>#</th><th>问题描述</th><th>严重程度</th><th>建议解决方案</th><th>预期改进效果</th></tr>
+
+  <tr>
+    <td>F1</td>
+    <td>推荐选项点击回调未连接 handleGenerateSection,点击后仅注入文本消息而非触发生成流程</td>
+    <td><span class="severity-critical">致命</span></td>
+    <td>将 handleGenerateSection 通过 props 传入 OutlineAssistantMessage;推荐选项点击时调用 onGenerateSection(config.title, config.requestHint);下一步推荐同理</td>
+    <td>推荐点击立即触发生成,流程闭环</td>
+  </tr>
+  <tr>
+    <td>F2</td>
+    <td>"自定义"选项(D)完全未实现,用户无法自由输入生成范围</td>
+    <td><span class="severity-high">高</span></td>
+    <td>将 inputRef 通过 props 传入,选择D时调用 inputRef.current?.focus();或在推荐卡片下方插入临时输入框</td>
+    <td>用户可自由描述范围,4类选项完整可用</td>
+  </tr>
+  <tr>
+    <td>F3</td>
+    <td>needs_input 用户选择后未跳过意图分析,可能二次触发意图分析导致循环</td>
+    <td><span class="severity-critical">致命</span></td>
+    <td>用户选择推荐后,调用 handleSend(buildGenerationPrompt(...), [], { intentPhase: "generation" }),直接进入生成阶段</td>
+    <td>防止无限循环,流程单向推进</td>
+  </tr>
+  <tr>
+    <td>F4</td>
+    <td>outputMode 字段已定义但生成流程未使用,per_chapter/per_item 行为无程序保障</td>
+    <td><span class="severity-medium">中</span></td>
+    <td>在 buildGenerationPrompt 中根据 outputMode 生成不同的文件输出要求提示;在 saveOutlineSaveRequests 中按 outputMode 校验文件数量</td>
+    <td>每章/每项一文件有程序保障</td>
+  </tr>
+  <tr>
+    <td>F5</td>
+    <td>状态机定义了 intent_analysis/waiting_user_input 但面板未使用状态机驱动流程</td>
+    <td><span class="severity-medium">中</span></td>
+    <td>在面板中引入 outlineWorkflowState,通过状态机转换驱动UI阶段切换(如显示"意图分析中..."、"等待选择..."等)</td>
+    <td>流程状态可追溯、可调试</td>
+  </tr>
+</table>
+
+<h3>3.2 性能优化</h3>
+
+<table>
+  <tr><th>#</th><th>问题描述</th><th>严重程度</th><th>建议解决方案</th><th>预期改进效果</th></tr>
+
+  <tr>
+    <td>P1</td>
+    <td>buildOutlineStages 在每次渲染时重新计算全部阶段状态,流式输出期间频繁调用</td>
+    <td><span class="severity-low">低</span></td>
+    <td>使用 useMemo 缓存结果,仅在 toolCalls/content/isStreaming 变化时重新计算</td>
+    <td>减少不必要的重计算</td>
+  </tr>
+  <tr>
+    <td>P2</td>
+    <td>OutlineWorkflowStages 组件未做 React.memo 优化,每条消息渲染都会触发重建</td>
+    <td><span class="severity-low">低</span></td>
+    <td>对 OutlineWorkflowStages 和 StageRow 组件添加 React.memo</td>
+    <td>避免无关消息的重复渲染</td>
+  </tr>
+  <tr>
+    <td>P3</td>
+    <td>hasGenerationStarted 使用正则替换判断内容是否存在,对长文本效率低</td>
+    <td><span class="severity-low">低</span></td>
+    <td>改用 string.indexOf 或标记位检测,避免全文正则替换</td>
+    <td>长文本场景下减少GC压力</td>
+  </tr>
+</table>
+
+<h3>3.3 代码质量</h3>
+
+<table>
+  <tr><th>#</th><th>问题描述</th><th>严重程度</th><th>建议解决方案</th><th>预期改进效果</th></tr>
+
+  <tr>
+    <td>Q1</td>
+    <td>推荐选项和下一步推荐的点击回调内直接操作 useOutlineChatStore.getState(),绕过了面板的流程控制</td>
+    <td><span class="severity-high">高</span></td>
+    <td>通过 props 传递 onGenerateSection 和 onSendMessage 回调,而非直接操作 store</td>
+    <td>流程控制集中、可测试、可调试</td>
+  </tr>
+  <tr>
+    <td>Q2</td>
+    <td>handleGenerateSection 的 useCallback 依赖数组包含 lastIntentTitle/lastIntentHint/setLastIntentResult,但这些状态在闭包中使用可能过期</td>
+    <td><span class="severity-medium">中</span></td>
+    <td>使用 useRef 保存意图上下文,或改用 useOutlineChatStore 存储,避免闭包过期问题</td>
+    <td>消除闭包陷阱,意图信息可靠</td>
+  </tr>
+  <tr>
+    <td>Q3</td>
+    <td>buildOutlineStages 中阶段激活逻辑用布尔数组+索引匹配,可读性差且难扩展</td>
+    <td><span class="severity-low">低</span></td>
+    <td>改用显式阶段映射表:每个阶段定义 activateIf 函数,迭代计算状态</td>
+    <td>可读性提升,新增阶段只需加一行</td>
+  </tr>
+  <tr>
+    <td>Q4</td>
+    <td>isRecommendationForbidden 使用6个正则匹配,可能误杀合法推荐(如"生成组织势力正文说明")</td>
+    <td><span class="severity-medium">中</span></td>
+    <td>增加白名单机制或改为精确匹配"生成.*章节?正文"/"写正文"等更精确的模式</td>
+    <td>减少误判,提升推荐精度</td>
+  </tr>
+</table>
+
+<h3>3.4 用户体验</h3>
+
+<table>
+  <tr><th>#</th><th>问题描述</th><th>严重程度</th><th>建议解决方案</th><th>预期改进效果</th></tr>
+
+  <tr>
+    <td>U1</td>
+    <td>intent_clarity JSON 块和 next_step JSON 块在正文显示中未过滤,用户看到原始 JSON</td>
+    <td><span class="severity-high">高</span></td>
+    <td>在 displayContent 生成逻辑中,移除 <!-- intent_clarity --> 和 <!-- next_step --> 标记块;复用已有的 extractBodyContent 思路</td>
+    <td>界面干净,只显示有意义的内容</td>
+  </tr>
+  <tr>
+    <td>U2</td>
+    <td>阶段摘要信息为空,用户只看到"✓ 任务理解"而非"✓ 任务理解 · 识别为生成章节细纲 · 1.2s"</td>
+    <td><span class="severity-high">高</span></td>
+    <td>在 buildOutlineStages 中填充 summary:从 toolCalls 提取工具名/结果,从 intentClarity 提取分析摘要,计算耗时</td>
+    <td>用户可快速理解每个阶段的执行结果</td>
+  </tr>
+  <tr>
+    <td>U3</td>
+    <td>clear 意图分析后自动注入生成时,无过渡提示,用户可能困惑为何AI在"自言自语"</td>
+    <td><span class="severity-medium">中</span></td>
+    <td>自动注入前插入一条系统消息"意图清晰,开始生成...",或在阶段面板中显示"自动进入生成阶段"</td>
+    <td>流程可感知,用户理解当前状态</td>
+  </tr>
+  <tr>
+    <td>U4</td>
+    <td>needs_input 推荐选项区域缺少"已分析N章,M章缺失细纲"的上下文信息</td>
+    <td><span class="severity-medium">中</span></td>
+    <td>在推荐选项上方渲染 intentClarityResult.analysis 作为上下文摘要</td>
+    <td>用户决策有依据</td>
+  </tr>
+  <tr>
+    <td>U5</td>
+    <td>下一步推荐缺少"已完成模块"的视觉标识,用户不知道刚完成了什么</td>
+    <td><span class="severity-low">低</span></td>
+    <td>在推荐卡片上方添加 completedModule + completedScope 摘要行</td>
+    <td>流程连贯感增强</td>
+  </tr>
+</table>
+
+<h3>3.5 兼容性</h3>
+
+<table>
+  <tr><th>#</th><th>问题描述</th><th>严重程度</th><th>建议解决方案</th><th>预期改进效果</th></tr>
+
+  <tr>
+    <td>C1</td>
+    <td>旧会话历史消息无 intentPhase / intentClarityResult 字段,加载后渲染可能异常</td>
+    <td><span class="severity-medium">中</span></td>
+    <td>OutlineChatMessage 新增字段均为可选,已有安全访问(?.),但需验证旧数据加载后推荐区域不误渲染</td>
+    <td>旧数据兼容无渲染错误</td>
+  </tr>
+  <tr>
+    <td>C2</td>
+    <td>AI模型可能不遵循 intent_clarity / next_step 输出格式,导致解析失败</td>
+    <td><span class="severity-medium">中</span></td>
+    <td>parseIntentClarity / parseNextStep 返回 null 时,回退到原有行为(直接显示AI完整回复),不阻断用户流程</td>
+    <td>模型能力不足时不影响基本使用</td>
+  </tr>
+  <tr>
+    <td>C3</td>
+    <td>不支持工具调用的模型(无 route_task)会导致所有阶段始终 hidden</td>
+    <td><span class="severity-low">低</span></td>
+    <td>当无工具调用时,如果 isStreaming 为 true 则显示简化的"生成中..."状态</td>
+    <td>弱模型也有基本状态反馈</td>
+  </tr>
+</table>
+
+<h3>3.6 可维护性</h3>
+
+<table>
+  <tr><th>#</th><th>问题描述</th><th>严重程度</th><th>建议解决方案</th><th>预期改进效果</th></tr>
+
+  <tr>
+    <td>M1</td>
+    <td>outline-chat-panel.tsx 文件过大(2100+行),新增功能后继续膨胀</td>
+    <td><span class="severity-high">高</span></td>
+    <td>将 OutlineAssistantMessage 拆分为独立文件;将推荐选项和下一步推荐提取为 IntentOptionsCard / NextStepCard 独立组件</td>
+    <td>单一职责,便于独立测试和修改</td>
+  </tr>
+  <tr>
+    <td>M2</td>
+    <td>意图分析 prompt 拼接逻辑分散在 buildIntentAnalysisPrompt 和 buildOutlineAgentSystemPrompt 中,维护时需同时修改两处</td>
+    <td><span class="severity-medium">中</span></td>
+    <td>将意图分析约束集中到 buildIntentAnalysisPrompt,系统提示词中只引用"请遵循意图分析协议"</td>
+    <td>单一来源,减少不一致风险</td>
+  </tr>
+  <tr>
+    <td>M3</td>
+    <td>测试仅覆盖解析函数(outline-intent-clarity/outline-next-step/outline-stage-trace),未覆盖面板集成逻辑</td>
+    <td><span class="severity-medium">中</span></td>
+    <td>添加集成测试:模拟AI返回intent_clarity → 验证自动注入生成;模拟needs_input → 验证推荐渲染</td>
+    <td>端到端流程有保障</td>
+  </tr>
+</table>
+
+<h2 id="priority">四、优化优先级排序</h2>
+
+<h3>优先级矩阵</h3>
+
+<table>
+  <tr><th>优先级</th><th>编号</th><th>问题描述</th><th>维度</th><th>预估工时</th></tr>
+
+  <tr style="background: rgba(248,113,113,0.1);">
+    <td><span class="severity-critical">P0 致命</span></td>
+    <td>F1</td>
+    <td>推荐选项点击回调未连接 handleGenerateSection</td>
+    <td>功能完整性</td>
+    <td>2h</td>
+  </tr>
+  <tr style="background: rgba(248,113,113,0.1);">
+    <td><span class="severity-critical">P0 致命</span></td>
+    <td>F3</td>
+    <td>needs_input 用户选择后未跳过意图分析,可能循环</td>
+    <td>功能完整性</td>
+    <td>1.5h</td>
+  </tr>
+  <tr style="background: rgba(248,113,113,0.1);">
+    <td><span class="severity-critical">P0 致命</span></td>
+    <td>U1</td>
+    <td>intent_clarity / next_step JSON 块未从显示内容中过滤</td>
+    <td>用户体验</td>
+    <td>1h</td>
+  </tr>
+
+  <tr style="background: rgba(251,191,36,0.08);">
+    <td><span class="severity-high">P1 高</span></td>
+    <td>F2</td>
+    <td>"自定义"选项(D)完全未实现</td>
+    <td>功能完整性</td>
+    <td>1.5h</td>
+  </tr>
+  <tr style="background: rgba(251,191,36,0.08);">
+    <td><span class="severity-high">P1 高</span></td>
+    <td>U2</td>
+    <td>阶段摘要信息为空(无意图标签/耗时等)</td>
+    <td>用户体验</td>
+    <td>3h</td>
+  </tr>
+  <tr style="background: rgba(251,191,36,0.08);">
+    <td><span class="severity-high">P1 高</span></td>
+    <td>Q1</td>
+    <td>推荐点击回调直接操作 store,绕过面板流程控制</td>
+    <td>代码质量</td>
+    <td>2h</td>
+  </tr>
+  <tr style="background: rgba(251,191,36,0.08);">
+    <td><span class="severity-high">P1 高</span></td>
+    <td>M1</td>
+    <td>outline-chat-panel.tsx 过大,需拆分</td>
+    <td>可维护性</td>
+    <td>3h</td>
+  </tr>
+
+  <tr style="background: rgba(107,182,255,0.08);">
+    <td><span class="severity-medium">P2 中</span></td>
+    <td>F4</td>
+    <td>outputMode 字段已定义但生成流程未使用</td>
+    <td>功能完整性</td>
+    <td>2h</td>
+  </tr>
+  <tr style="background: rgba(107,182,255,0.08);">
+    <td><span class="severity-medium">P2 中</span></td>
+    <td>F5</td>
+    <td>状态机未实际驱动面板流程</td>
+    <td>功能完整性</td>
+    <td>4h</td>
+  </tr>
+  <tr style="background: rgba(107,182,255,0.08);">
+    <td><span class="severity-medium">P2 中</span></td>
+    <td>U3</td>
+    <td>clear 自动注入时无过渡提示</td>
+    <td>用户体验</td>
+    <td>1h</td>
+  </tr>
+  <tr style="background: rgba(107,182,255,0.08);">
+    <td><span class="severity-medium">P2 中</span></td>
+    <td>U4</td>
+    <td>推荐选项缺少上下文分析摘要</td>
+    <td>用户体验</td>
+    <td>0.5h</td>
+  </tr>
+  <tr style="background: rgba(107,182,255,0.08);">
+    <td><span class="severity-medium">P2 中</span></td>
+    <td>Q2</td>
+    <td>handleGenerateSection 闭包中可能使用过期的 lastIntentTitle</td>
+    <td>代码质量</td>
+    <td>1h</td>
+  </tr>
+  <tr style="background: rgba(107,182,255,0.08);">
+    <td><span class="severity-medium">P2 中</span></td>
+    <td>Q4</td>
+    <td>isRecommendationForbidden 可能误杀合法推荐</td>
+    <td>代码质量</td>
+    <td>1h</td>
+  </tr>
+  <tr style="background: rgba(107,182,255,0.08);">
+    <td><span class="severity-medium">P2 中</span></td>
+    <td>M2</td>
+    <td>意图分析 prompt 逻辑分散</td>
+    <td>可维护性</td>
+    <td>1.5h</td>
+  </tr>
+  <tr style="background: rgba(107,182,255,0.08);">
+    <td><span class="severity-medium">P2 中</span></td>
+    <td>M3</td>
+    <td>缺少面板集成测试</td>
+    <td>可维护性</td>
+    <td>3h</td>
+  </tr>
+
+  <tr>
+    <td><span class="severity-low">P3 低</span></td>
+    <td>P1-P3</td>
+    <td>性能优化(useMemo/memo/indexOf)</td>
+    <td>性能</td>
+    <td>2h</td>
+  </tr>
+  <tr>
+    <td><span class="severity-low">P3 低</span></td>
+    <td>C1-C3</td>
+    <td>兼容性保障(旧数据/弱模型)</td>
+    <td>兼容性</td>
+    <td>2h</td>
+  </tr>
+  <tr>
+    <td><span class="severity-low">P3 低</span></td>
+    <td>U5</td>
+    <td>推荐区域缺少完成模块标识</td>
+    <td>用户体验</td>
+    <td>0.5h</td>
+  </tr>
+  <tr>
+    <td><span class="severity-low">P3 低</span></td>
+    <td>Q3</td>
+    <td>buildOutlineStages 激活逻辑可读性优化</td>
+    <td>代码质量</td>
+    <td>1h</td>
+  </tr>
+</table>
+
+<h2 id="summary">五、实施建议</h2>
+
+<h3>第一阶段:修复致命问题(预估 4.5h)</h3>
+
+<div class="callout callout-danger">
+  <strong>目标</strong>:让两阶段流程真正可运行,推荐点击能触发生成,显示内容干净。
+</div>
+
+<ol>
+  <li><strong>F1 + F3 + Q1</strong>:通过 props 将 onGenerateSection 和 onSendMessage 传入 OutlineAssistantMessage;推荐选项和下一步推荐点击时调用对应回调;needs_input 用户选择后直接调用 handleSend(buildGenerationPrompt(...), [], { intentPhase: "generation" }) 跳过意图分析</li>
+  <li><strong>U1</strong>:在 displayContent 生成逻辑中移除 intent_clarity 和 next_step 标记块,复用 extractBodyContent 的思路或新增 stripStructuredMarkers 工具函数</li>
+</ol>
+
+<h3>第二阶段:补全交互细节(预估 6h)</h3>
+
+<div class="callout callout-warn">
+  <strong>目标</strong>:4类选项完整可用,阶段信息可读,用户体验可感知。
+</div>
+
+<ol>
+  <li><strong>F2</strong>:实现"自定义"选项,将 inputRef 传入或添加临时输入框</li>
+  <li><strong>U2</strong>:在 buildOutlineStages 中从 agentToolCalls / intentClarityResult 提取摘要信息,填充 summary 字段</li>
+  <li><strong>U3 + U4</strong>:自动注入前显示过渡提示;推荐选项上方显示分析摘要</li>
+  <li><strong>M1(部分)</strong>:将推荐选项和下一步推荐提取为独立组件</li>
+</ol>
+
+<h3>第三阶段:架构完善与质量提升(预估 9h)</h3>
+
+<div class="callout">
+  <strong>目标</strong>:outputMode 真正生效,状态机驱动流程,测试覆盖完整。
+</div>
+
+<ol>
+  <li><strong>F4</strong>:在 buildGenerationPrompt 和保存流程中使用 outputMode</li>
+  <li><strong>F5</strong>:面板引入状态机驱动</li>
+  <li><strong>M3</strong>:添加集成测试</li>
+  <li><strong>Q2 + Q4 + M2</strong>:闭包修复、推荐过滤优化、prompt 逻辑集中</li>
+</ol>
+
+<h3>第四阶段:性能与兼容性打磨(预估 4.5h)</h3>
+
+<ol>
+  <li>性能优化:useMemo / React.memo / indexOf</li>
+  <li>兼容性:旧数据加载验证、弱模型降级</li>
+  <li>边界场景:超长内容、网络中断、模型切换等</li>
+</ol>
+
+<h2 id="risk">六、风险提示</h2>
+
+<div class="callout callout-danger">
+  <ol>
+    <li><strong>AI 输出格式遵从度不可控</strong>:intent_clarity 和 next_step 依赖 AI 严格按格式输出。如模型能力不足或指令被忽略,整个两阶段流程将失效。建议增加 fallback 机制:解析失败时回退到原有直接生成行为。</li>
+    <li><strong>意图分析额外一轮 API 调用</strong>:clear 情况下先做意图分析再自动注入生成,等于多一轮 API 请求。对于意图已经很明确的场景,这增加了延迟。建议在 buildIntentAnalysisPrompt 中加入"如已有足够信息,尽量输出 clear"的引导。</li>
+    <li><strong>闭包过期风险</strong>:lastIntentTitle/lastIntentHint 在 handleSend 的 useCallback 闭包中使用,如果用户在意图分析期间切换会话,可能拿到过期值。建议改用 useRef。</li>
+  </ol>
+</div>
+
+</body>
+</html>

+ 483 - 0
docs/superpowers/specs/2026-07-09-ai-outline-intent-staged-workflow-design.html

@@ -0,0 +1,483 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+<meta charset="UTF-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<title>AI大纲会话窗口交互重构设计 — 意图分析与渐进式阶段展示</title>
+<style>
+  :root {
+    --bg: #0f1117;
+    --surface: #1a1d27;
+    --surface-2: #232733;
+    --border: #2d3142;
+    --text: #e6e8ed;
+    --text-muted: #9aa0ae;
+    --accent: #6cb6ff;
+    --accent-2: #8b7bf0;
+    --success: #4ade80;
+    --warning: #fbbf24;
+    --danger: #f87171;
+    --amber: #f59e0b;
+  }
+  * { box-sizing: border-box; margin: 0; padding: 0; }
+  body {
+    background: var(--bg);
+    color: var(--text);
+    font-family: -apple-system, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif;
+    line-height: 1.7;
+    padding: 2rem;
+    max-width: 960px;
+    margin: 0 auto;
+  }
+  h1 { font-size: 1.8rem; margin-bottom: 0.5rem; }
+  h2 { font-size: 1.4rem; margin-top: 2.5rem; margin-bottom: 1rem; color: var(--accent); border-bottom: 1px solid var(--border); padding-bottom: 0.5rem; }
+  h3 { font-size: 1.15rem; margin-top: 1.8rem; margin-bottom: 0.8rem; color: var(--accent-2); }
+  h4 { font-size: 1rem; margin-top: 1.2rem; margin-bottom: 0.5rem; color: var(--text); }
+  p { margin-bottom: 0.8rem; }
+  ul, ol { margin-left: 1.5rem; margin-bottom: 0.8rem; }
+  li { margin-bottom: 0.3rem; }
+  code {
+    background: var(--surface-2);
+    padding: 0.15rem 0.4rem;
+    border-radius: 4px;
+    font-family: "JetBrains Mono", "Fira Code", "Consolas", monospace;
+    font-size: 0.88em;
+    color: var(--amber);
+  }
+  pre {
+    background: var(--surface-2);
+    border: 1px solid var(--border);
+    border-radius: 8px;
+    padding: 1rem 1.2rem;
+    overflow-x: auto;
+    margin: 1rem 0;
+    font-size: 0.85rem;
+    line-height: 1.6;
+  }
+  pre code { background: none; padding: 0; color: var(--text); }
+  table { width: 100%; border-collapse: collapse; margin: 1rem 0; }
+  th, td { border: 1px solid var(--border); padding: 0.6rem 0.8rem; text-align: left; }
+  th { background: var(--surface-2); color: var(--accent); font-weight: 600; }
+  tr:nth-child(even) { background: var(--surface); }
+  .meta { color: var(--text-muted); font-size: 0.9rem; margin-bottom: 1.5rem; }
+  .callout { background: var(--surface); border-left: 3px solid var(--accent); padding: 0.8rem 1rem; border-radius: 0 6px 6px 0; margin: 1rem 0; }
+  .callout-warn { border-left-color: var(--warning); }
+  .callout-danger { border-left-color: var(--danger); }
+  .callout-success { border-left-color: var(--success); }
+  .badge { display: inline-block; padding: 0.15rem 0.5rem; border-radius: 4px; font-size: 0.8rem; font-weight: 600; }
+  .badge-new { background: rgba(74,222,128,0.15); color: var(--success); }
+  .badge-mod { background: rgba(251,191,36,0.15); color: var(--warning); }
+  .badge-keep { background: rgba(107,182,255,0.15); color: var(--accent); }
+  .badge-ban { background: rgba(248,113,113,0.15); color: var(--danger); }
+</style>
+</head>
+<body>
+
+<h1>AI大纲会话窗口交互重构设计</h1>
+<p class="meta">
+  主题:意图分析与渐进式阶段展示<br>
+  日期:2026-07-09<br>
+  方案:方案 B — 显式意图闸门阶段 + 独立阶段状态机
+</p>
+
+<h2 id="background">背景与问题</h2>
+
+<h3>现有实现的三个核心问题</h3>
+
+<ol>
+  <li><strong>直接生成,缺少意图分析</strong>:用户点击「章节细纲」等模块按钮后,<code>handleGenerateSection</code> 直接构造生成 prompt 发送给 Agent,没有「用户到底要生成哪些章节的细纲」这一意图分析步骤。任务理解完全交给 LLM 在 prompt 文字中自行完成。</li>
+  <li><strong>思考过程展示简陋</strong>:大纲面板使用 <code>OutlineThinkingBlock</code> 显示原始流式文本块,没有阶段划分。固定 6 阶段面板 <code>AgentWorkflowPanel</code> 未接入大纲面板,且是预先全部显示而非渐进式出现。</li>
+  <li><strong>流程无连贯性与推荐</strong>:无阶段间数据传递机制;生成完成后无「下一步推荐」,用户需自行决定后续操作。</li>
+</ol>
+
+<h3>设计目标</h3>
+
+<ul>
+  <li>点击模块按钮后先做意图清晰度分析,明确时全自动推进,不明确时智能推荐选项供用户选择</li>
+  <li>思考阶段改为事件驱动渐进式出现,未激活阶段不显示,已完成阶段折叠为摘要</li>
+  <li>生成阶段间自动推进、数据有效流转,AI 自动选择技能并提取资源</li>
+  <li>一章一个独立文件,生成完成后推荐下一步(仅限大纲体系内,严禁推荐正文生成)</li>
+</ul>
+
+<h2 id="architecture">架构总览</h2>
+
+<h3>分层结构</h3>
+
+<pre><code>用户点击模块按钮
+    ↓
+┌─────────────────────────────────────────┐
+│  ① 意图清晰度分析层(新增)              │
+│  - AI 读取已有大纲/章节/设定资料          │
+│  - 输出 intent_clarity 结构化结果         │
+│  - needs_input → AI 提供推荐选项          │
+│  - clear → 自动进入生成流程               │
+└─────────────────────────────────────────┘
+    ↓ (clear 或用户选择后)
+┌─────────────────────────────────────────┐
+│  ② 渐进式生成阶段(改造)                │
+│  - 7 阶段按事件驱动出现                   │
+│  - 技能选择 → 上下文准备 → 工具调用       │
+│    → 思考与角色 → 生成与校验              │
+│  - 已完成折叠摘要,当前阶段展开           │
+└─────────────────────────────────────────┘
+    ↓
+┌─────────────────────────────────────────┐
+│  ③ 结果输出 + 下一步推荐(新增)          │
+│  - 每章/每项一个独立文件                  │
+│  - 批量保存确认(支持部分取消)           │
+│  - 推荐下一步(仅限大纲体系内)           │
+└─────────────────────────────────────────┘</code></pre>
+
+<h3>关键设计决策</h3>
+
+<div class="callout">
+  <strong>1. 不改动共享文件</strong>:<code>workflow-trace.ts</code> 和 <code>agent-workflow-panel.tsx</code> 被 AI 会话面板共用,改动会影响其他功能。所有新逻辑在 outline 专属文件中实现。
+</div>
+
+<div class="callout">
+  <strong>2. 意图清晰度通过结构化输出强制</strong>:AI 必须先输出 <code>intent_clarity</code> 结构化 JSON,前端解析后决定是否暂停等待用户输入。不靠 AI 自觉,与项目教训一致。
+</div>
+
+<div class="callout">
+  <strong>3. 复用现有 Agent 循环</strong>:仍走 <code>AgentRunner.run</code>,工具注册不变(route_task / apply_skill / read_outline / read_chapter / write_outline_node 等),在外围增加意图分析层和渐进式渲染层。
+</div>
+
+<h2 id="intent">意图清晰度分析层</h2>
+
+<h3>触发时机</h3>
+
+<p>用户点击「章节细纲」等模块按钮时,不再直接构造生成 prompt,而是构造<strong>意图分析 prompt</strong>,让 AI 先做意图清晰度判断。</p>
+
+<h3>意图清晰度判定规则</h3>
+
+<p>AI 读取已有资料后,根据模块类型判断意图清晰度:</p>
+
+<table>
+  <tr><th>模块类型</th><th>判定依据</th><th>needs_input 触发条件</th></tr>
+  <tr><td>章节细纲</td><td>已有章节列表 vs 已有细纲文件</td><td>完全没有章节 / 大范围缺细纲需用户缩小范围</td></tr>
+  <tr><td>人物小传</td><td>已有角色列表 vs 已有小传文件</td><td>角色来源不明确(总纲提及但未细化)</td></tr>
+  <tr><td>组织势力</td><td>当前卷涉及的势力 vs 已有势力设定</td><td>卷范围不明确</td></tr>
+  <tr><td>力量体系</td><td>总纲中的体系设定 vs 已有文件</td><td>体系框架未在总纲中定义</td></tr>
+  <tr><td>其他模块</td><td>类似策略</td><td>信息不足时</td></tr>
+</table>
+
+<h3>意图分析输出格式</h3>
+
+<p>AI 输出需包裹在 <code>&lt;!-- intent_clarity --&gt;</code> 标记中:</p>
+
+<pre><code>&lt;!-- intent_clarity --&gt;
+{
+  "clarity": "clear" | "needs_input",
+  "module": "章节细纲",
+  "analysis": "检测到共有35章,其中0章有细纲",
+  "detectedScope": "clear时填写范围描述",
+  "options": [
+    {"id":"A","label":"生成前面缺失的细纲","description":"为第1-35章逐一生成细纲"},
+    {"id":"B","label":"根据已有章节内容分析后生成后续细纲","description":"读取现有正文,推断后续章节走向并生成细纲"},
+    {"id":"C","label":"生成最近5-10章的细纲","description":"为第26-35章生成细纲"},
+    {"id":"D","label":"自定义","description":"由你描述要生成的内容范围或故事方向"}
+  ],
+  "question": "needs_input时的自然语言提问,clear时为空"
+}
+&lt;!-- /intent_clarity --&gt;</code></pre>
+
+<div class="callout callout-warn">
+  <strong>输出约束</strong>:<code>clear</code> 时只输出上述 JSON,不生成正文。<code>needs_input</code> 时输出 JSON 后用自然语言在会话中提出澄清问题 + 推荐选项。
+</div>
+
+<h3>前端解析与控制流</h3>
+
+<pre><code>handleGenerateSection(title, requestHint)
+  → handleSend(意图分析prompt, { phase: "intent_analysis" })
+  → Agent 执行(调用 list/read 工具收集信息)
+  → AI 输出 intent_clarity JSON
+  → 流结束后,parseIntentClarity(lastMessage.content)
+      → clear:  自动 handleSend(生成prompt, { phase: "generation", scope: result })
+      → needs_input: 渲染 AI 的自然语言提问 + 推荐选项到会话
+                     设置消息状态为 waiting_user_input
+                     用户点选选项或自由输入
+                     → handleSend(用户选择/回复, { phase: "generation", scope: 上次result })
+                     → 直接注入生成,不再二次分析</code></pre>
+
+<div class="callout callout-danger">
+  <strong>防无限循环</strong>:用户回复后直接注入生成 prompt,不再做二次意图分析。避免 AI-用户-AI 的无限循环。
+</div>
+
+<h3>智能推荐选项策略</h3>
+
+<p>当意图不明确(needs_input)时,AI 根据分析结果提供 4 类推荐选项:</p>
+
+<ol>
+  <li><strong>全部缺失项生成</strong>:如「生成前面缺失的细纲」</li>
+  <li><strong>基于已有内容推断</strong>:如「根据已有章节内容分析后生成后续细纲」</li>
+  <li><strong>最近范围生成</strong>:如「生成最近 5-10 章的细纲」</li>
+  <li><strong>自定义</strong>:用户自行描述要生成的内容范围或故事方向</li>
+</ol>
+
+<h3>状态机扩展</h3>
+
+<p>在 <code>outline-workflow-state.ts</code> 新增 <code>intent_analysis</code> 和 <code>waiting_user_input</code> 阶段:</p>
+
+<pre><code>idle → intent_analysis → sufficiency_check           (clear)
+                        → waiting_user_input → sufficiency_check  (用户回复后)</code></pre>
+
+<h2 id="stages">渐进式思考阶段展示</h2>
+
+<h3>现状问题</h3>
+
+<p>大纲面板用 <code>OutlineThinkingBlock</code> 显示原始流式文本块,无阶段划分。固定 6 阶段面板 <code>AgentWorkflowPanel</code> 未接入大纲面板。</p>
+
+<h3>新组件:OutlineWorkflowStages</h3>
+
+<p>在 outline 场景内新建独立组件,不改动共享文件。</p>
+
+<pre><code>┌─ 思考过程 ─────────────────────────────┐
+│  ✓ 任务理解 · 识别为生成大纲意图 · 1.2s │ ← 折叠摘要,点击展开
+│  ✓ 范围分析 · 检测到3章缺失细纲 · 0.8s │ ← 折叠摘要
+│  ▶ 技能选择 · 正在选择写作技能...      │ ← 当前阶段,展开显示
+│     └ 大纲生成技能已加载               │
+│                                        │
+│  (后续阶段尚未出现,不显示)           │
+└────────────────────────────────────────┘</code></pre>
+
+<h3>阶段定义(7 个阶段)</h3>
+
+<table>
+  <tr><th>序号</th><th>阶段</th><th>激活条件</th><th>完成条件</th><th>数据来源</th></tr>
+  <tr><td>1</td><td>任务理解</td><td>检测到 route_task 调用</td><td>route_task 返回结果</td><td>agentToolCalls 中的 route_task</td></tr>
+  <tr><td>2</td><td>范围分析</td><td>检测到 intent_clarity 输出</td><td>intent_clarity 解析完成</td><td>content 中的 intent_clarity 块</td></tr>
+  <tr><td>3</td><td>技能选择</td><td>检测到 apply_skill 调用</td><td>apply_skill 返回结果</td><td>agentToolCalls 中的 apply_skill</td></tr>
+  <tr><td>4</td><td>上下文准备</td><td>检测到 list/read 工具调用</td><td>所有 read 调用完成</td><td>agentToolCalls 中的 list_*/read_*</td></tr>
+  <tr><td>5</td><td>工具调用</td><td>检测到 write/其他工具调用</td><td>工具调用完成</td><td>agentToolCalls 中的 write_*/其他</td></tr>
+  <tr><td>6</td><td>思考与角色</td><td>检测到 thinking 块</td><td>流式 thinking 结束</td><td>separateThinking(content).thinking</td></tr>
+  <tr><td>7</td><td>生成与校验</td><td>检测到正文输出开始</td><td>质量检查完成</td><td>separateThinking(content).answer + outlineSaveRequest</td></tr>
+</table>
+
+<h3>渐进式出现机制</h3>
+
+<div class="callout">
+  <strong>核心原则</strong>:只有 status 不为 <code>hidden</code> 的阶段才渲染。阶段初始全部为 hidden,当检测到对应事件时变为 active,下一阶段出现时当前阶段变为 done 并折叠。
+</div>
+
+<pre><code>type StageRenderStatus = "hidden" | "active" | "done"
+
+// 阶段初始全部为 hidden
+// 检测到对应事件 → 该阶段变为 active
+// 下一阶段出现 → 当前阶段变为 done 并折叠
+const stages = buildOutlineStages(agentEvents)
+const visibleStages = stages.filter(s => s.status !== "hidden")</code></pre>
+
+<h3>折叠/展开行为</h3>
+
+<ul>
+  <li><strong>默认行为</strong>:<code>done</code> 阶段折叠为单行摘要,<code>active</code> 阶段展开显示完整内容</li>
+  <li><strong>用户操作</strong>:点击任意阶段行可手动 toggle 展开/折叠</li>
+  <li><strong>过渡动画</strong>:新阶段出现时 <code>opacity 0→1</code> + <code>translateY(4px→0)</code>,250ms ease-out</li>
+</ul>
+
+<h3>已完成阶段摘要格式</h3>
+
+<pre><code>✓ 任务理解 · {意图标签}(置信度{百分比}) · {耗时}
+✓ 范围分析 · {分析摘要} · {耗时}
+✓ 技能选择 · {技能名} · {耗时}
+✓ 上下文准备 · 读取了{N}个文件 · {耗时}
+✓ 工具调用 · 调用了{N}个工具 · {耗时}
+✓ 思考与角色 · {思考摘要} · {耗时}
+✓ 生成与校验 · 生成{N}个文件 · {耗时}</code></pre>
+
+<h2 id="output">文件输出结构与下一步推荐</h2>
+
+<h3>每章/每项一个独立文件</h3>
+
+<h4>目录结构</h4>
+
+<pre><code>wiki/outlines/
+├── 章节细纲/
+│   ├── 第1章-章节标题.md
+│   ├── 第2章-章节标题.md
+│   └── 第3章-章节标题.md
+├── 人物小传/
+│   ├── 主角名.md
+│   └── 配角名.md
+├── 组织势力设定/
+│   └── 势力名称.md
+├── 力量体系/
+│   └── 体系名称.md
+└── ...</code></pre>
+
+<h4>细纲文件内容模板</h4>
+
+<pre><code># 第N章 章节标题
+
+## 章节目标
+(本章要达成的叙事目标)
+
+## 核心事件
+1. ...
+2. ...
+
+## 主要冲突
+(本章的核心矛盾)
+
+## 关键转折
+(改变走向的关键节点)
+
+## 结尾钩子
+(章末悬念)
+
+## 与前后章节承接
+- 承接前文:...
+- 为后文铺垫:...</code></pre>
+
+<h4>输出模式配置</h4>
+
+<p>在 <code>outline-section-configs.ts</code> 新增 <code>outputMode</code> 字段:</p>
+
+<table>
+  <tr><th>模式</th><th>适用模块</th><th>行为</th></tr>
+  <tr><td><code>per_chapter</code></td><td>章节细纲</td><td>每个章节生成独立文件</td></tr>
+  <tr><td><code>per_item</code></td><td>人物小传、组织势力、力量体系等</td><td>每个角色/势力/体系生成独立文件</td></tr>
+  <tr><td><code>single</code></td><td>不需要拆分的场景(兼容保留)</td><td>单文件输出</td></tr>
+</table>
+
+<h4>批量 outlineSaveRequest</h4>
+
+<p>AI 在输出末尾附带多个 <code>outlineSaveRequest</code> JSON,每个对应一个文件:</p>
+
+<pre><code>[
+  {"type":"outline","path":"wiki/outlines/章节细纲/第1章-初入江湖.md","content":"..."},
+  {"type":"outline","path":"wiki/outlines/章节细纲/第2章-暗流涌动.md","content":"..."},
+  {"type":"outline","path":"wiki/outlines/章节细纲/第3章-危机四伏.md","content":"..."}
+]</code></pre>
+
+<h4>批量保存确认</h4>
+
+<p>改造 <code>OutlineSaveConfirmDialog</code> 支持批量文件列表展示:</p>
+
+<pre><code>即将保存以下3个文件:
+☑ 第1章-初入江湖.md
+☑ 第2章-暗流涌动.md
+☑ 第3章-危机四伏.md
+[全部保存] [取消]</code></pre>
+
+<div class="callout callout-success">
+  <strong>支持部分取消</strong>:用户可取消勾选其中部分文件,只保存勾选的文件。
+</div>
+
+<h3>下一步推荐机制</h3>
+
+<p>生成结果输出后,AI 额外输出 <code>next_step</code> 结构:</p>
+
+<pre><code>&lt;!-- next_step --&gt;
+{
+  "completedModule": "章节细纲",
+  "completedScope": "第1-5章细纲",
+  "recommendations": [
+    {"id":"A","label":"完善人物小传","reason":"章节细纲中提及3个未立传的角色"},
+    {"id":"B","label":"生成组织势力设定","reason":"第2-3章涉及新势力但未设定"},
+    {"id":"C","label":"生成伏笔计划","reason":"章纲中埋设了2处伏笔需规划"},
+    {"id":"D","label":"自定义","reason":"由你描述下一步想做的事"}
+  ]
+}
+&lt;!-- /next_step --&gt;</code></pre>
+
+<p>前端渲染为可点击的推荐卡片,位于生成结果下方:</p>
+
+<pre><code>┌─ 生成完成 · 已保存3个文件 ──────────────┐
+│  ✓ 第1章-初入江湖.md                   │
+│  ✓ 第2章-暗流涌动.md                   │
+│  ✓ 第3章-危机四伏.md                   │
+├─ 接下来想做什么? ──────────────────────┤
+│  [A] 完善人物小传         →            │
+│  [B] 生成组织势力设定     →            │
+│  [C] 生成伏笔计划         →            │
+│  [D] 自定义               →            │
+└────────────────────────────────────────┘</code></pre>
+
+<div class="callout callout-danger">
+  <strong>严禁推荐正文生成</strong>:AI 大纲面板禁止生成正文,推荐中严禁出现「生成对应章节正文」类选项。所有推荐仅限大纲体系内流转。
+</div>
+
+<h4>推荐策略表(仅限大纲体系内)</h4>
+
+<table>
+  <tr><th>完成模块</th><th>推荐方向</th></tr>
+  <tr><td>章节细纲</td><td>人物小传(涉及未立传角色)/ 组织势力设定(涉及新势力)/ 伏笔计划(埋设伏笔)</td></tr>
+  <tr><td>人物小传</td><td>组织势力设定(角色所属势力)/ 力量体系(角色能力归属)</td></tr>
+  <tr><td>组织势力</td><td>力量体系(势力能力层次)/ 地理设定(势力分布区域)</td></tr>
+  <tr><td>力量体系</td><td>人物小传(能力归属角色)/ 背景设定(体系运转规则)</td></tr>
+  <tr><td>伏笔计划</td><td>章节细纲(伏笔融入章节)/ 人物小传(伏笔相关角色)</td></tr>
+</table>
+
+<p>推荐内容由 AI 根据实际生成内容动态推断,读取刚生成的文件内容,分析其中提及但尚未建立的关联项,给出针对性推荐。用户点击推荐后自动构造对应模块的生成 prompt 并发送;选择「自定义」时聚焦输入框等待用户输入。</p>
+
+<h2 id="files">涉及文件与改动范围</h2>
+
+<h3>新增文件</h3>
+
+<table>
+  <tr><th>文件</th><th>职责</th><th>状态</th></tr>
+  <tr><td><code>src/lib/novel/outline-intent-clarity.ts</code></td><td>意图清晰度分析:prompt 构造、结果解析、IntentClarityResult 类型定义</td><td><span class="badge badge-new">新增</span></td></tr>
+  <tr><td><code>src/lib/novel/outline-stage-trace.ts</code></td><td>大纲专属阶段追踪:基于 Agent 事件构建渐进式阶段列表(7阶段),独立于共享的 workflow-trace.ts</td><td><span class="badge badge-new">新增</span></td></tr>
+  <tr><td><code>src/components/sources/outline-workflow-stages.tsx</code></td><td>渐进式阶段渲染组件:hidden/active/done 状态管理、折叠摘要、展开详情、过渡动画</td><td><span class="badge badge-new">新增</span></td></tr>
+  <tr><td><code>src/lib/novel/outline-next-step.ts</code></td><td>下一步推荐:prompt 构造、NextStepRecommendation 解析、推荐策略约束(禁止正文)</td><td><span class="badge badge-new">新增</span></td></tr>
+</table>
+
+<h3>修改文件</h3>
+
+<table>
+  <tr><th>文件</th><th>改动内容</th><th>风险</th><th>状态</th></tr>
+  <tr><td><code>outline-chat-panel.tsx</code></td><td>改造 handleGenerateSection 为两阶段流程;替换 OutlineThinkingBlock 为 OutlineWorkflowStages;新增意图解析和下一步推荐渲染</td><td>高(核心面板)</td><td><span class="badge badge-mod">修改</span></td></tr>
+  <tr><td><code>outline-section-configs.ts</code></td><td>新增 outputMode 字段(per_chapter / per_item / single)</td><td>低(纯配置)</td><td><span class="badge badge-mod">修改</span></td></tr>
+  <tr><td><code>outline-workflow-state.ts</code></td><td>新增 intent_analysis 和 waiting_user_input 阶段及转移规则</td><td>低(纯类型扩展)</td><td><span class="badge badge-mod">修改</span></td></tr>
+  <tr><td><code>outline-save-confirm-dialog.tsx</code></td><td>支持批量文件列表展示、部分取消</td><td>中(需处理多文件选择)</td><td><span class="badge badge-mod">修改</span></td></tr>
+  <tr><td><code>outline-chat-store.ts</code></td><td>消息类型新增 intentPhase / nextStepRecommendation 字段</td><td>低(类型扩展)</td><td><span class="badge badge-mod">修改</span></td></tr>
+</table>
+
+<h3>不修改的文件(保护边界)</h3>
+
+<table>
+  <tr><th>文件</th><th>原因</th><th>状态</th></tr>
+  <tr><td><code>workflow-trace.ts</code></td><td>AI 会话面板共用,改动影响其他功能</td><td><span class="badge badge-ban">不修改</span></td></tr>
+  <tr><td><code>agent-workflow-panel.tsx</code></td><td>AI 会话面板共用</td><td><span class="badge badge-ban">不修改</span></td></tr>
+  <tr><td><code>chat-panel.tsx</code></td><td>AI 会话面板,不涉及</td><td><span class="badge badge-ban">不修改</span></td></tr>
+  <tr><td><code>plan-execute-policy.ts</code></td><td>章节写作协议,不涉及大纲场景</td><td><span class="badge badge-ban">不修改</span></td></tr>
+  <tr><td><code>task-router.ts</code></td><td>意图路由不变,仍用现有 route_task</td><td><span class="badge badge-ban">不修改</span></td></tr>
+</table>
+
+<h3>提示词改动位置</h3>
+
+<table>
+  <tr><th>位置</th><th>改动</th></tr>
+  <tr><td><code>buildOutlineSectionGenerationPrompt</code> (L336)</td><td>拆分为 <code>buildIntentAnalysisPrompt</code> + <code>buildGenerationPrompt</code>(原函数改造)</td></tr>
+  <tr><td><code>buildOutlineAgentSystemPrompt</code> (L253)</td><td>新增意图分析阶段约束和 intent_clarity 输出格式要求</td></tr>
+  <tr><td>生成 prompt 末尾</td><td>新增 next_step 输出格式要求</td></tr>
+</table>
+
+<h2 id="constraints">关键约束汇总</h2>
+
+<div class="callout callout-danger">
+  <ol>
+    <li><strong>AI 大纲面板严禁生成正文</strong>,推荐中严禁推荐「生成对应章节正文」</li>
+    <li><strong>用户回复后直接注入生成</strong>,不再二次意图分析,避免无限循环</li>
+    <li><strong>批量保存支持部分取消</strong>,用户可取消勾选其中部分文件</li>
+    <li><strong>不改动共享文件</strong>(workflow-trace.ts / agent-workflow-panel.tsx / chat-panel.tsx / plan-execute-policy.ts / task-router.ts)</li>
+    <li><strong>意图清晰度通过结构化输出强制</strong>,不靠 AI 自觉</li>
+    <li><strong>阶段渐进式出现</strong>,未激活阶段不显示,已完成折叠为摘要</li>
+  </ol>
+</div>
+
+<h2 id="testing">测试与验证要求</h2>
+
+<ol>
+  <li><strong>意图分析测试</strong>:点击章节细纲,验证 AI 是否输出 intent_clarity JSON,前端是否正确解析 clear / needs_input</li>
+  <li><strong>渐进式阶段测试</strong>:验证 7 个阶段按事件驱动出现,未激活阶段不显示,已完成阶段折叠为摘要</li>
+  <li><strong>文件输出测试</strong>:验证每章/每项生成独立文件,目录结构正确</li>
+  <li><strong>批量保存测试</strong>:验证批量文件列表展示,部分取消功能正常</li>
+  <li><strong>下一步推荐测试</strong>:验证推荐卡片渲染,点击后正确构造对应模块 prompt;验证推荐中不含正文生成选项</li>
+  <li><strong>回归测试</strong>:验证 AI 会话面板的思考过程展示不受影响(workflow-trace / agent-workflow-panel 未被修改)</li>
+  <li><strong>TypeScript 编译检查</strong>:所有新增和修改文件通过 typecheck</li>
+</ol>
+
+</body>
+</html>