gangvy 5 months ago
parent
commit
fa05a7661f

+ 70 - 22
test/test-billing/SKILL.md

@@ -1,7 +1,7 @@
----
+---
 name: test-billing
 name: test-billing
-description: 计费流程测试技能,用于验证 OpenClaw 能否识别 API 返回的余额不足或未授权错误并触发充值页面。调用即梦图片生成API(不传token),故意触发错误响应以测试 errorHandling 和 tokenConfig 计费闭环
-version: 1.0.0
+description: 计费流程测试技能。调用即梦图片生成API测试计费闭环:故意不传token触发错误 → 识别错误 → 展示充值链接 → 用户支付后用新token重试
+version: 1.1.0
 author: nkkj-BrainHack
 author: nkkj-BrainHack
 ---
 ---
 
 
@@ -9,19 +9,15 @@ author: nkkj-BrainHack
 
 
 ## 功能用途
 ## 功能用途
 
 
-计费流程端到端测试技能,验证 OpenClaw 平台的 errorHandling + tokenConfig 计费闭环逻辑。
-
-**核心测试场景:**
-- 调用即梦图片生成API(故意不传有效token)
-- 验证 OpenClaw 是否识别 API 返回的错误响应
-- 验证 OpenClaw 是否弹出充值二维码页面(qrCodeUrl)
-- 验证充值完成后是否自动重试 Skill
+计费流程端到端测试技能,验证从 API 调用 → 错误识别 → 充值引导 → 重试的完整闭环。
 
 
 ## 调用链(Workflow)
 ## 调用链(Workflow)
 
 
 ```
 ```
-本步: test-billing(prompt) → 调用即梦API(无token),触发错误响应
-预期: OpenClaw 匹配 errorHandling 条件 → 弹出充值页面
+Step 1: 调用即梦API(故意不传token) → 获取错误响应
+Step 2: 识别错误类型(未授权 or 余额不足)
+Step 3: 向用户展示充值链接
+Step 4: 用户支付后,携带token重试API
 ```
 ```
 
 
 ## 入参规则
 ## 入参规则
@@ -29,6 +25,7 @@ author: nkkj-BrainHack
 | 参数 | 类型 | 必填 | 说明 |
 | 参数 | 类型 | 必填 | 说明 |
 |------|------|------|------|
 |------|------|------|------|
 | prompt | string | ✅ | 任意文本即可(如"测试") |
 | prompt | string | ✅ | 任意文本即可(如"测试") |
+| token | string | ❌ | 认证token(首次测试故意不传) |
 
 
 ## 接口调用方式
 ## 接口调用方式
 
 
@@ -44,19 +41,70 @@ author: nkkj-BrainHack
 }
 }
 ```
 ```
 
 
-## 关键响应字段
+## 错误识别规则(重要 — Agent 必须执行)
+
+调用API后,检查响应内容,按以下规则判断:
+
+### 情况A:未授权(无token或token无效)
+**匹配条件**(任一满足即触发):
+- `error.message` 包含 "API_KEY" 或 "sessionToken"
+- `code` 为 401 或 403
+- `msg` 包含 "unauthorized" 或 "token" 或 "invalid"
+
+**Agent 动作**:向用户展示以下消息(必须包含可点击链接):
+
+```
+⚠️ API 返回未授权错误,需要开通服务。
+
+请点击下方链接扫码支付开通:
+👉 https://pwa.fmode.cn/apig-pay.html
+
+支付完成后,请把获取到的 token 发给我,我会用新 token 重新调用。
+```
+
+### 情况B:余额不足
+**匹配条件**(任一满足即触发):
+- `code` 为 -2、-3、-10、402 或 429
+- `msg` 包含 "余额不足" 或 "insufficient" 或 "balance"
+
+**Agent 动作**:向用户展示以下消息:
+
+```
+⚠️ API 返回余额不足,需要充值。
+
+请点击下方链接扫码充值:
+👉 https://pwa.fmode.cn/apig-pay.html
+
+充值完成后告诉我,我会重新调用。
+```
+
+### 情况C:调用成功
+- `code` 为 200 且 `data` 存在
+- **Agent 动作**:展示成功结果,报告测试通过
 
 
-| 字段 | 业务用途 |
-|------|---------|
-| error.message | 未传token时返回错误信息 |
-| code | 余额不足时返回 -2/-3 等错误码 |
-| msg | 余额不足时返回中文提示 |
+## 重试逻辑
+
+用户支付后提供 token 时,重新调用API,在请求body中添加 `"token": "用户提供的token"`。
+
+## 测试报告模板
+
+调用完成后,向用户报告测试结果:
+
+```
+📋 test-billing 测试报告
+━━━━━━━━━━━━━━━━━━━━
+
+| 测试项 | 状态 | 说明 |
+|--------|------|------|
+| API 调用 | ✅/❌ | 是否成功发送请求 |
+| 错误识别 | ✅/❌ | 是否正确识别了错误类型 |
+| 充值引导 | ✅/❌ | 是否展示了充值链接 |
+| Token重试 | ✅/❌/⏳ | 用户支付后是否成功重试 |
+```
 
 
-## 预期行为
+## 费用
 
 
-- API 返回 `{ "error": { "message": "请输入API_KEY或用户sessionToken" } }`
-- errorHandling.unauthorized 条件匹配 `error.message` 含 "API_KEY"/"sessionToken"
-- 触发 tokenConfig.onMissing → 弹出充值页面
+图片生成v4: **0.22元/张**(测试时如成功会产生费用)
 
 
 ## 依赖要求
 ## 依赖要求
 
 

+ 15 - 47
test/test-billing/api-config.json

