Procházet zdrojové kódy

chore(voc-skill): remove all dining content incl. local-dining preset; neutralize examples to home-custom

gangvy před 3 měsíci
rodič
revize
be1bb04ecb
41 změnil soubory, kde provedl 582 přidání a 829 odebrání
  1. 13 13
      claude-code/claude-code-voc-intelligence/README.md
  2. 11 11
      claude-code/claude-code-voc-intelligence/bin/claude-voc.js
  3. 20 20
      claude-code/claude-code-voc-intelligence/docs/boss-prompt-templates.md
  4. 6 6
      claude-code/claude-code-voc-intelligence/docs/capability-map.md
  5. 11 11
      claude-code/claude-code-voc-intelligence/docs/claude-code-troubleshooting-playbook.md
  6. 2 2
      claude-code/claude-code-voc-intelligence/docs/deliverables/seven-day-content-plan.md
  7. 1 1
      claude-code/claude-code-voc-intelligence/docs/deliverables/single-problem-action-plan.md
  8. 1 1
      claude-code/claude-code-voc-intelligence/docs/deliverables/trend-insight-report.md
  9. 6 6
      claude-code/claude-code-voc-intelligence/docs/live-manual-acceptance-checklist.md
  10. 1 1
      claude-code/claude-code-voc-intelligence/install.js
  11. 1 1
      claude-code/claude-code-voc-intelligence/mcp/src/features/douyin-trend/live-collector.js
  12. 1 1
      claude-code/claude-code-voc-intelligence/mcp/src/features/voc-business-workflow/business-workflow.js
  13. 28 28
      claude-code/claude-code-voc-intelligence/mcp/src/features/voc-competitor-map/competitor-map.js
  14. 67 220
      claude-code/claude-code-voc-intelligence/mcp/src/features/voc-content-plan/content-plan.js
  15. 26 26
      claude-code/claude-code-voc-intelligence/mcp/src/features/voc-issue-pool/issue-pool.js
  16. 91 91
      claude-code/claude-code-voc-intelligence/mcp/src/features/voc-problem-deep-dive/deep-dive.js
  17. 0 38
      claude-code/claude-code-voc-intelligence/mcp/src/features/xiaohongshu-trend/industry-presets.js
  18. 1 1
      claude-code/claude-code-voc-intelligence/mcp/src/server.js
  19. 6 6
      claude-code/claude-code-voc-intelligence/package.json
  20. 7 7
      claude-code/claude-code-voc-intelligence/scripts/smoke-cross-industry.js
  21. 30 57
      claude-code/claude-code-voc-intelligence/scripts/smoke-mcp.js
  22. 91 91
      claude-code/claude-code-voc-intelligence/scripts/smoke-package.js
  23. 2 2
      claude-code/claude-code-voc-intelligence/skill-package-manifest.json
  24. 4 4
      claude-code/claude-code-voc-intelligence/skills/douyin-trend-intelligence/SKILL.md
  25. 1 1
      claude-code/claude-code-voc-intelligence/skills/douyin-trend-intelligence/references/live-mode.md
  26. 1 1
      claude-code/claude-code-voc-intelligence/skills/voc-api-catalog/SKILL.md
  27. 1 1
      claude-code/claude-code-voc-intelligence/skills/voc-business-workflow/SKILL.md
  28. 4 4
      claude-code/claude-code-voc-intelligence/skills/voc-competitor-map/SKILL.md
  29. 22 0
      claude-code/claude-code-voc-intelligence/skills/voc-competitor-map/references/competitor-framework.md
  30. 33 0
      claude-code/claude-code-voc-intelligence/skills/voc-competitor-map/references/differentiation-patterns.md
  31. 0 25
      claude-code/claude-code-voc-intelligence/skills/voc-competitor-map/references/restaurant-competitor-framework.md
  32. 0 44
      claude-code/claude-code-voc-intelligence/skills/voc-competitor-map/references/restaurant-differentiation-patterns.md
  33. 8 8
      claude-code/claude-code-voc-intelligence/skills/voc-content-plan/SKILL.md
  34. 29 0
      claude-code/claude-code-voc-intelligence/skills/voc-content-plan/references/content-framework.md
  35. 0 41
      claude-code/claude-code-voc-intelligence/skills/voc-content-plan/references/restaurant-content-framework.md
  36. 0 34
      claude-code/claude-code-voc-intelligence/skills/voc-content-plan/references/restaurant-speaking-script-patterns.md
  37. 31 0
      claude-code/claude-code-voc-intelligence/skills/voc-content-plan/references/speaking-script-patterns.md
  38. 4 4
      claude-code/claude-code-voc-intelligence/skills/voc-issue-pool/SKILL.md
  39. 5 5
      claude-code/claude-code-voc-intelligence/skills/voc-problem-deep-dive/SKILL.md
  40. 14 14
      claude-code/claude-code-voc-intelligence/skills/voc-speaking-script/SKILL.md
  41. 2 2
      claude-code/claude-code-voc-intelligence/skills/xiaohongshu-trend-intelligence/SKILL.md

+ 13 - 13
claude-code/claude-code-voc-intelligence/README.md

@@ -29,7 +29,7 @@
 - “把这些评论整理成问题池”
 - “哪些问题最影响生意,先改哪个”
 - “这个问题老板该怎么解决”
-- “继续深挖排队/价格/服务/味道这个问题”
+- “继续深挖怎么选/价格/服务/质量这个问题”
 - “下周账号发什么内容”
 - “根据这些顾客吐槽生成 7 天口播脚本”
 - “这个动作不适合我们,下次别推荐”
@@ -140,7 +140,7 @@ npx --yes @vocmarket/voc-skill@latest install --smoke
 抖音演示样例:
 
 ```text
-帮我做一份本地生活餐饮行业的抖音趋势情报。
+帮我做一份家居定制行业的抖音趋势情报。
 先用演示样例跑通流程,不要真实采集。
 在聊天里给我第一轮样本观察和待确认问题。
 ```
@@ -154,25 +154,25 @@ npx --yes @vocmarket/voc-skill@latest install --smoke
 单点 VOC 深挖:
 
 ```text
-继续深挖“排队”这个问题,站在老板视角告诉我怎么解决,给出今天能做的动作和 7 天验证计划。
+继续深挖“怎么选”这个问题,站在老板视角告诉我怎么解决,给出今天能做的动作和 7 天验证计划。
 ```
 
 竞品图谱:
 
 ```text
-我是南昌做烧烤的,不知道竞品是谁,帮我先做一份竞品图谱和错位竞争建议。
+我是做家居定制的,不知道竞品是谁,帮我先做一份竞品图谱和错位竞争建议。
 ```
 
 7 天内容选题:
 
 ```text
-根据“排队久、人均贵、第一次来怕踩雷”这些顾客问题,帮我生成 7 天短视频选题和口播脚本。
+根据“第一次买怎么选、价格贵、怕踩雷”这些用户问题,帮我生成 7 天短视频选题和口播脚本。
 ```
 
 多轮记忆反馈:
 
 ```text
-这个店不想做等位饮品,更想先改评论区回复和预点单,后面按这个方向继续优化。
+这个品牌不想做试用体验,更想先改评论区回复和案例展示,后面按这个方向继续优化。
 ```
 
 ## Claude Code 应如何调用
@@ -231,10 +231,10 @@ npm --prefix claude-code-voc-intelligence run smoke:package
 - `docs/live-manual-acceptance-checklist.md`
 - `docs/payment-package-links.md`
 - `docs/context-budget-implementation-plan.md`
-- `skills/voc-content-plan/references/restaurant-content-framework.md`
-- `skills/voc-content-plan/references/restaurant-speaking-script-patterns.md`
-- `skills/voc-competitor-map/references/restaurant-competitor-framework.md`
-- `skills/voc-competitor-map/references/restaurant-differentiation-patterns.md`
+- `skills/voc-content-plan/references/content-framework.md`
+- `skills/voc-content-plan/references/speaking-script-patterns.md`
+- `skills/voc-competitor-map/references/competitor-framework.md`
+- `skills/voc-competitor-map/references/differentiation-patterns.md`
 
 ## 工作坊输出口径
 
@@ -259,7 +259,7 @@ voc_business_workflow_run
 典型话术:
 
 ```text
-帮我看一下南昌餐饮最近顾客在关心什么,并告诉我先改哪里、下周发什么。
+帮我看一下家居定制最近用户在关心什么,并告诉我先改哪里、下周发什么。
 ```
 
 这条链路会自动串起趋势情报、VOC 问题池、单点深挖、7 天内容计划和口播脚本。第一轮仍然是初步判断,必须提示用户结合门店、销售、私域反馈校准。
@@ -296,8 +296,8 @@ https://app.fmode.cn/dev/apig-pay/?apigid=Vo3ROWEvDy&fun_id=HOkkX72PMF
 示例:
 
 ```text
-这个动作不适合我们,下次别推荐等位饮品
-这个有效,后面优先做评论区回复和预点单
+这个动作不适合我们,下次别推荐试用体验
+这个有效,后面优先做评论区回复和案例展示
 ```
 
 工具会把反馈沉淀为偏好动作、屏蔽动作、验证有效动作或验证无效动作,让后续建议逐步贴近真实业务。

+ 11 - 11
claude-code/claude-code-voc-intelligence/bin/claude-voc.js

@@ -468,19 +468,19 @@ function workspaceProblemDeepDiveSkillText(targetDir) {
     '## 命令',
     '',
     '```bash',
-    `node ${quotedPath(deepDiveRunner)} --issue "排队" --industry "本地生活餐饮" --scenario "门店经营" --audience "到店顾客" --assistant-message-only`,
+    `node ${quotedPath(deepDiveRunner)} --issue "怎么选" --industry "家居定制" --scenario "线上获客" --audience "意向用户" --assistant-message-only`,
     '```',
     '',
     '## 带记忆的多轮迭代',
     '',
     '```bash',
-    `node ${quotedPath(deepDiveRunner)} --issue "排队" --industry "本地生活餐饮" --scenario "门店经营" --audience "到店顾客" --memory "outputs/voc-problem-memory.json" --feedback "老板不想做等位饮品,更想先改评论区回复和预点单" --blocked-actions "等位饮品" --preferred-actions "评论区回复,预点单" --assistant-message-only`,
+    `node ${quotedPath(deepDiveRunner)} --issue "怎么选" --industry "家居定制" --scenario "线上获客" --audience "意向用户" --memory "outputs/voc-problem-memory.json" --feedback "老板不想做直播带看,更想先改评论区回复和方案说明" --blocked-actions "直播带看" --preferred-actions "评论区回复,方案说明" --assistant-message-only`,
     '```',
     '',
     '自然语言反馈也可以直接传入 `feedback`,工具会尝试自动提取偏好和屏蔽动作:',
     '',
     '```bash',
-    `node ${quotedPath(deepDiveRunner)} --issue "排队" --project "样板门店A" --industry "本地生活餐饮" --scenario "门店经营" --audience "到店顾客" --feedback "这个店不想做等位饮品,更想先改评论区回复和预点单" --assistant-message-only`,
+    `node ${quotedPath(deepDiveRunner)} --issue "怎么选" --project "示例品牌A" --industry "家居定制" --scenario "线上获客" --audience "意向用户" --feedback "这个品牌不想做直播带看,更想先改评论区回复和方案说明" --assistant-message-only`,
     '```',
     '',
     '运行后把命令输出正文直接发给用户。不要展示 JSON、summary、data、files 或调试日志。',
@@ -513,13 +513,13 @@ function workspaceIssuePoolSkillText(targetDir) {
     '## 命令',
     '',
     '```bash',
-    `node ${quotedPath(issuePoolRunner)} --project "样板门店A" --industry "本地生活餐饮" --scenario "门店经营" --audience "到店顾客" --evidence "排队久,但是不知道值不值得等。,人均有点高,第一次来不知道怎么点不踩雷。,服务忙起来没人理。" --assistant-message-only`,
+    `node ${quotedPath(issuePoolRunner)} --project "示例品牌A" --industry "家居定制" --scenario "线上获客" --audience "意向用户" --evidence "第一次买不知道怎么选,怕踩雷。,价格有点高,不确定值不值。,咨询的时候没人理。" --assistant-message-only`,
     '```',
     '',
     '带报告文件:',
     '',
     '```bash',
-    `node ${quotedPath(issuePoolRunner)} --project "样板门店A" --industry "本地生活餐饮" --report "outputs/douyin-trend-report.md" --assistant-message-only`,
+    `node ${quotedPath(issuePoolRunner)} --project "示例品牌A" --industry "家居定制" --report "outputs/douyin-trend-report.md" --assistant-message-only`,
     '```',
     '',
     '运行后把命令输出正文直接发给用户。不要展示 JSON、summary、data、files 或调试日志。',
@@ -545,7 +545,7 @@ function workspaceContentPlanSkillText(targetDir) {
     '## 命令',
     '',
     '```bash',
-    `node ${quotedPath(runner)} --brand "样板门店A" --industry "本地生活餐饮" --issues "第一次来怕踩雷;觉得人均贵;怕排队久" --assistant-message-only`,
+    `node ${quotedPath(runner)} --brand "示例品牌A" --industry "家居定制" --issues "第一次买怕踩雷;觉得价格贵;怕质量不稳定" --assistant-message-only`,
     '```',
     '',
     '运行后把正文直接发给用户,不要展示 JSON。',
@@ -571,13 +571,13 @@ function workspaceSpeakingScriptSkillText(targetDir) {
     '## 命令',
     '',
     '```bash',
-    `node ${quotedPath(runner)} --brand "样板门店A" --industry "本地生活餐饮" --topic "第一次来怎么点不踩雷" --user-issue "第一次来怕点错" --evidence "第一次来不知道怎么点,怕踩雷" --assistant-message-only`,
+    `node ${quotedPath(runner)} --brand "示例品牌A" --industry "家居定制" --topic "第一次买怎么选不踩雷" --user-issue "第一次买怕选错" --evidence "第一次买不知道怎么选,怕踩雷" --assistant-message-only`,
     '```',
     '',
     '改稿:',
     '',
     '```bash',
-    `node ${quotedPath(runner)} --brand "样板门店A" --topic "第一次来怎么点不踩雷" --user-issue "第一次来怕点错" --evidence "第一次来不知道怎么点,怕踩雷" --feedback "开头更狠一点,老板视角,少讲概念,多给具体场景" --assistant-message-only`,
+    `node ${quotedPath(runner)} --brand "示例品牌A" --topic "第一次买怎么选不踩雷" --user-issue "第一次买怕选错" --evidence "第一次买不知道怎么选,怕踩雷" --feedback "开头更狠一点,老板视角,少讲概念,多给具体场景" --assistant-message-only`,
     '```',
     '',
     '定稿时传 `--finalize true`,工具会写入脚本记忆。运行后把正文直接发给用户,不要展示 JSON。',
@@ -603,7 +603,7 @@ function workspaceCompetitorMapSkillText(targetDir) {
     '## 命令',
     '',
     '```bash',
-    `node ${quotedPath(runner)} --brand "样板门店A" --city "南昌" --category "餐饮" --assistant-message-only`,
+    `node ${quotedPath(runner)} --brand "示例品牌A" --city "本地" --category "家居定制" --assistant-message-only`,
     '```',
     '',
     '运行后把正文直接发给用户,不要展示 JSON。',
@@ -627,7 +627,7 @@ function workspaceBusinessWorkflowSkillText(targetDir) {
     '## 命令',
     '',
     '```bash',
-    `node ${quotedPath(runner)} --brand "样板门店A" --industry "本地生活餐饮" --platform douyin --collection-mode sample --keywords "南昌菜,第一次来怎么点,排队" --assistant-message-only`,
+    `node ${quotedPath(runner)} --brand "示例品牌A" --industry "家居定制" --platform douyin --collection-mode sample --keywords "家居定制怎么选,第一次买怎么对比,售后" --assistant-message-only`,
     '```',
     '',
     '真实采集时把 `--collection-mode sample` 换成 `--collection-mode live`。如果工具提示没有 token、余额不足或没有样本,直接把工具正文发给用户,并保留充值/降级建议。',
@@ -717,7 +717,7 @@ function printNextSteps(targetDir) {
   }
   console.log('');
   console.log('Try this prompt in Claude Code:');
-  console.log('  帮我看一下南昌餐饮最近顾客在关心什么,并告诉我先改哪里、下周发什么。');
+  console.log('  帮我看一下家装全屋定制最近用户在关心什么,并告诉我先改哪里、下周发什么。');
   console.log('');
   console.log('Or try:');
   console.log('  帮我做一份家装全屋定制行业的小红书趋势情报。');

+ 20 - 20
claude-code/claude-code-voc-intelligence/docs/boss-prompt-templates.md

@@ -14,11 +14,11 @@
 ```text
 我的品牌/门店是:[品牌名]
 城市/商圈:[城市、商圈、门店位置]
-行业/品类:[餐饮/家装/医美/教育/零售/本地生活等]
-主打产品/服务:[核心产品、套餐、服务项目]
-人均/客单价:[大概价格,不知道就写不确定]
+行业/品类:[家装/医美/教育/零售/专业服务等]
+主打产品/服务:[核心产品、方案、服务项目]
+客单价:[大概价格,不知道就写不确定]
 主要客群:[谁来买,比如情侣、家庭、宝妈、老板、年轻人、学生等]
-主要消费场景:[聚餐/约会/生日/装修/送礼/学习/改善型消费等]
+主要消费场景:[约会/生日/装修/送礼/学习/改善型消费等]
 已知竞品:[竞品1、竞品2、竞品3;不知道就写不知道]
 当前最头疼的问题:
 1. [问题1]
@@ -29,7 +29,7 @@
 7. [竞品名3]
 
 重点追踪这些信号:
-[价格、套餐、排队、服务、出品、效果、口碑、避坑、新鲜感、拍照、复购、竞品对比]
+[价格、方案、怎么选、服务、质量、效果、口碑、避坑、新鲜感、售后、复购、竞品对比]
 
 请保留:
 1. 原帖/视频链接
@@ -80,8 +80,8 @@
 品牌/门店:[品牌名]
 城市/区域:[城市/商圈]
 行业/品类:[行业品类]
-人均/客单价:[价格,不确定就写不确定]
-主要消费场景:[聚餐/约会/家庭/商务/送礼/学习等]
+客单价:[价格,不确定就写不确定]
+主要消费场景:[约会/家庭/商务/送礼/学习等]
 已知竞品:[如果有就写,没有就写不知道]
 当前痛点:
 1. [痛点1]
@@ -163,10 +163,10 @@
 请根据这些 VOC 问题,给我做一份 7 天内容计划。
 
 品牌/门店:[品牌名]
-平台:[小红书/抖音/视频号/大众点评]
+平台:[小红书/抖音/视频号]
 行业/品类:[行业品类]
 目标用户:[目标客群]
-本周想解决的问题:[价格解释/套餐不清楚/排队/服务/新鲜感/竞品对比/信任不足]
+本周想解决的问题:[价格解释/方案不清楚/怎么选/服务/质量/竞品对比/信任不足]
 
 用户原话:
 1. [用户原话1]
@@ -264,27 +264,27 @@
 最后告诉我本周先改哪里、下周发什么内容。
 ```
 
-## 12. 盛焰铁板烧可直接使用的版本
+## 12. 可直接使用的样本(家居定制示例)
 
 ```text
-我是南昌做铁板烧的门店老板,品牌叫盛焰铁板烧
+我是做全屋定制的品牌负责人,品牌叫示例品牌A
 
 品牌背景:
-盛焰铁板烧是江西本地连锁铁板烧品牌,直营 9 家,主打到店现制、聚餐、套餐和铁板烧体验。
+示例品牌A 是本地全屋定制品牌,直营 9 家门店,主打上门量尺、方案设计、整装方案和定制交付体验。
 
 已知竞品:
-立方铁、火地、大神太神、炙焰、大渔、航海家
+竞品A、竞品B、竞品C、竞品D、竞品E
 
 当前痛点:
 1. 日常营销能够带来 TC,但是活动折扣大,客单受影响,最后营业额没有提升。
 2. 营销玩法同质化严重,大多数属于低价竞争,自发传播裂变能力弱。
 3. 品牌模式趋于老化,顾客没有新鲜感,核心竞争力不突出,消费者选择优先级不足。
-4. 铁板烧都是当顾客面现场制作,效率不高,且无法快速通过漂亮菜的模式传递给顾客,无法形成顾客自传播。
+4. 定制交付周期长、细节多,用户第一次买很难判断质量和是否适合,难以形成用户自传播。
 
 请基于以上信息做 VOC 经营诊断。
 要求:
 1. 先判断现有样本是否足够。
-2. 如果不足,先生成小红书和抖音补采矩阵,关键词要具体到南昌铁板烧、盛焰、竞品名、价格、套餐、值不值、排队、聚餐、新鲜感
+2. 如果不足,先生成小红书和抖音补采矩阵,关键词要具体到全屋定制、家居定制、竞品名、价格、方案、值不值、怎么选、质量、售后
 3. 采集或整理时必须保留原帖/视频链接、图片/封面、用户评论原话。
 4. 问题池只能使用真实用户评论,不要把品牌介绍或报告标题当证据。
 5. 最后围绕四个痛点输出:问题判断、用户证据、竞品画像、品类心智、老板本周动作、下周内容方向。
@@ -301,7 +301,7 @@
 ```text
 请基于刚才的 VOC 经营闭环结果继续深入。
 
-我想重点看:[价格/套餐/排队/服务/新鲜感/竞品/内容传播/复购]
+我想重点看:[价格/方案/怎么选/服务/新鲜感/竞品/内容传播/复购]
 
 请不要重新泛泛分析,请直接围绕上一轮结果做:
 1. 哪些判断有真实评论证据支撑
@@ -335,7 +335,7 @@
 请基于刚才 live 采集到的样本继续深入。
 
 我想重点追:[关键词/竞品名/用户痛点/消费场景]
-例如:[南昌铁板烧 值不值 / 盛焰铁板烧 / 立方铁 / 大渔 / 排队 / 套餐]
+例如:[家居定制 值不值 / 示例品牌A / 竞品A / 竞品B / 怎么选 / 方案]
 
 请输出:
 1. 当前样本里已经出现的真实用户原话
@@ -432,7 +432,7 @@
 
 对比维度:
 1. 用户选择理由
-2. 人均/套餐感知
+2. 价格/方案感知
 3. 消费场景
 4. 适合人群
 5. 内容传播点
@@ -490,7 +490,7 @@
 请把刚才的单点深挖变成门店执行方案。
 
 问题:[问题名]
-我能投入的资源:[比如:店长、前厅、厨师、拍摄人员、预算]
+我能投入的资源:[比如:店长、设计师、客服、拍摄人员、预算]
 执行周期:[3 天/7 天/14 天]
 
 请输出:
@@ -529,7 +529,7 @@
 ```text
 请基于刚才的 7 天内容计划继续优化。
 
-我要优化的方向是:[老板口吻/更像探店/更适合小红书/更适合抖音/更强转化/更少广告感]
+我要优化的方向是:[老板口吻/更像真实案例/更适合小红书/更适合抖音/更强转化/更少广告感]
 
 请重新输出:
 1. 每天选题是否对应真实用户问题

+ 6 - 6
claude-code/claude-code-voc-intelligence/docs/capability-map.md

@@ -41,7 +41,7 @@
 用户典型话术:
 
 ```text
-帮我看一下南昌餐饮最近顾客在关心什么,并告诉我先改哪里、下周发什么。
+帮我看一下家居定制最近用户在关心什么,并告诉我先改哪里、下周发什么。
 ```
 
 ### `xiaohongshu-trend-intelligence`
@@ -65,14 +65,14 @@
 适合:
 
 - 抖音趋势情报
-- 本地生活/餐饮评论洞察
+- 行业用户评论洞察
 - 短视频内容机会
-- 门店转化线索
+- 线上转化线索
 
 用户典型话术:
 
 ```text
-帮我看下南昌餐饮行业抖音上用户最近在吐槽什么,先小规模真实采集。
+帮我看下家居定制行业抖音上用户最近在吐槽什么,先小规模真实采集。
 ```
 
 ### `voc-problem-deep-dive`
@@ -88,7 +88,7 @@
 用户典型话术:
 
 ```text
-继续深挖“排队”这个问题,告诉老板今天能改什么,7 天怎么验证。
+继续深挖“怎么选”这个问题,告诉老板今天能改什么,7 天怎么验证。
 ```
 
 ### `voc-issue-pool`
@@ -155,7 +155,7 @@
 
 ## 工作坊输出口径
 
-面向餐饮老板或线下工作坊时,Claude Code 输出优先按:
+面向老板或线下工作坊时,Claude Code 输出优先按:
 
 1. 你这轮能拿到什么。
 2. 我会怎么做。

+ 11 - 11
claude-code/claude-code-voc-intelligence/docs/claude-code-troubleshooting-playbook.md

@@ -8,7 +8,7 @@ This playbook helps Claude Code and maintainers quickly map live VOC collection
 | --- | --- | --- | --- | --- |
 | Douyin live says balance is insufficient, but the account has balance | Search API or keyword request failed and was classified as billing | `needs_keyword_fix` | Check Douyin API error classification and keyword repair | Do not show recharge link unless status is really `needs_recharge` |
 | Douyin returns `社交平台接口请求错误` or HTTP 5xx | Upstream search or input issue | `needs_keyword_fix`, or auto-repair then `ok` | Normalize keyword, retry with a shorter natural keyword | Do not expose raw 5xx body to user |
-| User passes `茶饮18元22元` and search is unstable | Compact keyword lacks natural search spacing | Usually auto-repaired | Normalize to `茶饮 18元 22元` | Do not require user to learn CLI flags |
+| User passes `家居定制18元22元` and search is unstable | Compact keyword lacks natural search spacing | Usually auto-repaired | Normalize to `家居定制 18元 22元` | Do not require user to learn CLI flags |
 | User passes empty `--keywords ""` | CLI parser receives an explicit empty value | `needs_keyword_fix` | Keep explicit empty as empty; do not fall back to default keywords | Do not silently search generic defaults |
 | User asks “进入真实采集 live 模式” but workflow keeps deep-diving | Skill handoff rules are too weak | Should call platform live collector | Update deep-dive/business workflow skill instructions and `nextActions` | Do not keep asking 7-day validation questions |
 | MCP output validation fails because warnings contain objects | Structured output schema expects strings | Tool call error | Normalize warnings at MCP server boundary | Do not remove evidence warnings entirely |
@@ -64,19 +64,19 @@ Claude Code should prefer short, natural platform search phrases:
 Examples:
 
 ```text
-茶饮 18元 22元
-茶饮 性价比 新客
-奶茶 套餐 点单 避坑
-本地茶饮 人均 点单
-茶饮 探店 值不值
+家居定制 18元 22元
+家居定制 性价比 新客
+全屋定制 方案 怎么选 避坑
+家居定制 价格 怎么选
+家居定制 对比 值不值
 ```
 
 Repair rules:
 
-- Insert spacing around Chinese and numbers: `茶饮18元22元` -> `茶饮 18元 22元`.
+- Insert spacing around Chinese and numbers: `家居定制18元22元` -> `家居定制 18元 22元`.
 - Keep keywords under 60 characters.
-- If price-specific search fails, try intent-specific search: `茶饮 性价比 新客`.
-- If intent search fails, try behavior-specific search: `奶茶 套餐 点单 避坑`.
+- If price-specific search fails, try intent-specific search: `家居定制 性价比 新客`.
+- If intent search fails, try behavior-specific search: `全屋定制 方案 怎么选 避坑`.
 - If all fail, return `needs_keyword_fix` and tell the user what was tried.
 
 ## Implementation Checklist For Similar Bugs
@@ -124,12 +124,12 @@ npm run claude-voc:build
 Live manual check, only when a real token is configured:
 
 ```powershell
-node .claude\plugins\voc-intelligence\mcp\src\tools\douyin-trend-run.js --collection-mode live --industry "茶饮" --business-type "茶饮连锁" --target-audience "新客" --keywords "茶饮18元22元" --keyword-limit 1 --videos-per-keyword 1 --max-comment-pages 0 --cache-assets false --output "outputs/live-acceptance-douyin-keyword"
+node .claude\plugins\voc-intelligence\mcp\src\tools\douyin-trend-run.js --collection-mode live --industry "家居定制" --business-type "全屋定制品牌" --target-audience "新客" --keywords "家居定制18元22元" --keyword-limit 1 --videos-per-keyword 1 --max-comment-pages 0 --cache-assets false --output "outputs/live-acceptance-douyin-keyword"
 ```
 
 Expected:
 
-- Compact keyword is normalized to `茶饮 18元 22元`.
+- Compact keyword is normalized to `家居定制 18元 22元`.
 - Search 5xx is auto-repaired or returned as `needs_keyword_fix`.
 - Recharge URL appears only for token, valid-token, or real balance states.
 - No token value appears in output.

+ 2 - 2
claude-code/claude-code-voc-intelligence/docs/deliverables/seven-day-content-plan.md

@@ -8,7 +8,7 @@
 
 - 下周账号发什么。
 - 根据这些顾客吐槽生成 7 天口播。
-- 把排队久、人均贵、怕踩雷变成视频脚本。
+- 把第一次买怎么选、价格贵、怕踩雷变成视频脚本。
 
 ## 输入字段
 
@@ -38,7 +38,7 @@
 ## 验收标准
 
 - 每条内容必须绑定一个 VOC 用户问题。
-- 口播要能被餐饮老板直接照着拍。
+- 口播要能被老板直接照着拍。
 - 不输出泛泛爆款标题。
 - 不覆盖创始人故事。
 - 发布后要引导把评论反馈放回 VOC 问题池。

+ 1 - 1
claude-code/claude-code-voc-intelligence/docs/deliverables/single-problem-action-plan.md

@@ -7,7 +7,7 @@
 老板语言入口:
 
 - 这个问题老板怎么解决。
-- 继续深挖排队/价格/服务/味道
+- 继续深挖怎么选/价格/服务/质量
 - 这个差评背后到底是什么问题。
 - 这个动作有效/无效,后面怎么调整。
 

+ 1 - 1
claude-code/claude-code-voc-intelligence/docs/deliverables/trend-insight-report.md

@@ -7,7 +7,7 @@
 老板语言入口:
 
 - 帮我看这个品类最近顾客在关心什么。
-- 看看南昌餐饮最近有什么机会。
+- 看看家居定制最近有什么机会。
 - 跑一份小红书/抖音趋势情报。
 
 ## 输入字段

+ 6 - 6
claude-code/claude-code-voc-intelligence/docs/live-manual-acceptance-checklist.md

@@ -13,7 +13,7 @@
 ## 小红书 live 最小验收
 
 ```bash
-node ".claude/plugins/voc-intelligence/mcp/src/tools/xiaohongshu-trend-run.js" --collection-mode live --industry "本地生活餐饮" --keywords "南昌美食,南昌菜" --keyword-limit 1 --notes-per-keyword 1 --max-comment-pages 1 --output "outputs/live-acceptance-xhs" --result-prefix XHS_TREND_RESULT
+node ".claude/plugins/voc-intelligence/mcp/src/tools/xiaohongshu-trend-run.js" --collection-mode live --industry "家居定制" --keywords "全屋定制,家居定制怎么选" --keyword-limit 1 --notes-per-keyword 1 --max-comment-pages 1 --output "outputs/live-acceptance-xhs" --result-prefix XHS_TREND_RESULT
 ```
 
 验收标准:
@@ -26,7 +26,7 @@ node ".claude/plugins/voc-intelligence/mcp/src/tools/xiaohongshu-trend-run.js" -
 ## 抖音 live 最小验收
 
 ```bash
-node ".claude/plugins/voc-intelligence/mcp/src/tools/douyin-trend-run.js" --collection-mode live --industry "本地生活餐饮" --keywords "南昌美食,南昌菜" --keyword-limit 1 --videos-per-keyword 1 --max-comment-pages 1 --output "outputs/live-acceptance-douyin" --result-prefix DOUYIN_TREND_RESULT
+node ".claude/plugins/voc-intelligence/mcp/src/tools/douyin-trend-run.js" --collection-mode live --industry "家居定制" --keywords "全屋定制,家居定制怎么选" --keyword-limit 1 --videos-per-keyword 1 --max-comment-pages 1 --output "outputs/live-acceptance-douyin" --result-prefix DOUYIN_TREND_RESULT
 ```
 
 验收标准:
@@ -41,11 +41,11 @@ node ".claude/plugins/voc-intelligence/mcp/src/tools/douyin-trend-run.js" --coll
 用于确认“搜索请求错误误报余额不足”的问题已经被拦住:
 
 ```bash
-node ".claude/plugins/voc-intelligence/mcp/src/tools/douyin-trend-run.js" --collection-mode live --industry "茶饮" --business-type "茶饮连锁" --target-audience "新客" --keywords "茶饮18元22元" --keyword-limit 1 --videos-per-keyword 1 --max-comment-pages 0 --cache-assets false --output "outputs/live-acceptance-douyin-keyword" --result-prefix DOUYIN_TREND_RESULT
+node ".claude/plugins/voc-intelligence/mcp/src/tools/douyin-trend-run.js" --collection-mode live --industry "家居定制" --business-type "全屋定制品牌" --target-audience "新客" --keywords "家居定制18元22元" --keyword-limit 1 --videos-per-keyword 1 --max-comment-pages 0 --cache-assets false --output "outputs/live-acceptance-douyin-keyword" --result-prefix DOUYIN_TREND_RESULT
 ```
 
 验收标准:
-- `茶饮18元22元` 应被规范成 `茶饮 18元 22元`,报告中的关注关键词也应显示规范化后的词。
+- `家居定制18元22元` 应被规范成 `家居定制 18元 22元`,报告中的关注关键词也应显示规范化后的词。
 - 如果上游返回 `社交平台接口请求错误` 或 5xx,工具应先自动换短关键词重试。
 - 自动修复仍失败时,状态应为 `needs_keyword_fix`,不应出现充值链接。
 - 只有 `needs_token`、`needs_recharge`、`needs_valid_token` 才展示充值/开通链接。
@@ -53,11 +53,11 @@ node ".claude/plugins/voc-intelligence/mcp/src/tools/douyin-trend-run.js" --coll
 ## 单点 VOC 记忆验收
 
 ```bash
-node ".claude/plugins/voc-intelligence/mcp/src/tools/voc-problem-deep-dive-run.js" --issue "排队" --project "样板门店A" --industry "本地生活餐饮" --scenario "门店经营" --audience "到店顾客" --feedback "这个店不想做等位饮品,更想先改评论区回复和预点单" --assistant-message-only
+node ".claude/plugins/voc-intelligence/mcp/src/tools/voc-problem-deep-dive-run.js" --issue "怎么选" --project "示例品牌A" --industry "家居定制" --scenario "线上获客" --audience "意向用户" --feedback "这个品牌不想做试用体验,更想先改评论区回复和案例展示" --assistant-message-only
 ```
 
 验收标准:
 
 - 输出有“优先级判断、老板视角影响、可执行解决动作、7 天验证计划、下轮验证指标”。
-- “等位饮品”只能出现在“已应用的使用记忆”,不能出现在“可执行解决动作”。
+- “试用体验”只能出现在“已应用的使用记忆”,不能出现在“可执行解决动作”。
 - 默认记忆文件按项目/行业/场景/人群隔离,不应污染其它行业或其它客户。

+ 1 - 1
claude-code/claude-code-voc-intelligence/install.js

@@ -151,7 +151,7 @@ function printNextSteps({ claudeAvailable }) {
   console.log('Next step:');
   console.log(`  1. Start Claude Code with: ${loadCommand}`);
   console.log('  2. In Claude Code, say:');
-  console.log('     帮我看一下南昌餐饮最近顾客在关心什么,并告诉我先改哪里、下周发什么。');
+  console.log('     帮我看一下家装全屋定制最近用户在关心什么,并告诉我先改哪里、下周发什么。');
   console.log('  或者说:');
   console.log('     帮我做一份家装全屋定制行业的小红书趋势情报。');
   console.log('     先用演示样例跑通流程,不要真实采集。');

+ 1 - 1
claude-code/claude-code-voc-intelligence/mcp/src/features/douyin-trend/live-collector.js

@@ -226,7 +226,7 @@ function buildKeywordRepairCandidates(keyword, profile = {}) {
   return [
     withoutPrice,
     normalizeSearchKeyword([base, '性价比', audience].filter(Boolean).join(' ')),
-    normalizeSearchKeyword([base, '套餐', '点单'].join(' ')),
+    normalizeSearchKeyword([base, '怎么选', '推荐'].join(' ')),
     normalizeSearchKeyword([base, '避坑', audience].filter(Boolean).join(' '))
   ]
     .filter(candidate => candidate && candidate !== current && isUsableKeyword(candidate))

+ 1 - 1
claude-code/claude-code-voc-intelligence/mcp/src/features/voc-business-workflow/business-workflow.js

@@ -60,7 +60,7 @@ async function runBusinessWorkflow(input = {}) {
     : 'douyin';
   const collectionMode = input.collectionMode || input['collection-mode'] || 'sample';
   const project = firstText(input.project, input.brand, input.store, 'VOC经营闭环');
-  const industry = firstText(input.industry, input.category, '本地生活餐饮');
+  const industry = firstText(input.industry, input.category, '通用行业');
   const brand = firstText(input.brand, input.store, project);
   const scenario = firstText(input.scenario, input.scene, '经营诊断');
   const audience = firstText(input.audience, input.targetAudience, '目标用户');

+ 28 - 28
claude-code/claude-code-voc-intelligence/mcp/src/features/voc-competitor-map/competitor-map.js

@@ -3,24 +3,24 @@ const path = require('path');
 
 const DEFAULT_COMPETITOR_TYPES = [
   {
-    name: '同城同品类强势门店',
-    why: '抢同一批顾客的正餐/聚餐选择。',
-    praised: ['招牌菜记忆点强', '排队带来热闹感', '内容里菜品视觉冲击强'],
-    complained: ['排队久', '人均不透明', '第一次来不知道怎么点'],
-    opportunity: '不要只学热闹,要把“第一次来怎么点、几点来更舒服、哪些人适合来”讲清楚。'
+    name: '同品类强势对手',
+    why: '抢同一批用户的选择。',
+    praised: ['核心卖点记忆点强', '声量带来热度', '内容视觉冲击强'],
+    complained: ['响应慢', '价格不透明', '第一次接触不知道怎么选'],
+    opportunity: '不要只学热闹,要把“第一次怎么选、什么时候适合、哪些人适合”讲清楚。'
   },
   {
-    name: '同价格带高口碑门店',
+    name: '同价格带高口碑对手',
     why: '用户会拿它来判断“值不值”。',
-    praised: ['套餐清晰', '服务稳定', '出品稳定'],
-    complained: ['贵', '菜品不够惊喜', '高峰体验下降'],
-    opportunity: '用价值解释和套餐路径降低第一次决策成本。'
+    praised: ['方案清晰', '服务稳定', '交付稳定'],
+    complained: ['贵', '亮点不够惊喜', '高峰体验下降'],
+    opportunity: '用价值解释和方案路径降低第一次决策成本。'
   },
   {
-    name: '内容平台声量高的网红',
-    why: '影响用户种草预期和探店选择。',
+    name: '内容平台声量高的网红对手',
+    why: '影响用户种草预期和选择。',
     praised: ['画面好看', '话题性强', '适合拍照分享'],
-    complained: ['到店落差', '滤镜重', '不好吃或不稳定'],
+    complained: ['实际落差', '滤镜重', '质量不稳定'],
     opportunity: '用真实场景和避坑表达建立信任,不和对方拼滤镜。'
   }
 ];
@@ -46,26 +46,26 @@ function collectEvidence(input = {}) {
     return report
       .split(/\r?\n/)
       .map(line => line.trim())
-      .filter(line => /评论|吐槽|担心|排队|贵|招牌|服务|好吃|不好吃|人均|套餐/.test(line))
+      .filter(line => /评论|吐槽|担心|价格|贵|卖点|服务|效果|质量|不值|方案|怎么选/.test(line))
       .slice(0, 50);
   }
   return [
-    '排队是排队,但第一次来真的不知道点什么。',
-    '人均有点高,如果没有套餐说明会犹豫。',
-    '视频里很种草,到店以后最怕落差。',
-    '招牌菜好吃,但高峰期服务有点跟不上。',
-    '如果老板能讲清楚适合几个人吃,会更容易决定。'
+    '第一次接触真的不知道怎么选。',
+    '价格有点高,如果没有方案说明会犹豫。',
+    '内容里很种草,实际拿到最怕落差。',
+    '核心做得不错,但高峰期响应有点跟不上。',
+    '如果能讲清楚适合什么人用,会更容易决定。'
   ];
 }
 
 function inferSignals(evidence = []) {
   const text = evidence.join('\n');
   const signals = [];
-  if (/排队|等位|等待/.test(text)) signals.push({ term: '排队/等位', risk: '热度带来期待,也带来体验压力' });
-  if (/贵|人均|性价比|值不值|套餐/.test(text)) signals.push({ term: '价格/套餐', risk: '用户需要更清晰的价值解释和点单路径' });
-  if (/招牌|特色|好吃|不好吃|味道/.test(text)) signals.push({ term: '招牌菜/味道', risk: '招牌要从菜名变成可复述的口味记忆' });
-  if (/服务|没人理|态度|卫生|环境/.test(text)) signals.push({ term: '服务/现场体验', risk: '高峰体验会影响复购和差评' });
-  if (/视频|种草|网红|滤镜|落差/.test(text)) signals.push({ term: '内容预期/到店落差', risk: '内容表达需要更真实,主动讲适合谁不适合谁' });
+  if (/怎么选|不会选|第一次|踩雷|决策/.test(text)) signals.push({ term: '选择门槛', risk: '信息太多,用户判断成本高' });
+  if (/贵|价格|性价比|值不值|方案/.test(text)) signals.push({ term: '价格/方案', risk: '用户需要更清晰的价值解释和选择路径' });
+  if (/卖点|特色|效果|质量|不稳定/.test(text)) signals.push({ term: '核心价值/质量', risk: '卖点要从名头变成可复述的价值记忆' });
+  if (/服务|没人理|态度|响应|售后/.test(text)) signals.push({ term: '服务/响应', risk: '高峰体验会影响复购和差评' });
+  if (/视频|种草|网红|滤镜|落差/.test(text)) signals.push({ term: '内容预期/落差', risk: '内容表达需要更真实,主动讲适合谁不适合谁' });
   return signals.length ? signals : [
     { term: '用户决策不清晰', risk: '需要先补充竞品评论和用户真实反馈' }
   ];
@@ -81,7 +81,7 @@ function buildCompetitorCandidates(input = {}) {
     }));
   }
   const city = String(input.city || input.region || '本地').trim();
-  const category = String(input.category || input.industry || '餐饮').trim();
+  const category = String(input.category || input.industry || '通用品类').trim();
   return DEFAULT_COMPETITOR_TYPES.map(item => ({
     name: `${city}${category}${item.name}`,
     type: item.name,
@@ -92,9 +92,9 @@ function buildCompetitorCandidates(input = {}) {
 function buildCompetitorMap(input = {}) {
   const brand = String(input.project || input.brand || input.store || '你的品牌').trim();
   const city = String(input.city || input.region || '本地').trim();
-  const category = String(input.category || input.industry || '餐饮').trim();
+  const category = String(input.category || input.industry || '通用品类').trim();
   const priceBand = String(input.priceBand || input.price || '未指定').trim();
-  const scene = String(input.scenario || input.scene || '到店消费/聚餐/日常就餐').trim();
+  const scene = String(input.scenario || input.scene || '线上咨询/到店体验/日常使用').trim();
   const evidence = collectEvidence(input);
   const signals = inferSignals(evidence);
   const candidates = buildCompetitorCandidates(input);
@@ -110,7 +110,7 @@ function buildCompetitorMap(input = {}) {
   const opportunities = signals.map(signal => ({
     signal: signal.term,
     risk: signal.risk,
-    action: `${brand} 可以围绕“${signal.term}”做错位表达:讲清楚适合谁、怎么点、什么时候来、为什么值,而不是只说好吃或热闹。`,
+    action: `${brand} 可以围绕“${signal.term}”做错位表达:讲清楚适合谁、怎么选、什么时候用、为什么值,而不是只说好或热闹。`,
     contentAngle: `从用户关心的“${signal.term}”切入,拍一条老板解释型视频。`
   }));
 
@@ -123,7 +123,7 @@ function buildCompetitorMap(input = {}) {
     '- 下一步可以直接转成问题池、单点深挖或 7 天内容选题。',
     '',
     '## 业务口径',
-    `- 品牌/门店:${brand}`,
+    `- 品牌:${brand}`,
     `- 城市/区域:${city}`,
     `- 品类:${category}`,
     `- 价格带:${priceBand}`,

+ 67 - 220
claude-code/claude-code-voc-intelligence/mcp/src/features/voc-content-plan/content-plan.js

@@ -3,147 +3,74 @@ const path = require('path');
 
 const DEFAULT_VOC_ISSUES = [
   {
-    issue: '第一次怕踩雷',
-    insight: '用户不是不想来,而是不知道怎么点才稳。',
-    title: '第一次来我们店,照这个顺序点不容易踩雷',
-    hook: '第一次来别一上来就乱点,这 3 个菜最稳。',
-    script: '第一次来我们店,如果你怕点多了浪费、点错了踩雷,可以先按这个顺序来。第一道点招牌菜,先判断口味是不是你喜欢的;第二道点一个下饭菜,适合两三个人一起分;第三道再点一个清爽解腻的。这样人均更稳,也更容易吃出这家店的特色。',
-    shots: ['菜单特写', '招牌菜出餐', '老板解释点单顺序', '顾客桌面组合'],
-    commentPrompt: '第一次来你最怕点错什么?评论区告诉我,我帮你搭配。',
-    metric: '评论里“怎么点/第一次来/套餐/人均”的提问是否增加'
+    issue: '第一次了解怕踩雷',
+    insight: '用户不是不想选,而是不知道怎么判断才稳。',
+    title: '第一次了解我们,按这个顺序看不容易踩雷',
+    hook: '第一次接触别急着下决定,先看这 3 点最稳。',
+    script: '第一次了解我们,如果你怕选错、怕花冤枉钱,可以先按这个顺序判断。第一步先看核心产品或服务能不能解决你最关心的问题;第二步看真实用户的反馈和案例;第三步再对比价格和适配度。这样你不是盲选,而是在判断到底值不值。',
+    shots: ['产品/服务全貌', '核心卖点特写', '真实案例展示', '用户使用场景'],
+    commentPrompt: '第一次了解你最担心什么?评论区告诉我,我帮你判断。',
+    metric: '评论里“怎么选/第一次/适不适合/怎么对比”的提问是否增加'
   },
   {
-    issue: '觉得人均贵',
-    insight: '用户真正想知道的是贵在哪里、值不值、怎么更划算。',
-    title: '为什么这顿饭人均不算低,但很多老客还会再来',
-    hook: '如果你只看人均,会觉得我们不便宜,但这几个地方才是成本。',
-    script: '很多顾客第一次看人均会犹豫,所以今天直接讲清楚。我们贵的地方不是装修噱头,而是这几类食材、这道招牌菜的处理时间,还有高峰期也要保持稳定出品。第一次来不建议乱点,可以先按两人/四人套餐吃,既能吃到招牌,也不会一下子超预算。',
-    shots: ['食材近景', '后厨处理过程', '招牌菜上桌', '套餐组合价格牌'],
-    commentPrompt: '想看两人不踩雷点单,还是四人聚餐点单?',
-    metric: '评论里“贵/值不值”下降,“套餐/怎么点”上升'
+    issue: '觉得价格贵',
+    insight: '用户真正想知道的是贵在哪里、值不值、怎么更划算。',
+    title: '为什么我们不是最便宜的,但很多老用户还会复购',
+    hook: '如果你只看价格,会觉得我们不便宜,但这几个地方才是成本。',
+    script: '很多用户第一次看价格会犹豫,所以今天直接讲清楚。我们贵的地方不是噱头,而是这几项投入、这套服务的稳定性,还有长期使用的保障。第一次不建议盲选,可以先从入门方案开始,既能体验核心价值,也不会一下子超预算。',
+    shots: ['成本构成展示', '服务/工艺过程', '前后效果对比', '不同方案价格说明'],
+    commentPrompt: '想看入门方案怎么选,还是进阶方案怎么搭配?',
+    metric: '评论里“贵/值不值”下降,“方案/怎么选”上升'
   },
   {
-    issue: '怕排队久',
-    insight: '排队问题可以转成预期管理和到店攻略。',
-    title: '不想排太久,建议你这几个时间来',
-    hook: '想吃但怕排队,先记住这 3 个时间点。',
-    script: '我们高峰期确实会排队,但不是任何时间都要等。一般来说,工作日早点来更舒服,周末建议避开正餐最高峰。如果你已经在路上,可以先看评论区置顶的等位提示,或者提前想好要点的招牌菜,到店后更快决定。',
-    shots: ['门口等位情况', '非高峰空桌', '等位提示牌', '招牌菜快剪'],
-    commentPrompt: '你更想知道排队时间,还是想先看点单攻略?',
-    metric: '评论里“几点去/要等多久”的咨询是否变成可引导问题'
+    issue: '担心买了不适合自己',
+    insight: '适配焦虑要用“适合谁、不适合谁”来降低。',
+    title: '这个适合谁、不适合谁,我直接说清楚',
+    hook: '先说不适合什么人,再说适合什么人。',
+    script: '我们不想只讲好的一面,所以今天直接说清楚。我们适合这类需求、这种预算、这种使用场景的人;如果你的情况是另外几种,可能要先看看其他选择。讲清楚不适合谁,反而能减少你拿到手之后的落差。',
+    shots: ['不同人群标签', '适配场景对比', '真实使用反馈', '正面说明'],
+    commentPrompt: '你的需求和预算大概是什么?我帮你判断适不适合。',
+    metric: '评论里“适不适合/像我这种/能不能用”的互动是否增加'
   },
   {
-    issue: '不知道招牌菜是什么',
-    insight: '招牌菜要从“老板推荐”变成“不同人群怎么选”。',
-    title: '第一次来,老板不建议你把所有招牌都点一遍',
-    hook: '招牌菜不是越多越好,第一次来先点这几个就够。',
-    script: '很多人第一次来会问哪个最招牌。我的建议是不要一次点太多,先按口味选。如果你喜欢重口味,先点这一道;如果带孩子或者长辈,先点更稳的这一道;如果是朋友聚餐,再加一个适合分享的菜。招牌不是让你多花钱,而是帮你少踩雷。',
-    shots: ['三道菜并排', '不同人群标签', '老板手指菜单', '夹菜试吃'],
-    commentPrompt: '你是重口味、带家人,还是朋友聚餐?我给你推荐点法。',
-    metric: '评论里“招牌/推荐/带孩子/聚餐”的提问是否增加'
+    issue: '不知道核心差异是什么',
+    insight: '卖点要从“我们很好”讲到“为什么和别人不一样”。',
+    title: '别人也在做,我们到底不一样在哪',
+    hook: '不是所有卖点都重要,但这一个差异值得你了解。',
+    script: '很多同行都说自己好,但用户真正想知道的是差异在哪。我们最核心的不是参数堆叠,而是这个做法、这套体验和这类长期结果。第一次了解,你可以不用全看完,但一定要看这一点,因为它最能代表我们想做的事。',
+    shots: ['核心差异演示', '关键细节特写', '用户真实反应', '对比说明'],
+    commentPrompt: '你选这类产品或服务时,最看重哪个点?',
+    metric: '收藏、转发、评论里“想了解/值得/怎么联系”的信号是否增加'
   },
   {
-    issue: '担心服务忙不过来',
-    insight: '服务焦虑要用流程透明和高峰期提醒来降低。',
-    title: '高峰期来吃饭,先知道这几个小提醒',
-    hook: '我们忙的时候,最怕顾客不知道该找谁。',
-    script: '高峰期服务压力确实更大,所以我们把几个常见问题提前说清楚。加菜、催菜、打包、开发票分别找哪里,桌上也会放提示。你来吃饭不用猜流程,遇到问题直接按提示找对应的人,我们也会持续优化高峰期响应。',
-    shots: ['桌面提示牌', '服务员动线', '加菜流程', '收银台/打包区'],
-    commentPrompt: '你最在意上菜速度、服务响应,还是环境卫生?',
-    metric: '评论里“没人理/服务慢”下降,“流程/提示”正向反馈增加'
+    issue: '担心售后服务跟不上',
+    insight: '服务焦虑要用流程透明和响应承诺来降低。',
+    title: '买之前先知道:出问题找谁、多久响应',
+    hook: '我们最怕的是你遇到问题不知道该找谁。',
+    script: '售后和服务是很多人下单前最担心的,所以我们把流程提前说清楚。咨询、售后、退换、维护分别走哪个入口,多久能响应,都有明确说明。你不用猜流程,遇到问题直接按指引找对应的人,我们也会持续优化响应速度。',
+    shots: ['服务流程图', '响应承诺说明', '售后入口', '真实处理记录'],
+    commentPrompt: '你最在意响应速度、解决能力,还是后续保障?',
+    metric: '评论里“没人管/服务慢”下降,“流程/保障”正向反馈增加'
   },
   {
-    issue: '内容看着种草,到店怕落差',
+    issue: '内容看着种草,实际怕落差',
     insight: '内容要降低夸张表达,主动讲适合谁、不适合谁。',
-    title: '这家店适合谁,不适合谁,老板直接说清楚',
-    hook: '先说缺点,再说适合什么人。',
-    script: '我们不想只拍滤镜很好看的视频,所以今天直接说清楚。我们适合喜欢这种口味、愿意接受高峰等位、想吃本地特色的人;如果你只想安安静静坐很久,或者完全不能吃辣,可能要提前避开某些菜。讲清楚不适合谁,反而能减少到店落差。',
-    shots: ['真实门店环境', '无滤镜菜品', '高峰现场', '老板正面说明'],
-    commentPrompt: '你之前最想先知道优点还是缺点?',
+    title: '不想只拍好看的,今天把真实情况说清楚',
+    hook: '先说缺点,再说适合什么人。',
+    script: '我们不想只拍滤镜很好看的内容,所以今天直接说清楚。我们适合这类需求、愿意接受这些前提的人;如果你期待的是另外几种效果,可能要提前了解清楚。讲清楚真实情况,反而能减少你接触之后的落差。',
+    shots: ['真实场景', '无滤镜实拍', '真实使用过程', '正面说明'],
+    commentPrompt: '你接触之前最想先知道优点还是缺点?',
     metric: '评论里“真实/避坑/适合谁”的互动是否增加'
   },
   {
-    issue: '不知道为什么值得专门来',
-    insight: '门店内容要把特色从“好吃”讲到“为什么值得来”。',
-    title: '如果你只来一次,建议把这顿饭吃明白',
-    hook: '不是所有菜都要点,但这一个理由值得你来一次。',
-    script: '很多店都说自己好吃,但顾客真正想知道为什么值得专门来。我们这家店最核心的不是菜名,而是这个做法、这个口味记忆和这类用餐场景。第一次来,你可以不用点满一桌,但一定要试这一道,因为它最能代表我们想做的味道。',
-    shots: ['核心菜品制作', '口味细节', '顾客夹菜反应', '门头和桌面氛围'],
-    commentPrompt: '你会为了哪种味道专门跑一趟?',
-    metric: '收藏、转发、评论里“想去/值得去/地址”的信号是否增加'
-  }
-];
-
-const TEA_VOC_ISSUES = [
-  {
-    issue: '第一次来怎么点最稳',
-    insight: '新客不是不想买,而是不知道先点哪一杯最能判断这家店稳不稳。',
-    title: '第一次来这家店,照这个顺序点不容易踩雷',
-    hook: '第一次来别乱点,先用这 3 步判断值不值。',
-    script: '第一次喝一家茶饮,别一上来就冲最复杂的新品。先点一杯招牌基础款,看茶底、奶感和甜度稳不稳;第二杯再选你平时喜欢的方向,比如茶感重、奶感重或者清爽型;第三步才考虑加料和特殊口味。这样你不是盲试,而是在判断这家店到底值不值得复购。',
-    shots: ['门头/点单台', '菜单首单推荐区', '三杯不同口味摆拍', '店员指菜单说明'],
-    commentPrompt: '第一次来你最怕点错什么?评论区说口味,我帮你选更稳的点法。',
-    metric: '评论里“第一次来/怎么点/推荐哪个/踩雷”的提问是否增加'
-  },
-  {
-    issue: '18-22 元贵在哪/值在哪',
-    insight: '18-22 元不是绝对贵,关键是用户能不能看见原料、茶底、口味稳定性和适合人群。',
-    title: '18-22 元到底贵不贵?先看这 3 个地方',
-    hook: '你以为贵的是价格,其实要看这杯值不值。',
-    script: '很多人看到 18 到 22 元会先问贵不贵。我的建议是别只看标价,先看三件事:茶底是不是清楚,甜度和口味是不是稳定,配料是不是适合你。如果一杯喝完你觉得茶味、奶感、甜度都在线,而且不会喝完后悔,那它讨论的就不是便宜,而是值不值。',
-    shots: ['价格牌特写', '茶底/原料展示', '出杯过程', '成品和口味标签'],
-    commentPrompt: '你判断一杯茶饮值不值,最看价格、茶底还是口味稳定?',
-    metric: '评论里“贵/值不值”减少,“茶底/口味/适合谁”的讨论增加'
-  },
-  {
-    issue: '券后价和套餐怎么买最划算',
-    insight: '用户不怕优惠少,怕看不懂规则、加料后超预算、套餐不适合自己。',
-    title: '券后价到底怎么算?新客先看这两行',
-    hook: '别只看标价,真正花多少钱在结算页。',
-    script: '很多新客不是不想下单,是看不懂券后价。你先看两件事:第一,券后总价到底是多少;第二,加料、规格、配送费会不会让预算变高。第一次来不要只冲最低价,先选规则最清楚、口味最稳的套餐。看懂总价和条件,再判断这杯是不是划算。',
-    shots: ['手机点单页', '优惠券/套餐页', '券前券后对比', '结算页总价特写'],
-    commentPrompt: '你最想看券后价怎么算,还是套餐怎么点不超预算?',
-    metric: '评论里“券后/套餐/多少钱/怎么买”的提问是否增加'
-  },
-  {
-    issue: '茶底/甜度/配料怎么选',
-    insight: '茶底、甜度、配料和身体反应已经进入新客决策,不是喝完才考虑。',
-    title: '茶底怎么选?下午喝怕睡不着的先看这条',
-    hook: '怕踩雷,先别看颜值,先看茶底和甜度。',
-    script: '有条评论问得很真实:波霸奶茶用什么茶底,下午喝会不会晚上睡不着。第一次来,先看茶底、甜度和配料。平时不喝浓茶的人,别一上来选茶感特别重的;不爱甜的人,先从低甜度开始;对配料敏感的人,先看清楚加料和奶基底。适合你,才是真的值。',
-    shots: ['茶底展示', '甜度选择页', '配料/加料特写', '店员说明适合人群'],
-    commentPrompt: '你更关心茶底、甜度、配料表,还是喝完会不会睡不着?',
-    metric: '评论里“茶底/甜度/配料/睡不着”的问题数量'
-  },
-  {
-    issue: '哪几款不容易踩雷',
-    insight: '避坑内容比单纯推荐更接近新客转化,因为它降低第一次尝试风险。',
-    title: '第一次来,先点这几类,不容易踩雷',
-    hook: '怕踩雷的,先别追新品,先记住这 3 类。',
-    script: '新客最怕的不是贵,是喝完觉得不适合自己。第一次来建议先点三类:基础招牌款,口味大众款,你平时就喝得惯的方向。先用稳的款判断这家店的基本水平,再去试新品和特殊口味。第一次体验稳了,才有下一次复购。',
-    shots: ['三款稳定单品', '适合人群标签', '试喝反应', '菜单避坑提示'],
-    commentPrompt: '你最怕踩雷的是太甜、太淡、茶味重,还是加料不好吃?',
-    metric: '“避坑/踩雷/推荐哪个/哪款稳”类评论和收藏率'
-  },
-  {
-    issue: '外卖到手怎么避免翻车',
-    insight: '外卖场景会放大冰化、分层、口感变化,新客第一次外卖体验会影响复购。',
-    title: '外卖点茶饮,先看这 3 点,不容易翻车',
-    hook: '外卖点错了,到手那一刻就后悔。',
-    script: '茶饮外卖最容易翻车的地方,不是只有配送慢。你要看这杯适不适合外卖,冰量会不会影响口感,打包到手会不会分层。第一次点外卖,建议选口感更稳定、打包后变化小的款,不要先点特别依赖现做状态的口味。到手体验稳,才有复购。',
-    shots: ['打包流程', '封口和保温细节', '外卖到手状态', '冰量/分层对比'],
-    commentPrompt: '你点茶饮外卖最怕冰化、分层,还是口感变淡?',
-    metric: '外卖相关评论、“到手/冰化/翻车”关键词变化'
-  },
-  {
-    issue: '买一送一/团购规则怎么讲清楚',
-    insight: '低价和买一送一能触发注意,但新客还需要确认规则、口味和有没有坑。',
-    title: '买一送一到底怎么算?先看懂规则再下单',
-    hook: '看起来很划算,但规则你真的看懂了吗?',
-    script: '买一送一、团购、低价新品,确实很容易让人心动。但新客真正关心的是有没有坑。下单前先看三件事:券后到底多少钱,能不能叠加,口味和规格有没有限制。规则讲清楚,顾客才不是因为便宜冲动一次,而是因为第一次体验清楚、放心,愿意再来。',
-    shots: ['活动海报', '团购/买一送一点单页', '规则限制特写', '两杯到手展示'],
-    commentPrompt: '你最常看不懂的是团购规则、券后价,还是买一送一限制?',
-    metric: '“划算/有坑/团购/券后价/怎么买”类评论数量'
+    issue: '不知道为什么值得专门选你',
+    insight: '要把特色从“好”讲到“为什么值得选”。',
+    title: '如果你只选一次,建议把这件事想明白',
+    hook: '不是所有理由都重要,但这一个值得你了解一次。',
+    script: '很多同行都说自己好,但用户真正想知道为什么值得专门选你。我们最核心的不是名头,而是这个方法、这份长期结果和这类真实场景。第一次了解,你可以不用全部记住,但一定要看这一点,因为它最能代表我们的价值。',
+    shots: ['核心价值演示', '长期结果展示', '用户真实反馈', '场景氛围'],
+    commentPrompt: '你会为了哪种结果专门选一家?',
+    metric: '收藏、转发、评论里“想要/值得/怎么联系”的信号是否增加'
   }
 ];
 
@@ -164,105 +91,29 @@ function collectIssues(input = {}) {
   const explicit = splitList(input.issues || input.problems || input.vocIssues || input.contentDirections || input.directions || input.evidence || input.comments);
   if (explicit.length) return explicit.slice(0, 12);
   const text = String(input.reportText || input.evidenceText || input.context || input.background || '').trim() || readTextIfExists(input.report || input.reportPath);
-  const lines = splitList(text).filter(line => /排队|贵|踩雷|服务|招牌|套餐|人均|不好吃|落差|等位|怎么点|券后|团购|买一送一|茶底|甜度|配料|外卖|翻车|值不值|首单|口味/.test(line));
+  const lines = splitList(text).filter(line => /价格|贵|踩雷|服务|售后|怎么选|适合|不适合|落差|案例|对比|值不值|效果|质量|体验|方案|差异|卖点|为什么|预算/.test(line));
   return lines.length ? lines.slice(0, 12) : DEFAULT_VOC_ISSUES.map(item => item.issue);
 }
 
-function isTeaScenario(input = {}, issue = '') {
-  const text = [
-    input.industry,
-    input.category,
-    input.businessType,
-    input.evidenceText,
-    input.reportText,
-    input.context,
-    input.background,
-    issue
-  ].filter(Boolean).join(' ');
-  return /茶饮|奶茶|新茶饮|茶底|甜度|波霸|买一送一|券后|外卖|冰化|配料表/.test(text);
-}
-
-function selectTeaTemplateByIntent(issue) {
-  const text = String(issue || '');
-  const findByIssue = (pattern) => TEA_VOC_ISSUES.find(item => pattern.test(item.issue));
-
-  const intentRules = [
-    {
-      textPattern: /买一送一|规则|有坑|低价|9\.9|11\.9|21/,
-      issuePattern: /买一送一/
-    },
-    {
-      textPattern: /券后|套餐|划算|优惠/,
-      issuePattern: /券后价/
-    },
-    {
-      textPattern: /第一次|首单|怎么点|点单/,
-      issuePattern: /第一次来/
-    },
-    {
-      textPattern: /18|22|贵|值不值|性价比|价格/,
-      issuePattern: /18-22/
-    },
-    {
-      textPattern: /茶底|甜度|配料|睡不着|波霸|成分/,
-      issuePattern: /茶底/
-    },
-    {
-      textPattern: /踩雷|避坑|哪几款|稳/,
-      issuePattern: /踩雷/
-    },
-    {
-      textPattern: /外卖|到手|冰化|分层|塌口感|翻车/,
-      issuePattern: /外卖/
-    }
-  ];
-
-  for (const rule of intentRules) {
-    if (rule.textPattern.test(text)) {
-      const matched = findByIssue(rule.issuePattern);
-      if (matched) return matched;
-    }
-  }
-
-  return null;
-}
-
 function inferTemplate(issue, index, input = {}) {
   const text = String(issue || '');
-  if (isTeaScenario(input, text)) {
-    const intentMatched = selectTeaTemplateByIntent(text);
-    if (intentMatched) return intentMatched;
-
-    const teaMatched = TEA_VOC_ISSUES.find(item =>
-      text.includes(item.issue) ||
-      item.issue.includes(text) ||
-      (/第一次|首单|怎么点|点单/.test(text) && item.issue.includes('第一次来')) ||
-      (/18|22|贵|值不值|性价比|价格/.test(text) && item.issue.includes('18-22')) ||
-      (/买一送一|规则|有坑|低价|9\.9|11\.9|21/.test(text) && item.issue.includes('买一送一')) ||
-      (/券后|套餐|划算|优惠/.test(text) && item.issue.includes('券后价')) ||
-      (/茶底|甜度|配料|睡不着|波霸|成分/.test(text) && item.issue.includes('茶底')) ||
-      (/踩雷|避坑|哪几款|稳/.test(text) && item.issue.includes('踩雷')) ||
-      (/外卖|到手|冰化|分层|塌口感|翻车/.test(text) && item.issue.includes('外卖'))
-    );
-    return teaMatched || TEA_VOC_ISSUES[index % TEA_VOC_ISSUES.length];
-  }
   const matched = DEFAULT_VOC_ISSUES.find(item =>
     text.includes(item.issue) ||
-    text.includes(item.issue.replace('第一次来', '')) ||
     item.issue.includes(text) ||
-    (/排队|等位|等待/.test(text) && item.issue.includes('排队')) ||
-    (/贵|人均|性价比|值不值/.test(text) && item.issue.includes('人均')) ||
-    (/踩雷|怎么点|点单/.test(text) && item.issue.includes('踩雷')) ||
-    (/招牌|推荐菜|特色菜/.test(text) && item.issue.includes('招牌')) ||
-    (/服务|没人理|态度/.test(text) && item.issue.includes('服务')) ||
-    (/落差|网红|滤镜|种草/.test(text) && item.issue.includes('落差'))
+    (/踩雷|第一次|怎么选|不会选/.test(text) && item.issue.includes('踩雷')) ||
+    (/贵|价格|性价比|值不值|预算/.test(text) && item.issue.includes('价格')) ||
+    (/适合|不适合|适配/.test(text) && item.issue.includes('适合')) ||
+    (/差异|卖点|特色|不一样|区别/.test(text) && item.issue.includes('差异')) ||
+    (/服务|售后|没人管|响应|态度/.test(text) && item.issue.includes('服务')) ||
+    (/落差|种草|滤镜|网红/.test(text) && item.issue.includes('落差')) ||
+    (/为什么|值得|理由/.test(text) && item.issue.includes('值得'))
   );
   return matched || DEFAULT_VOC_ISSUES[index % DEFAULT_VOC_ISSUES.length];
 }
 
 function buildContentPlan(input = {}) {
-  const brand = String(input.project || input.brand || input.store || '你的门店').trim();
-  const industry = String(input.industry || input.category || '本地生活餐饮').trim();
+  const brand = String(input.project || input.brand || input.store || '你的品牌').trim();
+  const industry = String(input.industry || input.category || '通用行业').trim();
   const platform = String(input.platform || '抖音/小红书').trim();
   const days = Math.max(1, Math.min(Number(input.days || 7), 15));
   const issues = collectIssues(input);
@@ -275,9 +126,7 @@ function buildContentPlan(input = {}) {
       insight: template.insight,
       title: template.title,
       hook: template.hook,
-      script: isTeaScenario(input, sourceIssue)
-        ? template.script
-        : template.script.replace(/我们店/g, brand === '你的门店' ? '我们店' : brand),
+      script: template.script,
       shots: template.shots,
       commentPrompt: template.commentPrompt,
       validationMetric: template.metric,
@@ -294,7 +143,7 @@ function buildContentPlan(input = {}) {
     '- 每条都包含前 3 秒钩子、口播脚本、镜头建议、评论区引导和验证指标。',
     '',
     '## 业务口径',
-    `- 品牌/门店:${brand}`,
+    `- 品牌:${brand}`,
     `- 行业/品类:${industry}`,
     `- 发布平台:${platform}`,
     `- 内容周期:${days} 天`,
@@ -313,9 +162,7 @@ function buildContentPlan(input = {}) {
     ].join('\n')),
     '',
     '## 拍摄提醒',
-    isTeaScenario(input, issues.join(' '))
-      ? '- 先拍真实门店、真实饮品、真实点单/出杯/打包流程,不要只拍滤镜氛围。'
-      : '- 先拍真实门店、真实产品、真实服务流程,不要只拍滤镜氛围。',
+    '- 先拍真实场景、真实产品、真实服务流程,不要只拍滤镜氛围。',
     '- 每条内容只解决一个用户问题,避免一条视频讲太多。',
     '- 发完后把评论里的新问题继续放回 VOC 问题池,下一轮再优化。',
     '',

+ 26 - 26
claude-code/claude-code-voc-intelligence/mcp/src/features/voc-issue-pool/issue-pool.js

@@ -7,36 +7,36 @@ const DEFAULT_MEMORY_DIR = 'voc-issue-pool';
 
 const ISSUE_CATEGORIES = [
   {
-    id: 'waiting',
-    title: '排队/等待',
-    terms: ['排队', '等位', '等待', '叫号', '翻台', '等太久'],
+    id: 'decision',
+    title: '选择门槛/决策',
+    terms: ['怎么选', '不会选', '第一次', '踩雷', '对比', '挑花眼'],
     severity: 'high',
-    impact: ['新客转化', '现场效率', '口碑预期'],
-    action: '先统一评论区和门口等位预期,再做 7 天翻台/预点单验证。'
+    impact: ['新客转化', '咨询转化', '口碑预期'],
+    action: '先统一评论区和详情页的“怎么选”路径,再做 7 天入门方案/试用验证。'
   },
   {
     id: 'price',
     title: '价格/性价比',
-    terms: ['贵', '价格', '人均', '性价比', '不值', '划算', '预算', '增项'],
+    terms: ['贵', '价格', '性价比', '不值', '划算', '预算', '增项'],
     severity: 'high',
     impact: ['新客转化', '客单结构', '信任'],
-    action: '把价格解释成点单路径、价值证据和避坑说明,先降低第一次决策成本。'
+    action: '把价格解释成选择路径、价值证据和避坑说明,先降低第一次决策成本。'
   },
   {
-    id: 'taste_quality',
-    title: '味道/出品稳定',
-    terms: ['不好吃', '味道', '出品', '不稳定', '翻车', '口味', '辣', '咸', '淡'],
+    id: 'quality',
+    title: '质量/交付稳定',
+    terms: ['质量', '品质', '效果', '不稳定', '翻车', '参差', '货不对板', '交付'],
     severity: 'high',
     impact: ['复购', '差评风险', '推荐'],
-    action: '先盯核心单品 SOP 和高峰期出品稳定,避免内容预期高于门店交付。'
+    action: '先盯核心交付 SOP 和稳定性,避免内容预期高于实际交付。'
   },
   {
     id: 'service',
     title: '服务/体验',
-    terms: ['服务', '态度', '没人理', '员工', '老板', '体验', '环境', '卫生'],
+    terms: ['服务', '态度', '没人理', '员工', '响应', '售后', '体验'],
     severity: 'medium',
-    impact: ['复购', '带人到店', '现场效率'],
-    action: '把服务问题拆成高峰岗位、响应话术和现场流程,不只归因员工态度。'
+    impact: ['复购', '转介绍', '响应效率'],
+    action: '把服务问题拆成高峰岗位、响应话术和服务流程,不只归因态度。'
   },
   {
     id: 'product_function',
@@ -48,10 +48,10 @@ const ISSUE_CATEGORIES = [
   },
   {
     id: 'content_expectation',
-    title: '内容预期/到店落差',
+    title: '内容预期/落差',
     terms: ['网红', '视频', '图片', '滤镜', '种草', '实际', '没有想象', '落差'],
     severity: 'medium',
-    impact: ['内容信任', '到店转化', '差评风险'],
+    impact: ['内容信任', '转化', '差评风险'],
     action: '降低夸张表达,改成真实场景、适合谁、不适合谁和避坑提醒。'
   }
 ];
@@ -156,7 +156,7 @@ function looksLikeVoiceLine(line) {
   if (text.length < 3 || text.length > 180) return false;
   if (looksGeneratedReportLine(text)) return false;
   if (/[??!!~~]/.test(text)) return true;
-  if (/(多少钱|贵|便宜|值不值|划算|人均|套餐|排队|等位|等太久|服务|态度|好吃|不好吃|一般|踩雷|出片|拍照|环境|位置|在哪|校内|校外|想去|不想去|下次|推荐|避雷|大渔|立方铁|火地|炙焰|盛焰)/.test(text)) return true;
+  if (/(多少钱|贵|便宜|值不值|划算|价格|服务|态度|效果|质量|一般|踩雷|怎么选|适合|在哪|想要|不想|下次|推荐|避雷|落差)/.test(text)) return true;
   return false;
 }
 
@@ -221,11 +221,11 @@ function collectEvidence(input = {}) {
   }
   if (!text) {
     return [
-      '想吃但怕排队,到了现场才发现等位时间不确定。',
-      '排了很久以后,如果菜品普通就会觉得不值。',
-      '人均有点高,第一次来不知道怎么点不踩雷。',
-      '视频看着很种草,实际到店体验没有想象中稳定。',
-      '服务忙起来没人理,问问题不知道找谁。'
+      '想买但不知道怎么选,怕选错踩雷。',
+      '价格有点高,不确定值不值。',
+      '第一次接触,不知道怎么对比才不踩雷。',
+      '内容看着很种草,实际体验没有想象中稳定。',
+      '咨询的时候没人理,问问题不知道找谁。'
     ];
   }
   const fromReport = extractEvidenceFromReportText(text);
@@ -241,10 +241,10 @@ function collectEvidence(input = {}) {
 function matchCategory(text) {
   const normalized = String(text || '');
   const directRules = [
-    ['waiting', /(排队|等位|等待|叫号|翻台|排了很久|等太久)/],
-    ['price', /(多少钱|价格|人均|贵|便宜|性价比|值不值|不值|划算|套餐|预算)/],
-    ['taste_quality', /(不好吃|好吃|味道|出品|不稳定|翻车|口味|咸|淡|新鲜)/],
-    ['service', /(服务|态度|没人理|员工|老板|体验|环境|卫生|位置|校内|校外)/],
+    ['decision', /(怎么选|不会选|第一次|踩雷|对比|挑花眼|不知道选)/],
+    ['price', /(多少钱|价格|贵|便宜|性价比|值不值|不值|划算|预算)/],
+    ['quality', /(质量|品质|效果|不稳定|翻车|参差|货不对板|交付|不好用)/],
+    ['service', /(服务|态度|没人理|员工|响应|售后|体验)/],
     ['content_expectation', /(网红|视频|图片|滤镜|种草|实际|没有想象|落差|出片|拍照|发朋友圈|打卡)/]
   ];
   for (const [id, pattern] of directRules) {

+ 91 - 91
claude-code/claude-code-voc-intelligence/mcp/src/features/voc-problem-deep-dive/deep-dive.js

@@ -7,69 +7,69 @@ const DEFAULT_MEMORY_DIR = 'voc-problem-deep-dive';
 
 const ACTION_TERMS = [
   '评论区回复',
-  '预点单',
-  '等位饮品',
-  '等位提示牌',
-  '门口提示牌',
-  '推荐先点',
-  '招牌菜',
-  '套餐',
-  '人均',
-  '点单路径',
+  '答疑话术',
+  '案例展示',
+  '方案说明',
+  '试用体验',
+  '对比清单',
+  '适配建议',
+  '入门方案',
+  '点击路径',
   'SOP',
   '话术',
   '员工培训',
-  '收台',
-  '翻台',
-  '试吃',
+  '质检',
+  '响应机制',
+  '预期管理',
   '内容表达',
   '复盘',
   '优惠券',
   '会员',
-  '预约'
+  '预约',
+  '售后流程'
 ];
 
 const ISSUE_PRESETS = [
   {
-    match: /排队|等位|等待|翻台|叫号/,
-    issue: '排队',
+    match: /怎么选|不会选|第一次|踩雷|决策|对比|挑花眼/,
+    issue: '选择门槛',
     priority: 'high',
     severity: '高',
     effort: '中',
-    impactTargets: ['新客转化', '复购', '内容口碑', '现场效率'],
-    judgment: '排队不是单纯的服务瑕疵,它同时暴露了预期管理、翻台效率和等位体验三个问题。',
-    surface: '用户表面在说“排队久”。',
-    deeper: '深层问题是等待时间不透明、等待过程没有被照顾、排队抬高了用户对出品的预期。',
+    impactTargets: ['新客转化', '咨询转化', '内容口碑'],
+    judgment: '选择门槛不是用户不想买,而是信息太多、判断成本太高,用户不知道怎么选才稳。',
+    surface: '用户表面在说“不知道怎么选、怕选错”。',
+    deeper: '深层问题是缺少清晰的对比维度、决策路径不透明、没有降低第一次尝试的风险。',
     voices: [
-      '想吃但怕排队,到了现场才发现等位时间不确定。',
-      '排了很久以后,如果菜品没有超出预期,就会觉得不值。',
-      '排队可以接受,但希望知道大概要等多久、值不值得等。'
+      '想买但不知道哪个适合自己。',
+      '选项太多,怕选错踩雷。',
+      '希望有人帮我按需求和预算推荐。'
     ],
     actionsToday: [
-      '统一评论区和门口话术:告诉用户高峰大概要等多久、几点来更舒服。',
-      '在门口放一个简单等位提示牌:当前桌数、预计等待区间、推荐先点的招牌菜。'
+      '整理一份“新手怎么选”清单:按需求、预算、场景给出推荐路径。',
+      '在评论区和详情页统一一句话告诉用户怎么对比、先看哪几点。'
     ],
     actions7Days: [
-      '测试预点单或排队先点招牌菜,让用户等待时已经进入消费流程。',
-      '连续记录 7 天点单、出餐、结账、收台时间,找出翻台最长卡点。'
+      '测试一个低门槛的入门方案或试用,承接第一次尝试。',
+      '收集高频选择问题,统一回复对比维度和适配建议。'
     ],
     actionsLongTerm: [
-      '把等位体验设计成品牌体验的一部分,比如小份试吃、等位饮品、等位菜单。',
-      '把内容表达从“天天排队”升级为“怎么排更值、什么时候来体验最好”。'
+      '建立标准化的选购指南和对比清单。',
+      '把内容表达从“我们很好”升级为“怎么选最稳”。'
     ],
     content: [
-      '别只说南昌烧烤排队,告诉用户几点来不用等太久。',
-      '这家店为什么排队还值得等?只讲 3 个超过预期的点。',
-      '老板视角:排队不是炫耀,是一道必须被管理的用户体验。'
+      '第一次接触我们,照这个顺序判断不容易踩雷。',
+      '别人也在做,怎么对比才不被带偏?',
+      '老板视角:帮用户降低选择成本,比堆卖点更有用。'
     ],
     metrics: [
-      '评论里“排队久/等太久/不值”出现次数是否下降。',
-      '评论里“几点去/要等多久/能不能预约”是否变成可引导咨询。',
-      '高峰期门口放弃率、翻台时长、预点单比例是否改善。'
+      '评论里“怎么选/会不会踩雷/适不适合”是否变成可引导咨询。',
+      '入门方案/试用转化是否上升。',
+      '用户是否开始按需求提问而不是直接放弃。'
     ]
   },
   {
-    match: /贵|价格|人均|性价比|不值|划算/,
+    match: /贵|价格|性价比|不值|划算|预算|超支/,
     issue: '价格/性价比',
     priority: 'high',
     severity: '高',
@@ -77,109 +77,109 @@ const ISSUE_PRESETS = [
     impactTargets: ['新客转化', '客单结构', '评论信任'],
     judgment: '价格争议通常不是用户单纯嫌贵,而是用户没有感知到“贵在哪里值得”。',
     surface: '用户表面在说“贵、不值、超预算”。',
-    deeper: '深层问题是套餐路径不清楚、招牌菜价值没有被解释、用户不知道怎么点最稳。',
+    deeper: '深层问题是方案路径不清楚、核心价值没有被解释、用户不知道怎么选最划算。',
     voices: [
-      '味道可以,但这个人均会让我犹豫要不要再来。',
-      '如果是请客可以,日常吃就有点贵。',
-      '套餐看起来便宜,但实际点下来超预算。'
+      '东西可以,但这个价格会让我犹豫要不要选。',
+      '如果是重要场景可以,日常用就有点贵。',
+      '方案看起来便宜,实际算下来超预算。'
     ],
     actionsToday: [
-      '做一个 2 人尝鲜点单路径,写清楚人均、分量和适合场景。',
-      '把招牌菜旁边加一句价值解释:贵在哪里、适合谁、怎么吃更值。'
+      '做一个入门方案,写清楚价格、包含什么、适合谁。',
+      '在核心卖点旁加一句价值解释:贵在哪里、适合谁、怎么用更值。'
     ],
     actions7Days: [
-      '测试 2 人/4 人/6 人套餐,观察用户是否从质疑价格变成询问套餐。',
-      '整理评论区高频价格问题,统一回复人均区间和不踩雷点法。'
+      '测试入门/进阶/高阶方案,观察用户是否从质疑价格变成询问方案。',
+      '整理评论区高频价格问题,统一回复价格区间和怎么选不踩雷。'
     ],
     actionsLongTerm: [
-      '建立稳定的新客尝鲜套餐,用低决策成本承接第一次到店。',
-      '把价格表达从“便宜”改成“怎么得值”。'
+      '建立稳定的新客入门方案,用低决策成本承接第一次。',
+      '把价格表达从“便宜”改成“怎么得值”。'
     ],
     content: [
-      '第一次来南昌烧烤,照这个 2 人套餐点不容易踩雷。',
-      '这道招牌菜到底贵在哪?老板只讲真实成本和口味差异。',
-      '人均多少能吃舒服?别让顾客到店才算账。'
+      '第一次选我们,照这个入门方案走不容易踩雷。',
+      '我们到底贵在哪?只讲真实成本和价值差异。',
+      '预算多少能用得舒服?别让用户下单后才算账。'
     ],
     metrics: [
-      '评论里“贵/不值/踩雷套餐”是否下降。',
-      '首次套餐销量和招牌菜点单率是否上升。',
-      '用户是否开始在评论里询问套餐而不是直接质疑价格。'
+      '评论里“贵/不值/踩雷”是否下降。',
+      '入门方案转化和核心产品选择率是否上升。',
+      '用户是否开始询问方案而不是直接质疑价格。'
     ]
   },
   {
-    match: /不好吃|味道|出品|稳定|咸|辣|淡|翻车/,
-    issue: '味道/出品稳定',
+    match: /质量|品质|效果|不稳定|翻车|参差|交付|货不对板/,
+    issue: '质量/交付稳定',
     priority: 'high',
     severity: '高',
     effort: '中',
     impactTargets: ['复购', '转介绍', '差评风险'],
-    judgment: '味道问题最伤复购,老板要先判断是单品问题、批次问题,还是用户预期被内容抬高。',
-    surface: '用户表面在说“不好吃、不稳定、没有视频里那么惊艳”。',
-    deeper: '深层问题是招牌菜标准化不足,内容预期和门店交付没有对齐。',
+    judgment: '质量问题最伤复购,先判断是单点问题、批次问题,还是内容把用户预期抬高了。',
+    surface: '用户表面在说“质量不稳定、没有宣传里那么好”。',
+    deeper: '深层问题是核心交付标准化不足,内容预期和实际交付没有对齐。',
     voices: [
-      '刷到视频很想吃,但到店感觉没有说得那么惊艳。',
-      '有时候好吃,有时候味道不稳定。',
-      '辣度、咸淡和火候不稳定,会影响整桌体验。'
+      '看内容很想要,实际拿到感觉没那么惊艳。',
+      '有时候很好,有时候质量不稳定。',
+      '不同批次/不同人做出来差别大,影响整体体验。'
     ],
     actionsToday: [
-      '先盯 3 个核心单品,记录咸淡、温度、出餐时间和退换反馈。',
-      '把内容里的夸张表达降下来,改成具体口味描述。'
+      '先盯 3 个核心交付点,记录稳定性、问题反馈和退换情况。',
+      '把内容里的夸张表达降下来,改成具体可验证的描述。'
     ],
     actions7Days: [
-      '连续 7 天复盘招牌菜差评,区分食材、火候、等待、预期四类原因。',
-      '高峰期暂时减少不稳定 SKU,把出品能力集中到招牌菜。'
+      '连续 7 天复盘差评,区分产品、流程、预期、沟通四类原因。',
+      '暂时收紧不稳定的环节,把交付能力集中到核心。'
     ],
     actionsLongTerm: [
-      '建立核心单品 SOP 和抽检机制。',
-      '把真实口味标签固定下来,让内容、菜单和服务员表达一致。'
+      '建立核心交付 SOP 和抽检机制。',
+      '把真实能力标签固定下来,让内容、详情和服务表达一致。'
     ],
     content: [
-      '别只说好吃,讲清楚这家烧烤到底是哪种口味。',
-      '老板复盘:一条差评背后的出品稳定问题。',
-      '招牌菜为什么要少而稳?比菜单越多越重要。'
+      '别只说好,讲清楚我们到底强在哪。',
+      '老板复盘:一条差评背后的交付稳定问题。',
+      '为什么核心要少而稳?比堆功能更重要。'
     ],
     metrics: [
-      '评论里“没想象中好/不稳定/翻车”是否下降。',
-      '招牌菜复点率和退换反馈是否改善。',
-      '用户是否开始用具体口味词夸菜,而不是只说网红。'
+      '评论里“没想象中好/不稳定/翻车”是否下降。',
+      '复购率和退换反馈是否改善。',
+      '用户是否开始用具体细节夸,而不是只说网红。'
     ]
   },
   {
-    match: /服务|态度|老板|员工|体验|环境|卫生/,
+    match: /服务|态度|响应|售后|体验|没人理/,
     issue: '服务/体验',
     priority: 'medium',
     severity: '中',
     effort: '低',
-    impactTargets: ['复购', '带人到店', '现场效率'],
+    impactTargets: ['复购', '转介绍', '响应效率'],
     judgment: '服务体验问题不是一句“培训员工”能解决,而是高峰压力、流程缺口和话术不统一共同造成的。',
-    surface: '用户表面在说“没人理、态度差、环境一般”。',
-    deeper: '深层问题是高峰期岗位分工不清楚,用户遇到等待、催菜、投诉时没有稳定回应。',
+    surface: '用户表面在说“没人理、态度差、响应慢”。',
+    deeper: '深层问题是高峰期分工不清楚,用户遇到咨询、催促、投诉时没有稳定回应。',
     voices: [
       '东西还可以,但服务体验让我下次犹豫。',
-      '忙的时候没人理,问题不知道谁。',
-      '环境和卫生会影响我愿不愿意带朋友来。'
+      '忙的时候没人理,问题不知道谁。',
+      '响应和售后会影响我愿不愿意推荐给别人。'
     ],
     actionsToday: [
-      '设置高峰期固定响应人,专门处理等位、催菜、加单和投诉。',
-      '统一 5 句高频回应话术,避免员工临场发挥。'
+      '设置高峰期固定响应人,专门处理咨询、催促、追单和投诉。',
+      '统一 5 句高频回应话术,避免临场发挥。'
     ],
     actions7Days: [
-      '每天复盘 3 条现场问题,记录发生时段、岗位、处理结果。',
-      '把收台、明档、卫生细节做成用户看得见的信任信号。'
+      '每天复盘 3 条服务问题,记录发生时段、环节、处理结果。',
+      '把流程、进度、售后细节做成用户看得见的信任信号。'
     ],
     actionsLongTerm: [
-      '建立高峰期服务动线和岗位表。',
-      '把服务问题从“员工态度”升级为“流程管理”。'
+      '建立高峰期服务动线和责任表。',
+      '把服务问题从“态度”升级为“流程管理”。'
     ],
     content: [
-      '一家烧烤店真正拉开差距的,不只是味道,还有高峰期体验。',
+      '真正拉开差距的,不只是产品,还有高峰期体验。',
       '老板每天复盘 3 个服务问题,比喊口号更有用。',
-      '为什么有些小店环境一般,顾客还是愿意反复来?'
+      '为什么有些品牌产品普通,用户还是愿意反复来?'
     ],
     metrics: [
-      '评论里“没人理/态度差/环境差/卫生”是否下降。',
-      '高峰催菜次数、投诉次数、收台时长是否下降。',
-      '带朋友/家庭聚餐相关正向评论是否增加。'
+      '评论里“没人理/态度差/响应慢”是否下降。',
+      '高峰催单次数、投诉次数、响应时长是否下降。',
+      '推荐给别人相关的正向评论是否增加。'
     ]
   }
 ];
@@ -411,8 +411,8 @@ function inferPreset(issue, evidenceText = '') {
     ],
     actionsToday: ['先收集 10 条相关评论,按产品、服务、价格、场景四类归因。'],
     actions7Days: ['选择一个最小动作做 7 天验证,看负面表达是否下降。'],
-    actionsLongTerm: ['把高频问题沉淀成门店 SOP、内容话术和复盘指标。'],
-    content: ['从一条真实评论看门店怎么改。'],
+    actionsLongTerm: ['把高频问题沉淀成业务 SOP、内容话术和复盘指标。'],
+    content: ['从一条真实评论看业务怎么改。'],
     metrics: ['相关负面词出现次数是否下降。']
   };
 }
@@ -600,7 +600,7 @@ function buildDeepDive(input = {}) {
       ...preset.content.map((item, index) => `${index + 1}. ${item}`),
       '',
       '## 7 天验证计划',
-      '1. 第 1 天:确定一个门店动作和一个内容动作,不要同时改太多。',
+      '1. 第 1 天:确定一个业务动作和一个内容动作,不要同时改太多。',
       '2. 第 2-4 天:记录相关评论、现场反馈和员工反馈。',
       '3. 第 5-7 天:复查负面词是否下降,咨询型评论是否增加。',
       '',

+ 0 - 38
claude-code/claude-code-voc-intelligence/mcp/src/features/xiaohongshu-trend/industry-presets.js

@@ -217,44 +217,6 @@ const PRESETS = [
         comments: ['能不能看往期学员作品,比老师头衔更重要。']
       }
     ]
-  },
-  {
-    id: 'local-dining',
-    label: '本地生活餐饮',
-    aliases: ['餐饮', '咖啡', '本地生活', '探店', '火锅', '烘焙', '小吃', '酒馆'],
-    defaultKeywords: ['本地探店', '餐厅推荐', '咖啡店打卡', '火锅避坑', '团购套餐'],
-    preferenceSignals: ['性价比', '氛围感', '出片', '服务', '口味稳定', '排队', '套餐'],
-    decisionSignals: ['价格', '口味', '分量', '环境', '排队', '服务', '停车', '复购'],
-    elementSignals: ['套餐', '招牌菜', '咖啡', '甜品', '包间', '团购', '位置'],
-    riskSignals: ['踩雷', '照骗', '排队久', '服务差', '分量少', '不值'],
-    applicationLabel: '探店内容或到店转化',
-    talkTarget: '到店用户',
-    sampleNotes: [
-      {
-        title: '探店内容别只拍氛围,评论区最关心值不值',
-        content: '用户会被氛围图吸引,但评论里反复问人均、分量、排队和团购能不能用。',
-        author: '城市吃喝指南',
-        imageLabel: '探店性价比',
-        tags: ['本地探店', '性价比', '团购'],
-        comments: ['图很好看,我就想知道两个人吃完到底多少钱。', '排队一小时就劝退了。']
-      },
-      {
-        title: '咖啡店打卡从出片转向长期复购',
-        content: '评论里除了装修,还在问豆子、甜品、座位和工作日体验。复购理由比一次性打卡更重要。',
-        author: '咖啡店观察',
-        imageLabel: '咖啡店复购',
-        tags: ['咖啡', '氛围', '复购'],
-        comments: ['能坐下来办公吗?如果只能拍照就不会再去了。']
-      },
-      {
-        title: '火锅团购套餐最容易翻车的是隐藏限制',
-        content: '用户对团购套餐很敏感,关注锅底、菜量、节假日能不能用和服务态度。',
-        author: '团购避坑局',
-        imageLabel: '火锅团购避坑',
-        tags: ['火锅', '团购', '套餐'],
-        comments: ['套餐看着便宜,结果锅底和小料另算就不香了。']
-      }
-    ]
   }
 ];
 

+ 1 - 1
claude-code/claude-code-voc-intelligence/mcp/src/server.js

@@ -391,7 +391,7 @@ function createServer() {
         'Use when the user says continue digging, what should the boss do, how to solve this problem, or turn this VOC into actions.'
       ].join(' '),
       inputSchema: {
-        issue: z.string().optional().describe('Single VOC issue to deep dive, e.g. 排队, 贵, 不好吃, 服务差.'),
+        issue: z.string().optional().describe('Single VOC issue to deep dive, e.g. 怎么选, 贵, 质量不稳定, 服务差.'),
         problem: z.string().optional().describe('Alias for issue.'),
         topic: z.string().optional().describe('Alias for issue.'),
         project: z.string().optional().describe('Optional project, brand, or account name used to isolate deep-dive memory.'),

+ 6 - 6
claude-code/claude-code-voc-intelligence/package.json

@@ -21,12 +21,12 @@
     "dy:preference-smoke": "node mcp/src/tools/douyin-preference-update.js --message \"保留口播开头和评论区问题,不要只做纯素材剪辑,下一个版本更偏门店转化话术。\" --memory ../outputs/claude-code-douyin-memory-smoke/douyin-trend-memory.json --result-prefix DOUYIN_PREF_RESULT",
     "dy:sample-with-memory": "node mcp/src/tools/douyin-trend-run.js --collection-mode sample --profile memory-templates/douyin-trend-profile.json --memory ../outputs/claude-code-douyin-memory-smoke/douyin-trend-memory.json --output ../outputs/claude-code-douyin-memory-smoke/report --result-prefix DOUYIN_TREND_RESULT",
     "dy:live": "node mcp/src/tools/douyin-trend-run.js --collection-mode live --profile memory-templates/douyin-trend-profile.json --output ../outputs/claude-code-douyin-live --keyword-limit 1 --videos-per-keyword 1 --max-comment-pages 1 --result-prefix DOUYIN_TREND_RESULT",
-    "voc:issue-pool": "node mcp/src/tools/voc-issue-pool-run.js --project 样板门店A --industry 本地生活餐饮 --scenario 门店经营 --audience 到店顾客 --evidence \"排队久,但是不知道值不值得等。;人均有点高,第一次来不知道怎么点不踩雷。;服务忙起来没人理。\" --assistant-message-only",
-    "voc:deep-dive": "node mcp/src/tools/voc-problem-deep-dive-run.js --issue 排队 --industry 本地生活餐饮 --scenario 门店经营 --audience 到店顾客 --assistant-message-only",
-    "voc:content-plan": "node mcp/src/tools/voc-content-plan-run.js --brand 样板门店A --industry 本地生活餐饮 --issues \"第一次来怕踩雷;觉得人均贵;怕排队久\" --assistant-message-only",
-    "voc:speaking-script": "node mcp/src/tools/voc-speaking-script-run.js --brand 样板门店A --industry 本地生活餐饮 --topic \"第一次来怎么点不踩雷\" --user-issue \"第一次来怕点错\" --evidence \"第一次来不知道怎么点,怕踩雷\" --assistant-message-only",
-    "voc:competitor-map": "node mcp/src/tools/voc-competitor-map-run.js --brand 样板门店A --city 南昌 --category 餐饮 --assistant-message-only",
-    "voc:business-workflow": "node mcp/src/tools/voc-business-workflow-run.js --brand 样板门店A --industry 本地生活餐饮 --platform douyin --collection-mode sample --keywords \"南昌菜,第一次来怎么点,排队\" --assistant-message-only",
+    "voc:issue-pool": "node mcp/src/tools/voc-issue-pool-run.js --project 示例品牌A --industry 家居定制 --scenario 线上获客 --audience 意向用户 --evidence \"第一次买不知道怎么选,怕踩雷。;价格有点高,不确定值不值。;咨询的时候没人理。\" --assistant-message-only",
+    "voc:deep-dive": "node mcp/src/tools/voc-problem-deep-dive-run.js --issue 怎么选 --industry 家居定制 --scenario 线上获客 --audience 意向用户 --assistant-message-only",
+    "voc:content-plan": "node mcp/src/tools/voc-content-plan-run.js --brand 示例品牌A --industry 家居定制 --issues \"第一次买怕踩雷;觉得价格贵;怕质量不稳定\" --assistant-message-only",
+    "voc:speaking-script": "node mcp/src/tools/voc-speaking-script-run.js --brand 示例品牌A --industry 家居定制 --topic \"第一次买怎么选不踩雷\" --user-issue \"第一次买怕选错\" --evidence \"第一次买不知道怎么选,怕踩雷\" --assistant-message-only",
+    "voc:competitor-map": "node mcp/src/tools/voc-competitor-map-run.js --brand 示例品牌A --city 本地 --category 家居定制 --assistant-message-only",
+    "voc:business-workflow": "node mcp/src/tools/voc-business-workflow-run.js --brand 示例品牌A --industry 家居定制 --platform douyin --collection-mode sample --keywords \"家居定制怎么选,第一次买怎么对比,售后\" --assistant-message-only",
     "mcp:start": "node mcp/src/server.js",
     "mcp:smoke": "node scripts/smoke-mcp.js",
     "acceptance": "node scripts/acceptance.js"

+ 7 - 7
claude-code/claude-code-voc-intelligence/scripts/smoke-cross-industry.js

@@ -63,15 +63,15 @@ const CASES = [
     }
   },
   {
-    name: 'local-dining',
+    name: 'fitness',
     profile: {
       project: '行业趋势情报官',
-      industry: '本地生活餐饮',
-      businessType: '门店/团购/探店账号',
-      targetAudience: ['到店消费者', '团购用户'],
-      keywords: ['探店', '套餐', '人均', '排队', '氛围'],
-      trendQuestions: ['用户更在意口味还是性价比?', '什么门店体验会影响复购?', '哪些负面点最容易被评论放大?'],
-      mustTrackSignals: ['口味', '服务', '排队', '环境', '复购']
+      industry: '运动健身',
+      businessType: '健身房/私教/内容账号',
+      targetAudience: ['健身新手', '想减脂增肌的用户'],
+      keywords: ['私教课', '减脂', '增肌', '体验课', '怎么选'],
+      trendQuestions: ['用户更在意效果还是价格?', '什么体验会影响续课?', '哪些负面点最容易被评论放大?'],
+      mustTrackSignals: ['效果', '教练', '价格', '环境', '续课']
     }
   }
 ];

+ 30 - 57
claude-code/claude-code-voc-intelligence/scripts/smoke-mcp.js

@@ -154,14 +154,14 @@ async function main() {
     const issuePoolResult = await client.callTool({
       name: 'voc_issue_pool_run',
       arguments: {
-        project: 'MCP样板门店',
-        industry: '本地生活餐饮',
-        scenario: '门店经营',
-        audience: '到店顾客',
+        project: 'MCP示例品牌',
+        industry: '家居定制',
+        scenario: '线上获客',
+        audience: '意向用户',
         evidence: [
-          '排队久,但是不知道值不值得等。',
-          '人均有点高,第一次来不知道怎么点不踩雷。',
-          '服务忙起来没人理。'
+          '第一次买不知道怎么选,怕踩雷。',
+          '价格有点高,不确定值不值。',
+          '咨询的时候没人理。'
         ]
       }
     });
@@ -175,13 +175,13 @@ async function main() {
     const deepDiveResult = await client.callTool({
       name: 'voc_problem_deep_dive_run',
       arguments: {
-        issue: '排队',
-        project: 'MCP样板门店',
-        industry: '本地生活餐饮',
-        scenario: '门店经营',
-        audience: '到店顾客',
-        evidence: ['排队久,但是不知道值不值得等。'],
-        feedback: '老板不想做等位饮品,更想先改评论区回复和预点单'
+        issue: '怎么选',
+        project: 'MCP示例品牌',
+        industry: '家居定制',
+        scenario: '线上获客',
+        audience: '意向用户',
+        evidence: ['第一次买不知道怎么选,怕踩雷。'],
+        feedback: '老板不想做试用体验,更想先改评论区回复和案例展示'
       }
     });
     const deepDiveStructured = deepDiveResult.structuredContent || {};
@@ -192,8 +192,8 @@ async function main() {
       !deepDiveStructured.summary?.memoryPath) {
       throw new Error(`Expected boss-oriented deep dive result, got: ${JSON.stringify(deepDiveStructured)}`);
     }
-    if (!deepDiveStructured.data?.memory?.blockedActions?.includes('等位饮品') ||
-      !deepDiveStructured.data?.memory?.preferredActions?.includes('预点单')) {
+    if (!deepDiveStructured.data?.memory?.blockedActions?.includes('试用体验') ||
+      !deepDiveStructured.data?.memory?.preferredActions?.includes('评论区回复')) {
       throw new Error('Expected deep dive MCP call to parse feedback into scoped memory');
     }
     if (!JSON.stringify(deepDiveStructured.nextActions || []).includes('live')) {
@@ -203,9 +203,9 @@ async function main() {
     const contentPlanResult = await client.callTool({
       name: 'voc_content_plan_run',
       arguments: {
-        brand: 'MCP样板门店',
-        industry: '本地生活餐饮',
-        issues: ['第一次来怕踩雷', '觉得人均贵', '怕排队久']
+        brand: 'MCP示例品牌',
+        industry: '家居定制',
+        issues: ['第一次买怕踩雷', '觉得价格贵', '怕质量不稳定']
       }
     });
     const contentPlanStructured = contentPlanResult.structuredContent || {};
@@ -217,41 +217,14 @@ async function main() {
       throw new Error(`Expected VOC content plan result, got: ${JSON.stringify(contentPlanStructured)}`);
     }
 
-    const teaContentPlanResult = await client.callTool({
-      name: 'voc_content_plan_run',
-      arguments: {
-        brand: '茶饮新客转化',
-        industry: '茶饮',
-        issues: [
-          '第一次来怎么点最稳',
-          '18-22 元贵在哪/值在哪',
-          '券后价和套餐怎么买最划算',
-          '茶底/甜度/配料怎么选',
-          '哪几款不容易踩雷',
-          '外卖到手怎么避免翻车',
-          '买一送一/团购规则怎么讲清楚'
-        ],
-        evidenceText: '小红书评论:波霸奶茶用的什么茶底?我要避雷!!下午喝的,晚上睁眼到天亮。抖音线索:9.9 新品、11.9 单人下午茶、21 元买一送一能触发注意,但还需要解释规则、口味和是否有坑。'
-      }
-    });
-    const teaContentPlanStructured = teaContentPlanResult.structuredContent || {};
-    const teaContentPlanMessage = String(teaContentPlanStructured.assistantMessage || '');
-    if (teaContentPlanStructured.status !== 'ok' ||
-      !teaContentPlanMessage.includes('茶底怎么选') ||
-      !teaContentPlanMessage.includes('买一送一到底怎么算') ||
-      teaContentPlanMessage.includes('招牌菜') ||
-      teaContentPlanMessage.includes('下饭菜')) {
-      throw new Error(`Expected tea-specific VOC content plan result, got: ${JSON.stringify(teaContentPlanStructured)}`);
-    }
-
     const speakingScriptResult = await client.callTool({
       name: 'voc_speaking_script_run',
       arguments: {
-        brand: 'MCP样板门店',
-        industry: '本地生活餐饮',
-        topic: '第一次来怎么点不踩雷',
-        userIssue: '第一次来怕点错',
-        evidence: ['第一次来不知道怎么点,怕踩雷'],
+        brand: 'MCP示例品牌',
+        industry: '家居定制',
+        topic: '第一次买怎么选不踩雷',
+        userIssue: '第一次买怕选错',
+        evidence: ['第一次买不知道怎么选,怕踩雷'],
         feedback: '开头更狠一点,老板视角,少讲概念,多给具体场景',
         memory: '../outputs/claude-code-xhs-mcp-smoke/voc-speaking-script-memory.json',
         finalize: true
@@ -271,9 +244,9 @@ async function main() {
     const competitorMapResult = await client.callTool({
       name: 'voc_competitor_map_run',
       arguments: {
-        brand: 'MCP样板门店',
-        city: '南昌',
-        category: '餐饮'
+        brand: 'MCP示例品牌',
+        city: '本地',
+        category: '家居定制'
       }
     });
     const competitorMapStructured = competitorMapResult.structuredContent || {};
@@ -288,11 +261,11 @@ async function main() {
     const businessWorkflowResult = await client.callTool({
       name: 'voc_business_workflow_run',
       arguments: {
-        brand: 'MCP样板门店',
-        industry: '本地生活餐饮',
+        brand: 'MCP示例品牌',
+        industry: '家居定制',
         platform: 'douyin',
         collectionMode: 'sample',
-        keywords: ['南昌菜', '第一次来怎么点', '排队']
+        keywords: ['家居定制怎么选', '第一次买怎么对比', '售后']
       }
     });
     const businessWorkflowStructured = businessWorkflowResult.structuredContent || {};

+ 91 - 91
claude-code/claude-code-voc-intelligence/scripts/smoke-package.js

@@ -310,36 +310,36 @@ async function smokeIssuePoolReportEvidenceFiltering() {
   const reportPath = path.join(OUTPUT_ROOT, 'issue-pool-report-filter-smoke.md');
   const memoryPath = path.join(OUTPUT_ROOT, 'issue-pool-report-filter-memory.json');
   fs.writeFileSync(reportPath, [
-    '# 盛焰铁板烧竞品图谱',
+    '# 示例品牌竞品图谱',
     '',
     '## 品牌背景',
-    '- 品牌:盛焰铁板烧',
-    '- 城市:南昌',
+    '- 品牌:示例品牌A',
+    '- 城市:本地',
     '',
     '## 当前经营痛点',
-    '1. 日常营销能够带来 TC,但是活动折扣大。',
+    '1. 日常营销能够带来线索,但是活动折扣大。',
     '',
     '## live 采集真实样本',
-    '1. [南昌铁板烧样本](https://example.test/note)',
+    '1. [价格样本](https://example.test/note)',
     '   - 关键评论:多少钱啊',
-    '   - 可解读点:用户第一反应不是口味,而是价格。',
-    '2. [南昌排队样本](https://example.test/note2)',
-    '   - 高赞评论:排队太久了,下次不想等',
+    '   - 可解读点:用户第一反应不是质量,而是价格。',
+    '2. [选择样本](https://example.test/note2)',
+    '   - 高赞评论:第一次买不知道怎么选,怕踩雷',
     '',
     '## 下一步建议',
-    '- 先选一做深度拆解。'
+    '- 先选一个问题做深度拆解。'
   ].join('\n'));
   const result = await runVocIssuePool({
-    project: '盛焰铁板烧',
-    industry: '餐饮',
-    scenario: '门店经营',
-    audience: '到店顾客',
+    project: '示例品牌A',
+    industry: '家居定制',
+    scenario: '线上获客',
+    audience: '意向用户',
     report: reportPath,
     memory: memoryPath
   });
   const issues = result.data?.issues || [];
   const evidence = issues.flatMap(issue => issue.evidence || []);
-  if (!issues.some(issue => issue.id === 'price') || !issues.some(issue => issue.id === 'waiting')) {
+  if (!issues.some(issue => issue.id === 'price') || !issues.some(issue => issue.id === 'decision')) {
     throw new Error('issue pool did not classify filtered report comments');
   }
   if (issues.some(issue => issue.id === 'other' && issue.count > 0)) {
@@ -571,25 +571,25 @@ async function smokeBusinessStatusErrors() {
 }
 
 async function smokeDouyinSearchInputErrors() {
-  const normalized = normalizeSearchKeyword('茶饮18元22元');
-  if (normalized !== '茶饮 18元 22元') {
+  const normalized = normalizeSearchKeyword('家居定制18元22元');
+  if (normalized !== '家居定制 18元 22元') {
     throw new Error(`expected douyin keyword spacing normalization, got ${normalized}`);
   }
-  const repairCandidates = buildKeywordRepairCandidates('茶饮 18元 22元', {
-    industry: '茶饮',
+  const repairCandidates = buildKeywordRepairCandidates('家居定制 18元 22元', {
+    industry: '家居定制',
     targetAudience: ['新客']
   });
-  if (!repairCandidates.includes('茶饮 性价比 新客')) {
+  if (!repairCandidates.includes('家居定制 性价比 新客')) {
     throw new Error(`expected douyin keyword repair candidates, got ${repairCandidates.join(', ')}`);
   }
-  if (!keywordValidationIssue('茶饮'.repeat(40))) {
+  if (!keywordValidationIssue('家居定制'.repeat(40))) {
     throw new Error('expected overlong douyin keyword to be rejected before search');
   }
 
   const overlong = await runDouyinTrend({
     collectionMode: 'live',
     vocToken: 'r:smoke-token',
-    keywords: '茶饮'.repeat(40),
+    keywords: '家居定制'.repeat(40),
     output: path.join(OUTPUT_ROOT, 'douyin-overlong-keyword')
   });
   if (overlong.status !== 'needs_keyword_fix') {
@@ -609,7 +609,7 @@ async function smokeDouyinSearchInputErrors() {
     const result = await runDouyinTrend({
       collectionMode: 'live',
       vocToken: 'r:smoke-token',
-      keywords: '茶饮 18元 22元',
+      keywords: '家居定制 18元 22元',
       keywordLimit: 1,
       videosPerKeyword: 1,
       maxCommentPages: 0,
@@ -654,7 +654,7 @@ async function smokeDouyinSearchInputErrors() {
                   data: {
                     aweme_info: {
                       aweme_id: 'douyin-repair-smoke-1',
-                      desc: '茶饮性价比新客点单避坑',
+                      desc: '家居定制性价比新客怎么选避坑',
                       author: { nickname: 'smoke' },
                       statistics: { digg_count: 1, comment_count: 0, share_count: 0 }
                     }
@@ -669,9 +669,9 @@ async function smokeDouyinSearchInputErrors() {
     const repaired = await runDouyinTrend({
       collectionMode: 'live',
       vocToken: 'r:smoke-token',
-      industry: '茶饮',
+      industry: '家居定制',
       targetAudience: '新客',
-      keywords: '茶饮 18元 22元',
+      keywords: '家居定制 18元 22元',
       keywordLimit: 1,
       videosPerKeyword: 1,
       maxCommentPages: 0,
@@ -746,14 +746,14 @@ async function main() {
   }
 
   const deepDive = await runVocProblemDeepDive({
-    issue: '排队',
-    industry: '本地生活餐饮',
-    scenario: '门店经营',
-    audience: '到店顾客',
+    issue: '怎么选',
+    industry: '家居定制',
+    scenario: '线上获客',
+    audience: '意向用户',
     memory: path.join(OUTPUT_ROOT, 'voc-problem-memory.json'),
     evidence: [
-      '想吃就得排队。',
-      '排了很久以后,如果菜品普通就会觉得不值。'
+      '第一次买就得反复对比。',
+      '对比了很久以后,如果质量普通就会觉得不值。'
     ]
   });
   const deepDiveBody = String(deepDive.assistantMessage || '');
@@ -773,32 +773,32 @@ async function main() {
     throw new Error('VOC problem deep dive next actions did not hand off to live collection');
   }
   const deepDiveWithMemory = await runVocProblemDeepDive({
-    issue: '排队',
-    industry: '本地生活餐饮',
-    scenario: '门店经营',
-    audience: '到店顾客',
+    issue: '怎么选',
+    industry: '家居定制',
+    scenario: '线上获客',
+    audience: '意向用户',
     memory: deepDive.summary.memoryPath,
-    feedback: '老板不想做等位饮品,更想先改评论区回复和预点单',
-    blockedActions: ['等位饮品'],
-    preferredActions: ['评论区回复', '预点单']
+    feedback: '老板不想做试用体验,更想先改评论区回复和案例展示',
+    blockedActions: ['试用体验'],
+    preferredActions: ['评论区回复', '案例展示']
   });
   const memoryBody = String(deepDiveWithMemory.assistantMessage || '');
   if (!deepDiveWithMemory.summary.memoryApplied || !memoryBody.includes('## 已应用的使用记忆')) {
     throw new Error('VOC problem deep dive did not apply iterative memory');
   }
-  smokeDeepDiveMemoryBehavior(deepDiveWithMemory, '等位饮品');
+  smokeDeepDiveMemoryBehavior(deepDiveWithMemory, '试用体验');
 
   const issuePool = await runVocIssuePool({
-    project: '样板门店A',
-    industry: '本地生活餐饮',
-    scenario: '门店经营',
-    audience: '到店顾客',
+    project: '示例品牌A',
+    industry: '家居定制',
+    scenario: '线上获客',
+    audience: '意向用户',
     evidence: [
-      '排队久,但是不知道值不值得等。',
-      '等位时间不透明,到了现场才知道要等多久。',
-      '人均有点高,第一次来不知道怎么点不踩雷。',
-      '服务忙起来没人理。',
-      '视频很种草,实际到店体验有落差。'
+      '第一次买不知道怎么选,怕踩雷。',
+      '对比来对比去,到了下单才发现细节没说清。',
+      '价格有点高,第一次买不知道怎么选不踩雷。',
+      '咨询忙起来没人理。',
+      '视频很种草,实际拿到手有落差。'
     ]
   });
   const issuePoolBody = String(issuePool.assistantMessage || '');
@@ -809,22 +809,22 @@ async function main() {
     !issuePool.data?.issues?.length) {
     throw new Error('VOC issue pool did not return prioritized issue output');
   }
-  if (!issuePool.data.issues.some(issue => issue.title === '排队/等待')) {
-    throw new Error('VOC issue pool did not classify waiting issue');
+  if (!issuePool.data.issues.some(issue => issue.title === '选择门槛/决策')) {
+    throw new Error('VOC issue pool did not classify decision issue');
   }
   const issuePoolUpdated = await runVocIssuePool({
-    project: '样板门店A',
-    industry: '本地生活餐饮',
-    scenario: '门店经营',
-    audience: '到店顾客',
+    project: '示例品牌A',
+    industry: '家居定制',
+    scenario: '线上获客',
+    audience: '意向用户',
     memory: issuePool.summary.memoryPath,
-    evidence: ['排队问题已经开始做预点单验证。'],
-    validatingIssues: ['排队/等待']
+    evidence: ['选择问题已经开始做对比清单验证。'],
+    validatingIssues: ['选择门槛/决策']
   });
-  if (!issuePoolUpdated.data?.issues?.some(issue => issue.title === '排队/等待' && issue.status === '验证中')) {
+  if (!issuePoolUpdated.data?.issues?.some(issue => issue.title === '选择门槛/决策' && issue.status === '验证中')) {
     throw new Error('VOC issue pool did not apply issue status update');
   }
-  const waitingTrend = issuePoolUpdated.data?.issues?.find(issue => issue.title === '排队/等待');
+  const waitingTrend = issuePoolUpdated.data?.issues?.find(issue => issue.title === '选择门槛/决策');
   if (!waitingTrend || waitingTrend.previousCount < 1 || waitingTrend.delta >= 0 || waitingTrend.trend !== 'down') {
     throw new Error('VOC issue pool did not compare issue trend with previous run');
   }
@@ -833,48 +833,48 @@ async function main() {
   }
 
   const parsedFeedbackDeepDive = await runVocProblemDeepDive({
-    issue: '排队',
-    project: '样板门店A',
-    industry: '本地生活餐饮',
-    scenario: '门店经营',
-    audience: '到店顾客',
-    feedback: '这个店不想做等位饮品,更想先改评论区回复和预点单'
+    issue: '怎么选',
+    project: '示例品牌A',
+    industry: '家居定制',
+    scenario: '线上获客',
+    audience: '意向用户',
+    feedback: '这个品牌不想做试用体验,更想先改评论区回复和案例展示'
   });
-  smokeDeepDiveMemoryBehavior(parsedFeedbackDeepDive, '等位饮品');
-  if (!String(parsedFeedbackDeepDive.summary.memoryPath || '').includes('样板门店a')) {
+  smokeDeepDiveMemoryBehavior(parsedFeedbackDeepDive, '试用体验');
+  if (!String(parsedFeedbackDeepDive.summary.memoryPath || '').includes('示例品牌a')) {
     throw new Error('VOC problem deep dive did not use scoped default memory path');
   }
   const parsedMemory = parsedFeedbackDeepDive.data?.memory || {};
-  if (!parsedMemory.blockedActions?.includes('等位饮品') ||
+  if (!parsedMemory.blockedActions?.includes('试用体验') ||
     !parsedMemory.preferredActions?.includes('评论区回复') ||
-    !parsedMemory.preferredActions?.includes('预点单')) {
+    !parsedMemory.preferredActions?.includes('案例展示')) {
     throw new Error('VOC problem deep dive did not parse natural-language feedback into memory');
   }
 
   const actionWeightedDeepDive = await runVocProblemDeepDive({
-    issue: '排队',
-    project: '样板门店A',
-    industry: '本地生活餐饮',
-    scenario: '门店经营',
-    audience: '到店顾客',
+    issue: '怎么选',
+    project: '示例品牌A',
+    industry: '家居定制',
+    scenario: '线上获客',
+    audience: '意向用户',
     memory: parsedFeedbackDeepDive.summary.memoryPath,
-    validatedActions: ['预点单'],
-    rejectedActions: ['等位饮品'],
-    feedback: '预点单有效,等位饮品无效'
+    validatedActions: ['案例展示'],
+    rejectedActions: ['试用体验'],
+    feedback: '案例展示有效,试用体验无效'
   });
   const actionWeightedBody = String(actionWeightedDeepDive.assistantMessage || '');
   if (!actionWeightedBody.includes('为什么优先推荐这些动作')) {
     throw new Error('VOC problem deep dive did not explain action-weight memory');
   }
   const actionStats = actionWeightedDeepDive.data?.memory?.actionStats || {};
-  if (!actionStats['预点单']?.validatedCount || !actionStats['等位饮品']?.rejectedCount) {
+  if (!actionStats['案例展示']?.validatedCount || !actionStats['试用体验']?.rejectedCount) {
     throw new Error('VOC problem deep dive did not persist action validation stats');
   }
 
   const contentPlan = await runVocContentPlan({
-    brand: '样板门店A',
-    industry: '本地生活餐饮',
-    issues: ['第一次来怕踩雷', '觉得人均贵', '怕排队久']
+    brand: '示例品牌A',
+    industry: '家居定制',
+    issues: ['第一次买怕踩雷', '觉得价格贵', '怕质量不稳定']
   });
   const contentPlanBody = String(contentPlan.assistantMessage || '');
   if (contentPlan.status !== 'ok' ||
@@ -886,11 +886,11 @@ async function main() {
   }
 
   const speakingScript = await runVocSpeakingScript({
-    brand: '样板门店A',
-    industry: '本地生活餐饮',
-    topic: '第一次来怎么点不踩雷',
-    userIssue: '第一次来怕点错',
-    evidence: ['第一次来不知道怎么点,怕踩雷'],
+    brand: '示例品牌A',
+    industry: '家居定制',
+    topic: '第一次买怎么选不踩雷',
+    userIssue: '第一次买怕选错',
+    evidence: ['第一次买不知道怎么选,怕踩雷'],
     feedback: '开头更狠一点,老板视角,少讲概念,多给具体场景',
     memory: path.join(OUTPUT_ROOT, 'voc-speaking-script-memory.json'),
     finalize: true
@@ -906,9 +906,9 @@ async function main() {
   }
 
   const competitorMap = await runVocCompetitorMap({
-    brand: '样板门店A',
-    city: '南昌',
-    category: '餐饮'
+    brand: '示例品牌A',
+    city: '本地',
+    category: '家居定制'
   });
   const competitorMapBody = String(competitorMap.assistantMessage || '');
   if (competitorMap.status !== 'ok' ||
@@ -919,11 +919,11 @@ async function main() {
   }
 
   const businessWorkflow = await runBusinessWorkflow({
-    brand: '样板门店A',
-    industry: '本地生活餐饮',
+    brand: '示例品牌A',
+    industry: '家居定制',
     platform: 'douyin',
     collectionMode: 'sample',
-    keywords: ['南昌菜', '第一次来怎么点', '排队']
+    keywords: ['家居定制怎么选', '第一次买怎么对比', '售后']
   });
   const businessWorkflowBody = String(businessWorkflow.assistantMessage || '');
   if (businessWorkflow.status !== 'ok' ||

+ 2 - 2
claude-code/claude-code-voc-intelligence/skill-package-manifest.json

@@ -56,8 +56,8 @@
   ],
   "recommendedUserPrompts": [
     "帮我做一份家装全屋定制行业的小红书趋势情报。先用演示样例跑通流程,不要真实采集。",
-    "帮我看下南昌餐饮行业抖音上用户最近在吐槽什么,先小规模真实采集。",
-    "继续深挖“排队”这个问题,站在老板视角告诉我怎么解决。"
+    "帮我看下家居定制行业抖音上用户最近在吐槽什么,先小规模真实采集。",
+    "继续深挖“怎么选”这个问题,站在老板视角告诉我怎么解决。"
   ],
   "sampleCommand": "npm run xhs:sample",
   "mcpSmokeCommand": "npm run mcp:smoke",

+ 4 - 4
claude-code/claude-code-voc-intelligence/skills/douyin-trend-intelligence/SKILL.md

@@ -29,14 +29,14 @@ allowed-tools: Read Write Bash(node *)
 live 采集失败时,严禁做以下任何一件事:
 
 - 严禁退回/降级到联网搜索(web search)、`yt-dlp`、`ffmpeg`、手动让用户上传 mp4,或任何“绕过 VOC 接口”的抓取方式。本技能包的 VOC 本地采集是唯一批准的真实数据入口。
-- 严禁输出“VOC 只支持餐饮/零售类目”“律师/某赛道不可用”“系统设计上有类目限制”这类结论。这是错误结论:任何关键词(律师、法律、医美、教育、专业服务等)都能采集,与类目无关。
+- 严禁输出“VOC 只支持某些类目”“律师/某赛道不可用”“系统设计上有类目限制”这类结论。这是错误结论:任何关键词(律师、法律、医美、教育、专业服务等)都能采集,与类目无关。
 - live 失败的真正原因只可能是这几类:token 无效或类型不对(需要 `r:` 开头的会话 token,而不是 `sk-` 开头的 AIGate API Key)、未开通或额度不足、上游接口抖动(5xx,需重试)。必须如实把工具返回的 `assistantMessage` 转述给用户,不要自行编造原因。
 - 只有在工具明确返回 `needs_keyword_fix` 时才允许调整关键词;返回 `needs_valid_token` / `needs_token` / `needs_recharge` 时不要换关键词,要转述充值/开通链接。
 
 English (same rules):
 
 - On live failure, NEVER fall back to web search, `yt-dlp`, `ffmpeg`, or asking the user to upload an mp4. The local VOC tool is the only approved real-data path.
-- NEVER conclude that VOC is limited to restaurant/retail categories or that a vertical (e.g. lawyers) is unsupported. Any keyword works; this is never a category problem.
+- NEVER conclude that VOC is limited to certain categories or that a vertical (e.g. lawyers) is unsupported. Any keyword works; this is never a category problem.
 - The only real causes are: invalid/wrong-type token (need an `r:` session token, not an `sk-` AIGate key), not activated / no balance, or upstream 5xx jitter (retry). Relay the tool's `assistantMessage` verbatim instead of inventing a reason.
 - Only adjust keywords when the tool returns `needs_keyword_fix`. For `needs_valid_token` / `needs_token` / `needs_recharge`, do not change keywords — surface the payment/activation link.
 
@@ -47,9 +47,9 @@ When `voc_douyin_trend_run` returns `needs_keyword_fix`, do not tell the user to
 Claude Code should immediately retry once with a short natural keyword before asking the user, unless the user explicitly asked not to retry. Use this shape:
 
 - `品类 + 价格/问题 + 人群/场景`
-- Examples (任何行业都适用,不限餐饮): `<品类/服务> <价格区间> <人群>`, `<品类/服务> 性价比 新客`, `<品类/服务> 避坑 怎么选`
+- Examples (任何行业都适用): `<品类/服务> <价格区间> <人群>`, `<品类/服务> 性价比 新客`, `<品类/服务> 避坑 怎么选`
 
-If a compact keyword is provided, add spaces between category, numbers, and scenario words. Example: `<品类>18元22元` -> `<品类> 18元 22元`. 不要默认套用餐饮词,按用户真实行业(律师、法律、医美、教育等都可以)替换占位符。
+If a compact keyword is provided, add spaces between category, numbers, and scenario words. Example: `<品类>18元22元` -> `<品类> 18元 22元`. 不要默认套用某个行业的词,按用户真实行业(律师、法律、医美、教育等都可以)替换占位符。
 
 Only show the recharge/payment URL for `needs_token`, `needs_recharge`, or `needs_valid_token`. Empty keywords and overlong keywords are keyword/input repair. But upstream failures (5xx / `fetch failed` / `社交平台接口请求错误` / 超时) are NOT keyword problems and NOT category problems — the tool returns `upstream_unstable`; just relay its message and retry the same live command, do not switch keywords or conclude the category is unsupported.
 

+ 1 - 1
claude-code/claude-code-voc-intelligence/skills/douyin-trend-intelligence/references/live-mode.md

@@ -38,7 +38,7 @@
 推荐格式:
 
 ```text
-<任何行业的品类/服务> + 价格/问题 + 人群/场景(不限餐饮
+<任何行业的品类/服务> + 价格/问题 + 人群/场景(任何行业都适用
 ```
 
 示例:

+ 1 - 1
claude-code/claude-code-voc-intelligence/skills/voc-api-catalog/SKILL.md

@@ -43,7 +43,7 @@ VOC 后端是一个**通用转发网关**(`https://server.fmode.cn/api/voc-soc
 - 禁止把**入参/参数错误**(`needs_input`)误报成「采集不到数据 / 该关键词没结果 / 类目不支持」。参数错就如实说参数错,并用 `voc_api_doc` 核对后重试。
 - 禁止把**上游不稳定**(`upstream_unstable`,如 5xx / 连接超时 / fetch failed)误报成「关键词问题 / 类目不支持 / 余额不足」。如实说明是上游接口波动,稍后重试。
 - 禁止把 **token 无效/类型不对**(`needs_valid_token`)误报成「余额不足」或「类目不支持」。
-- 禁止输出「只支持餐饮 / 某行业不可用 / 系统只支持某类目」这类结论——**任何行业、任何关键词都能采集**,前提只是 token 类型正确且有额度。
+- 禁止输出「某行业不可用 / 系统只支持某类目」这类结论——**任何行业、任何关键词都能采集**,前提只是 token 类型正确且有额度。
 - 失败时禁止退回 web search / yt-dlp / ffmpeg / 让用户手动传媒体文件来「绕过」采集。
 
 ## 状态码含义

+ 1 - 1
claude-code/claude-code-voc-intelligence/skills/voc-business-workflow/SKILL.md

@@ -40,7 +40,7 @@ description: Run the full VOC business workflow from natural boss language: coll
 ## 用户可说的话
 
 ```text
-帮我看一下南昌餐饮最近顾客在关心什么,并告诉我先改哪里、下周发什么。
+帮我看一下家居定制最近用户在关心什么,并告诉我先改哪里、下周发什么。
 ```
 
 ```text

+ 4 - 4
claude-code/claude-code-voc-intelligence/skills/voc-competitor-map/SKILL.md

@@ -11,7 +11,7 @@ allowed-tools: Read Write Bash(node *)
 ## 必须执行
 
 - 当用户说“看竞品、竞品分析、错位竞争、别人怎么做、谁做得好、我不知道竞品是谁、竞争策略”时,优先运行 `voc_competitor_map_run`。
-- 需要判断竞品候选维度、错位竞争表达或餐饮场景时,优先参考 `references/restaurant-competitor-framework.md` 和 `references/restaurant-differentiation-patterns.md`。
+- 需要判断竞品候选维度或错位竞争表达时,优先参考 `references/competitor-framework.md` 和 `references/differentiation-patterns.md`。
 - 如果用户没有明确竞品,先按同城、同品类、同价格带、同消费场景、平台声量生成候选竞品类型。
 - 输出必须站在经营视角:别人被夸什么、被骂什么、我方该避开什么、突出什么。
 - 不能只做品牌 SWOT。必须保留用户原话或 VOC 证据样本。
@@ -21,13 +21,13 @@ allowed-tools: Read Write Bash(node *)
 ## CLI 命令
 
 ```bash
-node "<插件目录>/mcp/src/tools/voc-competitor-map-run.js" --brand "样板门店A" --city "南昌" --category "餐饮" --assistant-message-only
+node "<插件目录>/mcp/src/tools/voc-competitor-map-run.js" --brand "示例品牌A" --city "本地" --category "家居定制" --assistant-message-only
 ```
 
 带竞品名单:
 
 ```bash
-node "<插件目录>/mcp/src/tools/voc-competitor-map-run.js" --brand "样板门店A" --city "南昌" --category "烧烤" --competitors "竞品A,竞品B,竞品C" --assistant-message-only
+node "<插件目录>/mcp/src/tools/voc-competitor-map-run.js" --brand "示例品牌A" --city "本地" --category "家居定制" --competitors "竞品A,竞品B,竞品C" --assistant-message-only
 ```
 
 ## 输出结构
@@ -48,7 +48,7 @@ node "<插件目录>/mcp/src/tools/voc-competitor-map-run.js" --brand "样板门
 ## 典型用户话术
 
 ```text
-我是南昌做烧烤的,不知道竞品是谁,帮我先做一份竞品图谱。
+我是做家居定制的,不知道竞品是谁,帮我先做一份竞品图谱。
 ```
 
 ```text

+ 22 - 0
claude-code/claude-code-voc-intelligence/skills/voc-competitor-map/references/competitor-framework.md

@@ -0,0 +1,22 @@
+# 竞品图谱框架
+
+## 竞品不明确时的候选维度
+
+1. 同品类:抢同一类用户的直接选择。
+2. 同价格带:用户用来对比判断值不值。
+3. 同使用场景:在相同需求下被一起比较的选择。
+4. 内容声量竞品:在平台上更容易刷到的同类账号/品牌。
+5. 替代选择:用户在没下单时会转向的其它方案。
+
+## VOC 对照维度
+
+- 被夸:质量、口碑、价格、服务、体验、内容好看。
+- 被吐槽:贵、服务、质量不稳、到手落差、不知道怎么选。
+- 用户决策理由:为什么想要、为什么犹豫、为什么复购、为什么不推荐。
+- 内容打法:核心卖点、创始人、品牌氛围、攻略、避坑。
+- 我方机会:对方还没解决的顾虑、可承接的未满足需求。
+
+## 输出原则
+
+- 每个竞品类型都要落到“用户为什么选它、它没解决什么”。
+- 把差异写成可执行的错位竞争表达,而不是空泛对比。

+ 33 - 0
claude-code/claude-code-voc-intelligence/skills/voc-competitor-map/references/differentiation-patterns.md

@@ -0,0 +1,33 @@
+# 错位竞争表达模式
+
+## 常见错位机会
+
+### 对方声量大但体验有落差
+
+我方不只比声量,而是讲清楚:
+
+- 第一次接触怎么更省心。
+- 流程里每一步会发生什么。
+- 不适合的人怎么提前判断。
+
+### 对方内容好看但实际交付差
+
+我方要给:
+
+- 真实场景、真实交付。
+- 适合谁、不适合谁。
+- 无滤镜的产品/服务展示。
+
+### 对方便宜但用户怕踩雷
+
+我方要给:
+
+- 怎么判断质量和适配。
+- 价格之外的长期价值。
+- 售后和兜底机制。
+
+## 表达原则
+
+- 不贬低对手,把差异讲成“我们更适合哪类需求”。
+- 每个错位点都要有 VOC 证据支撑。
+- 落到一个用户能立刻理解的判断标准。

+ 0 - 25
claude-code/claude-code-voc-intelligence/skills/voc-competitor-map/references/restaurant-competitor-framework.md

@@ -1,25 +0,0 @@
-# 餐饮竞品图谱框架
-
-## 竞品不明确时的候选维度
-
-1. 同城同品类:抢同一批用户的直接选择。
-2. 同价格带:用户用来判断值不值。
-3. 同消费场景:聚餐、家庭餐、夜宵、工作餐、宴请。
-4. 内容声量竞品:平台上更容易被刷到的门店。
-5. 替代选择:用户不吃你时会去吃什么。
-
-## VOC 对比维度
-
-- 被夸点:味道、招牌、分量、价格、服务、环境、排队热闹、内容好看。
-- 被吐槽点:排队久、人均贵、服务慢、出品不稳、到店落差、不知道怎么点。
-- 用户决策理由:为什么想去、为什么犹豫、为什么复购、为什么不推荐。
-- 内容打法:拍菜品、拍老板、拍门店氛围、拍攻略、拍避坑。
-- 我方机会:避开对手强项,承接对手未解决的顾虑。
-
-## 输出原则
-
-- 不做空泛 SWOT。
-- 不只列门店名,要说为什么要看它。
-- 每个错位机会都要能转成经营动作或内容选题。
-- 没有真实竞品名单时,先给候选类型和补充问题。
-

+ 0 - 44
claude-code/claude-code-voc-intelligence/skills/voc-competitor-map/references/restaurant-differentiation-patterns.md

@@ -1,44 +0,0 @@
-# 餐饮错位竞争表达模板
-
-## 常见错位机会
-
-### 对手热闹但排队久
-
-我方不要只学排队热闹,要讲:
-
-- 几点来更舒服。
-- 等位时怎么先点。
-- 不适合排队的人怎么选择。
-
-### 对手内容好看但到店落差
-
-我方要讲:
-
-- 真实环境。
-- 适合谁、不适合谁。
-- 无滤镜菜品。
-
-### 对手招牌强但点单复杂
-
-我方要讲:
-
-- 第一次来怎么点。
-- 两人/四人/家庭怎么点。
-- 哪些菜不建议第一次点太多。
-
-### 对手价格低
-
-我方不要硬打便宜,要讲:
-
-- 贵在哪里。
-- 怎么点更值。
-- 适合什么场景。
-
-### 对手服务强
-
-我方要补:
-
-- 高峰期流程。
-- 加菜/催菜/打包找谁。
-- 门店提示牌和员工响应。
-

+ 8 - 8
claude-code/claude-code-voc-intelligence/skills/voc-content-plan/SKILL.md

@@ -1,6 +1,6 @@
 ---
 name: voc-content-plan
-description: Turn VOC issues, comments, trend evidence, issue-pool output, or single-problem deep dives into a 7-day content plan with short-video topics, opening hooks, speaking scripts, shot suggestions, comment prompts, and validation metrics. Use when the user asks 下周账号发什么、口播脚本、短视频选题、爆款视频、把用户问题变成内容、7天内容计划、餐饮老板怎么拍视频.
+description: Turn VOC issues, comments, trend evidence, issue-pool output, or single-problem deep dives into a 7-day content plan with short-video topics, opening hooks, speaking scripts, shot suggestions, comment prompts, and validation metrics. Use when the user asks 下周账号发什么、口播脚本、短视频选题、爆款视频、把用户问题变成内容、7天内容计划、老板怎么拍视频.
 allowed-tools: Read Write Bash(node *)
 ---
 
@@ -11,9 +11,9 @@ allowed-tools: Read Write Bash(node *)
 ## 必须执行
 
 - 当用户说“下周发什么、7 天选题、口播脚本、短视频脚本、爆款视频、账号内容、把问题变成内容”时,优先运行 `voc_content_plan_run`。
-- 需要判断内容结构、口播结构或餐饮拍摄角度时,优先参考 `references/restaurant-content-framework.md` 和 `references/restaurant-speaking-script-patterns.md`。
+- 需要判断内容结构、口播结构或拍摄角度时,优先参考 `references/content-framework.md` 和 `references/speaking-script-patterns.md`。
 - 口播脚本必须来自 VOC:用户真实吐槽、竞品评论差异、问题池 Top 问题或单点深挖动作。
-- 不要输出泛泛的爆款标题,不要只给“高级感、烟火气、探店感”这类空词。
+- 不要输出泛泛的爆款标题,不要只给“高级感、氛围感、设计感”这类空词。
 - 每条内容都要包含:用户问题、选题标题、前 3 秒钩子、口播脚本、镜头建议、评论区引导、验证指标。
 - 输出默认 7 天计划;用户明确要求 3 天、15 天时再调整。
 - 不覆盖创始人故事。用户要创始人故事时,说明这不属于 VOC 技能包主线,可另起品牌故事工作流。
@@ -22,19 +22,19 @@ allowed-tools: Read Write Bash(node *)
 ## CLI 命令
 
 ```bash
-node "<插件目录>/mcp/src/tools/voc-content-plan-run.js" --brand "样板门店A" --industry "本地生活餐饮" --issues "第一次来怕踩雷;觉得人均贵;怕排队久" --evidence-text "用户评论:第一次来不知道怎么点,怕踩雷;人均有点高,不知道套餐值不值。" --assistant-message-only
+node "<插件目录>/mcp/src/tools/voc-content-plan-run.js" --brand "示例品牌A" --industry "家居定制" --issues "第一次买怕踩雷;觉得价格贵;怕质量不稳定" --evidence-text "用户评论:第一次买不知道怎么选,怕踩雷;价格有点高,不知道方案值不值。" --assistant-message-only
 ```
 
 带报告文件:
 
 ```bash
-node "<插件目录>/mcp/src/tools/voc-content-plan-run.js" --brand "样板门店A" --report "outputs/douyin-trend-report.md" --assistant-message-only
+node "<插件目录>/mcp/src/tools/voc-content-plan-run.js" --brand "示例品牌A" --report "outputs/douyin-trend-report.md" --assistant-message-only
 ```
 
-茶饮新客转化示例:
+多问题示例:
 
 ```bash
-node "<插件目录>/mcp/src/tools/voc-content-plan-run.js" --brand "茶饮新客转化" --industry "茶饮" --issues "第一次来怎么点最稳;18-22 元贵在哪/值在哪;券后价和套餐怎么买最划算;茶底/甜度/配料怎么选;哪几款不容易踩雷;外卖到手怎么避免翻车;买一送一/团购规则怎么讲清楚" --evidence-text "小红书评论:波霸奶茶用的什么茶底?我要避雷!!下午喝的,晚上睁眼到天亮。抖音线索:9.9 新品、11.9 单人下午茶、21 元买一送一能触发注意,但还需要解释规则、口味和是否有坑。" --assistant-message-only
+node "<插件目录>/mcp/src/tools/voc-content-plan-run.js" --brand "示例品牌A" --industry "家居定制" --issues "第一次买怎么选最稳;贵在哪/值在哪;怎么对比才不踩雷;质量怎么判断;哪几种方案更适合;售后怎么兜底;优惠规则怎么讲清楚" --evidence-text "用户评论:第一次买不知道怎么选,怕踩雷;价格有点高,不确定值不值;担心质量和售后。" --assistant-message-only
 ```
 
 ## 输出结构
@@ -55,7 +55,7 @@ node "<插件目录>/mcp/src/tools/voc-content-plan-run.js" --brand "茶饮新
 ```
 
 ```text
-把“排队久、人均贵、第一次来怕踩雷”这些问题变成老板能拍的视频。
+把“第一次买怎么选、价格贵、怕踩雷”这些问题变成老板能拍的视频。
 ```
 
 ```text

+ 29 - 0
claude-code/claude-code-voc-intelligence/skills/voc-content-plan/references/content-framework.md

@@ -0,0 +1,29 @@
+# VOC 内容选题框架
+
+## 使用原则
+
+内容不从“我今天想讲什么”开始,而是从“用户真正在犹豫什么”开始。
+
+每条内容必须回应一个 VOC 问题,例如:
+
+- 怕踩雷:第一次接触怎么选不出错。
+- 嫌贵:贵在哪、值在哪、怎么判断划算。
+- 怕麻烦:流程是什么、要等多久、怎么安排。
+- 不会选:型号/方案/规格太多怎么选。
+- 担心服务:高峰期响应怎么样、稳不稳定。
+- 担心落差:适合谁、不适合谁。
+
+## 内容结构
+
+1. 用户问题:从评论、问题池、竞品吐槽里提取。
+2. 内容承诺:这条视频/笔记用来解决什么。
+3. 前 3 秒钩子:用用户原话或老板视角的反常识表达。
+4. 主体:把卖点翻译成“适合谁、解决什么、怎么判断”。
+5. 证据:真实案例、对比、用户原话。
+6. 结尾:引导评论区补充自己的情况,承接转化。
+
+## 验证指标
+
+- 评论区是否出现“我也担心这个”类共鸣。
+- 私信/咨询是否提到这条内容。
+- 是否降低了首次决策的犹豫。

+ 0 - 41
claude-code/claude-code-voc-intelligence/skills/voc-content-plan/references/restaurant-content-framework.md

@@ -1,41 +0,0 @@
-# 餐饮 VOC 内容选题框架
-
-## 使用原则
-
-内容不是从“今天想拍什么”开始,而是从“顾客正在犹豫什么”开始。
-
-每条内容必须回答一个 VOC 问题:
-
-- 怕踩雷:第一次来怎么点。
-- 嫌贵:为什么值、怎么点更稳。
-- 怕排队:什么时候来、等位怎么安排。
-- 不知道招牌:不同人群怎么选。
-- 担心服务:高峰期怎么减少不确定。
-- 担心落差:适合谁、不适合谁。
-
-## 结构
-
-1. 用户问题:从评论、问题池、竞品吐槽中提取。
-2. 内容承诺:这条视频帮用户解决什么。
-3. 前 3 秒钩子:用用户原话或老板反常识表达。
-4. 主体口播:先承认问题,再给具体方案。
-5. 镜头证据:菜品、菜单、门店流程、真实环境。
-6. 评论区引导:让用户继续暴露顾虑。
-7. 验证指标:看评论关键词是否变化。
-
-## 常用钩子
-
-- 第一次来别乱点,先按这个顺序。
-- 觉得我们人均不低,我直接讲贵在哪里。
-- 想吃但怕排队,先记住这几个时间。
-- 这道招牌菜不是所有人都适合点。
-- 先说缺点,再说适合什么人来。
-- 高峰期最容易不舒服的地方,我们直接讲清楚。
-
-## 禁止
-
-- 不要只写“烟火气”“高级感”“宝藏小店”。
-- 不要每条都夸自己。
-- 不要把创始人故事混进 VOC 内容计划。
-- 不要脱离用户问题写泛泛爆款脚本。
-

+ 0 - 34
claude-code/claude-code-voc-intelligence/skills/voc-content-plan/references/restaurant-speaking-script-patterns.md

@@ -1,34 +0,0 @@
-# 餐饮口播脚本结构
-
-## 30 秒结构
-
-1. 0-3 秒:用户问题钩子。
-2. 3-8 秒:承认顾虑,不急着自夸。
-3. 8-22 秒:给一个具体建议。
-4. 22-30 秒:评论区引导或到店动作。
-
-示例:
-
-```text
-第一次来别一上来就乱点。
-如果你怕点错、怕人均超预算,可以先按这个顺序来。
-先点招牌,再点一个下饭菜,最后加一个解腻的。
-你是两个人来还是四个人来?评论区告诉我,我给你配一版。
-```
-
-## 60 秒结构
-
-1. 用户原话。
-2. 老板解释真实原因。
-3. 给出方案。
-4. 展示门店证据。
-5. 引导用户继续提问。
-
-## 镜头搭配
-
-- 菜品问题:菜品近景、出餐过程、菜单价格、桌面组合。
-- 排队问题:门口等位、非高峰空桌、等位提示牌。
-- 价格问题:食材、分量、套餐、适合人数。
-- 服务问题:提示牌、动线、员工响应、收银/打包区。
-- 落差问题:无滤镜环境、真实高峰、适合谁不适合谁。
-

+ 31 - 0
claude-code/claude-code-voc-intelligence/skills/voc-content-plan/references/speaking-script-patterns.md

@@ -0,0 +1,31 @@
+# 口播脚本结构
+
+## 30 秒结构
+
+1. 0-3 秒:用用户问题做钩子。
+2. 3-8 秒:承接顾虑,不急着夸自己。
+3. 8-22 秒:给一个具体建议或判断标准。
+4. 22-30 秒:评论区引导,承接下一步动作。
+
+示例:
+
+```text
+第一次买,别一上来就比价格。
+如果你也担心选错、怕不适合,可以先按这个顺序看。
+先看适合谁、再看怎么判断质量、最后看售后怎么兜底。
+你是自己用还是送人?评论区告诉我,我帮你按情况给一个更具体的建议。
+```
+
+## 60 秒结构
+
+1. 0-3 秒:钩子,抛出真实顾虑。
+2. 3-15 秒:解释这个顾虑为什么常见,建立信任。
+3. 15-40 秒:给判断标准 + 一个真实案例或对比。
+4. 40-55 秒:把卖点翻译成用户听得懂的证明。
+5. 55-60 秒:评论区引导,承接转化。
+
+## 风格提醒
+
+- 少讲概念,多给可以照做的具体动作。
+- 老板视角:讲清楚这件事影响新客、复购还是口碑。
+- 没有真实证据时,标注为结构推演稿。

+ 4 - 4
claude-code/claude-code-voc-intelligence/skills/voc-issue-pool/SKILL.md

@@ -27,19 +27,19 @@ allowed-tools: Read Write Bash(node *)
 - When the user asks for a VOC report around business pain points, first build or request a clean evidence set, then run `voc_issue_pool_run`; only after that should a single top issue be sent to `voc_problem_deep_dive_run`.
 
 ```bash
-node "<插件目录>/mcp/src/tools/voc-issue-pool-run.js" --project "样板门店A" --industry "本地生活餐饮" --scenario "门店经营" --audience "到店顾客" --evidence "排队久,但是不知道值不值得等。,人均有点高,第一次来不知道怎么点不踩雷。,服务忙起来没人理。" --assistant-message-only
+node "<插件目录>/mcp/src/tools/voc-issue-pool-run.js" --project "示例品牌A" --industry "家居定制" --scenario "线上获客" --audience "意向用户" --evidence "第一次买不知道怎么选,怕踩雷。,价格有点高,不确定值不值。,咨询忙起来没人理。" --assistant-message-only
 ```
 
 带报告文件:
 
 ```bash
-node "<插件目录>/mcp/src/tools/voc-issue-pool-run.js" --project "样板门店A" --industry "本地生活餐饮" --report "outputs/douyin-trend-report.md" --assistant-message-only
+node "<插件目录>/mcp/src/tools/voc-issue-pool-run.js" --project "示例品牌A" --industry "家居定制" --report "outputs/douyin-trend-report.md" --assistant-message-only
 ```
 
 更新状态:
 
 ```bash
-node "<插件目录>/mcp/src/tools/voc-issue-pool-run.js" --project "样板门店A" --industry "本地生活餐饮" --resolved-issues "排队/等待" --assistant-message-only
+node "<插件目录>/mcp/src/tools/voc-issue-pool-run.js" --project "示例品牌A" --industry "家居定制" --resolved-issues "选择门槛/决策" --assistant-message-only
 ```
 
 ## 输出结构
@@ -77,5 +77,5 @@ node "<插件目录>/mcp/src/tools/voc-issue-pool-run.js" --project "样板门
 ```
 
 ```text
-排队问题已经在验证中,服务问题先暂缓,帮我更新一下问题池。
+选择问题已经在验证中,服务问题先暂缓,帮我更新一下问题池。
 ```

+ 5 - 5
claude-code/claude-code-voc-intelligence/skills/voc-problem-deep-dive/SKILL.md

@@ -38,19 +38,19 @@ allowed-tools: Read Write Bash(node *)
 - If live collection returns `needs_token`, `needs_recharge`, or `needs_valid_token`, repeat the tool's user-facing `assistantMessage` and do not replace it with a generic strategy suggestion.
 
 ```bash
-node "<插件目录>/mcp/src/tools/voc-problem-deep-dive-run.js" --issue "排队" --industry "本地生活餐饮" --scenario "门店经营" --audience "到店顾客" --assistant-message-only
+node "<插件目录>/mcp/src/tools/voc-problem-deep-dive-run.js" --issue "怎么选" --industry "家居定制" --scenario "线上获客" --audience "意向用户" --assistant-message-only
 ```
 
 带记忆的多轮迭代:
 
 ```bash
-node "<插件目录>/mcp/src/tools/voc-problem-deep-dive-run.js" --issue "排队" --industry "本地生活餐饮" --scenario "门店经营" --audience "到店顾客" --memory "outputs/voc-problem-memory.json" --feedback "老板不想做等位饮品,更想先改评论区回复和预点单" --blocked-actions "等位饮品" --preferred-actions "评论区回复,预点单" --assistant-message-only
+node "<插件目录>/mcp/src/tools/voc-problem-deep-dive-run.js" --issue "怎么选" --industry "家居定制" --scenario "线上获客" --audience "意向用户" --memory "outputs/voc-problem-memory.json" --feedback "老板不想做试用体验,更想先改评论区回复和案例展示" --blocked-actions "试用体验" --preferred-actions "评论区回复,案例展示" --assistant-message-only
 ```
 
 自然语言反馈也可以直接传入 `feedback`,工具会尝试自动提取偏好和屏蔽动作:
 
 ```bash
-node "<插件目录>/mcp/src/tools/voc-problem-deep-dive-run.js" --issue "排队" --project "样板门店A" --industry "本地生活餐饮" --scenario "门店经营" --audience "到店顾客" --feedback "这个店不想做等位饮品,更想先改评论区回复和预点单" --assistant-message-only
+node "<插件目录>/mcp/src/tools/voc-problem-deep-dive-run.js" --issue "怎么选" --project "示例品牌A" --industry "家居定制" --scenario "线上获客" --audience "意向用户" --feedback "这个品牌不想做试用体验,更想先改评论区回复和案例展示" --assistant-message-only
 ```
 
 如果用户反馈“这个有效”“这个无效”“跑了 7 天有效果/没效果”,要把对应动作传入 `validatedActions` 或 `rejectedActions`,也可以直接放进 `feedback`。工具会沉淀动作验证次数,后续排序会自动提高有效动作、降低无效动作,并说明“为什么优先推荐这些动作”。
@@ -74,11 +74,11 @@ node "<插件目录>/mcp/src/tools/voc-problem-deep-dive-run.js" --issue "排队
 ## 典型用户话术
 
 ```text
-这个“排队”问题继续深挖一下,老板能怎么解决?
+这个“怎么选”问题继续深挖一下,老板能怎么解决?
 ```
 
 ```text
-这条差评背后到底是什么问题,门店应该怎么改?
+这条差评背后到底是什么问题,品牌应该怎么改?
 ```
 
 ```text

+ 14 - 14
claude-code/claude-code-voc-intelligence/skills/voc-speaking-script/SKILL.md

@@ -27,11 +27,11 @@ VOC 问题 -> 7 天内容计划 -> 选择一条选题 -> 口播脚本共创 -> 
 
 ```bash
 node "<插件目录>/mcp/src/tools/voc-speaking-script-run.js" \
-  --brand "样板门店A" \
-  --industry "本地生活餐饮" \
-  --topic "第一次来怎么点不踩雷" \
-  --user-issue "第一次来怕点错" \
-  --evidence "第一次来不知道怎么点,怕踩雷" \
+  --brand "示例品牌A" \
+  --industry "家居定制" \
+  --topic "第一次买怎么选不踩雷" \
+  --user-issue "第一次买怕选错" \
+  --evidence "第一次买不知道怎么选,怕踩雷" \
   --assistant-message-only
 ```
 
@@ -39,10 +39,10 @@ node "<插件目录>/mcp/src/tools/voc-speaking-script-run.js" \
 
 ```bash
 node "<插件目录>/mcp/src/tools/voc-speaking-script-run.js" \
-  --brand "样板门店A" \
-  --topic "第一次来怎么点不踩雷" \
-  --user-issue "第一次来怕点错" \
-  --evidence "第一次来不知道怎么点,怕踩雷" \
+  --brand "示例品牌A" \
+  --topic "第一次买怎么选不踩雷" \
+  --user-issue "第一次买怕选错" \
+  --evidence "第一次买不知道怎么选,怕踩雷" \
   --feedback "开头更狠一点,老板视角,少讲概念,多给具体场景" \
   --assistant-message-only
 ```
@@ -51,10 +51,10 @@ node "<插件目录>/mcp/src/tools/voc-speaking-script-run.js" \
 
 ```bash
 node "<插件目录>/mcp/src/tools/voc-speaking-script-run.js" \
-  --brand "样板门店A" \
-  --topic "第一次来怎么点不踩雷" \
-  --user-issue "第一次来怕点错" \
-  --evidence "第一次来不知道怎么点,怕踩雷" \
+  --brand "示例品牌A" \
+  --topic "第一次买怎么选不踩雷" \
+  --user-issue "第一次买怕选错" \
+  --evidence "第一次买不知道怎么选,怕踩雷" \
   --feedback "定稿" \
   --finalize true \
   --assistant-message-only
@@ -75,7 +75,7 @@ node "<插件目录>/mcp/src/tools/voc-speaking-script-run.js" \
 ```
 
 ```text
-把“排队久”这个 VOC 问题写成一条 60 秒口播稿,要有 30 秒压缩版和提词器版。
+把“第一次买怎么选”这个 VOC 问题写成一条 60 秒口播稿,要有 30 秒压缩版和提词器版。
 ```
 
 ## 输出验收

+ 2 - 2
claude-code/claude-code-voc-intelligence/skills/xiaohongshu-trend-intelligence/SKILL.md

@@ -29,14 +29,14 @@ allowed-tools: Read Write Bash(node *)
 live 采集失败时,严禁做以下任何一件事:
 
 - 严禁退回/降级到联网搜索(web search)、`yt-dlp`、`ffmpeg`、手动让用户上传图片/视频,或任何“绕过 VOC 接口”的抓取方式。本技能包的 VOC 本地采集是唯一批准的真实数据入口。
-- 严禁输出“VOC 只支持餐饮/零售类目”“律师/某赛道不可用”“系统设计上有类目限制”这类结论。这是错误结论:任何关键词(律师、法律、医美、教育、专业服务等)都能采集,与类目无关。
+- 严禁输出“VOC 只支持某些类目”“律师/某赛道不可用”“系统设计上有类目限制”这类结论。这是错误结论:任何关键词(律师、法律、医美、教育、专业服务等)都能采集,与类目无关。
 - live 失败的真正原因只可能是这几类:token 无效或类型不对(需要 `r:` 开头的会话 token,而不是 `sk-` 开头的 AIGate API Key)、未开通或额度不足、上游接口抖动(5xx,需重试)。必须如实把工具返回的 `assistantMessage` 转述给用户,不要自行编造原因。
 - 只有在工具明确返回 `needs_keyword_fix` 时才允许调整关键词;返回 `needs_valid_token` / `needs_token` / `needs_recharge` 时不要换关键词,要转述充值/开通链接。
 
 English (same rules):
 
 - On live failure, NEVER fall back to web search, `yt-dlp`, `ffmpeg`, or asking the user to upload media. The local VOC tool is the only approved real-data path.
-- NEVER conclude that VOC is limited to restaurant/retail categories or that a vertical (e.g. lawyers) is unsupported. Any keyword works; this is never a category problem.
+- NEVER conclude that VOC is limited to certain categories or that a vertical (e.g. lawyers) is unsupported. Any keyword works; this is never a category problem.
 - The only real causes are: invalid/wrong-type token (need an `r:` session token, not an `sk-` AIGate key), not activated / no balance, or upstream 5xx jitter (retry). Relay the tool's `assistantMessage` verbatim instead of inventing a reason.
 - Only adjust keywords when the tool returns `needs_keyword_fix`. For `needs_valid_token` / `needs_token` / `needs_recharge`, do not change keywords — surface the payment/activation link.