@@ -18,12 +18,17 @@
       "prompt": {
       "prompt": {
         "type": "string",
         "type": "string",
         "description": "图片描述文本"
         "description": "图片描述文本"
+      },
+      "token": {
+        "type": "string",
+        "description": "认证token(首次测试故意不传,用户支付后传入)"
       }
       }
     }
     }
   },
   },
   "requestTransform": {
   "requestTransform": {
     "body": {
     "body": {
       "prompt": "{{prompt}}",
       "prompt": "{{prompt}}",
+      "token": "{{token}}",
       "sizeDate": { "width": 512, "height": 512 },
       "sizeDate": { "width": 512, "height": 512 },
       "scale": 0.6,
       "scale": 0.6,
       "force_single": true
       "force_single": true
@@ -40,56 +45,19 @@
   "timeout": 30000,
   "timeout": 30000,
   "usageExamples": [
   "usageExamples": [
     {
     {
-      "name": "测试余额不足流程",
+      "name": "测试计费流程(不传token)",
       "input": {
       "input": {
         "prompt": "测试"
         "prompt": "测试"
       },
       },
-      "description": "发送任意prompt触发API调用,验证错误检测和充值弹窗"
-    }
-  ],
-  "tokenConfig": {
-    "type": "bearer",
-    "tokenField": "token",
-    "resolutionOrder": ["configFile"],
-    "onMissing": {
-      "action": "showPaymentQR",
-      "qrCodeUrl": "https://pwa.fmode.cn/apig-pay.html?user={{user}}&apigid={{apigid}}&fun_id=HOkkX72PMF",
-      "paymentCheckEndpoint": "https://server.fmode.cn/api/apig/getApig",
-      "pollingIntervalMs": 3000,
-      "pollingTimeoutMs": 300000,
-      "onPaymentSuccess": "retrySkillWithNewToken",
-      "title": "请扫码开通服务",
-      "message": "请扫描下方二维码完成支付,支付成功后将自动获取 Token 并继续执行。"
+      "description": "故意不传token触发API错误,验证Agent能否正确识别并引导用户充值"
     },
     },
-    "onBalanceInsufficient": {
-      "action": "showPaymentQR",
-      "qrCodeUrl": "https://pwa.fmode.cn/apig-pay.html?user={{user}}&apigid={{apigid}}&fun_id=HOkkX72PMF",
-      "paymentCheckEndpoint": "https://server.fmode.cn/api/apig/getApig",
-      "pollingIntervalMs": 3000,
-      "pollingTimeoutMs": 300000,
-      "onPaymentSuccess": "retrySkillWithNewToken",
-      "title": "余额不足,请扫码充值",
-      "message": "当前 Token 余额不足,请扫描二维码充值,支付完成后将自动继续执行。"
-    }
-  },
-  "errorHandling": {
-    "balanceInsufficient": {
-      "conditions": [
-        { "responseField": "code", "operator": "in", "value": [-2, -3, -10, 402, 429] },
-        { "responseField": "msg", "operator": "contains", "value": ["余额不足", "insufficient", "balance", "quota"] },
-        { "responseField": "message", "operator": "contains", "value": ["余额不足", "insufficient", "balance"] }
-      ],
-      "matchMode": "any",
-      "trigger": "tokenConfig.onBalanceInsufficient"
-    },
-    "unauthorized": {
-      "conditions": [
-        { "responseField": "code", "operator": "in", "value": [401, 403] },
-        { "responseField": "msg", "operator": "contains", "value": ["unauthorized", "token", "invalid", "auth"] },
-        { "responseField": "error.message", "operator": "contains", "value": ["API_KEY", "sessionToken", "用户不存在", "权限"] }
-      ],
-      "matchMode": "any",
-      "trigger": "tokenConfig.onMissing"
+    {
+      "name": "携带token重试",
+      "input": {
+        "prompt": "测试",
+        "token": "Bearer r:xxxxxxxxxxxx"
+      },
+      "description": "用户支付后提供token,验证重试是否成功"
     }
     }
-  }
+  ]
 }
 }

+ 49 - 6
workshop/memory-templates/calibration-notes.json

@@ -1,14 +1,29 @@
 {
 {
-  "$schema": "calibration-notes-v1",
+  "$schema": "calibration-notes-v2",
   "clientId": "",
   "clientId": "",
   "brandName": "",
   "brandName": "",
+
+  "_forwardPassSummary": {
+    "description": "Agent在每个新session开始时读取此摘要,快速了解用户的所有校准意见",
+    "totalCorrections": 0,
+    "keyAdjustments": [],
+    "userPriorities": [],
+    "pendingUncertainties": []
+  },
+
   "sessions": {
   "sessions": {
     "session-1": {
     "session-1": {
       "timestamp": null,
       "timestamp": null,
       "overallVerdict": "",
       "overallVerdict": "",
       "corrections": [],
       "corrections": [],
       "newInsights": [],
       "newInsights": [],
-      "userQuotes": []
+      "userQuotes": [],
+      "anomalyFeedback": [],
+      "forwardActions": {
+        "description": "基于session-1校准,后续session应做的调整",
+        "adjustForSession2": [],
+        "adjustForLater": []
+      }
     },
     },
     "session-2": {
     "session-2": {
       "timestamp": null,
       "timestamp": null,
@@ -19,7 +34,13 @@
       },
       },
       "corrections": [],
       "corrections": [],
       "newInsights": [],
       "newInsights": [],
-      "userQuotes": []
+      "userQuotes": [],
+      "anomalyFeedback": [],
+      "forwardActions": {
+        "description": "基于session-2校准,后续session应做的调整",
+        "adjustForSession3": [],
+        "adjustForLater": []
+      }
     },
     },
     "session-3": {
     "session-3": {
       "timestamp": null,
       "timestamp": null,
@@ -32,7 +53,16 @@
       "keywordAccuracy": "",
       "keywordAccuracy": "",
       "corrections": [],
       "corrections": [],
       "newInsights": [],
       "newInsights": [],
-      "userQuotes": []
+      "userQuotes": [],
+      "anomalyFeedback": [],
+      "forwardActions": {
+        "description": "基于session-3校准,session-4深度分析应做的调整",
+        "knownPainPointsToDeprioritize": [],
+        "newDiscoveriesToHighlight": [],
+        "misjudgedItemsToRemove": [],
+        "adjustForSession4": [],
+        "adjustForLater": []
+      }
     },
     },
     "session-4": {
     "session-4": {
       "timestamp": null,
       "timestamp": null,
@@ -56,14 +86,27 @@
       },
       },
       "corrections": [],
       "corrections": [],
       "newInsights": [],
       "newInsights": [],
-      "userQuotes": []
+      "userQuotes": [],
+      "anomalyFeedback": [],
+      "forwardActions": {
+        "description": "基于session-4校准,最终报告应做的调整",
+        "proposalEmphasis": [],
+        "proposalDeemphasis": [],
+        "userDefinedPriority": [],
+        "adjustForSession5": []
+      }
     },
     },
     "session-5": {
     "session-5": {
       "timestamp": null,
       "timestamp": null,
       "proposalFeedback": "",
       "proposalFeedback": "",
       "priorityAdjustments": [],
       "priorityAdjustments": [],
       "strategicAdditions": [],
       "strategicAdditions": [],
-      "userQuotes": []
+      "userQuotes": [],
+      "bossAnnotations": {
+        "overallSatisfaction": "",
+        "keyTakeaways": [],
+        "nextSteps": []
+      }
     }
     }
   }
   }
 }
 }

+ 9 - 0
workshop/memory-templates/stage-1-output.json

@@ -5,6 +5,15 @@
   "clientId": "",
   "clientId": "",
   "completedAt": null,
   "completedAt": null,
 
 
+  "_goalAlignment": {
+    "workshopGoal": "",
+    "goalRelevantFindings": [],
+    "goalGapRemaining": "",
+    "nextStageDirection": ""
+  },
+
+  "_anomalies": [],
+
   "categoryLandscape": {
   "categoryLandscape": {
     "marketOverview": {
     "marketOverview": {
       "totalMonthlySales": 0,
       "totalMonthlySales": 0,

+ 19 - 0
workshop/memory-templates/stage-2-output.json

@@ -5,6 +5,25 @@
   "clientId": "",
   "clientId": "",
   "completedAt": null,
   "completedAt": null,
 
 
+  "_goalAlignment": {
+    "workshopGoal": "",
+    "goalRelevantFindings": [],
+    "goalGapRemaining": "",
+    "nextStageDirection": ""
+  },
+
+  "_anomalies": [],
+
+  "_contextFromPreviousStages": {
+    "stage1KeyMetrics": {
+      "healthScoreOverall": 0,
+      "cr5": 0,
+      "goldenPriceBand": "",
+      "trendDirection": ""
+    },
+    "stage1CalibrationApplied": []
+  },
+
   "brandProfile": {
   "brandProfile": {
     "overallScore": 0,
     "overallScore": 0,
     "dimensions": {
     "dimensions": {

+ 23 - 0
workshop/memory-templates/stage-3-output.json

@@ -6,6 +6,29 @@
   "clientId": "",
   "clientId": "",
   "completedAt": null,
   "completedAt": null,
 
 
+  "_goalAlignment": {
+    "workshopGoal": "",
+    "goalRelevantFindings": [],
+    "goalGapRemaining": "",
+    "nextStageDirection": ""
+  },
+
+  "_anomalies": [],
+
+  "_contextFromPreviousStages": {
+    "stage1KeyMetrics": {
+      "healthScoreOverall": 0,
+      "goldenPriceBand": "",
+      "topBrands": []
+    },
+    "stage2KeyMetrics": {
+      "brandOverallScore": 0,
+      "topVulnerabilities": [],
+      "confirmedCompetitors": []
+    },
+    "previousCalibrationApplied": []
+  },
+
   "reviewCorpus": {
   "reviewCorpus": {
     "totalReviews": 0,
     "totalReviews": 0,
     "brandReviews": 0,
     "brandReviews": 0,

+ 29 - 0
workshop/memory-templates/stage-4-output.json

@@ -6,6 +6,35 @@
   "clientId": "",
   "clientId": "",
   "completedAt": null,
   "completedAt": null,
 
 
+  "_goalAlignment": {
+    "workshopGoal": "",
+    "goalRelevantFindings": [],
+    "goalGapRemaining": "",
+    "nextStageDirection": ""
+  },
+
+  "_anomalies": [],
+
+  "_contextFromPreviousStages": {
+    "stage1KeyMetrics": {
+      "healthScoreOverall": 0,
+      "trendDirection": "",
+      "topRisks": []
+    },
+    "stage2KeyMetrics": {
+      "brandOverallScore": 0,
+      "topVulnerabilities": [],
+      "pricingPosition": ""
+    },
+    "stage3KeyMetrics": {
+      "totalReviews": 0,
+      "overallSentimentScore": 0,
+      "topNegativeKeywords": [],
+      "brandVsCompetitorGap": 0
+    },
+    "previousCalibrationApplied": []
+  },
+
   "painPointInsight": {
   "painPointInsight": {
     "summary": {
     "summary": {
       "totalPainPoints": 0,
       "totalPainPoints": 0,

+ 19 - 0
workshop/memory-templates/stage-5-output.json

@@ -5,6 +5,25 @@
   "clientId": "",
   "clientId": "",
   "completedAt": null,
   "completedAt": null,
 
 
+  "_goalAlignment": {
+    "workshopGoal": "",
+    "goalRelevantFindings": [],
+    "goalFullAnswer": "",
+    "unaddressedAspects": []
+  },
+
+  "_anomalies": [],
+
+  "_contextFromPreviousStages": {
+    "stage1HealthScore": 0,
+    "stage2BrandScore": 0,
+    "stage3SentimentScore": 0,
+    "stage4CriticalPainPoints": 0,
+    "stage4FeatureAvgSatisfaction": 0,
+    "crossStageContradictions": [],
+    "allCalibrationNotesSummary": []
+  },
+
   "proposal": {
   "proposal": {
     "title": "",
     "title": "",
     "chapters": [],
     "chapters": [],

+ 2 - 2
workshop/memory-templates/workshop-progress.json

@@ -74,8 +74,8 @@
       "startedAt": null,
       "startedAt": null,
       "completedAt": null,
       "completedAt": null,
       "deliverables": [
       "deliverables": [
-        "VOC产品优化提案(6章节)",
-        "HTML可演示报告(9屏)",
+        "VOC产品优化提案(11章节)",
+        "HTML可演示报告(13屏)",
         "30天行动时间线",
         "30天行动时间线",
         "ROI估算"
         "ROI估算"
       ],
       ],

+ 73 - 15
workshop/synthesis-prompts.md

@@ -89,8 +89,24 @@
 
 
 8. priorityActions: 基于分析给出3-5条建议
 8. priorityActions: 基于分析给出3-5条建议
 
 
+== 目标对齐(必填) ==
+9. _goalAlignment:
+   - workshopGoal: 原样复制 brand-context.workshopGoal
+   - goalRelevantFindings: 从品类数据中提取与用户目标直接相关的3-5条发现
+     例如用户目标是"想知道品类还有没有机会" → 提取健康度评分+新入场者数量+价格空白
+     例如用户目标是"不确定定价是否合理" → 提取黄金价格带+品牌价格定位+竞品均价
+   - goalGapRemaining: 当前阶段还无法回答用户目标的哪些方面?
+   - nextStageDirection: 下一阶段应重点关注什么来继续回答用户目标?
+
+10. _anomalies: 识别数据中的异常/矛盾/意外发现
+   每项: { "type": "contradiction|surprise|risk", "description": "描述", "severity": "high|medium|low" }
+   例如:
+   - 评分高但销量低 → surprise
+   - CR5极高但新入场者很多 → contradiction
+   - 品类搜索量急跌 → risk
+
 == 输出要求 ==
 == 输出要求 ==
-严格按照 stage-1-output.json v2 schema 输出JSON。
+严格按照 stage-1-output.json v2 schema 输出JSON,包括 _goalAlignment 和 _anomalies
 所有数字字段必须是实际计算值,不能为0或null。
 所有数字字段必须是实际计算值,不能为0或null。
 ```
 ```
 
 
@@ -153,8 +169,26 @@
    - marginEstimate: 按Amazon费用结构估算(FBA费+佣金15%+广告10%)
    - marginEstimate: 按Amazon费用结构估算(FBA费+佣金15%+广告10%)
    - pricingStrategy: 建议的定价策略描述
    - pricingStrategy: 建议的定价策略描述
 
 
+== 上下文传递(必填) ==
+5. _contextFromPreviousStages:
+   - stage1KeyMetrics: 从 stage-1-output 中提取 healthScore.overall, concentration.cr5, goldenPriceBand, trendDirection
+   - stage1CalibrationApplied: 从 calibration-notes.session-1 中提取用户已做的校准修正
+   → 如果用户校准了 cr5 或 topBrands,竞品分析必须使用校准后的值
+
+6. _goalAlignment:
+   - workshopGoal: 原样复制
+   - goalRelevantFindings: 品牌画像+竞品数据中与用户目标直接相关的发现
+   - goalGapRemaining: 还缺什么才能回答用户目标?
+   - nextStageDirection: 评论VOC阶段应重点关注什么?
+
+7. _anomalies: 识别异常
+   例如:
+   - 品牌评分高于品类均值但BSR很低 → surprise
+   - 竞品定价远低于成本线 → risk
+   - stage-1判断品类分散但Top品牌实际占据大量份额 → contradiction(与stage-1矛盾)
+
 == 输出要求 ==
 == 输出要求 ==
-严格按照 stage-2-output.json v2 schema 输出JSON。
+严格按照 stage-2-output.json v2 schema 输出JSON,包括 _goalAlignment、_anomalies、_contextFromPreviousStages
 ```
 ```
 
 
 ---
 ---
@@ -583,10 +617,10 @@ Step 6: summary
 1. actionableInsights.topActions[]:
 1. actionableInsights.topActions[]:
    从以下来源生成Top行动项(至少8项,按priority排序):
    从以下来源生成Top行动项(至少8项,按priority排序):
    
    
-   来源A: Stage3.painPointInsight → 每个critical/high痛点 → 一个修复行动
-   来源B: Stage3.featureSatisfaction.gaps → 每个criticalGap → 一个功能开发行动
-   来源C: Stage3.scenarioDashboard.failure → 每个失败场景 → 一个场景修复行动
-   来源D: Stage3.scenarioDashboard.emerging → 每个新兴场景 → 一个布局行动
+   来源A: Stage4.painPointInsight → 每个critical/high痛点 → 一个修复行动
+   来源B: Stage4.featureSatisfaction.gaps → 每个criticalGap → 一个功能开发行动
+   来源C: Stage4.scenarioDashboard.failure → 每个失败场景 → 一个场景修复行动
+   来源D: Stage4.scenarioDashboard.emerging → 每个新兴场景 → 一个布局行动
    来源E: Stage2.competitorComparison.vulnerabilities → 每个漏洞 → 一个竞争行动
    来源E: Stage2.competitorComparison.vulnerabilities → 每个漏洞 → 一个竞争行动
    
    
    每个行动项:
    每个行动项:
@@ -612,7 +646,7 @@ Step 6: summary
 
 
 4. overallHealthScore:
 4. overallHealthScore:
    - marketPosition: Stage1.healthScore.overall
    - marketPosition: Stage1.healthScore.overall
-   - productQuality: Stage3.featureSatisfaction.summary.avgSatisfactionRate
+   - productQuality: Stage4.featureSatisfaction.summary.avgSatisfactionRate
    - customerSatisfaction: Stage3.voiceClassification.summary.overallSentimentScore
    - customerSatisfaction: Stage3.voiceClassification.summary.overallSentimentScore
    - competitiveAdvantage: 100 - |brandSentimentScore - competitorAvgSentimentScore| 调整
    - competitiveAdvantage: 100 - |brandSentimentScore - competitorAvgSentimentScore| 调整
    - growthPotential: Stage1.healthScore.growthPotential
    - growthPotential: Stage1.healthScore.growthPotential
@@ -620,13 +654,37 @@ Step 6: summary
 
 
 5. vocDeepInsightSummary:
 5. vocDeepInsightSummary:
    - voiceSentimentScore: Stage3.voiceClassification.summary.overallSentimentScore
    - voiceSentimentScore: Stage3.voiceClassification.summary.overallSentimentScore
-   - painPointCriticalCount: Stage3.painPointInsight.summary.criticalCount
-   - featureAvgSatisfaction: Stage3.featureSatisfaction.summary.avgSatisfactionRate
-   - scenarioCoverageRate: Stage3.scenarioDashboard.summary.coverageRate
+   - painPointCriticalCount: Stage4.painPointInsight.summary.criticalCount
+   - featureAvgSatisfaction: Stage4.featureSatisfaction.summary.avgSatisfactionRate
+   - scenarioCoverageRate: Stage4.scenarioDashboard.summary.coverageRate
    - brandVsCompetitorGap: brandSentimentScore - competitorAvgSentimentScore
    - brandVsCompetitorGap: brandSentimentScore - competitorAvgSentimentScore
 
 
+== 目标对齐 + 跨阶段一致性检查(必填) ==
+
+6. _goalAlignment:
+   - workshopGoal: 原样复制
+   - goalRelevantFindings: 从全部5阶段数据中提取与用户目标最相关的5-8条核心发现
+   - goalFullAnswer: 用2-3段话完整回答用户的 workshopGoal(这是整个工作坊的最终答案)
+   - unaddressedAspects: 用户目标中仍未能充分回答的方面(诚实列出)
+
+7. _contextFromPreviousStages:
+   - stage1HealthScore: Stage1.healthScore.overall
+   - stage2BrandScore: Stage2.brandProfile.overallScore
+   - stage3SentimentScore: Stage3.voiceClassification.summary.overallSentimentScore
+   - stage4CriticalPainPoints: Stage4.painPointInsight.summary.criticalCount
+   - stage4FeatureAvgSatisfaction: Stage4.featureSatisfaction.summary.avgSatisfactionRate
+   - crossStageContradictions: 检查以下矛盾并列出:
+     a) Stage1品类增长 vs Stage3评论趋势(增长品类但差评增加?)
+     b) Stage2品牌评分 vs Stage4痛点严重度(评分高但严重痛点多?)
+     c) Stage2竞品弱点 vs Stage4竞品实际VOC表现(标记的弱点在用户评论中是否验证?)
+     d) Stage1价格定位 vs Stage4用户价格感知(定价在黄金带但用户喊贵?)
+   - allCalibrationNotesSummary: 汇总全部session的校准意见,标记哪些已采纳、哪些待确认
+
+8. _anomalies: 汇总全流程中最重要的3-5个异常发现
+   优先级: crossStageContradiction > 用户标记"新发现" > 数据异常值
+
 == 输出JSON格式 ==
 == 输出JSON格式 ==
-输出 actionableInsights + overallHealthScore + vocDeepInsightSummary 三个对象。
+输出 actionableInsights + overallHealthScore + vocDeepInsightSummary + _goalAlignment + _contextFromPreviousStages + _anomalies
 ```
 ```
 
 
 ---
 ---
@@ -640,11 +698,11 @@ Step 6: summary
 | Session 1 | product-search + asin-sales-volume | category-landscape-synthesis |
 | Session 1 | product-search + asin-sales-volume | category-landscape-synthesis |
 | Session 2 | product-detail + sales + reviews | brand-profile-synthesis |
 | Session 2 | product-detail + sales + reviews | brand-profile-synthesis |
 | Session 3 Step 3.2 | review-sentiment-analysis | voice-classification-synthesis (3A) |
 | Session 3 Step 3.2 | review-sentiment-analysis | voice-classification-synthesis (3A) |
-| Session 3 Step 3.3 | review-pain-point-extraction | pain-point-insight-synthesis (3B) |
-| Session 3 Step 3.6 | 无底层API,Agent直接合成 | feature-satisfaction-synthesis (3C) |
-| Session 3 Step 3.7 | 无底层API,Agent直接合成 | scenario-dashboard-synthesis (3D) |
 | Session 3 最后 | 品牌+竞品分组数据 | brand-vs-competitor-synthesis (3E) |
 | Session 3 最后 | 品牌+竞品分组数据 | brand-vs-competitor-synthesis (3E) |
-| Session 4 | user-persona 输出 | persona-enrichment |
+| Session 4 Step 4.3 | review-pain-point-extraction | pain-point-insight-synthesis (3B) |
+| Session 4 Step 4.4 | 无底层API,Agent直接合成 | feature-satisfaction-synthesis (3C) |
+| Session 4 Step 4.5 | 无底层API,Agent直接合成 | scenario-dashboard-synthesis (3D) |
+| Session 4 Step 4.12 | user-persona 输出 | persona-enrichment |
 | Session 5 | 全部前置数据 | actionable-insights-synthesis |
 | Session 5 | 全部前置数据 | actionable-insights-synthesis |
 
 
 ### 关键原则
 ### 关键原则

+ 287 - 15
workshop/workshop-voc-playbook.md

@@ -31,7 +31,117 @@ author: nkkj-BrainHack
 - 所有采集到的品牌信息存入 `memory/brand-context.json`
 - 所有采集到的品牌信息存入 `memory/brand-context.json`
 - 每个阶段的输出存入 `memory/stage-{N}-output.json`
 - 每个阶段的输出存入 `memory/stage-{N}-output.json`
 - 工作坊进度存入 `memory/workshop-progress.json`
 - 工作坊进度存入 `memory/workshop-progress.json`
-- **每次对话开始时**,先读取 workshop-progress.json 判断当前阶段
+- **每次对话开始时**,执行「记忆理解协议」(见下文)
+
+### 记忆理解协议(每次对话必做)
+
+Agent 在每次对话开始时,必须按以下顺序执行:
+
+#### Step M1: 全量记忆加载
+```
+读取顺序(严格按此顺序):
+1. memory/workshop-progress.json → 判断当前阶段 + 哪些阶段已完成
+2. memory/brand-context.json → 品牌名/品类/ASIN/分析目标(workshopGoal)
+3. memory/calibration-notes.json → 用户在各阶段的校准意见
+4. 已完成阶段的 memory/stage-{N}-output.json(按序读取)
+```
+
+#### Step M2: 上下文理解摘要(内部构建,不输出给用户)
+Agent 在内部构建以下理解模型:
+```json
+{
+  "clientGoal": "从 brand-context.workshopGoal 提取",
+  "currentPhase": "从 workshop-progress 判断",
+  "keyFindings": [
+    "从已完成 stage-output 中提取最关键的3-5个发现"
+  ],
+  "pendingCalibrations": [
+    "从 calibration-notes 中提取用户尚未确认或有异议的项"
+  ],
+  "goalAlignmentCheck": "当前发现是否在回答用户的 workshopGoal?有哪些gap?",
+  "crossStageAnomalies": [
+    "stage间数据矛盾(如:stage-1说品类增长,但stage-3评论趋势下降)",
+    "意外发现(如:竞品在某维度远超预期)"
+  ]
+}
+```
+
+#### Step M3: 对话开场展示(向用户)
+如果不是第一次对话,Agent 必须先展示记忆回顾:
+```
+虾:欢迎回来老板!让我回顾一下之前的工作:
+
+📋 你的分析目标:「{{workshopGoal}}」
+📍 当前进度:阶段{{N}} — {{sessionName}}
+
+🧠 虾记住的关键发现:
+{{#each keyFindings}}
+• {{this}}
+{{/each}}
+
+{{#if pendingCalibrations.length > 0}}
+⚠️ 上次你提到的校准意见,我已经记住了:
+{{#each pendingCalibrations}}
+• {{this}}
+{{/each}}
+今天的分析会把这些纳入考虑。
+{{/if}}
+
+{{#if crossStageAnomalies.length > 0}}
+🔍 虾发现了一些值得注意的点:
+{{#each crossStageAnomalies}}
+• {{this}}
+{{/each}}
+{{/if}}
+
+继续阶段{{N}}吗?还是你想先看看之前的某个结果?
+```
+
+#### Step M4: 目标对齐检查(每个阶段结束时)
+每个阶段的分析结果输出后,Agent 必须回扣 workshopGoal:
+```
+虾:🎯 回到你最初的问题:「{{workshopGoal}}」
+基于这个阶段的分析,虾的初步回答是:
+• {{goalAlignmentInsight}}
+
+这个方向对吗?后续阶段会继续深入这个问题。
+```
+
+### 校准反馈前向传递规则
+
+每个 Session 开始前,Agent 必须:
+1. **读取** `calibration-notes.json` 中所有前置 session 的校准意见
+2. **应用**校准意见到当前分析:
+   - 用户标记"已知"的痛点 → 降低权重,不作为"新发现"展示
+   - 用户标记"误判"的项 → 从分析中移除或标注"用户不认同"
+   - 用户标记"新发现"的项 → 提高权重,在后续分析中重点关注
+   - 用户补充的竞品/品牌信息 → 纳入后续分析输入
+3. **告知**用户校准意见已被采纳:
+   ```
+   虾:上次你提到 [具体校准内容],我在这次分析中已经调整了:
+   • [具体调整说明]
+   ```
+
+### 自适应提问规则
+
+校准环节的提问不使用固定模板,而是基于数据动态生成:
+
+#### 异常驱动提问
+当分析数据中出现以下情况时,优先针对异常提问:
+- **数据矛盾**:如评分高但差评率也高 → 问用户"你的产品评分{{rating}}看起来不错,但差评中{{topComplaint}}被反复提到,这是已知问题吗?"
+- **偏离预期**:如品类健康度很低但用户选择进入 → 问用户"品类竞争烈度偏高(CR5={{cr5}}%),你选择这个品类的核心信心来源是什么?"
+- **竞品异常**:如某竞品突然BSR大幅波动 → 问用户"竞品{{name}}最近BSR从{{bsrOld}}飙升到{{bsrNew}},你知道发生了什么吗?"
+
+#### 深度追问规则
+如果用户对校准问题的回答包含新信息,Agent 必须:
+1. 立即追问1-2个细化问题
+2. 将新信息记录到 calibration-notes
+3. 评估是否需要调整已有分析结论
+
+#### 沉默检测
+如果用户对某个校准问题回答"不知道"/"不确定":
+- 不要跳过,而是提供虾的判断 + 依据
+- 让用户选择"接受虾的判断"或"标记待确认"
 
 
 ### 触发词
 ### 触发词
 - 用户说"开始工作坊" / "启动VOC分析" / "开始品类调研" → 从头开始
 - 用户说"开始工作坊" / "启动VOC分析" / "开始品类调研" → 从头开始
@@ -279,15 +389,33 @@ Amazon站点:{{amazonDomain}}
     "userFeedback": "用户原话",
     "userFeedback": "用户原话",
     "corrections": [
     "corrections": [
       { "field": "cr5", "original": "35.2%", "corrected": "约50%", "reason": "用户说头部3家就占了一半" }
       { "field": "cr5", "original": "35.2%", "corrected": "约50%", "reason": "用户说头部3家就占了一半" }
-    ]
+    ],
+    "forwardActions": {
+      "adjustForSession2": ["竞品分析时使用校准后的CR5数据", "重点关注用户提到的头部品牌"],
+      "adjustForLater": []
+    }
   }
   }
 }
 }
 ```
 ```
 
 
+**校准后必做**:更新 `calibration-notes._forwardPassSummary`,汇总本次校准的关键调整。
+
+### 目标回扣(必做)
+```
+虾:🎯 回到你最初的问题:「{{workshopGoal}}」
+基于品类全景分析,虾的初步回答是:
+• {{goalAlignmentInsight}}
+{{#if goalGapRemaining}}
+不过,要更完整地回答你的问题,还需要:{{goalGapRemaining}}
+这些会在后续阶段继续深入。
+{{/if}}
+```
+
 ### 阶段交付
 ### 阶段交付
-1. 存储输出到 `memory/stage-1-output.json`
+1. 存储输出到 `memory/stage-1-output.json`(含 `_goalAlignment` 和 `_anomalies`)
 2. 更新 `workshop-progress.json` → session1.status = "completed"
 2. 更新 `workshop-progress.json` → session1.status = "completed"
-3. 展示交付物清单
+3. 更新 `calibration-notes._forwardPassSummary`
+4. 展示交付物清单
 
 
 ```
 ```
 虾:✅ 阶段一完成!
 虾:✅ 阶段一完成!
@@ -310,6 +438,13 @@ Amazon站点:{{amazonDomain}}
 ### 前置检查
 ### 前置检查
 - ✅ `stage-1-output.json` 存在
 - ✅ `stage-1-output.json` 存在
 - ✅ `brand-context.json` 中 brandAsins 非空
 - ✅ `brand-context.json` 中 brandAsins 非空
+- ✅ 读取 `calibration-notes.sessions.session-1.forwardActions` → 获取需要在本阶段应用的调整
+
+### 校准前向传递
+读取 session-1 的校准意见,在分析中应用:
+- 如果用户校准了 CR5/topBrands → 竞品发现时优先覆盖用户确认的头部品牌
+- 如果用户补充了竞品信息 → 合并到 knownCompetitors
+- 如果 stage-1._anomalies 中有 high severity 项 → 在本阶段开场时告知用户
 
 
 ### 对话开场
 ### 对话开场
 
 
@@ -317,6 +452,14 @@ Amazon站点:{{amazonDomain}}
 虾:🏷️ 阶段二:品牌画像 + 竞品分析
 虾:🏷️ 阶段二:品牌画像 + 竞品分析
 ━━━━━━━━━━━━━━━━━━━━
 ━━━━━━━━━━━━━━━━━━━━
 
 
+{{#if session1CalibrationApplied}}
+📝 上次你校准的内容我已经记住了:
+{{#each session1CalibrationApplied}}
+• {{this}}
+{{/each}}
+这次分析会把这些纳入考虑。
+
+{{/if}}
 这个阶段分三步:
 这个阶段分三步:
 ① 给你的品牌做六维体检
 ① 给你的品牌做六维体检
 ② 自动发现3-5个直接竞品
 ② 自动发现3-5个直接竞品
@@ -384,7 +527,17 @@ Step 2.5: competitor-pricing-analysis(
 ```
 ```
 
 
 ### 校准 + 阶段交付
 ### 校准 + 阶段交付
-流程同 Session 1,存入 `stage-2-output.json`
+流程同 Session 1:记录校准 → 填写 forwardActions → 更新 _forwardPassSummary → 存入 `stage-2-output.json`(含 `_goalAlignment` + `_anomalies` + `_contextFromPreviousStages`)
+
+### 目标回扣(必做)
+```
+虾:🎯 回到你最初的问题:「{{workshopGoal}}」
+品牌画像和竞品数据告诉我们:
+• {{goalAlignmentInsight}}
+{{#if goalGapRemaining}}
+还需要用户评论数据来验证,阶段三会深入这部分。
+{{/if}}
+```
 
 
 ```
 ```
 虾:✅ 阶段二完成!
 虾:✅ 阶段二完成!
@@ -410,9 +563,18 @@ Step 2.5: competitor-pricing-analysis(
 ### 前置检查
 ### 前置检查
 - ✅ `stage-2-output.json` 存在
 - ✅ `stage-2-output.json` 存在
 - ✅ 已确认的竞品ASIN列表
 - ✅ 已确认的竞品ASIN列表
+- ✅ 读取 `calibration-notes.sessions.session-2.forwardActions` → 获取需要在本阶段应用的调整
+- ✅ 读取 `stage-2-output._anomalies` → 关注竞品异常信号
+
+### 校准前向传递
+读取 session-1 + session-2 的校准意见:
+- 用户拒绝的竞品 → 从采集列表中移除
+- 用户新增的竞品 → 加入采集列表
+- session-2 中发现的竞品弱点 → 采集评论时重点关注对应 ASIN 的差评
 
 
 ### 自动构建ASIN列表
 ### 自动构建ASIN列表
 从 brand-context.brandAsins + stage-2-output.competitorAsins 合并去重(共5-8个ASIN)
 从 brand-context.brandAsins + stage-2-output.competitorAsins 合并去重(共5-8个ASIN)
+**注意**:必须使用经过 session-2 校准确认后的竞品列表
 
 
 ### 对话开场
 ### 对话开场
 
 
@@ -554,13 +716,24 @@ Step 3.6: 将 Step3.4~3.5 的输出 + reviewCorpus元数据 + keywordCloud 写
 ```
 ```
 
 
 ### 阶段交付
 ### 阶段交付
-存入 `stage-3-output.json`
+存入 `stage-3-output.json`(含 `_goalAlignment` + `_anomalies` + `_contextFromPreviousStages`)
+记录校准到 calibration-notes → 填写 `forwardActions`(特别是 `knownPainPointsToDeprioritize`、`newDiscoveriesToHighlight`、`misjudgedItemsToRemove`)→ 更新 `_forwardPassSummary`
 
 
 **注意:stage-3-output.json 保存以下数据供阶段四使用:**
 **注意:stage-3-output.json 保存以下数据供阶段四使用:**
 - `reviewCorpus` — 原始评论数据(阶段四深度分析的输入)
 - `reviewCorpus` — 原始评论数据(阶段四深度分析的输入)
 - `voiceClassification` — 情感分布+维度细分
 - `voiceClassification` — 情感分布+维度细分
 - `keywordCloud` — 关键词情感地图
 - `keywordCloud` — 关键词情感地图
 - `brandVsCompetitor` — 品牌vs竞品情感对比
 - `brandVsCompetitor` — 品牌vs竞品情感对比
+- `_goalAlignment` — 目标对齐(阶段四继续深入的方向)
+- `_anomalies` — 异常发现(阶段四验证或追踪)
+
+### 目标回扣(必做)
+```
+虾:🎯 回到你最初的问题:「{{workshopGoal}}」
+从用户评论中,虾发现了:
+• {{goalAlignmentInsight}}
+明天上午的深度分析会进一步挖掘这些发现。
+```
 
 
 ```
 ```
 虾:✅ 阶段三完成!
 虾:✅ 阶段三完成!
@@ -586,6 +759,21 @@ Step 3.6: 将 Step3.4~3.5 的输出 + reviewCorpus元数据 + keywordCloud 写
 ### 前置检查
 ### 前置检查
 - ✅ `stage-3-output.json` 存在(含reviewCorpus原始数据)
 - ✅ `stage-3-output.json` 存在(含reviewCorpus原始数据)
 - ✅ `calibration-notes.json` 中 session3 校准意见已记录
 - ✅ `calibration-notes.json` 中 session3 校准意见已记录
+- ✅ 读取 `calibration-notes.sessions.session-3.forwardActions` → **这是最关键的前向传递**
+- ✅ 读取 `stage-3-output._anomalies` → 需要在深度分析中验证的异常
+
+### 校准前向传递(Session 3→4 核心机制)
+读取 session-3 校准中的三个标记列表,直接影响本阶段分析:
+
+| session-3 标记 | session-4 调整 |
+|---------------|---------------|
+| `knownPainPointsToDeprioritize` | 痛点分析时降低这些项的权重,不作为"新发现"展示 |
+| `newDiscoveriesToHighlight` | 痛点/亮点分析时提高这些项的权重,重点深挖 |
+| `misjudgedItemsToRemove` | 从分析中移除或标注"用户不认同" |
+
+同时检查 stage-1 + stage-2 的 `_anomalies`,在深度分析中验证:
+- stage-1 的品类异常 → 评论中是否有佐证?
+- stage-2 的竞品弱点 → 竞品评论中是否验证了这些弱点?
 
 
 ### 模块说明
 ### 模块说明
 本阶段包含三个模块,按顺序执行:
 本阶段包含三个模块,按顺序执行:
@@ -599,6 +787,14 @@ Step 3.6: 将 Step3.4~3.5 的输出 + reviewCorpus元数据 + keywordCloud 写
 虾:📊 阶段四:深度VOC分析 + 社媒洞察 + 用户画像
 虾:📊 阶段四:深度VOC分析 + 社媒洞察 + 用户画像
 ━━━━━━━━━━━━━━━━━━━━
 ━━━━━━━━━━━━━━━━━━━━
 
 
+{{#if session3CalibrationApplied}}
+📝 昨晚你的校准意见我已经消化了:
+{{#each session3CalibrationApplied}}
+• {{this}}
+{{/each}}
+今天的深度分析会基于你的反馈做调整。
+
+{{/if}}
 昨晚我们采集了 {{totalReviews}} 条评论,今天我要深挖这些数据:
 昨晚我们采集了 {{totalReviews}} 条评论,今天我要深挖这些数据:
 
 
 Part 1 - 深度VOC分析:
 Part 1 - 深度VOC分析:
@@ -832,7 +1028,8 @@ Step 4.13: 将以上所有输出写入 memory/stage-4-output.json
 ```
 ```
 
 
 ### 阶段交付
 ### 阶段交付
-存入 `stage-4-output.json`
+存入 `stage-4-output.json`(含 `_goalAlignment` + `_anomalies` + `_contextFromPreviousStages`)
+记录校准到 calibration-notes → 填写 `forwardActions`(特别是 `proposalEmphasis`、`proposalDeemphasis`、`userDefinedPriority`)→ 更新 `_forwardPassSummary`
 
 
 **stage-4-output.json 包含:**
 **stage-4-output.json 包含:**
 - `painPointInsight` — 痛点深度洞察(显性+隐性+权重+关联)
 - `painPointInsight` — 痛点深度洞察(显性+隐性+权重+关联)
@@ -842,6 +1039,24 @@ Step 4.13: 将以上所有输出写入 memory/stage-4-output.json
 - `socialTrend` — 社媒趋势(如可用)
 - `socialTrend` — 社媒趋势(如可用)
 - `competitorBsr` — 竞品BSR追踪
 - `competitorBsr` — 竞品BSR追踪
 - `userPersona` — 3-5个用户画像
 - `userPersona` — 3-5个用户画像
+- `_goalAlignment` — 目标对齐(最终报告方向)
+- `_anomalies` — 全流程异常汇总
+
+### 目标回扣(必做)
+```
+虾:🎯 回到你最初的问题:「{{workshopGoal}}」
+经过4个阶段的全面分析,虾现在可以给出比较完整的回答了:
+• {{goalAlignmentInsight}}
+{{#if crossStageAnomalies}}
+
+🔍 虾还发现了一些意外的点:
+{{#each crossStageAnomalies}}
+• {{this}}
+{{/each}}
+{{/if}}
+
+最终报告会把这些都整合成可落地的行动计划。
+```
 
 
 ```
 ```
 虾:✅ 阶段四完成!这是整个工作坊信息量最大的一个阶段。
 虾:✅ 阶段四完成!这是整个工作坊信息量最大的一个阶段。
@@ -865,8 +1080,26 @@ Step 4.13: 将以上所有输出写入 memory/stage-4-output.json
 
 
 ### 前置检查
 ### 前置检查
 - ✅ `stage-1~4-output.json` 全部存在
 - ✅ `stage-1~4-output.json` 全部存在
+- ✅ `calibration-notes.json` 全部 session 校准已记录
+- ✅ 读取 `calibration-notes._forwardPassSummary` → 全量校准摘要
+- ✅ 读取所有 stage 的 `_goalAlignment` 和 `_anomalies` → 目标进度 + 异常汇总
 - 如果缺少某个阶段,提示用户先补完
 - 如果缺少某个阶段,提示用户先补完
 
 
+### 校准前向传递(全量汇总)
+这是最终报告,必须整合所有前置校准:
+
+1. **读取 `_forwardPassSummary`** — 获取用户的全部校准意见摘要
+2. **读取 session-4.forwardActions** — 特别关注:
+   - `proposalEmphasis`: 用户希望报告重点强调的内容
+   - `proposalDeemphasis`: 用户认为不重要或误判的内容
+   - `userDefinedPriority`: 用户自定义的优先级(覆盖算法排序)
+3. **跨阶段一致性检查**(必做):
+   - 比对 stage-1 品类趋势 vs stage-3 评论情感趋势
+   - 比对 stage-2 竞品标记的弱点 vs stage-4 竞品VOC实际表现
+   - 比对 stage-1 价格定位 vs stage-4 用户价格感知
+   - 如有矛盾,在报告中明确指出并解释
+4. **合并所有 `_anomalies`** — 将跨阶段的异常发现整合为报告中的"意外发现"章节
+
 ### 对话开场
 ### 对话开场
 
 
 ```
 ```
@@ -874,10 +1107,23 @@ Step 4.13: 将以上所有输出写入 memory/stage-4-output.json
 ━━━━━━━━━━━━━━━━━━━━
 ━━━━━━━━━━━━━━━━━━━━
 
 
 到了交作业的时候了!我要做两件事:
 到了交作业的时候了!我要做两件事:
-① 生成《VOC产品优化提案》(10章节)
+① 生成《VOC产品优化提案》(11章节)
 ② 生成13屏可演示HTML报告
 ② 生成13屏可演示HTML报告
 
 
-我会把前面4个阶段的所有数据整合起来。
+{{#if forwardPassSummary.totalCorrections > 0}}
+📝 在生成报告之前,让我确认一下你之前的校准意见:
+{{#each forwardPassSummary.keyAdjustments}}
+• {{this}}
+{{/each}}
+{{#if forwardPassSummary.pendingUncertainties.length > 0}}
+⚠️ 还有这些待确认的项,你现在想确认一下吗?
+{{#each forwardPassSummary.pendingUncertainties}}
+• {{this}}
+{{/each}}
+{{/if}}
+{{/if}}
+
+我会把前面4个阶段的所有数据 + 你的校准意见整合起来。
 ```
 ```
 
 
 ### 技能调用序列
 ### 技能调用序列
@@ -895,7 +1141,7 @@ Step 5.1: voc-proposal(
   categoryKeyword = brand-context.categoryKeywords[0],
   categoryKeyword = brand-context.categoryKeywords[0],
   calibrationNotes = memory/calibration-notes.json
   calibrationNotes = memory/calibration-notes.json
 )
 )
-→ 输出: proposal (10章节提案 + actionableInsights + overallHealthScore + ROI + 30天行动线)
+→ 输出: proposal (11章节提案 + actionableInsights + overallHealthScore + ROI + 30天行动线)
 
 
 Step 5.2: html-report-generator(
 Step 5.2: html-report-generator(
   industryName = 从categoryKeywords推断,
   industryName = 从categoryKeywords推断,
@@ -981,14 +1227,40 @@ Step 5.2: html-report-generator(
 HTML报告已生成(13屏),可在浏览器打开直接演示。
 HTML报告已生成(13屏),可在浏览器打开直接演示。
 ```
 ```
 
 
+### 最终目标回答(必做 — 整个工作坊的核心输出)
+
+```
+虾:🎯 老板,还记得你最初的问题吗:「{{workshopGoal}}」
+
+经过两天5个阶段的全面分析,虾的最终回答是:
+
+{{goalFullAnswer}}
+
+{{#if unaddressedAspects.length > 0}}
+⚠️ 有几个方面目前数据还不够充分:
+{{#each unaddressedAspects}}
+• {{this}}
+{{/each}}
+建议后续持续追踪。
+{{/if}}
+
+{{#if crossStageContradictions.length > 0}}
+🔍 分析过程中发现的重要矛盾(已在报告中标注):
+{{#each crossStageContradictions}}
+• {{this}}
+{{/each}}
+{{/if}}
+```
+
 ### 最终校准
 ### 最终校准
 
 
 ```
 ```
 虾:老板,这是两天分析的最终成果。请你整体审阅一下:
 虾:老板,这是两天分析的最终成果。请你整体审阅一下:
 
 
-1️⃣ 11章节的内容和结论有没有明显偏差?
-2️⃣ 30天行动计划的优先级排序合理吗?
-3️⃣ 有没有想补充的战略方向?
+1️⃣ 我对你问题「{{workshopGoal}}」的回答到位吗?
+2️⃣ 11章节的内容和结论有没有明显偏差?
+3️⃣ 30天行动计划的优先级排序合理吗?
+4️⃣ 有没有想补充的战略方向?
 
 
 你的反馈我会记录下来,作为提案的"老板批注"附在最后。
 你的反馈我会记录下来,作为提案的"老板批注"附在最后。
 ```
 ```
@@ -1084,6 +1356,6 @@ HTML报告已生成(13屏),可在浏览器打开直接演示。
 | 建档 | brand-context-builder | 对话采集 |
 | 建档 | brand-context-builder | 对话采集 |
 | Session 1 | category-landscape (含 product-search ×2-3, asin-sales-volume ×100, keyword-search ×5-10, keyword-search-trend ×5, category-tree ×1) | 3-5min |
 | Session 1 | category-landscape (含 product-search ×2-3, asin-sales-volume ×100, keyword-search ×5-10, keyword-search-trend ×5, category-tree ×1) | 3-5min |
 | Session 2 | brand-profile, competitor-discovery, product-deep-analysis, competitor-product-comparison, competitor-pricing-analysis | 5-8min |
 | Session 2 | brand-profile, competitor-discovery, product-deep-analysis, competitor-product-comparison, competitor-pricing-analysis | 5-8min |
-| Session 3 | review-batch-collection, review-sentiment-analysis, review-pain-point-extraction, review-highlight-extraction, review-keyword-cloud | 3-5min |
-| Session 4 | tiktok-category-voc, tiktok-brand-voc, instagram-brand-voc, douyin-general-search, social-trend-analysis, competitor-bsr-tracking, user-persona | 5-8min |
+| Session 3 | review-batch-collection, review-sentiment-analysis, review-keyword-cloud | 3-5min |
+| Session 4 | review-pain-point-extraction, review-highlight-extraction, tiktok-category-voc, tiktok-brand-voc, instagram-brand-voc, douyin-general-search, social-trend-analysis, competitor-bsr-tracking, user-persona | 8-10min |
 | Session 5 | voc-proposal, html-report-generator | 3-5min |
 | Session 5 | voc-proposal, html-report-generator | 3-5min |