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

更新小红书技能包与教程包

gangvy 4 месяцев назад
Родитель
Сommit
137fc929e7
87 измененных файлов с 23682 добавлено и 97 удалено
  1. 8 0
      demo/report-factory/html-v2-demo-report.html
  2. 30 0
      demo/xiaohongshu/audit/audit-report.md
  3. 43 0
      demo/xiaohongshu/audit/audit-result.json
  4. 8 0
      demo/xiaohongshu/chapter-insights/chapter-insights.html
  5. 683 0
      demo/xiaohongshu/chapter-insights/chapter-insights.json
  6. 267 0
      demo/xiaohongshu/chapter-insights/chapter-insights.md
  7. 105 0
      demo/xiaohongshu/comments-flat.jsonl
  8. 77 0
      demo/xiaohongshu/hypothesis-matrix/3.CollectionMatrix.md
  9. 419 0
      demo/xiaohongshu/hypothesis-matrix/collection-matrix.json
  10. 158 0
      demo/xiaohongshu/hypothesis/1.Hypothesis.md
  11. 485 0
      demo/xiaohongshu/hypothesis/hypothesis.json
  12. 39 0
      demo/xiaohongshu/keywords.template.md
  13. 71 0
      demo/xiaohongshu/matrix/3.CollectionMatrix.md
  14. 335 0
      demo/xiaohongshu/matrix/collection-matrix.json
  15. 123 0
      demo/xiaohongshu/mini-report.example.md
  16. 100 0
      demo/xiaohongshu/mini-report.template.md
  17. 6319 0
      demo/xiaohongshu/normalized/_merged.json
  18. 105 0
      demo/xiaohongshu/normalized/comments-flat.jsonl
  19. 37 0
      demo/xiaohongshu/normalized/normalizer-audit.json
  20. 8 0
      demo/xiaohongshu/platform-mini-report/platform-mini-report.html
  21. 390 0
      demo/xiaohongshu/platform-mini-report/platform-mini-report.json
  22. 145 0
      demo/xiaohongshu/platform-mini-report/platform-mini-report.md
  23. 2650 0
      demo/xiaohongshu/raw-comments.json
  24. 465 0
      demo/xiaohongshu/raw-notes.json
  25. 1 4
      dist/download-urls.json
  26. 91 3
      dist/install.js
  27. BIN
      dist/xiaohongshu-platform.zip
  28. 102 0
      docs/other/qiwe-platform-registration-flow.md
  29. 154 0
      docs/voc-skills-course-plan/01-skill-productization.md
  30. 265 0
      docs/voc-skills-course-plan/02-standard-report-workflow.md
  31. 206 0
      docs/voc-skills-course-plan/03-course-system.md
  32. 149 0
      docs/voc-skills-course-plan/04-skill-support-matrix.md
  33. 179 0
      docs/voc-skills-course-plan/05-execution-roadmap.md
  34. 657 0
      docs/voc-skills-course-plan/06-skill-gap-task-list.md
  35. 342 0
      docs/voc-skills-course-plan/07-openclaw-single-platform-course.md
  36. 109 0
      docs/voc-skills-course-plan/README.md
  37. 32 0
      docs/voc-skills-course-plan/examples/README.md
  38. 79 0
      docs/voc-skills-course-plan/examples/amazon-review-voc/README.md
  39. 74 0
      docs/voc-skills-course-plan/examples/douyin-content-voc/README.md
  40. 139 0
      docs/voc-skills-course-plan/examples/openclaw-single-platform-report/README.md
  41. 85 0
      docs/voc-skills-course-plan/examples/report-factory-demo/README.md
  42. 99 0
      docs/voc-skills-course-plan/examples/tiktok-instagram-trend/README.md
  43. 93 0
      docs/voc-skills-course-plan/examples/xiaohongshu-mini-voc/README.md
  44. 282 0
      docs/voc-skills-course-plan/openclaw-single-platform-voc-teaching-manual.md
  45. 157 0
      docs/voc-skills-course-plan/openclaw-voc-skill-map.md
  46. 155 0
      douyin/douyin-mini-voc/SKILL.md
  47. 420 0
      douyin/douyin-mini-voc/api-config.json
  48. 42 2
      scripts/deploy/deploy-to-openclaw.ps1
  49. 41 12
      scripts/deploy/install-all.js
  50. 40 14
      scripts/deploy/install-workshop.js
  51. 233 47
      scripts/deploy/package-and-upload.js
  52. 56 15
      scripts/deploy/upload-skills.js
  53. 364 0
      scripts/tools/chapter-insight-writer.js
  54. 459 0
      scripts/tools/collection-matrix-builder.js
  55. 286 0
      scripts/tools/hypothesis-generator.js
  56. 142 0
      scripts/tools/openclaw-tool-runner.js
  57. 528 0
      scripts/tools/platform-mini-report-generator.js
  58. 528 0
      scripts/tools/voc-data-normalizer.js
  59. 439 0
      scripts/tools/voc-report-auditor.js
  60. 290 0
      scripts/tools/voc-single-platform-report.js
  61. 91 0
      voc-report-factory/0.Intake.template.md
  62. 141 0
      voc-report-factory/1.Hypothesis.template.md
  63. 78 0
      voc-report-factory/2.ReportOutline.template.md
  64. 77 0
      voc-report-factory/3.CollectionMatrix.template.md
  65. 79 0
      voc-report-factory/4.CollectionExecutionSummary.template.md
  66. 71 0
      voc-report-factory/README.md
  67. 109 0
      voc-report-factory/delivery-readme.template.md
  68. 65 0
      voc-report-factory/html-v2/chapter-module-template.js
  69. 79 0
      voc-report-factory/html-v2/gen-report-template.js
  70. 226 0
      voc-report-factory/html-v2/report-components.js
  71. 397 0
      voc-report-factory/html-v2/report-renderer-template.js
  72. 124 0
      voc-report-factory/raw-schema.md
  73. 94 0
      voc-report-factory/report-quality-audit.md
  74. 73 0
      voc/voc-chapter-insight-writer/SKILL.md
  75. 112 0
      voc/voc-chapter-insight-writer/api-config.json
  76. 66 0
      voc/voc-data-normalizer/SKILL.md
  77. 107 0
      voc/voc-data-normalizer/api-config.json
  78. 67 0
      voc/voc-html-report-generator/SKILL.md
  79. 81 0
      voc/voc-html-report-generator/api-config.json
  80. 78 0
      voc/voc-platform-mini-report-generator/SKILL.md
  81. 130 0
      voc/voc-platform-mini-report-generator/api-config.json
  82. 70 0
      voc/voc-report-auditor/SKILL.md
  83. 105 0
      voc/voc-report-auditor/api-config.json
  84. 144 0
      voc/voc-single-platform-report/SKILL.md
  85. 257 0
      voc/voc-single-platform-report/api-config.json
  86. 143 0
      xiaohongshu/xiaohongshu-mini-voc/SKILL.md
  87. 230 0
      xiaohongshu/xiaohongshu-mini-voc/api-config.json

Разница между файлами не показана из-за своего большого размера
+ 8 - 0
demo/report-factory/html-v2-demo-report.html


+ 30 - 0
demo/xiaohongshu/audit/audit-report.md

@@ -0,0 +1,30 @@
+# VOC Report Audit Result
+
+- **Status**: pass
+- **Report**: E:\workspace\openclaw-voc-skill\demo\xiaohongshu\mini-report.example.md
+- **Merged**: E:\workspace\openclaw-voc-skill\demo\xiaohongshu\normalized\_merged.json
+- **Comments**: E:\workspace\openclaw-voc-skill\demo\xiaohongshu\normalized\comments-flat.jsonl
+- **GeneratedAt**: 2026-04-29T13:23:52.637Z
+
+## Summary
+
+| Metric | Value |
+|---|---:|
+| Fail | 0 |
+| Warn | 0 |
+| Pass checks | 8 |
+| Item count | 30 |
+| VOC count | 105 |
+| Platform count | 1 |
+| Keyword count | 3 |
+
+## Data Distribution
+
+- **Platforms**: xiaohongshu
+- **Keywords**: 儿童益生菌怎么选, 益生菌腹胀便秘, 冻干益生菌测评
+- **Batches**: P0, P1
+- **HypothesisTags**: H1, H3, H6, H2, H4, H7, H8, H5
+
+## Issues
+
+No issues found.

+ 43 - 0
demo/xiaohongshu/audit/audit-result.json

@@ -0,0 +1,43 @@
+{
+  "status": "pass",
+  "generatedAt": "2026-04-29T13:23:52.637Z",
+  "inputs": {
+    "report": "E:\\workspace\\openclaw-voc-skill\\demo\\xiaohongshu\\mini-report.example.md",
+    "merged": "E:\\workspace\\openclaw-voc-skill\\demo\\xiaohongshu\\normalized\\_merged.json",
+    "comments": "E:\\workspace\\openclaw-voc-skill\\demo\\xiaohongshu\\normalized\\comments-flat.jsonl",
+    "matrix": "E:\\workspace\\openclaw-voc-skill\\demo\\xiaohongshu\\keywords.template.md"
+  },
+  "summary": {
+    "fail": 0,
+    "warn": 0,
+    "passChecks": 8
+  },
+  "data": {
+    "itemCount": 30,
+    "vocCount": 105,
+    "rawSampleCount": 135,
+    "platforms": [
+      "xiaohongshu"
+    ],
+    "keywords": [
+      "儿童益生菌怎么选",
+      "益生菌腹胀便秘",
+      "冻干益生菌测评"
+    ],
+    "batches": [
+      "P0",
+      "P1"
+    ],
+    "hypothesisTags": [
+      "H1",
+      "H3",
+      "H6",
+      "H2",
+      "H4",
+      "H7",
+      "H8",
+      "H5"
+    ]
+  },
+  "issues": []
+}

Разница между файлами не показана из-за своего большого размера
+ 8 - 0
demo/xiaohongshu/chapter-insights/chapter-insights.html


+ 683 - 0
demo/xiaohongshu/chapter-insights/chapter-insights.json

@@ -0,0 +1,683 @@
+{
+  "metadata": {
+    "project": "xiaohongshu-course-demo",
+    "category": "冻干益生菌",
+    "version": "light",
+    "generatedAt": "2026-04-29T14:07:42.836Z",
+    "platforms": [
+      "xiaohongshu"
+    ],
+    "keywords": [
+      "儿童益生菌怎么选",
+      "益生菌腹胀便秘",
+      "冻干益生菌测评"
+    ],
+    "batches": [
+      "P0",
+      "P1"
+    ],
+    "hypothesisTags": [
+      "H1",
+      "H3",
+      "H6",
+      "H2",
+      "H4",
+      "H5",
+      "H7",
+      "H8"
+    ],
+    "commentCount": 105,
+    "itemCount": 30
+  },
+  "chapters": [
+    {
+      "id": "Ch1",
+      "title": "结论先行",
+      "hypothesisTags": [
+        "H1",
+        "H2",
+        "H3",
+        "H4",
+        "H5",
+        "H6",
+        "H7",
+        "H8"
+      ],
+      "focus": "回答核心决策问题",
+      "evidenceCount": 105,
+      "uniqueEvidenceCount": 5,
+      "topThemes": [
+        {
+          "label": "反馈",
+          "count": 14
+        },
+        {
+          "label": "竞品",
+          "count": 14
+        },
+        {
+          "label": "信任",
+          "count": 14
+        },
+        {
+          "label": "场景",
+          "count": 13
+        },
+        {
+          "label": "价格",
+          "count": 13
+        },
+        {
+          "label": "决策",
+          "count": 13
+        }
+      ],
+      "topKeywords": [
+        {
+          "label": "儿童益生菌怎么选",
+          "count": 40
+        },
+        {
+          "label": "益生菌腹胀便秘",
+          "count": 35
+        },
+        {
+          "label": "冻干益生菌测评",
+          "count": 30
+        }
+      ],
+      "conclusion": "当前 105 条可追溯 VOC 显示,冻干益生菌 在「结论先行」中最稳定的信号集中在 反馈(14)、竞品(14)、信任(14);主要由 儿童益生菌怎么选、益生菌腹胀便秘、冻干益生菌测评 等关键词触发。",
+      "evidence": [
+        {
+          "id": "xhs_comment_xhs_demo_c_082",
+          "platform": "xiaohongshu",
+          "keyword": "冻干益生菌测评",
+          "batch": "P1",
+          "hypothesisTags": [
+            "H5",
+            "H7"
+          ],
+          "text": "每天成本超过8块我会犹豫,除非证据很清楚。",
+          "author": "配料表先行",
+          "likeCount": 97,
+          "replyCount": 6,
+          "url": "https://example.com/xhs/demo/xhs_demo_023",
+          "parentId": "xhs_demo_023",
+          "commentId": "xhs_demo_c_082",
+          "theme": "价格",
+          "source": "xiaohongshu / 冻干益生菌测评 / P1 / xhs_demo_c_082"
+        },
+        {
+          "id": "xhs_comment_xhs_demo_c_013",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H3",
+            "H7",
+            "H4"
+          ],
+          "text": "吃了三天没明显变化,但一周后排便时间稳定了一点。",
+          "author": "打工人小周",
+          "likeCount": 94,
+          "replyCount": 7,
+          "url": "https://example.com/xhs/demo/xhs_demo_004",
+          "parentId": "xhs_demo_004",
+          "commentId": "xhs_demo_c_013",
+          "theme": "反馈",
+          "source": "xiaohongshu / 儿童益生菌怎么选 / P0 / xhs_demo_c_013"
+        },
+        {
+          "id": "xhs_comment_xhs_demo_c_041",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H1",
+            "H2",
+            "H4",
+            "H3"
+          ],
+          "text": "详情页如果有适用人群表格,我会更容易判断。",
+          "author": "小满妈妈",
+          "likeCount": 98,
+          "replyCount": 3,
+          "url": "https://example.com/xhs/demo/xhs_demo_011",
+          "parentId": "xhs_demo_011",
+          "commentId": "xhs_demo_c_041",
+          "theme": "决策",
+          "source": "xiaohongshu / 益生菌腹胀便秘 / P0 / xhs_demo_c_041"
+        },
+        {
+          "id": "xhs_comment_xhs_demo_c_068",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H3",
+            "H4",
+            "H8"
+          ],
+          "text": "我会先看菌株编号和配料表,客服讲不清楚就不下单。",
+          "author": "胃肠敏感星人",
+          "likeCount": 95,
+          "replyCount": 4,
+          "url": "https://example.com/xhs/demo/xhs_demo_018",
+          "parentId": "xhs_demo_018",
+          "commentId": "xhs_demo_c_068",
+          "theme": "决策",
+          "source": "xiaohongshu / 益生菌腹胀便秘 / P0 / xhs_demo_c_068"
+        },
+        {
+          "id": "xhs_comment_xhs_demo_c_026",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H2",
+            "H3",
+            "H7",
+            "H8"
+          ],
+          "text": "我喜欢7天观察卡这种内容,不像广告。",
+          "author": "不想踩雷",
+          "likeCount": 89,
+          "replyCount": 6,
+          "url": "https://example.com/xhs/demo/xhs_demo_007",
+          "parentId": "xhs_demo_007",
+          "commentId": "xhs_demo_c_026",
+          "theme": "话术",
+          "source": "xiaohongshu / 儿童益生菌怎么选 / P0 / xhs_demo_c_026"
+        }
+      ],
+      "explanation": "本章对应 H1 品类机会、H2 用户需求、H3 产品缺口、H4 价格认知、H5 渠道内容、H6 竞品策略、H7 定位表达、H8 增长行动。证据来自 xiaohongshu 105,因此适合写成“当前样本支持的阶段性判断”,不应外推为全市场结论。",
+      "action": "保留本章结论作为报告开头判断,并在后续章节用证据卡展开。",
+      "warnings": []
+    },
+    {
+      "id": "Ch2",
+      "title": "用户声音",
+      "hypothesisTags": [
+        "H2",
+        "H3"
+      ],
+      "focus": "呈现痛点、场景、需求结构",
+      "evidenceCount": 76,
+      "uniqueEvidenceCount": 5,
+      "topThemes": [
+        {
+          "label": "场景",
+          "count": 13
+        },
+        {
+          "label": "决策",
+          "count": 13
+        },
+        {
+          "label": "反馈",
+          "count": 10
+        },
+        {
+          "label": "竞品",
+          "count": 9
+        },
+        {
+          "label": "信任",
+          "count": 9
+        },
+        {
+          "label": "话术",
+          "count": 8
+        }
+      ],
+      "topKeywords": [
+        {
+          "label": "儿童益生菌怎么选",
+          "count": 30
+        },
+        {
+          "label": "益生菌腹胀便秘",
+          "count": 26
+        },
+        {
+          "label": "冻干益生菌测评",
+          "count": 20
+        }
+      ],
+      "conclusion": "当前 76 条可追溯 VOC 显示,冻干益生菌 在「用户声音」中最稳定的信号集中在 场景(13)、决策(13)、反馈(10);主要由 儿童益生菌怎么选、益生菌腹胀便秘、冻干益生菌测评 等关键词触发。",
+      "evidence": [
+        {
+          "id": "xhs_comment_xhs_demo_c_013",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H3",
+            "H7",
+            "H4"
+          ],
+          "text": "吃了三天没明显变化,但一周后排便时间稳定了一点。",
+          "author": "打工人小周",
+          "likeCount": 94,
+          "replyCount": 7,
+          "url": "https://example.com/xhs/demo/xhs_demo_004",
+          "parentId": "xhs_demo_004",
+          "commentId": "xhs_demo_c_013",
+          "theme": "反馈",
+          "source": "xiaohongshu / 儿童益生菌怎么选 / P0 / xhs_demo_c_013"
+        },
+        {
+          "id": "xhs_comment_xhs_demo_c_041",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H1",
+            "H2",
+            "H4",
+            "H3"
+          ],
+          "text": "详情页如果有适用人群表格,我会更容易判断。",
+          "author": "小满妈妈",
+          "likeCount": 98,
+          "replyCount": 3,
+          "url": "https://example.com/xhs/demo/xhs_demo_011",
+          "parentId": "xhs_demo_011",
+          "commentId": "xhs_demo_c_041",
+          "theme": "决策",
+          "source": "xiaohongshu / 益生菌腹胀便秘 / P0 / xhs_demo_c_041"
+        },
+        {
+          "id": "xhs_comment_xhs_demo_c_068",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H3",
+            "H4",
+            "H8"
+          ],
+          "text": "我会先看菌株编号和配料表,客服讲不清楚就不下单。",
+          "author": "胃肠敏感星人",
+          "likeCount": 95,
+          "replyCount": 4,
+          "url": "https://example.com/xhs/demo/xhs_demo_018",
+          "parentId": "xhs_demo_018",
+          "commentId": "xhs_demo_c_068",
+          "theme": "决策",
+          "source": "xiaohongshu / 益生菌腹胀便秘 / P0 / xhs_demo_c_068"
+        },
+        {
+          "id": "xhs_comment_xhs_demo_c_026",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H2",
+            "H3",
+            "H7",
+            "H8"
+          ],
+          "text": "我喜欢7天观察卡这种内容,不像广告。",
+          "author": "不想踩雷",
+          "likeCount": 89,
+          "replyCount": 6,
+          "url": "https://example.com/xhs/demo/xhs_demo_007",
+          "parentId": "xhs_demo_007",
+          "commentId": "xhs_demo_c_026",
+          "theme": "话术",
+          "source": "xiaohongshu / 儿童益生菌怎么选 / P0 / xhs_demo_c_026"
+        },
+        {
+          "id": "xhs_comment_xhs_demo_c_053",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H1",
+            "H3",
+            "H4",
+            "H6"
+          ],
+          "text": "过敏原、糖醇、香精这些最好直接标出来。",
+          "author": "打工人小周",
+          "likeCount": 86,
+          "replyCount": 7,
+          "url": "https://example.com/xhs/demo/xhs_demo_014",
+          "parentId": "xhs_demo_014",
+          "commentId": "xhs_demo_c_053",
+          "theme": "信任",
+          "source": "xiaohongshu / 益生菌腹胀便秘 / P0 / xhs_demo_c_053"
+        }
+      ],
+      "explanation": "本章对应 H2 用户需求、H3 产品缺口。证据来自 xiaohongshu 76,因此适合写成“当前样本支持的阶段性判断”,不应外推为全市场结论。",
+      "action": "优先把高频痛点、场景和决策标准转成 VOC 证据卡,进入报告正文。",
+      "warnings": []
+    },
+    {
+      "id": "Ch3",
+      "title": "竞品/平台发现",
+      "hypothesisTags": [
+        "H5",
+        "H6",
+        "H7"
+      ],
+      "focus": "解释平台内容、竞品策略和可用话术",
+      "evidenceCount": 83,
+      "uniqueEvidenceCount": 5,
+      "topThemes": [
+        {
+          "label": "竞品",
+          "count": 14
+        },
+        {
+          "label": "信任",
+          "count": 14
+        },
+        {
+          "label": "价格",
+          "count": 13
+        },
+        {
+          "label": "反馈",
+          "count": 10
+        },
+        {
+          "label": "场景",
+          "count": 9
+        },
+        {
+          "label": "决策",
+          "count": 9
+        }
+      ],
+      "topKeywords": [
+        {
+          "label": "儿童益生菌怎么选",
+          "count": 33
+        },
+        {
+          "label": "冻干益生菌测评",
+          "count": 26
+        },
+        {
+          "label": "益生菌腹胀便秘",
+          "count": 24
+        }
+      ],
+      "conclusion": "当前 83 条可追溯 VOC 显示,冻干益生菌 在「竞品/平台发现」中最稳定的信号集中在 竞品(14)、信任(14)、价格(13);主要由 儿童益生菌怎么选、冻干益生菌测评、益生菌腹胀便秘 等关键词触发。",
+      "evidence": [
+        {
+          "id": "xhs_comment_xhs_demo_c_082",
+          "platform": "xiaohongshu",
+          "keyword": "冻干益生菌测评",
+          "batch": "P1",
+          "hypothesisTags": [
+            "H5",
+            "H7"
+          ],
+          "text": "每天成本超过8块我会犹豫,除非证据很清楚。",
+          "author": "配料表先行",
+          "likeCount": 97,
+          "replyCount": 6,
+          "url": "https://example.com/xhs/demo/xhs_demo_023",
+          "parentId": "xhs_demo_023",
+          "commentId": "xhs_demo_c_082",
+          "theme": "价格",
+          "source": "xiaohongshu / 冻干益生菌测评 / P1 / xhs_demo_c_082"
+        },
+        {
+          "id": "xhs_comment_xhs_demo_c_013",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H3",
+            "H7",
+            "H4"
+          ],
+          "text": "吃了三天没明显变化,但一周后排便时间稳定了一点。",
+          "author": "打工人小周",
+          "likeCount": 94,
+          "replyCount": 7,
+          "url": "https://example.com/xhs/demo/xhs_demo_004",
+          "parentId": "xhs_demo_004",
+          "commentId": "xhs_demo_c_013",
+          "theme": "反馈",
+          "source": "xiaohongshu / 儿童益生菌怎么选 / P0 / xhs_demo_c_013"
+        },
+        {
+          "id": "xhs_comment_xhs_demo_c_026",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H2",
+            "H3",
+            "H7",
+            "H8"
+          ],
+          "text": "我喜欢7天观察卡这种内容,不像广告。",
+          "author": "不想踩雷",
+          "likeCount": 89,
+          "replyCount": 6,
+          "url": "https://example.com/xhs/demo/xhs_demo_007",
+          "parentId": "xhs_demo_007",
+          "commentId": "xhs_demo_c_026",
+          "theme": "话术",
+          "source": "xiaohongshu / 儿童益生菌怎么选 / P0 / xhs_demo_c_026"
+        },
+        {
+          "id": "xhs_comment_xhs_demo_c_053",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H1",
+            "H3",
+            "H4",
+            "H6"
+          ],
+          "text": "过敏原、糖醇、香精这些最好直接标出来。",
+          "author": "打工人小周",
+          "likeCount": 86,
+          "replyCount": 7,
+          "url": "https://example.com/xhs/demo/xhs_demo_014",
+          "parentId": "xhs_demo_014",
+          "commentId": "xhs_demo_c_053",
+          "theme": "信任",
+          "source": "xiaohongshu / 益生菌腹胀便秘 / P0 / xhs_demo_c_053"
+        },
+        {
+          "id": "xhs_comment_xhs_demo_c_027",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H2",
+            "H3",
+            "H7",
+            "H1"
+          ],
+          "text": "腹胀的时候孩子会闹,但我又不敢随便换太多产品。",
+          "author": "带娃观察员",
+          "likeCount": 96,
+          "replyCount": 1,
+          "url": "https://example.com/xhs/demo/xhs_demo_007",
+          "parentId": "xhs_demo_007",
+          "commentId": "xhs_demo_c_027",
+          "theme": "痛点",
+          "source": "xiaohongshu / 儿童益生菌怎么选 / P0 / xhs_demo_c_027"
+        }
+      ],
+      "explanation": "本章对应 H5 渠道内容、H6 竞品策略、H7 定位表达。证据来自 xiaohongshu 83,因此适合写成“当前样本支持的阶段性判断”,不应外推为全市场结论。",
+      "action": "把高赞评论中的用户原话转成内容标题、详情页 FAQ 或话术 AB 测试。",
+      "warnings": []
+    },
+    {
+      "id": "Ch4",
+      "title": "行动建议",
+      "hypothesisTags": [
+        "H8"
+      ],
+      "focus": "输出下一步 P0/P1/P2 动作和验证指标",
+      "evidenceCount": 35,
+      "uniqueEvidenceCount": 5,
+      "topThemes": [
+        {
+          "label": "话术",
+          "count": 12
+        },
+        {
+          "label": "场景",
+          "count": 4
+        },
+        {
+          "label": "价格",
+          "count": 4
+        },
+        {
+          "label": "信任",
+          "count": 4
+        },
+        {
+          "label": "反馈",
+          "count": 3
+        },
+        {
+          "label": "竞品",
+          "count": 3
+        }
+      ],
+      "topKeywords": [
+        {
+          "label": "儿童益生菌怎么选",
+          "count": 14
+        },
+        {
+          "label": "冻干益生菌测评",
+          "count": 11
+        },
+        {
+          "label": "益生菌腹胀便秘",
+          "count": 10
+        }
+      ],
+      "conclusion": "当前 35 条可追溯 VOC 显示,冻干益生菌 在「行动建议」中最稳定的信号集中在 话术(12)、场景(4)、价格(4);主要由 儿童益生菌怎么选、冻干益生菌测评、益生菌腹胀便秘 等关键词触发。",
+      "evidence": [
+        {
+          "id": "xhs_comment_xhs_demo_c_068",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H3",
+            "H4",
+            "H8"
+          ],
+          "text": "我会先看菌株编号和配料表,客服讲不清楚就不下单。",
+          "author": "胃肠敏感星人",
+          "likeCount": 95,
+          "replyCount": 4,
+          "url": "https://example.com/xhs/demo/xhs_demo_018",
+          "parentId": "xhs_demo_018",
+          "commentId": "xhs_demo_c_068",
+          "theme": "决策",
+          "source": "xiaohongshu / 益生菌腹胀便秘 / P0 / xhs_demo_c_068"
+        },
+        {
+          "id": "xhs_comment_xhs_demo_c_026",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H2",
+            "H3",
+            "H7",
+            "H8"
+          ],
+          "text": "我喜欢7天观察卡这种内容,不像广告。",
+          "author": "不想踩雷",
+          "likeCount": 89,
+          "replyCount": 6,
+          "url": "https://example.com/xhs/demo/xhs_demo_007",
+          "parentId": "xhs_demo_007",
+          "commentId": "xhs_demo_c_026",
+          "theme": "话术",
+          "source": "xiaohongshu / 儿童益生菌怎么选 / P0 / xhs_demo_c_026"
+        },
+        {
+          "id": "xhs_comment_xhs_demo_c_081",
+          "platform": "xiaohongshu",
+          "keyword": "冻干益生菌测评",
+          "batch": "P1",
+          "hypothesisTags": [
+            "H3",
+            "H6",
+            "H8"
+          ],
+          "text": "详情页少一点专利词,多一点家庭使用说明。",
+          "author": "小满妈妈",
+          "likeCount": 90,
+          "replyCount": 3,
+          "url": "https://example.com/xhs/demo/xhs_demo_022",
+          "parentId": "xhs_demo_022",
+          "commentId": "xhs_demo_c_081",
+          "theme": "话术",
+          "source": "xiaohongshu / 冻干益生菌测评 / P1 / xhs_demo_c_081"
+        },
+        {
+          "id": "xhs_comment_xhs_demo_c_039",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H3",
+            "H8",
+            "H4"
+          ],
+          "text": "味道淡孩子能接受,坚持下来比参数更重要。",
+          "author": "囤货前先问",
+          "likeCount": 84,
+          "replyCount": 5,
+          "url": "https://example.com/xhs/demo/xhs_demo_010",
+          "parentId": "xhs_demo_010",
+          "commentId": "xhs_demo_c_039",
+          "theme": "反馈",
+          "source": "xiaohongshu / 儿童益生菌怎么选 / P0 / xhs_demo_c_039"
+        },
+        {
+          "id": "xhs_comment_xhs_demo_c_040",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H3",
+            "H8",
+            "H5"
+          ],
+          "text": "进口牌子贵但说明详细,国产牌子客服回复快。",
+          "author": "真实反馈bot",
+          "likeCount": 91,
+          "replyCount": 0,
+          "url": "https://example.com/xhs/demo/xhs_demo_010",
+          "parentId": "xhs_demo_010",
+          "commentId": "xhs_demo_c_040",
+          "theme": "竞品",
+          "source": "xiaohongshu / 儿童益生菌怎么选 / P0 / xhs_demo_c_040"
+        }
+      ],
+      "explanation": "本章对应 H8 增长行动。证据来自 xiaohongshu 35,因此适合写成“当前样本支持的阶段性判断”,不应外推为全市场结论。",
+      "action": "把证据最高的 3 个用户表达转成 P0/P1/P2 行动,并为每条行动指定验证指标。",
+      "warnings": []
+    }
+  ],
+  "audit": {
+    "generatedAt": "2026-04-29T14:07:42.836Z",
+    "minEvidence": 3,
+    "chapterCount": 4,
+    "warningCount": 0,
+    "unsupportedConclusionCount": 0,
+    "totalEvidenceCards": 20
+  }
+}

+ 267 - 0
demo/xiaohongshu/chapter-insights/chapter-insights.md

@@ -0,0 +1,267 @@
+# Chapter Insight Draft
+
+| 字段 | 内容 |
+|---|---|
+| 项目 | xiaohongshu-course-demo |
+| 品类 | 冻干益生菌 |
+| 版本 | light |
+| 平台 | xiaohongshu |
+| 关键词 | 儿童益生菌怎么选、益生菌腹胀便秘、冻干益生菌测评 |
+| VOC 数 | 105 |
+| 生成时间 | 2026-04-29T14:07:42.836Z |
+
+## 0. 审计摘要
+
+- **章节数**:4
+- **证据卡数**:20
+- **警告数**:0
+- **无证据结论数**:0
+
+## Ch1. 结论先行
+
+- **章节目标**:回答核心决策问题
+- **对应假设**:H1, H2, H3, H4, H5, H6, H7, H8
+- **证据量**:105 条 VOC / 5 条证据卡
+- **章节结论**:当前 105 条可追溯 VOC 显示,冻干益生菌 在「结论先行」中最稳定的信号集中在 反馈(14)、竞品(14)、信任(14);主要由 儿童益生菌怎么选、益生菌腹胀便秘、冻干益生菌测评 等关键词触发。
+- **业务解释**:本章对应 H1 品类机会、H2 用户需求、H3 产品缺口、H4 价格认知、H5 渠道内容、H6 竞品策略、H7 定位表达、H8 增长行动。证据来自 xiaohongshu 105,因此适合写成“当前样本支持的阶段性判断”,不应外推为全市场结论。
+- **行动建议**:保留本章结论作为报告开头判断,并在后续章节用证据卡展开。
+
+### 高频主题
+
+| 主题 | 频次 |
+|---|---:|
+| 反馈 | 14 |
+| 竞品 | 14 |
+| 信任 | 14 |
+| 场景 | 13 |
+| 价格 | 13 |
+| 决策 | 13 |
+
+### VOC 证据卡
+
+### 证据 1:每天成本超过8块我会犹豫,除非证据很清楚。
+
+- **来源**:xiaohongshu / 冻干益生菌测评 / P1 / xhs_demo_c_082
+- **原声**:“每天成本超过8块我会犹豫,除非证据很清楚。”
+- **标签**:H5, H7
+- **互动**:97 赞 / 6 回复
+- **解释**:这条原声可支撑本章关于「价格」的阶段性判断。
+
+### 证据 2:吃了三天没明显变化,但一周后排便时间稳定了一点。
+
+- **来源**:xiaohongshu / 儿童益生菌怎么选 / P0 / xhs_demo_c_013
+- **原声**:“吃了三天没明显变化,但一周后排便时间稳定了一点。”
+- **标签**:H3, H7, H4
+- **互动**:94 赞 / 7 回复
+- **解释**:这条原声可支撑本章关于「反馈」的阶段性判断。
+
+### 证据 3:详情页如果有适用人群表格,我会更容易判断。
+
+- **来源**:xiaohongshu / 益生菌腹胀便秘 / P0 / xhs_demo_c_041
+- **原声**:“详情页如果有适用人群表格,我会更容易判断。”
+- **标签**:H1, H2, H4, H3
+- **互动**:98 赞 / 3 回复
+- **解释**:这条原声可支撑本章关于「决策」的阶段性判断。
+
+### 证据 4:我会先看菌株编号和配料表,客服讲不清楚就不下单。
+
+- **来源**:xiaohongshu / 益生菌腹胀便秘 / P0 / xhs_demo_c_068
+- **原声**:“我会先看菌株编号和配料表,客服讲不清楚就不下单。”
+- **标签**:H3, H4, H8
+- **互动**:95 赞 / 4 回复
+- **解释**:这条原声可支撑本章关于「决策」的阶段性判断。
+
+### 证据 5:我喜欢7天观察卡这种内容,不像广告。
+
+- **来源**:xiaohongshu / 儿童益生菌怎么选 / P0 / xhs_demo_c_026
+- **原声**:“我喜欢7天观察卡这种内容,不像广告。”
+- **标签**:H2, H3, H7, H8
+- **互动**:89 赞 / 6 回复
+- **解释**:这条原声可支撑本章关于「话术」的阶段性判断。
+
+## Ch2. 用户声音
+
+- **章节目标**:呈现痛点、场景、需求结构
+- **对应假设**:H2, H3
+- **证据量**:76 条 VOC / 5 条证据卡
+- **章节结论**:当前 76 条可追溯 VOC 显示,冻干益生菌 在「用户声音」中最稳定的信号集中在 场景(13)、决策(13)、反馈(10);主要由 儿童益生菌怎么选、益生菌腹胀便秘、冻干益生菌测评 等关键词触发。
+- **业务解释**:本章对应 H2 用户需求、H3 产品缺口。证据来自 xiaohongshu 76,因此适合写成“当前样本支持的阶段性判断”,不应外推为全市场结论。
+- **行动建议**:优先把高频痛点、场景和决策标准转成 VOC 证据卡,进入报告正文。
+
+### 高频主题
+
+| 主题 | 频次 |
+|---|---:|
+| 场景 | 13 |
+| 决策 | 13 |
+| 反馈 | 10 |
+| 竞品 | 9 |
+| 信任 | 9 |
+| 话术 | 8 |
+
+### VOC 证据卡
+
+### 证据 1:吃了三天没明显变化,但一周后排便时间稳定了一点。
+
+- **来源**:xiaohongshu / 儿童益生菌怎么选 / P0 / xhs_demo_c_013
+- **原声**:“吃了三天没明显变化,但一周后排便时间稳定了一点。”
+- **标签**:H3, H7, H4
+- **互动**:94 赞 / 7 回复
+- **解释**:这条原声可支撑本章关于「反馈」的阶段性判断。
+
+### 证据 2:详情页如果有适用人群表格,我会更容易判断。
+
+- **来源**:xiaohongshu / 益生菌腹胀便秘 / P0 / xhs_demo_c_041
+- **原声**:“详情页如果有适用人群表格,我会更容易判断。”
+- **标签**:H1, H2, H4, H3
+- **互动**:98 赞 / 3 回复
+- **解释**:这条原声可支撑本章关于「决策」的阶段性判断。
+
+### 证据 3:我会先看菌株编号和配料表,客服讲不清楚就不下单。
+
+- **来源**:xiaohongshu / 益生菌腹胀便秘 / P0 / xhs_demo_c_068
+- **原声**:“我会先看菌株编号和配料表,客服讲不清楚就不下单。”
+- **标签**:H3, H4, H8
+- **互动**:95 赞 / 4 回复
+- **解释**:这条原声可支撑本章关于「决策」的阶段性判断。
+
+### 证据 4:我喜欢7天观察卡这种内容,不像广告。
+
+- **来源**:xiaohongshu / 儿童益生菌怎么选 / P0 / xhs_demo_c_026
+- **原声**:“我喜欢7天观察卡这种内容,不像广告。”
+- **标签**:H2, H3, H7, H8
+- **互动**:89 赞 / 6 回复
+- **解释**:这条原声可支撑本章关于「话术」的阶段性判断。
+
+### 证据 5:过敏原、糖醇、香精这些最好直接标出来。
+
+- **来源**:xiaohongshu / 益生菌腹胀便秘 / P0 / xhs_demo_c_053
+- **原声**:“过敏原、糖醇、香精这些最好直接标出来。”
+- **标签**:H1, H3, H4, H6
+- **互动**:86 赞 / 7 回复
+- **解释**:这条原声可支撑本章关于「信任」的阶段性判断。
+
+## Ch3. 竞品/平台发现
+
+- **章节目标**:解释平台内容、竞品策略和可用话术
+- **对应假设**:H5, H6, H7
+- **证据量**:83 条 VOC / 5 条证据卡
+- **章节结论**:当前 83 条可追溯 VOC 显示,冻干益生菌 在「竞品/平台发现」中最稳定的信号集中在 竞品(14)、信任(14)、价格(13);主要由 儿童益生菌怎么选、冻干益生菌测评、益生菌腹胀便秘 等关键词触发。
+- **业务解释**:本章对应 H5 渠道内容、H6 竞品策略、H7 定位表达。证据来自 xiaohongshu 83,因此适合写成“当前样本支持的阶段性判断”,不应外推为全市场结论。
+- **行动建议**:把高赞评论中的用户原话转成内容标题、详情页 FAQ 或话术 AB 测试。
+
+### 高频主题
+
+| 主题 | 频次 |
+|---|---:|
+| 竞品 | 14 |
+| 信任 | 14 |
+| 价格 | 13 |
+| 反馈 | 10 |
+| 场景 | 9 |
+| 决策 | 9 |
+
+### VOC 证据卡
+
+### 证据 1:每天成本超过8块我会犹豫,除非证据很清楚。
+
+- **来源**:xiaohongshu / 冻干益生菌测评 / P1 / xhs_demo_c_082
+- **原声**:“每天成本超过8块我会犹豫,除非证据很清楚。”
+- **标签**:H5, H7
+- **互动**:97 赞 / 6 回复
+- **解释**:这条原声可支撑本章关于「价格」的阶段性判断。
+
+### 证据 2:吃了三天没明显变化,但一周后排便时间稳定了一点。
+
+- **来源**:xiaohongshu / 儿童益生菌怎么选 / P0 / xhs_demo_c_013
+- **原声**:“吃了三天没明显变化,但一周后排便时间稳定了一点。”
+- **标签**:H3, H7, H4
+- **互动**:94 赞 / 7 回复
+- **解释**:这条原声可支撑本章关于「反馈」的阶段性判断。
+
+### 证据 3:我喜欢7天观察卡这种内容,不像广告。
+
+- **来源**:xiaohongshu / 儿童益生菌怎么选 / P0 / xhs_demo_c_026
+- **原声**:“我喜欢7天观察卡这种内容,不像广告。”
+- **标签**:H2, H3, H7, H8
+- **互动**:89 赞 / 6 回复
+- **解释**:这条原声可支撑本章关于「话术」的阶段性判断。
+
+### 证据 4:过敏原、糖醇、香精这些最好直接标出来。
+
+- **来源**:xiaohongshu / 益生菌腹胀便秘 / P0 / xhs_demo_c_053
+- **原声**:“过敏原、糖醇、香精这些最好直接标出来。”
+- **标签**:H1, H3, H4, H6
+- **互动**:86 赞 / 7 回复
+- **解释**:这条原声可支撑本章关于「信任」的阶段性判断。
+
+### 证据 5:腹胀的时候孩子会闹,但我又不敢随便换太多产品。
+
+- **来源**:xiaohongshu / 儿童益生菌怎么选 / P0 / xhs_demo_c_027
+- **原声**:“腹胀的时候孩子会闹,但我又不敢随便换太多产品。”
+- **标签**:H2, H3, H7, H1
+- **互动**:96 赞 / 1 回复
+- **解释**:这条原声可支撑本章关于「痛点」的阶段性判断。
+
+## Ch4. 行动建议
+
+- **章节目标**:输出下一步 P0/P1/P2 动作和验证指标
+- **对应假设**:H8
+- **证据量**:35 条 VOC / 5 条证据卡
+- **章节结论**:当前 35 条可追溯 VOC 显示,冻干益生菌 在「行动建议」中最稳定的信号集中在 话术(12)、场景(4)、价格(4);主要由 儿童益生菌怎么选、冻干益生菌测评、益生菌腹胀便秘 等关键词触发。
+- **业务解释**:本章对应 H8 增长行动。证据来自 xiaohongshu 35,因此适合写成“当前样本支持的阶段性判断”,不应外推为全市场结论。
+- **行动建议**:把证据最高的 3 个用户表达转成 P0/P1/P2 行动,并为每条行动指定验证指标。
+
+### 高频主题
+
+| 主题 | 频次 |
+|---|---:|
+| 话术 | 12 |
+| 场景 | 4 |
+| 价格 | 4 |
+| 信任 | 4 |
+| 反馈 | 3 |
+| 竞品 | 3 |
+
+### VOC 证据卡
+
+### 证据 1:我会先看菌株编号和配料表,客服讲不清楚就不下单。
+
+- **来源**:xiaohongshu / 益生菌腹胀便秘 / P0 / xhs_demo_c_068
+- **原声**:“我会先看菌株编号和配料表,客服讲不清楚就不下单。”
+- **标签**:H3, H4, H8
+- **互动**:95 赞 / 4 回复
+- **解释**:这条原声可支撑本章关于「决策」的阶段性判断。
+
+### 证据 2:我喜欢7天观察卡这种内容,不像广告。
+
+- **来源**:xiaohongshu / 儿童益生菌怎么选 / P0 / xhs_demo_c_026
+- **原声**:“我喜欢7天观察卡这种内容,不像广告。”
+- **标签**:H2, H3, H7, H8
+- **互动**:89 赞 / 6 回复
+- **解释**:这条原声可支撑本章关于「话术」的阶段性判断。
+
+### 证据 3:详情页少一点专利词,多一点家庭使用说明。
+
+- **来源**:xiaohongshu / 冻干益生菌测评 / P1 / xhs_demo_c_081
+- **原声**:“详情页少一点专利词,多一点家庭使用说明。”
+- **标签**:H3, H6, H8
+- **互动**:90 赞 / 3 回复
+- **解释**:这条原声可支撑本章关于「话术」的阶段性判断。
+
+### 证据 4:味道淡孩子能接受,坚持下来比参数更重要。
+
+- **来源**:xiaohongshu / 儿童益生菌怎么选 / P0 / xhs_demo_c_039
+- **原声**:“味道淡孩子能接受,坚持下来比参数更重要。”
+- **标签**:H3, H8, H4
+- **互动**:84 赞 / 5 回复
+- **解释**:这条原声可支撑本章关于「反馈」的阶段性判断。
+
+### 证据 5:进口牌子贵但说明详细,国产牌子客服回复快。
+
+- **来源**:xiaohongshu / 儿童益生菌怎么选 / P0 / xhs_demo_c_040
+- **原声**:“进口牌子贵但说明详细,国产牌子客服回复快。”
+- **标签**:H3, H8, H5
+- **互动**:91 赞 / 0 回复
+- **解释**:这条原声可支撑本章关于「竞品」的阶段性判断。
+

+ 105 - 0
demo/xiaohongshu/comments-flat.jsonl

@@ -0,0 +1,105 @@
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H1","H3","H6"],"noteId":"xhs_demo_001","commentId":"xhs_demo_c_001","author":"小满妈妈","ipLocation":"浙江","text":"最怕买回来孩子不愿意喝,之前有一款味道太甜直接闲置。","theme":"痛点","likeCount":10,"subCommentCount":3,"url":"https://example.com/xhs/demo/xhs_demo_001","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H1","H3","H6","H2"],"noteId":"xhs_demo_001","commentId":"xhs_demo_c_002","author":"配料表先行","ipLocation":"上海","text":"外出吃饭后会备几条,小包装真的比大罐方便。","theme":"场景","likeCount":17,"subCommentCount":6,"url":"https://example.com/xhs/demo/xhs_demo_001","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H1","H3","H6"],"noteId":"xhs_demo_001","commentId":"xhs_demo_c_003","author":"打工人小周","ipLocation":"广东","text":"独立条装、常温保存、少添加是我下单前最看重的。","theme":"决策","likeCount":24,"subCommentCount":1,"url":"https://example.com/xhs/demo/xhs_demo_001","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H1","H3","H6","H4"],"noteId":"xhs_demo_001","commentId":"xhs_demo_c_004","author":"橙子爸","ipLocation":"江苏","text":"吃了三天没明显变化,但一周后排便时间稳定了一点。","theme":"反馈","likeCount":31,"subCommentCount":4,"url":"https://example.com/xhs/demo/xhs_demo_001","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H6","H2"],"noteId":"xhs_demo_002","commentId":"xhs_demo_c_005","author":"理性下单中","ipLocation":"四川","text":"外出吃饭后会备几条,小包装真的比大罐方便。","theme":"场景","likeCount":38,"subCommentCount":7,"url":"https://example.com/xhs/demo/xhs_demo_002","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H6"],"noteId":"xhs_demo_002","commentId":"xhs_demo_c_006","author":"不想踩雷","ipLocation":"北京","text":"独立条装、常温保存、少添加是我下单前最看重的。","theme":"决策","likeCount":45,"subCommentCount":2,"url":"https://example.com/xhs/demo/xhs_demo_002","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H6","H4"],"noteId":"xhs_demo_002","commentId":"xhs_demo_c_007","author":"带娃观察员","ipLocation":"福建","text":"吃了三天没明显变化,但一周后排便时间稳定了一点。","theme":"反馈","likeCount":52,"subCommentCount":5,"url":"https://example.com/xhs/demo/xhs_demo_002","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H6","H5"],"noteId":"xhs_demo_002","commentId":"xhs_demo_c_008","author":"胃肠敏感星人","ipLocation":"湖北","text":"之前买的那款结块严重,这次会特别看包装密封。","theme":"竞品","likeCount":59,"subCommentCount":0,"url":"https://example.com/xhs/demo/xhs_demo_002","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H1","H2","H4","H3"],"noteId":"xhs_demo_003","commentId":"xhs_demo_c_009","author":"囤货前先问","ipLocation":"山东","text":"独立条装、常温保存、少添加是我下单前最看重的。","theme":"决策","likeCount":66,"subCommentCount":3,"url":"https://example.com/xhs/demo/xhs_demo_003","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H1","H2","H4"],"noteId":"xhs_demo_003","commentId":"xhs_demo_c_010","author":"真实反馈bot","ipLocation":"重庆","text":"吃了三天没明显变化,但一周后排便时间稳定了一点。","theme":"反馈","likeCount":73,"subCommentCount":6,"url":"https://example.com/xhs/demo/xhs_demo_003","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H1","H2","H4","H5"],"noteId":"xhs_demo_003","commentId":"xhs_demo_c_011","author":"小满妈妈","ipLocation":"浙江","text":"之前买的那款结块严重,这次会特别看包装密封。","theme":"竞品","likeCount":80,"subCommentCount":1,"url":"https://example.com/xhs/demo/xhs_demo_003","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H1","H2","H4","H6"],"noteId":"xhs_demo_003","commentId":"xhs_demo_c_012","author":"配料表先行","ipLocation":"上海","text":"能不能写清楚不适合哪些人?这比夸效果更重要。","theme":"信任","likeCount":87,"subCommentCount":4,"url":"https://example.com/xhs/demo/xhs_demo_003","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H7","H4"],"noteId":"xhs_demo_004","commentId":"xhs_demo_c_013","author":"打工人小周","ipLocation":"广东","text":"吃了三天没明显变化,但一周后排便时间稳定了一点。","theme":"反馈","likeCount":94,"subCommentCount":7,"url":"https://example.com/xhs/demo/xhs_demo_004","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H7","H5"],"noteId":"xhs_demo_004","commentId":"xhs_demo_c_014","author":"橙子爸","ipLocation":"江苏","text":"之前买的那款结块严重,这次会特别看包装密封。","theme":"竞品","likeCount":5,"subCommentCount":2,"url":"https://example.com/xhs/demo/xhs_demo_004","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H7","H6"],"noteId":"xhs_demo_004","commentId":"xhs_demo_c_015","author":"理性下单中","ipLocation":"四川","text":"能不能写清楚不适合哪些人?这比夸效果更重要。","theme":"信任","likeCount":12,"subCommentCount":5,"url":"https://example.com/xhs/demo/xhs_demo_004","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H7"],"noteId":"xhs_demo_004","commentId":"xhs_demo_c_016","author":"不想踩雷","ipLocation":"北京","text":"希望先有7天试用装,有效果再买月装压力小。","theme":"价格","likeCount":19,"subCommentCount":0,"url":"https://example.com/xhs/demo/xhs_demo_004","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H6","H8","H5"],"noteId":"xhs_demo_005","commentId":"xhs_demo_c_017","author":"带娃观察员","ipLocation":"福建","text":"之前买的那款结块严重,这次会特别看包装密封。","theme":"竞品","likeCount":26,"subCommentCount":3,"url":"https://example.com/xhs/demo/xhs_demo_005","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H6","H8"],"noteId":"xhs_demo_005","commentId":"xhs_demo_c_018","author":"胃肠敏感星人","ipLocation":"湖北","text":"能不能写清楚不适合哪些人?这比夸效果更重要。","theme":"信任","likeCount":33,"subCommentCount":6,"url":"https://example.com/xhs/demo/xhs_demo_005","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H6","H8","H7"],"noteId":"xhs_demo_005","commentId":"xhs_demo_c_019","author":"囤货前先问","ipLocation":"山东","text":"希望先有7天试用装,有效果再买月装压力小。","theme":"价格","likeCount":40,"subCommentCount":1,"url":"https://example.com/xhs/demo/xhs_demo_005","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H6","H8"],"noteId":"xhs_demo_005","commentId":"xhs_demo_c_020","author":"真实反馈bot","ipLocation":"重庆","text":"我喜欢7天观察卡这种内容,不像广告。","theme":"话术","likeCount":47,"subCommentCount":4,"url":"https://example.com/xhs/demo/xhs_demo_005","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H1","H4","H8","H6"],"noteId":"xhs_demo_006","commentId":"xhs_demo_c_021","author":"小满妈妈","ipLocation":"浙江","text":"能不能写清楚不适合哪些人?这比夸效果更重要。","theme":"信任","likeCount":54,"subCommentCount":7,"url":"https://example.com/xhs/demo/xhs_demo_006","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H1","H4","H8","H7"],"noteId":"xhs_demo_006","commentId":"xhs_demo_c_022","author":"配料表先行","ipLocation":"上海","text":"希望先有7天试用装,有效果再买月装压力小。","theme":"价格","likeCount":61,"subCommentCount":2,"url":"https://example.com/xhs/demo/xhs_demo_006","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H1","H4","H8"],"noteId":"xhs_demo_006","commentId":"xhs_demo_c_023","author":"打工人小周","ipLocation":"广东","text":"我喜欢7天观察卡这种内容,不像广告。","theme":"话术","likeCount":68,"subCommentCount":5,"url":"https://example.com/xhs/demo/xhs_demo_006","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H1","H4","H8"],"noteId":"xhs_demo_006","commentId":"xhs_demo_c_024","author":"橙子爸","ipLocation":"江苏","text":"腹胀的时候孩子会闹,但我又不敢随便换太多产品。","theme":"痛点","likeCount":75,"subCommentCount":0,"url":"https://example.com/xhs/demo/xhs_demo_006","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H2","H3","H7"],"noteId":"xhs_demo_007","commentId":"xhs_demo_c_025","author":"理性下单中","ipLocation":"四川","text":"希望先有7天试用装,有效果再买月装压力小。","theme":"价格","likeCount":82,"subCommentCount":3,"url":"https://example.com/xhs/demo/xhs_demo_007","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H2","H3","H7","H8"],"noteId":"xhs_demo_007","commentId":"xhs_demo_c_026","author":"不想踩雷","ipLocation":"北京","text":"我喜欢7天观察卡这种内容,不像广告。","theme":"话术","likeCount":89,"subCommentCount":6,"url":"https://example.com/xhs/demo/xhs_demo_007","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H2","H3","H7","H1"],"noteId":"xhs_demo_007","commentId":"xhs_demo_c_027","author":"带娃观察员","ipLocation":"福建","text":"腹胀的时候孩子会闹,但我又不敢随便换太多产品。","theme":"痛点","likeCount":96,"subCommentCount":1,"url":"https://example.com/xhs/demo/xhs_demo_007","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H2","H3","H7"],"noteId":"xhs_demo_007","commentId":"xhs_demo_c_028","author":"胃肠敏感星人","ipLocation":"湖北","text":"开学和旅行后最明显,作息一乱肠胃也跟着乱。","theme":"场景","likeCount":7,"subCommentCount":4,"url":"https://example.com/xhs/demo/xhs_demo_007","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H5","H6","H8"],"noteId":"xhs_demo_008","commentId":"xhs_demo_c_029","author":"囤货前先问","ipLocation":"山东","text":"我喜欢7天观察卡这种内容,不像广告。","theme":"话术","likeCount":14,"subCommentCount":7,"url":"https://example.com/xhs/demo/xhs_demo_008","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H5","H6","H1"],"noteId":"xhs_demo_008","commentId":"xhs_demo_c_030","author":"真实反馈bot","ipLocation":"重庆","text":"腹胀的时候孩子会闹,但我又不敢随便换太多产品。","theme":"痛点","likeCount":21,"subCommentCount":2,"url":"https://example.com/xhs/demo/xhs_demo_008","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H5","H6","H2"],"noteId":"xhs_demo_008","commentId":"xhs_demo_c_031","author":"小满妈妈","ipLocation":"浙江","text":"开学和旅行后最明显,作息一乱肠胃也跟着乱。","theme":"场景","likeCount":28,"subCommentCount":5,"url":"https://example.com/xhs/demo/xhs_demo_008","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H5","H6"],"noteId":"xhs_demo_008","commentId":"xhs_demo_c_032","author":"配料表先行","ipLocation":"上海","text":"详情页如果有适用人群表格,我会更容易判断。","theme":"决策","likeCount":35,"subCommentCount":0,"url":"https://example.com/xhs/demo/xhs_demo_008","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H4","H6","H1"],"noteId":"xhs_demo_009","commentId":"xhs_demo_c_033","author":"打工人小周","ipLocation":"广东","text":"腹胀的时候孩子会闹,但我又不敢随便换太多产品。","theme":"痛点","likeCount":42,"subCommentCount":3,"url":"https://example.com/xhs/demo/xhs_demo_009","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H4","H6","H2"],"noteId":"xhs_demo_009","commentId":"xhs_demo_c_034","author":"橙子爸","ipLocation":"江苏","text":"开学和旅行后最明显,作息一乱肠胃也跟着乱。","theme":"场景","likeCount":49,"subCommentCount":6,"url":"https://example.com/xhs/demo/xhs_demo_009","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H4","H6","H3"],"noteId":"xhs_demo_009","commentId":"xhs_demo_c_035","author":"理性下单中","ipLocation":"四川","text":"详情页如果有适用人群表格,我会更容易判断。","theme":"决策","likeCount":56,"subCommentCount":1,"url":"https://example.com/xhs/demo/xhs_demo_009","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H4","H6"],"noteId":"xhs_demo_009","commentId":"xhs_demo_c_036","author":"不想踩雷","ipLocation":"北京","text":"味道淡孩子能接受,坚持下来比参数更重要。","theme":"反馈","likeCount":63,"subCommentCount":4,"url":"https://example.com/xhs/demo/xhs_demo_009","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H8","H2"],"noteId":"xhs_demo_010","commentId":"xhs_demo_c_037","author":"带娃观察员","ipLocation":"福建","text":"开学和旅行后最明显,作息一乱肠胃也跟着乱。","theme":"场景","likeCount":70,"subCommentCount":7,"url":"https://example.com/xhs/demo/xhs_demo_010","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H8"],"noteId":"xhs_demo_010","commentId":"xhs_demo_c_038","author":"胃肠敏感星人","ipLocation":"湖北","text":"详情页如果有适用人群表格,我会更容易判断。","theme":"决策","likeCount":77,"subCommentCount":2,"url":"https://example.com/xhs/demo/xhs_demo_010","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H8","H4"],"noteId":"xhs_demo_010","commentId":"xhs_demo_c_039","author":"囤货前先问","ipLocation":"山东","text":"味道淡孩子能接受,坚持下来比参数更重要。","theme":"反馈","likeCount":84,"subCommentCount":5,"url":"https://example.com/xhs/demo/xhs_demo_010","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H8","H5"],"noteId":"xhs_demo_010","commentId":"xhs_demo_c_040","author":"真实反馈bot","ipLocation":"重庆","text":"进口牌子贵但说明详细,国产牌子客服回复快。","theme":"竞品","likeCount":91,"subCommentCount":0,"url":"https://example.com/xhs/demo/xhs_demo_010","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H2","H4","H3"],"noteId":"xhs_demo_011","commentId":"xhs_demo_c_041","author":"小满妈妈","ipLocation":"浙江","text":"详情页如果有适用人群表格,我会更容易判断。","theme":"决策","likeCount":98,"subCommentCount":3,"url":"https://example.com/xhs/demo/xhs_demo_011","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H2","H4"],"noteId":"xhs_demo_011","commentId":"xhs_demo_c_042","author":"配料表先行","ipLocation":"上海","text":"味道淡孩子能接受,坚持下来比参数更重要。","theme":"反馈","likeCount":9,"subCommentCount":6,"url":"https://example.com/xhs/demo/xhs_demo_011","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H2","H4","H5"],"noteId":"xhs_demo_011","commentId":"xhs_demo_c_043","author":"打工人小周","ipLocation":"广东","text":"进口牌子贵但说明详细,国产牌子客服回复快。","theme":"竞品","likeCount":16,"subCommentCount":1,"url":"https://example.com/xhs/demo/xhs_demo_011","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H2","H4","H6"],"noteId":"xhs_demo_011","commentId":"xhs_demo_c_044","author":"橙子爸","ipLocation":"江苏","text":"过敏原、糖醇、香精这些最好直接标出来。","theme":"信任","likeCount":23,"subCommentCount":4,"url":"https://example.com/xhs/demo/xhs_demo_011","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H4","H6"],"noteId":"xhs_demo_012","commentId":"xhs_demo_c_045","author":"理性下单中","ipLocation":"四川","text":"味道淡孩子能接受,坚持下来比参数更重要。","theme":"反馈","likeCount":30,"subCommentCount":7,"url":"https://example.com/xhs/demo/xhs_demo_012","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H4","H6","H5"],"noteId":"xhs_demo_012","commentId":"xhs_demo_c_046","author":"不想踩雷","ipLocation":"北京","text":"进口牌子贵但说明详细,国产牌子客服回复快。","theme":"竞品","likeCount":37,"subCommentCount":2,"url":"https://example.com/xhs/demo/xhs_demo_012","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H4","H6"],"noteId":"xhs_demo_012","commentId":"xhs_demo_c_047","author":"带娃观察员","ipLocation":"福建","text":"过敏原、糖醇、香精这些最好直接标出来。","theme":"信任","likeCount":44,"subCommentCount":5,"url":"https://example.com/xhs/demo/xhs_demo_012","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H4","H6","H7"],"noteId":"xhs_demo_012","commentId":"xhs_demo_c_048","author":"胃肠敏感星人","ipLocation":"湖北","text":"一盒够吃一个月最省心,太多规格反而选择困难。","theme":"价格","likeCount":51,"subCommentCount":0,"url":"https://example.com/xhs/demo/xhs_demo_012","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H2","H4","H5"],"noteId":"xhs_demo_013","commentId":"xhs_demo_c_049","author":"囤货前先问","ipLocation":"山东","text":"进口牌子贵但说明详细,国产牌子客服回复快。","theme":"竞品","likeCount":58,"subCommentCount":3,"url":"https://example.com/xhs/demo/xhs_demo_013","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H2","H4","H6"],"noteId":"xhs_demo_013","commentId":"xhs_demo_c_050","author":"真实反馈bot","ipLocation":"重庆","text":"过敏原、糖醇、香精这些最好直接标出来。","theme":"信任","likeCount":65,"subCommentCount":6,"url":"https://example.com/xhs/demo/xhs_demo_013","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H2","H4","H7"],"noteId":"xhs_demo_013","commentId":"xhs_demo_c_051","author":"小满妈妈","ipLocation":"浙江","text":"一盒够吃一个月最省心,太多规格反而选择困难。","theme":"价格","likeCount":72,"subCommentCount":1,"url":"https://example.com/xhs/demo/xhs_demo_013","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H2","H4","H8"],"noteId":"xhs_demo_013","commentId":"xhs_demo_c_052","author":"配料表先行","ipLocation":"上海","text":"把活菌数翻译成怎么吃、吃多久、怎么看变化会更有用。","theme":"话术","likeCount":79,"subCommentCount":4,"url":"https://example.com/xhs/demo/xhs_demo_013","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H3","H4","H6"],"noteId":"xhs_demo_014","commentId":"xhs_demo_c_053","author":"打工人小周","ipLocation":"广东","text":"过敏原、糖醇、香精这些最好直接标出来。","theme":"信任","likeCount":86,"subCommentCount":7,"url":"https://example.com/xhs/demo/xhs_demo_014","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H3","H4","H7"],"noteId":"xhs_demo_014","commentId":"xhs_demo_c_054","author":"橙子爸","ipLocation":"江苏","text":"一盒够吃一个月最省心,太多规格反而选择困难。","theme":"价格","likeCount":93,"subCommentCount":2,"url":"https://example.com/xhs/demo/xhs_demo_014","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H3","H4","H8"],"noteId":"xhs_demo_014","commentId":"xhs_demo_c_055","author":"理性下单中","ipLocation":"四川","text":"把活菌数翻译成怎么吃、吃多久、怎么看变化会更有用。","theme":"话术","likeCount":4,"subCommentCount":5,"url":"https://example.com/xhs/demo/xhs_demo_014","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H3","H4"],"noteId":"xhs_demo_014","commentId":"xhs_demo_c_056","author":"不想踩雷","ipLocation":"北京","text":"我们家主要是排便不规律,想知道吃多久能观察到变化。","theme":"痛点","likeCount":11,"subCommentCount":0,"url":"https://example.com/xhs/demo/xhs_demo_014","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H2","H8","H7"],"noteId":"xhs_demo_015","commentId":"xhs_demo_c_057","author":"带娃观察员","ipLocation":"福建","text":"一盒够吃一个月最省心,太多规格反而选择困难。","theme":"价格","likeCount":18,"subCommentCount":3,"url":"https://example.com/xhs/demo/xhs_demo_015","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H2","H8"],"noteId":"xhs_demo_015","commentId":"xhs_demo_c_058","author":"胃肠敏感星人","ipLocation":"湖北","text":"把活菌数翻译成怎么吃、吃多久、怎么看变化会更有用。","theme":"话术","likeCount":25,"subCommentCount":6,"url":"https://example.com/xhs/demo/xhs_demo_015","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H2","H8","H1"],"noteId":"xhs_demo_015","commentId":"xhs_demo_c_059","author":"囤货前先问","ipLocation":"山东","text":"我们家主要是排便不规律,想知道吃多久能观察到变化。","theme":"痛点","likeCount":32,"subCommentCount":1,"url":"https://example.com/xhs/demo/xhs_demo_015","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H2","H8"],"noteId":"xhs_demo_015","commentId":"xhs_demo_c_060","author":"真实反馈bot","ipLocation":"重庆","text":"老人帮忙带娃时说明要简单,不然冲调水温总搞错。","theme":"场景","likeCount":39,"subCommentCount":4,"url":"https://example.com/xhs/demo/xhs_demo_015","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H4","H6","H8"],"noteId":"xhs_demo_016","commentId":"xhs_demo_c_061","author":"小满妈妈","ipLocation":"浙江","text":"把活菌数翻译成怎么吃、吃多久、怎么看变化会更有用。","theme":"话术","likeCount":46,"subCommentCount":7,"url":"https://example.com/xhs/demo/xhs_demo_016","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H4","H6","H1"],"noteId":"xhs_demo_016","commentId":"xhs_demo_c_062","author":"配料表先行","ipLocation":"上海","text":"我们家主要是排便不规律,想知道吃多久能观察到变化。","theme":"痛点","likeCount":53,"subCommentCount":2,"url":"https://example.com/xhs/demo/xhs_demo_016","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H4","H6","H2"],"noteId":"xhs_demo_016","commentId":"xhs_demo_c_063","author":"打工人小周","ipLocation":"广东","text":"老人帮忙带娃时说明要简单,不然冲调水温总搞错。","theme":"场景","likeCount":60,"subCommentCount":5,"url":"https://example.com/xhs/demo/xhs_demo_016","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H7"],"noteId":"xhs_demo_017","commentId":"xhs_demo_c_064","author":"橙子爸","ipLocation":"江苏","text":"我们家主要是排便不规律,想知道吃多久能观察到变化。","theme":"痛点","likeCount":67,"subCommentCount":0,"url":"https://example.com/xhs/demo/xhs_demo_017","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H7","H2"],"noteId":"xhs_demo_017","commentId":"xhs_demo_c_065","author":"理性下单中","ipLocation":"四川","text":"老人帮忙带娃时说明要简单,不然冲调水温总搞错。","theme":"场景","likeCount":74,"subCommentCount":3,"url":"https://example.com/xhs/demo/xhs_demo_017","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H7","H3"],"noteId":"xhs_demo_017","commentId":"xhs_demo_c_066","author":"不想踩雷","ipLocation":"北京","text":"我会先看菌株编号和配料表,客服讲不清楚就不下单。","theme":"决策","likeCount":81,"subCommentCount":6,"url":"https://example.com/xhs/demo/xhs_demo_017","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H3","H4","H8","H2"],"noteId":"xhs_demo_018","commentId":"xhs_demo_c_067","author":"带娃观察员","ipLocation":"福建","text":"老人帮忙带娃时说明要简单,不然冲调水温总搞错。","theme":"场景","likeCount":88,"subCommentCount":1,"url":"https://example.com/xhs/demo/xhs_demo_018","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H3","H4","H8"],"noteId":"xhs_demo_018","commentId":"xhs_demo_c_068","author":"胃肠敏感星人","ipLocation":"湖北","text":"我会先看菌株编号和配料表,客服讲不清楚就不下单。","theme":"决策","likeCount":95,"subCommentCount":4,"url":"https://example.com/xhs/demo/xhs_demo_018","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H3","H4","H8"],"noteId":"xhs_demo_018","commentId":"xhs_demo_c_069","author":"囤货前先问","ipLocation":"山东","text":"第一天有点胀,客服说减量观察后好多了。","theme":"反馈","likeCount":6,"subCommentCount":7,"url":"https://example.com/xhs/demo/xhs_demo_018","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H5","H3"],"noteId":"xhs_demo_019","commentId":"xhs_demo_c_070","author":"真实反馈bot","ipLocation":"重庆","text":"我会先看菌株编号和配料表,客服讲不清楚就不下单。","theme":"决策","likeCount":13,"subCommentCount":2,"url":"https://example.com/xhs/demo/xhs_demo_019","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H5","H4"],"noteId":"xhs_demo_019","commentId":"xhs_demo_c_071","author":"小满妈妈","ipLocation":"浙江","text":"第一天有点胀,客服说减量观察后好多了。","theme":"反馈","likeCount":20,"subCommentCount":5,"url":"https://example.com/xhs/demo/xhs_demo_019","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H5"],"noteId":"xhs_demo_019","commentId":"xhs_demo_c_072","author":"配料表先行","ipLocation":"上海","text":"同价位我会选能把边界讲清楚的品牌。","theme":"竞品","likeCount":27,"subCommentCount":0,"url":"https://example.com/xhs/demo/xhs_demo_019","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H2","H4","H6"],"noteId":"xhs_demo_020","commentId":"xhs_demo_c_073","author":"打工人小周","ipLocation":"广东","text":"第一天有点胀,客服说减量观察后好多了。","theme":"反馈","likeCount":34,"subCommentCount":3,"url":"https://example.com/xhs/demo/xhs_demo_020","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H2","H4","H6","H5"],"noteId":"xhs_demo_020","commentId":"xhs_demo_c_074","author":"橙子爸","ipLocation":"江苏","text":"同价位我会选能把边界讲清楚的品牌。","theme":"竞品","likeCount":41,"subCommentCount":6,"url":"https://example.com/xhs/demo/xhs_demo_020","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H2","H4","H6"],"noteId":"xhs_demo_020","commentId":"xhs_demo_c_075","author":"理性下单中","ipLocation":"四川","text":"不要说包治便秘,说清楚辅助和观察周期反而更可信。","theme":"信任","likeCount":48,"subCommentCount":1,"url":"https://example.com/xhs/demo/xhs_demo_020","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H3","H5","H7"],"noteId":"xhs_demo_021","commentId":"xhs_demo_c_076","author":"不想踩雷","ipLocation":"北京","text":"同价位我会选能把边界讲清楚的品牌。","theme":"竞品","likeCount":55,"subCommentCount":4,"url":"https://example.com/xhs/demo/xhs_demo_021","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H3","H5","H7","H6"],"noteId":"xhs_demo_021","commentId":"xhs_demo_c_077","author":"带娃观察员","ipLocation":"福建","text":"不要说包治便秘,说清楚辅助和观察周期反而更可信。","theme":"信任","likeCount":62,"subCommentCount":7,"url":"https://example.com/xhs/demo/xhs_demo_021","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H3","H5","H7"],"noteId":"xhs_demo_021","commentId":"xhs_demo_c_078","author":"胃肠敏感星人","ipLocation":"湖北","text":"每天成本超过8块我会犹豫,除非证据很清楚。","theme":"价格","likeCount":69,"subCommentCount":2,"url":"https://example.com/xhs/demo/xhs_demo_021","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H3","H6"],"noteId":"xhs_demo_022","commentId":"xhs_demo_c_079","author":"囤货前先问","ipLocation":"山东","text":"不要说包治便秘,说清楚辅助和观察周期反而更可信。","theme":"信任","likeCount":76,"subCommentCount":5,"url":"https://example.com/xhs/demo/xhs_demo_022","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H3","H6","H7"],"noteId":"xhs_demo_022","commentId":"xhs_demo_c_080","author":"真实反馈bot","ipLocation":"重庆","text":"每天成本超过8块我会犹豫,除非证据很清楚。","theme":"价格","likeCount":83,"subCommentCount":0,"url":"https://example.com/xhs/demo/xhs_demo_022","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H3","H6","H8"],"noteId":"xhs_demo_022","commentId":"xhs_demo_c_081","author":"小满妈妈","ipLocation":"浙江","text":"详情页少一点专利词,多一点家庭使用说明。","theme":"话术","likeCount":90,"subCommentCount":3,"url":"https://example.com/xhs/demo/xhs_demo_022","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H5","H7"],"noteId":"xhs_demo_023","commentId":"xhs_demo_c_082","author":"配料表先行","ipLocation":"上海","text":"每天成本超过8块我会犹豫,除非证据很清楚。","theme":"价格","likeCount":97,"subCommentCount":6,"url":"https://example.com/xhs/demo/xhs_demo_023","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H5","H7","H8"],"noteId":"xhs_demo_023","commentId":"xhs_demo_c_083","author":"打工人小周","ipLocation":"广东","text":"详情页少一点专利词,多一点家庭使用说明。","theme":"话术","likeCount":8,"subCommentCount":1,"url":"https://example.com/xhs/demo/xhs_demo_023","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H5","H7","H1"],"noteId":"xhs_demo_023","commentId":"xhs_demo_c_084","author":"橙子爸","ipLocation":"江苏","text":"最怕买回来孩子不愿意喝,之前有一款味道太甜直接闲置。","theme":"痛点","likeCount":15,"subCommentCount":4,"url":"https://example.com/xhs/demo/xhs_demo_023","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H3","H8"],"noteId":"xhs_demo_024","commentId":"xhs_demo_c_085","author":"理性下单中","ipLocation":"四川","text":"详情页少一点专利词,多一点家庭使用说明。","theme":"话术","likeCount":22,"subCommentCount":7,"url":"https://example.com/xhs/demo/xhs_demo_024","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H3","H8","H1"],"noteId":"xhs_demo_024","commentId":"xhs_demo_c_086","author":"不想踩雷","ipLocation":"北京","text":"最怕买回来孩子不愿意喝,之前有一款味道太甜直接闲置。","theme":"痛点","likeCount":29,"subCommentCount":2,"url":"https://example.com/xhs/demo/xhs_demo_024","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H3","H8","H2"],"noteId":"xhs_demo_024","commentId":"xhs_demo_c_087","author":"带娃观察员","ipLocation":"福建","text":"外出吃饭后会备几条,小包装真的比大罐方便。","theme":"场景","likeCount":36,"subCommentCount":5,"url":"https://example.com/xhs/demo/xhs_demo_024","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H4","H5","H1"],"noteId":"xhs_demo_025","commentId":"xhs_demo_c_088","author":"胃肠敏感星人","ipLocation":"湖北","text":"最怕买回来孩子不愿意喝,之前有一款味道太甜直接闲置。","theme":"痛点","likeCount":43,"subCommentCount":0,"url":"https://example.com/xhs/demo/xhs_demo_025","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H4","H5","H2"],"noteId":"xhs_demo_025","commentId":"xhs_demo_c_089","author":"囤货前先问","ipLocation":"山东","text":"外出吃饭后会备几条,小包装真的比大罐方便。","theme":"场景","likeCount":50,"subCommentCount":3,"url":"https://example.com/xhs/demo/xhs_demo_025","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H4","H5","H3"],"noteId":"xhs_demo_025","commentId":"xhs_demo_c_090","author":"真实反馈bot","ipLocation":"重庆","text":"独立条装、常温保存、少添加是我下单前最看重的。","theme":"决策","likeCount":57,"subCommentCount":6,"url":"https://example.com/xhs/demo/xhs_demo_025","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H2","H7"],"noteId":"xhs_demo_026","commentId":"xhs_demo_c_091","author":"小满妈妈","ipLocation":"浙江","text":"外出吃饭后会备几条,小包装真的比大罐方便。","theme":"场景","likeCount":64,"subCommentCount":1,"url":"https://example.com/xhs/demo/xhs_demo_026","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H2","H7","H3"],"noteId":"xhs_demo_026","commentId":"xhs_demo_c_092","author":"配料表先行","ipLocation":"上海","text":"独立条装、常温保存、少添加是我下单前最看重的。","theme":"决策","likeCount":71,"subCommentCount":4,"url":"https://example.com/xhs/demo/xhs_demo_026","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H2","H7","H4"],"noteId":"xhs_demo_026","commentId":"xhs_demo_c_093","author":"打工人小周","ipLocation":"广东","text":"吃了三天没明显变化,但一周后排便时间稳定了一点。","theme":"反馈","likeCount":78,"subCommentCount":7,"url":"https://example.com/xhs/demo/xhs_demo_026","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H3","H5","H6"],"noteId":"xhs_demo_027","commentId":"xhs_demo_c_094","author":"橙子爸","ipLocation":"江苏","text":"独立条装、常温保存、少添加是我下单前最看重的。","theme":"决策","likeCount":85,"subCommentCount":2,"url":"https://example.com/xhs/demo/xhs_demo_027","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H3","H5","H6","H4"],"noteId":"xhs_demo_027","commentId":"xhs_demo_c_095","author":"理性下单中","ipLocation":"四川","text":"吃了三天没明显变化,但一周后排便时间稳定了一点。","theme":"反馈","likeCount":92,"subCommentCount":5,"url":"https://example.com/xhs/demo/xhs_demo_027","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H3","H5","H6"],"noteId":"xhs_demo_027","commentId":"xhs_demo_c_096","author":"不想踩雷","ipLocation":"北京","text":"之前买的那款结块严重,这次会特别看包装密封。","theme":"竞品","likeCount":3,"subCommentCount":0,"url":"https://example.com/xhs/demo/xhs_demo_027","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H7","H8","H4"],"noteId":"xhs_demo_028","commentId":"xhs_demo_c_097","author":"带娃观察员","ipLocation":"福建","text":"吃了三天没明显变化,但一周后排便时间稳定了一点。","theme":"反馈","likeCount":10,"subCommentCount":3,"url":"https://example.com/xhs/demo/xhs_demo_028","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H7","H8","H5"],"noteId":"xhs_demo_028","commentId":"xhs_demo_c_098","author":"胃肠敏感星人","ipLocation":"湖北","text":"之前买的那款结块严重,这次会特别看包装密封。","theme":"竞品","likeCount":17,"subCommentCount":6,"url":"https://example.com/xhs/demo/xhs_demo_028","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H7","H8","H6"],"noteId":"xhs_demo_028","commentId":"xhs_demo_c_099","author":"囤货前先问","ipLocation":"山东","text":"能不能写清楚不适合哪些人?这比夸效果更重要。","theme":"信任","likeCount":24,"subCommentCount":1,"url":"https://example.com/xhs/demo/xhs_demo_028","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H4","H6","H5"],"noteId":"xhs_demo_029","commentId":"xhs_demo_c_100","author":"真实反馈bot","ipLocation":"重庆","text":"之前买的那款结块严重,这次会特别看包装密封。","theme":"竞品","likeCount":31,"subCommentCount":4,"url":"https://example.com/xhs/demo/xhs_demo_029","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H4","H6"],"noteId":"xhs_demo_029","commentId":"xhs_demo_c_101","author":"小满妈妈","ipLocation":"浙江","text":"能不能写清楚不适合哪些人?这比夸效果更重要。","theme":"信任","likeCount":38,"subCommentCount":7,"url":"https://example.com/xhs/demo/xhs_demo_029","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H4","H6","H7"],"noteId":"xhs_demo_029","commentId":"xhs_demo_c_102","author":"配料表先行","ipLocation":"上海","text":"希望先有7天试用装,有效果再买月装压力小。","theme":"价格","likeCount":45,"subCommentCount":2,"url":"https://example.com/xhs/demo/xhs_demo_029","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H2","H3","H8","H6"],"noteId":"xhs_demo_030","commentId":"xhs_demo_c_103","author":"打工人小周","ipLocation":"广东","text":"能不能写清楚不适合哪些人?这比夸效果更重要。","theme":"信任","likeCount":52,"subCommentCount":5,"url":"https://example.com/xhs/demo/xhs_demo_030","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H2","H3","H8","H7"],"noteId":"xhs_demo_030","commentId":"xhs_demo_c_104","author":"橙子爸","ipLocation":"江苏","text":"希望先有7天试用装,有效果再买月装压力小。","theme":"价格","likeCount":59,"subCommentCount":0,"url":"https://example.com/xhs/demo/xhs_demo_030","collectedAt":"2026-04-29T14:45:00+08:00"}
+{"platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H2","H3","H8"],"noteId":"xhs_demo_030","commentId":"xhs_demo_c_105","author":"理性下单中","ipLocation":"四川","text":"我喜欢7天观察卡这种内容,不像广告。","theme":"话术","likeCount":66,"subCommentCount":3,"url":"https://example.com/xhs/demo/xhs_demo_030","collectedAt":"2026-04-29T14:45:00+08:00"}

+ 77 - 0
demo/xiaohongshu/hypothesis-matrix/3.CollectionMatrix.md

@@ -0,0 +1,77 @@
+# 3. VOC 采集矩阵
+
+## 1. 采集目标
+
+| 字段 | 填写 |
+|---|---|
+| 项目名称 | xiaohongshu-course-demo |
+| 核心决策问题 | 小红书用户为什么选择或放弃冻干益生菌,下一步产品和内容应该优先验证什么? |
+| 覆盖平台 | 小红书 |
+| 计划采集周期 | 待确认 |
+| 目标原始样本数 | 240 |
+| 目标有效 VOC 数 | 240 |
+| 采集负责人 | 待确认 |
+
+## 2. 批次策略
+
+| 批次 | 用途 | 建议占比 | 启动条件 | 完成标准 |
+|---|---|---:|---|---|
+| P0 | 核心关键词和高置信方向 | 20%-30% | Intake 与 H1-H3 已确认 | 核心问题有初步证据 |
+| P1 | 竞品、场景、功效、痛点扩展 | 40%-50% | P0 噪声可控 | 主要假设都有样本覆盖 |
+| P2 | 长尾、异常、补证与反证 | 20%-30% | P0/P1 发现空白或矛盾 | 关键结论有反证检查 |
+
+## 3. 采集矩阵
+
+| id | platform | keyword | keywordType | batch | targetCount | hypothesisTags | purpose | expectedSignal | risk | status |
+|---|---|---|---|---|---:|---|---|---|---|---|
+| M001 | 小红书 | 冻干益生菌 市场机会 | 品类词 | P0 | 10 | H1 | 市场是否值得进入/加码? | 用户会主动表达为什么搜索、购买、踩雷或重新选择 冻干益生菌。 | 用户讨论稀少,或高频表达显示 冻干益生菌 需求已被现有方案充分满足。 | 未开始 |
+| M002 | 小红书 | 冻干益生菌 值不值得买 | 品类词 | P1 | 10 | H1 | 市场是否值得进入/加码? | 用户会主动表达为什么搜索、购买、踩雷或重新选择 冻干益生菌。 | 用户讨论稀少,或高频表达显示 冻干益生菌 需求已被现有方案充分满足。 | 未开始 |
+| M003 | 小红书 | 冻干益生菌 趋势 | 品类词 | P2 | 10 | H1 | 市场是否值得进入/加码? | 用户会主动表达为什么搜索、购买、踩雷或重新选择 冻干益生菌。 | 用户讨论稀少,或高频表达显示 冻干益生菌 需求已被现有方案充分满足。 | 未开始 |
+| M004 | 小红书 | 冻干益生菌 使用场景 | 场景词 | P0 | 10 | H2 | 用户真实痛点和高频场景是什么? | 用户会说出具体使用前后情境、触发原因、焦虑和选择门槛。 | 评论集中在泛泛夸奖、抽奖、广告或无场景表达,无法形成稳定需求结构。 | 未开始 |
+| M005 | 小红书 | 冻干益生菌 痛点 | 场景词 | P1 | 10 | H2 | 用户真实痛点和高频场景是什么? | 用户会说出具体使用前后情境、触发原因、焦虑和选择门槛。 | 评论集中在泛泛夸奖、抽奖、广告或无场景表达,无法形成稳定需求结构。 | 未开始 |
+| M006 | 小红书 | 冻干益生菌 人群 | 场景词 | P2 | 10 | H2 | 用户真实痛点和高频场景是什么? | 用户会说出具体使用前后情境、触发原因、焦虑和选择门槛。 | 评论集中在泛泛夸奖、抽奖、广告或无场景表达,无法形成稳定需求结构。 | 未开始 |
+| M007 | 小红书 | 冻干益生菌 怎么选 | 产品词 | P0 | 10 | H3 | 当前产品/竞品哪里没有满足? | 用户会提到“不好用/看不懂/不方便/不适合/客服讲不清”等具体缺口。 | 负面反馈高度分散,无法证明存在稳定产品缺口。 | 未开始 |
+| M008 | 小红书 | 冻干益生菌 配方 | 产品词 | P1 | 10 | H3 | 当前产品/竞品哪里没有满足? | 用户会提到“不好用/看不懂/不方便/不适合/客服讲不清”等具体缺口。 | 负面反馈高度分散,无法证明存在稳定产品缺口。 | 未开始 |
+| M009 | 小红书 | 冻干益生菌 产品缺点 | 产品词 | P2 | 10 | H3 | 当前产品/竞品哪里没有满足? | 用户会提到“不好用/看不懂/不方便/不适合/客服讲不清”等具体缺口。 | 负面反馈高度分散,无法证明存在稳定产品缺口。 | 未开始 |
+| M010 | 小红书 | 冻干益生菌 价格 | 价格词 | P1 | 10 | H4 | 用户对价格、规格、价值感如何判断? | 用户会比较贵不贵、够不够用、是否先试用、每天成本和复购压力。 | 用户很少讨论价格或规格,价格并非主要决策因素。 | 未开始 |
+| M011 | 小红书 | 冻干益生菌 规格 | 价格词 | P1 | 10 | H4 | 用户对价格、规格、价值感如何判断? | 用户会比较贵不贵、够不够用、是否先试用、每天成本和复购压力。 | 用户很少讨论价格或规格,价格并非主要决策因素。 | 未开始 |
+| M012 | 小红书 | 冻干益生菌 性价比 | 价格词 | P2 | 10 | H4 | 用户对价格、规格、价值感如何判断? | 用户会比较贵不贵、够不够用、是否先试用、每天成本和复购压力。 | 用户很少讨论价格或规格,价格并非主要决策因素。 | 未开始 |
+| M013 | 小红书 | 冻干益生菌 种草 | 平台内容词 | P1 | 10 | H5 | 哪些内容/平台影响用户决策? | 用户会收藏、追问、转述或对比某类内容形式,例如测评、避坑、观察卡、清单和达人解释。 | 平台内容互动高但评论离题,或无法影响购买/咨询/收藏行为。 | 未开始 |
+| M014 | 小红书 | 冻干益生菌 达人推荐 | 平台内容词 | P1 | 10 | H5 | 哪些内容/平台影响用户决策? | 用户会收藏、追问、转述或对比某类内容形式,例如测评、避坑、观察卡、清单和达人解释。 | 平台内容互动高但评论离题,或无法影响购买/咨询/收藏行为。 | 未开始 |
+| M015 | 小红书 | 冻干益生菌 内容笔记 | 平台内容词 | P2 | 10 | H5 | 哪些内容/平台影响用户决策? | 用户会收藏、追问、转述或对比某类内容形式,例如测评、避坑、观察卡、清单和达人解释。 | 平台内容互动高但评论离题,或无法影响购买/咨询/收藏行为。 | 未开始 |
+| M016 | 小红书 | 冻干益生菌 竞品 | 竞品词 | P1 | 10 | H6 | 竞品靠什么赢,哪里有漏洞? | 用户会主动拿竞品比较效果、价格、包装、信任背书、渠道和使用体验。 | 用户没有明确竞品参照,或竞品比较主要来自营销号而非用户表达。 | 未开始 |
+| M017 | 小红书 | 冻干益生菌 替代品 | 竞品词 | P1 | 10 | H6 | 竞品靠什么赢,哪里有漏洞? | 用户会主动拿竞品比较效果、价格、包装、信任背书、渠道和使用体验。 | 用户没有明确竞品参照,或竞品比较主要来自营销号而非用户表达。 | 未开始 |
+| M018 | 小红书 | 冻干益生菌 对比 | 竞品词 | P2 | 10 | H6 | 竞品靠什么赢,哪里有漏洞? | 用户会主动拿竞品比较效果、价格、包装、信任背书、渠道和使用体验。 | 用户没有明确竞品参照,或竞品比较主要来自营销号而非用户表达。 | 未开始 |
+| M019 | 小红书 | 冻干益生菌 卖点 | 话术词 | P1 | 10 | H7 | 什么话术、概念、定位更能打动用户? | 用户会复述某些词、问法、标题或卖点,也会反感夸大、玄学和看不懂的表达。 | 用户表达没有稳定词汇,或话术偏好与平台互动指标不一致。 | 未开始 |
+| M020 | 小红书 | 冻干益生菌 定位 | 话术词 | P1 | 10 | H7 | 什么话术、概念、定位更能打动用户? | 用户会复述某些词、问法、标题或卖点,也会反感夸大、玄学和看不懂的表达。 | 用户表达没有稳定词汇,或话术偏好与平台互动指标不一致。 | 未开始 |
+| M021 | 小红书 | 冻干益生菌 话术 | 话术词 | P2 | 10 | H7 | 什么话术、概念、定位更能打动用户? | 用户会复述某些词、问法、标题或卖点,也会反感夸大、玄学和看不懂的表达。 | 用户表达没有稳定词汇,或话术偏好与平台互动指标不一致。 | 未开始 |
+| M022 | 小红书 | 冻干益生菌 复购 | 行动词 | P2 | 10 | H8 | 下阶段最应该做哪些动作? | 用户会给出复购、推荐、咨询、犹豫、放弃和改进建议等行动信号。 | VOC 只能描述现象,无法转成明确动作或验证指标。 | 未开始 |
+| M023 | 小红书 | 冻干益生菌 推荐 | 行动词 | P2 | 10 | H8 | 下阶段最应该做哪些动作? | 用户会给出复购、推荐、咨询、犹豫、放弃和改进建议等行动信号。 | VOC 只能描述现象,无法转成明确动作或验证指标。 | 未开始 |
+| M024 | 小红书 | 冻干益生菌 转化 | 行动词 | P2 | 10 | H8 | 下阶段最应该做哪些动作? | 用户会给出复购、推荐、咨询、犹豫、放弃和改进建议等行动信号。 | VOC 只能描述现象,无法转成明确动作或验证指标。 | 未开始 |
+
+## 4. H1-H8 覆盖审计
+
+| 假设 | 关键词数 | 关键词 | 状态 |
+|---|---:|---|---|
+| H1 | 3 | 冻干益生菌 市场机会、冻干益生菌 值不值得买、冻干益生菌 趋势 | 通过 |
+| H2 | 3 | 冻干益生菌 使用场景、冻干益生菌 痛点、冻干益生菌 人群 | 通过 |
+| H3 | 3 | 冻干益生菌 怎么选、冻干益生菌 配方、冻干益生菌 产品缺点 | 通过 |
+| H4 | 3 | 冻干益生菌 价格、冻干益生菌 规格、冻干益生菌 性价比 | 通过 |
+| H5 | 3 | 冻干益生菌 种草、冻干益生菌 达人推荐、冻干益生菌 内容笔记 | 通过 |
+| H6 | 3 | 冻干益生菌 竞品、冻干益生菌 替代品、冻干益生菌 对比 | 通过 |
+| H7 | 3 | 冻干益生菌 卖点、冻干益生菌 定位、冻干益生菌 话术 | 通过 |
+| H8 | 3 | 冻干益生菌 复购、冻干益生菌 推荐、冻干益生菌 转化 | 通过 |
+
+## 5. 采集前检查
+
+| 检查项 | 标准 | 状态 |
+|---|---|---|
+| Token / credentials | 已预飞或确认可用 | 未检查 |
+| 单关键词小样本 | 每个平台至少试采 1 个关键词 | 未检查 |
+| 噪声评估 | 离题、高赞广告、重复内容可控 | 未检查 |
+| 去重口径 | ID、URL、正文相似度口径明确 | 未检查 |
+| 文件命名 | raw 文件命名与矩阵 id 可对应 | 未检查 |
+
+## 6. Builder 审计提示
+
+- **通过**:矩阵基础字段完整,假设覆盖达到当前规则。

+ 419 - 0
demo/xiaohongshu/hypothesis-matrix/collection-matrix.json

@@ -0,0 +1,419 @@
+{
+  "metadata": {
+    "project": "xiaohongshu-course-demo",
+    "generatedAt": "2026-04-29T13:40:17.090Z",
+    "platforms": [
+      "小红书"
+    ],
+    "keywordCount": 24,
+    "targetCount": 240,
+    "warningCount": 0
+  },
+  "matrix": [
+    {
+      "id": "M001",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 市场机会",
+      "keywordType": "品类词",
+      "batch": "P0",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H1"
+      ],
+      "purpose": "市场是否值得进入/加码?",
+      "expectedSignal": "用户会主动表达为什么搜索、购买、踩雷或重新选择 冻干益生菌。",
+      "risk": "用户讨论稀少,或高频表达显示 冻干益生菌 需求已被现有方案充分满足。",
+      "status": "未开始"
+    },
+    {
+      "id": "M002",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 值不值得买",
+      "keywordType": "品类词",
+      "batch": "P1",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H1"
+      ],
+      "purpose": "市场是否值得进入/加码?",
+      "expectedSignal": "用户会主动表达为什么搜索、购买、踩雷或重新选择 冻干益生菌。",
+      "risk": "用户讨论稀少,或高频表达显示 冻干益生菌 需求已被现有方案充分满足。",
+      "status": "未开始"
+    },
+    {
+      "id": "M003",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 趋势",
+      "keywordType": "品类词",
+      "batch": "P2",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H1"
+      ],
+      "purpose": "市场是否值得进入/加码?",
+      "expectedSignal": "用户会主动表达为什么搜索、购买、踩雷或重新选择 冻干益生菌。",
+      "risk": "用户讨论稀少,或高频表达显示 冻干益生菌 需求已被现有方案充分满足。",
+      "status": "未开始"
+    },
+    {
+      "id": "M004",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 使用场景",
+      "keywordType": "场景词",
+      "batch": "P0",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H2"
+      ],
+      "purpose": "用户真实痛点和高频场景是什么?",
+      "expectedSignal": "用户会说出具体使用前后情境、触发原因、焦虑和选择门槛。",
+      "risk": "评论集中在泛泛夸奖、抽奖、广告或无场景表达,无法形成稳定需求结构。",
+      "status": "未开始"
+    },
+    {
+      "id": "M005",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 痛点",
+      "keywordType": "场景词",
+      "batch": "P1",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H2"
+      ],
+      "purpose": "用户真实痛点和高频场景是什么?",
+      "expectedSignal": "用户会说出具体使用前后情境、触发原因、焦虑和选择门槛。",
+      "risk": "评论集中在泛泛夸奖、抽奖、广告或无场景表达,无法形成稳定需求结构。",
+      "status": "未开始"
+    },
+    {
+      "id": "M006",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 人群",
+      "keywordType": "场景词",
+      "batch": "P2",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H2"
+      ],
+      "purpose": "用户真实痛点和高频场景是什么?",
+      "expectedSignal": "用户会说出具体使用前后情境、触发原因、焦虑和选择门槛。",
+      "risk": "评论集中在泛泛夸奖、抽奖、广告或无场景表达,无法形成稳定需求结构。",
+      "status": "未开始"
+    },
+    {
+      "id": "M007",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 怎么选",
+      "keywordType": "产品词",
+      "batch": "P0",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H3"
+      ],
+      "purpose": "当前产品/竞品哪里没有满足?",
+      "expectedSignal": "用户会提到“不好用/看不懂/不方便/不适合/客服讲不清”等具体缺口。",
+      "risk": "负面反馈高度分散,无法证明存在稳定产品缺口。",
+      "status": "未开始"
+    },
+    {
+      "id": "M008",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 配方",
+      "keywordType": "产品词",
+      "batch": "P1",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H3"
+      ],
+      "purpose": "当前产品/竞品哪里没有满足?",
+      "expectedSignal": "用户会提到“不好用/看不懂/不方便/不适合/客服讲不清”等具体缺口。",
+      "risk": "负面反馈高度分散,无法证明存在稳定产品缺口。",
+      "status": "未开始"
+    },
+    {
+      "id": "M009",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 产品缺点",
+      "keywordType": "产品词",
+      "batch": "P2",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H3"
+      ],
+      "purpose": "当前产品/竞品哪里没有满足?",
+      "expectedSignal": "用户会提到“不好用/看不懂/不方便/不适合/客服讲不清”等具体缺口。",
+      "risk": "负面反馈高度分散,无法证明存在稳定产品缺口。",
+      "status": "未开始"
+    },
+    {
+      "id": "M010",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 价格",
+      "keywordType": "价格词",
+      "batch": "P1",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H4"
+      ],
+      "purpose": "用户对价格、规格、价值感如何判断?",
+      "expectedSignal": "用户会比较贵不贵、够不够用、是否先试用、每天成本和复购压力。",
+      "risk": "用户很少讨论价格或规格,价格并非主要决策因素。",
+      "status": "未开始"
+    },
+    {
+      "id": "M011",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 规格",
+      "keywordType": "价格词",
+      "batch": "P1",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H4"
+      ],
+      "purpose": "用户对价格、规格、价值感如何判断?",
+      "expectedSignal": "用户会比较贵不贵、够不够用、是否先试用、每天成本和复购压力。",
+      "risk": "用户很少讨论价格或规格,价格并非主要决策因素。",
+      "status": "未开始"
+    },
+    {
+      "id": "M012",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 性价比",
+      "keywordType": "价格词",
+      "batch": "P2",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H4"
+      ],
+      "purpose": "用户对价格、规格、价值感如何判断?",
+      "expectedSignal": "用户会比较贵不贵、够不够用、是否先试用、每天成本和复购压力。",
+      "risk": "用户很少讨论价格或规格,价格并非主要决策因素。",
+      "status": "未开始"
+    },
+    {
+      "id": "M013",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 种草",
+      "keywordType": "平台内容词",
+      "batch": "P1",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H5"
+      ],
+      "purpose": "哪些内容/平台影响用户决策?",
+      "expectedSignal": "用户会收藏、追问、转述或对比某类内容形式,例如测评、避坑、观察卡、清单和达人解释。",
+      "risk": "平台内容互动高但评论离题,或无法影响购买/咨询/收藏行为。",
+      "status": "未开始"
+    },
+    {
+      "id": "M014",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 达人推荐",
+      "keywordType": "平台内容词",
+      "batch": "P1",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H5"
+      ],
+      "purpose": "哪些内容/平台影响用户决策?",
+      "expectedSignal": "用户会收藏、追问、转述或对比某类内容形式,例如测评、避坑、观察卡、清单和达人解释。",
+      "risk": "平台内容互动高但评论离题,或无法影响购买/咨询/收藏行为。",
+      "status": "未开始"
+    },
+    {
+      "id": "M015",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 内容笔记",
+      "keywordType": "平台内容词",
+      "batch": "P2",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H5"
+      ],
+      "purpose": "哪些内容/平台影响用户决策?",
+      "expectedSignal": "用户会收藏、追问、转述或对比某类内容形式,例如测评、避坑、观察卡、清单和达人解释。",
+      "risk": "平台内容互动高但评论离题,或无法影响购买/咨询/收藏行为。",
+      "status": "未开始"
+    },
+    {
+      "id": "M016",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 竞品",
+      "keywordType": "竞品词",
+      "batch": "P1",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H6"
+      ],
+      "purpose": "竞品靠什么赢,哪里有漏洞?",
+      "expectedSignal": "用户会主动拿竞品比较效果、价格、包装、信任背书、渠道和使用体验。",
+      "risk": "用户没有明确竞品参照,或竞品比较主要来自营销号而非用户表达。",
+      "status": "未开始"
+    },
+    {
+      "id": "M017",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 替代品",
+      "keywordType": "竞品词",
+      "batch": "P1",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H6"
+      ],
+      "purpose": "竞品靠什么赢,哪里有漏洞?",
+      "expectedSignal": "用户会主动拿竞品比较效果、价格、包装、信任背书、渠道和使用体验。",
+      "risk": "用户没有明确竞品参照,或竞品比较主要来自营销号而非用户表达。",
+      "status": "未开始"
+    },
+    {
+      "id": "M018",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 对比",
+      "keywordType": "竞品词",
+      "batch": "P2",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H6"
+      ],
+      "purpose": "竞品靠什么赢,哪里有漏洞?",
+      "expectedSignal": "用户会主动拿竞品比较效果、价格、包装、信任背书、渠道和使用体验。",
+      "risk": "用户没有明确竞品参照,或竞品比较主要来自营销号而非用户表达。",
+      "status": "未开始"
+    },
+    {
+      "id": "M019",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 卖点",
+      "keywordType": "话术词",
+      "batch": "P1",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H7"
+      ],
+      "purpose": "什么话术、概念、定位更能打动用户?",
+      "expectedSignal": "用户会复述某些词、问法、标题或卖点,也会反感夸大、玄学和看不懂的表达。",
+      "risk": "用户表达没有稳定词汇,或话术偏好与平台互动指标不一致。",
+      "status": "未开始"
+    },
+    {
+      "id": "M020",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 定位",
+      "keywordType": "话术词",
+      "batch": "P1",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H7"
+      ],
+      "purpose": "什么话术、概念、定位更能打动用户?",
+      "expectedSignal": "用户会复述某些词、问法、标题或卖点,也会反感夸大、玄学和看不懂的表达。",
+      "risk": "用户表达没有稳定词汇,或话术偏好与平台互动指标不一致。",
+      "status": "未开始"
+    },
+    {
+      "id": "M021",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 话术",
+      "keywordType": "话术词",
+      "batch": "P2",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H7"
+      ],
+      "purpose": "什么话术、概念、定位更能打动用户?",
+      "expectedSignal": "用户会复述某些词、问法、标题或卖点,也会反感夸大、玄学和看不懂的表达。",
+      "risk": "用户表达没有稳定词汇,或话术偏好与平台互动指标不一致。",
+      "status": "未开始"
+    },
+    {
+      "id": "M022",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 复购",
+      "keywordType": "行动词",
+      "batch": "P2",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H8"
+      ],
+      "purpose": "下阶段最应该做哪些动作?",
+      "expectedSignal": "用户会给出复购、推荐、咨询、犹豫、放弃和改进建议等行动信号。",
+      "risk": "VOC 只能描述现象,无法转成明确动作或验证指标。",
+      "status": "未开始"
+    },
+    {
+      "id": "M023",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 推荐",
+      "keywordType": "行动词",
+      "batch": "P2",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H8"
+      ],
+      "purpose": "下阶段最应该做哪些动作?",
+      "expectedSignal": "用户会给出复购、推荐、咨询、犹豫、放弃和改进建议等行动信号。",
+      "risk": "VOC 只能描述现象,无法转成明确动作或验证指标。",
+      "status": "未开始"
+    },
+    {
+      "id": "M024",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 转化",
+      "keywordType": "行动词",
+      "batch": "P2",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H8"
+      ],
+      "purpose": "下阶段最应该做哪些动作?",
+      "expectedSignal": "用户会给出复购、推荐、咨询、犹豫、放弃和改进建议等行动信号。",
+      "risk": "VOC 只能描述现象,无法转成明确动作或验证指标。",
+      "status": "未开始"
+    }
+  ],
+  "audit": {
+    "byHypothesis": {
+      "H1": [
+        "冻干益生菌 市场机会",
+        "冻干益生菌 值不值得买",
+        "冻干益生菌 趋势"
+      ],
+      "H2": [
+        "冻干益生菌 使用场景",
+        "冻干益生菌 痛点",
+        "冻干益生菌 人群"
+      ],
+      "H3": [
+        "冻干益生菌 怎么选",
+        "冻干益生菌 配方",
+        "冻干益生菌 产品缺点"
+      ],
+      "H4": [
+        "冻干益生菌 价格",
+        "冻干益生菌 规格",
+        "冻干益生菌 性价比"
+      ],
+      "H5": [
+        "冻干益生菌 种草",
+        "冻干益生菌 达人推荐",
+        "冻干益生菌 内容笔记"
+      ],
+      "H6": [
+        "冻干益生菌 竞品",
+        "冻干益生菌 替代品",
+        "冻干益生菌 对比"
+      ],
+      "H7": [
+        "冻干益生菌 卖点",
+        "冻干益生菌 定位",
+        "冻干益生菌 话术"
+      ],
+      "H8": [
+        "冻干益生菌 复购",
+        "冻干益生菌 推荐",
+        "冻干益生菌 转化"
+      ]
+    },
+    "warnings": []
+  }
+}

+ 158 - 0
demo/xiaohongshu/hypothesis/1.Hypothesis.md

@@ -0,0 +1,158 @@
+# 1. VOC H1-H8 假设
+
+## 1. 项目上下文
+
+| 字段 | 内容 |
+|---|---|
+| 品类 | 冻干益生菌 |
+| 品牌 | 青禾轻养 |
+| 产品 | 青禾轻养冻干益生菌 |
+| 决策问题 | 小红书用户为什么选择或放弃冻干益生菌,下一步产品和内容应该优先验证什么? |
+| 目标用户 | 家长、打工人、老人照护者、测评用户 |
+| 目标渠道 | 小红书 |
+| 已知竞品 | 进口益生菌、儿童益生菌竞品 |
+| 报告粒度 | 轻量 4 章 |
+
+## 2. 假设总览
+
+| 假设 | 方向 | 核心问题 | 验证状态 | 证据强度 |
+|---|---|---|---|---|
+| H1 | 品类机会 | 市场是否值得进入/加码? | 未验证 | 低 |
+| H2 | 用户需求 | 用户真实痛点和高频场景是什么? | 未验证 | 低 |
+| H3 | 产品缺口 | 当前产品/竞品哪里没有满足? | 未验证 | 低 |
+| H4 | 价格认知 | 用户对价格、规格、价值感如何判断? | 未验证 | 低 |
+| H5 | 渠道内容 | 哪些内容/平台影响用户决策? | 未验证 | 低 |
+| H6 | 竞品策略 | 竞品靠什么赢,哪里有漏洞? | 未验证 | 低 |
+| H7 | 定位表达 | 什么话术、概念、定位更能打动用户? | 未验证 | 低 |
+| H8 | 增长行动 | 下阶段最应该做哪些动作? | 未验证 | 低 |
+
+## 3. 假设展开卡
+
+### H1 品类机会
+
+| 字段 | 填写 |
+|---|---|
+| 假设表述 | 冻干益生菌 的机会来自用户对现有方案仍有未满足需求,青禾轻养 可以通过更清晰的产品解释和场景切入获得机会。 |
+| 对应决策问题 | 小红书用户为什么选择或放弃冻干益生菌,下一步产品和内容应该优先验证什么? |
+| 需要验证的用户表达 | 用户会主动表达为什么搜索、购买、踩雷或重新选择 冻干益生菌。 |
+| 需要覆盖的平台 | 小红书 |
+| 关键词方向 | 冻干益生菌 市场机会、冻干益生菌 值不值得买、冻干益生菌 趋势、冻干益生菌 痛点 |
+| 支持证据标准 | 至少 30 条 VOC 能解释进入动机、现有不满和机会窗口。 |
+| 反证信号 | 用户讨论稀少,或高频表达显示 冻干益生菌 需求已被现有方案充分满足。 |
+| 报告映射 | 轻量报告 Ch1 / 企业报告 Ch1-Ch2 |
+| 最终判断 | 未验证 |
+
+### H2 用户需求
+
+| 字段 | 填写 |
+|---|---|
+| 假设表述 | 家长、打工人、老人照护者、测评用户 对 冻干益生菌 的需求不是抽象功能,而是被具体场景、症状、任务或生活时刻触发。 |
+| 对应决策问题 | 小红书用户为什么选择或放弃冻干益生菌,下一步产品和内容应该优先验证什么? |
+| 需要验证的用户表达 | 用户会说出具体使用前后情境、触发原因、焦虑和选择门槛。 |
+| 需要覆盖的平台 | 小红书 |
+| 关键词方向 | 冻干益生菌 使用场景、冻干益生菌 痛点、冻干益生菌 人群、冻干益生菌 怎么用 |
+| 支持证据标准 | 至少 50 条 VOC 能聚类出 3 个以上高频场景或痛点。 |
+| 反证信号 | 评论集中在泛泛夸奖、抽奖、广告或无场景表达,无法形成稳定需求结构。 |
+| 报告映射 | 轻量报告 Ch2 / 企业报告 Ch2-Ch3 |
+| 最终判断 | 未验证 |
+
+### H3 产品缺口
+
+| 字段 | 填写 |
+|---|---|
+| 假设表述 | 青禾轻养冻干益生菌 的产品机会来自用户对配方、体验、包装、说明、服务或使用边界的不满。 |
+| 对应决策问题 | 小红书用户为什么选择或放弃冻干益生菌,下一步产品和内容应该优先验证什么? |
+| 需要验证的用户表达 | 用户会提到“不好用/看不懂/不方便/不适合/客服讲不清”等具体缺口。 |
+| 需要覆盖的平台 | 小红书 |
+| 关键词方向 | 冻干益生菌 怎么选、冻干益生菌 配方、冻干益生菌 产品缺点、青禾轻养冻干益生菌 测评 |
+| 支持证据标准 | 至少 30 条 VOC 能归纳 3 类产品缺口,并能映射到产品或详情页动作。 |
+| 反证信号 | 负面反馈高度分散,无法证明存在稳定产品缺口。 |
+| 报告映射 | 轻量报告 Ch2-Ch4 / 企业报告 Ch3-Ch5 |
+| 最终判断 | 未验证 |
+
+### H4 价格认知
+
+| 字段 | 填写 |
+|---|---|
+| 假设表述 | 用户对 冻干益生菌 的价格接受度取决于规格、使用周期、风险感和可验证效果,而不只是绝对价格。 |
+| 对应决策问题 | 小红书用户为什么选择或放弃冻干益生菌,下一步产品和内容应该优先验证什么? |
+| 需要验证的用户表达 | 用户会比较贵不贵、够不够用、是否先试用、每天成本和复购压力。 |
+| 需要覆盖的平台 | 小红书 |
+| 关键词方向 | 冻干益生菌 价格、冻干益生菌 规格、冻干益生菌 性价比、冻干益生菌 试用装 |
+| 支持证据标准 | 至少 20 条 VOC 能说明价格带、规格偏好或试用/复购路径。 |
+| 反证信号 | 用户很少讨论价格或规格,价格并非主要决策因素。 |
+| 报告映射 | 轻量报告 Ch3-Ch4 / 企业报告 Ch4-Ch5 |
+| 最终判断 | 未验证 |
+
+### H5 渠道内容
+
+| 字段 | 填写 |
+|---|---|
+| 假设表述 | 小红书 上真正影响用户决策的内容不是单纯曝光,而是能降低理解成本和风险感的内容。 |
+| 对应决策问题 | 小红书用户为什么选择或放弃冻干益生菌,下一步产品和内容应该优先验证什么? |
+| 需要验证的用户表达 | 用户会收藏、追问、转述或对比某类内容形式,例如测评、避坑、观察卡、清单和达人解释。 |
+| 需要覆盖的平台 | 小红书 |
+| 关键词方向 | 冻干益生菌 种草、冻干益生菌 达人推荐、冻干益生菌 内容笔记、冻干益生菌 避坑 |
+| 支持证据标准 | 至少 20 条 VOC 或内容样本能识别 3 类有效内容形式。 |
+| 反证信号 | 平台内容互动高但评论离题,或无法影响购买/咨询/收藏行为。 |
+| 报告映射 | 轻量报告 Ch3 / 企业报告 Ch5-Ch6 |
+| 最终判断 | 未验证 |
+
+### H6 竞品策略
+
+| 字段 | 填写 |
+|---|---|
+| 假设表述 | 进口益生菌、儿童益生菌竞品 的优势和漏洞会在用户对比、替代和吐槽中暴露,青禾轻养 可以找到差异化切口。 |
+| 对应决策问题 | 小红书用户为什么选择或放弃冻干益生菌,下一步产品和内容应该优先验证什么? |
+| 需要验证的用户表达 | 用户会主动拿竞品比较效果、价格、包装、信任背书、渠道和使用体验。 |
+| 需要覆盖的平台 | 小红书 |
+| 关键词方向 | 冻干益生菌 竞品、冻干益生菌 替代品、冻干益生菌 对比、进口益生菌 |
+| 支持证据标准 | 每个主要竞品至少 20 条 VOC,能说明赢点、输点和替代原因。 |
+| 反证信号 | 用户没有明确竞品参照,或竞品比较主要来自营销号而非用户表达。 |
+| 报告映射 | 轻量报告 Ch3 / 企业报告 Ch4-Ch5 |
+| 最终判断 | 未验证 |
+
+### H7 定位表达
+
+| 字段 | 填写 |
+|---|---|
+| 假设表述 | 青禾轻养冻干益生菌 更容易被接受的表达应来自用户原话,把专业参数翻译成场景、结果、边界和选择标准。 |
+| 对应决策问题 | 小红书用户为什么选择或放弃冻干益生菌,下一步产品和内容应该优先验证什么? |
+| 需要验证的用户表达 | 用户会复述某些词、问法、标题或卖点,也会反感夸大、玄学和看不懂的表达。 |
+| 需要覆盖的平台 | 小红书 |
+| 关键词方向 | 冻干益生菌 卖点、冻干益生菌 定位、冻干益生菌 话术、冻干益生菌 标题 |
+| 支持证据标准 | 至少 30 条 VOC 能抽取用户高频词、反感词和可测试话术。 |
+| 反证信号 | 用户表达没有稳定词汇,或话术偏好与平台互动指标不一致。 |
+| 报告映射 | 轻量报告 Ch3-Ch4 / 企业报告 Ch5 |
+| 最终判断 | 未验证 |
+
+### H8 增长行动
+
+| 字段 | 填写 |
+|---|---|
+| 假设表述 | 下一阶段行动应优先选择能最快验证 冻干益生菌 需求、产品缺口和内容表达的 P0 动作。 |
+| 对应决策问题 | 小红书用户为什么选择或放弃冻干益生菌,下一步产品和内容应该优先验证什么? |
+| 需要验证的用户表达 | 用户会给出复购、推荐、咨询、犹豫、放弃和改进建议等行动信号。 |
+| 需要覆盖的平台 | 小红书 |
+| 关键词方向 | 冻干益生菌 复购、冻干益生菌 推荐、冻干益生菌 转化、冻干益生菌 咨询 |
+| 支持证据标准 | 至少 20 条 VOC 能支撑 P0/P1/P2 行动建议和验证指标。 |
+| 反证信号 | VOC 只能描述现象,无法转成明确动作或验证指标。 |
+| 报告映射 | 轻量报告 Ch4 / 企业报告 Ch7 |
+| 最终判断 | 未验证 |
+
+## 4. 假设到采集矩阵映射
+
+| 假设 | 推荐关键词类型 | 推荐平台 | 最低证据量 | 备注 |
+|---|---|---|---:|---|
+| H1 | 品类词 | 小红书 | 30 条 VOC | 冻干益生菌 市场机会、冻干益生菌 值不值得买、冻干益生菌 趋势 |
+| H2 | 场景词 | 小红书 | 50 条 VOC | 冻干益生菌 使用场景、冻干益生菌 痛点、冻干益生菌 人群 |
+| H3 | 产品词 | 小红书 | 30 条 VOC | 冻干益生菌 怎么选、冻干益生菌 配方、冻干益生菌 产品缺点 |
+| H4 | 价格词 | 小红书 | 20 条 VOC | 冻干益生菌 价格、冻干益生菌 规格、冻干益生菌 性价比 |
+| H5 | 平台内容词 | 小红书 | 20 条 VOC | 冻干益生菌 种草、冻干益生菌 达人推荐、冻干益生菌 内容笔记 |
+| H6 | 竞品词 | 小红书 | 20 条 VOC | 冻干益生菌 竞品、冻干益生菌 替代品、冻干益生菌 对比 |
+| H7 | 话术词 | 小红书 | 30 条 VOC | 冻干益生菌 卖点、冻干益生菌 定位、冻干益生菌 话术 |
+| H8 | 行动词 | 小红书 | 20 条 VOC | 冻干益生菌 复购、冻干益生菌 推荐、冻干益生菌 转化 |
+
+## 5. Builder 输入
+
+- `hypothesis.json` 中的 `keywords` 数组可直接作为 `collection-matrix-builder` 输入。

+ 485 - 0
demo/xiaohongshu/hypothesis/hypothesis.json

@@ -0,0 +1,485 @@
+{
+  "metadata": {
+    "project": "冻干益生菌",
+    "generatedAt": "2026-04-29T13:39:48.408Z",
+    "granularity": "light",
+    "hypothesisCount": 8,
+    "keywordCount": 24
+  },
+  "context": {
+    "category": "冻干益生菌",
+    "brand": "青禾轻养",
+    "product": "青禾轻养冻干益生菌",
+    "question": "小红书用户为什么选择或放弃冻干益生菌,下一步产品和内容应该优先验证什么?",
+    "audience": "家长、打工人、老人照护者、测评用户",
+    "channels": [
+      "小红书"
+    ],
+    "competitors": [
+      "进口益生菌",
+      "儿童益生菌竞品"
+    ],
+    "granularity": "light",
+    "generatedAt": "2026-04-29T13:39:48.408Z"
+  },
+  "hypotheses": [
+    {
+      "tag": "H1",
+      "direction": "品类机会",
+      "coreQuestion": "市场是否值得进入/加码?",
+      "assumption": "冻干益生菌 的机会来自用户对现有方案仍有未满足需求,青禾轻养 可以通过更清晰的产品解释和场景切入获得机会。",
+      "userExpression": "用户会主动表达为什么搜索、购买、踩雷或重新选择 冻干益生菌。",
+      "platforms": [
+        "小红书"
+      ],
+      "keywordDirections": [
+        "冻干益生菌 市场机会",
+        "冻干益生菌 值不值得买",
+        "冻干益生菌 趋势",
+        "冻干益生菌 痛点"
+      ],
+      "evidenceStandard": "至少 30 条 VOC 能解释进入动机、现有不满和机会窗口。",
+      "counterSignal": "用户讨论稀少,或高频表达显示 冻干益生菌 需求已被现有方案充分满足。",
+      "finalJudgement": "未验证",
+      "evidenceStrength": "低",
+      "reportMapping": "轻量报告 Ch1 / 企业报告 Ch1-Ch2"
+    },
+    {
+      "tag": "H2",
+      "direction": "用户需求",
+      "coreQuestion": "用户真实痛点和高频场景是什么?",
+      "assumption": "家长、打工人、老人照护者、测评用户 对 冻干益生菌 的需求不是抽象功能,而是被具体场景、症状、任务或生活时刻触发。",
+      "userExpression": "用户会说出具体使用前后情境、触发原因、焦虑和选择门槛。",
+      "platforms": [
+        "小红书"
+      ],
+      "keywordDirections": [
+        "冻干益生菌 使用场景",
+        "冻干益生菌 痛点",
+        "冻干益生菌 人群",
+        "冻干益生菌 怎么用"
+      ],
+      "evidenceStandard": "至少 50 条 VOC 能聚类出 3 个以上高频场景或痛点。",
+      "counterSignal": "评论集中在泛泛夸奖、抽奖、广告或无场景表达,无法形成稳定需求结构。",
+      "finalJudgement": "未验证",
+      "evidenceStrength": "低",
+      "reportMapping": "轻量报告 Ch2 / 企业报告 Ch2-Ch3"
+    },
+    {
+      "tag": "H3",
+      "direction": "产品缺口",
+      "coreQuestion": "当前产品/竞品哪里没有满足?",
+      "assumption": "青禾轻养冻干益生菌 的产品机会来自用户对配方、体验、包装、说明、服务或使用边界的不满。",
+      "userExpression": "用户会提到“不好用/看不懂/不方便/不适合/客服讲不清”等具体缺口。",
+      "platforms": [
+        "小红书"
+      ],
+      "keywordDirections": [
+        "冻干益生菌 怎么选",
+        "冻干益生菌 配方",
+        "冻干益生菌 产品缺点",
+        "青禾轻养冻干益生菌 测评"
+      ],
+      "evidenceStandard": "至少 30 条 VOC 能归纳 3 类产品缺口,并能映射到产品或详情页动作。",
+      "counterSignal": "负面反馈高度分散,无法证明存在稳定产品缺口。",
+      "finalJudgement": "未验证",
+      "evidenceStrength": "低",
+      "reportMapping": "轻量报告 Ch2-Ch4 / 企业报告 Ch3-Ch5"
+    },
+    {
+      "tag": "H4",
+      "direction": "价格认知",
+      "coreQuestion": "用户对价格、规格、价值感如何判断?",
+      "assumption": "用户对 冻干益生菌 的价格接受度取决于规格、使用周期、风险感和可验证效果,而不只是绝对价格。",
+      "userExpression": "用户会比较贵不贵、够不够用、是否先试用、每天成本和复购压力。",
+      "platforms": [
+        "小红书"
+      ],
+      "keywordDirections": [
+        "冻干益生菌 价格",
+        "冻干益生菌 规格",
+        "冻干益生菌 性价比",
+        "冻干益生菌 试用装"
+      ],
+      "evidenceStandard": "至少 20 条 VOC 能说明价格带、规格偏好或试用/复购路径。",
+      "counterSignal": "用户很少讨论价格或规格,价格并非主要决策因素。",
+      "finalJudgement": "未验证",
+      "evidenceStrength": "低",
+      "reportMapping": "轻量报告 Ch3-Ch4 / 企业报告 Ch4-Ch5"
+    },
+    {
+      "tag": "H5",
+      "direction": "渠道内容",
+      "coreQuestion": "哪些内容/平台影响用户决策?",
+      "assumption": "小红书 上真正影响用户决策的内容不是单纯曝光,而是能降低理解成本和风险感的内容。",
+      "userExpression": "用户会收藏、追问、转述或对比某类内容形式,例如测评、避坑、观察卡、清单和达人解释。",
+      "platforms": [
+        "小红书"
+      ],
+      "keywordDirections": [
+        "冻干益生菌 种草",
+        "冻干益生菌 达人推荐",
+        "冻干益生菌 内容笔记",
+        "冻干益生菌 避坑"
+      ],
+      "evidenceStandard": "至少 20 条 VOC 或内容样本能识别 3 类有效内容形式。",
+      "counterSignal": "平台内容互动高但评论离题,或无法影响购买/咨询/收藏行为。",
+      "finalJudgement": "未验证",
+      "evidenceStrength": "低",
+      "reportMapping": "轻量报告 Ch3 / 企业报告 Ch5-Ch6"
+    },
+    {
+      "tag": "H6",
+      "direction": "竞品策略",
+      "coreQuestion": "竞品靠什么赢,哪里有漏洞?",
+      "assumption": "进口益生菌、儿童益生菌竞品 的优势和漏洞会在用户对比、替代和吐槽中暴露,青禾轻养 可以找到差异化切口。",
+      "userExpression": "用户会主动拿竞品比较效果、价格、包装、信任背书、渠道和使用体验。",
+      "platforms": [
+        "小红书"
+      ],
+      "keywordDirections": [
+        "冻干益生菌 竞品",
+        "冻干益生菌 替代品",
+        "冻干益生菌 对比",
+        "进口益生菌"
+      ],
+      "evidenceStandard": "每个主要竞品至少 20 条 VOC,能说明赢点、输点和替代原因。",
+      "counterSignal": "用户没有明确竞品参照,或竞品比较主要来自营销号而非用户表达。",
+      "finalJudgement": "未验证",
+      "evidenceStrength": "低",
+      "reportMapping": "轻量报告 Ch3 / 企业报告 Ch4-Ch5"
+    },
+    {
+      "tag": "H7",
+      "direction": "定位表达",
+      "coreQuestion": "什么话术、概念、定位更能打动用户?",
+      "assumption": "青禾轻养冻干益生菌 更容易被接受的表达应来自用户原话,把专业参数翻译成场景、结果、边界和选择标准。",
+      "userExpression": "用户会复述某些词、问法、标题或卖点,也会反感夸大、玄学和看不懂的表达。",
+      "platforms": [
+        "小红书"
+      ],
+      "keywordDirections": [
+        "冻干益生菌 卖点",
+        "冻干益生菌 定位",
+        "冻干益生菌 话术",
+        "冻干益生菌 标题"
+      ],
+      "evidenceStandard": "至少 30 条 VOC 能抽取用户高频词、反感词和可测试话术。",
+      "counterSignal": "用户表达没有稳定词汇,或话术偏好与平台互动指标不一致。",
+      "finalJudgement": "未验证",
+      "evidenceStrength": "低",
+      "reportMapping": "轻量报告 Ch3-Ch4 / 企业报告 Ch5"
+    },
+    {
+      "tag": "H8",
+      "direction": "增长行动",
+      "coreQuestion": "下阶段最应该做哪些动作?",
+      "assumption": "下一阶段行动应优先选择能最快验证 冻干益生菌 需求、产品缺口和内容表达的 P0 动作。",
+      "userExpression": "用户会给出复购、推荐、咨询、犹豫、放弃和改进建议等行动信号。",
+      "platforms": [
+        "小红书"
+      ],
+      "keywordDirections": [
+        "冻干益生菌 复购",
+        "冻干益生菌 推荐",
+        "冻干益生菌 转化",
+        "冻干益生菌 咨询"
+      ],
+      "evidenceStandard": "至少 20 条 VOC 能支撑 P0/P1/P2 行动建议和验证指标。",
+      "counterSignal": "VOC 只能描述现象,无法转成明确动作或验证指标。",
+      "finalJudgement": "未验证",
+      "evidenceStrength": "低",
+      "reportMapping": "轻量报告 Ch4 / 企业报告 Ch7"
+    }
+  ],
+  "keywords": [
+    {
+      "keyword": "冻干益生菌 市场机会",
+      "keywordType": "品类词",
+      "batch": "P0",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H1"
+      ],
+      "purpose": "市场是否值得进入/加码?",
+      "expectedSignal": "用户会主动表达为什么搜索、购买、踩雷或重新选择 冻干益生菌。",
+      "risk": "用户讨论稀少,或高频表达显示 冻干益生菌 需求已被现有方案充分满足。"
+    },
+    {
+      "keyword": "冻干益生菌 值不值得买",
+      "keywordType": "品类词",
+      "batch": "P1",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H1"
+      ],
+      "purpose": "市场是否值得进入/加码?",
+      "expectedSignal": "用户会主动表达为什么搜索、购买、踩雷或重新选择 冻干益生菌。",
+      "risk": "用户讨论稀少,或高频表达显示 冻干益生菌 需求已被现有方案充分满足。"
+    },
+    {
+      "keyword": "冻干益生菌 趋势",
+      "keywordType": "品类词",
+      "batch": "P2",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H1"
+      ],
+      "purpose": "市场是否值得进入/加码?",
+      "expectedSignal": "用户会主动表达为什么搜索、购买、踩雷或重新选择 冻干益生菌。",
+      "risk": "用户讨论稀少,或高频表达显示 冻干益生菌 需求已被现有方案充分满足。"
+    },
+    {
+      "keyword": "冻干益生菌 使用场景",
+      "keywordType": "场景词",
+      "batch": "P0",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H2"
+      ],
+      "purpose": "用户真实痛点和高频场景是什么?",
+      "expectedSignal": "用户会说出具体使用前后情境、触发原因、焦虑和选择门槛。",
+      "risk": "评论集中在泛泛夸奖、抽奖、广告或无场景表达,无法形成稳定需求结构。"
+    },
+    {
+      "keyword": "冻干益生菌 痛点",
+      "keywordType": "场景词",
+      "batch": "P1",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H2"
+      ],
+      "purpose": "用户真实痛点和高频场景是什么?",
+      "expectedSignal": "用户会说出具体使用前后情境、触发原因、焦虑和选择门槛。",
+      "risk": "评论集中在泛泛夸奖、抽奖、广告或无场景表达,无法形成稳定需求结构。"
+    },
+    {
+      "keyword": "冻干益生菌 人群",
+      "keywordType": "场景词",
+      "batch": "P2",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H2"
+      ],
+      "purpose": "用户真实痛点和高频场景是什么?",
+      "expectedSignal": "用户会说出具体使用前后情境、触发原因、焦虑和选择门槛。",
+      "risk": "评论集中在泛泛夸奖、抽奖、广告或无场景表达,无法形成稳定需求结构。"
+    },
+    {
+      "keyword": "冻干益生菌 怎么选",
+      "keywordType": "产品词",
+      "batch": "P0",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H3"
+      ],
+      "purpose": "当前产品/竞品哪里没有满足?",
+      "expectedSignal": "用户会提到“不好用/看不懂/不方便/不适合/客服讲不清”等具体缺口。",
+      "risk": "负面反馈高度分散,无法证明存在稳定产品缺口。"
+    },
+    {
+      "keyword": "冻干益生菌 配方",
+      "keywordType": "产品词",
+      "batch": "P1",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H3"
+      ],
+      "purpose": "当前产品/竞品哪里没有满足?",
+      "expectedSignal": "用户会提到“不好用/看不懂/不方便/不适合/客服讲不清”等具体缺口。",
+      "risk": "负面反馈高度分散,无法证明存在稳定产品缺口。"
+    },
+    {
+      "keyword": "冻干益生菌 产品缺点",
+      "keywordType": "产品词",
+      "batch": "P2",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H3"
+      ],
+      "purpose": "当前产品/竞品哪里没有满足?",
+      "expectedSignal": "用户会提到“不好用/看不懂/不方便/不适合/客服讲不清”等具体缺口。",
+      "risk": "负面反馈高度分散,无法证明存在稳定产品缺口。"
+    },
+    {
+      "keyword": "冻干益生菌 价格",
+      "keywordType": "价格词",
+      "batch": "P1",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H4"
+      ],
+      "purpose": "用户对价格、规格、价值感如何判断?",
+      "expectedSignal": "用户会比较贵不贵、够不够用、是否先试用、每天成本和复购压力。",
+      "risk": "用户很少讨论价格或规格,价格并非主要决策因素。"
+    },
+    {
+      "keyword": "冻干益生菌 规格",
+      "keywordType": "价格词",
+      "batch": "P1",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H4"
+      ],
+      "purpose": "用户对价格、规格、价值感如何判断?",
+      "expectedSignal": "用户会比较贵不贵、够不够用、是否先试用、每天成本和复购压力。",
+      "risk": "用户很少讨论价格或规格,价格并非主要决策因素。"
+    },
+    {
+      "keyword": "冻干益生菌 性价比",
+      "keywordType": "价格词",
+      "batch": "P2",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H4"
+      ],
+      "purpose": "用户对价格、规格、价值感如何判断?",
+      "expectedSignal": "用户会比较贵不贵、够不够用、是否先试用、每天成本和复购压力。",
+      "risk": "用户很少讨论价格或规格,价格并非主要决策因素。"
+    },
+    {
+      "keyword": "冻干益生菌 种草",
+      "keywordType": "平台内容词",
+      "batch": "P1",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H5"
+      ],
+      "purpose": "哪些内容/平台影响用户决策?",
+      "expectedSignal": "用户会收藏、追问、转述或对比某类内容形式,例如测评、避坑、观察卡、清单和达人解释。",
+      "risk": "平台内容互动高但评论离题,或无法影响购买/咨询/收藏行为。"
+    },
+    {
+      "keyword": "冻干益生菌 达人推荐",
+      "keywordType": "平台内容词",
+      "batch": "P1",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H5"
+      ],
+      "purpose": "哪些内容/平台影响用户决策?",
+      "expectedSignal": "用户会收藏、追问、转述或对比某类内容形式,例如测评、避坑、观察卡、清单和达人解释。",
+      "risk": "平台内容互动高但评论离题,或无法影响购买/咨询/收藏行为。"
+    },
+    {
+      "keyword": "冻干益生菌 内容笔记",
+      "keywordType": "平台内容词",
+      "batch": "P2",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H5"
+      ],
+      "purpose": "哪些内容/平台影响用户决策?",
+      "expectedSignal": "用户会收藏、追问、转述或对比某类内容形式,例如测评、避坑、观察卡、清单和达人解释。",
+      "risk": "平台内容互动高但评论离题,或无法影响购买/咨询/收藏行为。"
+    },
+    {
+      "keyword": "冻干益生菌 竞品",
+      "keywordType": "竞品词",
+      "batch": "P1",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H6"
+      ],
+      "purpose": "竞品靠什么赢,哪里有漏洞?",
+      "expectedSignal": "用户会主动拿竞品比较效果、价格、包装、信任背书、渠道和使用体验。",
+      "risk": "用户没有明确竞品参照,或竞品比较主要来自营销号而非用户表达。"
+    },
+    {
+      "keyword": "冻干益生菌 替代品",
+      "keywordType": "竞品词",
+      "batch": "P1",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H6"
+      ],
+      "purpose": "竞品靠什么赢,哪里有漏洞?",
+      "expectedSignal": "用户会主动拿竞品比较效果、价格、包装、信任背书、渠道和使用体验。",
+      "risk": "用户没有明确竞品参照,或竞品比较主要来自营销号而非用户表达。"
+    },
+    {
+      "keyword": "冻干益生菌 对比",
+      "keywordType": "竞品词",
+      "batch": "P2",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H6"
+      ],
+      "purpose": "竞品靠什么赢,哪里有漏洞?",
+      "expectedSignal": "用户会主动拿竞品比较效果、价格、包装、信任背书、渠道和使用体验。",
+      "risk": "用户没有明确竞品参照,或竞品比较主要来自营销号而非用户表达。"
+    },
+    {
+      "keyword": "冻干益生菌 卖点",
+      "keywordType": "话术词",
+      "batch": "P1",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H7"
+      ],
+      "purpose": "什么话术、概念、定位更能打动用户?",
+      "expectedSignal": "用户会复述某些词、问法、标题或卖点,也会反感夸大、玄学和看不懂的表达。",
+      "risk": "用户表达没有稳定词汇,或话术偏好与平台互动指标不一致。"
+    },
+    {
+      "keyword": "冻干益生菌 定位",
+      "keywordType": "话术词",
+      "batch": "P1",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H7"
+      ],
+      "purpose": "什么话术、概念、定位更能打动用户?",
+      "expectedSignal": "用户会复述某些词、问法、标题或卖点,也会反感夸大、玄学和看不懂的表达。",
+      "risk": "用户表达没有稳定词汇,或话术偏好与平台互动指标不一致。"
+    },
+    {
+      "keyword": "冻干益生菌 话术",
+      "keywordType": "话术词",
+      "batch": "P2",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H7"
+      ],
+      "purpose": "什么话术、概念、定位更能打动用户?",
+      "expectedSignal": "用户会复述某些词、问法、标题或卖点,也会反感夸大、玄学和看不懂的表达。",
+      "risk": "用户表达没有稳定词汇,或话术偏好与平台互动指标不一致。"
+    },
+    {
+      "keyword": "冻干益生菌 复购",
+      "keywordType": "行动词",
+      "batch": "P2",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H8"
+      ],
+      "purpose": "下阶段最应该做哪些动作?",
+      "expectedSignal": "用户会给出复购、推荐、咨询、犹豫、放弃和改进建议等行动信号。",
+      "risk": "VOC 只能描述现象,无法转成明确动作或验证指标。"
+    },
+    {
+      "keyword": "冻干益生菌 推荐",
+      "keywordType": "行动词",
+      "batch": "P2",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H8"
+      ],
+      "purpose": "下阶段最应该做哪些动作?",
+      "expectedSignal": "用户会给出复购、推荐、咨询、犹豫、放弃和改进建议等行动信号。",
+      "risk": "VOC 只能描述现象,无法转成明确动作或验证指标。"
+    },
+    {
+      "keyword": "冻干益生菌 转化",
+      "keywordType": "行动词",
+      "batch": "P2",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H8"
+      ],
+      "purpose": "下阶段最应该做哪些动作?",
+      "expectedSignal": "用户会给出复购、推荐、咨询、犹豫、放弃和改进建议等行动信号。",
+      "risk": "VOC 只能描述现象,无法转成明确动作或验证指标。"
+    }
+  ]
+}

+ 39 - 0
demo/xiaohongshu/keywords.template.md

@@ -0,0 +1,39 @@
+# 小红书 VOC 关键词矩阵模板
+
+> 用途:2 小时课开场 10 分钟完成关键词拆解,再用 `raw-notes.json` 与 `comments-flat.jsonl` 离线演示采集、归一、洞察和 mini report。
+
+## 课程 demo 主题
+
+- **品类**:冻干益生菌
+- **虚拟产品**:青禾轻养冻干益生菌
+- **平台**:小红书
+- **数据性质**:课程合成样例,不代表真实平台抓取结果
+
+## 关键词矩阵
+
+| batch | keyword | 关键词类型 | targetCount | hypothesisTags | purpose | expectedSignal | risk |
+|---|---|---|---:|---|---|---|---|
+| P0 | 儿童益生菌怎么选 | 长尾问题词 | 10 | H1,H3,H6 | 识别家长选择益生菌的核心标准 | 菌株、口味、安全、医生建议 | 大量科普号内容可能稀释真实用户表达 |
+| P0 | 益生菌腹胀便秘 | 痛点场景词 | 10 | H1,H2,H4 | 观察用户对胀气、便秘、见效周期的描述 | 见效慢、腹胀、排便规律、复购 | 症状表达主观,不能替代医学判断 |
+| P1 | 冻干益生菌测评 | 产品/竞品词 | 10 | H3,H5,H7 | 分析对比评测中的卖点、价格和包装偏好 | 活菌数、独立小条、冷链、性价比 | 测评号商业合作内容需要标注噪声 |
+
+## 学员填写区
+
+| batch | keyword | 关键词类型 | targetCount | hypothesisTags | purpose | expectedSignal | risk |
+|---|---|---|---:|---|---|---|---|
+|  |  |  |  |  |  |  |  |
+|  |  |  |  |  |  |  |  |
+|  |  |  |  |  |  |  |  |
+
+## H1-H8 假设标签参考
+
+| 标签 | 含义 | 示例问题 |
+|---|---|---|
+| H1 | 核心痛点 | 用户为什么开始搜索/购买? |
+| H2 | 使用场景 | 什么时刻、什么人群、什么症状触发? |
+| H3 | 购买决策 | 用户看重哪些参数、背书或渠道? |
+| H4 | 体验反馈 | 使用后有什么正负反馈? |
+| H5 | 竞品参照 | 用户拿谁对比,为什么转化或流失? |
+| H6 | 信任门槛 | 用户担心安全、配方、资质还是夸大宣传? |
+| H7 | 价格与规格 | 什么价格带、规格、组合更容易接受? |
+| H8 | 内容话术 | 哪些表达能被用户复述、收藏、转发? |

+ 71 - 0
demo/xiaohongshu/matrix/3.CollectionMatrix.md

@@ -0,0 +1,71 @@
+# 3. VOC 采集矩阵
+
+## 1. 采集目标
+
+| 字段 | 填写 |
+|---|---|
+| 项目名称 | xiaohongshu-course-demo |
+| 核心决策问题 | 小红书冻干益生菌课程采集矩阵 |
+| 覆盖平台 | 小红书 |
+| 计划采集周期 | 待确认 |
+| 目标原始样本数 | 180 |
+| 目标有效 VOC 数 | 180 |
+| 采集负责人 | 待确认 |
+
+## 2. 批次策略
+
+| 批次 | 用途 | 建议占比 | 启动条件 | 完成标准 |
+|---|---|---:|---|---|
+| P0 | 核心关键词和高置信方向 | 20%-30% | Intake 与 H1-H3 已确认 | 核心问题有初步证据 |
+| P1 | 竞品、场景、功效、痛点扩展 | 40%-50% | P0 噪声可控 | 主要假设都有样本覆盖 |
+| P2 | 长尾、异常、补证与反证 | 20%-30% | P0/P1 发现空白或矛盾 | 关键结论有反证检查 |
+
+## 3. 采集矩阵
+
+| id | platform | keyword | keywordType | batch | targetCount | hypothesisTags | purpose | expectedSignal | risk | status |
+|---|---|---|---|---|---:|---|---|---|---|---|
+| M001 | 小红书 | 儿童益生菌怎么选 | 长尾问题词 | P0 | 10 | H1,H3,H6 | 识别家长选择益生菌的核心标准 | 菌株、口味、安全、医生建议 | 大量科普号内容可能稀释真实用户表达 | 未开始 |
+| M002 | 小红书 | 益生菌腹胀便秘 | 痛点场景词 | P0 | 10 | H1,H2,H4 | 观察用户对胀气、便秘、见效周期的描述 | 见效慢、腹胀、排便规律、复购 | 症状表达主观,不能替代医学判断 | 未开始 |
+| M003 | 小红书 | 冻干益生菌测评 | 产品/竞品词 | P1 | 10 | H3,H5,H7 | 分析对比评测中的卖点、价格和包装偏好 | 活菌数、独立小条、冷链、性价比 | 测评号商业合作内容需要标注噪声 | 未开始 |
+| M004 | 小红书 | 冻干益生菌 市场机会 | 品类词 | P0 | 10 | H1 | 验证「冻干益生菌 市场机会」相关的品类、产品和购买决策信号 | 品类机会 | 自动补齐关键词,执行前需人工确认搜索噪声和业务相关性 | 待确认 |
+| M005 | 小红书 | 冻干益生菌 使用场景 | 场景词 | P0 | 10 | H2 | 识别「冻干益生菌 使用场景」相关的用户痛点、触发场景与真实表达 | 高频场景、痛点原声 | 自动补齐关键词,执行前需人工确认搜索噪声和业务相关性 | 待确认 |
+| M006 | 小红书 | 冻干益生菌 痛点 | 痛点场景词 | P0 | 10 | H2 | 识别「冻干益生菌 痛点」相关的用户痛点、触发场景与真实表达 | 高频场景、痛点原声 | 自动补齐关键词,执行前需人工确认搜索噪声和业务相关性 | 待确认 |
+| M007 | 小红书 | 冻干益生菌 怎么选 | 长尾问题词 | P0 | 10 | H3 | 验证「冻干益生菌 怎么选」相关的品类、产品和购买决策信号 | 产品参数、购买标准 | 自动补齐关键词,执行前需人工确认搜索噪声和业务相关性 | 待确认 |
+| M008 | 小红书 | 冻干益生菌 价格 | 价格词 | P1 | 10 | H4 | 观察「冻干益生菌 价格」相关的价格、规格和价值感判断 | 价格带、规格偏好 | 自动补齐关键词,执行前需人工确认搜索噪声和业务相关性 | 待确认 |
+| M009 | 小红书 | 冻干益生菌 规格 | 产品词 | P1 | 10 | H4 | 观察「冻干益生菌 规格」相关的价格、规格和价值感判断 | 价格带、规格偏好 | 自动补齐关键词,执行前需人工确认搜索噪声和业务相关性 | 待确认 |
+| M010 | 小红书 | 冻干益生菌 种草 | 平台内容词 | P1 | 10 | H5 | 验证「冻干益生菌 种草」相关的品类、产品和购买决策信号 | 内容形式、平台决策链路 | 自动补齐关键词,执行前需人工确认搜索噪声和业务相关性 | 待确认 |
+| M011 | 小红书 | 冻干益生菌 达人推荐 | 平台内容词 | P1 | 10 | H5 | 验证「冻干益生菌 达人推荐」相关的品类、产品和购买决策信号 | 内容形式、平台决策链路 | 自动补齐关键词,执行前需人工确认搜索噪声和业务相关性 | 待确认 |
+| M012 | 小红书 | 冻干益生菌 竞品 | 竞品词 | P1 | 10 | H6 | 分析「冻干益生菌 竞品」相关的竞品、替代方案和用户比较标准 | 竞品优劣势、替代原因 | 自动补齐关键词,执行前需人工确认搜索噪声和业务相关性 | 待确认 |
+| M013 | 小红书 | 冻干益生菌 替代品 | 竞品词 | P1 | 10 | H6 | 分析「冻干益生菌 替代品」相关的竞品、替代方案和用户比较标准 | 竞品优劣势、替代原因 | 自动补齐关键词,执行前需人工确认搜索噪声和业务相关性 | 待确认 |
+| M014 | 小红书 | 冻干益生菌 卖点 | 话术词 | P1 | 10 | H7 | 提炼「冻干益生菌 卖点」相关的定位、卖点和话术表达 | 用户复述话术、定位表达 | 自动补齐关键词,执行前需人工确认搜索噪声和业务相关性 | 待确认 |
+| M015 | 小红书 | 冻干益生菌 定位 | 话术词 | P1 | 10 | H7 | 提炼「冻干益生菌 定位」相关的定位、卖点和话术表达 | 用户复述话术、定位表达 | 自动补齐关键词,执行前需人工确认搜索噪声和业务相关性 | 待确认 |
+| M016 | 小红书 | 冻干益生菌 复购 | 行动词 | P2 | 10 | H8 | 验证「冻干益生菌 复购」相关的品类、产品和购买决策信号 | 行动建议、验证指标 | 自动补齐关键词,执行前需人工确认搜索噪声和业务相关性 | 待确认 |
+| M017 | 小红书 | 冻干益生菌 推荐 | 行动词 | P2 | 10 | H8 | 验证「冻干益生菌 推荐」相关的品类、产品和购买决策信号 | 行动建议、验证指标 | 自动补齐关键词,执行前需人工确认搜索噪声和业务相关性 | 待确认 |
+| M018 | 小红书 | 冻干益生菌 转化 | 行动词 | P2 | 10 | H8 | 验证「冻干益生菌 转化」相关的品类、产品和购买决策信号 | 行动建议、验证指标 | 自动补齐关键词,执行前需人工确认搜索噪声和业务相关性 | 待确认 |
+
+## 4. H1-H8 覆盖审计
+
+| 假设 | 关键词数 | 关键词 | 状态 |
+|---|---:|---|---|
+| H1 | 3 | 儿童益生菌怎么选、益生菌腹胀便秘、冻干益生菌 市场机会 | 通过 |
+| H2 | 3 | 益生菌腹胀便秘、冻干益生菌 使用场景、冻干益生菌 痛点 | 通过 |
+| H3 | 3 | 儿童益生菌怎么选、冻干益生菌测评、冻干益生菌 怎么选 | 通过 |
+| H4 | 3 | 益生菌腹胀便秘、冻干益生菌 价格、冻干益生菌 规格 | 通过 |
+| H5 | 3 | 冻干益生菌测评、冻干益生菌 种草、冻干益生菌 达人推荐 | 通过 |
+| H6 | 3 | 儿童益生菌怎么选、冻干益生菌 竞品、冻干益生菌 替代品 | 通过 |
+| H7 | 3 | 冻干益生菌测评、冻干益生菌 卖点、冻干益生菌 定位 | 通过 |
+| H8 | 3 | 冻干益生菌 复购、冻干益生菌 推荐、冻干益生菌 转化 | 通过 |
+
+## 5. 采集前检查
+
+| 检查项 | 标准 | 状态 |
+|---|---|---|
+| Token / credentials | 已预飞或确认可用 | 未检查 |
+| 单关键词小样本 | 每个平台至少试采 1 个关键词 | 未检查 |
+| 噪声评估 | 离题、高赞广告、重复内容可控 | 未检查 |
+| 去重口径 | ID、URL、正文相似度口径明确 | 未检查 |
+| 文件命名 | raw 文件命名与矩阵 id 可对应 | 未检查 |
+
+## 6. Builder 审计提示
+
+- **通过**:矩阵基础字段完整,假设覆盖达到当前规则。

+ 335 - 0
demo/xiaohongshu/matrix/collection-matrix.json

@@ -0,0 +1,335 @@
+{
+  "metadata": {
+    "project": "xiaohongshu-course-demo",
+    "generatedAt": "2026-04-29T13:35:12.395Z",
+    "platforms": [
+      "小红书"
+    ],
+    "keywordCount": 18,
+    "targetCount": 180,
+    "warningCount": 0
+  },
+  "matrix": [
+    {
+      "id": "M001",
+      "platform": "小红书",
+      "keyword": "儿童益生菌怎么选",
+      "keywordType": "长尾问题词",
+      "batch": "P0",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H1",
+        "H3",
+        "H6"
+      ],
+      "purpose": "识别家长选择益生菌的核心标准",
+      "expectedSignal": "菌株、口味、安全、医生建议",
+      "risk": "大量科普号内容可能稀释真实用户表达",
+      "status": "未开始"
+    },
+    {
+      "id": "M002",
+      "platform": "小红书",
+      "keyword": "益生菌腹胀便秘",
+      "keywordType": "痛点场景词",
+      "batch": "P0",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H1",
+        "H2",
+        "H4"
+      ],
+      "purpose": "观察用户对胀气、便秘、见效周期的描述",
+      "expectedSignal": "见效慢、腹胀、排便规律、复购",
+      "risk": "症状表达主观,不能替代医学判断",
+      "status": "未开始"
+    },
+    {
+      "id": "M003",
+      "platform": "小红书",
+      "keyword": "冻干益生菌测评",
+      "keywordType": "产品/竞品词",
+      "batch": "P1",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H3",
+        "H5",
+        "H7"
+      ],
+      "purpose": "分析对比评测中的卖点、价格和包装偏好",
+      "expectedSignal": "活菌数、独立小条、冷链、性价比",
+      "risk": "测评号商业合作内容需要标注噪声",
+      "status": "未开始"
+    },
+    {
+      "id": "M004",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 市场机会",
+      "keywordType": "品类词",
+      "batch": "P0",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H1"
+      ],
+      "purpose": "验证「冻干益生菌 市场机会」相关的品类、产品和购买决策信号",
+      "expectedSignal": "品类机会",
+      "risk": "自动补齐关键词,执行前需人工确认搜索噪声和业务相关性",
+      "status": "待确认"
+    },
+    {
+      "id": "M005",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 使用场景",
+      "keywordType": "场景词",
+      "batch": "P0",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H2"
+      ],
+      "purpose": "识别「冻干益生菌 使用场景」相关的用户痛点、触发场景与真实表达",
+      "expectedSignal": "高频场景、痛点原声",
+      "risk": "自动补齐关键词,执行前需人工确认搜索噪声和业务相关性",
+      "status": "待确认"
+    },
+    {
+      "id": "M006",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 痛点",
+      "keywordType": "痛点场景词",
+      "batch": "P0",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H2"
+      ],
+      "purpose": "识别「冻干益生菌 痛点」相关的用户痛点、触发场景与真实表达",
+      "expectedSignal": "高频场景、痛点原声",
+      "risk": "自动补齐关键词,执行前需人工确认搜索噪声和业务相关性",
+      "status": "待确认"
+    },
+    {
+      "id": "M007",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 怎么选",
+      "keywordType": "长尾问题词",
+      "batch": "P0",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H3"
+      ],
+      "purpose": "验证「冻干益生菌 怎么选」相关的品类、产品和购买决策信号",
+      "expectedSignal": "产品参数、购买标准",
+      "risk": "自动补齐关键词,执行前需人工确认搜索噪声和业务相关性",
+      "status": "待确认"
+    },
+    {
+      "id": "M008",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 价格",
+      "keywordType": "价格词",
+      "batch": "P1",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H4"
+      ],
+      "purpose": "观察「冻干益生菌 价格」相关的价格、规格和价值感判断",
+      "expectedSignal": "价格带、规格偏好",
+      "risk": "自动补齐关键词,执行前需人工确认搜索噪声和业务相关性",
+      "status": "待确认"
+    },
+    {
+      "id": "M009",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 规格",
+      "keywordType": "产品词",
+      "batch": "P1",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H4"
+      ],
+      "purpose": "观察「冻干益生菌 规格」相关的价格、规格和价值感判断",
+      "expectedSignal": "价格带、规格偏好",
+      "risk": "自动补齐关键词,执行前需人工确认搜索噪声和业务相关性",
+      "status": "待确认"
+    },
+    {
+      "id": "M010",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 种草",
+      "keywordType": "平台内容词",
+      "batch": "P1",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H5"
+      ],
+      "purpose": "验证「冻干益生菌 种草」相关的品类、产品和购买决策信号",
+      "expectedSignal": "内容形式、平台决策链路",
+      "risk": "自动补齐关键词,执行前需人工确认搜索噪声和业务相关性",
+      "status": "待确认"
+    },
+    {
+      "id": "M011",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 达人推荐",
+      "keywordType": "平台内容词",
+      "batch": "P1",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H5"
+      ],
+      "purpose": "验证「冻干益生菌 达人推荐」相关的品类、产品和购买决策信号",
+      "expectedSignal": "内容形式、平台决策链路",
+      "risk": "自动补齐关键词,执行前需人工确认搜索噪声和业务相关性",
+      "status": "待确认"
+    },
+    {
+      "id": "M012",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 竞品",
+      "keywordType": "竞品词",
+      "batch": "P1",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H6"
+      ],
+      "purpose": "分析「冻干益生菌 竞品」相关的竞品、替代方案和用户比较标准",
+      "expectedSignal": "竞品优劣势、替代原因",
+      "risk": "自动补齐关键词,执行前需人工确认搜索噪声和业务相关性",
+      "status": "待确认"
+    },
+    {
+      "id": "M013",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 替代品",
+      "keywordType": "竞品词",
+      "batch": "P1",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H6"
+      ],
+      "purpose": "分析「冻干益生菌 替代品」相关的竞品、替代方案和用户比较标准",
+      "expectedSignal": "竞品优劣势、替代原因",
+      "risk": "自动补齐关键词,执行前需人工确认搜索噪声和业务相关性",
+      "status": "待确认"
+    },
+    {
+      "id": "M014",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 卖点",
+      "keywordType": "话术词",
+      "batch": "P1",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H7"
+      ],
+      "purpose": "提炼「冻干益生菌 卖点」相关的定位、卖点和话术表达",
+      "expectedSignal": "用户复述话术、定位表达",
+      "risk": "自动补齐关键词,执行前需人工确认搜索噪声和业务相关性",
+      "status": "待确认"
+    },
+    {
+      "id": "M015",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 定位",
+      "keywordType": "话术词",
+      "batch": "P1",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H7"
+      ],
+      "purpose": "提炼「冻干益生菌 定位」相关的定位、卖点和话术表达",
+      "expectedSignal": "用户复述话术、定位表达",
+      "risk": "自动补齐关键词,执行前需人工确认搜索噪声和业务相关性",
+      "status": "待确认"
+    },
+    {
+      "id": "M016",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 复购",
+      "keywordType": "行动词",
+      "batch": "P2",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H8"
+      ],
+      "purpose": "验证「冻干益生菌 复购」相关的品类、产品和购买决策信号",
+      "expectedSignal": "行动建议、验证指标",
+      "risk": "自动补齐关键词,执行前需人工确认搜索噪声和业务相关性",
+      "status": "待确认"
+    },
+    {
+      "id": "M017",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 推荐",
+      "keywordType": "行动词",
+      "batch": "P2",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H8"
+      ],
+      "purpose": "验证「冻干益生菌 推荐」相关的品类、产品和购买决策信号",
+      "expectedSignal": "行动建议、验证指标",
+      "risk": "自动补齐关键词,执行前需人工确认搜索噪声和业务相关性",
+      "status": "待确认"
+    },
+    {
+      "id": "M018",
+      "platform": "小红书",
+      "keyword": "冻干益生菌 转化",
+      "keywordType": "行动词",
+      "batch": "P2",
+      "targetCount": 10,
+      "hypothesisTags": [
+        "H8"
+      ],
+      "purpose": "验证「冻干益生菌 转化」相关的品类、产品和购买决策信号",
+      "expectedSignal": "行动建议、验证指标",
+      "risk": "自动补齐关键词,执行前需人工确认搜索噪声和业务相关性",
+      "status": "待确认"
+    }
+  ],
+  "audit": {
+    "byHypothesis": {
+      "H1": [
+        "儿童益生菌怎么选",
+        "益生菌腹胀便秘",
+        "冻干益生菌 市场机会"
+      ],
+      "H2": [
+        "益生菌腹胀便秘",
+        "冻干益生菌 使用场景",
+        "冻干益生菌 痛点"
+      ],
+      "H3": [
+        "儿童益生菌怎么选",
+        "冻干益生菌测评",
+        "冻干益生菌 怎么选"
+      ],
+      "H4": [
+        "益生菌腹胀便秘",
+        "冻干益生菌 价格",
+        "冻干益生菌 规格"
+      ],
+      "H5": [
+        "冻干益生菌测评",
+        "冻干益生菌 种草",
+        "冻干益生菌 达人推荐"
+      ],
+      "H6": [
+        "儿童益生菌怎么选",
+        "冻干益生菌 竞品",
+        "冻干益生菌 替代品"
+      ],
+      "H7": [
+        "冻干益生菌测评",
+        "冻干益生菌 卖点",
+        "冻干益生菌 定位"
+      ],
+      "H8": [
+        "冻干益生菌 复购",
+        "冻干益生菌 推荐",
+        "冻干益生菌 转化"
+      ]
+    },
+    "warnings": []
+  }
+}

+ 123 - 0
demo/xiaohongshu/mini-report.example.md

@@ -0,0 +1,123 @@
+# Platform VOC Mini Report 示例:小红书冻干益生菌
+
+> 本报告基于 `demo/xiaohongshu/` 下的课程合成样例数据完成,仅用于教学演示,不代表真实平台采集结果或医学建议。
+
+## 0. 报告信息
+
+| 字段 | 填写 |
+|---|---|
+| 项目/品类 | 冻干益生菌 |
+| 分析平台 | 小红书 |
+| 分析关键词 | 儿童益生菌怎么选、益生菌腹胀便秘、冻干益生菌测评 |
+| 样本范围 | 30 篇笔记 / 105 条评论 |
+| 数据性质 | 课程合成样例 |
+| 完成人 | VOC Skills 课程 demo |
+| 日期 | 2026-04-29 |
+
+## 1. 一句话结论
+
+- **核心结论**:小红书用户对冻干益生菌的关注点已经从“活菌数更高”转向“可解释、可观察、可坚持”的家庭使用方案,品牌应优先把配料、适用边界、观察周期和小包装场景讲清楚。
+- **证据强度**:中
+- **最关键证据**:30 篇笔记中反复出现“菌株编号、配料干净、独立小条、适用边界、7 天观察、试用装”等表达;105 条评论中高频主题覆盖痛点、场景、决策、反馈、信任、价格和话术。
+
+## 2. 数据概况
+
+| 指标 | 数值 | 说明 |
+|---|---:|---|
+| 关键词数 | 3 | 覆盖问题词、痛点场景词、产品/竞品词 |
+| 笔记数 | 30 | 每个关键词 10 篇 |
+| 评论数 | 105 | 前 15 篇每篇 4 条,后 15 篇每篇 3 条 |
+| 高互动笔记数 | 16 | 点赞 > 700 或收藏 > 300 |
+| 主要人群/角色 | 家长、打工人、老人照护者、测评用户 | 购买者不只儿童家长,还包括成人肠胃管理和家庭代购角色 |
+| 主要场景 | 开学、旅行、外出吃饭、便秘观察、饭局后腹胀 | 场景比泛泛“调理肠胃”更利于内容转化 |
+
+## 2.1 H1-H8 假设覆盖速查
+
+| 假设 | 覆盖判断 | 本报告中的使用方式 |
+|---|---|---|
+| H1 | 已覆盖 | 痛点、焦虑、首次购买阻力 |
+| H2 | 已覆盖 | 开学、旅行、饭局后、便秘观察等触发场景 |
+| H3 | 已覆盖 | 菌株编号、配料表、客服解释、详情页选择表 |
+| H4 | 已覆盖 | 使用反馈、适应期、观察周期 |
+| H5 | 已覆盖 | 进口/国产、价格带、结块差评、竞品替代 |
+| H6 | 已覆盖 | 适用边界、过敏原、合规与信任门槛 |
+| H7 | 已覆盖 | 7 天体验装、月装、每天成本 |
+| H8 | 已覆盖 | 观察卡、生活化参数翻译、陪伴式内容 |
+
+## 3. 高频主题聚类
+
+| 主题 | 频次/强度 | 典型原声 | 业务解释 |
+|---|---:|---|---|
+| 痛点 | 高 | “最怕买回来孩子不愿意喝”“排便不规律,想知道吃多久能观察到变化” | 用户不是只买功效,而是在规避闲置、无效和焦虑 |
+| 场景 | 高 | “开学和旅行后最明显”“外出吃饭后会备几条” | SKU 和内容可以围绕高触发场景拆分,而不是只按人群拆分 |
+| 决策标准 | 高 | “菌株编号和配料表,客服讲不清楚就不下单” | 详情页应把专业参数翻译成选择标准 |
+| 使用反馈 | 中 | “一周后排便时间稳定了一点”“第一天有点胀,减量观察后好多了” | 需要给用户观察周期和适应期说明,降低退货/差评 |
+| 信任门槛 | 高 | “不要说包治便秘”“不适合哪些人比夸效果更重要” | 合规、边界、禁忌和适用人群是信任资产 |
+| 价格/规格 | 中 | “希望先有 7 天试用装”“一盒够吃一个月最省心” | 建议设计低门槛试用装 + 月装复购路径 |
+| 内容话术 | 高 | “把活菌数翻译成怎么吃、吃多久、怎么看变化” | 小红书内容要从参数种草转向陪伴式观察卡 |
+
+## 4. VOC 原声证据卡
+
+### 证据 1:配料和边界比夸效果更重要
+
+- **来源**:`xhs_demo_006` / 儿童益生菌怎么选
+- **原声**:“孩子爱喝当然重要,但家长评论里更在意有没有蔗糖、香精、过敏原提示。好喝只是入门,不是核心卖点。”
+- **标签**:H1, H4, H8
+- **解释**:口味能影响初次尝试,但复购和信任更依赖配料透明与风险提示。
+
+### 证据 2:适应期没有讲清会制造焦虑
+
+- **来源**:`xhs_demo_012` / 益生菌腹胀便秘
+- **原声**:“客服解释说先减量观察,但详情页完全没写可能的适应期。这个信息如果提前说清楚,我就不会那么慌。”
+- **标签**:H1, H4, H6
+- **解释**:用户出现短期不适时需要解释框架,否则容易把“适应期”理解为产品问题。
+
+### 证据 3:试用装降低首次购买门槛
+
+- **来源**:`xhs_demo_017` / 益生菌腹胀便秘
+- **原声**:“大盒太贵怕没用,小盒7天体验装更友好。如果有效再复购月装,这个路径对新客压力小。”
+- **标签**:H1, H7
+- **解释**:对效果不确定的功能型产品,7 天体验装可以承担转化漏斗前段任务。
+
+### 证据 4:参数需要翻译成生活语言
+
+- **来源**:`xhs_demo_028` / 冻干益生菌测评
+- **原声**:“用户更想知道一盒能吃多久、每天成本多少、什么时候适合吃、和其他产品怎么搭配。数字要翻译成生活语言。”
+- **标签**:H7, H8
+- **解释**:活菌数等参数不是不能讲,而是必须落到每天成本、吃法和观察指标。
+
+## 5. 产品/内容机会
+
+| 机会点 | 对应 VOC | 建议动作 | 优先级 |
+|---|---|---|---|
+| 7 天体验装 | “小盒 7 天体验装更友好” | 设计试用装 SKU,配套 7 天观察卡 | P0 |
+| 详情页选择表 | “适用人群、不能替代治疗、怎么吃写清楚” | 增加适用/不适用人群、冲调水温、观察周期表格 | P0 |
+| 场景化小条装 | “外出吃饭后会备几条”“旅行装是场景” | 做开学、旅行、饭局后等内容专题和组合装 | P1 |
+| 配料透明卡 | “有没有蔗糖、香精、过敏原提示” | 在图文首屏展示配料排除项和过敏原说明 | P0 |
+| 客服解释脚本 | “客服讲不清楚就不下单” | 建立菌株、保存、冲调、适应期、边界 FAQ | P1 |
+
+## 6. 小红书内容建议
+
+| 内容角度 | 推荐标题 | 证据来源 | 目的 |
+|---|---|---|---|
+| 选择标准 | 《给孩子选益生菌,别只看活菌数:我会先看这 4 点》 | xhs_demo_001, xhs_demo_002, xhs_demo_010 | 获客 + 建信任 |
+| 使用观察 | 《7 天益生菌观察卡:排便、腹胀、饮食怎么记》 | xhs_demo_011, xhs_demo_016, xhs_demo_030 | 建信任 + 复购 |
+| 场景种草 | 《开学/旅行/饭局后,益生菌小条怎么备才不浪费》 | xhs_demo_007, xhs_demo_013, xhs_demo_026 | 获客 + 转化 |
+| 反向避坑 | 《吃益生菌胀气是不是踩雷?先看这几个适应期信号》 | xhs_demo_012, xhs_demo_018, xhs_demo_025 | 降低退货 + 建信任 |
+| 价格规格 | 《先买 7 天装还是月装?益生菌新手这样选》 | xhs_demo_017, xhs_demo_023, xhs_demo_028 | 转化 |
+
+## 7. 风险与边界
+
+- **数据边界**:本报告使用课程合成样例,不能代表真实市场规模、真实互动分布或真实品牌口碑。
+- **噪声来源**:测评号、商业合作内容、用户主观体感、医学症状表达都可能带来偏差。
+- **不能推出的结论**:不能证明益生菌对便秘、腹胀等症状的医学有效性;只能说明用户如何表达需求、疑虑和购买判断。
+- **下一步需要补采/验证**:真实小红书采集应补充竞品品牌词、差评词、医生/营养师内容、真实成交评论,并与电商评价交叉验证。
+
+## 8. 结课行动清单
+
+| 行动 | 负责人 | 截止时间 | 验证指标 |
+|---|---|---|---|
+| 输出 7 天体验装 SKU 假设 | 产品经理 | 1 周 | 试用装转月装率、咨询转化率 |
+| 改写详情页适用边界模块 | 内容/电商 | 1 周 | FAQ 点击率、客服重复问题下降 |
+| 制作 3 篇小红书观察卡内容 | 内容运营 | 2 周 | 收藏率、评论中的“怎么吃/吃多久”问题变化 |
+| 建立客服解释脚本 | 客服负责人 | 2 周 | 客服满意度、退货原因中“没效果/不清楚”占比 |

+ 100 - 0
demo/xiaohongshu/mini-report.template.md

@@ -0,0 +1,100 @@
+# Platform VOC Mini Report 模板:小红书
+
+> 适用场景:单平台 2 小时课结课作业。请基于 `raw-notes.json`、`raw-comments.json`、`comments-flat.jsonl` 完成。
+
+## 0. 报告信息
+
+| 字段 | 填写 |
+|---|---|
+| 项目/品类 |  |
+| 分析平台 | 小红书 |
+| 分析关键词 |  |
+| 样本范围 |  篇笔记 /  条评论 |
+| 数据性质 | 真实采集 / 课程样例 / 混合 |
+| 完成人 |  |
+| 日期 |  |
+
+## 1. 一句话结论
+
+> 用一句话说明:这个平台的 VOC 目前最支持哪个产品/内容/渠道判断?
+
+- **核心结论**:
+- **证据强度**:高 / 中 / 低
+- **最关键证据**:
+
+## 2. 数据概况
+
+| 指标 | 数值 | 说明 |
+|---|---:|---|
+| 关键词数 |  |  |
+| 笔记数 |  |  |
+| 评论数 |  |  |
+| 高互动笔记数 |  | 例如点赞 > 500 或收藏 > 300 |
+| 主要人群/角色 |  | 例如宝妈、打工人、老人照护者 |
+| 主要场景 |  | 例如开学、旅行、饭局后、便秘观察 |
+
+## 3. 高频主题聚类
+
+| 主题 | 占比/频次 | 典型原声 | 业务解释 |
+|---|---:|---|---|
+| 痛点 |  |  |  |
+| 场景 |  |  |  |
+| 决策标准 |  |  |  |
+| 使用反馈 |  |  |  |
+| 信任门槛 |  |  |  |
+| 价格/规格 |  |  |  |
+| 内容话术 |  |  |  |
+
+## 4. VOC 原声证据卡
+
+### 证据 1
+
+- **来源**:noteId / commentId / keyword
+- **原声**:
+- **标签**:H1-H8
+- **解释**:
+
+### 证据 2
+
+- **来源**:noteId / commentId / keyword
+- **原声**:
+- **标签**:H1-H8
+- **解释**:
+
+### 证据 3
+
+- **来源**:noteId / commentId / keyword
+- **原声**:
+- **标签**:H1-H8
+- **解释**:
+
+## 5. 产品/内容机会
+
+| 机会点 | 对应 VOC | 建议动作 | 优先级 |
+|---|---|---|---|
+|  |  |  | P0/P1/P2 |
+|  |  |  | P0/P1/P2 |
+|  |  |  | P0/P1/P2 |
+
+## 6. 小红书内容建议
+
+| 内容角度 | 推荐标题 | 证据来源 | 目的 |
+|---|---|---|---|
+|  |  |  | 获客 / 建信任 / 转化 / 复购 |
+|  |  |  | 获客 / 建信任 / 转化 / 复购 |
+|  |  |  | 获客 / 建信任 / 转化 / 复购 |
+
+## 7. 风险与边界
+
+- **数据边界**:
+- **噪声来源**:
+- **不能推出的结论**:
+- **下一步需要补采/验证**:
+
+## 8. 结课行动清单
+
+| 行动 | 负责人 | 截止时间 | 验证指标 |
+|---|---|---|---|
+|  |  |  |  |
+|  |  |  |  |
+|  |  |  |  |

+ 6319 - 0
demo/xiaohongshu/normalized/_merged.json

@@ -0,0 +1,6319 @@
+{
+  "metadata": {
+    "project": "xiaohongshu-course-demo",
+    "category": "冻干益生菌",
+    "generatedAt": "2026-04-29T13:10:23.898Z",
+    "platforms": [
+      "xiaohongshu"
+    ],
+    "keywords": [
+      "儿童益生菌怎么选",
+      "益生菌腹胀便秘",
+      "冻干益生菌测评"
+    ],
+    "batches": [
+      "P0",
+      "P1"
+    ],
+    "hypothesisTags": [
+      "H1",
+      "H3",
+      "H6",
+      "H2",
+      "H4",
+      "H7",
+      "H8",
+      "H5"
+    ],
+    "rawSampleCount": 135,
+    "rawItemCount": 30,
+    "rawVocCount": 105,
+    "itemCount": 30,
+    "validVocCount": 105,
+    "dedupeRule": "platform + id/commentId + first 120 normalized text characters"
+  },
+  "sources": [
+    {
+      "file": "raw-comments.json",
+      "platform": "xiaohongshu",
+      "itemCount": 0,
+      "commentCount": 105
+    },
+    {
+      "file": "raw-notes.json",
+      "platform": "xiaohongshu",
+      "itemCount": 30,
+      "commentCount": 0
+    }
+  ],
+  "items": [
+    {
+      "id": "xhs_note_xhs_demo_001",
+      "platform": "xiaohongshu",
+      "sourceType": "normal",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H3",
+        "H6"
+      ],
+      "author": "松松妈的养娃笔记",
+      "title": "给娃选益生菌我现在只看这4点",
+      "content": "踩过甜味太重、吃完胀气、冲不开的坑后,我现在先看菌株编号、配料干净、独立小条和孩子愿不愿意坚持吃。",
+      "likeCount": 842,
+      "commentCount": 46,
+      "publishTime": "2026-03-04T09:30:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_001",
+      "productId": "xhs_demo_001",
+      "raw": {
+        "noteId": "xhs_demo_001",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H3",
+          "H6"
+        ],
+        "type": "normal",
+        "title": "给娃选益生菌我现在只看这4点",
+        "desc": "踩过甜味太重、吃完胀气、冲不开的坑后,我现在先看菌株编号、配料干净、独立小条和孩子愿不愿意坚持吃。",
+        "author": {
+          "userId": "xhs_user_001",
+          "nickname": "松松妈的养娃笔记"
+        },
+        "ipLocation": "浙江",
+        "publishedAt": "2026-03-04T09:30:00+08:00",
+        "metrics": {
+          "likeCount": 842,
+          "commentCount": 46,
+          "collectCount": 388,
+          "shareCount": 31
+        },
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_001"
+      }
+    },
+    {
+      "id": "xhs_note_xhs_demo_002",
+      "platform": "xiaohongshu",
+      "sourceType": "normal",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H3",
+        "H6"
+      ],
+      "author": "营养师梨梨",
+      "title": "儿童益生菌不是活菌数越高越好",
+      "content": "看了好多测评,发现家长真正纠结的是菌株适不适合、有没有糖醇、需不需要冷藏,以及售后能不能解释清楚。",
+      "likeCount": 1290,
+      "commentCount": 63,
+      "publishTime": "2026-03-05T12:10:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_002",
+      "productId": "xhs_demo_002",
+      "raw": {
+        "noteId": "xhs_demo_002",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H3",
+          "H6"
+        ],
+        "type": "normal",
+        "title": "儿童益生菌不是活菌数越高越好",
+        "desc": "看了好多测评,发现家长真正纠结的是菌株适不适合、有没有糖醇、需不需要冷藏,以及售后能不能解释清楚。",
+        "author": {
+          "userId": "xhs_user_002",
+          "nickname": "营养师梨梨"
+        },
+        "ipLocation": "上海",
+        "publishedAt": "2026-03-05T12:10:00+08:00",
+        "metrics": {
+          "likeCount": 1290,
+          "commentCount": 63,
+          "collectCount": 701,
+          "shareCount": 58
+        },
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_002"
+      }
+    },
+    {
+      "id": "xhs_note_xhs_demo_003",
+      "platform": "xiaohongshu",
+      "sourceType": "video",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H2",
+        "H4"
+      ],
+      "author": "一米阳光育儿",
+      "title": "孩子换季肚子闹情绪,我怎么做记录",
+      "content": "我会记录饮食、排便、睡眠和吃益生菌后的变化。不是神药,但能不能稳定,家长其实一周就有感觉。",
+      "likeCount": 476,
+      "commentCount": 35,
+      "publishTime": "2026-03-06T20:25:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_003",
+      "productId": "xhs_demo_003",
+      "raw": {
+        "noteId": "xhs_demo_003",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H2",
+          "H4"
+        ],
+        "type": "video",
+        "title": "孩子换季肚子闹情绪,我怎么做记录",
+        "desc": "我会记录饮食、排便、睡眠和吃益生菌后的变化。不是神药,但能不能稳定,家长其实一周就有感觉。",
+        "author": {
+          "userId": "xhs_user_003",
+          "nickname": "一米阳光育儿"
+        },
+        "ipLocation": "江苏",
+        "publishedAt": "2026-03-06T20:25:00+08:00",
+        "metrics": {
+          "likeCount": 476,
+          "commentCount": 35,
+          "collectCount": 190,
+          "shareCount": 21
+        },
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_003"
+      }
+    },
+    {
+      "id": "xhs_note_xhs_demo_004",
+      "platform": "xiaohongshu",
+      "sourceType": "normal",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H3",
+        "H7"
+      ],
+      "author": "阿元不熬夜",
+      "title": "一条装真的比大罐方便太多",
+      "content": "早上送幼儿园前一撕一倒,不用勺子也不怕受潮。价格贵一点可以接受,但希望一盒至少够吃一个月。",
+      "likeCount": 365,
+      "commentCount": 28,
+      "publishTime": "2026-03-07T08:15:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_004",
+      "productId": "xhs_demo_004",
+      "raw": {
+        "noteId": "xhs_demo_004",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H3",
+          "H7"
+        ],
+        "type": "normal",
+        "title": "一条装真的比大罐方便太多",
+        "desc": "早上送幼儿园前一撕一倒,不用勺子也不怕受潮。价格贵一点可以接受,但希望一盒至少够吃一个月。",
+        "author": {
+          "userId": "xhs_user_004",
+          "nickname": "阿元不熬夜"
+        },
+        "ipLocation": "广东",
+        "publishedAt": "2026-03-07T08:15:00+08:00",
+        "metrics": {
+          "likeCount": 365,
+          "commentCount": 28,
+          "collectCount": 142,
+          "shareCount": 16
+        },
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_004"
+      }
+    },
+    {
+      "id": "xhs_note_xhs_demo_005",
+      "platform": "xiaohongshu",
+      "sourceType": "normal",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H6",
+        "H8"
+      ],
+      "author": "家有小柚子",
+      "title": "看到医生同款我会多停留几秒",
+      "content": "不是盲信医生背书,而是希望品牌把适用人群、不能替代治疗、怎么吃写清楚。越夸张我越不敢买。",
+      "likeCount": 718,
+      "commentCount": 41,
+      "publishTime": "2026-03-08T11:45:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_005",
+      "productId": "xhs_demo_005",
+      "raw": {
+        "noteId": "xhs_demo_005",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H6",
+          "H8"
+        ],
+        "type": "normal",
+        "title": "看到医生同款我会多停留几秒",
+        "desc": "不是盲信医生背书,而是希望品牌把适用人群、不能替代治疗、怎么吃写清楚。越夸张我越不敢买。",
+        "author": {
+          "userId": "xhs_user_005",
+          "nickname": "家有小柚子"
+        },
+        "ipLocation": "北京",
+        "publishedAt": "2026-03-08T11:45:00+08:00",
+        "metrics": {
+          "likeCount": 718,
+          "commentCount": 41,
+          "collectCount": 319,
+          "shareCount": 27
+        },
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_005"
+      }
+    },
+    {
+      "id": "xhs_note_xhs_demo_006",
+      "platform": "xiaohongshu",
+      "sourceType": "normal",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H4",
+        "H8"
+      ],
+      "author": "小敏配料表",
+      "title": "别再用酸奶味掩盖配方问题了",
+      "content": "孩子爱喝当然重要,但家长评论里更在意有没有蔗糖、香精、过敏原提示。好喝只是入门,不是核心卖点。",
+      "likeCount": 932,
+      "commentCount": 52,
+      "publishTime": "2026-03-09T18:05:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_006",
+      "productId": "xhs_demo_006",
+      "raw": {
+        "noteId": "xhs_demo_006",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H4",
+          "H8"
+        ],
+        "type": "normal",
+        "title": "别再用酸奶味掩盖配方问题了",
+        "desc": "孩子爱喝当然重要,但家长评论里更在意有没有蔗糖、香精、过敏原提示。好喝只是入门,不是核心卖点。",
+        "author": {
+          "userId": "xhs_user_006",
+          "nickname": "小敏配料表"
+        },
+        "ipLocation": "四川",
+        "publishedAt": "2026-03-09T18:05:00+08:00",
+        "metrics": {
+          "likeCount": 932,
+          "commentCount": 52,
+          "collectCount": 447,
+          "shareCount": 39
+        },
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_006"
+      }
+    },
+    {
+      "id": "xhs_note_xhs_demo_007",
+      "platform": "xiaohongshu",
+      "sourceType": "video",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H2",
+        "H3",
+        "H7"
+      ],
+      "author": "橙子妈在杭州",
+      "title": "幼儿园开学后我家常备这类小条",
+      "content": "开学、外出、吃火锅后是高频场景。小包装方便带,但最好能标注水温和冲调方式,老人也看得懂。",
+      "likeCount": 521,
+      "commentCount": 37,
+      "publishTime": "2026-03-10T19:40:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_007",
+      "productId": "xhs_demo_007",
+      "raw": {
+        "noteId": "xhs_demo_007",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H2",
+          "H3",
+          "H7"
+        ],
+        "type": "video",
+        "title": "幼儿园开学后我家常备这类小条",
+        "desc": "开学、外出、吃火锅后是高频场景。小包装方便带,但最好能标注水温和冲调方式,老人也看得懂。",
+        "author": {
+          "userId": "xhs_user_007",
+          "nickname": "橙子妈在杭州"
+        },
+        "ipLocation": "浙江",
+        "publishedAt": "2026-03-10T19:40:00+08:00",
+        "metrics": {
+          "likeCount": 521,
+          "commentCount": 37,
+          "collectCount": 226,
+          "shareCount": 24
+        },
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_007"
+      }
+    },
+    {
+      "id": "xhs_note_xhs_demo_008",
+      "platform": "xiaohongshu",
+      "sourceType": "normal",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H3",
+        "H5",
+        "H6"
+      ],
+      "author": "认真买东西的桐桐妈",
+      "title": "进口牌子和国产牌子我怎么取舍",
+      "content": "进口品牌让我觉得研究多,国产品牌胜在客服解释和发货快。最后还是看菌株证据、配料和孩子接受度。",
+      "likeCount": 684,
+      "commentCount": 44,
+      "publishTime": "2026-03-11T10:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_008",
+      "productId": "xhs_demo_008",
+      "raw": {
+        "noteId": "xhs_demo_008",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H3",
+          "H5",
+          "H6"
+        ],
+        "type": "normal",
+        "title": "进口牌子和国产牌子我怎么取舍",
+        "desc": "进口品牌让我觉得研究多,国产品牌胜在客服解释和发货快。最后还是看菌株证据、配料和孩子接受度。",
+        "author": {
+          "userId": "xhs_user_008",
+          "nickname": "认真买东西的桐桐妈"
+        },
+        "ipLocation": "山东",
+        "publishedAt": "2026-03-11T10:20:00+08:00",
+        "metrics": {
+          "likeCount": 684,
+          "commentCount": 44,
+          "collectCount": 295,
+          "shareCount": 19
+        },
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_008"
+      }
+    },
+    {
+      "id": "xhs_note_xhs_demo_009",
+      "platform": "xiaohongshu",
+      "sourceType": "normal",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H4",
+        "H6"
+      ],
+      "author": "慢慢养娃",
+      "title": "吃了没感觉是不是没用",
+      "content": "很多家长焦虑三天没变化。我的经验是先看饮食和作息,益生菌最多是辅助,品牌也别暗示立竿见影。",
+      "likeCount": 413,
+      "commentCount": 31,
+      "publishTime": "2026-03-12T14:55:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_009",
+      "productId": "xhs_demo_009",
+      "raw": {
+        "noteId": "xhs_demo_009",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H4",
+          "H6"
+        ],
+        "type": "normal",
+        "title": "吃了没感觉是不是没用",
+        "desc": "很多家长焦虑三天没变化。我的经验是先看饮食和作息,益生菌最多是辅助,品牌也别暗示立竿见影。",
+        "author": {
+          "userId": "xhs_user_009",
+          "nickname": "慢慢养娃"
+        },
+        "ipLocation": "湖北",
+        "publishedAt": "2026-03-12T14:55:00+08:00",
+        "metrics": {
+          "likeCount": 413,
+          "commentCount": 31,
+          "collectCount": 168,
+          "shareCount": 13
+        },
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_009"
+      }
+    },
+    {
+      "id": "xhs_note_xhs_demo_010",
+      "platform": "xiaohongshu",
+      "sourceType": "normal",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H3",
+        "H8"
+      ],
+      "author": "表格控妈妈",
+      "title": "我最想在详情页看到一张选择表",
+      "content": "不同年龄、不同肠胃状态、怎么冲、吃多久、什么时候停,如果能做成一张表,比堆概念更能打消疑虑。",
+      "likeCount": 755,
+      "commentCount": 49,
+      "publishTime": "2026-03-13T21:10:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_010",
+      "productId": "xhs_demo_010",
+      "raw": {
+        "noteId": "xhs_demo_010",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H3",
+          "H8"
+        ],
+        "type": "normal",
+        "title": "我最想在详情页看到一张选择表",
+        "desc": "不同年龄、不同肠胃状态、怎么冲、吃多久、什么时候停,如果能做成一张表,比堆概念更能打消疑虑。",
+        "author": {
+          "userId": "xhs_user_010",
+          "nickname": "表格控妈妈"
+        },
+        "ipLocation": "福建",
+        "publishedAt": "2026-03-13T21:10:00+08:00",
+        "metrics": {
+          "likeCount": 755,
+          "commentCount": 49,
+          "collectCount": 510,
+          "shareCount": 42
+        },
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_010"
+      }
+    },
+    {
+      "id": "xhs_note_xhs_demo_011",
+      "platform": "xiaohongshu",
+      "sourceType": "normal",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H2",
+        "H4"
+      ],
+      "author": "便便观察日记",
+      "title": "便秘娃吃益生菌前我先做了这件事",
+      "content": "先记录排便频率和饮水量,再看吃了之后有没有规律一些。只说解决便秘太绝对,家长更需要可观察指标。",
+      "likeCount": 1180,
+      "commentCount": 72,
+      "publishTime": "2026-03-14T09:05:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_011",
+      "productId": "xhs_demo_011",
+      "raw": {
+        "noteId": "xhs_demo_011",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H2",
+          "H4"
+        ],
+        "type": "normal",
+        "title": "便秘娃吃益生菌前我先做了这件事",
+        "desc": "先记录排便频率和饮水量,再看吃了之后有没有规律一些。只说解决便秘太绝对,家长更需要可观察指标。",
+        "author": {
+          "userId": "xhs_user_011",
+          "nickname": "便便观察日记"
+        },
+        "ipLocation": "重庆",
+        "publishedAt": "2026-03-14T09:05:00+08:00",
+        "metrics": {
+          "likeCount": 1180,
+          "commentCount": 72,
+          "collectCount": 633,
+          "shareCount": 66
+        },
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_011"
+      }
+    },
+    {
+      "id": "xhs_note_xhs_demo_012",
+      "platform": "xiaohongshu",
+      "sourceType": "normal",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H4",
+        "H6"
+      ],
+      "author": "豆豆妈吐槽箱",
+      "title": "第一次吃反而胀气,我差点退货",
+      "content": "客服解释说先减量观察,但详情页完全没写可能的适应期。这个信息如果提前说清楚,我就不会那么慌。",
+      "likeCount": 624,
+      "commentCount": 58,
+      "publishTime": "2026-03-14T22:10:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_012",
+      "productId": "xhs_demo_012",
+      "raw": {
+        "noteId": "xhs_demo_012",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H4",
+          "H6"
+        ],
+        "type": "normal",
+        "title": "第一次吃反而胀气,我差点退货",
+        "desc": "客服解释说先减量观察,但详情页完全没写可能的适应期。这个信息如果提前说清楚,我就不会那么慌。",
+        "author": {
+          "userId": "xhs_user_012",
+          "nickname": "豆豆妈吐槽箱"
+        },
+        "ipLocation": "河南",
+        "publishedAt": "2026-03-14T22:10:00+08:00",
+        "metrics": {
+          "likeCount": 624,
+          "commentCount": 58,
+          "collectCount": 214,
+          "shareCount": 18
+        },
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_012"
+      }
+    },
+    {
+      "id": "xhs_note_xhs_demo_013",
+      "platform": "xiaohongshu",
+      "sourceType": "video",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H2",
+        "H4"
+      ],
+      "author": "打工人胃肠自救",
+      "title": "出差回来肠胃乱了两周",
+      "content": "成人也会搜益生菌。外卖、熬夜、旅行后腹胀是高频场景,大家想要的是轻负担、好携带、别太甜。",
+      "likeCount": 903,
+      "commentCount": 61,
+      "publishTime": "2026-03-15T13:35:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_013",
+      "productId": "xhs_demo_013",
+      "raw": {
+        "noteId": "xhs_demo_013",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H2",
+          "H4"
+        ],
+        "type": "video",
+        "title": "出差回来肠胃乱了两周",
+        "desc": "成人也会搜益生菌。外卖、熬夜、旅行后腹胀是高频场景,大家想要的是轻负担、好携带、别太甜。",
+        "author": {
+          "userId": "xhs_user_013",
+          "nickname": "打工人胃肠自救"
+        },
+        "ipLocation": "上海",
+        "publishedAt": "2026-03-15T13:35:00+08:00",
+        "metrics": {
+          "likeCount": 903,
+          "commentCount": 61,
+          "collectCount": 371,
+          "shareCount": 46
+        },
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_013"
+      }
+    },
+    {
+      "id": "xhs_note_xhs_demo_014",
+      "platform": "xiaohongshu",
+      "sourceType": "normal",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H3",
+        "H4"
+      ],
+      "author": "买前先看差评",
+      "title": "我不想再买一堆没反馈的保健品",
+      "content": "评论区最常问:多久有效、没效果怎么办、能不能和酸奶一起、孩子不爱喝怎么办。售后说明比硬广更重要。",
+      "likeCount": 552,
+      "commentCount": 43,
+      "publishTime": "2026-03-16T16:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_014",
+      "productId": "xhs_demo_014",
+      "raw": {
+        "noteId": "xhs_demo_014",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H3",
+          "H4"
+        ],
+        "type": "normal",
+        "title": "我不想再买一堆没反馈的保健品",
+        "desc": "评论区最常问:多久有效、没效果怎么办、能不能和酸奶一起、孩子不爱喝怎么办。售后说明比硬广更重要。",
+        "author": {
+          "userId": "xhs_user_014",
+          "nickname": "买前先看差评"
+        },
+        "ipLocation": "湖南",
+        "publishedAt": "2026-03-16T16:20:00+08:00",
+        "metrics": {
+          "likeCount": 552,
+          "commentCount": 43,
+          "collectCount": 202,
+          "shareCount": 17
+        },
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_014"
+      }
+    },
+    {
+      "id": "xhs_note_xhs_demo_015",
+      "platform": "xiaohongshu",
+      "sourceType": "normal",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H2",
+        "H8"
+      ],
+      "author": "不装专家的生活记录",
+      "title": "饭局后肚子鼓鼓的,别只怪益生菌",
+      "content": "真实使用场景常常伴随油腻饮食、作息乱和压力。话术如果能承认边界,反而更可信。",
+      "likeCount": 338,
+      "commentCount": 27,
+      "publishTime": "2026-03-17T23:05:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_015",
+      "productId": "xhs_demo_015",
+      "raw": {
+        "noteId": "xhs_demo_015",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H2",
+          "H8"
+        ],
+        "type": "normal",
+        "title": "饭局后肚子鼓鼓的,别只怪益生菌",
+        "desc": "真实使用场景常常伴随油腻饮食、作息乱和压力。话术如果能承认边界,反而更可信。",
+        "author": {
+          "userId": "xhs_user_015",
+          "nickname": "不装专家的生活记录"
+        },
+        "ipLocation": "广东",
+        "publishedAt": "2026-03-17T23:05:00+08:00",
+        "metrics": {
+          "likeCount": 338,
+          "commentCount": 27,
+          "collectCount": 119,
+          "shareCount": 12
+        },
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_015"
+      }
+    },
+    {
+      "id": "xhs_note_xhs_demo_016",
+      "platform": "xiaohongshu",
+      "sourceType": "normal",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H4",
+        "H6"
+      ],
+      "author": "认真做复盘",
+      "title": "我更相信评论里的连续记录",
+      "content": "一天一条的排便记录、腹胀感打分,比一句用了很好更有说服力。品牌可以引导用户做观察卡。",
+      "likeCount": 487,
+      "commentCount": 34,
+      "publishTime": "2026-03-18T07:45:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_016",
+      "productId": "xhs_demo_016",
+      "raw": {
+        "noteId": "xhs_demo_016",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H4",
+          "H6"
+        ],
+        "type": "normal",
+        "title": "我更相信评论里的连续记录",
+        "desc": "一天一条的排便记录、腹胀感打分,比一句用了很好更有说服力。品牌可以引导用户做观察卡。",
+        "author": {
+          "userId": "xhs_user_016",
+          "nickname": "认真做复盘"
+        },
+        "ipLocation": "陕西",
+        "publishedAt": "2026-03-18T07:45:00+08:00",
+        "metrics": {
+          "likeCount": 487,
+          "commentCount": 34,
+          "collectCount": 265,
+          "shareCount": 29
+        },
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_016"
+      }
+    },
+    {
+      "id": "xhs_note_xhs_demo_017",
+      "platform": "xiaohongshu",
+      "sourceType": "normal",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H7"
+      ],
+      "author": "先买小样再说",
+      "title": "便秘焦虑让我愿意买小包装试用",
+      "content": "大盒太贵怕没用,小盒7天体验装更友好。如果有效再复购月装,这个路径对新客压力小。",
+      "likeCount": 431,
+      "commentCount": 39,
+      "publishTime": "2026-03-18T20:50:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_017",
+      "productId": "xhs_demo_017",
+      "raw": {
+        "noteId": "xhs_demo_017",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H7"
+        ],
+        "type": "normal",
+        "title": "便秘焦虑让我愿意买小包装试用",
+        "desc": "大盒太贵怕没用,小盒7天体验装更友好。如果有效再复购月装,这个路径对新客压力小。",
+        "author": {
+          "userId": "xhs_user_017",
+          "nickname": "先买小样再说"
+        },
+        "ipLocation": "天津",
+        "publishedAt": "2026-03-18T20:50:00+08:00",
+        "metrics": {
+          "likeCount": 431,
+          "commentCount": 39,
+          "collectCount": 174,
+          "shareCount": 15
+        },
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_017"
+      }
+    },
+    {
+      "id": "xhs_note_xhs_demo_018",
+      "platform": "xiaohongshu",
+      "sourceType": "video",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H3",
+        "H4",
+        "H8"
+      ],
+      "author": "详情页改造师",
+      "title": "益生菌详情页别再只堆专利词",
+      "content": "用户看不懂专利词,但看得懂:适合谁、不适合谁、怎么吃、预期多久观察、什么情况停用。",
+      "likeCount": 861,
+      "commentCount": 55,
+      "publishTime": "2026-03-19T15:30:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_018",
+      "productId": "xhs_demo_018",
+      "raw": {
+        "noteId": "xhs_demo_018",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H3",
+          "H4",
+          "H8"
+        ],
+        "type": "video",
+        "title": "益生菌详情页别再只堆专利词",
+        "desc": "用户看不懂专利词,但看得懂:适合谁、不适合谁、怎么吃、预期多久观察、什么情况停用。",
+        "author": {
+          "userId": "xhs_user_018",
+          "nickname": "详情页改造师"
+        },
+        "ipLocation": "北京",
+        "publishedAt": "2026-03-19T15:30:00+08:00",
+        "metrics": {
+          "likeCount": 861,
+          "commentCount": 55,
+          "collectCount": 402,
+          "shareCount": 51
+        },
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_018"
+      }
+    },
+    {
+      "id": "xhs_note_xhs_demo_019",
+      "platform": "xiaohongshu",
+      "sourceType": "normal",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H5"
+      ],
+      "author": "真实换购记录",
+      "title": "换了三款益生菌后我才明白自己要什么",
+      "content": "有的太甜,有的要冷藏,有的吃了没变化。最后留下的是冲调方便、味道淡、客服敢说适用边界的。",
+      "likeCount": 692,
+      "commentCount": 48,
+      "publishTime": "2026-03-20T12:05:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_019",
+      "productId": "xhs_demo_019",
+      "raw": {
+        "noteId": "xhs_demo_019",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H5"
+        ],
+        "type": "normal",
+        "title": "换了三款益生菌后我才明白自己要什么",
+        "desc": "有的太甜,有的要冷藏,有的吃了没变化。最后留下的是冲调方便、味道淡、客服敢说适用边界的。",
+        "author": {
+          "userId": "xhs_user_019",
+          "nickname": "真实换购记录"
+        },
+        "ipLocation": "安徽",
+        "publishedAt": "2026-03-20T12:05:00+08:00",
+        "metrics": {
+          "likeCount": 692,
+          "commentCount": 48,
+          "collectCount": 286,
+          "shareCount": 22
+        },
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_019"
+      }
+    },
+    {
+      "id": "xhs_note_xhs_demo_020",
+      "platform": "xiaohongshu",
+      "sourceType": "normal",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H2",
+        "H4",
+        "H6"
+      ],
+      "author": "给爸妈做功课",
+      "title": "老人也在问益生菌,但说明太年轻化",
+      "content": "家里老人便秘会问能不能吃、怎么吃、会不会依赖。品牌如果只讲儿童和年轻女性,会漏掉家庭购买者。",
+      "likeCount": 377,
+      "commentCount": 33,
+      "publishTime": "2026-03-21T09:40:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_020",
+      "productId": "xhs_demo_020",
+      "raw": {
+        "noteId": "xhs_demo_020",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H2",
+          "H4",
+          "H6"
+        ],
+        "type": "normal",
+        "title": "老人也在问益生菌,但说明太年轻化",
+        "desc": "家里老人便秘会问能不能吃、怎么吃、会不会依赖。品牌如果只讲儿童和年轻女性,会漏掉家庭购买者。",
+        "author": {
+          "userId": "xhs_user_020",
+          "nickname": "给爸妈做功课"
+        },
+        "ipLocation": "辽宁",
+        "publishedAt": "2026-03-21T09:40:00+08:00",
+        "metrics": {
+          "likeCount": 377,
+          "commentCount": 33,
+          "collectCount": 151,
+          "shareCount": 20
+        },
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_020"
+      }
+    },
+    {
+      "id": "xhs_note_xhs_demo_021",
+      "platform": "xiaohongshu",
+      "sourceType": "normal",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H3",
+        "H5",
+        "H7"
+      ],
+      "author": "小鹿测评实验室",
+      "title": "8款冻干益生菌横评:我最在意这三项",
+      "content": "独立包装、菌株说明、口味清淡是高频加分项。冷链不是人人需要,但保存方式必须说清楚。",
+      "likeCount": 2140,
+      "commentCount": 118,
+      "publishTime": "2026-03-22T11:00:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_021",
+      "productId": "xhs_demo_021",
+      "raw": {
+        "noteId": "xhs_demo_021",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H3",
+          "H5",
+          "H7"
+        ],
+        "type": "normal",
+        "title": "8款冻干益生菌横评:我最在意这三项",
+        "desc": "独立包装、菌株说明、口味清淡是高频加分项。冷链不是人人需要,但保存方式必须说清楚。",
+        "author": {
+          "userId": "xhs_user_021",
+          "nickname": "小鹿测评实验室"
+        },
+        "ipLocation": "上海",
+        "publishedAt": "2026-03-22T11:00:00+08:00",
+        "metrics": {
+          "likeCount": 2140,
+          "commentCount": 118,
+          "collectCount": 1320,
+          "shareCount": 96
+        },
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_021"
+      }
+    },
+    {
+      "id": "xhs_note_xhs_demo_022",
+      "platform": "xiaohongshu",
+      "sourceType": "normal",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H3",
+        "H6"
+      ],
+      "author": "配料表小侦探",
+      "title": "配料表干净比营销词更有用",
+      "content": "我会直接翻配料表:有没有蔗糖、香精、麦芽糊精、过敏原提示。讲得越明白,收藏率越高。",
+      "likeCount": 963,
+      "commentCount": 54,
+      "publishTime": "2026-03-23T08:50:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_022",
+      "productId": "xhs_demo_022",
+      "raw": {
+        "noteId": "xhs_demo_022",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H3",
+          "H6"
+        ],
+        "type": "normal",
+        "title": "配料表干净比营销词更有用",
+        "desc": "我会直接翻配料表:有没有蔗糖、香精、麦芽糊精、过敏原提示。讲得越明白,收藏率越高。",
+        "author": {
+          "userId": "xhs_user_022",
+          "nickname": "配料表小侦探"
+        },
+        "ipLocation": "四川",
+        "publishedAt": "2026-03-23T08:50:00+08:00",
+        "metrics": {
+          "likeCount": 963,
+          "commentCount": 54,
+          "collectCount": 609,
+          "shareCount": 33
+        },
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_022"
+      }
+    },
+    {
+      "id": "xhs_note_xhs_demo_023",
+      "platform": "xiaohongshu",
+      "sourceType": "video",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H5",
+        "H7"
+      ],
+      "author": "理性消费阿茶",
+      "title": "百元内和两百多的冻干益生菌差在哪",
+      "content": "贵的不一定最好,但便宜款经常输在说明不清、客服弱、包装容易受潮。价格要和场景组合讲。",
+      "likeCount": 1502,
+      "commentCount": 83,
+      "publishTime": "2026-03-24T19:15:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_023",
+      "productId": "xhs_demo_023",
+      "raw": {
+        "noteId": "xhs_demo_023",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H5",
+          "H7"
+        ],
+        "type": "video",
+        "title": "百元内和两百多的冻干益生菌差在哪",
+        "desc": "贵的不一定最好,但便宜款经常输在说明不清、客服弱、包装容易受潮。价格要和场景组合讲。",
+        "author": {
+          "userId": "xhs_user_023",
+          "nickname": "理性消费阿茶"
+        },
+        "ipLocation": "福建",
+        "publishedAt": "2026-03-24T19:15:00+08:00",
+        "metrics": {
+          "likeCount": 1502,
+          "commentCount": 83,
+          "collectCount": 770,
+          "shareCount": 61
+        },
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_023"
+      }
+    },
+    {
+      "id": "xhs_note_xhs_demo_024",
+      "platform": "xiaohongshu",
+      "sourceType": "normal",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H3",
+        "H8"
+      ],
+      "author": "不夸张测评",
+      "title": "好的测评会把不适合人群写出来",
+      "content": "只说全家都能吃很不可信。儿童、孕期、老人、过敏体质这些边界越清楚,用户越敢转发给家人。",
+      "likeCount": 803,
+      "commentCount": 47,
+      "publishTime": "2026-03-25T10:30:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_024",
+      "productId": "xhs_demo_024",
+      "raw": {
+        "noteId": "xhs_demo_024",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H3",
+          "H8"
+        ],
+        "type": "normal",
+        "title": "好的测评会把不适合人群写出来",
+        "desc": "只说全家都能吃很不可信。儿童、孕期、老人、过敏体质这些边界越清楚,用户越敢转发给家人。",
+        "author": {
+          "userId": "xhs_user_024",
+          "nickname": "不夸张测评"
+        },
+        "ipLocation": "江苏",
+        "publishedAt": "2026-03-25T10:30:00+08:00",
+        "metrics": {
+          "likeCount": 803,
+          "commentCount": 47,
+          "collectCount": 421,
+          "shareCount": 36
+        },
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_024"
+      }
+    },
+    {
+      "id": "xhs_note_xhs_demo_025",
+      "platform": "xiaohongshu",
+      "sourceType": "normal",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H4",
+        "H5"
+      ],
+      "author": "差评先行者",
+      "title": "我会先看差评再看种草",
+      "content": "差评集中在没效果、太甜、结块、客服敷衍。能正面回应这些点的品牌,反而更容易建立信任。",
+      "likeCount": 612,
+      "commentCount": 59,
+      "publishTime": "2026-03-26T14:10:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_025",
+      "productId": "xhs_demo_025",
+      "raw": {
+        "noteId": "xhs_demo_025",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H4",
+          "H5"
+        ],
+        "type": "normal",
+        "title": "我会先看差评再看种草",
+        "desc": "差评集中在没效果、太甜、结块、客服敷衍。能正面回应这些点的品牌,反而更容易建立信任。",
+        "author": {
+          "userId": "xhs_user_025",
+          "nickname": "差评先行者"
+        },
+        "ipLocation": "山东",
+        "publishedAt": "2026-03-26T14:10:00+08:00",
+        "metrics": {
+          "likeCount": 612,
+          "commentCount": 59,
+          "collectCount": 260,
+          "shareCount": 24
+        },
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_025"
+      }
+    },
+    {
+      "id": "xhs_note_xhs_demo_026",
+      "platform": "xiaohongshu",
+      "sourceType": "normal",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H2",
+        "H7"
+      ],
+      "author": "周末出逃计划",
+      "title": "旅行装益生菌是我没想到的场景",
+      "content": "评论区很多人说出差、露营、亲子游会备几条。小盒装、常温保存、随身包,是可以单独做的 SKU。",
+      "likeCount": 721,
+      "commentCount": 51,
+      "publishTime": "2026-03-27T17:25:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_026",
+      "productId": "xhs_demo_026",
+      "raw": {
+        "noteId": "xhs_demo_026",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H2",
+          "H7"
+        ],
+        "type": "normal",
+        "title": "旅行装益生菌是我没想到的场景",
+        "desc": "评论区很多人说出差、露营、亲子游会备几条。小盒装、常温保存、随身包,是可以单独做的 SKU。",
+        "author": {
+          "userId": "xhs_user_026",
+          "nickname": "周末出逃计划"
+        },
+        "ipLocation": "云南",
+        "publishedAt": "2026-03-27T17:25:00+08:00",
+        "metrics": {
+          "likeCount": 721,
+          "commentCount": 51,
+          "collectCount": 344,
+          "shareCount": 29
+        },
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_026"
+      }
+    },
+    {
+      "id": "xhs_note_xhs_demo_027",
+      "platform": "xiaohongshu",
+      "sourceType": "video",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H3",
+        "H5",
+        "H6"
+      ],
+      "author": "客服问到崩溃",
+      "title": "客服能不能解释菌株,真的影响下单",
+      "content": "我问了几家客服,能讲清适用人群、保存、冲调和观察周期的,明显更让人安心。",
+      "likeCount": 1086,
+      "commentCount": 73,
+      "publishTime": "2026-03-28T12:45:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_027",
+      "productId": "xhs_demo_027",
+      "raw": {
+        "noteId": "xhs_demo_027",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H3",
+          "H5",
+          "H6"
+        ],
+        "type": "video",
+        "title": "客服能不能解释菌株,真的影响下单",
+        "desc": "我问了几家客服,能讲清适用人群、保存、冲调和观察周期的,明显更让人安心。",
+        "author": {
+          "userId": "xhs_user_027",
+          "nickname": "客服问到崩溃"
+        },
+        "ipLocation": "广东",
+        "publishedAt": "2026-03-28T12:45:00+08:00",
+        "metrics": {
+          "likeCount": 1086,
+          "commentCount": 73,
+          "collectCount": 518,
+          "shareCount": 54
+        },
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_027"
+      }
+    },
+    {
+      "id": "xhs_note_xhs_demo_028",
+      "platform": "xiaohongshu",
+      "sourceType": "normal",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H7",
+        "H8"
+      ],
+      "author": "把参数说人话",
+      "title": "别再只写每袋多少亿活菌了",
+      "content": "用户更想知道一盒能吃多久、每天成本多少、什么时候适合吃、和其他产品怎么搭配。数字要翻译成生活语言。",
+      "likeCount": 845,
+      "commentCount": 66,
+      "publishTime": "2026-03-29T09:55:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_028",
+      "productId": "xhs_demo_028",
+      "raw": {
+        "noteId": "xhs_demo_028",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H7",
+          "H8"
+        ],
+        "type": "normal",
+        "title": "别再只写每袋多少亿活菌了",
+        "desc": "用户更想知道一盒能吃多久、每天成本多少、什么时候适合吃、和其他产品怎么搭配。数字要翻译成生活语言。",
+        "author": {
+          "userId": "xhs_user_028",
+          "nickname": "把参数说人话"
+        },
+        "ipLocation": "湖北",
+        "publishedAt": "2026-03-29T09:55:00+08:00",
+        "metrics": {
+          "likeCount": 845,
+          "commentCount": 66,
+          "collectCount": 487,
+          "shareCount": 41
+        },
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_028"
+      }
+    },
+    {
+      "id": "xhs_note_xhs_demo_029",
+      "platform": "xiaohongshu",
+      "sourceType": "normal",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H4",
+        "H6"
+      ],
+      "author": "包装细节控",
+      "title": "结块一次就会让我不想复购",
+      "content": "冻干粉最怕受潮结块。包装如果能展示密封测试、储存提醒和异常售后,能减少很多差评。",
+      "likeCount": 534,
+      "commentCount": 42,
+      "publishTime": "2026-03-30T18:35:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_029",
+      "productId": "xhs_demo_029",
+      "raw": {
+        "noteId": "xhs_demo_029",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H4",
+          "H6"
+        ],
+        "type": "normal",
+        "title": "结块一次就会让我不想复购",
+        "desc": "冻干粉最怕受潮结块。包装如果能展示密封测试、储存提醒和异常售后,能减少很多差评。",
+        "author": {
+          "userId": "xhs_user_029",
+          "nickname": "包装细节控"
+        },
+        "ipLocation": "江西",
+        "publishedAt": "2026-03-30T18:35:00+08:00",
+        "metrics": {
+          "likeCount": 534,
+          "commentCount": 42,
+          "collectCount": 238,
+          "shareCount": 18
+        },
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_029"
+      }
+    },
+    {
+      "id": "xhs_note_xhs_demo_030",
+      "platform": "xiaohongshu",
+      "sourceType": "normal",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H2",
+        "H3",
+        "H8"
+      ],
+      "author": "陪伴式种草",
+      "title": "益生菌内容最值得做的是观察陪伴",
+      "content": "比起一次性种草,我更愿意看7天记录、饮食搭配、冲调提醒和真实反馈。内容要像陪伴,不要像广告。",
+      "likeCount": 996,
+      "commentCount": 69,
+      "publishTime": "2026-03-31T20:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_030",
+      "productId": "xhs_demo_030",
+      "raw": {
+        "noteId": "xhs_demo_030",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H2",
+          "H3",
+          "H8"
+        ],
+        "type": "normal",
+        "title": "益生菌内容最值得做的是观察陪伴",
+        "desc": "比起一次性种草,我更愿意看7天记录、饮食搭配、冲调提醒和真实反馈。内容要像陪伴,不要像广告。",
+        "author": {
+          "userId": "xhs_user_030",
+          "nickname": "陪伴式种草"
+        },
+        "ipLocation": "广西",
+        "publishedAt": "2026-03-31T20:20:00+08:00",
+        "metrics": {
+          "likeCount": 996,
+          "commentCount": 69,
+          "collectCount": 542,
+          "shareCount": 48
+        },
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_030"
+      }
+    }
+  ],
+  "comments": [
+    {
+      "id": "xhs_comment_xhs_demo_c_001",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H3",
+        "H6"
+      ],
+      "author": "小满妈妈",
+      "text": "最怕买回来孩子不愿意喝,之前有一款味道太甜直接闲置。",
+      "likeCount": 10,
+      "replyCount": 3,
+      "publishTime": "2026-04-01T09:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_001",
+      "parentId": "xhs_demo_001",
+      "commentId": "xhs_demo_c_001",
+      "ipLocation": "浙江",
+      "theme": "痛点",
+      "raw": {
+        "commentId": "xhs_demo_c_001",
+        "noteId": "xhs_demo_001",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H3",
+          "H6"
+        ],
+        "theme": "痛点",
+        "content": "最怕买回来孩子不愿意喝,之前有一款味道太甜直接闲置。",
+        "user": {
+          "userId": "xhs_comment_user_001",
+          "nickname": "小满妈妈"
+        },
+        "ipLocation": "浙江",
+        "likeCount": 10,
+        "subCommentCount": 3,
+        "createdAt": "2026-04-01T09:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_001"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_002",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H3",
+        "H6",
+        "H2"
+      ],
+      "author": "配料表先行",
+      "text": "外出吃饭后会备几条,小包装真的比大罐方便。",
+      "likeCount": 17,
+      "replyCount": 6,
+      "publishTime": "2026-04-02T10:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_001",
+      "parentId": "xhs_demo_001",
+      "commentId": "xhs_demo_c_002",
+      "ipLocation": "上海",
+      "theme": "场景",
+      "raw": {
+        "commentId": "xhs_demo_c_002",
+        "noteId": "xhs_demo_001",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H3",
+          "H6",
+          "H2"
+        ],
+        "theme": "场景",
+        "content": "外出吃饭后会备几条,小包装真的比大罐方便。",
+        "user": {
+          "userId": "xhs_comment_user_002",
+          "nickname": "配料表先行"
+        },
+        "ipLocation": "上海",
+        "likeCount": 17,
+        "subCommentCount": 6,
+        "createdAt": "2026-04-02T10:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_001"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_003",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H3",
+        "H6"
+      ],
+      "author": "打工人小周",
+      "text": "独立条装、常温保存、少添加是我下单前最看重的。",
+      "likeCount": 24,
+      "replyCount": 1,
+      "publishTime": "2026-04-03T11:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_001",
+      "parentId": "xhs_demo_001",
+      "commentId": "xhs_demo_c_003",
+      "ipLocation": "广东",
+      "theme": "决策",
+      "raw": {
+        "commentId": "xhs_demo_c_003",
+        "noteId": "xhs_demo_001",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H3",
+          "H6"
+        ],
+        "theme": "决策",
+        "content": "独立条装、常温保存、少添加是我下单前最看重的。",
+        "user": {
+          "userId": "xhs_comment_user_003",
+          "nickname": "打工人小周"
+        },
+        "ipLocation": "广东",
+        "likeCount": 24,
+        "subCommentCount": 1,
+        "createdAt": "2026-04-03T11:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_001"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_004",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H3",
+        "H6",
+        "H4"
+      ],
+      "author": "橙子爸",
+      "text": "吃了三天没明显变化,但一周后排便时间稳定了一点。",
+      "likeCount": 31,
+      "replyCount": 4,
+      "publishTime": "2026-04-04T12:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_001",
+      "parentId": "xhs_demo_001",
+      "commentId": "xhs_demo_c_004",
+      "ipLocation": "江苏",
+      "theme": "反馈",
+      "raw": {
+        "commentId": "xhs_demo_c_004",
+        "noteId": "xhs_demo_001",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H3",
+          "H6",
+          "H4"
+        ],
+        "theme": "反馈",
+        "content": "吃了三天没明显变化,但一周后排便时间稳定了一点。",
+        "user": {
+          "userId": "xhs_comment_user_004",
+          "nickname": "橙子爸"
+        },
+        "ipLocation": "江苏",
+        "likeCount": 31,
+        "subCommentCount": 4,
+        "createdAt": "2026-04-04T12:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_001"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_005",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H3",
+        "H6",
+        "H2"
+      ],
+      "author": "理性下单中",
+      "text": "外出吃饭后会备几条,小包装真的比大罐方便。",
+      "likeCount": 38,
+      "replyCount": 7,
+      "publishTime": "2026-04-05T13:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_002",
+      "parentId": "xhs_demo_002",
+      "commentId": "xhs_demo_c_005",
+      "ipLocation": "四川",
+      "theme": "场景",
+      "raw": {
+        "commentId": "xhs_demo_c_005",
+        "noteId": "xhs_demo_002",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H3",
+          "H6",
+          "H2"
+        ],
+        "theme": "场景",
+        "content": "外出吃饭后会备几条,小包装真的比大罐方便。",
+        "user": {
+          "userId": "xhs_comment_user_005",
+          "nickname": "理性下单中"
+        },
+        "ipLocation": "四川",
+        "likeCount": 38,
+        "subCommentCount": 7,
+        "createdAt": "2026-04-05T13:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_002"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_006",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H3",
+        "H6"
+      ],
+      "author": "不想踩雷",
+      "text": "独立条装、常温保存、少添加是我下单前最看重的。",
+      "likeCount": 45,
+      "replyCount": 2,
+      "publishTime": "2026-04-06T14:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_002",
+      "parentId": "xhs_demo_002",
+      "commentId": "xhs_demo_c_006",
+      "ipLocation": "北京",
+      "theme": "决策",
+      "raw": {
+        "commentId": "xhs_demo_c_006",
+        "noteId": "xhs_demo_002",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H3",
+          "H6"
+        ],
+        "theme": "决策",
+        "content": "独立条装、常温保存、少添加是我下单前最看重的。",
+        "user": {
+          "userId": "xhs_comment_user_006",
+          "nickname": "不想踩雷"
+        },
+        "ipLocation": "北京",
+        "likeCount": 45,
+        "subCommentCount": 2,
+        "createdAt": "2026-04-06T14:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_002"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_007",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H3",
+        "H6",
+        "H4"
+      ],
+      "author": "带娃观察员",
+      "text": "吃了三天没明显变化,但一周后排便时间稳定了一点。",
+      "likeCount": 52,
+      "replyCount": 5,
+      "publishTime": "2026-04-07T15:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_002",
+      "parentId": "xhs_demo_002",
+      "commentId": "xhs_demo_c_007",
+      "ipLocation": "福建",
+      "theme": "反馈",
+      "raw": {
+        "commentId": "xhs_demo_c_007",
+        "noteId": "xhs_demo_002",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H3",
+          "H6",
+          "H4"
+        ],
+        "theme": "反馈",
+        "content": "吃了三天没明显变化,但一周后排便时间稳定了一点。",
+        "user": {
+          "userId": "xhs_comment_user_007",
+          "nickname": "带娃观察员"
+        },
+        "ipLocation": "福建",
+        "likeCount": 52,
+        "subCommentCount": 5,
+        "createdAt": "2026-04-07T15:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_002"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_008",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H3",
+        "H6",
+        "H5"
+      ],
+      "author": "胃肠敏感星人",
+      "text": "之前买的那款结块严重,这次会特别看包装密封。",
+      "likeCount": 59,
+      "replyCount": 0,
+      "publishTime": "2026-04-08T16:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_002",
+      "parentId": "xhs_demo_002",
+      "commentId": "xhs_demo_c_008",
+      "ipLocation": "湖北",
+      "theme": "竞品",
+      "raw": {
+        "commentId": "xhs_demo_c_008",
+        "noteId": "xhs_demo_002",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H3",
+          "H6",
+          "H5"
+        ],
+        "theme": "竞品",
+        "content": "之前买的那款结块严重,这次会特别看包装密封。",
+        "user": {
+          "userId": "xhs_comment_user_008",
+          "nickname": "胃肠敏感星人"
+        },
+        "ipLocation": "湖北",
+        "likeCount": 59,
+        "subCommentCount": 0,
+        "createdAt": "2026-04-08T16:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_002"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_009",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H2",
+        "H4",
+        "H3"
+      ],
+      "author": "囤货前先问",
+      "text": "独立条装、常温保存、少添加是我下单前最看重的。",
+      "likeCount": 66,
+      "replyCount": 3,
+      "publishTime": "2026-04-09T17:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_003",
+      "parentId": "xhs_demo_003",
+      "commentId": "xhs_demo_c_009",
+      "ipLocation": "山东",
+      "theme": "决策",
+      "raw": {
+        "commentId": "xhs_demo_c_009",
+        "noteId": "xhs_demo_003",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H2",
+          "H4",
+          "H3"
+        ],
+        "theme": "决策",
+        "content": "独立条装、常温保存、少添加是我下单前最看重的。",
+        "user": {
+          "userId": "xhs_comment_user_009",
+          "nickname": "囤货前先问"
+        },
+        "ipLocation": "山东",
+        "likeCount": 66,
+        "subCommentCount": 3,
+        "createdAt": "2026-04-09T17:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_003"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_010",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H2",
+        "H4"
+      ],
+      "author": "真实反馈bot",
+      "text": "吃了三天没明显变化,但一周后排便时间稳定了一点。",
+      "likeCount": 73,
+      "replyCount": 6,
+      "publishTime": "2026-04-10T18:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_003",
+      "parentId": "xhs_demo_003",
+      "commentId": "xhs_demo_c_010",
+      "ipLocation": "重庆",
+      "theme": "反馈",
+      "raw": {
+        "commentId": "xhs_demo_c_010",
+        "noteId": "xhs_demo_003",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H2",
+          "H4"
+        ],
+        "theme": "反馈",
+        "content": "吃了三天没明显变化,但一周后排便时间稳定了一点。",
+        "user": {
+          "userId": "xhs_comment_user_010",
+          "nickname": "真实反馈bot"
+        },
+        "ipLocation": "重庆",
+        "likeCount": 73,
+        "subCommentCount": 6,
+        "createdAt": "2026-04-10T18:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_003"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_011",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H2",
+        "H4",
+        "H5"
+      ],
+      "author": "小满妈妈",
+      "text": "之前买的那款结块严重,这次会特别看包装密封。",
+      "likeCount": 80,
+      "replyCount": 1,
+      "publishTime": "2026-04-11T19:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_003",
+      "parentId": "xhs_demo_003",
+      "commentId": "xhs_demo_c_011",
+      "ipLocation": "浙江",
+      "theme": "竞品",
+      "raw": {
+        "commentId": "xhs_demo_c_011",
+        "noteId": "xhs_demo_003",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H2",
+          "H4",
+          "H5"
+        ],
+        "theme": "竞品",
+        "content": "之前买的那款结块严重,这次会特别看包装密封。",
+        "user": {
+          "userId": "xhs_comment_user_011",
+          "nickname": "小满妈妈"
+        },
+        "ipLocation": "浙江",
+        "likeCount": 80,
+        "subCommentCount": 1,
+        "createdAt": "2026-04-11T19:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_003"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_012",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H2",
+        "H4",
+        "H6"
+      ],
+      "author": "配料表先行",
+      "text": "能不能写清楚不适合哪些人?这比夸效果更重要。",
+      "likeCount": 87,
+      "replyCount": 4,
+      "publishTime": "2026-04-12T08:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_003",
+      "parentId": "xhs_demo_003",
+      "commentId": "xhs_demo_c_012",
+      "ipLocation": "上海",
+      "theme": "信任",
+      "raw": {
+        "commentId": "xhs_demo_c_012",
+        "noteId": "xhs_demo_003",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H2",
+          "H4",
+          "H6"
+        ],
+        "theme": "信任",
+        "content": "能不能写清楚不适合哪些人?这比夸效果更重要。",
+        "user": {
+          "userId": "xhs_comment_user_012",
+          "nickname": "配料表先行"
+        },
+        "ipLocation": "上海",
+        "likeCount": 87,
+        "subCommentCount": 4,
+        "createdAt": "2026-04-12T08:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_003"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_013",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H3",
+        "H7",
+        "H4"
+      ],
+      "author": "打工人小周",
+      "text": "吃了三天没明显变化,但一周后排便时间稳定了一点。",
+      "likeCount": 94,
+      "replyCount": 7,
+      "publishTime": "2026-04-13T09:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_004",
+      "parentId": "xhs_demo_004",
+      "commentId": "xhs_demo_c_013",
+      "ipLocation": "广东",
+      "theme": "反馈",
+      "raw": {
+        "commentId": "xhs_demo_c_013",
+        "noteId": "xhs_demo_004",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H3",
+          "H7",
+          "H4"
+        ],
+        "theme": "反馈",
+        "content": "吃了三天没明显变化,但一周后排便时间稳定了一点。",
+        "user": {
+          "userId": "xhs_comment_user_013",
+          "nickname": "打工人小周"
+        },
+        "ipLocation": "广东",
+        "likeCount": 94,
+        "subCommentCount": 7,
+        "createdAt": "2026-04-13T09:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_004"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_014",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H3",
+        "H7",
+        "H5"
+      ],
+      "author": "橙子爸",
+      "text": "之前买的那款结块严重,这次会特别看包装密封。",
+      "likeCount": 5,
+      "replyCount": 2,
+      "publishTime": "2026-04-14T10:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_004",
+      "parentId": "xhs_demo_004",
+      "commentId": "xhs_demo_c_014",
+      "ipLocation": "江苏",
+      "theme": "竞品",
+      "raw": {
+        "commentId": "xhs_demo_c_014",
+        "noteId": "xhs_demo_004",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H3",
+          "H7",
+          "H5"
+        ],
+        "theme": "竞品",
+        "content": "之前买的那款结块严重,这次会特别看包装密封。",
+        "user": {
+          "userId": "xhs_comment_user_014",
+          "nickname": "橙子爸"
+        },
+        "ipLocation": "江苏",
+        "likeCount": 5,
+        "subCommentCount": 2,
+        "createdAt": "2026-04-14T10:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_004"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_015",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H3",
+        "H7",
+        "H6"
+      ],
+      "author": "理性下单中",
+      "text": "能不能写清楚不适合哪些人?这比夸效果更重要。",
+      "likeCount": 12,
+      "replyCount": 5,
+      "publishTime": "2026-04-15T11:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_004",
+      "parentId": "xhs_demo_004",
+      "commentId": "xhs_demo_c_015",
+      "ipLocation": "四川",
+      "theme": "信任",
+      "raw": {
+        "commentId": "xhs_demo_c_015",
+        "noteId": "xhs_demo_004",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H3",
+          "H7",
+          "H6"
+        ],
+        "theme": "信任",
+        "content": "能不能写清楚不适合哪些人?这比夸效果更重要。",
+        "user": {
+          "userId": "xhs_comment_user_015",
+          "nickname": "理性下单中"
+        },
+        "ipLocation": "四川",
+        "likeCount": 12,
+        "subCommentCount": 5,
+        "createdAt": "2026-04-15T11:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_004"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_016",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H3",
+        "H7"
+      ],
+      "author": "不想踩雷",
+      "text": "希望先有7天试用装,有效果再买月装压力小。",
+      "likeCount": 19,
+      "replyCount": 0,
+      "publishTime": "2026-04-16T12:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_004",
+      "parentId": "xhs_demo_004",
+      "commentId": "xhs_demo_c_016",
+      "ipLocation": "北京",
+      "theme": "价格",
+      "raw": {
+        "commentId": "xhs_demo_c_016",
+        "noteId": "xhs_demo_004",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H3",
+          "H7"
+        ],
+        "theme": "价格",
+        "content": "希望先有7天试用装,有效果再买月装压力小。",
+        "user": {
+          "userId": "xhs_comment_user_016",
+          "nickname": "不想踩雷"
+        },
+        "ipLocation": "北京",
+        "likeCount": 19,
+        "subCommentCount": 0,
+        "createdAt": "2026-04-16T12:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_004"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_017",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H6",
+        "H8",
+        "H5"
+      ],
+      "author": "带娃观察员",
+      "text": "之前买的那款结块严重,这次会特别看包装密封。",
+      "likeCount": 26,
+      "replyCount": 3,
+      "publishTime": "2026-04-17T13:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_005",
+      "parentId": "xhs_demo_005",
+      "commentId": "xhs_demo_c_017",
+      "ipLocation": "福建",
+      "theme": "竞品",
+      "raw": {
+        "commentId": "xhs_demo_c_017",
+        "noteId": "xhs_demo_005",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H6",
+          "H8",
+          "H5"
+        ],
+        "theme": "竞品",
+        "content": "之前买的那款结块严重,这次会特别看包装密封。",
+        "user": {
+          "userId": "xhs_comment_user_017",
+          "nickname": "带娃观察员"
+        },
+        "ipLocation": "福建",
+        "likeCount": 26,
+        "subCommentCount": 3,
+        "createdAt": "2026-04-17T13:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_005"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_018",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H6",
+        "H8"
+      ],
+      "author": "胃肠敏感星人",
+      "text": "能不能写清楚不适合哪些人?这比夸效果更重要。",
+      "likeCount": 33,
+      "replyCount": 6,
+      "publishTime": "2026-04-18T14:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_005",
+      "parentId": "xhs_demo_005",
+      "commentId": "xhs_demo_c_018",
+      "ipLocation": "湖北",
+      "theme": "信任",
+      "raw": {
+        "commentId": "xhs_demo_c_018",
+        "noteId": "xhs_demo_005",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H6",
+          "H8"
+        ],
+        "theme": "信任",
+        "content": "能不能写清楚不适合哪些人?这比夸效果更重要。",
+        "user": {
+          "userId": "xhs_comment_user_018",
+          "nickname": "胃肠敏感星人"
+        },
+        "ipLocation": "湖北",
+        "likeCount": 33,
+        "subCommentCount": 6,
+        "createdAt": "2026-04-18T14:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_005"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_019",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H6",
+        "H8",
+        "H7"
+      ],
+      "author": "囤货前先问",
+      "text": "希望先有7天试用装,有效果再买月装压力小。",
+      "likeCount": 40,
+      "replyCount": 1,
+      "publishTime": "2026-04-19T15:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_005",
+      "parentId": "xhs_demo_005",
+      "commentId": "xhs_demo_c_019",
+      "ipLocation": "山东",
+      "theme": "价格",
+      "raw": {
+        "commentId": "xhs_demo_c_019",
+        "noteId": "xhs_demo_005",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H6",
+          "H8",
+          "H7"
+        ],
+        "theme": "价格",
+        "content": "希望先有7天试用装,有效果再买月装压力小。",
+        "user": {
+          "userId": "xhs_comment_user_019",
+          "nickname": "囤货前先问"
+        },
+        "ipLocation": "山东",
+        "likeCount": 40,
+        "subCommentCount": 1,
+        "createdAt": "2026-04-19T15:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_005"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_020",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H6",
+        "H8"
+      ],
+      "author": "真实反馈bot",
+      "text": "我喜欢7天观察卡这种内容,不像广告。",
+      "likeCount": 47,
+      "replyCount": 4,
+      "publishTime": "2026-04-20T16:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_005",
+      "parentId": "xhs_demo_005",
+      "commentId": "xhs_demo_c_020",
+      "ipLocation": "重庆",
+      "theme": "话术",
+      "raw": {
+        "commentId": "xhs_demo_c_020",
+        "noteId": "xhs_demo_005",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H6",
+          "H8"
+        ],
+        "theme": "话术",
+        "content": "我喜欢7天观察卡这种内容,不像广告。",
+        "user": {
+          "userId": "xhs_comment_user_020",
+          "nickname": "真实反馈bot"
+        },
+        "ipLocation": "重庆",
+        "likeCount": 47,
+        "subCommentCount": 4,
+        "createdAt": "2026-04-20T16:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_005"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_021",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H4",
+        "H8",
+        "H6"
+      ],
+      "author": "小满妈妈",
+      "text": "能不能写清楚不适合哪些人?这比夸效果更重要。",
+      "likeCount": 54,
+      "replyCount": 7,
+      "publishTime": "2026-04-01T17:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_006",
+      "parentId": "xhs_demo_006",
+      "commentId": "xhs_demo_c_021",
+      "ipLocation": "浙江",
+      "theme": "信任",
+      "raw": {
+        "commentId": "xhs_demo_c_021",
+        "noteId": "xhs_demo_006",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H4",
+          "H8",
+          "H6"
+        ],
+        "theme": "信任",
+        "content": "能不能写清楚不适合哪些人?这比夸效果更重要。",
+        "user": {
+          "userId": "xhs_comment_user_021",
+          "nickname": "小满妈妈"
+        },
+        "ipLocation": "浙江",
+        "likeCount": 54,
+        "subCommentCount": 7,
+        "createdAt": "2026-04-01T17:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_006"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_022",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H4",
+        "H8",
+        "H7"
+      ],
+      "author": "配料表先行",
+      "text": "希望先有7天试用装,有效果再买月装压力小。",
+      "likeCount": 61,
+      "replyCount": 2,
+      "publishTime": "2026-04-02T18:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_006",
+      "parentId": "xhs_demo_006",
+      "commentId": "xhs_demo_c_022",
+      "ipLocation": "上海",
+      "theme": "价格",
+      "raw": {
+        "commentId": "xhs_demo_c_022",
+        "noteId": "xhs_demo_006",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H4",
+          "H8",
+          "H7"
+        ],
+        "theme": "价格",
+        "content": "希望先有7天试用装,有效果再买月装压力小。",
+        "user": {
+          "userId": "xhs_comment_user_022",
+          "nickname": "配料表先行"
+        },
+        "ipLocation": "上海",
+        "likeCount": 61,
+        "subCommentCount": 2,
+        "createdAt": "2026-04-02T18:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_006"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_023",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H4",
+        "H8"
+      ],
+      "author": "打工人小周",
+      "text": "我喜欢7天观察卡这种内容,不像广告。",
+      "likeCount": 68,
+      "replyCount": 5,
+      "publishTime": "2026-04-03T19:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_006",
+      "parentId": "xhs_demo_006",
+      "commentId": "xhs_demo_c_023",
+      "ipLocation": "广东",
+      "theme": "话术",
+      "raw": {
+        "commentId": "xhs_demo_c_023",
+        "noteId": "xhs_demo_006",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H4",
+          "H8"
+        ],
+        "theme": "话术",
+        "content": "我喜欢7天观察卡这种内容,不像广告。",
+        "user": {
+          "userId": "xhs_comment_user_023",
+          "nickname": "打工人小周"
+        },
+        "ipLocation": "广东",
+        "likeCount": 68,
+        "subCommentCount": 5,
+        "createdAt": "2026-04-03T19:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_006"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_024",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H4",
+        "H8"
+      ],
+      "author": "橙子爸",
+      "text": "腹胀的时候孩子会闹,但我又不敢随便换太多产品。",
+      "likeCount": 75,
+      "replyCount": 0,
+      "publishTime": "2026-04-04T08:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_006",
+      "parentId": "xhs_demo_006",
+      "commentId": "xhs_demo_c_024",
+      "ipLocation": "江苏",
+      "theme": "痛点",
+      "raw": {
+        "commentId": "xhs_demo_c_024",
+        "noteId": "xhs_demo_006",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H4",
+          "H8"
+        ],
+        "theme": "痛点",
+        "content": "腹胀的时候孩子会闹,但我又不敢随便换太多产品。",
+        "user": {
+          "userId": "xhs_comment_user_024",
+          "nickname": "橙子爸"
+        },
+        "ipLocation": "江苏",
+        "likeCount": 75,
+        "subCommentCount": 0,
+        "createdAt": "2026-04-04T08:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_006"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_025",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H2",
+        "H3",
+        "H7"
+      ],
+      "author": "理性下单中",
+      "text": "希望先有7天试用装,有效果再买月装压力小。",
+      "likeCount": 82,
+      "replyCount": 3,
+      "publishTime": "2026-04-05T09:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_007",
+      "parentId": "xhs_demo_007",
+      "commentId": "xhs_demo_c_025",
+      "ipLocation": "四川",
+      "theme": "价格",
+      "raw": {
+        "commentId": "xhs_demo_c_025",
+        "noteId": "xhs_demo_007",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H2",
+          "H3",
+          "H7"
+        ],
+        "theme": "价格",
+        "content": "希望先有7天试用装,有效果再买月装压力小。",
+        "user": {
+          "userId": "xhs_comment_user_025",
+          "nickname": "理性下单中"
+        },
+        "ipLocation": "四川",
+        "likeCount": 82,
+        "subCommentCount": 3,
+        "createdAt": "2026-04-05T09:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_007"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_026",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H2",
+        "H3",
+        "H7",
+        "H8"
+      ],
+      "author": "不想踩雷",
+      "text": "我喜欢7天观察卡这种内容,不像广告。",
+      "likeCount": 89,
+      "replyCount": 6,
+      "publishTime": "2026-04-06T10:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_007",
+      "parentId": "xhs_demo_007",
+      "commentId": "xhs_demo_c_026",
+      "ipLocation": "北京",
+      "theme": "话术",
+      "raw": {
+        "commentId": "xhs_demo_c_026",
+        "noteId": "xhs_demo_007",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H2",
+          "H3",
+          "H7",
+          "H8"
+        ],
+        "theme": "话术",
+        "content": "我喜欢7天观察卡这种内容,不像广告。",
+        "user": {
+          "userId": "xhs_comment_user_026",
+          "nickname": "不想踩雷"
+        },
+        "ipLocation": "北京",
+        "likeCount": 89,
+        "subCommentCount": 6,
+        "createdAt": "2026-04-06T10:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_007"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_027",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H2",
+        "H3",
+        "H7",
+        "H1"
+      ],
+      "author": "带娃观察员",
+      "text": "腹胀的时候孩子会闹,但我又不敢随便换太多产品。",
+      "likeCount": 96,
+      "replyCount": 1,
+      "publishTime": "2026-04-07T11:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_007",
+      "parentId": "xhs_demo_007",
+      "commentId": "xhs_demo_c_027",
+      "ipLocation": "福建",
+      "theme": "痛点",
+      "raw": {
+        "commentId": "xhs_demo_c_027",
+        "noteId": "xhs_demo_007",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H2",
+          "H3",
+          "H7",
+          "H1"
+        ],
+        "theme": "痛点",
+        "content": "腹胀的时候孩子会闹,但我又不敢随便换太多产品。",
+        "user": {
+          "userId": "xhs_comment_user_027",
+          "nickname": "带娃观察员"
+        },
+        "ipLocation": "福建",
+        "likeCount": 96,
+        "subCommentCount": 1,
+        "createdAt": "2026-04-07T11:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_007"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_028",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H2",
+        "H3",
+        "H7"
+      ],
+      "author": "胃肠敏感星人",
+      "text": "开学和旅行后最明显,作息一乱肠胃也跟着乱。",
+      "likeCount": 7,
+      "replyCount": 4,
+      "publishTime": "2026-04-08T12:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_007",
+      "parentId": "xhs_demo_007",
+      "commentId": "xhs_demo_c_028",
+      "ipLocation": "湖北",
+      "theme": "场景",
+      "raw": {
+        "commentId": "xhs_demo_c_028",
+        "noteId": "xhs_demo_007",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H2",
+          "H3",
+          "H7"
+        ],
+        "theme": "场景",
+        "content": "开学和旅行后最明显,作息一乱肠胃也跟着乱。",
+        "user": {
+          "userId": "xhs_comment_user_028",
+          "nickname": "胃肠敏感星人"
+        },
+        "ipLocation": "湖北",
+        "likeCount": 7,
+        "subCommentCount": 4,
+        "createdAt": "2026-04-08T12:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_007"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_029",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H3",
+        "H5",
+        "H6",
+        "H8"
+      ],
+      "author": "囤货前先问",
+      "text": "我喜欢7天观察卡这种内容,不像广告。",
+      "likeCount": 14,
+      "replyCount": 7,
+      "publishTime": "2026-04-09T13:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_008",
+      "parentId": "xhs_demo_008",
+      "commentId": "xhs_demo_c_029",
+      "ipLocation": "山东",
+      "theme": "话术",
+      "raw": {
+        "commentId": "xhs_demo_c_029",
+        "noteId": "xhs_demo_008",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H3",
+          "H5",
+          "H6",
+          "H8"
+        ],
+        "theme": "话术",
+        "content": "我喜欢7天观察卡这种内容,不像广告。",
+        "user": {
+          "userId": "xhs_comment_user_029",
+          "nickname": "囤货前先问"
+        },
+        "ipLocation": "山东",
+        "likeCount": 14,
+        "subCommentCount": 7,
+        "createdAt": "2026-04-09T13:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_008"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_030",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H3",
+        "H5",
+        "H6",
+        "H1"
+      ],
+      "author": "真实反馈bot",
+      "text": "腹胀的时候孩子会闹,但我又不敢随便换太多产品。",
+      "likeCount": 21,
+      "replyCount": 2,
+      "publishTime": "2026-04-10T14:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_008",
+      "parentId": "xhs_demo_008",
+      "commentId": "xhs_demo_c_030",
+      "ipLocation": "重庆",
+      "theme": "痛点",
+      "raw": {
+        "commentId": "xhs_demo_c_030",
+        "noteId": "xhs_demo_008",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H3",
+          "H5",
+          "H6",
+          "H1"
+        ],
+        "theme": "痛点",
+        "content": "腹胀的时候孩子会闹,但我又不敢随便换太多产品。",
+        "user": {
+          "userId": "xhs_comment_user_030",
+          "nickname": "真实反馈bot"
+        },
+        "ipLocation": "重庆",
+        "likeCount": 21,
+        "subCommentCount": 2,
+        "createdAt": "2026-04-10T14:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_008"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_031",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H3",
+        "H5",
+        "H6",
+        "H2"
+      ],
+      "author": "小满妈妈",
+      "text": "开学和旅行后最明显,作息一乱肠胃也跟着乱。",
+      "likeCount": 28,
+      "replyCount": 5,
+      "publishTime": "2026-04-11T15:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_008",
+      "parentId": "xhs_demo_008",
+      "commentId": "xhs_demo_c_031",
+      "ipLocation": "浙江",
+      "theme": "场景",
+      "raw": {
+        "commentId": "xhs_demo_c_031",
+        "noteId": "xhs_demo_008",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H3",
+          "H5",
+          "H6",
+          "H2"
+        ],
+        "theme": "场景",
+        "content": "开学和旅行后最明显,作息一乱肠胃也跟着乱。",
+        "user": {
+          "userId": "xhs_comment_user_031",
+          "nickname": "小满妈妈"
+        },
+        "ipLocation": "浙江",
+        "likeCount": 28,
+        "subCommentCount": 5,
+        "createdAt": "2026-04-11T15:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_008"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_032",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H3",
+        "H5",
+        "H6"
+      ],
+      "author": "配料表先行",
+      "text": "详情页如果有适用人群表格,我会更容易判断。",
+      "likeCount": 35,
+      "replyCount": 0,
+      "publishTime": "2026-04-12T16:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_008",
+      "parentId": "xhs_demo_008",
+      "commentId": "xhs_demo_c_032",
+      "ipLocation": "上海",
+      "theme": "决策",
+      "raw": {
+        "commentId": "xhs_demo_c_032",
+        "noteId": "xhs_demo_008",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H3",
+          "H5",
+          "H6"
+        ],
+        "theme": "决策",
+        "content": "详情页如果有适用人群表格,我会更容易判断。",
+        "user": {
+          "userId": "xhs_comment_user_032",
+          "nickname": "配料表先行"
+        },
+        "ipLocation": "上海",
+        "likeCount": 35,
+        "subCommentCount": 0,
+        "createdAt": "2026-04-12T16:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_008"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_033",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H4",
+        "H6",
+        "H1"
+      ],
+      "author": "打工人小周",
+      "text": "腹胀的时候孩子会闹,但我又不敢随便换太多产品。",
+      "likeCount": 42,
+      "replyCount": 3,
+      "publishTime": "2026-04-13T17:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_009",
+      "parentId": "xhs_demo_009",
+      "commentId": "xhs_demo_c_033",
+      "ipLocation": "广东",
+      "theme": "痛点",
+      "raw": {
+        "commentId": "xhs_demo_c_033",
+        "noteId": "xhs_demo_009",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H4",
+          "H6",
+          "H1"
+        ],
+        "theme": "痛点",
+        "content": "腹胀的时候孩子会闹,但我又不敢随便换太多产品。",
+        "user": {
+          "userId": "xhs_comment_user_033",
+          "nickname": "打工人小周"
+        },
+        "ipLocation": "广东",
+        "likeCount": 42,
+        "subCommentCount": 3,
+        "createdAt": "2026-04-13T17:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_009"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_034",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H4",
+        "H6",
+        "H2"
+      ],
+      "author": "橙子爸",
+      "text": "开学和旅行后最明显,作息一乱肠胃也跟着乱。",
+      "likeCount": 49,
+      "replyCount": 6,
+      "publishTime": "2026-04-14T18:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_009",
+      "parentId": "xhs_demo_009",
+      "commentId": "xhs_demo_c_034",
+      "ipLocation": "江苏",
+      "theme": "场景",
+      "raw": {
+        "commentId": "xhs_demo_c_034",
+        "noteId": "xhs_demo_009",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H4",
+          "H6",
+          "H2"
+        ],
+        "theme": "场景",
+        "content": "开学和旅行后最明显,作息一乱肠胃也跟着乱。",
+        "user": {
+          "userId": "xhs_comment_user_034",
+          "nickname": "橙子爸"
+        },
+        "ipLocation": "江苏",
+        "likeCount": 49,
+        "subCommentCount": 6,
+        "createdAt": "2026-04-14T18:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_009"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_035",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H4",
+        "H6",
+        "H3"
+      ],
+      "author": "理性下单中",
+      "text": "详情页如果有适用人群表格,我会更容易判断。",
+      "likeCount": 56,
+      "replyCount": 1,
+      "publishTime": "2026-04-15T19:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_009",
+      "parentId": "xhs_demo_009",
+      "commentId": "xhs_demo_c_035",
+      "ipLocation": "四川",
+      "theme": "决策",
+      "raw": {
+        "commentId": "xhs_demo_c_035",
+        "noteId": "xhs_demo_009",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H4",
+          "H6",
+          "H3"
+        ],
+        "theme": "决策",
+        "content": "详情页如果有适用人群表格,我会更容易判断。",
+        "user": {
+          "userId": "xhs_comment_user_035",
+          "nickname": "理性下单中"
+        },
+        "ipLocation": "四川",
+        "likeCount": 56,
+        "subCommentCount": 1,
+        "createdAt": "2026-04-15T19:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_009"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_036",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H4",
+        "H6"
+      ],
+      "author": "不想踩雷",
+      "text": "味道淡孩子能接受,坚持下来比参数更重要。",
+      "likeCount": 63,
+      "replyCount": 4,
+      "publishTime": "2026-04-16T08:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_009",
+      "parentId": "xhs_demo_009",
+      "commentId": "xhs_demo_c_036",
+      "ipLocation": "北京",
+      "theme": "反馈",
+      "raw": {
+        "commentId": "xhs_demo_c_036",
+        "noteId": "xhs_demo_009",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H4",
+          "H6"
+        ],
+        "theme": "反馈",
+        "content": "味道淡孩子能接受,坚持下来比参数更重要。",
+        "user": {
+          "userId": "xhs_comment_user_036",
+          "nickname": "不想踩雷"
+        },
+        "ipLocation": "北京",
+        "likeCount": 63,
+        "subCommentCount": 4,
+        "createdAt": "2026-04-16T08:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_009"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_037",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H3",
+        "H8",
+        "H2"
+      ],
+      "author": "带娃观察员",
+      "text": "开学和旅行后最明显,作息一乱肠胃也跟着乱。",
+      "likeCount": 70,
+      "replyCount": 7,
+      "publishTime": "2026-04-17T09:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_010",
+      "parentId": "xhs_demo_010",
+      "commentId": "xhs_demo_c_037",
+      "ipLocation": "福建",
+      "theme": "场景",
+      "raw": {
+        "commentId": "xhs_demo_c_037",
+        "noteId": "xhs_demo_010",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H3",
+          "H8",
+          "H2"
+        ],
+        "theme": "场景",
+        "content": "开学和旅行后最明显,作息一乱肠胃也跟着乱。",
+        "user": {
+          "userId": "xhs_comment_user_037",
+          "nickname": "带娃观察员"
+        },
+        "ipLocation": "福建",
+        "likeCount": 70,
+        "subCommentCount": 7,
+        "createdAt": "2026-04-17T09:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_010"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_038",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H3",
+        "H8"
+      ],
+      "author": "胃肠敏感星人",
+      "text": "详情页如果有适用人群表格,我会更容易判断。",
+      "likeCount": 77,
+      "replyCount": 2,
+      "publishTime": "2026-04-18T10:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_010",
+      "parentId": "xhs_demo_010",
+      "commentId": "xhs_demo_c_038",
+      "ipLocation": "湖北",
+      "theme": "决策",
+      "raw": {
+        "commentId": "xhs_demo_c_038",
+        "noteId": "xhs_demo_010",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H3",
+          "H8"
+        ],
+        "theme": "决策",
+        "content": "详情页如果有适用人群表格,我会更容易判断。",
+        "user": {
+          "userId": "xhs_comment_user_038",
+          "nickname": "胃肠敏感星人"
+        },
+        "ipLocation": "湖北",
+        "likeCount": 77,
+        "subCommentCount": 2,
+        "createdAt": "2026-04-18T10:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_010"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_039",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H3",
+        "H8",
+        "H4"
+      ],
+      "author": "囤货前先问",
+      "text": "味道淡孩子能接受,坚持下来比参数更重要。",
+      "likeCount": 84,
+      "replyCount": 5,
+      "publishTime": "2026-04-19T11:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_010",
+      "parentId": "xhs_demo_010",
+      "commentId": "xhs_demo_c_039",
+      "ipLocation": "山东",
+      "theme": "反馈",
+      "raw": {
+        "commentId": "xhs_demo_c_039",
+        "noteId": "xhs_demo_010",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H3",
+          "H8",
+          "H4"
+        ],
+        "theme": "反馈",
+        "content": "味道淡孩子能接受,坚持下来比参数更重要。",
+        "user": {
+          "userId": "xhs_comment_user_039",
+          "nickname": "囤货前先问"
+        },
+        "ipLocation": "山东",
+        "likeCount": 84,
+        "subCommentCount": 5,
+        "createdAt": "2026-04-19T11:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_010"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_040",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H3",
+        "H8",
+        "H5"
+      ],
+      "author": "真实反馈bot",
+      "text": "进口牌子贵但说明详细,国产牌子客服回复快。",
+      "likeCount": 91,
+      "replyCount": 0,
+      "publishTime": "2026-04-20T12:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_010",
+      "parentId": "xhs_demo_010",
+      "commentId": "xhs_demo_c_040",
+      "ipLocation": "重庆",
+      "theme": "竞品",
+      "raw": {
+        "commentId": "xhs_demo_c_040",
+        "noteId": "xhs_demo_010",
+        "platform": "xiaohongshu",
+        "keyword": "儿童益生菌怎么选",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H3",
+          "H8",
+          "H5"
+        ],
+        "theme": "竞品",
+        "content": "进口牌子贵但说明详细,国产牌子客服回复快。",
+        "user": {
+          "userId": "xhs_comment_user_040",
+          "nickname": "真实反馈bot"
+        },
+        "ipLocation": "重庆",
+        "likeCount": 91,
+        "subCommentCount": 0,
+        "createdAt": "2026-04-20T12:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_010"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_041",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H2",
+        "H4",
+        "H3"
+      ],
+      "author": "小满妈妈",
+      "text": "详情页如果有适用人群表格,我会更容易判断。",
+      "likeCount": 98,
+      "replyCount": 3,
+      "publishTime": "2026-04-01T13:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_011",
+      "parentId": "xhs_demo_011",
+      "commentId": "xhs_demo_c_041",
+      "ipLocation": "浙江",
+      "theme": "决策",
+      "raw": {
+        "commentId": "xhs_demo_c_041",
+        "noteId": "xhs_demo_011",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H2",
+          "H4",
+          "H3"
+        ],
+        "theme": "决策",
+        "content": "详情页如果有适用人群表格,我会更容易判断。",
+        "user": {
+          "userId": "xhs_comment_user_041",
+          "nickname": "小满妈妈"
+        },
+        "ipLocation": "浙江",
+        "likeCount": 98,
+        "subCommentCount": 3,
+        "createdAt": "2026-04-01T13:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_011"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_042",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H2",
+        "H4"
+      ],
+      "author": "配料表先行",
+      "text": "味道淡孩子能接受,坚持下来比参数更重要。",
+      "likeCount": 9,
+      "replyCount": 6,
+      "publishTime": "2026-04-02T14:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_011",
+      "parentId": "xhs_demo_011",
+      "commentId": "xhs_demo_c_042",
+      "ipLocation": "上海",
+      "theme": "反馈",
+      "raw": {
+        "commentId": "xhs_demo_c_042",
+        "noteId": "xhs_demo_011",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H2",
+          "H4"
+        ],
+        "theme": "反馈",
+        "content": "味道淡孩子能接受,坚持下来比参数更重要。",
+        "user": {
+          "userId": "xhs_comment_user_042",
+          "nickname": "配料表先行"
+        },
+        "ipLocation": "上海",
+        "likeCount": 9,
+        "subCommentCount": 6,
+        "createdAt": "2026-04-02T14:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_011"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_043",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H2",
+        "H4",
+        "H5"
+      ],
+      "author": "打工人小周",
+      "text": "进口牌子贵但说明详细,国产牌子客服回复快。",
+      "likeCount": 16,
+      "replyCount": 1,
+      "publishTime": "2026-04-03T15:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_011",
+      "parentId": "xhs_demo_011",
+      "commentId": "xhs_demo_c_043",
+      "ipLocation": "广东",
+      "theme": "竞品",
+      "raw": {
+        "commentId": "xhs_demo_c_043",
+        "noteId": "xhs_demo_011",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H2",
+          "H4",
+          "H5"
+        ],
+        "theme": "竞品",
+        "content": "进口牌子贵但说明详细,国产牌子客服回复快。",
+        "user": {
+          "userId": "xhs_comment_user_043",
+          "nickname": "打工人小周"
+        },
+        "ipLocation": "广东",
+        "likeCount": 16,
+        "subCommentCount": 1,
+        "createdAt": "2026-04-03T15:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_011"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_044",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H2",
+        "H4",
+        "H6"
+      ],
+      "author": "橙子爸",
+      "text": "过敏原、糖醇、香精这些最好直接标出来。",
+      "likeCount": 23,
+      "replyCount": 4,
+      "publishTime": "2026-04-04T16:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_011",
+      "parentId": "xhs_demo_011",
+      "commentId": "xhs_demo_c_044",
+      "ipLocation": "江苏",
+      "theme": "信任",
+      "raw": {
+        "commentId": "xhs_demo_c_044",
+        "noteId": "xhs_demo_011",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H2",
+          "H4",
+          "H6"
+        ],
+        "theme": "信任",
+        "content": "过敏原、糖醇、香精这些最好直接标出来。",
+        "user": {
+          "userId": "xhs_comment_user_044",
+          "nickname": "橙子爸"
+        },
+        "ipLocation": "江苏",
+        "likeCount": 23,
+        "subCommentCount": 4,
+        "createdAt": "2026-04-04T16:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_011"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_045",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H4",
+        "H6"
+      ],
+      "author": "理性下单中",
+      "text": "味道淡孩子能接受,坚持下来比参数更重要。",
+      "likeCount": 30,
+      "replyCount": 7,
+      "publishTime": "2026-04-05T17:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_012",
+      "parentId": "xhs_demo_012",
+      "commentId": "xhs_demo_c_045",
+      "ipLocation": "四川",
+      "theme": "反馈",
+      "raw": {
+        "commentId": "xhs_demo_c_045",
+        "noteId": "xhs_demo_012",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H4",
+          "H6"
+        ],
+        "theme": "反馈",
+        "content": "味道淡孩子能接受,坚持下来比参数更重要。",
+        "user": {
+          "userId": "xhs_comment_user_045",
+          "nickname": "理性下单中"
+        },
+        "ipLocation": "四川",
+        "likeCount": 30,
+        "subCommentCount": 7,
+        "createdAt": "2026-04-05T17:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_012"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_046",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H4",
+        "H6",
+        "H5"
+      ],
+      "author": "不想踩雷",
+      "text": "进口牌子贵但说明详细,国产牌子客服回复快。",
+      "likeCount": 37,
+      "replyCount": 2,
+      "publishTime": "2026-04-06T18:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_012",
+      "parentId": "xhs_demo_012",
+      "commentId": "xhs_demo_c_046",
+      "ipLocation": "北京",
+      "theme": "竞品",
+      "raw": {
+        "commentId": "xhs_demo_c_046",
+        "noteId": "xhs_demo_012",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H4",
+          "H6",
+          "H5"
+        ],
+        "theme": "竞品",
+        "content": "进口牌子贵但说明详细,国产牌子客服回复快。",
+        "user": {
+          "userId": "xhs_comment_user_046",
+          "nickname": "不想踩雷"
+        },
+        "ipLocation": "北京",
+        "likeCount": 37,
+        "subCommentCount": 2,
+        "createdAt": "2026-04-06T18:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_012"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_047",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H4",
+        "H6"
+      ],
+      "author": "带娃观察员",
+      "text": "过敏原、糖醇、香精这些最好直接标出来。",
+      "likeCount": 44,
+      "replyCount": 5,
+      "publishTime": "2026-04-07T19:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_012",
+      "parentId": "xhs_demo_012",
+      "commentId": "xhs_demo_c_047",
+      "ipLocation": "福建",
+      "theme": "信任",
+      "raw": {
+        "commentId": "xhs_demo_c_047",
+        "noteId": "xhs_demo_012",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H4",
+          "H6"
+        ],
+        "theme": "信任",
+        "content": "过敏原、糖醇、香精这些最好直接标出来。",
+        "user": {
+          "userId": "xhs_comment_user_047",
+          "nickname": "带娃观察员"
+        },
+        "ipLocation": "福建",
+        "likeCount": 44,
+        "subCommentCount": 5,
+        "createdAt": "2026-04-07T19:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_012"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_048",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H4",
+        "H6",
+        "H7"
+      ],
+      "author": "胃肠敏感星人",
+      "text": "一盒够吃一个月最省心,太多规格反而选择困难。",
+      "likeCount": 51,
+      "replyCount": 0,
+      "publishTime": "2026-04-08T08:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_012",
+      "parentId": "xhs_demo_012",
+      "commentId": "xhs_demo_c_048",
+      "ipLocation": "湖北",
+      "theme": "价格",
+      "raw": {
+        "commentId": "xhs_demo_c_048",
+        "noteId": "xhs_demo_012",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H4",
+          "H6",
+          "H7"
+        ],
+        "theme": "价格",
+        "content": "一盒够吃一个月最省心,太多规格反而选择困难。",
+        "user": {
+          "userId": "xhs_comment_user_048",
+          "nickname": "胃肠敏感星人"
+        },
+        "ipLocation": "湖北",
+        "likeCount": 51,
+        "subCommentCount": 0,
+        "createdAt": "2026-04-08T08:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_012"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_049",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H2",
+        "H4",
+        "H5"
+      ],
+      "author": "囤货前先问",
+      "text": "进口牌子贵但说明详细,国产牌子客服回复快。",
+      "likeCount": 58,
+      "replyCount": 3,
+      "publishTime": "2026-04-09T09:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_013",
+      "parentId": "xhs_demo_013",
+      "commentId": "xhs_demo_c_049",
+      "ipLocation": "山东",
+      "theme": "竞品",
+      "raw": {
+        "commentId": "xhs_demo_c_049",
+        "noteId": "xhs_demo_013",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H2",
+          "H4",
+          "H5"
+        ],
+        "theme": "竞品",
+        "content": "进口牌子贵但说明详细,国产牌子客服回复快。",
+        "user": {
+          "userId": "xhs_comment_user_049",
+          "nickname": "囤货前先问"
+        },
+        "ipLocation": "山东",
+        "likeCount": 58,
+        "subCommentCount": 3,
+        "createdAt": "2026-04-09T09:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_013"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_050",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H2",
+        "H4",
+        "H6"
+      ],
+      "author": "真实反馈bot",
+      "text": "过敏原、糖醇、香精这些最好直接标出来。",
+      "likeCount": 65,
+      "replyCount": 6,
+      "publishTime": "2026-04-10T10:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_013",
+      "parentId": "xhs_demo_013",
+      "commentId": "xhs_demo_c_050",
+      "ipLocation": "重庆",
+      "theme": "信任",
+      "raw": {
+        "commentId": "xhs_demo_c_050",
+        "noteId": "xhs_demo_013",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H2",
+          "H4",
+          "H6"
+        ],
+        "theme": "信任",
+        "content": "过敏原、糖醇、香精这些最好直接标出来。",
+        "user": {
+          "userId": "xhs_comment_user_050",
+          "nickname": "真实反馈bot"
+        },
+        "ipLocation": "重庆",
+        "likeCount": 65,
+        "subCommentCount": 6,
+        "createdAt": "2026-04-10T10:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_013"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_051",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H2",
+        "H4",
+        "H7"
+      ],
+      "author": "小满妈妈",
+      "text": "一盒够吃一个月最省心,太多规格反而选择困难。",
+      "likeCount": 72,
+      "replyCount": 1,
+      "publishTime": "2026-04-11T11:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_013",
+      "parentId": "xhs_demo_013",
+      "commentId": "xhs_demo_c_051",
+      "ipLocation": "浙江",
+      "theme": "价格",
+      "raw": {
+        "commentId": "xhs_demo_c_051",
+        "noteId": "xhs_demo_013",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H2",
+          "H4",
+          "H7"
+        ],
+        "theme": "价格",
+        "content": "一盒够吃一个月最省心,太多规格反而选择困难。",
+        "user": {
+          "userId": "xhs_comment_user_051",
+          "nickname": "小满妈妈"
+        },
+        "ipLocation": "浙江",
+        "likeCount": 72,
+        "subCommentCount": 1,
+        "createdAt": "2026-04-11T11:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_013"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_052",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H2",
+        "H4",
+        "H8"
+      ],
+      "author": "配料表先行",
+      "text": "把活菌数翻译成怎么吃、吃多久、怎么看变化会更有用。",
+      "likeCount": 79,
+      "replyCount": 4,
+      "publishTime": "2026-04-12T12:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_013",
+      "parentId": "xhs_demo_013",
+      "commentId": "xhs_demo_c_052",
+      "ipLocation": "上海",
+      "theme": "话术",
+      "raw": {
+        "commentId": "xhs_demo_c_052",
+        "noteId": "xhs_demo_013",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H2",
+          "H4",
+          "H8"
+        ],
+        "theme": "话术",
+        "content": "把活菌数翻译成怎么吃、吃多久、怎么看变化会更有用。",
+        "user": {
+          "userId": "xhs_comment_user_052",
+          "nickname": "配料表先行"
+        },
+        "ipLocation": "上海",
+        "likeCount": 79,
+        "subCommentCount": 4,
+        "createdAt": "2026-04-12T12:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_013"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_053",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H3",
+        "H4",
+        "H6"
+      ],
+      "author": "打工人小周",
+      "text": "过敏原、糖醇、香精这些最好直接标出来。",
+      "likeCount": 86,
+      "replyCount": 7,
+      "publishTime": "2026-04-13T13:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_014",
+      "parentId": "xhs_demo_014",
+      "commentId": "xhs_demo_c_053",
+      "ipLocation": "广东",
+      "theme": "信任",
+      "raw": {
+        "commentId": "xhs_demo_c_053",
+        "noteId": "xhs_demo_014",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H3",
+          "H4",
+          "H6"
+        ],
+        "theme": "信任",
+        "content": "过敏原、糖醇、香精这些最好直接标出来。",
+        "user": {
+          "userId": "xhs_comment_user_053",
+          "nickname": "打工人小周"
+        },
+        "ipLocation": "广东",
+        "likeCount": 86,
+        "subCommentCount": 7,
+        "createdAt": "2026-04-13T13:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_014"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_054",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H3",
+        "H4",
+        "H7"
+      ],
+      "author": "橙子爸",
+      "text": "一盒够吃一个月最省心,太多规格反而选择困难。",
+      "likeCount": 93,
+      "replyCount": 2,
+      "publishTime": "2026-04-14T14:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_014",
+      "parentId": "xhs_demo_014",
+      "commentId": "xhs_demo_c_054",
+      "ipLocation": "江苏",
+      "theme": "价格",
+      "raw": {
+        "commentId": "xhs_demo_c_054",
+        "noteId": "xhs_demo_014",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H3",
+          "H4",
+          "H7"
+        ],
+        "theme": "价格",
+        "content": "一盒够吃一个月最省心,太多规格反而选择困难。",
+        "user": {
+          "userId": "xhs_comment_user_054",
+          "nickname": "橙子爸"
+        },
+        "ipLocation": "江苏",
+        "likeCount": 93,
+        "subCommentCount": 2,
+        "createdAt": "2026-04-14T14:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_014"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_055",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H3",
+        "H4",
+        "H8"
+      ],
+      "author": "理性下单中",
+      "text": "把活菌数翻译成怎么吃、吃多久、怎么看变化会更有用。",
+      "likeCount": 4,
+      "replyCount": 5,
+      "publishTime": "2026-04-15T15:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_014",
+      "parentId": "xhs_demo_014",
+      "commentId": "xhs_demo_c_055",
+      "ipLocation": "四川",
+      "theme": "话术",
+      "raw": {
+        "commentId": "xhs_demo_c_055",
+        "noteId": "xhs_demo_014",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H3",
+          "H4",
+          "H8"
+        ],
+        "theme": "话术",
+        "content": "把活菌数翻译成怎么吃、吃多久、怎么看变化会更有用。",
+        "user": {
+          "userId": "xhs_comment_user_055",
+          "nickname": "理性下单中"
+        },
+        "ipLocation": "四川",
+        "likeCount": 4,
+        "subCommentCount": 5,
+        "createdAt": "2026-04-15T15:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_014"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_056",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H3",
+        "H4"
+      ],
+      "author": "不想踩雷",
+      "text": "我们家主要是排便不规律,想知道吃多久能观察到变化。",
+      "likeCount": 11,
+      "replyCount": 0,
+      "publishTime": "2026-04-16T16:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_014",
+      "parentId": "xhs_demo_014",
+      "commentId": "xhs_demo_c_056",
+      "ipLocation": "北京",
+      "theme": "痛点",
+      "raw": {
+        "commentId": "xhs_demo_c_056",
+        "noteId": "xhs_demo_014",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H3",
+          "H4"
+        ],
+        "theme": "痛点",
+        "content": "我们家主要是排便不规律,想知道吃多久能观察到变化。",
+        "user": {
+          "userId": "xhs_comment_user_056",
+          "nickname": "不想踩雷"
+        },
+        "ipLocation": "北京",
+        "likeCount": 11,
+        "subCommentCount": 0,
+        "createdAt": "2026-04-16T16:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_014"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_057",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H2",
+        "H8",
+        "H7"
+      ],
+      "author": "带娃观察员",
+      "text": "一盒够吃一个月最省心,太多规格反而选择困难。",
+      "likeCount": 18,
+      "replyCount": 3,
+      "publishTime": "2026-04-17T17:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_015",
+      "parentId": "xhs_demo_015",
+      "commentId": "xhs_demo_c_057",
+      "ipLocation": "福建",
+      "theme": "价格",
+      "raw": {
+        "commentId": "xhs_demo_c_057",
+        "noteId": "xhs_demo_015",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H2",
+          "H8",
+          "H7"
+        ],
+        "theme": "价格",
+        "content": "一盒够吃一个月最省心,太多规格反而选择困难。",
+        "user": {
+          "userId": "xhs_comment_user_057",
+          "nickname": "带娃观察员"
+        },
+        "ipLocation": "福建",
+        "likeCount": 18,
+        "subCommentCount": 3,
+        "createdAt": "2026-04-17T17:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_015"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_058",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H2",
+        "H8"
+      ],
+      "author": "胃肠敏感星人",
+      "text": "把活菌数翻译成怎么吃、吃多久、怎么看变化会更有用。",
+      "likeCount": 25,
+      "replyCount": 6,
+      "publishTime": "2026-04-18T18:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_015",
+      "parentId": "xhs_demo_015",
+      "commentId": "xhs_demo_c_058",
+      "ipLocation": "湖北",
+      "theme": "话术",
+      "raw": {
+        "commentId": "xhs_demo_c_058",
+        "noteId": "xhs_demo_015",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H2",
+          "H8"
+        ],
+        "theme": "话术",
+        "content": "把活菌数翻译成怎么吃、吃多久、怎么看变化会更有用。",
+        "user": {
+          "userId": "xhs_comment_user_058",
+          "nickname": "胃肠敏感星人"
+        },
+        "ipLocation": "湖北",
+        "likeCount": 25,
+        "subCommentCount": 6,
+        "createdAt": "2026-04-18T18:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_015"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_059",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H2",
+        "H8",
+        "H1"
+      ],
+      "author": "囤货前先问",
+      "text": "我们家主要是排便不规律,想知道吃多久能观察到变化。",
+      "likeCount": 32,
+      "replyCount": 1,
+      "publishTime": "2026-04-19T19:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_015",
+      "parentId": "xhs_demo_015",
+      "commentId": "xhs_demo_c_059",
+      "ipLocation": "山东",
+      "theme": "痛点",
+      "raw": {
+        "commentId": "xhs_demo_c_059",
+        "noteId": "xhs_demo_015",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H2",
+          "H8",
+          "H1"
+        ],
+        "theme": "痛点",
+        "content": "我们家主要是排便不规律,想知道吃多久能观察到变化。",
+        "user": {
+          "userId": "xhs_comment_user_059",
+          "nickname": "囤货前先问"
+        },
+        "ipLocation": "山东",
+        "likeCount": 32,
+        "subCommentCount": 1,
+        "createdAt": "2026-04-19T19:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_015"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_060",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H2",
+        "H8"
+      ],
+      "author": "真实反馈bot",
+      "text": "老人帮忙带娃时说明要简单,不然冲调水温总搞错。",
+      "likeCount": 39,
+      "replyCount": 4,
+      "publishTime": "2026-04-20T08:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_015",
+      "parentId": "xhs_demo_015",
+      "commentId": "xhs_demo_c_060",
+      "ipLocation": "重庆",
+      "theme": "场景",
+      "raw": {
+        "commentId": "xhs_demo_c_060",
+        "noteId": "xhs_demo_015",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H2",
+          "H8"
+        ],
+        "theme": "场景",
+        "content": "老人帮忙带娃时说明要简单,不然冲调水温总搞错。",
+        "user": {
+          "userId": "xhs_comment_user_060",
+          "nickname": "真实反馈bot"
+        },
+        "ipLocation": "重庆",
+        "likeCount": 39,
+        "subCommentCount": 4,
+        "createdAt": "2026-04-20T08:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_015"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_061",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H4",
+        "H6",
+        "H8"
+      ],
+      "author": "小满妈妈",
+      "text": "把活菌数翻译成怎么吃、吃多久、怎么看变化会更有用。",
+      "likeCount": 46,
+      "replyCount": 7,
+      "publishTime": "2026-04-01T09:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_016",
+      "parentId": "xhs_demo_016",
+      "commentId": "xhs_demo_c_061",
+      "ipLocation": "浙江",
+      "theme": "话术",
+      "raw": {
+        "commentId": "xhs_demo_c_061",
+        "noteId": "xhs_demo_016",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H4",
+          "H6",
+          "H8"
+        ],
+        "theme": "话术",
+        "content": "把活菌数翻译成怎么吃、吃多久、怎么看变化会更有用。",
+        "user": {
+          "userId": "xhs_comment_user_061",
+          "nickname": "小满妈妈"
+        },
+        "ipLocation": "浙江",
+        "likeCount": 46,
+        "subCommentCount": 7,
+        "createdAt": "2026-04-01T09:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_016"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_062",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H4",
+        "H6",
+        "H1"
+      ],
+      "author": "配料表先行",
+      "text": "我们家主要是排便不规律,想知道吃多久能观察到变化。",
+      "likeCount": 53,
+      "replyCount": 2,
+      "publishTime": "2026-04-02T10:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_016",
+      "parentId": "xhs_demo_016",
+      "commentId": "xhs_demo_c_062",
+      "ipLocation": "上海",
+      "theme": "痛点",
+      "raw": {
+        "commentId": "xhs_demo_c_062",
+        "noteId": "xhs_demo_016",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H4",
+          "H6",
+          "H1"
+        ],
+        "theme": "痛点",
+        "content": "我们家主要是排便不规律,想知道吃多久能观察到变化。",
+        "user": {
+          "userId": "xhs_comment_user_062",
+          "nickname": "配料表先行"
+        },
+        "ipLocation": "上海",
+        "likeCount": 53,
+        "subCommentCount": 2,
+        "createdAt": "2026-04-02T10:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_016"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_063",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H4",
+        "H6",
+        "H2"
+      ],
+      "author": "打工人小周",
+      "text": "老人帮忙带娃时说明要简单,不然冲调水温总搞错。",
+      "likeCount": 60,
+      "replyCount": 5,
+      "publishTime": "2026-04-03T11:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_016",
+      "parentId": "xhs_demo_016",
+      "commentId": "xhs_demo_c_063",
+      "ipLocation": "广东",
+      "theme": "场景",
+      "raw": {
+        "commentId": "xhs_demo_c_063",
+        "noteId": "xhs_demo_016",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H4",
+          "H6",
+          "H2"
+        ],
+        "theme": "场景",
+        "content": "老人帮忙带娃时说明要简单,不然冲调水温总搞错。",
+        "user": {
+          "userId": "xhs_comment_user_063",
+          "nickname": "打工人小周"
+        },
+        "ipLocation": "广东",
+        "likeCount": 60,
+        "subCommentCount": 5,
+        "createdAt": "2026-04-03T11:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_016"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_064",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H7"
+      ],
+      "author": "橙子爸",
+      "text": "我们家主要是排便不规律,想知道吃多久能观察到变化。",
+      "likeCount": 67,
+      "replyCount": 0,
+      "publishTime": "2026-04-04T12:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_017",
+      "parentId": "xhs_demo_017",
+      "commentId": "xhs_demo_c_064",
+      "ipLocation": "江苏",
+      "theme": "痛点",
+      "raw": {
+        "commentId": "xhs_demo_c_064",
+        "noteId": "xhs_demo_017",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H7"
+        ],
+        "theme": "痛点",
+        "content": "我们家主要是排便不规律,想知道吃多久能观察到变化。",
+        "user": {
+          "userId": "xhs_comment_user_064",
+          "nickname": "橙子爸"
+        },
+        "ipLocation": "江苏",
+        "likeCount": 67,
+        "subCommentCount": 0,
+        "createdAt": "2026-04-04T12:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_017"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_065",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H7",
+        "H2"
+      ],
+      "author": "理性下单中",
+      "text": "老人帮忙带娃时说明要简单,不然冲调水温总搞错。",
+      "likeCount": 74,
+      "replyCount": 3,
+      "publishTime": "2026-04-05T13:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_017",
+      "parentId": "xhs_demo_017",
+      "commentId": "xhs_demo_c_065",
+      "ipLocation": "四川",
+      "theme": "场景",
+      "raw": {
+        "commentId": "xhs_demo_c_065",
+        "noteId": "xhs_demo_017",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H7",
+          "H2"
+        ],
+        "theme": "场景",
+        "content": "老人帮忙带娃时说明要简单,不然冲调水温总搞错。",
+        "user": {
+          "userId": "xhs_comment_user_065",
+          "nickname": "理性下单中"
+        },
+        "ipLocation": "四川",
+        "likeCount": 74,
+        "subCommentCount": 3,
+        "createdAt": "2026-04-05T13:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_017"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_066",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H7",
+        "H3"
+      ],
+      "author": "不想踩雷",
+      "text": "我会先看菌株编号和配料表,客服讲不清楚就不下单。",
+      "likeCount": 81,
+      "replyCount": 6,
+      "publishTime": "2026-04-06T14:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_017",
+      "parentId": "xhs_demo_017",
+      "commentId": "xhs_demo_c_066",
+      "ipLocation": "北京",
+      "theme": "决策",
+      "raw": {
+        "commentId": "xhs_demo_c_066",
+        "noteId": "xhs_demo_017",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H7",
+          "H3"
+        ],
+        "theme": "决策",
+        "content": "我会先看菌株编号和配料表,客服讲不清楚就不下单。",
+        "user": {
+          "userId": "xhs_comment_user_066",
+          "nickname": "不想踩雷"
+        },
+        "ipLocation": "北京",
+        "likeCount": 81,
+        "subCommentCount": 6,
+        "createdAt": "2026-04-06T14:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_017"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_067",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H3",
+        "H4",
+        "H8",
+        "H2"
+      ],
+      "author": "带娃观察员",
+      "text": "老人帮忙带娃时说明要简单,不然冲调水温总搞错。",
+      "likeCount": 88,
+      "replyCount": 1,
+      "publishTime": "2026-04-07T15:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_018",
+      "parentId": "xhs_demo_018",
+      "commentId": "xhs_demo_c_067",
+      "ipLocation": "福建",
+      "theme": "场景",
+      "raw": {
+        "commentId": "xhs_demo_c_067",
+        "noteId": "xhs_demo_018",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H3",
+          "H4",
+          "H8",
+          "H2"
+        ],
+        "theme": "场景",
+        "content": "老人帮忙带娃时说明要简单,不然冲调水温总搞错。",
+        "user": {
+          "userId": "xhs_comment_user_067",
+          "nickname": "带娃观察员"
+        },
+        "ipLocation": "福建",
+        "likeCount": 88,
+        "subCommentCount": 1,
+        "createdAt": "2026-04-07T15:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_018"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_068",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H3",
+        "H4",
+        "H8"
+      ],
+      "author": "胃肠敏感星人",
+      "text": "我会先看菌株编号和配料表,客服讲不清楚就不下单。",
+      "likeCount": 95,
+      "replyCount": 4,
+      "publishTime": "2026-04-08T16:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_018",
+      "parentId": "xhs_demo_018",
+      "commentId": "xhs_demo_c_068",
+      "ipLocation": "湖北",
+      "theme": "决策",
+      "raw": {
+        "commentId": "xhs_demo_c_068",
+        "noteId": "xhs_demo_018",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H3",
+          "H4",
+          "H8"
+        ],
+        "theme": "决策",
+        "content": "我会先看菌株编号和配料表,客服讲不清楚就不下单。",
+        "user": {
+          "userId": "xhs_comment_user_068",
+          "nickname": "胃肠敏感星人"
+        },
+        "ipLocation": "湖北",
+        "likeCount": 95,
+        "subCommentCount": 4,
+        "createdAt": "2026-04-08T16:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_018"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_069",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H3",
+        "H4",
+        "H8"
+      ],
+      "author": "囤货前先问",
+      "text": "第一天有点胀,客服说减量观察后好多了。",
+      "likeCount": 6,
+      "replyCount": 7,
+      "publishTime": "2026-04-09T17:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_018",
+      "parentId": "xhs_demo_018",
+      "commentId": "xhs_demo_c_069",
+      "ipLocation": "山东",
+      "theme": "反馈",
+      "raw": {
+        "commentId": "xhs_demo_c_069",
+        "noteId": "xhs_demo_018",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H3",
+          "H4",
+          "H8"
+        ],
+        "theme": "反馈",
+        "content": "第一天有点胀,客服说减量观察后好多了。",
+        "user": {
+          "userId": "xhs_comment_user_069",
+          "nickname": "囤货前先问"
+        },
+        "ipLocation": "山东",
+        "likeCount": 6,
+        "subCommentCount": 7,
+        "createdAt": "2026-04-09T17:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_018"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_070",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H5",
+        "H3"
+      ],
+      "author": "真实反馈bot",
+      "text": "我会先看菌株编号和配料表,客服讲不清楚就不下单。",
+      "likeCount": 13,
+      "replyCount": 2,
+      "publishTime": "2026-04-10T18:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_019",
+      "parentId": "xhs_demo_019",
+      "commentId": "xhs_demo_c_070",
+      "ipLocation": "重庆",
+      "theme": "决策",
+      "raw": {
+        "commentId": "xhs_demo_c_070",
+        "noteId": "xhs_demo_019",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H5",
+          "H3"
+        ],
+        "theme": "决策",
+        "content": "我会先看菌株编号和配料表,客服讲不清楚就不下单。",
+        "user": {
+          "userId": "xhs_comment_user_070",
+          "nickname": "真实反馈bot"
+        },
+        "ipLocation": "重庆",
+        "likeCount": 13,
+        "subCommentCount": 2,
+        "createdAt": "2026-04-10T18:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_019"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_071",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H5",
+        "H4"
+      ],
+      "author": "小满妈妈",
+      "text": "第一天有点胀,客服说减量观察后好多了。",
+      "likeCount": 20,
+      "replyCount": 5,
+      "publishTime": "2026-04-11T19:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_019",
+      "parentId": "xhs_demo_019",
+      "commentId": "xhs_demo_c_071",
+      "ipLocation": "浙江",
+      "theme": "反馈",
+      "raw": {
+        "commentId": "xhs_demo_c_071",
+        "noteId": "xhs_demo_019",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H5",
+          "H4"
+        ],
+        "theme": "反馈",
+        "content": "第一天有点胀,客服说减量观察后好多了。",
+        "user": {
+          "userId": "xhs_comment_user_071",
+          "nickname": "小满妈妈"
+        },
+        "ipLocation": "浙江",
+        "likeCount": 20,
+        "subCommentCount": 5,
+        "createdAt": "2026-04-11T19:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_019"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_072",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H1",
+        "H5"
+      ],
+      "author": "配料表先行",
+      "text": "同价位我会选能把边界讲清楚的品牌。",
+      "likeCount": 27,
+      "replyCount": 0,
+      "publishTime": "2026-04-12T08:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_019",
+      "parentId": "xhs_demo_019",
+      "commentId": "xhs_demo_c_072",
+      "ipLocation": "上海",
+      "theme": "竞品",
+      "raw": {
+        "commentId": "xhs_demo_c_072",
+        "noteId": "xhs_demo_019",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H1",
+          "H5"
+        ],
+        "theme": "竞品",
+        "content": "同价位我会选能把边界讲清楚的品牌。",
+        "user": {
+          "userId": "xhs_comment_user_072",
+          "nickname": "配料表先行"
+        },
+        "ipLocation": "上海",
+        "likeCount": 27,
+        "subCommentCount": 0,
+        "createdAt": "2026-04-12T08:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_019"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_073",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H2",
+        "H4",
+        "H6"
+      ],
+      "author": "打工人小周",
+      "text": "第一天有点胀,客服说减量观察后好多了。",
+      "likeCount": 34,
+      "replyCount": 3,
+      "publishTime": "2026-04-13T09:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_020",
+      "parentId": "xhs_demo_020",
+      "commentId": "xhs_demo_c_073",
+      "ipLocation": "广东",
+      "theme": "反馈",
+      "raw": {
+        "commentId": "xhs_demo_c_073",
+        "noteId": "xhs_demo_020",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H2",
+          "H4",
+          "H6"
+        ],
+        "theme": "反馈",
+        "content": "第一天有点胀,客服说减量观察后好多了。",
+        "user": {
+          "userId": "xhs_comment_user_073",
+          "nickname": "打工人小周"
+        },
+        "ipLocation": "广东",
+        "likeCount": 34,
+        "subCommentCount": 3,
+        "createdAt": "2026-04-13T09:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_020"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_074",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H2",
+        "H4",
+        "H6",
+        "H5"
+      ],
+      "author": "橙子爸",
+      "text": "同价位我会选能把边界讲清楚的品牌。",
+      "likeCount": 41,
+      "replyCount": 6,
+      "publishTime": "2026-04-14T10:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_020",
+      "parentId": "xhs_demo_020",
+      "commentId": "xhs_demo_c_074",
+      "ipLocation": "江苏",
+      "theme": "竞品",
+      "raw": {
+        "commentId": "xhs_demo_c_074",
+        "noteId": "xhs_demo_020",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H2",
+          "H4",
+          "H6",
+          "H5"
+        ],
+        "theme": "竞品",
+        "content": "同价位我会选能把边界讲清楚的品牌。",
+        "user": {
+          "userId": "xhs_comment_user_074",
+          "nickname": "橙子爸"
+        },
+        "ipLocation": "江苏",
+        "likeCount": 41,
+        "subCommentCount": 6,
+        "createdAt": "2026-04-14T10:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_020"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_075",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": [
+        "H2",
+        "H4",
+        "H6"
+      ],
+      "author": "理性下单中",
+      "text": "不要说包治便秘,说清楚辅助和观察周期反而更可信。",
+      "likeCount": 48,
+      "replyCount": 1,
+      "publishTime": "2026-04-15T11:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_020",
+      "parentId": "xhs_demo_020",
+      "commentId": "xhs_demo_c_075",
+      "ipLocation": "四川",
+      "theme": "信任",
+      "raw": {
+        "commentId": "xhs_demo_c_075",
+        "noteId": "xhs_demo_020",
+        "platform": "xiaohongshu",
+        "keyword": "益生菌腹胀便秘",
+        "batch": "P0",
+        "hypothesisTags": [
+          "H2",
+          "H4",
+          "H6"
+        ],
+        "theme": "信任",
+        "content": "不要说包治便秘,说清楚辅助和观察周期反而更可信。",
+        "user": {
+          "userId": "xhs_comment_user_075",
+          "nickname": "理性下单中"
+        },
+        "ipLocation": "四川",
+        "likeCount": 48,
+        "subCommentCount": 1,
+        "createdAt": "2026-04-15T11:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_020"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_076",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H3",
+        "H5",
+        "H7"
+      ],
+      "author": "不想踩雷",
+      "text": "同价位我会选能把边界讲清楚的品牌。",
+      "likeCount": 55,
+      "replyCount": 4,
+      "publishTime": "2026-04-16T12:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_021",
+      "parentId": "xhs_demo_021",
+      "commentId": "xhs_demo_c_076",
+      "ipLocation": "北京",
+      "theme": "竞品",
+      "raw": {
+        "commentId": "xhs_demo_c_076",
+        "noteId": "xhs_demo_021",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H3",
+          "H5",
+          "H7"
+        ],
+        "theme": "竞品",
+        "content": "同价位我会选能把边界讲清楚的品牌。",
+        "user": {
+          "userId": "xhs_comment_user_076",
+          "nickname": "不想踩雷"
+        },
+        "ipLocation": "北京",
+        "likeCount": 55,
+        "subCommentCount": 4,
+        "createdAt": "2026-04-16T12:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_021"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_077",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H3",
+        "H5",
+        "H7",
+        "H6"
+      ],
+      "author": "带娃观察员",
+      "text": "不要说包治便秘,说清楚辅助和观察周期反而更可信。",
+      "likeCount": 62,
+      "replyCount": 7,
+      "publishTime": "2026-04-17T13:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_021",
+      "parentId": "xhs_demo_021",
+      "commentId": "xhs_demo_c_077",
+      "ipLocation": "福建",
+      "theme": "信任",
+      "raw": {
+        "commentId": "xhs_demo_c_077",
+        "noteId": "xhs_demo_021",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H3",
+          "H5",
+          "H7",
+          "H6"
+        ],
+        "theme": "信任",
+        "content": "不要说包治便秘,说清楚辅助和观察周期反而更可信。",
+        "user": {
+          "userId": "xhs_comment_user_077",
+          "nickname": "带娃观察员"
+        },
+        "ipLocation": "福建",
+        "likeCount": 62,
+        "subCommentCount": 7,
+        "createdAt": "2026-04-17T13:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_021"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_078",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H3",
+        "H5",
+        "H7"
+      ],
+      "author": "胃肠敏感星人",
+      "text": "每天成本超过8块我会犹豫,除非证据很清楚。",
+      "likeCount": 69,
+      "replyCount": 2,
+      "publishTime": "2026-04-18T14:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_021",
+      "parentId": "xhs_demo_021",
+      "commentId": "xhs_demo_c_078",
+      "ipLocation": "湖北",
+      "theme": "价格",
+      "raw": {
+        "commentId": "xhs_demo_c_078",
+        "noteId": "xhs_demo_021",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H3",
+          "H5",
+          "H7"
+        ],
+        "theme": "价格",
+        "content": "每天成本超过8块我会犹豫,除非证据很清楚。",
+        "user": {
+          "userId": "xhs_comment_user_078",
+          "nickname": "胃肠敏感星人"
+        },
+        "ipLocation": "湖北",
+        "likeCount": 69,
+        "subCommentCount": 2,
+        "createdAt": "2026-04-18T14:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_021"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_079",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H3",
+        "H6"
+      ],
+      "author": "囤货前先问",
+      "text": "不要说包治便秘,说清楚辅助和观察周期反而更可信。",
+      "likeCount": 76,
+      "replyCount": 5,
+      "publishTime": "2026-04-19T15:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_022",
+      "parentId": "xhs_demo_022",
+      "commentId": "xhs_demo_c_079",
+      "ipLocation": "山东",
+      "theme": "信任",
+      "raw": {
+        "commentId": "xhs_demo_c_079",
+        "noteId": "xhs_demo_022",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H3",
+          "H6"
+        ],
+        "theme": "信任",
+        "content": "不要说包治便秘,说清楚辅助和观察周期反而更可信。",
+        "user": {
+          "userId": "xhs_comment_user_079",
+          "nickname": "囤货前先问"
+        },
+        "ipLocation": "山东",
+        "likeCount": 76,
+        "subCommentCount": 5,
+        "createdAt": "2026-04-19T15:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_022"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_080",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H3",
+        "H6",
+        "H7"
+      ],
+      "author": "真实反馈bot",
+      "text": "每天成本超过8块我会犹豫,除非证据很清楚。",
+      "likeCount": 83,
+      "replyCount": 0,
+      "publishTime": "2026-04-20T16:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_022",
+      "parentId": "xhs_demo_022",
+      "commentId": "xhs_demo_c_080",
+      "ipLocation": "重庆",
+      "theme": "价格",
+      "raw": {
+        "commentId": "xhs_demo_c_080",
+        "noteId": "xhs_demo_022",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H3",
+          "H6",
+          "H7"
+        ],
+        "theme": "价格",
+        "content": "每天成本超过8块我会犹豫,除非证据很清楚。",
+        "user": {
+          "userId": "xhs_comment_user_080",
+          "nickname": "真实反馈bot"
+        },
+        "ipLocation": "重庆",
+        "likeCount": 83,
+        "subCommentCount": 0,
+        "createdAt": "2026-04-20T16:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_022"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_081",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H3",
+        "H6",
+        "H8"
+      ],
+      "author": "小满妈妈",
+      "text": "详情页少一点专利词,多一点家庭使用说明。",
+      "likeCount": 90,
+      "replyCount": 3,
+      "publishTime": "2026-04-01T17:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_022",
+      "parentId": "xhs_demo_022",
+      "commentId": "xhs_demo_c_081",
+      "ipLocation": "浙江",
+      "theme": "话术",
+      "raw": {
+        "commentId": "xhs_demo_c_081",
+        "noteId": "xhs_demo_022",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H3",
+          "H6",
+          "H8"
+        ],
+        "theme": "话术",
+        "content": "详情页少一点专利词,多一点家庭使用说明。",
+        "user": {
+          "userId": "xhs_comment_user_081",
+          "nickname": "小满妈妈"
+        },
+        "ipLocation": "浙江",
+        "likeCount": 90,
+        "subCommentCount": 3,
+        "createdAt": "2026-04-01T17:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_022"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_082",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H5",
+        "H7"
+      ],
+      "author": "配料表先行",
+      "text": "每天成本超过8块我会犹豫,除非证据很清楚。",
+      "likeCount": 97,
+      "replyCount": 6,
+      "publishTime": "2026-04-02T18:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_023",
+      "parentId": "xhs_demo_023",
+      "commentId": "xhs_demo_c_082",
+      "ipLocation": "上海",
+      "theme": "价格",
+      "raw": {
+        "commentId": "xhs_demo_c_082",
+        "noteId": "xhs_demo_023",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H5",
+          "H7"
+        ],
+        "theme": "价格",
+        "content": "每天成本超过8块我会犹豫,除非证据很清楚。",
+        "user": {
+          "userId": "xhs_comment_user_082",
+          "nickname": "配料表先行"
+        },
+        "ipLocation": "上海",
+        "likeCount": 97,
+        "subCommentCount": 6,
+        "createdAt": "2026-04-02T18:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_023"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_083",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H5",
+        "H7",
+        "H8"
+      ],
+      "author": "打工人小周",
+      "text": "详情页少一点专利词,多一点家庭使用说明。",
+      "likeCount": 8,
+      "replyCount": 1,
+      "publishTime": "2026-04-03T19:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_023",
+      "parentId": "xhs_demo_023",
+      "commentId": "xhs_demo_c_083",
+      "ipLocation": "广东",
+      "theme": "话术",
+      "raw": {
+        "commentId": "xhs_demo_c_083",
+        "noteId": "xhs_demo_023",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H5",
+          "H7",
+          "H8"
+        ],
+        "theme": "话术",
+        "content": "详情页少一点专利词,多一点家庭使用说明。",
+        "user": {
+          "userId": "xhs_comment_user_083",
+          "nickname": "打工人小周"
+        },
+        "ipLocation": "广东",
+        "likeCount": 8,
+        "subCommentCount": 1,
+        "createdAt": "2026-04-03T19:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_023"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_084",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H5",
+        "H7",
+        "H1"
+      ],
+      "author": "橙子爸",
+      "text": "最怕买回来孩子不愿意喝,之前有一款味道太甜直接闲置。",
+      "likeCount": 15,
+      "replyCount": 4,
+      "publishTime": "2026-04-04T08:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_023",
+      "parentId": "xhs_demo_023",
+      "commentId": "xhs_demo_c_084",
+      "ipLocation": "江苏",
+      "theme": "痛点",
+      "raw": {
+        "commentId": "xhs_demo_c_084",
+        "noteId": "xhs_demo_023",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H5",
+          "H7",
+          "H1"
+        ],
+        "theme": "痛点",
+        "content": "最怕买回来孩子不愿意喝,之前有一款味道太甜直接闲置。",
+        "user": {
+          "userId": "xhs_comment_user_084",
+          "nickname": "橙子爸"
+        },
+        "ipLocation": "江苏",
+        "likeCount": 15,
+        "subCommentCount": 4,
+        "createdAt": "2026-04-04T08:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_023"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_085",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H3",
+        "H8"
+      ],
+      "author": "理性下单中",
+      "text": "详情页少一点专利词,多一点家庭使用说明。",
+      "likeCount": 22,
+      "replyCount": 7,
+      "publishTime": "2026-04-05T09:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_024",
+      "parentId": "xhs_demo_024",
+      "commentId": "xhs_demo_c_085",
+      "ipLocation": "四川",
+      "theme": "话术",
+      "raw": {
+        "commentId": "xhs_demo_c_085",
+        "noteId": "xhs_demo_024",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H3",
+          "H8"
+        ],
+        "theme": "话术",
+        "content": "详情页少一点专利词,多一点家庭使用说明。",
+        "user": {
+          "userId": "xhs_comment_user_085",
+          "nickname": "理性下单中"
+        },
+        "ipLocation": "四川",
+        "likeCount": 22,
+        "subCommentCount": 7,
+        "createdAt": "2026-04-05T09:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_024"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_086",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H3",
+        "H8",
+        "H1"
+      ],
+      "author": "不想踩雷",
+      "text": "最怕买回来孩子不愿意喝,之前有一款味道太甜直接闲置。",
+      "likeCount": 29,
+      "replyCount": 2,
+      "publishTime": "2026-04-06T10:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_024",
+      "parentId": "xhs_demo_024",
+      "commentId": "xhs_demo_c_086",
+      "ipLocation": "北京",
+      "theme": "痛点",
+      "raw": {
+        "commentId": "xhs_demo_c_086",
+        "noteId": "xhs_demo_024",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H3",
+          "H8",
+          "H1"
+        ],
+        "theme": "痛点",
+        "content": "最怕买回来孩子不愿意喝,之前有一款味道太甜直接闲置。",
+        "user": {
+          "userId": "xhs_comment_user_086",
+          "nickname": "不想踩雷"
+        },
+        "ipLocation": "北京",
+        "likeCount": 29,
+        "subCommentCount": 2,
+        "createdAt": "2026-04-06T10:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_024"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_087",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H3",
+        "H8",
+        "H2"
+      ],
+      "author": "带娃观察员",
+      "text": "外出吃饭后会备几条,小包装真的比大罐方便。",
+      "likeCount": 36,
+      "replyCount": 5,
+      "publishTime": "2026-04-07T11:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_024",
+      "parentId": "xhs_demo_024",
+      "commentId": "xhs_demo_c_087",
+      "ipLocation": "福建",
+      "theme": "场景",
+      "raw": {
+        "commentId": "xhs_demo_c_087",
+        "noteId": "xhs_demo_024",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H3",
+          "H8",
+          "H2"
+        ],
+        "theme": "场景",
+        "content": "外出吃饭后会备几条,小包装真的比大罐方便。",
+        "user": {
+          "userId": "xhs_comment_user_087",
+          "nickname": "带娃观察员"
+        },
+        "ipLocation": "福建",
+        "likeCount": 36,
+        "subCommentCount": 5,
+        "createdAt": "2026-04-07T11:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_024"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_088",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H4",
+        "H5",
+        "H1"
+      ],
+      "author": "胃肠敏感星人",
+      "text": "最怕买回来孩子不愿意喝,之前有一款味道太甜直接闲置。",
+      "likeCount": 43,
+      "replyCount": 0,
+      "publishTime": "2026-04-08T12:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_025",
+      "parentId": "xhs_demo_025",
+      "commentId": "xhs_demo_c_088",
+      "ipLocation": "湖北",
+      "theme": "痛点",
+      "raw": {
+        "commentId": "xhs_demo_c_088",
+        "noteId": "xhs_demo_025",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H4",
+          "H5",
+          "H1"
+        ],
+        "theme": "痛点",
+        "content": "最怕买回来孩子不愿意喝,之前有一款味道太甜直接闲置。",
+        "user": {
+          "userId": "xhs_comment_user_088",
+          "nickname": "胃肠敏感星人"
+        },
+        "ipLocation": "湖北",
+        "likeCount": 43,
+        "subCommentCount": 0,
+        "createdAt": "2026-04-08T12:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_025"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_089",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H4",
+        "H5",
+        "H2"
+      ],
+      "author": "囤货前先问",
+      "text": "外出吃饭后会备几条,小包装真的比大罐方便。",
+      "likeCount": 50,
+      "replyCount": 3,
+      "publishTime": "2026-04-09T13:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_025",
+      "parentId": "xhs_demo_025",
+      "commentId": "xhs_demo_c_089",
+      "ipLocation": "山东",
+      "theme": "场景",
+      "raw": {
+        "commentId": "xhs_demo_c_089",
+        "noteId": "xhs_demo_025",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H4",
+          "H5",
+          "H2"
+        ],
+        "theme": "场景",
+        "content": "外出吃饭后会备几条,小包装真的比大罐方便。",
+        "user": {
+          "userId": "xhs_comment_user_089",
+          "nickname": "囤货前先问"
+        },
+        "ipLocation": "山东",
+        "likeCount": 50,
+        "subCommentCount": 3,
+        "createdAt": "2026-04-09T13:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_025"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_090",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H4",
+        "H5",
+        "H3"
+      ],
+      "author": "真实反馈bot",
+      "text": "独立条装、常温保存、少添加是我下单前最看重的。",
+      "likeCount": 57,
+      "replyCount": 6,
+      "publishTime": "2026-04-10T14:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_025",
+      "parentId": "xhs_demo_025",
+      "commentId": "xhs_demo_c_090",
+      "ipLocation": "重庆",
+      "theme": "决策",
+      "raw": {
+        "commentId": "xhs_demo_c_090",
+        "noteId": "xhs_demo_025",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H4",
+          "H5",
+          "H3"
+        ],
+        "theme": "决策",
+        "content": "独立条装、常温保存、少添加是我下单前最看重的。",
+        "user": {
+          "userId": "xhs_comment_user_090",
+          "nickname": "真实反馈bot"
+        },
+        "ipLocation": "重庆",
+        "likeCount": 57,
+        "subCommentCount": 6,
+        "createdAt": "2026-04-10T14:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_025"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_091",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H2",
+        "H7"
+      ],
+      "author": "小满妈妈",
+      "text": "外出吃饭后会备几条,小包装真的比大罐方便。",
+      "likeCount": 64,
+      "replyCount": 1,
+      "publishTime": "2026-04-11T15:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_026",
+      "parentId": "xhs_demo_026",
+      "commentId": "xhs_demo_c_091",
+      "ipLocation": "浙江",
+      "theme": "场景",
+      "raw": {
+        "commentId": "xhs_demo_c_091",
+        "noteId": "xhs_demo_026",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H2",
+          "H7"
+        ],
+        "theme": "场景",
+        "content": "外出吃饭后会备几条,小包装真的比大罐方便。",
+        "user": {
+          "userId": "xhs_comment_user_091",
+          "nickname": "小满妈妈"
+        },
+        "ipLocation": "浙江",
+        "likeCount": 64,
+        "subCommentCount": 1,
+        "createdAt": "2026-04-11T15:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_026"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_092",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H2",
+        "H7",
+        "H3"
+      ],
+      "author": "配料表先行",
+      "text": "独立条装、常温保存、少添加是我下单前最看重的。",
+      "likeCount": 71,
+      "replyCount": 4,
+      "publishTime": "2026-04-12T16:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_026",
+      "parentId": "xhs_demo_026",
+      "commentId": "xhs_demo_c_092",
+      "ipLocation": "上海",
+      "theme": "决策",
+      "raw": {
+        "commentId": "xhs_demo_c_092",
+        "noteId": "xhs_demo_026",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H2",
+          "H7",
+          "H3"
+        ],
+        "theme": "决策",
+        "content": "独立条装、常温保存、少添加是我下单前最看重的。",
+        "user": {
+          "userId": "xhs_comment_user_092",
+          "nickname": "配料表先行"
+        },
+        "ipLocation": "上海",
+        "likeCount": 71,
+        "subCommentCount": 4,
+        "createdAt": "2026-04-12T16:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_026"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_093",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H2",
+        "H7",
+        "H4"
+      ],
+      "author": "打工人小周",
+      "text": "吃了三天没明显变化,但一周后排便时间稳定了一点。",
+      "likeCount": 78,
+      "replyCount": 7,
+      "publishTime": "2026-04-13T17:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_026",
+      "parentId": "xhs_demo_026",
+      "commentId": "xhs_demo_c_093",
+      "ipLocation": "广东",
+      "theme": "反馈",
+      "raw": {
+        "commentId": "xhs_demo_c_093",
+        "noteId": "xhs_demo_026",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H2",
+          "H7",
+          "H4"
+        ],
+        "theme": "反馈",
+        "content": "吃了三天没明显变化,但一周后排便时间稳定了一点。",
+        "user": {
+          "userId": "xhs_comment_user_093",
+          "nickname": "打工人小周"
+        },
+        "ipLocation": "广东",
+        "likeCount": 78,
+        "subCommentCount": 7,
+        "createdAt": "2026-04-13T17:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_026"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_094",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H3",
+        "H5",
+        "H6"
+      ],
+      "author": "橙子爸",
+      "text": "独立条装、常温保存、少添加是我下单前最看重的。",
+      "likeCount": 85,
+      "replyCount": 2,
+      "publishTime": "2026-04-14T18:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_027",
+      "parentId": "xhs_demo_027",
+      "commentId": "xhs_demo_c_094",
+      "ipLocation": "江苏",
+      "theme": "决策",
+      "raw": {
+        "commentId": "xhs_demo_c_094",
+        "noteId": "xhs_demo_027",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H3",
+          "H5",
+          "H6"
+        ],
+        "theme": "决策",
+        "content": "独立条装、常温保存、少添加是我下单前最看重的。",
+        "user": {
+          "userId": "xhs_comment_user_094",
+          "nickname": "橙子爸"
+        },
+        "ipLocation": "江苏",
+        "likeCount": 85,
+        "subCommentCount": 2,
+        "createdAt": "2026-04-14T18:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_027"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_095",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H3",
+        "H5",
+        "H6",
+        "H4"
+      ],
+      "author": "理性下单中",
+      "text": "吃了三天没明显变化,但一周后排便时间稳定了一点。",
+      "likeCount": 92,
+      "replyCount": 5,
+      "publishTime": "2026-04-15T19:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_027",
+      "parentId": "xhs_demo_027",
+      "commentId": "xhs_demo_c_095",
+      "ipLocation": "四川",
+      "theme": "反馈",
+      "raw": {
+        "commentId": "xhs_demo_c_095",
+        "noteId": "xhs_demo_027",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H3",
+          "H5",
+          "H6",
+          "H4"
+        ],
+        "theme": "反馈",
+        "content": "吃了三天没明显变化,但一周后排便时间稳定了一点。",
+        "user": {
+          "userId": "xhs_comment_user_095",
+          "nickname": "理性下单中"
+        },
+        "ipLocation": "四川",
+        "likeCount": 92,
+        "subCommentCount": 5,
+        "createdAt": "2026-04-15T19:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_027"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_096",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H3",
+        "H5",
+        "H6"
+      ],
+      "author": "不想踩雷",
+      "text": "之前买的那款结块严重,这次会特别看包装密封。",
+      "likeCount": 3,
+      "replyCount": 0,
+      "publishTime": "2026-04-16T08:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_027",
+      "parentId": "xhs_demo_027",
+      "commentId": "xhs_demo_c_096",
+      "ipLocation": "北京",
+      "theme": "竞品",
+      "raw": {
+        "commentId": "xhs_demo_c_096",
+        "noteId": "xhs_demo_027",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H3",
+          "H5",
+          "H6"
+        ],
+        "theme": "竞品",
+        "content": "之前买的那款结块严重,这次会特别看包装密封。",
+        "user": {
+          "userId": "xhs_comment_user_096",
+          "nickname": "不想踩雷"
+        },
+        "ipLocation": "北京",
+        "likeCount": 3,
+        "subCommentCount": 0,
+        "createdAt": "2026-04-16T08:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_027"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_097",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H7",
+        "H8",
+        "H4"
+      ],
+      "author": "带娃观察员",
+      "text": "吃了三天没明显变化,但一周后排便时间稳定了一点。",
+      "likeCount": 10,
+      "replyCount": 3,
+      "publishTime": "2026-04-17T09:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_028",
+      "parentId": "xhs_demo_028",
+      "commentId": "xhs_demo_c_097",
+      "ipLocation": "福建",
+      "theme": "反馈",
+      "raw": {
+        "commentId": "xhs_demo_c_097",
+        "noteId": "xhs_demo_028",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H7",
+          "H8",
+          "H4"
+        ],
+        "theme": "反馈",
+        "content": "吃了三天没明显变化,但一周后排便时间稳定了一点。",
+        "user": {
+          "userId": "xhs_comment_user_097",
+          "nickname": "带娃观察员"
+        },
+        "ipLocation": "福建",
+        "likeCount": 10,
+        "subCommentCount": 3,
+        "createdAt": "2026-04-17T09:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_028"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_098",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H7",
+        "H8",
+        "H5"
+      ],
+      "author": "胃肠敏感星人",
+      "text": "之前买的那款结块严重,这次会特别看包装密封。",
+      "likeCount": 17,
+      "replyCount": 6,
+      "publishTime": "2026-04-18T10:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_028",
+      "parentId": "xhs_demo_028",
+      "commentId": "xhs_demo_c_098",
+      "ipLocation": "湖北",
+      "theme": "竞品",
+      "raw": {
+        "commentId": "xhs_demo_c_098",
+        "noteId": "xhs_demo_028",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H7",
+          "H8",
+          "H5"
+        ],
+        "theme": "竞品",
+        "content": "之前买的那款结块严重,这次会特别看包装密封。",
+        "user": {
+          "userId": "xhs_comment_user_098",
+          "nickname": "胃肠敏感星人"
+        },
+        "ipLocation": "湖北",
+        "likeCount": 17,
+        "subCommentCount": 6,
+        "createdAt": "2026-04-18T10:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_028"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_099",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H7",
+        "H8",
+        "H6"
+      ],
+      "author": "囤货前先问",
+      "text": "能不能写清楚不适合哪些人?这比夸效果更重要。",
+      "likeCount": 24,
+      "replyCount": 1,
+      "publishTime": "2026-04-19T11:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_028",
+      "parentId": "xhs_demo_028",
+      "commentId": "xhs_demo_c_099",
+      "ipLocation": "山东",
+      "theme": "信任",
+      "raw": {
+        "commentId": "xhs_demo_c_099",
+        "noteId": "xhs_demo_028",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H7",
+          "H8",
+          "H6"
+        ],
+        "theme": "信任",
+        "content": "能不能写清楚不适合哪些人?这比夸效果更重要。",
+        "user": {
+          "userId": "xhs_comment_user_099",
+          "nickname": "囤货前先问"
+        },
+        "ipLocation": "山东",
+        "likeCount": 24,
+        "subCommentCount": 1,
+        "createdAt": "2026-04-19T11:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_028"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_100",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H4",
+        "H6",
+        "H5"
+      ],
+      "author": "真实反馈bot",
+      "text": "之前买的那款结块严重,这次会特别看包装密封。",
+      "likeCount": 31,
+      "replyCount": 4,
+      "publishTime": "2026-04-20T12:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_029",
+      "parentId": "xhs_demo_029",
+      "commentId": "xhs_demo_c_100",
+      "ipLocation": "重庆",
+      "theme": "竞品",
+      "raw": {
+        "commentId": "xhs_demo_c_100",
+        "noteId": "xhs_demo_029",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H4",
+          "H6",
+          "H5"
+        ],
+        "theme": "竞品",
+        "content": "之前买的那款结块严重,这次会特别看包装密封。",
+        "user": {
+          "userId": "xhs_comment_user_100",
+          "nickname": "真实反馈bot"
+        },
+        "ipLocation": "重庆",
+        "likeCount": 31,
+        "subCommentCount": 4,
+        "createdAt": "2026-04-20T12:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_029"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_101",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H4",
+        "H6"
+      ],
+      "author": "小满妈妈",
+      "text": "能不能写清楚不适合哪些人?这比夸效果更重要。",
+      "likeCount": 38,
+      "replyCount": 7,
+      "publishTime": "2026-04-01T13:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_029",
+      "parentId": "xhs_demo_029",
+      "commentId": "xhs_demo_c_101",
+      "ipLocation": "浙江",
+      "theme": "信任",
+      "raw": {
+        "commentId": "xhs_demo_c_101",
+        "noteId": "xhs_demo_029",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H4",
+          "H6"
+        ],
+        "theme": "信任",
+        "content": "能不能写清楚不适合哪些人?这比夸效果更重要。",
+        "user": {
+          "userId": "xhs_comment_user_101",
+          "nickname": "小满妈妈"
+        },
+        "ipLocation": "浙江",
+        "likeCount": 38,
+        "subCommentCount": 7,
+        "createdAt": "2026-04-01T13:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_029"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_102",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H4",
+        "H6",
+        "H7"
+      ],
+      "author": "配料表先行",
+      "text": "希望先有7天试用装,有效果再买月装压力小。",
+      "likeCount": 45,
+      "replyCount": 2,
+      "publishTime": "2026-04-02T14:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_029",
+      "parentId": "xhs_demo_029",
+      "commentId": "xhs_demo_c_102",
+      "ipLocation": "上海",
+      "theme": "价格",
+      "raw": {
+        "commentId": "xhs_demo_c_102",
+        "noteId": "xhs_demo_029",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H4",
+          "H6",
+          "H7"
+        ],
+        "theme": "价格",
+        "content": "希望先有7天试用装,有效果再买月装压力小。",
+        "user": {
+          "userId": "xhs_comment_user_102",
+          "nickname": "配料表先行"
+        },
+        "ipLocation": "上海",
+        "likeCount": 45,
+        "subCommentCount": 2,
+        "createdAt": "2026-04-02T14:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_029"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_103",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H2",
+        "H3",
+        "H8",
+        "H6"
+      ],
+      "author": "打工人小周",
+      "text": "能不能写清楚不适合哪些人?这比夸效果更重要。",
+      "likeCount": 52,
+      "replyCount": 5,
+      "publishTime": "2026-04-03T15:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_030",
+      "parentId": "xhs_demo_030",
+      "commentId": "xhs_demo_c_103",
+      "ipLocation": "广东",
+      "theme": "信任",
+      "raw": {
+        "commentId": "xhs_demo_c_103",
+        "noteId": "xhs_demo_030",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H2",
+          "H3",
+          "H8",
+          "H6"
+        ],
+        "theme": "信任",
+        "content": "能不能写清楚不适合哪些人?这比夸效果更重要。",
+        "user": {
+          "userId": "xhs_comment_user_103",
+          "nickname": "打工人小周"
+        },
+        "ipLocation": "广东",
+        "likeCount": 52,
+        "subCommentCount": 5,
+        "createdAt": "2026-04-03T15:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_030"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_104",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H2",
+        "H3",
+        "H8",
+        "H7"
+      ],
+      "author": "橙子爸",
+      "text": "希望先有7天试用装,有效果再买月装压力小。",
+      "likeCount": 59,
+      "replyCount": 0,
+      "publishTime": "2026-04-04T16:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_030",
+      "parentId": "xhs_demo_030",
+      "commentId": "xhs_demo_c_104",
+      "ipLocation": "江苏",
+      "theme": "价格",
+      "raw": {
+        "commentId": "xhs_demo_c_104",
+        "noteId": "xhs_demo_030",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H2",
+          "H3",
+          "H8",
+          "H7"
+        ],
+        "theme": "价格",
+        "content": "希望先有7天试用装,有效果再买月装压力小。",
+        "user": {
+          "userId": "xhs_comment_user_104",
+          "nickname": "橙子爸"
+        },
+        "ipLocation": "江苏",
+        "likeCount": 59,
+        "subCommentCount": 0,
+        "createdAt": "2026-04-04T16:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_030"
+      }
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_105",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": [
+        "H2",
+        "H3",
+        "H8"
+      ],
+      "author": "理性下单中",
+      "text": "我喜欢7天观察卡这种内容,不像广告。",
+      "likeCount": 66,
+      "replyCount": 3,
+      "publishTime": "2026-04-05T17:20:00+08:00",
+      "collectedAt": "2026-04-29",
+      "url": "https://example.com/xhs/demo/xhs_demo_030",
+      "parentId": "xhs_demo_030",
+      "commentId": "xhs_demo_c_105",
+      "ipLocation": "四川",
+      "theme": "话术",
+      "raw": {
+        "commentId": "xhs_demo_c_105",
+        "noteId": "xhs_demo_030",
+        "platform": "xiaohongshu",
+        "keyword": "冻干益生菌测评",
+        "batch": "P1",
+        "hypothesisTags": [
+          "H2",
+          "H3",
+          "H8"
+        ],
+        "theme": "话术",
+        "content": "我喜欢7天观察卡这种内容,不像广告。",
+        "user": {
+          "userId": "xhs_comment_user_105",
+          "nickname": "理性下单中"
+        },
+        "ipLocation": "四川",
+        "likeCount": 66,
+        "subCommentCount": 3,
+        "createdAt": "2026-04-05T17:20:00+08:00",
+        "sourceUrl": "https://example.com/xhs/demo/xhs_demo_030"
+      }
+    }
+  ],
+  "audit": {
+    "duplicateItemCount": 0,
+    "duplicateVocCount": 0,
+    "emptyItemDroppedCount": 0,
+    "emptyVocDroppedCount": 0,
+    "missingRequiredCount": 0,
+    "errorCount": 0
+  }
+}

+ 105 - 0
demo/xiaohongshu/normalized/comments-flat.jsonl

@@ -0,0 +1,105 @@
+{"id":"xhs_comment_xhs_demo_c_001","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H1","H3","H6"],"author":"小满妈妈","text":"最怕买回来孩子不愿意喝,之前有一款味道太甜直接闲置。","likeCount":10,"replyCount":3,"publishTime":"2026-04-01T09:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_001","parentId":"xhs_demo_001","commentId":"xhs_demo_c_001","ipLocation":"浙江","theme":"痛点","raw":{"commentId":"xhs_demo_c_001","noteId":"xhs_demo_001","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H1","H3","H6"],"theme":"痛点","content":"最怕买回来孩子不愿意喝,之前有一款味道太甜直接闲置。","user":{"userId":"xhs_comment_user_001","nickname":"小满妈妈"},"ipLocation":"浙江","likeCount":10,"subCommentCount":3,"createdAt":"2026-04-01T09:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_001"}}
+{"id":"xhs_comment_xhs_demo_c_002","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H1","H3","H6","H2"],"author":"配料表先行","text":"外出吃饭后会备几条,小包装真的比大罐方便。","likeCount":17,"replyCount":6,"publishTime":"2026-04-02T10:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_001","parentId":"xhs_demo_001","commentId":"xhs_demo_c_002","ipLocation":"上海","theme":"场景","raw":{"commentId":"xhs_demo_c_002","noteId":"xhs_demo_001","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H1","H3","H6","H2"],"theme":"场景","content":"外出吃饭后会备几条,小包装真的比大罐方便。","user":{"userId":"xhs_comment_user_002","nickname":"配料表先行"},"ipLocation":"上海","likeCount":17,"subCommentCount":6,"createdAt":"2026-04-02T10:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_001"}}
+{"id":"xhs_comment_xhs_demo_c_003","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H1","H3","H6"],"author":"打工人小周","text":"独立条装、常温保存、少添加是我下单前最看重的。","likeCount":24,"replyCount":1,"publishTime":"2026-04-03T11:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_001","parentId":"xhs_demo_001","commentId":"xhs_demo_c_003","ipLocation":"广东","theme":"决策","raw":{"commentId":"xhs_demo_c_003","noteId":"xhs_demo_001","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H1","H3","H6"],"theme":"决策","content":"独立条装、常温保存、少添加是我下单前最看重的。","user":{"userId":"xhs_comment_user_003","nickname":"打工人小周"},"ipLocation":"广东","likeCount":24,"subCommentCount":1,"createdAt":"2026-04-03T11:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_001"}}
+{"id":"xhs_comment_xhs_demo_c_004","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H1","H3","H6","H4"],"author":"橙子爸","text":"吃了三天没明显变化,但一周后排便时间稳定了一点。","likeCount":31,"replyCount":4,"publishTime":"2026-04-04T12:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_001","parentId":"xhs_demo_001","commentId":"xhs_demo_c_004","ipLocation":"江苏","theme":"反馈","raw":{"commentId":"xhs_demo_c_004","noteId":"xhs_demo_001","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H1","H3","H6","H4"],"theme":"反馈","content":"吃了三天没明显变化,但一周后排便时间稳定了一点。","user":{"userId":"xhs_comment_user_004","nickname":"橙子爸"},"ipLocation":"江苏","likeCount":31,"subCommentCount":4,"createdAt":"2026-04-04T12:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_001"}}
+{"id":"xhs_comment_xhs_demo_c_005","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H6","H2"],"author":"理性下单中","text":"外出吃饭后会备几条,小包装真的比大罐方便。","likeCount":38,"replyCount":7,"publishTime":"2026-04-05T13:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_002","parentId":"xhs_demo_002","commentId":"xhs_demo_c_005","ipLocation":"四川","theme":"场景","raw":{"commentId":"xhs_demo_c_005","noteId":"xhs_demo_002","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H6","H2"],"theme":"场景","content":"外出吃饭后会备几条,小包装真的比大罐方便。","user":{"userId":"xhs_comment_user_005","nickname":"理性下单中"},"ipLocation":"四川","likeCount":38,"subCommentCount":7,"createdAt":"2026-04-05T13:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_002"}}
+{"id":"xhs_comment_xhs_demo_c_006","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H6"],"author":"不想踩雷","text":"独立条装、常温保存、少添加是我下单前最看重的。","likeCount":45,"replyCount":2,"publishTime":"2026-04-06T14:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_002","parentId":"xhs_demo_002","commentId":"xhs_demo_c_006","ipLocation":"北京","theme":"决策","raw":{"commentId":"xhs_demo_c_006","noteId":"xhs_demo_002","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H6"],"theme":"决策","content":"独立条装、常温保存、少添加是我下单前最看重的。","user":{"userId":"xhs_comment_user_006","nickname":"不想踩雷"},"ipLocation":"北京","likeCount":45,"subCommentCount":2,"createdAt":"2026-04-06T14:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_002"}}
+{"id":"xhs_comment_xhs_demo_c_007","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H6","H4"],"author":"带娃观察员","text":"吃了三天没明显变化,但一周后排便时间稳定了一点。","likeCount":52,"replyCount":5,"publishTime":"2026-04-07T15:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_002","parentId":"xhs_demo_002","commentId":"xhs_demo_c_007","ipLocation":"福建","theme":"反馈","raw":{"commentId":"xhs_demo_c_007","noteId":"xhs_demo_002","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H6","H4"],"theme":"反馈","content":"吃了三天没明显变化,但一周后排便时间稳定了一点。","user":{"userId":"xhs_comment_user_007","nickname":"带娃观察员"},"ipLocation":"福建","likeCount":52,"subCommentCount":5,"createdAt":"2026-04-07T15:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_002"}}
+{"id":"xhs_comment_xhs_demo_c_008","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H6","H5"],"author":"胃肠敏感星人","text":"之前买的那款结块严重,这次会特别看包装密封。","likeCount":59,"replyCount":0,"publishTime":"2026-04-08T16:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_002","parentId":"xhs_demo_002","commentId":"xhs_demo_c_008","ipLocation":"湖北","theme":"竞品","raw":{"commentId":"xhs_demo_c_008","noteId":"xhs_demo_002","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H6","H5"],"theme":"竞品","content":"之前买的那款结块严重,这次会特别看包装密封。","user":{"userId":"xhs_comment_user_008","nickname":"胃肠敏感星人"},"ipLocation":"湖北","likeCount":59,"subCommentCount":0,"createdAt":"2026-04-08T16:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_002"}}
+{"id":"xhs_comment_xhs_demo_c_009","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H1","H2","H4","H3"],"author":"囤货前先问","text":"独立条装、常温保存、少添加是我下单前最看重的。","likeCount":66,"replyCount":3,"publishTime":"2026-04-09T17:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_003","parentId":"xhs_demo_003","commentId":"xhs_demo_c_009","ipLocation":"山东","theme":"决策","raw":{"commentId":"xhs_demo_c_009","noteId":"xhs_demo_003","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H1","H2","H4","H3"],"theme":"决策","content":"独立条装、常温保存、少添加是我下单前最看重的。","user":{"userId":"xhs_comment_user_009","nickname":"囤货前先问"},"ipLocation":"山东","likeCount":66,"subCommentCount":3,"createdAt":"2026-04-09T17:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_003"}}
+{"id":"xhs_comment_xhs_demo_c_010","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H1","H2","H4"],"author":"真实反馈bot","text":"吃了三天没明显变化,但一周后排便时间稳定了一点。","likeCount":73,"replyCount":6,"publishTime":"2026-04-10T18:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_003","parentId":"xhs_demo_003","commentId":"xhs_demo_c_010","ipLocation":"重庆","theme":"反馈","raw":{"commentId":"xhs_demo_c_010","noteId":"xhs_demo_003","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H1","H2","H4"],"theme":"反馈","content":"吃了三天没明显变化,但一周后排便时间稳定了一点。","user":{"userId":"xhs_comment_user_010","nickname":"真实反馈bot"},"ipLocation":"重庆","likeCount":73,"subCommentCount":6,"createdAt":"2026-04-10T18:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_003"}}
+{"id":"xhs_comment_xhs_demo_c_011","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H1","H2","H4","H5"],"author":"小满妈妈","text":"之前买的那款结块严重,这次会特别看包装密封。","likeCount":80,"replyCount":1,"publishTime":"2026-04-11T19:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_003","parentId":"xhs_demo_003","commentId":"xhs_demo_c_011","ipLocation":"浙江","theme":"竞品","raw":{"commentId":"xhs_demo_c_011","noteId":"xhs_demo_003","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H1","H2","H4","H5"],"theme":"竞品","content":"之前买的那款结块严重,这次会特别看包装密封。","user":{"userId":"xhs_comment_user_011","nickname":"小满妈妈"},"ipLocation":"浙江","likeCount":80,"subCommentCount":1,"createdAt":"2026-04-11T19:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_003"}}
+{"id":"xhs_comment_xhs_demo_c_012","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H1","H2","H4","H6"],"author":"配料表先行","text":"能不能写清楚不适合哪些人?这比夸效果更重要。","likeCount":87,"replyCount":4,"publishTime":"2026-04-12T08:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_003","parentId":"xhs_demo_003","commentId":"xhs_demo_c_012","ipLocation":"上海","theme":"信任","raw":{"commentId":"xhs_demo_c_012","noteId":"xhs_demo_003","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H1","H2","H4","H6"],"theme":"信任","content":"能不能写清楚不适合哪些人?这比夸效果更重要。","user":{"userId":"xhs_comment_user_012","nickname":"配料表先行"},"ipLocation":"上海","likeCount":87,"subCommentCount":4,"createdAt":"2026-04-12T08:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_003"}}
+{"id":"xhs_comment_xhs_demo_c_013","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H7","H4"],"author":"打工人小周","text":"吃了三天没明显变化,但一周后排便时间稳定了一点。","likeCount":94,"replyCount":7,"publishTime":"2026-04-13T09:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_004","parentId":"xhs_demo_004","commentId":"xhs_demo_c_013","ipLocation":"广东","theme":"反馈","raw":{"commentId":"xhs_demo_c_013","noteId":"xhs_demo_004","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H7","H4"],"theme":"反馈","content":"吃了三天没明显变化,但一周后排便时间稳定了一点。","user":{"userId":"xhs_comment_user_013","nickname":"打工人小周"},"ipLocation":"广东","likeCount":94,"subCommentCount":7,"createdAt":"2026-04-13T09:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_004"}}
+{"id":"xhs_comment_xhs_demo_c_014","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H7","H5"],"author":"橙子爸","text":"之前买的那款结块严重,这次会特别看包装密封。","likeCount":5,"replyCount":2,"publishTime":"2026-04-14T10:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_004","parentId":"xhs_demo_004","commentId":"xhs_demo_c_014","ipLocation":"江苏","theme":"竞品","raw":{"commentId":"xhs_demo_c_014","noteId":"xhs_demo_004","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H7","H5"],"theme":"竞品","content":"之前买的那款结块严重,这次会特别看包装密封。","user":{"userId":"xhs_comment_user_014","nickname":"橙子爸"},"ipLocation":"江苏","likeCount":5,"subCommentCount":2,"createdAt":"2026-04-14T10:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_004"}}
+{"id":"xhs_comment_xhs_demo_c_015","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H7","H6"],"author":"理性下单中","text":"能不能写清楚不适合哪些人?这比夸效果更重要。","likeCount":12,"replyCount":5,"publishTime":"2026-04-15T11:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_004","parentId":"xhs_demo_004","commentId":"xhs_demo_c_015","ipLocation":"四川","theme":"信任","raw":{"commentId":"xhs_demo_c_015","noteId":"xhs_demo_004","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H7","H6"],"theme":"信任","content":"能不能写清楚不适合哪些人?这比夸效果更重要。","user":{"userId":"xhs_comment_user_015","nickname":"理性下单中"},"ipLocation":"四川","likeCount":12,"subCommentCount":5,"createdAt":"2026-04-15T11:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_004"}}
+{"id":"xhs_comment_xhs_demo_c_016","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H7"],"author":"不想踩雷","text":"希望先有7天试用装,有效果再买月装压力小。","likeCount":19,"replyCount":0,"publishTime":"2026-04-16T12:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_004","parentId":"xhs_demo_004","commentId":"xhs_demo_c_016","ipLocation":"北京","theme":"价格","raw":{"commentId":"xhs_demo_c_016","noteId":"xhs_demo_004","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H7"],"theme":"价格","content":"希望先有7天试用装,有效果再买月装压力小。","user":{"userId":"xhs_comment_user_016","nickname":"不想踩雷"},"ipLocation":"北京","likeCount":19,"subCommentCount":0,"createdAt":"2026-04-16T12:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_004"}}
+{"id":"xhs_comment_xhs_demo_c_017","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H6","H8","H5"],"author":"带娃观察员","text":"之前买的那款结块严重,这次会特别看包装密封。","likeCount":26,"replyCount":3,"publishTime":"2026-04-17T13:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_005","parentId":"xhs_demo_005","commentId":"xhs_demo_c_017","ipLocation":"福建","theme":"竞品","raw":{"commentId":"xhs_demo_c_017","noteId":"xhs_demo_005","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H6","H8","H5"],"theme":"竞品","content":"之前买的那款结块严重,这次会特别看包装密封。","user":{"userId":"xhs_comment_user_017","nickname":"带娃观察员"},"ipLocation":"福建","likeCount":26,"subCommentCount":3,"createdAt":"2026-04-17T13:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_005"}}
+{"id":"xhs_comment_xhs_demo_c_018","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H6","H8"],"author":"胃肠敏感星人","text":"能不能写清楚不适合哪些人?这比夸效果更重要。","likeCount":33,"replyCount":6,"publishTime":"2026-04-18T14:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_005","parentId":"xhs_demo_005","commentId":"xhs_demo_c_018","ipLocation":"湖北","theme":"信任","raw":{"commentId":"xhs_demo_c_018","noteId":"xhs_demo_005","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H6","H8"],"theme":"信任","content":"能不能写清楚不适合哪些人?这比夸效果更重要。","user":{"userId":"xhs_comment_user_018","nickname":"胃肠敏感星人"},"ipLocation":"湖北","likeCount":33,"subCommentCount":6,"createdAt":"2026-04-18T14:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_005"}}
+{"id":"xhs_comment_xhs_demo_c_019","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H6","H8","H7"],"author":"囤货前先问","text":"希望先有7天试用装,有效果再买月装压力小。","likeCount":40,"replyCount":1,"publishTime":"2026-04-19T15:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_005","parentId":"xhs_demo_005","commentId":"xhs_demo_c_019","ipLocation":"山东","theme":"价格","raw":{"commentId":"xhs_demo_c_019","noteId":"xhs_demo_005","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H6","H8","H7"],"theme":"价格","content":"希望先有7天试用装,有效果再买月装压力小。","user":{"userId":"xhs_comment_user_019","nickname":"囤货前先问"},"ipLocation":"山东","likeCount":40,"subCommentCount":1,"createdAt":"2026-04-19T15:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_005"}}
+{"id":"xhs_comment_xhs_demo_c_020","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H6","H8"],"author":"真实反馈bot","text":"我喜欢7天观察卡这种内容,不像广告。","likeCount":47,"replyCount":4,"publishTime":"2026-04-20T16:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_005","parentId":"xhs_demo_005","commentId":"xhs_demo_c_020","ipLocation":"重庆","theme":"话术","raw":{"commentId":"xhs_demo_c_020","noteId":"xhs_demo_005","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H6","H8"],"theme":"话术","content":"我喜欢7天观察卡这种内容,不像广告。","user":{"userId":"xhs_comment_user_020","nickname":"真实反馈bot"},"ipLocation":"重庆","likeCount":47,"subCommentCount":4,"createdAt":"2026-04-20T16:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_005"}}
+{"id":"xhs_comment_xhs_demo_c_021","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H1","H4","H8","H6"],"author":"小满妈妈","text":"能不能写清楚不适合哪些人?这比夸效果更重要。","likeCount":54,"replyCount":7,"publishTime":"2026-04-01T17:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_006","parentId":"xhs_demo_006","commentId":"xhs_demo_c_021","ipLocation":"浙江","theme":"信任","raw":{"commentId":"xhs_demo_c_021","noteId":"xhs_demo_006","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H1","H4","H8","H6"],"theme":"信任","content":"能不能写清楚不适合哪些人?这比夸效果更重要。","user":{"userId":"xhs_comment_user_021","nickname":"小满妈妈"},"ipLocation":"浙江","likeCount":54,"subCommentCount":7,"createdAt":"2026-04-01T17:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_006"}}
+{"id":"xhs_comment_xhs_demo_c_022","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H1","H4","H8","H7"],"author":"配料表先行","text":"希望先有7天试用装,有效果再买月装压力小。","likeCount":61,"replyCount":2,"publishTime":"2026-04-02T18:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_006","parentId":"xhs_demo_006","commentId":"xhs_demo_c_022","ipLocation":"上海","theme":"价格","raw":{"commentId":"xhs_demo_c_022","noteId":"xhs_demo_006","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H1","H4","H8","H7"],"theme":"价格","content":"希望先有7天试用装,有效果再买月装压力小。","user":{"userId":"xhs_comment_user_022","nickname":"配料表先行"},"ipLocation":"上海","likeCount":61,"subCommentCount":2,"createdAt":"2026-04-02T18:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_006"}}
+{"id":"xhs_comment_xhs_demo_c_023","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H1","H4","H8"],"author":"打工人小周","text":"我喜欢7天观察卡这种内容,不像广告。","likeCount":68,"replyCount":5,"publishTime":"2026-04-03T19:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_006","parentId":"xhs_demo_006","commentId":"xhs_demo_c_023","ipLocation":"广东","theme":"话术","raw":{"commentId":"xhs_demo_c_023","noteId":"xhs_demo_006","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H1","H4","H8"],"theme":"话术","content":"我喜欢7天观察卡这种内容,不像广告。","user":{"userId":"xhs_comment_user_023","nickname":"打工人小周"},"ipLocation":"广东","likeCount":68,"subCommentCount":5,"createdAt":"2026-04-03T19:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_006"}}
+{"id":"xhs_comment_xhs_demo_c_024","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H1","H4","H8"],"author":"橙子爸","text":"腹胀的时候孩子会闹,但我又不敢随便换太多产品。","likeCount":75,"replyCount":0,"publishTime":"2026-04-04T08:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_006","parentId":"xhs_demo_006","commentId":"xhs_demo_c_024","ipLocation":"江苏","theme":"痛点","raw":{"commentId":"xhs_demo_c_024","noteId":"xhs_demo_006","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H1","H4","H8"],"theme":"痛点","content":"腹胀的时候孩子会闹,但我又不敢随便换太多产品。","user":{"userId":"xhs_comment_user_024","nickname":"橙子爸"},"ipLocation":"江苏","likeCount":75,"subCommentCount":0,"createdAt":"2026-04-04T08:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_006"}}
+{"id":"xhs_comment_xhs_demo_c_025","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H2","H3","H7"],"author":"理性下单中","text":"希望先有7天试用装,有效果再买月装压力小。","likeCount":82,"replyCount":3,"publishTime":"2026-04-05T09:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_007","parentId":"xhs_demo_007","commentId":"xhs_demo_c_025","ipLocation":"四川","theme":"价格","raw":{"commentId":"xhs_demo_c_025","noteId":"xhs_demo_007","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H2","H3","H7"],"theme":"价格","content":"希望先有7天试用装,有效果再买月装压力小。","user":{"userId":"xhs_comment_user_025","nickname":"理性下单中"},"ipLocation":"四川","likeCount":82,"subCommentCount":3,"createdAt":"2026-04-05T09:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_007"}}
+{"id":"xhs_comment_xhs_demo_c_026","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H2","H3","H7","H8"],"author":"不想踩雷","text":"我喜欢7天观察卡这种内容,不像广告。","likeCount":89,"replyCount":6,"publishTime":"2026-04-06T10:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_007","parentId":"xhs_demo_007","commentId":"xhs_demo_c_026","ipLocation":"北京","theme":"话术","raw":{"commentId":"xhs_demo_c_026","noteId":"xhs_demo_007","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H2","H3","H7","H8"],"theme":"话术","content":"我喜欢7天观察卡这种内容,不像广告。","user":{"userId":"xhs_comment_user_026","nickname":"不想踩雷"},"ipLocation":"北京","likeCount":89,"subCommentCount":6,"createdAt":"2026-04-06T10:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_007"}}
+{"id":"xhs_comment_xhs_demo_c_027","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H2","H3","H7","H1"],"author":"带娃观察员","text":"腹胀的时候孩子会闹,但我又不敢随便换太多产品。","likeCount":96,"replyCount":1,"publishTime":"2026-04-07T11:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_007","parentId":"xhs_demo_007","commentId":"xhs_demo_c_027","ipLocation":"福建","theme":"痛点","raw":{"commentId":"xhs_demo_c_027","noteId":"xhs_demo_007","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H2","H3","H7","H1"],"theme":"痛点","content":"腹胀的时候孩子会闹,但我又不敢随便换太多产品。","user":{"userId":"xhs_comment_user_027","nickname":"带娃观察员"},"ipLocation":"福建","likeCount":96,"subCommentCount":1,"createdAt":"2026-04-07T11:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_007"}}
+{"id":"xhs_comment_xhs_demo_c_028","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H2","H3","H7"],"author":"胃肠敏感星人","text":"开学和旅行后最明显,作息一乱肠胃也跟着乱。","likeCount":7,"replyCount":4,"publishTime":"2026-04-08T12:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_007","parentId":"xhs_demo_007","commentId":"xhs_demo_c_028","ipLocation":"湖北","theme":"场景","raw":{"commentId":"xhs_demo_c_028","noteId":"xhs_demo_007","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H2","H3","H7"],"theme":"场景","content":"开学和旅行后最明显,作息一乱肠胃也跟着乱。","user":{"userId":"xhs_comment_user_028","nickname":"胃肠敏感星人"},"ipLocation":"湖北","likeCount":7,"subCommentCount":4,"createdAt":"2026-04-08T12:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_007"}}
+{"id":"xhs_comment_xhs_demo_c_029","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H5","H6","H8"],"author":"囤货前先问","text":"我喜欢7天观察卡这种内容,不像广告。","likeCount":14,"replyCount":7,"publishTime":"2026-04-09T13:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_008","parentId":"xhs_demo_008","commentId":"xhs_demo_c_029","ipLocation":"山东","theme":"话术","raw":{"commentId":"xhs_demo_c_029","noteId":"xhs_demo_008","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H5","H6","H8"],"theme":"话术","content":"我喜欢7天观察卡这种内容,不像广告。","user":{"userId":"xhs_comment_user_029","nickname":"囤货前先问"},"ipLocation":"山东","likeCount":14,"subCommentCount":7,"createdAt":"2026-04-09T13:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_008"}}
+{"id":"xhs_comment_xhs_demo_c_030","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H5","H6","H1"],"author":"真实反馈bot","text":"腹胀的时候孩子会闹,但我又不敢随便换太多产品。","likeCount":21,"replyCount":2,"publishTime":"2026-04-10T14:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_008","parentId":"xhs_demo_008","commentId":"xhs_demo_c_030","ipLocation":"重庆","theme":"痛点","raw":{"commentId":"xhs_demo_c_030","noteId":"xhs_demo_008","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H5","H6","H1"],"theme":"痛点","content":"腹胀的时候孩子会闹,但我又不敢随便换太多产品。","user":{"userId":"xhs_comment_user_030","nickname":"真实反馈bot"},"ipLocation":"重庆","likeCount":21,"subCommentCount":2,"createdAt":"2026-04-10T14:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_008"}}
+{"id":"xhs_comment_xhs_demo_c_031","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H5","H6","H2"],"author":"小满妈妈","text":"开学和旅行后最明显,作息一乱肠胃也跟着乱。","likeCount":28,"replyCount":5,"publishTime":"2026-04-11T15:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_008","parentId":"xhs_demo_008","commentId":"xhs_demo_c_031","ipLocation":"浙江","theme":"场景","raw":{"commentId":"xhs_demo_c_031","noteId":"xhs_demo_008","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H5","H6","H2"],"theme":"场景","content":"开学和旅行后最明显,作息一乱肠胃也跟着乱。","user":{"userId":"xhs_comment_user_031","nickname":"小满妈妈"},"ipLocation":"浙江","likeCount":28,"subCommentCount":5,"createdAt":"2026-04-11T15:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_008"}}
+{"id":"xhs_comment_xhs_demo_c_032","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H5","H6"],"author":"配料表先行","text":"详情页如果有适用人群表格,我会更容易判断。","likeCount":35,"replyCount":0,"publishTime":"2026-04-12T16:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_008","parentId":"xhs_demo_008","commentId":"xhs_demo_c_032","ipLocation":"上海","theme":"决策","raw":{"commentId":"xhs_demo_c_032","noteId":"xhs_demo_008","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H5","H6"],"theme":"决策","content":"详情页如果有适用人群表格,我会更容易判断。","user":{"userId":"xhs_comment_user_032","nickname":"配料表先行"},"ipLocation":"上海","likeCount":35,"subCommentCount":0,"createdAt":"2026-04-12T16:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_008"}}
+{"id":"xhs_comment_xhs_demo_c_033","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H4","H6","H1"],"author":"打工人小周","text":"腹胀的时候孩子会闹,但我又不敢随便换太多产品。","likeCount":42,"replyCount":3,"publishTime":"2026-04-13T17:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_009","parentId":"xhs_demo_009","commentId":"xhs_demo_c_033","ipLocation":"广东","theme":"痛点","raw":{"commentId":"xhs_demo_c_033","noteId":"xhs_demo_009","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H4","H6","H1"],"theme":"痛点","content":"腹胀的时候孩子会闹,但我又不敢随便换太多产品。","user":{"userId":"xhs_comment_user_033","nickname":"打工人小周"},"ipLocation":"广东","likeCount":42,"subCommentCount":3,"createdAt":"2026-04-13T17:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_009"}}
+{"id":"xhs_comment_xhs_demo_c_034","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H4","H6","H2"],"author":"橙子爸","text":"开学和旅行后最明显,作息一乱肠胃也跟着乱。","likeCount":49,"replyCount":6,"publishTime":"2026-04-14T18:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_009","parentId":"xhs_demo_009","commentId":"xhs_demo_c_034","ipLocation":"江苏","theme":"场景","raw":{"commentId":"xhs_demo_c_034","noteId":"xhs_demo_009","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H4","H6","H2"],"theme":"场景","content":"开学和旅行后最明显,作息一乱肠胃也跟着乱。","user":{"userId":"xhs_comment_user_034","nickname":"橙子爸"},"ipLocation":"江苏","likeCount":49,"subCommentCount":6,"createdAt":"2026-04-14T18:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_009"}}
+{"id":"xhs_comment_xhs_demo_c_035","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H4","H6","H3"],"author":"理性下单中","text":"详情页如果有适用人群表格,我会更容易判断。","likeCount":56,"replyCount":1,"publishTime":"2026-04-15T19:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_009","parentId":"xhs_demo_009","commentId":"xhs_demo_c_035","ipLocation":"四川","theme":"决策","raw":{"commentId":"xhs_demo_c_035","noteId":"xhs_demo_009","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H4","H6","H3"],"theme":"决策","content":"详情页如果有适用人群表格,我会更容易判断。","user":{"userId":"xhs_comment_user_035","nickname":"理性下单中"},"ipLocation":"四川","likeCount":56,"subCommentCount":1,"createdAt":"2026-04-15T19:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_009"}}
+{"id":"xhs_comment_xhs_demo_c_036","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H4","H6"],"author":"不想踩雷","text":"味道淡孩子能接受,坚持下来比参数更重要。","likeCount":63,"replyCount":4,"publishTime":"2026-04-16T08:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_009","parentId":"xhs_demo_009","commentId":"xhs_demo_c_036","ipLocation":"北京","theme":"反馈","raw":{"commentId":"xhs_demo_c_036","noteId":"xhs_demo_009","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H4","H6"],"theme":"反馈","content":"味道淡孩子能接受,坚持下来比参数更重要。","user":{"userId":"xhs_comment_user_036","nickname":"不想踩雷"},"ipLocation":"北京","likeCount":63,"subCommentCount":4,"createdAt":"2026-04-16T08:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_009"}}
+{"id":"xhs_comment_xhs_demo_c_037","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H8","H2"],"author":"带娃观察员","text":"开学和旅行后最明显,作息一乱肠胃也跟着乱。","likeCount":70,"replyCount":7,"publishTime":"2026-04-17T09:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_010","parentId":"xhs_demo_010","commentId":"xhs_demo_c_037","ipLocation":"福建","theme":"场景","raw":{"commentId":"xhs_demo_c_037","noteId":"xhs_demo_010","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H8","H2"],"theme":"场景","content":"开学和旅行后最明显,作息一乱肠胃也跟着乱。","user":{"userId":"xhs_comment_user_037","nickname":"带娃观察员"},"ipLocation":"福建","likeCount":70,"subCommentCount":7,"createdAt":"2026-04-17T09:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_010"}}
+{"id":"xhs_comment_xhs_demo_c_038","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H8"],"author":"胃肠敏感星人","text":"详情页如果有适用人群表格,我会更容易判断。","likeCount":77,"replyCount":2,"publishTime":"2026-04-18T10:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_010","parentId":"xhs_demo_010","commentId":"xhs_demo_c_038","ipLocation":"湖北","theme":"决策","raw":{"commentId":"xhs_demo_c_038","noteId":"xhs_demo_010","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H8"],"theme":"决策","content":"详情页如果有适用人群表格,我会更容易判断。","user":{"userId":"xhs_comment_user_038","nickname":"胃肠敏感星人"},"ipLocation":"湖北","likeCount":77,"subCommentCount":2,"createdAt":"2026-04-18T10:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_010"}}
+{"id":"xhs_comment_xhs_demo_c_039","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H8","H4"],"author":"囤货前先问","text":"味道淡孩子能接受,坚持下来比参数更重要。","likeCount":84,"replyCount":5,"publishTime":"2026-04-19T11:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_010","parentId":"xhs_demo_010","commentId":"xhs_demo_c_039","ipLocation":"山东","theme":"反馈","raw":{"commentId":"xhs_demo_c_039","noteId":"xhs_demo_010","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H8","H4"],"theme":"反馈","content":"味道淡孩子能接受,坚持下来比参数更重要。","user":{"userId":"xhs_comment_user_039","nickname":"囤货前先问"},"ipLocation":"山东","likeCount":84,"subCommentCount":5,"createdAt":"2026-04-19T11:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_010"}}
+{"id":"xhs_comment_xhs_demo_c_040","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H8","H5"],"author":"真实反馈bot","text":"进口牌子贵但说明详细,国产牌子客服回复快。","likeCount":91,"replyCount":0,"publishTime":"2026-04-20T12:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_010","parentId":"xhs_demo_010","commentId":"xhs_demo_c_040","ipLocation":"重庆","theme":"竞品","raw":{"commentId":"xhs_demo_c_040","noteId":"xhs_demo_010","platform":"xiaohongshu","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H3","H8","H5"],"theme":"竞品","content":"进口牌子贵但说明详细,国产牌子客服回复快。","user":{"userId":"xhs_comment_user_040","nickname":"真实反馈bot"},"ipLocation":"重庆","likeCount":91,"subCommentCount":0,"createdAt":"2026-04-20T12:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_010"}}
+{"id":"xhs_comment_xhs_demo_c_041","platform":"xiaohongshu","sourceType":"comment","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H2","H4","H3"],"author":"小满妈妈","text":"详情页如果有适用人群表格,我会更容易判断。","likeCount":98,"replyCount":3,"publishTime":"2026-04-01T13:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_011","parentId":"xhs_demo_011","commentId":"xhs_demo_c_041","ipLocation":"浙江","theme":"决策","raw":{"commentId":"xhs_demo_c_041","noteId":"xhs_demo_011","platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H2","H4","H3"],"theme":"决策","content":"详情页如果有适用人群表格,我会更容易判断。","user":{"userId":"xhs_comment_user_041","nickname":"小满妈妈"},"ipLocation":"浙江","likeCount":98,"subCommentCount":3,"createdAt":"2026-04-01T13:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_011"}}
+{"id":"xhs_comment_xhs_demo_c_042","platform":"xiaohongshu","sourceType":"comment","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H2","H4"],"author":"配料表先行","text":"味道淡孩子能接受,坚持下来比参数更重要。","likeCount":9,"replyCount":6,"publishTime":"2026-04-02T14:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_011","parentId":"xhs_demo_011","commentId":"xhs_demo_c_042","ipLocation":"上海","theme":"反馈","raw":{"commentId":"xhs_demo_c_042","noteId":"xhs_demo_011","platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H2","H4"],"theme":"反馈","content":"味道淡孩子能接受,坚持下来比参数更重要。","user":{"userId":"xhs_comment_user_042","nickname":"配料表先行"},"ipLocation":"上海","likeCount":9,"subCommentCount":6,"createdAt":"2026-04-02T14:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_011"}}
+{"id":"xhs_comment_xhs_demo_c_043","platform":"xiaohongshu","sourceType":"comment","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H2","H4","H5"],"author":"打工人小周","text":"进口牌子贵但说明详细,国产牌子客服回复快。","likeCount":16,"replyCount":1,"publishTime":"2026-04-03T15:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_011","parentId":"xhs_demo_011","commentId":"xhs_demo_c_043","ipLocation":"广东","theme":"竞品","raw":{"commentId":"xhs_demo_c_043","noteId":"xhs_demo_011","platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H2","H4","H5"],"theme":"竞品","content":"进口牌子贵但说明详细,国产牌子客服回复快。","user":{"userId":"xhs_comment_user_043","nickname":"打工人小周"},"ipLocation":"广东","likeCount":16,"subCommentCount":1,"createdAt":"2026-04-03T15:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_011"}}
+{"id":"xhs_comment_xhs_demo_c_044","platform":"xiaohongshu","sourceType":"comment","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H2","H4","H6"],"author":"橙子爸","text":"过敏原、糖醇、香精这些最好直接标出来。","likeCount":23,"replyCount":4,"publishTime":"2026-04-04T16:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_011","parentId":"xhs_demo_011","commentId":"xhs_demo_c_044","ipLocation":"江苏","theme":"信任","raw":{"commentId":"xhs_demo_c_044","noteId":"xhs_demo_011","platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H2","H4","H6"],"theme":"信任","content":"过敏原、糖醇、香精这些最好直接标出来。","user":{"userId":"xhs_comment_user_044","nickname":"橙子爸"},"ipLocation":"江苏","likeCount":23,"subCommentCount":4,"createdAt":"2026-04-04T16:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_011"}}
+{"id":"xhs_comment_xhs_demo_c_045","platform":"xiaohongshu","sourceType":"comment","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H4","H6"],"author":"理性下单中","text":"味道淡孩子能接受,坚持下来比参数更重要。","likeCount":30,"replyCount":7,"publishTime":"2026-04-05T17:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_012","parentId":"xhs_demo_012","commentId":"xhs_demo_c_045","ipLocation":"四川","theme":"反馈","raw":{"commentId":"xhs_demo_c_045","noteId":"xhs_demo_012","platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H4","H6"],"theme":"反馈","content":"味道淡孩子能接受,坚持下来比参数更重要。","user":{"userId":"xhs_comment_user_045","nickname":"理性下单中"},"ipLocation":"四川","likeCount":30,"subCommentCount":7,"createdAt":"2026-04-05T17:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_012"}}
+{"id":"xhs_comment_xhs_demo_c_046","platform":"xiaohongshu","sourceType":"comment","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H4","H6","H5"],"author":"不想踩雷","text":"进口牌子贵但说明详细,国产牌子客服回复快。","likeCount":37,"replyCount":2,"publishTime":"2026-04-06T18:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_012","parentId":"xhs_demo_012","commentId":"xhs_demo_c_046","ipLocation":"北京","theme":"竞品","raw":{"commentId":"xhs_demo_c_046","noteId":"xhs_demo_012","platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H4","H6","H5"],"theme":"竞品","content":"进口牌子贵但说明详细,国产牌子客服回复快。","user":{"userId":"xhs_comment_user_046","nickname":"不想踩雷"},"ipLocation":"北京","likeCount":37,"subCommentCount":2,"createdAt":"2026-04-06T18:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_012"}}
+{"id":"xhs_comment_xhs_demo_c_047","platform":"xiaohongshu","sourceType":"comment","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H4","H6"],"author":"带娃观察员","text":"过敏原、糖醇、香精这些最好直接标出来。","likeCount":44,"replyCount":5,"publishTime":"2026-04-07T19:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_012","parentId":"xhs_demo_012","commentId":"xhs_demo_c_047","ipLocation":"福建","theme":"信任","raw":{"commentId":"xhs_demo_c_047","noteId":"xhs_demo_012","platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H4","H6"],"theme":"信任","content":"过敏原、糖醇、香精这些最好直接标出来。","user":{"userId":"xhs_comment_user_047","nickname":"带娃观察员"},"ipLocation":"福建","likeCount":44,"subCommentCount":5,"createdAt":"2026-04-07T19:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_012"}}
+{"id":"xhs_comment_xhs_demo_c_048","platform":"xiaohongshu","sourceType":"comment","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H4","H6","H7"],"author":"胃肠敏感星人","text":"一盒够吃一个月最省心,太多规格反而选择困难。","likeCount":51,"replyCount":0,"publishTime":"2026-04-08T08:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_012","parentId":"xhs_demo_012","commentId":"xhs_demo_c_048","ipLocation":"湖北","theme":"价格","raw":{"commentId":"xhs_demo_c_048","noteId":"xhs_demo_012","platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H4","H6","H7"],"theme":"价格","content":"一盒够吃一个月最省心,太多规格反而选择困难。","user":{"userId":"xhs_comment_user_048","nickname":"胃肠敏感星人"},"ipLocation":"湖北","likeCount":51,"subCommentCount":0,"createdAt":"2026-04-08T08:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_012"}}
+{"id":"xhs_comment_xhs_demo_c_049","platform":"xiaohongshu","sourceType":"comment","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H2","H4","H5"],"author":"囤货前先问","text":"进口牌子贵但说明详细,国产牌子客服回复快。","likeCount":58,"replyCount":3,"publishTime":"2026-04-09T09:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_013","parentId":"xhs_demo_013","commentId":"xhs_demo_c_049","ipLocation":"山东","theme":"竞品","raw":{"commentId":"xhs_demo_c_049","noteId":"xhs_demo_013","platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H2","H4","H5"],"theme":"竞品","content":"进口牌子贵但说明详细,国产牌子客服回复快。","user":{"userId":"xhs_comment_user_049","nickname":"囤货前先问"},"ipLocation":"山东","likeCount":58,"subCommentCount":3,"createdAt":"2026-04-09T09:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_013"}}
+{"id":"xhs_comment_xhs_demo_c_050","platform":"xiaohongshu","sourceType":"comment","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H2","H4","H6"],"author":"真实反馈bot","text":"过敏原、糖醇、香精这些最好直接标出来。","likeCount":65,"replyCount":6,"publishTime":"2026-04-10T10:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_013","parentId":"xhs_demo_013","commentId":"xhs_demo_c_050","ipLocation":"重庆","theme":"信任","raw":{"commentId":"xhs_demo_c_050","noteId":"xhs_demo_013","platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H2","H4","H6"],"theme":"信任","content":"过敏原、糖醇、香精这些最好直接标出来。","user":{"userId":"xhs_comment_user_050","nickname":"真实反馈bot"},"ipLocation":"重庆","likeCount":65,"subCommentCount":6,"createdAt":"2026-04-10T10:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_013"}}
+{"id":"xhs_comment_xhs_demo_c_051","platform":"xiaohongshu","sourceType":"comment","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H2","H4","H7"],"author":"小满妈妈","text":"一盒够吃一个月最省心,太多规格反而选择困难。","likeCount":72,"replyCount":1,"publishTime":"2026-04-11T11:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_013","parentId":"xhs_demo_013","commentId":"xhs_demo_c_051","ipLocation":"浙江","theme":"价格","raw":{"commentId":"xhs_demo_c_051","noteId":"xhs_demo_013","platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H2","H4","H7"],"theme":"价格","content":"一盒够吃一个月最省心,太多规格反而选择困难。","user":{"userId":"xhs_comment_user_051","nickname":"小满妈妈"},"ipLocation":"浙江","likeCount":72,"subCommentCount":1,"createdAt":"2026-04-11T11:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_013"}}
+{"id":"xhs_comment_xhs_demo_c_052","platform":"xiaohongshu","sourceType":"comment","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H2","H4","H8"],"author":"配料表先行","text":"把活菌数翻译成怎么吃、吃多久、怎么看变化会更有用。","likeCount":79,"replyCount":4,"publishTime":"2026-04-12T12:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_013","parentId":"xhs_demo_013","commentId":"xhs_demo_c_052","ipLocation":"上海","theme":"话术","raw":{"commentId":"xhs_demo_c_052","noteId":"xhs_demo_013","platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H2","H4","H8"],"theme":"话术","content":"把活菌数翻译成怎么吃、吃多久、怎么看变化会更有用。","user":{"userId":"xhs_comment_user_052","nickname":"配料表先行"},"ipLocation":"上海","likeCount":79,"subCommentCount":4,"createdAt":"2026-04-12T12:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_013"}}
+{"id":"xhs_comment_xhs_demo_c_053","platform":"xiaohongshu","sourceType":"comment","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H3","H4","H6"],"author":"打工人小周","text":"过敏原、糖醇、香精这些最好直接标出来。","likeCount":86,"replyCount":7,"publishTime":"2026-04-13T13:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_014","parentId":"xhs_demo_014","commentId":"xhs_demo_c_053","ipLocation":"广东","theme":"信任","raw":{"commentId":"xhs_demo_c_053","noteId":"xhs_demo_014","platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H3","H4","H6"],"theme":"信任","content":"过敏原、糖醇、香精这些最好直接标出来。","user":{"userId":"xhs_comment_user_053","nickname":"打工人小周"},"ipLocation":"广东","likeCount":86,"subCommentCount":7,"createdAt":"2026-04-13T13:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_014"}}
+{"id":"xhs_comment_xhs_demo_c_054","platform":"xiaohongshu","sourceType":"comment","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H3","H4","H7"],"author":"橙子爸","text":"一盒够吃一个月最省心,太多规格反而选择困难。","likeCount":93,"replyCount":2,"publishTime":"2026-04-14T14:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_014","parentId":"xhs_demo_014","commentId":"xhs_demo_c_054","ipLocation":"江苏","theme":"价格","raw":{"commentId":"xhs_demo_c_054","noteId":"xhs_demo_014","platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H3","H4","H7"],"theme":"价格","content":"一盒够吃一个月最省心,太多规格反而选择困难。","user":{"userId":"xhs_comment_user_054","nickname":"橙子爸"},"ipLocation":"江苏","likeCount":93,"subCommentCount":2,"createdAt":"2026-04-14T14:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_014"}}
+{"id":"xhs_comment_xhs_demo_c_055","platform":"xiaohongshu","sourceType":"comment","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H3","H4","H8"],"author":"理性下单中","text":"把活菌数翻译成怎么吃、吃多久、怎么看变化会更有用。","likeCount":4,"replyCount":5,"publishTime":"2026-04-15T15:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_014","parentId":"xhs_demo_014","commentId":"xhs_demo_c_055","ipLocation":"四川","theme":"话术","raw":{"commentId":"xhs_demo_c_055","noteId":"xhs_demo_014","platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H3","H4","H8"],"theme":"话术","content":"把活菌数翻译成怎么吃、吃多久、怎么看变化会更有用。","user":{"userId":"xhs_comment_user_055","nickname":"理性下单中"},"ipLocation":"四川","likeCount":4,"subCommentCount":5,"createdAt":"2026-04-15T15:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_014"}}
+{"id":"xhs_comment_xhs_demo_c_056","platform":"xiaohongshu","sourceType":"comment","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H3","H4"],"author":"不想踩雷","text":"我们家主要是排便不规律,想知道吃多久能观察到变化。","likeCount":11,"replyCount":0,"publishTime":"2026-04-16T16:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_014","parentId":"xhs_demo_014","commentId":"xhs_demo_c_056","ipLocation":"北京","theme":"痛点","raw":{"commentId":"xhs_demo_c_056","noteId":"xhs_demo_014","platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H3","H4"],"theme":"痛点","content":"我们家主要是排便不规律,想知道吃多久能观察到变化。","user":{"userId":"xhs_comment_user_056","nickname":"不想踩雷"},"ipLocation":"北京","likeCount":11,"subCommentCount":0,"createdAt":"2026-04-16T16:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_014"}}
+{"id":"xhs_comment_xhs_demo_c_057","platform":"xiaohongshu","sourceType":"comment","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H2","H8","H7"],"author":"带娃观察员","text":"一盒够吃一个月最省心,太多规格反而选择困难。","likeCount":18,"replyCount":3,"publishTime":"2026-04-17T17:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_015","parentId":"xhs_demo_015","commentId":"xhs_demo_c_057","ipLocation":"福建","theme":"价格","raw":{"commentId":"xhs_demo_c_057","noteId":"xhs_demo_015","platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H2","H8","H7"],"theme":"价格","content":"一盒够吃一个月最省心,太多规格反而选择困难。","user":{"userId":"xhs_comment_user_057","nickname":"带娃观察员"},"ipLocation":"福建","likeCount":18,"subCommentCount":3,"createdAt":"2026-04-17T17:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_015"}}
+{"id":"xhs_comment_xhs_demo_c_058","platform":"xiaohongshu","sourceType":"comment","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H2","H8"],"author":"胃肠敏感星人","text":"把活菌数翻译成怎么吃、吃多久、怎么看变化会更有用。","likeCount":25,"replyCount":6,"publishTime":"2026-04-18T18:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_015","parentId":"xhs_demo_015","commentId":"xhs_demo_c_058","ipLocation":"湖北","theme":"话术","raw":{"commentId":"xhs_demo_c_058","noteId":"xhs_demo_015","platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H2","H8"],"theme":"话术","content":"把活菌数翻译成怎么吃、吃多久、怎么看变化会更有用。","user":{"userId":"xhs_comment_user_058","nickname":"胃肠敏感星人"},"ipLocation":"湖北","likeCount":25,"subCommentCount":6,"createdAt":"2026-04-18T18:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_015"}}
+{"id":"xhs_comment_xhs_demo_c_059","platform":"xiaohongshu","sourceType":"comment","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H2","H8","H1"],"author":"囤货前先问","text":"我们家主要是排便不规律,想知道吃多久能观察到变化。","likeCount":32,"replyCount":1,"publishTime":"2026-04-19T19:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_015","parentId":"xhs_demo_015","commentId":"xhs_demo_c_059","ipLocation":"山东","theme":"痛点","raw":{"commentId":"xhs_demo_c_059","noteId":"xhs_demo_015","platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H2","H8","H1"],"theme":"痛点","content":"我们家主要是排便不规律,想知道吃多久能观察到变化。","user":{"userId":"xhs_comment_user_059","nickname":"囤货前先问"},"ipLocation":"山东","likeCount":32,"subCommentCount":1,"createdAt":"2026-04-19T19:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_015"}}
+{"id":"xhs_comment_xhs_demo_c_060","platform":"xiaohongshu","sourceType":"comment","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H2","H8"],"author":"真实反馈bot","text":"老人帮忙带娃时说明要简单,不然冲调水温总搞错。","likeCount":39,"replyCount":4,"publishTime":"2026-04-20T08:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_015","parentId":"xhs_demo_015","commentId":"xhs_demo_c_060","ipLocation":"重庆","theme":"场景","raw":{"commentId":"xhs_demo_c_060","noteId":"xhs_demo_015","platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H2","H8"],"theme":"场景","content":"老人帮忙带娃时说明要简单,不然冲调水温总搞错。","user":{"userId":"xhs_comment_user_060","nickname":"真实反馈bot"},"ipLocation":"重庆","likeCount":39,"subCommentCount":4,"createdAt":"2026-04-20T08:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_015"}}
+{"id":"xhs_comment_xhs_demo_c_061","platform":"xiaohongshu","sourceType":"comment","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H4","H6","H8"],"author":"小满妈妈","text":"把活菌数翻译成怎么吃、吃多久、怎么看变化会更有用。","likeCount":46,"replyCount":7,"publishTime":"2026-04-01T09:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_016","parentId":"xhs_demo_016","commentId":"xhs_demo_c_061","ipLocation":"浙江","theme":"话术","raw":{"commentId":"xhs_demo_c_061","noteId":"xhs_demo_016","platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H4","H6","H8"],"theme":"话术","content":"把活菌数翻译成怎么吃、吃多久、怎么看变化会更有用。","user":{"userId":"xhs_comment_user_061","nickname":"小满妈妈"},"ipLocation":"浙江","likeCount":46,"subCommentCount":7,"createdAt":"2026-04-01T09:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_016"}}
+{"id":"xhs_comment_xhs_demo_c_062","platform":"xiaohongshu","sourceType":"comment","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H4","H6","H1"],"author":"配料表先行","text":"我们家主要是排便不规律,想知道吃多久能观察到变化。","likeCount":53,"replyCount":2,"publishTime":"2026-04-02T10:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_016","parentId":"xhs_demo_016","commentId":"xhs_demo_c_062","ipLocation":"上海","theme":"痛点","raw":{"commentId":"xhs_demo_c_062","noteId":"xhs_demo_016","platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H4","H6","H1"],"theme":"痛点","content":"我们家主要是排便不规律,想知道吃多久能观察到变化。","user":{"userId":"xhs_comment_user_062","nickname":"配料表先行"},"ipLocation":"上海","likeCount":53,"subCommentCount":2,"createdAt":"2026-04-02T10:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_016"}}
+{"id":"xhs_comment_xhs_demo_c_063","platform":"xiaohongshu","sourceType":"comment","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H4","H6","H2"],"author":"打工人小周","text":"老人帮忙带娃时说明要简单,不然冲调水温总搞错。","likeCount":60,"replyCount":5,"publishTime":"2026-04-03T11:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_016","parentId":"xhs_demo_016","commentId":"xhs_demo_c_063","ipLocation":"广东","theme":"场景","raw":{"commentId":"xhs_demo_c_063","noteId":"xhs_demo_016","platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H4","H6","H2"],"theme":"场景","content":"老人帮忙带娃时说明要简单,不然冲调水温总搞错。","user":{"userId":"xhs_comment_user_063","nickname":"打工人小周"},"ipLocation":"广东","likeCount":60,"subCommentCount":5,"createdAt":"2026-04-03T11:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_016"}}
+{"id":"xhs_comment_xhs_demo_c_064","platform":"xiaohongshu","sourceType":"comment","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H7"],"author":"橙子爸","text":"我们家主要是排便不规律,想知道吃多久能观察到变化。","likeCount":67,"replyCount":0,"publishTime":"2026-04-04T12:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_017","parentId":"xhs_demo_017","commentId":"xhs_demo_c_064","ipLocation":"江苏","theme":"痛点","raw":{"commentId":"xhs_demo_c_064","noteId":"xhs_demo_017","platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H7"],"theme":"痛点","content":"我们家主要是排便不规律,想知道吃多久能观察到变化。","user":{"userId":"xhs_comment_user_064","nickname":"橙子爸"},"ipLocation":"江苏","likeCount":67,"subCommentCount":0,"createdAt":"2026-04-04T12:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_017"}}
+{"id":"xhs_comment_xhs_demo_c_065","platform":"xiaohongshu","sourceType":"comment","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H7","H2"],"author":"理性下单中","text":"老人帮忙带娃时说明要简单,不然冲调水温总搞错。","likeCount":74,"replyCount":3,"publishTime":"2026-04-05T13:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_017","parentId":"xhs_demo_017","commentId":"xhs_demo_c_065","ipLocation":"四川","theme":"场景","raw":{"commentId":"xhs_demo_c_065","noteId":"xhs_demo_017","platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H7","H2"],"theme":"场景","content":"老人帮忙带娃时说明要简单,不然冲调水温总搞错。","user":{"userId":"xhs_comment_user_065","nickname":"理性下单中"},"ipLocation":"四川","likeCount":74,"subCommentCount":3,"createdAt":"2026-04-05T13:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_017"}}
+{"id":"xhs_comment_xhs_demo_c_066","platform":"xiaohongshu","sourceType":"comment","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H7","H3"],"author":"不想踩雷","text":"我会先看菌株编号和配料表,客服讲不清楚就不下单。","likeCount":81,"replyCount":6,"publishTime":"2026-04-06T14:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_017","parentId":"xhs_demo_017","commentId":"xhs_demo_c_066","ipLocation":"北京","theme":"决策","raw":{"commentId":"xhs_demo_c_066","noteId":"xhs_demo_017","platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H7","H3"],"theme":"决策","content":"我会先看菌株编号和配料表,客服讲不清楚就不下单。","user":{"userId":"xhs_comment_user_066","nickname":"不想踩雷"},"ipLocation":"北京","likeCount":81,"subCommentCount":6,"createdAt":"2026-04-06T14:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_017"}}
+{"id":"xhs_comment_xhs_demo_c_067","platform":"xiaohongshu","sourceType":"comment","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H3","H4","H8","H2"],"author":"带娃观察员","text":"老人帮忙带娃时说明要简单,不然冲调水温总搞错。","likeCount":88,"replyCount":1,"publishTime":"2026-04-07T15:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_018","parentId":"xhs_demo_018","commentId":"xhs_demo_c_067","ipLocation":"福建","theme":"场景","raw":{"commentId":"xhs_demo_c_067","noteId":"xhs_demo_018","platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H3","H4","H8","H2"],"theme":"场景","content":"老人帮忙带娃时说明要简单,不然冲调水温总搞错。","user":{"userId":"xhs_comment_user_067","nickname":"带娃观察员"},"ipLocation":"福建","likeCount":88,"subCommentCount":1,"createdAt":"2026-04-07T15:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_018"}}
+{"id":"xhs_comment_xhs_demo_c_068","platform":"xiaohongshu","sourceType":"comment","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H3","H4","H8"],"author":"胃肠敏感星人","text":"我会先看菌株编号和配料表,客服讲不清楚就不下单。","likeCount":95,"replyCount":4,"publishTime":"2026-04-08T16:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_018","parentId":"xhs_demo_018","commentId":"xhs_demo_c_068","ipLocation":"湖北","theme":"决策","raw":{"commentId":"xhs_demo_c_068","noteId":"xhs_demo_018","platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H3","H4","H8"],"theme":"决策","content":"我会先看菌株编号和配料表,客服讲不清楚就不下单。","user":{"userId":"xhs_comment_user_068","nickname":"胃肠敏感星人"},"ipLocation":"湖北","likeCount":95,"subCommentCount":4,"createdAt":"2026-04-08T16:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_018"}}
+{"id":"xhs_comment_xhs_demo_c_069","platform":"xiaohongshu","sourceType":"comment","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H3","H4","H8"],"author":"囤货前先问","text":"第一天有点胀,客服说减量观察后好多了。","likeCount":6,"replyCount":7,"publishTime":"2026-04-09T17:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_018","parentId":"xhs_demo_018","commentId":"xhs_demo_c_069","ipLocation":"山东","theme":"反馈","raw":{"commentId":"xhs_demo_c_069","noteId":"xhs_demo_018","platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H3","H4","H8"],"theme":"反馈","content":"第一天有点胀,客服说减量观察后好多了。","user":{"userId":"xhs_comment_user_069","nickname":"囤货前先问"},"ipLocation":"山东","likeCount":6,"subCommentCount":7,"createdAt":"2026-04-09T17:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_018"}}
+{"id":"xhs_comment_xhs_demo_c_070","platform":"xiaohongshu","sourceType":"comment","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H5","H3"],"author":"真实反馈bot","text":"我会先看菌株编号和配料表,客服讲不清楚就不下单。","likeCount":13,"replyCount":2,"publishTime":"2026-04-10T18:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_019","parentId":"xhs_demo_019","commentId":"xhs_demo_c_070","ipLocation":"重庆","theme":"决策","raw":{"commentId":"xhs_demo_c_070","noteId":"xhs_demo_019","platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H5","H3"],"theme":"决策","content":"我会先看菌株编号和配料表,客服讲不清楚就不下单。","user":{"userId":"xhs_comment_user_070","nickname":"真实反馈bot"},"ipLocation":"重庆","likeCount":13,"subCommentCount":2,"createdAt":"2026-04-10T18:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_019"}}
+{"id":"xhs_comment_xhs_demo_c_071","platform":"xiaohongshu","sourceType":"comment","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H5","H4"],"author":"小满妈妈","text":"第一天有点胀,客服说减量观察后好多了。","likeCount":20,"replyCount":5,"publishTime":"2026-04-11T19:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_019","parentId":"xhs_demo_019","commentId":"xhs_demo_c_071","ipLocation":"浙江","theme":"反馈","raw":{"commentId":"xhs_demo_c_071","noteId":"xhs_demo_019","platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H5","H4"],"theme":"反馈","content":"第一天有点胀,客服说减量观察后好多了。","user":{"userId":"xhs_comment_user_071","nickname":"小满妈妈"},"ipLocation":"浙江","likeCount":20,"subCommentCount":5,"createdAt":"2026-04-11T19:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_019"}}
+{"id":"xhs_comment_xhs_demo_c_072","platform":"xiaohongshu","sourceType":"comment","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H5"],"author":"配料表先行","text":"同价位我会选能把边界讲清楚的品牌。","likeCount":27,"replyCount":0,"publishTime":"2026-04-12T08:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_019","parentId":"xhs_demo_019","commentId":"xhs_demo_c_072","ipLocation":"上海","theme":"竞品","raw":{"commentId":"xhs_demo_c_072","noteId":"xhs_demo_019","platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H1","H5"],"theme":"竞品","content":"同价位我会选能把边界讲清楚的品牌。","user":{"userId":"xhs_comment_user_072","nickname":"配料表先行"},"ipLocation":"上海","likeCount":27,"subCommentCount":0,"createdAt":"2026-04-12T08:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_019"}}
+{"id":"xhs_comment_xhs_demo_c_073","platform":"xiaohongshu","sourceType":"comment","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H2","H4","H6"],"author":"打工人小周","text":"第一天有点胀,客服说减量观察后好多了。","likeCount":34,"replyCount":3,"publishTime":"2026-04-13T09:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_020","parentId":"xhs_demo_020","commentId":"xhs_demo_c_073","ipLocation":"广东","theme":"反馈","raw":{"commentId":"xhs_demo_c_073","noteId":"xhs_demo_020","platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H2","H4","H6"],"theme":"反馈","content":"第一天有点胀,客服说减量观察后好多了。","user":{"userId":"xhs_comment_user_073","nickname":"打工人小周"},"ipLocation":"广东","likeCount":34,"subCommentCount":3,"createdAt":"2026-04-13T09:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_020"}}
+{"id":"xhs_comment_xhs_demo_c_074","platform":"xiaohongshu","sourceType":"comment","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H2","H4","H6","H5"],"author":"橙子爸","text":"同价位我会选能把边界讲清楚的品牌。","likeCount":41,"replyCount":6,"publishTime":"2026-04-14T10:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_020","parentId":"xhs_demo_020","commentId":"xhs_demo_c_074","ipLocation":"江苏","theme":"竞品","raw":{"commentId":"xhs_demo_c_074","noteId":"xhs_demo_020","platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H2","H4","H6","H5"],"theme":"竞品","content":"同价位我会选能把边界讲清楚的品牌。","user":{"userId":"xhs_comment_user_074","nickname":"橙子爸"},"ipLocation":"江苏","likeCount":41,"subCommentCount":6,"createdAt":"2026-04-14T10:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_020"}}
+{"id":"xhs_comment_xhs_demo_c_075","platform":"xiaohongshu","sourceType":"comment","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H2","H4","H6"],"author":"理性下单中","text":"不要说包治便秘,说清楚辅助和观察周期反而更可信。","likeCount":48,"replyCount":1,"publishTime":"2026-04-15T11:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_020","parentId":"xhs_demo_020","commentId":"xhs_demo_c_075","ipLocation":"四川","theme":"信任","raw":{"commentId":"xhs_demo_c_075","noteId":"xhs_demo_020","platform":"xiaohongshu","keyword":"益生菌腹胀便秘","batch":"P0","hypothesisTags":["H2","H4","H6"],"theme":"信任","content":"不要说包治便秘,说清楚辅助和观察周期反而更可信。","user":{"userId":"xhs_comment_user_075","nickname":"理性下单中"},"ipLocation":"四川","likeCount":48,"subCommentCount":1,"createdAt":"2026-04-15T11:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_020"}}
+{"id":"xhs_comment_xhs_demo_c_076","platform":"xiaohongshu","sourceType":"comment","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H3","H5","H7"],"author":"不想踩雷","text":"同价位我会选能把边界讲清楚的品牌。","likeCount":55,"replyCount":4,"publishTime":"2026-04-16T12:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_021","parentId":"xhs_demo_021","commentId":"xhs_demo_c_076","ipLocation":"北京","theme":"竞品","raw":{"commentId":"xhs_demo_c_076","noteId":"xhs_demo_021","platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H3","H5","H7"],"theme":"竞品","content":"同价位我会选能把边界讲清楚的品牌。","user":{"userId":"xhs_comment_user_076","nickname":"不想踩雷"},"ipLocation":"北京","likeCount":55,"subCommentCount":4,"createdAt":"2026-04-16T12:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_021"}}
+{"id":"xhs_comment_xhs_demo_c_077","platform":"xiaohongshu","sourceType":"comment","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H3","H5","H7","H6"],"author":"带娃观察员","text":"不要说包治便秘,说清楚辅助和观察周期反而更可信。","likeCount":62,"replyCount":7,"publishTime":"2026-04-17T13:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_021","parentId":"xhs_demo_021","commentId":"xhs_demo_c_077","ipLocation":"福建","theme":"信任","raw":{"commentId":"xhs_demo_c_077","noteId":"xhs_demo_021","platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H3","H5","H7","H6"],"theme":"信任","content":"不要说包治便秘,说清楚辅助和观察周期反而更可信。","user":{"userId":"xhs_comment_user_077","nickname":"带娃观察员"},"ipLocation":"福建","likeCount":62,"subCommentCount":7,"createdAt":"2026-04-17T13:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_021"}}
+{"id":"xhs_comment_xhs_demo_c_078","platform":"xiaohongshu","sourceType":"comment","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H3","H5","H7"],"author":"胃肠敏感星人","text":"每天成本超过8块我会犹豫,除非证据很清楚。","likeCount":69,"replyCount":2,"publishTime":"2026-04-18T14:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_021","parentId":"xhs_demo_021","commentId":"xhs_demo_c_078","ipLocation":"湖北","theme":"价格","raw":{"commentId":"xhs_demo_c_078","noteId":"xhs_demo_021","platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H3","H5","H7"],"theme":"价格","content":"每天成本超过8块我会犹豫,除非证据很清楚。","user":{"userId":"xhs_comment_user_078","nickname":"胃肠敏感星人"},"ipLocation":"湖北","likeCount":69,"subCommentCount":2,"createdAt":"2026-04-18T14:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_021"}}
+{"id":"xhs_comment_xhs_demo_c_079","platform":"xiaohongshu","sourceType":"comment","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H3","H6"],"author":"囤货前先问","text":"不要说包治便秘,说清楚辅助和观察周期反而更可信。","likeCount":76,"replyCount":5,"publishTime":"2026-04-19T15:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_022","parentId":"xhs_demo_022","commentId":"xhs_demo_c_079","ipLocation":"山东","theme":"信任","raw":{"commentId":"xhs_demo_c_079","noteId":"xhs_demo_022","platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H3","H6"],"theme":"信任","content":"不要说包治便秘,说清楚辅助和观察周期反而更可信。","user":{"userId":"xhs_comment_user_079","nickname":"囤货前先问"},"ipLocation":"山东","likeCount":76,"subCommentCount":5,"createdAt":"2026-04-19T15:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_022"}}
+{"id":"xhs_comment_xhs_demo_c_080","platform":"xiaohongshu","sourceType":"comment","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H3","H6","H7"],"author":"真实反馈bot","text":"每天成本超过8块我会犹豫,除非证据很清楚。","likeCount":83,"replyCount":0,"publishTime":"2026-04-20T16:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_022","parentId":"xhs_demo_022","commentId":"xhs_demo_c_080","ipLocation":"重庆","theme":"价格","raw":{"commentId":"xhs_demo_c_080","noteId":"xhs_demo_022","platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H3","H6","H7"],"theme":"价格","content":"每天成本超过8块我会犹豫,除非证据很清楚。","user":{"userId":"xhs_comment_user_080","nickname":"真实反馈bot"},"ipLocation":"重庆","likeCount":83,"subCommentCount":0,"createdAt":"2026-04-20T16:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_022"}}
+{"id":"xhs_comment_xhs_demo_c_081","platform":"xiaohongshu","sourceType":"comment","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H3","H6","H8"],"author":"小满妈妈","text":"详情页少一点专利词,多一点家庭使用说明。","likeCount":90,"replyCount":3,"publishTime":"2026-04-01T17:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_022","parentId":"xhs_demo_022","commentId":"xhs_demo_c_081","ipLocation":"浙江","theme":"话术","raw":{"commentId":"xhs_demo_c_081","noteId":"xhs_demo_022","platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H3","H6","H8"],"theme":"话术","content":"详情页少一点专利词,多一点家庭使用说明。","user":{"userId":"xhs_comment_user_081","nickname":"小满妈妈"},"ipLocation":"浙江","likeCount":90,"subCommentCount":3,"createdAt":"2026-04-01T17:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_022"}}
+{"id":"xhs_comment_xhs_demo_c_082","platform":"xiaohongshu","sourceType":"comment","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H5","H7"],"author":"配料表先行","text":"每天成本超过8块我会犹豫,除非证据很清楚。","likeCount":97,"replyCount":6,"publishTime":"2026-04-02T18:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_023","parentId":"xhs_demo_023","commentId":"xhs_demo_c_082","ipLocation":"上海","theme":"价格","raw":{"commentId":"xhs_demo_c_082","noteId":"xhs_demo_023","platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H5","H7"],"theme":"价格","content":"每天成本超过8块我会犹豫,除非证据很清楚。","user":{"userId":"xhs_comment_user_082","nickname":"配料表先行"},"ipLocation":"上海","likeCount":97,"subCommentCount":6,"createdAt":"2026-04-02T18:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_023"}}
+{"id":"xhs_comment_xhs_demo_c_083","platform":"xiaohongshu","sourceType":"comment","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H5","H7","H8"],"author":"打工人小周","text":"详情页少一点专利词,多一点家庭使用说明。","likeCount":8,"replyCount":1,"publishTime":"2026-04-03T19:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_023","parentId":"xhs_demo_023","commentId":"xhs_demo_c_083","ipLocation":"广东","theme":"话术","raw":{"commentId":"xhs_demo_c_083","noteId":"xhs_demo_023","platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H5","H7","H8"],"theme":"话术","content":"详情页少一点专利词,多一点家庭使用说明。","user":{"userId":"xhs_comment_user_083","nickname":"打工人小周"},"ipLocation":"广东","likeCount":8,"subCommentCount":1,"createdAt":"2026-04-03T19:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_023"}}
+{"id":"xhs_comment_xhs_demo_c_084","platform":"xiaohongshu","sourceType":"comment","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H5","H7","H1"],"author":"橙子爸","text":"最怕买回来孩子不愿意喝,之前有一款味道太甜直接闲置。","likeCount":15,"replyCount":4,"publishTime":"2026-04-04T08:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_023","parentId":"xhs_demo_023","commentId":"xhs_demo_c_084","ipLocation":"江苏","theme":"痛点","raw":{"commentId":"xhs_demo_c_084","noteId":"xhs_demo_023","platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H5","H7","H1"],"theme":"痛点","content":"最怕买回来孩子不愿意喝,之前有一款味道太甜直接闲置。","user":{"userId":"xhs_comment_user_084","nickname":"橙子爸"},"ipLocation":"江苏","likeCount":15,"subCommentCount":4,"createdAt":"2026-04-04T08:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_023"}}
+{"id":"xhs_comment_xhs_demo_c_085","platform":"xiaohongshu","sourceType":"comment","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H3","H8"],"author":"理性下单中","text":"详情页少一点专利词,多一点家庭使用说明。","likeCount":22,"replyCount":7,"publishTime":"2026-04-05T09:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_024","parentId":"xhs_demo_024","commentId":"xhs_demo_c_085","ipLocation":"四川","theme":"话术","raw":{"commentId":"xhs_demo_c_085","noteId":"xhs_demo_024","platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H3","H8"],"theme":"话术","content":"详情页少一点专利词,多一点家庭使用说明。","user":{"userId":"xhs_comment_user_085","nickname":"理性下单中"},"ipLocation":"四川","likeCount":22,"subCommentCount":7,"createdAt":"2026-04-05T09:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_024"}}
+{"id":"xhs_comment_xhs_demo_c_086","platform":"xiaohongshu","sourceType":"comment","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H3","H8","H1"],"author":"不想踩雷","text":"最怕买回来孩子不愿意喝,之前有一款味道太甜直接闲置。","likeCount":29,"replyCount":2,"publishTime":"2026-04-06T10:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_024","parentId":"xhs_demo_024","commentId":"xhs_demo_c_086","ipLocation":"北京","theme":"痛点","raw":{"commentId":"xhs_demo_c_086","noteId":"xhs_demo_024","platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H3","H8","H1"],"theme":"痛点","content":"最怕买回来孩子不愿意喝,之前有一款味道太甜直接闲置。","user":{"userId":"xhs_comment_user_086","nickname":"不想踩雷"},"ipLocation":"北京","likeCount":29,"subCommentCount":2,"createdAt":"2026-04-06T10:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_024"}}
+{"id":"xhs_comment_xhs_demo_c_087","platform":"xiaohongshu","sourceType":"comment","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H3","H8","H2"],"author":"带娃观察员","text":"外出吃饭后会备几条,小包装真的比大罐方便。","likeCount":36,"replyCount":5,"publishTime":"2026-04-07T11:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_024","parentId":"xhs_demo_024","commentId":"xhs_demo_c_087","ipLocation":"福建","theme":"场景","raw":{"commentId":"xhs_demo_c_087","noteId":"xhs_demo_024","platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H3","H8","H2"],"theme":"场景","content":"外出吃饭后会备几条,小包装真的比大罐方便。","user":{"userId":"xhs_comment_user_087","nickname":"带娃观察员"},"ipLocation":"福建","likeCount":36,"subCommentCount":5,"createdAt":"2026-04-07T11:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_024"}}
+{"id":"xhs_comment_xhs_demo_c_088","platform":"xiaohongshu","sourceType":"comment","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H4","H5","H1"],"author":"胃肠敏感星人","text":"最怕买回来孩子不愿意喝,之前有一款味道太甜直接闲置。","likeCount":43,"replyCount":0,"publishTime":"2026-04-08T12:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_025","parentId":"xhs_demo_025","commentId":"xhs_demo_c_088","ipLocation":"湖北","theme":"痛点","raw":{"commentId":"xhs_demo_c_088","noteId":"xhs_demo_025","platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H4","H5","H1"],"theme":"痛点","content":"最怕买回来孩子不愿意喝,之前有一款味道太甜直接闲置。","user":{"userId":"xhs_comment_user_088","nickname":"胃肠敏感星人"},"ipLocation":"湖北","likeCount":43,"subCommentCount":0,"createdAt":"2026-04-08T12:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_025"}}
+{"id":"xhs_comment_xhs_demo_c_089","platform":"xiaohongshu","sourceType":"comment","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H4","H5","H2"],"author":"囤货前先问","text":"外出吃饭后会备几条,小包装真的比大罐方便。","likeCount":50,"replyCount":3,"publishTime":"2026-04-09T13:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_025","parentId":"xhs_demo_025","commentId":"xhs_demo_c_089","ipLocation":"山东","theme":"场景","raw":{"commentId":"xhs_demo_c_089","noteId":"xhs_demo_025","platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H4","H5","H2"],"theme":"场景","content":"外出吃饭后会备几条,小包装真的比大罐方便。","user":{"userId":"xhs_comment_user_089","nickname":"囤货前先问"},"ipLocation":"山东","likeCount":50,"subCommentCount":3,"createdAt":"2026-04-09T13:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_025"}}
+{"id":"xhs_comment_xhs_demo_c_090","platform":"xiaohongshu","sourceType":"comment","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H4","H5","H3"],"author":"真实反馈bot","text":"独立条装、常温保存、少添加是我下单前最看重的。","likeCount":57,"replyCount":6,"publishTime":"2026-04-10T14:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_025","parentId":"xhs_demo_025","commentId":"xhs_demo_c_090","ipLocation":"重庆","theme":"决策","raw":{"commentId":"xhs_demo_c_090","noteId":"xhs_demo_025","platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H4","H5","H3"],"theme":"决策","content":"独立条装、常温保存、少添加是我下单前最看重的。","user":{"userId":"xhs_comment_user_090","nickname":"真实反馈bot"},"ipLocation":"重庆","likeCount":57,"subCommentCount":6,"createdAt":"2026-04-10T14:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_025"}}
+{"id":"xhs_comment_xhs_demo_c_091","platform":"xiaohongshu","sourceType":"comment","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H2","H7"],"author":"小满妈妈","text":"外出吃饭后会备几条,小包装真的比大罐方便。","likeCount":64,"replyCount":1,"publishTime":"2026-04-11T15:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_026","parentId":"xhs_demo_026","commentId":"xhs_demo_c_091","ipLocation":"浙江","theme":"场景","raw":{"commentId":"xhs_demo_c_091","noteId":"xhs_demo_026","platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H2","H7"],"theme":"场景","content":"外出吃饭后会备几条,小包装真的比大罐方便。","user":{"userId":"xhs_comment_user_091","nickname":"小满妈妈"},"ipLocation":"浙江","likeCount":64,"subCommentCount":1,"createdAt":"2026-04-11T15:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_026"}}
+{"id":"xhs_comment_xhs_demo_c_092","platform":"xiaohongshu","sourceType":"comment","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H2","H7","H3"],"author":"配料表先行","text":"独立条装、常温保存、少添加是我下单前最看重的。","likeCount":71,"replyCount":4,"publishTime":"2026-04-12T16:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_026","parentId":"xhs_demo_026","commentId":"xhs_demo_c_092","ipLocation":"上海","theme":"决策","raw":{"commentId":"xhs_demo_c_092","noteId":"xhs_demo_026","platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H2","H7","H3"],"theme":"决策","content":"独立条装、常温保存、少添加是我下单前最看重的。","user":{"userId":"xhs_comment_user_092","nickname":"配料表先行"},"ipLocation":"上海","likeCount":71,"subCommentCount":4,"createdAt":"2026-04-12T16:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_026"}}
+{"id":"xhs_comment_xhs_demo_c_093","platform":"xiaohongshu","sourceType":"comment","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H2","H7","H4"],"author":"打工人小周","text":"吃了三天没明显变化,但一周后排便时间稳定了一点。","likeCount":78,"replyCount":7,"publishTime":"2026-04-13T17:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_026","parentId":"xhs_demo_026","commentId":"xhs_demo_c_093","ipLocation":"广东","theme":"反馈","raw":{"commentId":"xhs_demo_c_093","noteId":"xhs_demo_026","platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H2","H7","H4"],"theme":"反馈","content":"吃了三天没明显变化,但一周后排便时间稳定了一点。","user":{"userId":"xhs_comment_user_093","nickname":"打工人小周"},"ipLocation":"广东","likeCount":78,"subCommentCount":7,"createdAt":"2026-04-13T17:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_026"}}
+{"id":"xhs_comment_xhs_demo_c_094","platform":"xiaohongshu","sourceType":"comment","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H3","H5","H6"],"author":"橙子爸","text":"独立条装、常温保存、少添加是我下单前最看重的。","likeCount":85,"replyCount":2,"publishTime":"2026-04-14T18:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_027","parentId":"xhs_demo_027","commentId":"xhs_demo_c_094","ipLocation":"江苏","theme":"决策","raw":{"commentId":"xhs_demo_c_094","noteId":"xhs_demo_027","platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H3","H5","H6"],"theme":"决策","content":"独立条装、常温保存、少添加是我下单前最看重的。","user":{"userId":"xhs_comment_user_094","nickname":"橙子爸"},"ipLocation":"江苏","likeCount":85,"subCommentCount":2,"createdAt":"2026-04-14T18:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_027"}}
+{"id":"xhs_comment_xhs_demo_c_095","platform":"xiaohongshu","sourceType":"comment","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H3","H5","H6","H4"],"author":"理性下单中","text":"吃了三天没明显变化,但一周后排便时间稳定了一点。","likeCount":92,"replyCount":5,"publishTime":"2026-04-15T19:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_027","parentId":"xhs_demo_027","commentId":"xhs_demo_c_095","ipLocation":"四川","theme":"反馈","raw":{"commentId":"xhs_demo_c_095","noteId":"xhs_demo_027","platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H3","H5","H6","H4"],"theme":"反馈","content":"吃了三天没明显变化,但一周后排便时间稳定了一点。","user":{"userId":"xhs_comment_user_095","nickname":"理性下单中"},"ipLocation":"四川","likeCount":92,"subCommentCount":5,"createdAt":"2026-04-15T19:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_027"}}
+{"id":"xhs_comment_xhs_demo_c_096","platform":"xiaohongshu","sourceType":"comment","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H3","H5","H6"],"author":"不想踩雷","text":"之前买的那款结块严重,这次会特别看包装密封。","likeCount":3,"replyCount":0,"publishTime":"2026-04-16T08:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_027","parentId":"xhs_demo_027","commentId":"xhs_demo_c_096","ipLocation":"北京","theme":"竞品","raw":{"commentId":"xhs_demo_c_096","noteId":"xhs_demo_027","platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H3","H5","H6"],"theme":"竞品","content":"之前买的那款结块严重,这次会特别看包装密封。","user":{"userId":"xhs_comment_user_096","nickname":"不想踩雷"},"ipLocation":"北京","likeCount":3,"subCommentCount":0,"createdAt":"2026-04-16T08:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_027"}}
+{"id":"xhs_comment_xhs_demo_c_097","platform":"xiaohongshu","sourceType":"comment","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H7","H8","H4"],"author":"带娃观察员","text":"吃了三天没明显变化,但一周后排便时间稳定了一点。","likeCount":10,"replyCount":3,"publishTime":"2026-04-17T09:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_028","parentId":"xhs_demo_028","commentId":"xhs_demo_c_097","ipLocation":"福建","theme":"反馈","raw":{"commentId":"xhs_demo_c_097","noteId":"xhs_demo_028","platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H7","H8","H4"],"theme":"反馈","content":"吃了三天没明显变化,但一周后排便时间稳定了一点。","user":{"userId":"xhs_comment_user_097","nickname":"带娃观察员"},"ipLocation":"福建","likeCount":10,"subCommentCount":3,"createdAt":"2026-04-17T09:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_028"}}
+{"id":"xhs_comment_xhs_demo_c_098","platform":"xiaohongshu","sourceType":"comment","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H7","H8","H5"],"author":"胃肠敏感星人","text":"之前买的那款结块严重,这次会特别看包装密封。","likeCount":17,"replyCount":6,"publishTime":"2026-04-18T10:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_028","parentId":"xhs_demo_028","commentId":"xhs_demo_c_098","ipLocation":"湖北","theme":"竞品","raw":{"commentId":"xhs_demo_c_098","noteId":"xhs_demo_028","platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H7","H8","H5"],"theme":"竞品","content":"之前买的那款结块严重,这次会特别看包装密封。","user":{"userId":"xhs_comment_user_098","nickname":"胃肠敏感星人"},"ipLocation":"湖北","likeCount":17,"subCommentCount":6,"createdAt":"2026-04-18T10:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_028"}}
+{"id":"xhs_comment_xhs_demo_c_099","platform":"xiaohongshu","sourceType":"comment","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H7","H8","H6"],"author":"囤货前先问","text":"能不能写清楚不适合哪些人?这比夸效果更重要。","likeCount":24,"replyCount":1,"publishTime":"2026-04-19T11:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_028","parentId":"xhs_demo_028","commentId":"xhs_demo_c_099","ipLocation":"山东","theme":"信任","raw":{"commentId":"xhs_demo_c_099","noteId":"xhs_demo_028","platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H7","H8","H6"],"theme":"信任","content":"能不能写清楚不适合哪些人?这比夸效果更重要。","user":{"userId":"xhs_comment_user_099","nickname":"囤货前先问"},"ipLocation":"山东","likeCount":24,"subCommentCount":1,"createdAt":"2026-04-19T11:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_028"}}
+{"id":"xhs_comment_xhs_demo_c_100","platform":"xiaohongshu","sourceType":"comment","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H4","H6","H5"],"author":"真实反馈bot","text":"之前买的那款结块严重,这次会特别看包装密封。","likeCount":31,"replyCount":4,"publishTime":"2026-04-20T12:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_029","parentId":"xhs_demo_029","commentId":"xhs_demo_c_100","ipLocation":"重庆","theme":"竞品","raw":{"commentId":"xhs_demo_c_100","noteId":"xhs_demo_029","platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H4","H6","H5"],"theme":"竞品","content":"之前买的那款结块严重,这次会特别看包装密封。","user":{"userId":"xhs_comment_user_100","nickname":"真实反馈bot"},"ipLocation":"重庆","likeCount":31,"subCommentCount":4,"createdAt":"2026-04-20T12:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_029"}}
+{"id":"xhs_comment_xhs_demo_c_101","platform":"xiaohongshu","sourceType":"comment","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H4","H6"],"author":"小满妈妈","text":"能不能写清楚不适合哪些人?这比夸效果更重要。","likeCount":38,"replyCount":7,"publishTime":"2026-04-01T13:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_029","parentId":"xhs_demo_029","commentId":"xhs_demo_c_101","ipLocation":"浙江","theme":"信任","raw":{"commentId":"xhs_demo_c_101","noteId":"xhs_demo_029","platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H4","H6"],"theme":"信任","content":"能不能写清楚不适合哪些人?这比夸效果更重要。","user":{"userId":"xhs_comment_user_101","nickname":"小满妈妈"},"ipLocation":"浙江","likeCount":38,"subCommentCount":7,"createdAt":"2026-04-01T13:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_029"}}
+{"id":"xhs_comment_xhs_demo_c_102","platform":"xiaohongshu","sourceType":"comment","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H4","H6","H7"],"author":"配料表先行","text":"希望先有7天试用装,有效果再买月装压力小。","likeCount":45,"replyCount":2,"publishTime":"2026-04-02T14:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_029","parentId":"xhs_demo_029","commentId":"xhs_demo_c_102","ipLocation":"上海","theme":"价格","raw":{"commentId":"xhs_demo_c_102","noteId":"xhs_demo_029","platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H4","H6","H7"],"theme":"价格","content":"希望先有7天试用装,有效果再买月装压力小。","user":{"userId":"xhs_comment_user_102","nickname":"配料表先行"},"ipLocation":"上海","likeCount":45,"subCommentCount":2,"createdAt":"2026-04-02T14:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_029"}}
+{"id":"xhs_comment_xhs_demo_c_103","platform":"xiaohongshu","sourceType":"comment","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H2","H3","H8","H6"],"author":"打工人小周","text":"能不能写清楚不适合哪些人?这比夸效果更重要。","likeCount":52,"replyCount":5,"publishTime":"2026-04-03T15:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_030","parentId":"xhs_demo_030","commentId":"xhs_demo_c_103","ipLocation":"广东","theme":"信任","raw":{"commentId":"xhs_demo_c_103","noteId":"xhs_demo_030","platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H2","H3","H8","H6"],"theme":"信任","content":"能不能写清楚不适合哪些人?这比夸效果更重要。","user":{"userId":"xhs_comment_user_103","nickname":"打工人小周"},"ipLocation":"广东","likeCount":52,"subCommentCount":5,"createdAt":"2026-04-03T15:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_030"}}
+{"id":"xhs_comment_xhs_demo_c_104","platform":"xiaohongshu","sourceType":"comment","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H2","H3","H8","H7"],"author":"橙子爸","text":"希望先有7天试用装,有效果再买月装压力小。","likeCount":59,"replyCount":0,"publishTime":"2026-04-04T16:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_030","parentId":"xhs_demo_030","commentId":"xhs_demo_c_104","ipLocation":"江苏","theme":"价格","raw":{"commentId":"xhs_demo_c_104","noteId":"xhs_demo_030","platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H2","H3","H8","H7"],"theme":"价格","content":"希望先有7天试用装,有效果再买月装压力小。","user":{"userId":"xhs_comment_user_104","nickname":"橙子爸"},"ipLocation":"江苏","likeCount":59,"subCommentCount":0,"createdAt":"2026-04-04T16:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_030"}}
+{"id":"xhs_comment_xhs_demo_c_105","platform":"xiaohongshu","sourceType":"comment","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H2","H3","H8"],"author":"理性下单中","text":"我喜欢7天观察卡这种内容,不像广告。","likeCount":66,"replyCount":3,"publishTime":"2026-04-05T17:20:00+08:00","collectedAt":"2026-04-29","url":"https://example.com/xhs/demo/xhs_demo_030","parentId":"xhs_demo_030","commentId":"xhs_demo_c_105","ipLocation":"四川","theme":"话术","raw":{"commentId":"xhs_demo_c_105","noteId":"xhs_demo_030","platform":"xiaohongshu","keyword":"冻干益生菌测评","batch":"P1","hypothesisTags":["H2","H3","H8"],"theme":"话术","content":"我喜欢7天观察卡这种内容,不像广告。","user":{"userId":"xhs_comment_user_105","nickname":"理性下单中"},"ipLocation":"四川","likeCount":66,"subCommentCount":3,"createdAt":"2026-04-05T17:20:00+08:00","sourceUrl":"https://example.com/xhs/demo/xhs_demo_030"}}

+ 37 - 0
demo/xiaohongshu/normalized/normalizer-audit.json

@@ -0,0 +1,37 @@
+{
+  "generatedAt": "2026-04-29T13:10:23.898Z",
+  "inputDir": "E:\\workspace\\openclaw-voc-skill\\demo\\xiaohongshu",
+  "outputDir": "E:\\workspace\\openclaw-voc-skill\\demo\\xiaohongshu\\normalized",
+  "files": [
+    "raw-comments.json",
+    "raw-notes.json"
+  ],
+  "sources": [
+    {
+      "file": "raw-comments.json",
+      "platform": "xiaohongshu",
+      "itemCount": 0,
+      "commentCount": 105
+    },
+    {
+      "file": "raw-notes.json",
+      "platform": "xiaohongshu",
+      "itemCount": 30,
+      "commentCount": 0
+    }
+  ],
+  "rawItemCount": 30,
+  "rawVocCount": 105,
+  "validItemCount": 30,
+  "validVocCount": 105,
+  "duplicateItemCount": 0,
+  "duplicateVocCount": 0,
+  "emptyItemDroppedCount": 0,
+  "emptyVocDroppedCount": 0,
+  "missingRequired": {
+    "items": [],
+    "comments": []
+  },
+  "errors": [],
+  "dedupeRule": "platform + id/commentId + first 120 normalized text characters"
+}

Разница между файлами не показана из-за своего большого размера
+ 8 - 0
demo/xiaohongshu/platform-mini-report/platform-mini-report.html


+ 390 - 0
demo/xiaohongshu/platform-mini-report/platform-mini-report.json

@@ -0,0 +1,390 @@
+{
+  "metadata": {
+    "project": "xiaohongshu-course-demo",
+    "category": "冻干益生菌",
+    "platformKey": "xiaohongshu",
+    "platformName": "小红书",
+    "dataNature": "课程合成样例",
+    "owner": "VOC Skills 课程 demo",
+    "date": "2026-04-29",
+    "generatedAt": "2026-04-29T14:19:46.243Z"
+  },
+  "stats": {
+    "platformCount": 1,
+    "keywordCount": 3,
+    "itemCount": 30,
+    "commentCount": 105,
+    "highInteractionItemCount": 23,
+    "keywords": [
+      "儿童益生菌怎么选",
+      "益生菌腹胀便秘",
+      "冻干益生菌测评"
+    ],
+    "platforms": [
+      "xiaohongshu"
+    ],
+    "hypothesisTags": [
+      "H1",
+      "H3",
+      "H6",
+      "H2",
+      "H4",
+      "H5",
+      "H7",
+      "H8"
+    ],
+    "batches": [
+      "P0",
+      "P1"
+    ]
+  },
+  "conclusion": "小红书 105 条可追溯 VOC 显示,冻干益生菌 当前最稳定的用户信号集中在 反馈(14)、竞品(14)、信任(14);这些证据覆盖 H1, H2, H3, H4, H5, H6, H7, H8,适合先形成单平台阶段性判断,再进入下一轮采集或报告定稿。",
+  "evidenceStrength": "高",
+  "hypothesisCoverage": [
+    {
+      "tag": "H1",
+      "label": "品类机会",
+      "count": 38,
+      "status": "已覆盖",
+      "usage": "用于判断品类机会、进入动机和核心阻力"
+    },
+    {
+      "tag": "H2",
+      "label": "用户需求",
+      "count": 39,
+      "status": "已覆盖",
+      "usage": "用于提炼用户痛点、场景和真实需求"
+    },
+    {
+      "tag": "H3",
+      "label": "产品缺口",
+      "count": 53,
+      "status": "已覆盖",
+      "usage": "用于定位产品缺口、体验问题和详情页改进"
+    },
+    {
+      "tag": "H4",
+      "label": "价格认知",
+      "count": 51,
+      "status": "已覆盖",
+      "usage": "用于判断价格、规格、周期和价值感"
+    },
+    {
+      "tag": "H5",
+      "label": "渠道内容",
+      "count": 30,
+      "status": "已覆盖",
+      "usage": "用于识别平台内容形式、种草路径和渠道触点"
+    },
+    {
+      "tag": "H6",
+      "label": "竞品策略",
+      "count": 48,
+      "status": "已覆盖",
+      "usage": "用于分析竞品替代、对比和差异化空间"
+    },
+    {
+      "tag": "H7",
+      "label": "定位表达",
+      "count": 32,
+      "status": "已覆盖",
+      "usage": "用于抽取定位表达、标题和话术偏好"
+    },
+    {
+      "tag": "H8",
+      "label": "增长行动",
+      "count": 35,
+      "status": "已覆盖",
+      "usage": "用于输出下一轮行动、验证指标和优先级"
+    }
+  ],
+  "themes": [
+    {
+      "theme": "反馈",
+      "count": 14,
+      "ratio": "13%",
+      "quote": "吃了三天没明显变化,但一周后排便时间稳定了一点。",
+      "source": "小红书 / 儿童益生菌怎么选 / P0 / xhs_demo_c_013",
+      "explanation": "使用反馈能暴露观察周期、体感边界和售后解释需求。"
+    },
+    {
+      "theme": "竞品",
+      "count": 14,
+      "ratio": "13%",
+      "quote": "进口牌子贵但说明详细,国产牌子客服回复快。",
+      "source": "小红书 / 儿童益生菌怎么选 / P0 / xhs_demo_c_040",
+      "explanation": "竞品/替代方案能暴露现有方案的赢点、输点和差异化切口。"
+    },
+    {
+      "theme": "信任",
+      "count": 14,
+      "ratio": "13%",
+      "quote": "过敏原、糖醇、香精这些最好直接标出来。",
+      "source": "小红书 / 益生菌腹胀便秘 / P0 / xhs_demo_c_053",
+      "explanation": "信任门槛来自适用边界、合规表达和不夸大的风险提示。"
+    },
+    {
+      "theme": "场景",
+      "count": 13,
+      "ratio": "12%",
+      "quote": "老人帮忙带娃时说明要简单,不然冲调水温总搞错。",
+      "source": "小红书 / 益生菌腹胀便秘 / P0 / xhs_demo_c_067",
+      "explanation": "需求由具体生活时刻触发,适合拆成场景化内容、组合装或使用说明。"
+    },
+    {
+      "theme": "价格",
+      "count": 13,
+      "ratio": "12%",
+      "quote": "每天成本超过8块我会犹豫,除非证据很清楚。",
+      "source": "小红书 / 冻干益生菌测评 / P1 / xhs_demo_c_082",
+      "explanation": "价格接受度与规格、试用成本、复购压力和效果确定性绑定。"
+    },
+    {
+      "theme": "决策",
+      "count": 13,
+      "ratio": "12%",
+      "quote": "详情页如果有适用人群表格,我会更容易判断。",
+      "source": "小红书 / 益生菌腹胀便秘 / P0 / xhs_demo_c_041",
+      "explanation": "用户需要明确选择标准,应把专业参数翻译成能下单的判断表。"
+    },
+    {
+      "theme": "话术",
+      "count": 12,
+      "ratio": "11%",
+      "quote": "我喜欢7天观察卡这种内容,不像广告。",
+      "source": "小红书 / 儿童益生菌怎么选 / P0 / xhs_demo_c_026",
+      "explanation": "用户原话可转成标题、详情页模块、客服脚本和内容 AB 测试。"
+    },
+    {
+      "theme": "痛点",
+      "count": 12,
+      "ratio": "11%",
+      "quote": "腹胀的时候孩子会闹,但我又不敢随便换太多产品。",
+      "source": "小红书 / 儿童益生菌怎么选 / P0 / xhs_demo_c_027",
+      "explanation": "用户正在规避闲置、无效、焦虑或使用失败风险,应优先转成产品改进和 FAQ。"
+    }
+  ],
+  "evidenceCards": [
+    {
+      "id": "xhs_comment_xhs_demo_c_082",
+      "source": "小红书 / 冻干益生菌测评 / P1 / xhs_demo_c_082",
+      "platform": "xiaohongshu",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "text": "每天成本超过8块我会犹豫,除非证据很清楚。",
+      "hypothesisTags": [
+        "H5",
+        "H7"
+      ],
+      "theme": "价格",
+      "likeCount": 97,
+      "replyCount": 6,
+      "url": "https://example.com/xhs/demo/xhs_demo_023",
+      "parentId": "xhs_demo_023",
+      "commentId": "xhs_demo_c_082"
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_013",
+      "source": "小红书 / 儿童益生菌怎么选 / P0 / xhs_demo_c_013",
+      "platform": "xiaohongshu",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "text": "吃了三天没明显变化,但一周后排便时间稳定了一点。",
+      "hypothesisTags": [
+        "H3",
+        "H7",
+        "H4"
+      ],
+      "theme": "反馈",
+      "likeCount": 94,
+      "replyCount": 7,
+      "url": "https://example.com/xhs/demo/xhs_demo_004",
+      "parentId": "xhs_demo_004",
+      "commentId": "xhs_demo_c_013"
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_041",
+      "source": "小红书 / 益生菌腹胀便秘 / P0 / xhs_demo_c_041",
+      "platform": "xiaohongshu",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "text": "详情页如果有适用人群表格,我会更容易判断。",
+      "hypothesisTags": [
+        "H1",
+        "H2",
+        "H4",
+        "H3"
+      ],
+      "theme": "决策",
+      "likeCount": 98,
+      "replyCount": 3,
+      "url": "https://example.com/xhs/demo/xhs_demo_011",
+      "parentId": "xhs_demo_011",
+      "commentId": "xhs_demo_c_041"
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_068",
+      "source": "小红书 / 益生菌腹胀便秘 / P0 / xhs_demo_c_068",
+      "platform": "xiaohongshu",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "text": "我会先看菌株编号和配料表,客服讲不清楚就不下单。",
+      "hypothesisTags": [
+        "H3",
+        "H4",
+        "H8"
+      ],
+      "theme": "决策",
+      "likeCount": 95,
+      "replyCount": 4,
+      "url": "https://example.com/xhs/demo/xhs_demo_018",
+      "parentId": "xhs_demo_018",
+      "commentId": "xhs_demo_c_068"
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_026",
+      "source": "小红书 / 儿童益生菌怎么选 / P0 / xhs_demo_c_026",
+      "platform": "xiaohongshu",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "text": "我喜欢7天观察卡这种内容,不像广告。",
+      "hypothesisTags": [
+        "H2",
+        "H3",
+        "H7",
+        "H8"
+      ],
+      "theme": "话术",
+      "likeCount": 89,
+      "replyCount": 6,
+      "url": "https://example.com/xhs/demo/xhs_demo_007",
+      "parentId": "xhs_demo_007",
+      "commentId": "xhs_demo_c_026"
+    },
+    {
+      "id": "xhs_comment_xhs_demo_c_053",
+      "source": "小红书 / 益生菌腹胀便秘 / P0 / xhs_demo_c_053",
+      "platform": "xiaohongshu",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "text": "过敏原、糖醇、香精这些最好直接标出来。",
+      "hypothesisTags": [
+        "H1",
+        "H3",
+        "H4",
+        "H6"
+      ],
+      "theme": "信任",
+      "likeCount": 86,
+      "replyCount": 7,
+      "url": "https://example.com/xhs/demo/xhs_demo_014",
+      "parentId": "xhs_demo_014",
+      "commentId": "xhs_demo_c_053"
+    }
+  ],
+  "opportunities": [
+    {
+      "opportunity": "反馈机会",
+      "evidence": "吃了三天没明显变化,但一周后排便时间稳定了一点。",
+      "action": "补充观察周期、适应期和售后解释,降低误解与退货。",
+      "priority": "P0"
+    },
+    {
+      "opportunity": "竞品机会",
+      "evidence": "进口牌子贵但说明详细,国产牌子客服回复快。",
+      "action": "提炼竞品漏洞,形成差异化卖点或替代理由。",
+      "priority": "P0"
+    },
+    {
+      "opportunity": "信任机会",
+      "evidence": "过敏原、糖醇、香精这些最好直接标出来。",
+      "action": "强化适用/不适用人群、风险边界和合规表达。",
+      "priority": "P0"
+    },
+    {
+      "opportunity": "场景机会",
+      "evidence": "老人帮忙带娃时说明要简单,不然冲调水温总搞错。",
+      "action": "围绕高触发场景设计内容专题、组合装或使用指南。",
+      "priority": "P1"
+    },
+    {
+      "opportunity": "价格机会",
+      "evidence": "每天成本超过8块我会犹豫,除非证据很清楚。",
+      "action": "设计试用装、月装和每天成本解释,降低首次购买压力。",
+      "priority": "P1"
+    }
+  ],
+  "contentRecommendations": [
+    {
+      "angle": "反馈",
+      "title": "《用冻干益生菌多久观察一次?真实反馈怎么判断》",
+      "source": "小红书 / 儿童益生菌怎么选 / P0 / xhs_demo_c_013",
+      "purpose": "获客"
+    },
+    {
+      "angle": "竞品",
+      "title": "《冻干益生菌和常见替代方案怎么选?真实对比清单》",
+      "source": "小红书 / 儿童益生菌怎么选 / P0 / xhs_demo_c_040",
+      "purpose": "建信任"
+    },
+    {
+      "angle": "信任",
+      "title": "《冻干益生菌适合谁、不适合谁,一次说清楚》",
+      "source": "小红书 / 益生菌腹胀便秘 / P0 / xhs_demo_c_053",
+      "purpose": "转化"
+    },
+    {
+      "angle": "场景",
+      "title": "《什么时候才需要冻干益生菌?把场景讲清楚》",
+      "source": "小红书 / 益生菌腹胀便秘 / P0 / xhs_demo_c_067",
+      "purpose": "复购"
+    },
+    {
+      "angle": "价格",
+      "title": "《先买试用装还是月装?冻干益生菌新手这样选》",
+      "source": "小红书 / 冻干益生菌测评 / P1 / xhs_demo_c_082",
+      "purpose": "获客"
+    }
+  ],
+  "risks": {
+    "dataBoundary": "本报告使用课程合成样例,不能代表真实市场规模、真实互动分布或真实品牌口碑。",
+    "noiseSource": "小红书 内容可能包含商业合作、测评号、重复评论、算法推荐和主观体验偏差。",
+    "cannotConclude": "不能把用户原声直接写成未经验证的功效、医学、安全或全市场结论。",
+    "nextValidation": "建议用竞品词、差评词和成交评价做交叉验证。"
+  },
+  "actions": [
+    {
+      "action": "补充观察周期、适应期和售后解释,降低误解与退货。",
+      "owner": "产品经理",
+      "deadline": "1 周",
+      "metric": "有效评论数、转化线索数、负反馈下降"
+    },
+    {
+      "action": "提炼竞品漏洞,形成差异化卖点或替代理由。",
+      "owner": "内容运营",
+      "deadline": "1 周",
+      "metric": "有效评论数、转化线索数、负反馈下降"
+    },
+    {
+      "action": "强化适用/不适用人群、风险边界和合规表达。",
+      "owner": "电商/客服",
+      "deadline": "2 周",
+      "metric": "FAQ 点击率、客服重复问题下降"
+    },
+    {
+      "action": "围绕高触发场景设计内容专题、组合装或使用指南。",
+      "owner": "项目负责人",
+      "deadline": "2 周",
+      "metric": "场景内容互动率、搜索词覆盖数"
+    }
+  ],
+  "audit": {
+    "generatedAt": "2026-04-29T14:19:46.243Z",
+    "commentCount": 105,
+    "evidenceCardCount": 6,
+    "warningCount": 0,
+    "uncoveredHypothesisCount": 0,
+    "emptyConclusion": false,
+    "hasTraceableEvidence": true
+  }
+}

+ 145 - 0
demo/xiaohongshu/platform-mini-report/platform-mini-report.md

@@ -0,0 +1,145 @@
+# Platform VOC Mini Report:小红书冻干益生菌
+
+> 本报告由 `platform-mini-report-generator` 基于 normalized VOC 数据自动生成,所有关键结论必须回溯到 VOC 证据卡。
+
+## 0. 报告信息
+
+| 字段 | 填写 |
+|---|---|
+| 项目/品类 | xiaohongshu-course-demo / 冻干益生菌 |
+| 分析平台 | 小红书 |
+| 分析关键词 | 儿童益生菌怎么选、益生菌腹胀便秘、冻干益生菌测评 |
+| 样本范围 | 30 条内容 / 105 条 VOC |
+| 数据性质 | 课程合成样例 |
+| 完成人 | VOC Skills 课程 demo |
+| 日期 | 2026-04-29 |
+
+## 1. 一句话结论
+
+- **核心结论**:小红书 105 条可追溯 VOC 显示,冻干益生菌 当前最稳定的用户信号集中在 反馈(14)、竞品(14)、信任(14);这些证据覆盖 H1, H2, H3, H4, H5, H6, H7, H8,适合先形成单平台阶段性判断,再进入下一轮采集或报告定稿。
+- **证据强度**:高
+- **最关键证据**:“每天成本超过8块我会犹豫,除非证据很清楚。”(小红书 / 冻干益生菌测评 / P1 / xhs_demo_c_082)
+
+## 2. 数据概况
+
+| 指标 | 数值 | 说明 |
+|---|---:|---|
+| 关键词数 | 3 | 儿童益生菌怎么选、益生菌腹胀便秘、冻干益生菌测评 |
+| 内容数 | 30 | normalized items |
+| VOC 数 | 105 | normalized comments |
+| 高互动内容数 | 23 | 点赞 > 500 / 收藏 > 300 / 评论 > 100 |
+| 覆盖假设数 | 8 | H1-H8 覆盖 |
+| 主要场景/主题 | 反馈、竞品、信任 | 按 theme 聚合 |
+
+### 2.1 H1-H8 假设覆盖速查
+
+| 假设 | 覆盖判断 | VOC 数 | 本报告中的使用方式 |
+|---|---|---:|---|
+| H1 品类机会 | 已覆盖 | 38 | 用于判断品类机会、进入动机和核心阻力 |
+| H2 用户需求 | 已覆盖 | 39 | 用于提炼用户痛点、场景和真实需求 |
+| H3 产品缺口 | 已覆盖 | 53 | 用于定位产品缺口、体验问题和详情页改进 |
+| H4 价格认知 | 已覆盖 | 51 | 用于判断价格、规格、周期和价值感 |
+| H5 渠道内容 | 已覆盖 | 30 | 用于识别平台内容形式、种草路径和渠道触点 |
+| H6 竞品策略 | 已覆盖 | 48 | 用于分析竞品替代、对比和差异化空间 |
+| H7 定位表达 | 已覆盖 | 32 | 用于抽取定位表达、标题和话术偏好 |
+| H8 增长行动 | 已覆盖 | 35 | 用于输出下一轮行动、验证指标和优先级 |
+
+## 3. 高频主题聚类
+
+| 主题 | 占比/频次 | 典型原声 | 业务解释 |
+|---|---:|---|---|
+| 反馈 | 13% / 14 | “吃了三天没明显变化,但一周后排便时间稳定了一点。” | 使用反馈能暴露观察周期、体感边界和售后解释需求。 |
+| 竞品 | 13% / 14 | “进口牌子贵但说明详细,国产牌子客服回复快。” | 竞品/替代方案能暴露现有方案的赢点、输点和差异化切口。 |
+| 信任 | 13% / 14 | “过敏原、糖醇、香精这些最好直接标出来。” | 信任门槛来自适用边界、合规表达和不夸大的风险提示。 |
+| 场景 | 12% / 13 | “老人帮忙带娃时说明要简单,不然冲调水温总搞错。” | 需求由具体生活时刻触发,适合拆成场景化内容、组合装或使用说明。 |
+| 价格 | 12% / 13 | “每天成本超过8块我会犹豫,除非证据很清楚。” | 价格接受度与规格、试用成本、复购压力和效果确定性绑定。 |
+| 决策 | 12% / 13 | “详情页如果有适用人群表格,我会更容易判断。” | 用户需要明确选择标准,应把专业参数翻译成能下单的判断表。 |
+| 话术 | 11% / 12 | “我喜欢7天观察卡这种内容,不像广告。” | 用户原话可转成标题、详情页模块、客服脚本和内容 AB 测试。 |
+| 痛点 | 11% / 12 | “腹胀的时候孩子会闹,但我又不敢随便换太多产品。” | 用户正在规避闲置、无效、焦虑或使用失败风险,应优先转成产品改进和 FAQ。 |
+
+## 4. VOC 原声证据卡
+
+### 证据 1:每天成本超过8块我会犹豫,除非证据很清楚。
+
+- **来源**:小红书 / 冻干益生菌测评 / P1 / xhs_demo_c_082
+- **原声**:“每天成本超过8块我会犹豫,除非证据很清楚。”
+- **标签**:H5, H7
+- **解释**:这条原声可支撑「价格」相关判断。
+
+### 证据 2:吃了三天没明显变化,但一周后排便时间稳定了一点。
+
+- **来源**:小红书 / 儿童益生菌怎么选 / P0 / xhs_demo_c_013
+- **原声**:“吃了三天没明显变化,但一周后排便时间稳定了一点。”
+- **标签**:H3, H7, H4
+- **解释**:这条原声可支撑「反馈」相关判断。
+
+### 证据 3:详情页如果有适用人群表格,我会更容易判断。
+
+- **来源**:小红书 / 益生菌腹胀便秘 / P0 / xhs_demo_c_041
+- **原声**:“详情页如果有适用人群表格,我会更容易判断。”
+- **标签**:H1, H2, H4, H3
+- **解释**:这条原声可支撑「决策」相关判断。
+
+### 证据 4:我会先看菌株编号和配料表,客服讲不清楚就不下单。
+
+- **来源**:小红书 / 益生菌腹胀便秘 / P0 / xhs_demo_c_068
+- **原声**:“我会先看菌株编号和配料表,客服讲不清楚就不下单。”
+- **标签**:H3, H4, H8
+- **解释**:这条原声可支撑「决策」相关判断。
+
+### 证据 5:我喜欢7天观察卡这种内容,不像广告。
+
+- **来源**:小红书 / 儿童益生菌怎么选 / P0 / xhs_demo_c_026
+- **原声**:“我喜欢7天观察卡这种内容,不像广告。”
+- **标签**:H2, H3, H7, H8
+- **解释**:这条原声可支撑「话术」相关判断。
+
+### 证据 6:过敏原、糖醇、香精这些最好直接标出来。
+
+- **来源**:小红书 / 益生菌腹胀便秘 / P0 / xhs_demo_c_053
+- **原声**:“过敏原、糖醇、香精这些最好直接标出来。”
+- **标签**:H1, H3, H4, H6
+- **解释**:这条原声可支撑「信任」相关判断。
+
+## 5. 产品/内容机会
+
+| 机会点 | 对应 VOC | 建议动作 | 优先级 |
+|---|---|---|---|
+| 反馈机会 | “吃了三天没明显变化,但一周后排便时间稳定了一点。” | 补充观察周期、适应期和售后解释,降低误解与退货。 | P0 |
+| 竞品机会 | “进口牌子贵但说明详细,国产牌子客服回复快。” | 提炼竞品漏洞,形成差异化卖点或替代理由。 | P0 |
+| 信任机会 | “过敏原、糖醇、香精这些最好直接标出来。” | 强化适用/不适用人群、风险边界和合规表达。 | P0 |
+| 场景机会 | “老人帮忙带娃时说明要简单,不然冲调水温总搞错。” | 围绕高触发场景设计内容专题、组合装或使用指南。 | P1 |
+| 价格机会 | “每天成本超过8块我会犹豫,除非证据很清楚。” | 设计试用装、月装和每天成本解释,降低首次购买压力。 | P1 |
+
+## 6. 小红书内容建议
+
+| 内容角度 | 推荐标题 | 证据来源 | 目的 |
+|---|---|---|---|
+| 反馈 | 《用冻干益生菌多久观察一次?真实反馈怎么判断》 | 小红书 / 儿童益生菌怎么选 / P0 / xhs_demo_c_013 | 获客 |
+| 竞品 | 《冻干益生菌和常见替代方案怎么选?真实对比清单》 | 小红书 / 儿童益生菌怎么选 / P0 / xhs_demo_c_040 | 建信任 |
+| 信任 | 《冻干益生菌适合谁、不适合谁,一次说清楚》 | 小红书 / 益生菌腹胀便秘 / P0 / xhs_demo_c_053 | 转化 |
+| 场景 | 《什么时候才需要冻干益生菌?把场景讲清楚》 | 小红书 / 益生菌腹胀便秘 / P0 / xhs_demo_c_067 | 复购 |
+| 价格 | 《先买试用装还是月装?冻干益生菌新手这样选》 | 小红书 / 冻干益生菌测评 / P1 / xhs_demo_c_082 | 获客 |
+
+## 7. 风险与边界
+
+- **数据边界**:本报告使用课程合成样例,不能代表真实市场规模、真实互动分布或真实品牌口碑。
+- **噪声来源**:小红书 内容可能包含商业合作、测评号、重复评论、算法推荐和主观体验偏差。
+- **不能推出的结论**:不能把用户原声直接写成未经验证的功效、医学、安全或全市场结论。
+- **下一步需要补采/验证**:建议用竞品词、差评词和成交评价做交叉验证。
+
+## 8. 结课行动清单
+
+| 行动 | 负责人 | 截止时间 | 验证指标 |
+|---|---|---|---|
+| 补充观察周期、适应期和售后解释,降低误解与退货。 | 产品经理 | 1 周 | 有效评论数、转化线索数、负反馈下降 |
+| 提炼竞品漏洞,形成差异化卖点或替代理由。 | 内容运营 | 1 周 | 有效评论数、转化线索数、负反馈下降 |
+| 强化适用/不适用人群、风险边界和合规表达。 | 电商/客服 | 2 周 | FAQ 点击率、客服重复问题下降 |
+| 围绕高触发场景设计内容专题、组合装或使用指南。 | 项目负责人 | 2 周 | 场景内容互动率、搜索词覆盖数 |
+
+## 9. 生成审计
+
+- **证据卡数**:6
+- **警告数**:0
+- **未覆盖假设数**:0
+- **证据可追溯**:是

+ 2650 - 0
demo/xiaohongshu/raw-comments.json

@@ -0,0 +1,2650 @@
+{
+  "metadata": {
+    "dataset": "xiaohongshu-course-demo-comments",
+    "topic": "冻干益生菌 VOC 2小时课",
+    "platform": "xiaohongshu",
+    "dataType": "synthetic_course_sample",
+    "generatedAt": "2026-04-29",
+    "noteCount": 30,
+    "commentCount": 105,
+    "disclaimer": "本数据为课程合成样例,仅用于离线教学、字段演示和报告练习,不代表真实小红书抓取结果。"
+  },
+  "commentsByNote": [
+    {
+      "noteId": "xhs_demo_001",
+      "keyword": "儿童益生菌怎么选",
+      "commentCount": 4,
+      "comments": [
+        {
+          "commentId": "xhs_demo_c_001",
+          "noteId": "xhs_demo_001",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H1",
+            "H3",
+            "H6"
+          ],
+          "theme": "痛点",
+          "content": "最怕买回来孩子不愿意喝,之前有一款味道太甜直接闲置。",
+          "user": {
+            "userId": "xhs_comment_user_001",
+            "nickname": "小满妈妈"
+          },
+          "ipLocation": "浙江",
+          "likeCount": 10,
+          "subCommentCount": 3,
+          "createdAt": "2026-04-01T09:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_001"
+        },
+        {
+          "commentId": "xhs_demo_c_002",
+          "noteId": "xhs_demo_001",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H1",
+            "H3",
+            "H6",
+            "H2"
+          ],
+          "theme": "场景",
+          "content": "外出吃饭后会备几条,小包装真的比大罐方便。",
+          "user": {
+            "userId": "xhs_comment_user_002",
+            "nickname": "配料表先行"
+          },
+          "ipLocation": "上海",
+          "likeCount": 17,
+          "subCommentCount": 6,
+          "createdAt": "2026-04-02T10:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_001"
+        },
+        {
+          "commentId": "xhs_demo_c_003",
+          "noteId": "xhs_demo_001",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H1",
+            "H3",
+            "H6"
+          ],
+          "theme": "决策",
+          "content": "独立条装、常温保存、少添加是我下单前最看重的。",
+          "user": {
+            "userId": "xhs_comment_user_003",
+            "nickname": "打工人小周"
+          },
+          "ipLocation": "广东",
+          "likeCount": 24,
+          "subCommentCount": 1,
+          "createdAt": "2026-04-03T11:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_001"
+        },
+        {
+          "commentId": "xhs_demo_c_004",
+          "noteId": "xhs_demo_001",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H1",
+            "H3",
+            "H6",
+            "H4"
+          ],
+          "theme": "反馈",
+          "content": "吃了三天没明显变化,但一周后排便时间稳定了一点。",
+          "user": {
+            "userId": "xhs_comment_user_004",
+            "nickname": "橙子爸"
+          },
+          "ipLocation": "江苏",
+          "likeCount": 31,
+          "subCommentCount": 4,
+          "createdAt": "2026-04-04T12:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_001"
+        }
+      ]
+    },
+    {
+      "noteId": "xhs_demo_002",
+      "keyword": "儿童益生菌怎么选",
+      "commentCount": 4,
+      "comments": [
+        {
+          "commentId": "xhs_demo_c_005",
+          "noteId": "xhs_demo_002",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H3",
+            "H6",
+            "H2"
+          ],
+          "theme": "场景",
+          "content": "外出吃饭后会备几条,小包装真的比大罐方便。",
+          "user": {
+            "userId": "xhs_comment_user_005",
+            "nickname": "理性下单中"
+          },
+          "ipLocation": "四川",
+          "likeCount": 38,
+          "subCommentCount": 7,
+          "createdAt": "2026-04-05T13:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_002"
+        },
+        {
+          "commentId": "xhs_demo_c_006",
+          "noteId": "xhs_demo_002",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H3",
+            "H6"
+          ],
+          "theme": "决策",
+          "content": "独立条装、常温保存、少添加是我下单前最看重的。",
+          "user": {
+            "userId": "xhs_comment_user_006",
+            "nickname": "不想踩雷"
+          },
+          "ipLocation": "北京",
+          "likeCount": 45,
+          "subCommentCount": 2,
+          "createdAt": "2026-04-06T14:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_002"
+        },
+        {
+          "commentId": "xhs_demo_c_007",
+          "noteId": "xhs_demo_002",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H3",
+            "H6",
+            "H4"
+          ],
+          "theme": "反馈",
+          "content": "吃了三天没明显变化,但一周后排便时间稳定了一点。",
+          "user": {
+            "userId": "xhs_comment_user_007",
+            "nickname": "带娃观察员"
+          },
+          "ipLocation": "福建",
+          "likeCount": 52,
+          "subCommentCount": 5,
+          "createdAt": "2026-04-07T15:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_002"
+        },
+        {
+          "commentId": "xhs_demo_c_008",
+          "noteId": "xhs_demo_002",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H3",
+            "H6",
+            "H5"
+          ],
+          "theme": "竞品",
+          "content": "之前买的那款结块严重,这次会特别看包装密封。",
+          "user": {
+            "userId": "xhs_comment_user_008",
+            "nickname": "胃肠敏感星人"
+          },
+          "ipLocation": "湖北",
+          "likeCount": 59,
+          "subCommentCount": 0,
+          "createdAt": "2026-04-08T16:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_002"
+        }
+      ]
+    },
+    {
+      "noteId": "xhs_demo_003",
+      "keyword": "儿童益生菌怎么选",
+      "commentCount": 4,
+      "comments": [
+        {
+          "commentId": "xhs_demo_c_009",
+          "noteId": "xhs_demo_003",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H1",
+            "H2",
+            "H4",
+            "H3"
+          ],
+          "theme": "决策",
+          "content": "独立条装、常温保存、少添加是我下单前最看重的。",
+          "user": {
+            "userId": "xhs_comment_user_009",
+            "nickname": "囤货前先问"
+          },
+          "ipLocation": "山东",
+          "likeCount": 66,
+          "subCommentCount": 3,
+          "createdAt": "2026-04-09T17:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_003"
+        },
+        {
+          "commentId": "xhs_demo_c_010",
+          "noteId": "xhs_demo_003",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H1",
+            "H2",
+            "H4"
+          ],
+          "theme": "反馈",
+          "content": "吃了三天没明显变化,但一周后排便时间稳定了一点。",
+          "user": {
+            "userId": "xhs_comment_user_010",
+            "nickname": "真实反馈bot"
+          },
+          "ipLocation": "重庆",
+          "likeCount": 73,
+          "subCommentCount": 6,
+          "createdAt": "2026-04-10T18:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_003"
+        },
+        {
+          "commentId": "xhs_demo_c_011",
+          "noteId": "xhs_demo_003",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H1",
+            "H2",
+            "H4",
+            "H5"
+          ],
+          "theme": "竞品",
+          "content": "之前买的那款结块严重,这次会特别看包装密封。",
+          "user": {
+            "userId": "xhs_comment_user_011",
+            "nickname": "小满妈妈"
+          },
+          "ipLocation": "浙江",
+          "likeCount": 80,
+          "subCommentCount": 1,
+          "createdAt": "2026-04-11T19:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_003"
+        },
+        {
+          "commentId": "xhs_demo_c_012",
+          "noteId": "xhs_demo_003",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H1",
+            "H2",
+            "H4",
+            "H6"
+          ],
+          "theme": "信任",
+          "content": "能不能写清楚不适合哪些人?这比夸效果更重要。",
+          "user": {
+            "userId": "xhs_comment_user_012",
+            "nickname": "配料表先行"
+          },
+          "ipLocation": "上海",
+          "likeCount": 87,
+          "subCommentCount": 4,
+          "createdAt": "2026-04-12T08:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_003"
+        }
+      ]
+    },
+    {
+      "noteId": "xhs_demo_004",
+      "keyword": "儿童益生菌怎么选",
+      "commentCount": 4,
+      "comments": [
+        {
+          "commentId": "xhs_demo_c_013",
+          "noteId": "xhs_demo_004",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H3",
+            "H7",
+            "H4"
+          ],
+          "theme": "反馈",
+          "content": "吃了三天没明显变化,但一周后排便时间稳定了一点。",
+          "user": {
+            "userId": "xhs_comment_user_013",
+            "nickname": "打工人小周"
+          },
+          "ipLocation": "广东",
+          "likeCount": 94,
+          "subCommentCount": 7,
+          "createdAt": "2026-04-13T09:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_004"
+        },
+        {
+          "commentId": "xhs_demo_c_014",
+          "noteId": "xhs_demo_004",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H3",
+            "H7",
+            "H5"
+          ],
+          "theme": "竞品",
+          "content": "之前买的那款结块严重,这次会特别看包装密封。",
+          "user": {
+            "userId": "xhs_comment_user_014",
+            "nickname": "橙子爸"
+          },
+          "ipLocation": "江苏",
+          "likeCount": 5,
+          "subCommentCount": 2,
+          "createdAt": "2026-04-14T10:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_004"
+        },
+        {
+          "commentId": "xhs_demo_c_015",
+          "noteId": "xhs_demo_004",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H3",
+            "H7",
+            "H6"
+          ],
+          "theme": "信任",
+          "content": "能不能写清楚不适合哪些人?这比夸效果更重要。",
+          "user": {
+            "userId": "xhs_comment_user_015",
+            "nickname": "理性下单中"
+          },
+          "ipLocation": "四川",
+          "likeCount": 12,
+          "subCommentCount": 5,
+          "createdAt": "2026-04-15T11:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_004"
+        },
+        {
+          "commentId": "xhs_demo_c_016",
+          "noteId": "xhs_demo_004",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H3",
+            "H7"
+          ],
+          "theme": "价格",
+          "content": "希望先有7天试用装,有效果再买月装压力小。",
+          "user": {
+            "userId": "xhs_comment_user_016",
+            "nickname": "不想踩雷"
+          },
+          "ipLocation": "北京",
+          "likeCount": 19,
+          "subCommentCount": 0,
+          "createdAt": "2026-04-16T12:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_004"
+        }
+      ]
+    },
+    {
+      "noteId": "xhs_demo_005",
+      "keyword": "儿童益生菌怎么选",
+      "commentCount": 4,
+      "comments": [
+        {
+          "commentId": "xhs_demo_c_017",
+          "noteId": "xhs_demo_005",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H6",
+            "H8",
+            "H5"
+          ],
+          "theme": "竞品",
+          "content": "之前买的那款结块严重,这次会特别看包装密封。",
+          "user": {
+            "userId": "xhs_comment_user_017",
+            "nickname": "带娃观察员"
+          },
+          "ipLocation": "福建",
+          "likeCount": 26,
+          "subCommentCount": 3,
+          "createdAt": "2026-04-17T13:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_005"
+        },
+        {
+          "commentId": "xhs_demo_c_018",
+          "noteId": "xhs_demo_005",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H6",
+            "H8"
+          ],
+          "theme": "信任",
+          "content": "能不能写清楚不适合哪些人?这比夸效果更重要。",
+          "user": {
+            "userId": "xhs_comment_user_018",
+            "nickname": "胃肠敏感星人"
+          },
+          "ipLocation": "湖北",
+          "likeCount": 33,
+          "subCommentCount": 6,
+          "createdAt": "2026-04-18T14:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_005"
+        },
+        {
+          "commentId": "xhs_demo_c_019",
+          "noteId": "xhs_demo_005",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H6",
+            "H8",
+            "H7"
+          ],
+          "theme": "价格",
+          "content": "希望先有7天试用装,有效果再买月装压力小。",
+          "user": {
+            "userId": "xhs_comment_user_019",
+            "nickname": "囤货前先问"
+          },
+          "ipLocation": "山东",
+          "likeCount": 40,
+          "subCommentCount": 1,
+          "createdAt": "2026-04-19T15:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_005"
+        },
+        {
+          "commentId": "xhs_demo_c_020",
+          "noteId": "xhs_demo_005",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H6",
+            "H8"
+          ],
+          "theme": "话术",
+          "content": "我喜欢7天观察卡这种内容,不像广告。",
+          "user": {
+            "userId": "xhs_comment_user_020",
+            "nickname": "真实反馈bot"
+          },
+          "ipLocation": "重庆",
+          "likeCount": 47,
+          "subCommentCount": 4,
+          "createdAt": "2026-04-20T16:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_005"
+        }
+      ]
+    },
+    {
+      "noteId": "xhs_demo_006",
+      "keyword": "儿童益生菌怎么选",
+      "commentCount": 4,
+      "comments": [
+        {
+          "commentId": "xhs_demo_c_021",
+          "noteId": "xhs_demo_006",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H1",
+            "H4",
+            "H8",
+            "H6"
+          ],
+          "theme": "信任",
+          "content": "能不能写清楚不适合哪些人?这比夸效果更重要。",
+          "user": {
+            "userId": "xhs_comment_user_021",
+            "nickname": "小满妈妈"
+          },
+          "ipLocation": "浙江",
+          "likeCount": 54,
+          "subCommentCount": 7,
+          "createdAt": "2026-04-01T17:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_006"
+        },
+        {
+          "commentId": "xhs_demo_c_022",
+          "noteId": "xhs_demo_006",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H1",
+            "H4",
+            "H8",
+            "H7"
+          ],
+          "theme": "价格",
+          "content": "希望先有7天试用装,有效果再买月装压力小。",
+          "user": {
+            "userId": "xhs_comment_user_022",
+            "nickname": "配料表先行"
+          },
+          "ipLocation": "上海",
+          "likeCount": 61,
+          "subCommentCount": 2,
+          "createdAt": "2026-04-02T18:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_006"
+        },
+        {
+          "commentId": "xhs_demo_c_023",
+          "noteId": "xhs_demo_006",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H1",
+            "H4",
+            "H8"
+          ],
+          "theme": "话术",
+          "content": "我喜欢7天观察卡这种内容,不像广告。",
+          "user": {
+            "userId": "xhs_comment_user_023",
+            "nickname": "打工人小周"
+          },
+          "ipLocation": "广东",
+          "likeCount": 68,
+          "subCommentCount": 5,
+          "createdAt": "2026-04-03T19:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_006"
+        },
+        {
+          "commentId": "xhs_demo_c_024",
+          "noteId": "xhs_demo_006",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H1",
+            "H4",
+            "H8"
+          ],
+          "theme": "痛点",
+          "content": "腹胀的时候孩子会闹,但我又不敢随便换太多产品。",
+          "user": {
+            "userId": "xhs_comment_user_024",
+            "nickname": "橙子爸"
+          },
+          "ipLocation": "江苏",
+          "likeCount": 75,
+          "subCommentCount": 0,
+          "createdAt": "2026-04-04T08:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_006"
+        }
+      ]
+    },
+    {
+      "noteId": "xhs_demo_007",
+      "keyword": "儿童益生菌怎么选",
+      "commentCount": 4,
+      "comments": [
+        {
+          "commentId": "xhs_demo_c_025",
+          "noteId": "xhs_demo_007",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H2",
+            "H3",
+            "H7"
+          ],
+          "theme": "价格",
+          "content": "希望先有7天试用装,有效果再买月装压力小。",
+          "user": {
+            "userId": "xhs_comment_user_025",
+            "nickname": "理性下单中"
+          },
+          "ipLocation": "四川",
+          "likeCount": 82,
+          "subCommentCount": 3,
+          "createdAt": "2026-04-05T09:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_007"
+        },
+        {
+          "commentId": "xhs_demo_c_026",
+          "noteId": "xhs_demo_007",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H2",
+            "H3",
+            "H7",
+            "H8"
+          ],
+          "theme": "话术",
+          "content": "我喜欢7天观察卡这种内容,不像广告。",
+          "user": {
+            "userId": "xhs_comment_user_026",
+            "nickname": "不想踩雷"
+          },
+          "ipLocation": "北京",
+          "likeCount": 89,
+          "subCommentCount": 6,
+          "createdAt": "2026-04-06T10:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_007"
+        },
+        {
+          "commentId": "xhs_demo_c_027",
+          "noteId": "xhs_demo_007",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H2",
+            "H3",
+            "H7",
+            "H1"
+          ],
+          "theme": "痛点",
+          "content": "腹胀的时候孩子会闹,但我又不敢随便换太多产品。",
+          "user": {
+            "userId": "xhs_comment_user_027",
+            "nickname": "带娃观察员"
+          },
+          "ipLocation": "福建",
+          "likeCount": 96,
+          "subCommentCount": 1,
+          "createdAt": "2026-04-07T11:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_007"
+        },
+        {
+          "commentId": "xhs_demo_c_028",
+          "noteId": "xhs_demo_007",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H2",
+            "H3",
+            "H7"
+          ],
+          "theme": "场景",
+          "content": "开学和旅行后最明显,作息一乱肠胃也跟着乱。",
+          "user": {
+            "userId": "xhs_comment_user_028",
+            "nickname": "胃肠敏感星人"
+          },
+          "ipLocation": "湖北",
+          "likeCount": 7,
+          "subCommentCount": 4,
+          "createdAt": "2026-04-08T12:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_007"
+        }
+      ]
+    },
+    {
+      "noteId": "xhs_demo_008",
+      "keyword": "儿童益生菌怎么选",
+      "commentCount": 4,
+      "comments": [
+        {
+          "commentId": "xhs_demo_c_029",
+          "noteId": "xhs_demo_008",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H3",
+            "H5",
+            "H6",
+            "H8"
+          ],
+          "theme": "话术",
+          "content": "我喜欢7天观察卡这种内容,不像广告。",
+          "user": {
+            "userId": "xhs_comment_user_029",
+            "nickname": "囤货前先问"
+          },
+          "ipLocation": "山东",
+          "likeCount": 14,
+          "subCommentCount": 7,
+          "createdAt": "2026-04-09T13:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_008"
+        },
+        {
+          "commentId": "xhs_demo_c_030",
+          "noteId": "xhs_demo_008",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H3",
+            "H5",
+            "H6",
+            "H1"
+          ],
+          "theme": "痛点",
+          "content": "腹胀的时候孩子会闹,但我又不敢随便换太多产品。",
+          "user": {
+            "userId": "xhs_comment_user_030",
+            "nickname": "真实反馈bot"
+          },
+          "ipLocation": "重庆",
+          "likeCount": 21,
+          "subCommentCount": 2,
+          "createdAt": "2026-04-10T14:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_008"
+        },
+        {
+          "commentId": "xhs_demo_c_031",
+          "noteId": "xhs_demo_008",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H3",
+            "H5",
+            "H6",
+            "H2"
+          ],
+          "theme": "场景",
+          "content": "开学和旅行后最明显,作息一乱肠胃也跟着乱。",
+          "user": {
+            "userId": "xhs_comment_user_031",
+            "nickname": "小满妈妈"
+          },
+          "ipLocation": "浙江",
+          "likeCount": 28,
+          "subCommentCount": 5,
+          "createdAt": "2026-04-11T15:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_008"
+        },
+        {
+          "commentId": "xhs_demo_c_032",
+          "noteId": "xhs_demo_008",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H3",
+            "H5",
+            "H6"
+          ],
+          "theme": "决策",
+          "content": "详情页如果有适用人群表格,我会更容易判断。",
+          "user": {
+            "userId": "xhs_comment_user_032",
+            "nickname": "配料表先行"
+          },
+          "ipLocation": "上海",
+          "likeCount": 35,
+          "subCommentCount": 0,
+          "createdAt": "2026-04-12T16:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_008"
+        }
+      ]
+    },
+    {
+      "noteId": "xhs_demo_009",
+      "keyword": "儿童益生菌怎么选",
+      "commentCount": 4,
+      "comments": [
+        {
+          "commentId": "xhs_demo_c_033",
+          "noteId": "xhs_demo_009",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H4",
+            "H6",
+            "H1"
+          ],
+          "theme": "痛点",
+          "content": "腹胀的时候孩子会闹,但我又不敢随便换太多产品。",
+          "user": {
+            "userId": "xhs_comment_user_033",
+            "nickname": "打工人小周"
+          },
+          "ipLocation": "广东",
+          "likeCount": 42,
+          "subCommentCount": 3,
+          "createdAt": "2026-04-13T17:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_009"
+        },
+        {
+          "commentId": "xhs_demo_c_034",
+          "noteId": "xhs_demo_009",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H4",
+            "H6",
+            "H2"
+          ],
+          "theme": "场景",
+          "content": "开学和旅行后最明显,作息一乱肠胃也跟着乱。",
+          "user": {
+            "userId": "xhs_comment_user_034",
+            "nickname": "橙子爸"
+          },
+          "ipLocation": "江苏",
+          "likeCount": 49,
+          "subCommentCount": 6,
+          "createdAt": "2026-04-14T18:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_009"
+        },
+        {
+          "commentId": "xhs_demo_c_035",
+          "noteId": "xhs_demo_009",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H4",
+            "H6",
+            "H3"
+          ],
+          "theme": "决策",
+          "content": "详情页如果有适用人群表格,我会更容易判断。",
+          "user": {
+            "userId": "xhs_comment_user_035",
+            "nickname": "理性下单中"
+          },
+          "ipLocation": "四川",
+          "likeCount": 56,
+          "subCommentCount": 1,
+          "createdAt": "2026-04-15T19:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_009"
+        },
+        {
+          "commentId": "xhs_demo_c_036",
+          "noteId": "xhs_demo_009",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H4",
+            "H6"
+          ],
+          "theme": "反馈",
+          "content": "味道淡孩子能接受,坚持下来比参数更重要。",
+          "user": {
+            "userId": "xhs_comment_user_036",
+            "nickname": "不想踩雷"
+          },
+          "ipLocation": "北京",
+          "likeCount": 63,
+          "subCommentCount": 4,
+          "createdAt": "2026-04-16T08:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_009"
+        }
+      ]
+    },
+    {
+      "noteId": "xhs_demo_010",
+      "keyword": "儿童益生菌怎么选",
+      "commentCount": 4,
+      "comments": [
+        {
+          "commentId": "xhs_demo_c_037",
+          "noteId": "xhs_demo_010",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H3",
+            "H8",
+            "H2"
+          ],
+          "theme": "场景",
+          "content": "开学和旅行后最明显,作息一乱肠胃也跟着乱。",
+          "user": {
+            "userId": "xhs_comment_user_037",
+            "nickname": "带娃观察员"
+          },
+          "ipLocation": "福建",
+          "likeCount": 70,
+          "subCommentCount": 7,
+          "createdAt": "2026-04-17T09:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_010"
+        },
+        {
+          "commentId": "xhs_demo_c_038",
+          "noteId": "xhs_demo_010",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H3",
+            "H8"
+          ],
+          "theme": "决策",
+          "content": "详情页如果有适用人群表格,我会更容易判断。",
+          "user": {
+            "userId": "xhs_comment_user_038",
+            "nickname": "胃肠敏感星人"
+          },
+          "ipLocation": "湖北",
+          "likeCount": 77,
+          "subCommentCount": 2,
+          "createdAt": "2026-04-18T10:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_010"
+        },
+        {
+          "commentId": "xhs_demo_c_039",
+          "noteId": "xhs_demo_010",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H3",
+            "H8",
+            "H4"
+          ],
+          "theme": "反馈",
+          "content": "味道淡孩子能接受,坚持下来比参数更重要。",
+          "user": {
+            "userId": "xhs_comment_user_039",
+            "nickname": "囤货前先问"
+          },
+          "ipLocation": "山东",
+          "likeCount": 84,
+          "subCommentCount": 5,
+          "createdAt": "2026-04-19T11:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_010"
+        },
+        {
+          "commentId": "xhs_demo_c_040",
+          "noteId": "xhs_demo_010",
+          "platform": "xiaohongshu",
+          "keyword": "儿童益生菌怎么选",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H3",
+            "H8",
+            "H5"
+          ],
+          "theme": "竞品",
+          "content": "进口牌子贵但说明详细,国产牌子客服回复快。",
+          "user": {
+            "userId": "xhs_comment_user_040",
+            "nickname": "真实反馈bot"
+          },
+          "ipLocation": "重庆",
+          "likeCount": 91,
+          "subCommentCount": 0,
+          "createdAt": "2026-04-20T12:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_010"
+        }
+      ]
+    },
+    {
+      "noteId": "xhs_demo_011",
+      "keyword": "益生菌腹胀便秘",
+      "commentCount": 4,
+      "comments": [
+        {
+          "commentId": "xhs_demo_c_041",
+          "noteId": "xhs_demo_011",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H1",
+            "H2",
+            "H4",
+            "H3"
+          ],
+          "theme": "决策",
+          "content": "详情页如果有适用人群表格,我会更容易判断。",
+          "user": {
+            "userId": "xhs_comment_user_041",
+            "nickname": "小满妈妈"
+          },
+          "ipLocation": "浙江",
+          "likeCount": 98,
+          "subCommentCount": 3,
+          "createdAt": "2026-04-01T13:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_011"
+        },
+        {
+          "commentId": "xhs_demo_c_042",
+          "noteId": "xhs_demo_011",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H1",
+            "H2",
+            "H4"
+          ],
+          "theme": "反馈",
+          "content": "味道淡孩子能接受,坚持下来比参数更重要。",
+          "user": {
+            "userId": "xhs_comment_user_042",
+            "nickname": "配料表先行"
+          },
+          "ipLocation": "上海",
+          "likeCount": 9,
+          "subCommentCount": 6,
+          "createdAt": "2026-04-02T14:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_011"
+        },
+        {
+          "commentId": "xhs_demo_c_043",
+          "noteId": "xhs_demo_011",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H1",
+            "H2",
+            "H4",
+            "H5"
+          ],
+          "theme": "竞品",
+          "content": "进口牌子贵但说明详细,国产牌子客服回复快。",
+          "user": {
+            "userId": "xhs_comment_user_043",
+            "nickname": "打工人小周"
+          },
+          "ipLocation": "广东",
+          "likeCount": 16,
+          "subCommentCount": 1,
+          "createdAt": "2026-04-03T15:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_011"
+        },
+        {
+          "commentId": "xhs_demo_c_044",
+          "noteId": "xhs_demo_011",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H1",
+            "H2",
+            "H4",
+            "H6"
+          ],
+          "theme": "信任",
+          "content": "过敏原、糖醇、香精这些最好直接标出来。",
+          "user": {
+            "userId": "xhs_comment_user_044",
+            "nickname": "橙子爸"
+          },
+          "ipLocation": "江苏",
+          "likeCount": 23,
+          "subCommentCount": 4,
+          "createdAt": "2026-04-04T16:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_011"
+        }
+      ]
+    },
+    {
+      "noteId": "xhs_demo_012",
+      "keyword": "益生菌腹胀便秘",
+      "commentCount": 4,
+      "comments": [
+        {
+          "commentId": "xhs_demo_c_045",
+          "noteId": "xhs_demo_012",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H1",
+            "H4",
+            "H6"
+          ],
+          "theme": "反馈",
+          "content": "味道淡孩子能接受,坚持下来比参数更重要。",
+          "user": {
+            "userId": "xhs_comment_user_045",
+            "nickname": "理性下单中"
+          },
+          "ipLocation": "四川",
+          "likeCount": 30,
+          "subCommentCount": 7,
+          "createdAt": "2026-04-05T17:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_012"
+        },
+        {
+          "commentId": "xhs_demo_c_046",
+          "noteId": "xhs_demo_012",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H1",
+            "H4",
+            "H6",
+            "H5"
+          ],
+          "theme": "竞品",
+          "content": "进口牌子贵但说明详细,国产牌子客服回复快。",
+          "user": {
+            "userId": "xhs_comment_user_046",
+            "nickname": "不想踩雷"
+          },
+          "ipLocation": "北京",
+          "likeCount": 37,
+          "subCommentCount": 2,
+          "createdAt": "2026-04-06T18:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_012"
+        },
+        {
+          "commentId": "xhs_demo_c_047",
+          "noteId": "xhs_demo_012",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H1",
+            "H4",
+            "H6"
+          ],
+          "theme": "信任",
+          "content": "过敏原、糖醇、香精这些最好直接标出来。",
+          "user": {
+            "userId": "xhs_comment_user_047",
+            "nickname": "带娃观察员"
+          },
+          "ipLocation": "福建",
+          "likeCount": 44,
+          "subCommentCount": 5,
+          "createdAt": "2026-04-07T19:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_012"
+        },
+        {
+          "commentId": "xhs_demo_c_048",
+          "noteId": "xhs_demo_012",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H1",
+            "H4",
+            "H6",
+            "H7"
+          ],
+          "theme": "价格",
+          "content": "一盒够吃一个月最省心,太多规格反而选择困难。",
+          "user": {
+            "userId": "xhs_comment_user_048",
+            "nickname": "胃肠敏感星人"
+          },
+          "ipLocation": "湖北",
+          "likeCount": 51,
+          "subCommentCount": 0,
+          "createdAt": "2026-04-08T08:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_012"
+        }
+      ]
+    },
+    {
+      "noteId": "xhs_demo_013",
+      "keyword": "益生菌腹胀便秘",
+      "commentCount": 4,
+      "comments": [
+        {
+          "commentId": "xhs_demo_c_049",
+          "noteId": "xhs_demo_013",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H2",
+            "H4",
+            "H5"
+          ],
+          "theme": "竞品",
+          "content": "进口牌子贵但说明详细,国产牌子客服回复快。",
+          "user": {
+            "userId": "xhs_comment_user_049",
+            "nickname": "囤货前先问"
+          },
+          "ipLocation": "山东",
+          "likeCount": 58,
+          "subCommentCount": 3,
+          "createdAt": "2026-04-09T09:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_013"
+        },
+        {
+          "commentId": "xhs_demo_c_050",
+          "noteId": "xhs_demo_013",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H2",
+            "H4",
+            "H6"
+          ],
+          "theme": "信任",
+          "content": "过敏原、糖醇、香精这些最好直接标出来。",
+          "user": {
+            "userId": "xhs_comment_user_050",
+            "nickname": "真实反馈bot"
+          },
+          "ipLocation": "重庆",
+          "likeCount": 65,
+          "subCommentCount": 6,
+          "createdAt": "2026-04-10T10:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_013"
+        },
+        {
+          "commentId": "xhs_demo_c_051",
+          "noteId": "xhs_demo_013",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H2",
+            "H4",
+            "H7"
+          ],
+          "theme": "价格",
+          "content": "一盒够吃一个月最省心,太多规格反而选择困难。",
+          "user": {
+            "userId": "xhs_comment_user_051",
+            "nickname": "小满妈妈"
+          },
+          "ipLocation": "浙江",
+          "likeCount": 72,
+          "subCommentCount": 1,
+          "createdAt": "2026-04-11T11:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_013"
+        },
+        {
+          "commentId": "xhs_demo_c_052",
+          "noteId": "xhs_demo_013",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H2",
+            "H4",
+            "H8"
+          ],
+          "theme": "话术",
+          "content": "把活菌数翻译成怎么吃、吃多久、怎么看变化会更有用。",
+          "user": {
+            "userId": "xhs_comment_user_052",
+            "nickname": "配料表先行"
+          },
+          "ipLocation": "上海",
+          "likeCount": 79,
+          "subCommentCount": 4,
+          "createdAt": "2026-04-12T12:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_013"
+        }
+      ]
+    },
+    {
+      "noteId": "xhs_demo_014",
+      "keyword": "益生菌腹胀便秘",
+      "commentCount": 4,
+      "comments": [
+        {
+          "commentId": "xhs_demo_c_053",
+          "noteId": "xhs_demo_014",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H1",
+            "H3",
+            "H4",
+            "H6"
+          ],
+          "theme": "信任",
+          "content": "过敏原、糖醇、香精这些最好直接标出来。",
+          "user": {
+            "userId": "xhs_comment_user_053",
+            "nickname": "打工人小周"
+          },
+          "ipLocation": "广东",
+          "likeCount": 86,
+          "subCommentCount": 7,
+          "createdAt": "2026-04-13T13:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_014"
+        },
+        {
+          "commentId": "xhs_demo_c_054",
+          "noteId": "xhs_demo_014",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H1",
+            "H3",
+            "H4",
+            "H7"
+          ],
+          "theme": "价格",
+          "content": "一盒够吃一个月最省心,太多规格反而选择困难。",
+          "user": {
+            "userId": "xhs_comment_user_054",
+            "nickname": "橙子爸"
+          },
+          "ipLocation": "江苏",
+          "likeCount": 93,
+          "subCommentCount": 2,
+          "createdAt": "2026-04-14T14:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_014"
+        },
+        {
+          "commentId": "xhs_demo_c_055",
+          "noteId": "xhs_demo_014",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H1",
+            "H3",
+            "H4",
+            "H8"
+          ],
+          "theme": "话术",
+          "content": "把活菌数翻译成怎么吃、吃多久、怎么看变化会更有用。",
+          "user": {
+            "userId": "xhs_comment_user_055",
+            "nickname": "理性下单中"
+          },
+          "ipLocation": "四川",
+          "likeCount": 4,
+          "subCommentCount": 5,
+          "createdAt": "2026-04-15T15:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_014"
+        },
+        {
+          "commentId": "xhs_demo_c_056",
+          "noteId": "xhs_demo_014",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H1",
+            "H3",
+            "H4"
+          ],
+          "theme": "痛点",
+          "content": "我们家主要是排便不规律,想知道吃多久能观察到变化。",
+          "user": {
+            "userId": "xhs_comment_user_056",
+            "nickname": "不想踩雷"
+          },
+          "ipLocation": "北京",
+          "likeCount": 11,
+          "subCommentCount": 0,
+          "createdAt": "2026-04-16T16:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_014"
+        }
+      ]
+    },
+    {
+      "noteId": "xhs_demo_015",
+      "keyword": "益生菌腹胀便秘",
+      "commentCount": 4,
+      "comments": [
+        {
+          "commentId": "xhs_demo_c_057",
+          "noteId": "xhs_demo_015",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H2",
+            "H8",
+            "H7"
+          ],
+          "theme": "价格",
+          "content": "一盒够吃一个月最省心,太多规格反而选择困难。",
+          "user": {
+            "userId": "xhs_comment_user_057",
+            "nickname": "带娃观察员"
+          },
+          "ipLocation": "福建",
+          "likeCount": 18,
+          "subCommentCount": 3,
+          "createdAt": "2026-04-17T17:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_015"
+        },
+        {
+          "commentId": "xhs_demo_c_058",
+          "noteId": "xhs_demo_015",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H2",
+            "H8"
+          ],
+          "theme": "话术",
+          "content": "把活菌数翻译成怎么吃、吃多久、怎么看变化会更有用。",
+          "user": {
+            "userId": "xhs_comment_user_058",
+            "nickname": "胃肠敏感星人"
+          },
+          "ipLocation": "湖北",
+          "likeCount": 25,
+          "subCommentCount": 6,
+          "createdAt": "2026-04-18T18:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_015"
+        },
+        {
+          "commentId": "xhs_demo_c_059",
+          "noteId": "xhs_demo_015",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H2",
+            "H8",
+            "H1"
+          ],
+          "theme": "痛点",
+          "content": "我们家主要是排便不规律,想知道吃多久能观察到变化。",
+          "user": {
+            "userId": "xhs_comment_user_059",
+            "nickname": "囤货前先问"
+          },
+          "ipLocation": "山东",
+          "likeCount": 32,
+          "subCommentCount": 1,
+          "createdAt": "2026-04-19T19:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_015"
+        },
+        {
+          "commentId": "xhs_demo_c_060",
+          "noteId": "xhs_demo_015",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H2",
+            "H8"
+          ],
+          "theme": "场景",
+          "content": "老人帮忙带娃时说明要简单,不然冲调水温总搞错。",
+          "user": {
+            "userId": "xhs_comment_user_060",
+            "nickname": "真实反馈bot"
+          },
+          "ipLocation": "重庆",
+          "likeCount": 39,
+          "subCommentCount": 4,
+          "createdAt": "2026-04-20T08:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_015"
+        }
+      ]
+    },
+    {
+      "noteId": "xhs_demo_016",
+      "keyword": "益生菌腹胀便秘",
+      "commentCount": 3,
+      "comments": [
+        {
+          "commentId": "xhs_demo_c_061",
+          "noteId": "xhs_demo_016",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H4",
+            "H6",
+            "H8"
+          ],
+          "theme": "话术",
+          "content": "把活菌数翻译成怎么吃、吃多久、怎么看变化会更有用。",
+          "user": {
+            "userId": "xhs_comment_user_061",
+            "nickname": "小满妈妈"
+          },
+          "ipLocation": "浙江",
+          "likeCount": 46,
+          "subCommentCount": 7,
+          "createdAt": "2026-04-01T09:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_016"
+        },
+        {
+          "commentId": "xhs_demo_c_062",
+          "noteId": "xhs_demo_016",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H4",
+            "H6",
+            "H1"
+          ],
+          "theme": "痛点",
+          "content": "我们家主要是排便不规律,想知道吃多久能观察到变化。",
+          "user": {
+            "userId": "xhs_comment_user_062",
+            "nickname": "配料表先行"
+          },
+          "ipLocation": "上海",
+          "likeCount": 53,
+          "subCommentCount": 2,
+          "createdAt": "2026-04-02T10:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_016"
+        },
+        {
+          "commentId": "xhs_demo_c_063",
+          "noteId": "xhs_demo_016",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H4",
+            "H6",
+            "H2"
+          ],
+          "theme": "场景",
+          "content": "老人帮忙带娃时说明要简单,不然冲调水温总搞错。",
+          "user": {
+            "userId": "xhs_comment_user_063",
+            "nickname": "打工人小周"
+          },
+          "ipLocation": "广东",
+          "likeCount": 60,
+          "subCommentCount": 5,
+          "createdAt": "2026-04-03T11:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_016"
+        }
+      ]
+    },
+    {
+      "noteId": "xhs_demo_017",
+      "keyword": "益生菌腹胀便秘",
+      "commentCount": 3,
+      "comments": [
+        {
+          "commentId": "xhs_demo_c_064",
+          "noteId": "xhs_demo_017",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H1",
+            "H7"
+          ],
+          "theme": "痛点",
+          "content": "我们家主要是排便不规律,想知道吃多久能观察到变化。",
+          "user": {
+            "userId": "xhs_comment_user_064",
+            "nickname": "橙子爸"
+          },
+          "ipLocation": "江苏",
+          "likeCount": 67,
+          "subCommentCount": 0,
+          "createdAt": "2026-04-04T12:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_017"
+        },
+        {
+          "commentId": "xhs_demo_c_065",
+          "noteId": "xhs_demo_017",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H1",
+            "H7",
+            "H2"
+          ],
+          "theme": "场景",
+          "content": "老人帮忙带娃时说明要简单,不然冲调水温总搞错。",
+          "user": {
+            "userId": "xhs_comment_user_065",
+            "nickname": "理性下单中"
+          },
+          "ipLocation": "四川",
+          "likeCount": 74,
+          "subCommentCount": 3,
+          "createdAt": "2026-04-05T13:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_017"
+        },
+        {
+          "commentId": "xhs_demo_c_066",
+          "noteId": "xhs_demo_017",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H1",
+            "H7",
+            "H3"
+          ],
+          "theme": "决策",
+          "content": "我会先看菌株编号和配料表,客服讲不清楚就不下单。",
+          "user": {
+            "userId": "xhs_comment_user_066",
+            "nickname": "不想踩雷"
+          },
+          "ipLocation": "北京",
+          "likeCount": 81,
+          "subCommentCount": 6,
+          "createdAt": "2026-04-06T14:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_017"
+        }
+      ]
+    },
+    {
+      "noteId": "xhs_demo_018",
+      "keyword": "益生菌腹胀便秘",
+      "commentCount": 3,
+      "comments": [
+        {
+          "commentId": "xhs_demo_c_067",
+          "noteId": "xhs_demo_018",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H3",
+            "H4",
+            "H8",
+            "H2"
+          ],
+          "theme": "场景",
+          "content": "老人帮忙带娃时说明要简单,不然冲调水温总搞错。",
+          "user": {
+            "userId": "xhs_comment_user_067",
+            "nickname": "带娃观察员"
+          },
+          "ipLocation": "福建",
+          "likeCount": 88,
+          "subCommentCount": 1,
+          "createdAt": "2026-04-07T15:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_018"
+        },
+        {
+          "commentId": "xhs_demo_c_068",
+          "noteId": "xhs_demo_018",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H3",
+            "H4",
+            "H8"
+          ],
+          "theme": "决策",
+          "content": "我会先看菌株编号和配料表,客服讲不清楚就不下单。",
+          "user": {
+            "userId": "xhs_comment_user_068",
+            "nickname": "胃肠敏感星人"
+          },
+          "ipLocation": "湖北",
+          "likeCount": 95,
+          "subCommentCount": 4,
+          "createdAt": "2026-04-08T16:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_018"
+        },
+        {
+          "commentId": "xhs_demo_c_069",
+          "noteId": "xhs_demo_018",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H3",
+            "H4",
+            "H8"
+          ],
+          "theme": "反馈",
+          "content": "第一天有点胀,客服说减量观察后好多了。",
+          "user": {
+            "userId": "xhs_comment_user_069",
+            "nickname": "囤货前先问"
+          },
+          "ipLocation": "山东",
+          "likeCount": 6,
+          "subCommentCount": 7,
+          "createdAt": "2026-04-09T17:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_018"
+        }
+      ]
+    },
+    {
+      "noteId": "xhs_demo_019",
+      "keyword": "益生菌腹胀便秘",
+      "commentCount": 3,
+      "comments": [
+        {
+          "commentId": "xhs_demo_c_070",
+          "noteId": "xhs_demo_019",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H1",
+            "H5",
+            "H3"
+          ],
+          "theme": "决策",
+          "content": "我会先看菌株编号和配料表,客服讲不清楚就不下单。",
+          "user": {
+            "userId": "xhs_comment_user_070",
+            "nickname": "真实反馈bot"
+          },
+          "ipLocation": "重庆",
+          "likeCount": 13,
+          "subCommentCount": 2,
+          "createdAt": "2026-04-10T18:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_019"
+        },
+        {
+          "commentId": "xhs_demo_c_071",
+          "noteId": "xhs_demo_019",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H1",
+            "H5",
+            "H4"
+          ],
+          "theme": "反馈",
+          "content": "第一天有点胀,客服说减量观察后好多了。",
+          "user": {
+            "userId": "xhs_comment_user_071",
+            "nickname": "小满妈妈"
+          },
+          "ipLocation": "浙江",
+          "likeCount": 20,
+          "subCommentCount": 5,
+          "createdAt": "2026-04-11T19:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_019"
+        },
+        {
+          "commentId": "xhs_demo_c_072",
+          "noteId": "xhs_demo_019",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H1",
+            "H5"
+          ],
+          "theme": "竞品",
+          "content": "同价位我会选能把边界讲清楚的品牌。",
+          "user": {
+            "userId": "xhs_comment_user_072",
+            "nickname": "配料表先行"
+          },
+          "ipLocation": "上海",
+          "likeCount": 27,
+          "subCommentCount": 0,
+          "createdAt": "2026-04-12T08:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_019"
+        }
+      ]
+    },
+    {
+      "noteId": "xhs_demo_020",
+      "keyword": "益生菌腹胀便秘",
+      "commentCount": 3,
+      "comments": [
+        {
+          "commentId": "xhs_demo_c_073",
+          "noteId": "xhs_demo_020",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H2",
+            "H4",
+            "H6"
+          ],
+          "theme": "反馈",
+          "content": "第一天有点胀,客服说减量观察后好多了。",
+          "user": {
+            "userId": "xhs_comment_user_073",
+            "nickname": "打工人小周"
+          },
+          "ipLocation": "广东",
+          "likeCount": 34,
+          "subCommentCount": 3,
+          "createdAt": "2026-04-13T09:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_020"
+        },
+        {
+          "commentId": "xhs_demo_c_074",
+          "noteId": "xhs_demo_020",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H2",
+            "H4",
+            "H6",
+            "H5"
+          ],
+          "theme": "竞品",
+          "content": "同价位我会选能把边界讲清楚的品牌。",
+          "user": {
+            "userId": "xhs_comment_user_074",
+            "nickname": "橙子爸"
+          },
+          "ipLocation": "江苏",
+          "likeCount": 41,
+          "subCommentCount": 6,
+          "createdAt": "2026-04-14T10:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_020"
+        },
+        {
+          "commentId": "xhs_demo_c_075",
+          "noteId": "xhs_demo_020",
+          "platform": "xiaohongshu",
+          "keyword": "益生菌腹胀便秘",
+          "batch": "P0",
+          "hypothesisTags": [
+            "H2",
+            "H4",
+            "H6"
+          ],
+          "theme": "信任",
+          "content": "不要说包治便秘,说清楚辅助和观察周期反而更可信。",
+          "user": {
+            "userId": "xhs_comment_user_075",
+            "nickname": "理性下单中"
+          },
+          "ipLocation": "四川",
+          "likeCount": 48,
+          "subCommentCount": 1,
+          "createdAt": "2026-04-15T11:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_020"
+        }
+      ]
+    },
+    {
+      "noteId": "xhs_demo_021",
+      "keyword": "冻干益生菌测评",
+      "commentCount": 3,
+      "comments": [
+        {
+          "commentId": "xhs_demo_c_076",
+          "noteId": "xhs_demo_021",
+          "platform": "xiaohongshu",
+          "keyword": "冻干益生菌测评",
+          "batch": "P1",
+          "hypothesisTags": [
+            "H3",
+            "H5",
+            "H7"
+          ],
+          "theme": "竞品",
+          "content": "同价位我会选能把边界讲清楚的品牌。",
+          "user": {
+            "userId": "xhs_comment_user_076",
+            "nickname": "不想踩雷"
+          },
+          "ipLocation": "北京",
+          "likeCount": 55,
+          "subCommentCount": 4,
+          "createdAt": "2026-04-16T12:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_021"
+        },
+        {
+          "commentId": "xhs_demo_c_077",
+          "noteId": "xhs_demo_021",
+          "platform": "xiaohongshu",
+          "keyword": "冻干益生菌测评",
+          "batch": "P1",
+          "hypothesisTags": [
+            "H3",
+            "H5",
+            "H7",
+            "H6"
+          ],
+          "theme": "信任",
+          "content": "不要说包治便秘,说清楚辅助和观察周期反而更可信。",
+          "user": {
+            "userId": "xhs_comment_user_077",
+            "nickname": "带娃观察员"
+          },
+          "ipLocation": "福建",
+          "likeCount": 62,
+          "subCommentCount": 7,
+          "createdAt": "2026-04-17T13:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_021"
+        },
+        {
+          "commentId": "xhs_demo_c_078",
+          "noteId": "xhs_demo_021",
+          "platform": "xiaohongshu",
+          "keyword": "冻干益生菌测评",
+          "batch": "P1",
+          "hypothesisTags": [
+            "H3",
+            "H5",
+            "H7"
+          ],
+          "theme": "价格",
+          "content": "每天成本超过8块我会犹豫,除非证据很清楚。",
+          "user": {
+            "userId": "xhs_comment_user_078",
+            "nickname": "胃肠敏感星人"
+          },
+          "ipLocation": "湖北",
+          "likeCount": 69,
+          "subCommentCount": 2,
+          "createdAt": "2026-04-18T14:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_021"
+        }
+      ]
+    },
+    {
+      "noteId": "xhs_demo_022",
+      "keyword": "冻干益生菌测评",
+      "commentCount": 3,
+      "comments": [
+        {
+          "commentId": "xhs_demo_c_079",
+          "noteId": "xhs_demo_022",
+          "platform": "xiaohongshu",
+          "keyword": "冻干益生菌测评",
+          "batch": "P1",
+          "hypothesisTags": [
+            "H3",
+            "H6"
+          ],
+          "theme": "信任",
+          "content": "不要说包治便秘,说清楚辅助和观察周期反而更可信。",
+          "user": {
+            "userId": "xhs_comment_user_079",
+            "nickname": "囤货前先问"
+          },
+          "ipLocation": "山东",
+          "likeCount": 76,
+          "subCommentCount": 5,
+          "createdAt": "2026-04-19T15:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_022"
+        },
+        {
+          "commentId": "xhs_demo_c_080",
+          "noteId": "xhs_demo_022",
+          "platform": "xiaohongshu",
+          "keyword": "冻干益生菌测评",
+          "batch": "P1",
+          "hypothesisTags": [
+            "H3",
+            "H6",
+            "H7"
+          ],
+          "theme": "价格",
+          "content": "每天成本超过8块我会犹豫,除非证据很清楚。",
+          "user": {
+            "userId": "xhs_comment_user_080",
+            "nickname": "真实反馈bot"
+          },
+          "ipLocation": "重庆",
+          "likeCount": 83,
+          "subCommentCount": 0,
+          "createdAt": "2026-04-20T16:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_022"
+        },
+        {
+          "commentId": "xhs_demo_c_081",
+          "noteId": "xhs_demo_022",
+          "platform": "xiaohongshu",
+          "keyword": "冻干益生菌测评",
+          "batch": "P1",
+          "hypothesisTags": [
+            "H3",
+            "H6",
+            "H8"
+          ],
+          "theme": "话术",
+          "content": "详情页少一点专利词,多一点家庭使用说明。",
+          "user": {
+            "userId": "xhs_comment_user_081",
+            "nickname": "小满妈妈"
+          },
+          "ipLocation": "浙江",
+          "likeCount": 90,
+          "subCommentCount": 3,
+          "createdAt": "2026-04-01T17:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_022"
+        }
+      ]
+    },
+    {
+      "noteId": "xhs_demo_023",
+      "keyword": "冻干益生菌测评",
+      "commentCount": 3,
+      "comments": [
+        {
+          "commentId": "xhs_demo_c_082",
+          "noteId": "xhs_demo_023",
+          "platform": "xiaohongshu",
+          "keyword": "冻干益生菌测评",
+          "batch": "P1",
+          "hypothesisTags": [
+            "H5",
+            "H7"
+          ],
+          "theme": "价格",
+          "content": "每天成本超过8块我会犹豫,除非证据很清楚。",
+          "user": {
+            "userId": "xhs_comment_user_082",
+            "nickname": "配料表先行"
+          },
+          "ipLocation": "上海",
+          "likeCount": 97,
+          "subCommentCount": 6,
+          "createdAt": "2026-04-02T18:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_023"
+        },
+        {
+          "commentId": "xhs_demo_c_083",
+          "noteId": "xhs_demo_023",
+          "platform": "xiaohongshu",
+          "keyword": "冻干益生菌测评",
+          "batch": "P1",
+          "hypothesisTags": [
+            "H5",
+            "H7",
+            "H8"
+          ],
+          "theme": "话术",
+          "content": "详情页少一点专利词,多一点家庭使用说明。",
+          "user": {
+            "userId": "xhs_comment_user_083",
+            "nickname": "打工人小周"
+          },
+          "ipLocation": "广东",
+          "likeCount": 8,
+          "subCommentCount": 1,
+          "createdAt": "2026-04-03T19:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_023"
+        },
+        {
+          "commentId": "xhs_demo_c_084",
+          "noteId": "xhs_demo_023",
+          "platform": "xiaohongshu",
+          "keyword": "冻干益生菌测评",
+          "batch": "P1",
+          "hypothesisTags": [
+            "H5",
+            "H7",
+            "H1"
+          ],
+          "theme": "痛点",
+          "content": "最怕买回来孩子不愿意喝,之前有一款味道太甜直接闲置。",
+          "user": {
+            "userId": "xhs_comment_user_084",
+            "nickname": "橙子爸"
+          },
+          "ipLocation": "江苏",
+          "likeCount": 15,
+          "subCommentCount": 4,
+          "createdAt": "2026-04-04T08:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_023"
+        }
+      ]
+    },
+    {
+      "noteId": "xhs_demo_024",
+      "keyword": "冻干益生菌测评",
+      "commentCount": 3,
+      "comments": [
+        {
+          "commentId": "xhs_demo_c_085",
+          "noteId": "xhs_demo_024",
+          "platform": "xiaohongshu",
+          "keyword": "冻干益生菌测评",
+          "batch": "P1",
+          "hypothesisTags": [
+            "H3",
+            "H8"
+          ],
+          "theme": "话术",
+          "content": "详情页少一点专利词,多一点家庭使用说明。",
+          "user": {
+            "userId": "xhs_comment_user_085",
+            "nickname": "理性下单中"
+          },
+          "ipLocation": "四川",
+          "likeCount": 22,
+          "subCommentCount": 7,
+          "createdAt": "2026-04-05T09:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_024"
+        },
+        {
+          "commentId": "xhs_demo_c_086",
+          "noteId": "xhs_demo_024",
+          "platform": "xiaohongshu",
+          "keyword": "冻干益生菌测评",
+          "batch": "P1",
+          "hypothesisTags": [
+            "H3",
+            "H8",
+            "H1"
+          ],
+          "theme": "痛点",
+          "content": "最怕买回来孩子不愿意喝,之前有一款味道太甜直接闲置。",
+          "user": {
+            "userId": "xhs_comment_user_086",
+            "nickname": "不想踩雷"
+          },
+          "ipLocation": "北京",
+          "likeCount": 29,
+          "subCommentCount": 2,
+          "createdAt": "2026-04-06T10:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_024"
+        },
+        {
+          "commentId": "xhs_demo_c_087",
+          "noteId": "xhs_demo_024",
+          "platform": "xiaohongshu",
+          "keyword": "冻干益生菌测评",
+          "batch": "P1",
+          "hypothesisTags": [
+            "H3",
+            "H8",
+            "H2"
+          ],
+          "theme": "场景",
+          "content": "外出吃饭后会备几条,小包装真的比大罐方便。",
+          "user": {
+            "userId": "xhs_comment_user_087",
+            "nickname": "带娃观察员"
+          },
+          "ipLocation": "福建",
+          "likeCount": 36,
+          "subCommentCount": 5,
+          "createdAt": "2026-04-07T11:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_024"
+        }
+      ]
+    },
+    {
+      "noteId": "xhs_demo_025",
+      "keyword": "冻干益生菌测评",
+      "commentCount": 3,
+      "comments": [
+        {
+          "commentId": "xhs_demo_c_088",
+          "noteId": "xhs_demo_025",
+          "platform": "xiaohongshu",
+          "keyword": "冻干益生菌测评",
+          "batch": "P1",
+          "hypothesisTags": [
+            "H4",
+            "H5",
+            "H1"
+          ],
+          "theme": "痛点",
+          "content": "最怕买回来孩子不愿意喝,之前有一款味道太甜直接闲置。",
+          "user": {
+            "userId": "xhs_comment_user_088",
+            "nickname": "胃肠敏感星人"
+          },
+          "ipLocation": "湖北",
+          "likeCount": 43,
+          "subCommentCount": 0,
+          "createdAt": "2026-04-08T12:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_025"
+        },
+        {
+          "commentId": "xhs_demo_c_089",
+          "noteId": "xhs_demo_025",
+          "platform": "xiaohongshu",
+          "keyword": "冻干益生菌测评",
+          "batch": "P1",
+          "hypothesisTags": [
+            "H4",
+            "H5",
+            "H2"
+          ],
+          "theme": "场景",
+          "content": "外出吃饭后会备几条,小包装真的比大罐方便。",
+          "user": {
+            "userId": "xhs_comment_user_089",
+            "nickname": "囤货前先问"
+          },
+          "ipLocation": "山东",
+          "likeCount": 50,
+          "subCommentCount": 3,
+          "createdAt": "2026-04-09T13:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_025"
+        },
+        {
+          "commentId": "xhs_demo_c_090",
+          "noteId": "xhs_demo_025",
+          "platform": "xiaohongshu",
+          "keyword": "冻干益生菌测评",
+          "batch": "P1",
+          "hypothesisTags": [
+            "H4",
+            "H5",
+            "H3"
+          ],
+          "theme": "决策",
+          "content": "独立条装、常温保存、少添加是我下单前最看重的。",
+          "user": {
+            "userId": "xhs_comment_user_090",
+            "nickname": "真实反馈bot"
+          },
+          "ipLocation": "重庆",
+          "likeCount": 57,
+          "subCommentCount": 6,
+          "createdAt": "2026-04-10T14:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_025"
+        }
+      ]
+    },
+    {
+      "noteId": "xhs_demo_026",
+      "keyword": "冻干益生菌测评",
+      "commentCount": 3,
+      "comments": [
+        {
+          "commentId": "xhs_demo_c_091",
+          "noteId": "xhs_demo_026",
+          "platform": "xiaohongshu",
+          "keyword": "冻干益生菌测评",
+          "batch": "P1",
+          "hypothesisTags": [
+            "H2",
+            "H7"
+          ],
+          "theme": "场景",
+          "content": "外出吃饭后会备几条,小包装真的比大罐方便。",
+          "user": {
+            "userId": "xhs_comment_user_091",
+            "nickname": "小满妈妈"
+          },
+          "ipLocation": "浙江",
+          "likeCount": 64,
+          "subCommentCount": 1,
+          "createdAt": "2026-04-11T15:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_026"
+        },
+        {
+          "commentId": "xhs_demo_c_092",
+          "noteId": "xhs_demo_026",
+          "platform": "xiaohongshu",
+          "keyword": "冻干益生菌测评",
+          "batch": "P1",
+          "hypothesisTags": [
+            "H2",
+            "H7",
+            "H3"
+          ],
+          "theme": "决策",
+          "content": "独立条装、常温保存、少添加是我下单前最看重的。",
+          "user": {
+            "userId": "xhs_comment_user_092",
+            "nickname": "配料表先行"
+          },
+          "ipLocation": "上海",
+          "likeCount": 71,
+          "subCommentCount": 4,
+          "createdAt": "2026-04-12T16:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_026"
+        },
+        {
+          "commentId": "xhs_demo_c_093",
+          "noteId": "xhs_demo_026",
+          "platform": "xiaohongshu",
+          "keyword": "冻干益生菌测评",
+          "batch": "P1",
+          "hypothesisTags": [
+            "H2",
+            "H7",
+            "H4"
+          ],
+          "theme": "反馈",
+          "content": "吃了三天没明显变化,但一周后排便时间稳定了一点。",
+          "user": {
+            "userId": "xhs_comment_user_093",
+            "nickname": "打工人小周"
+          },
+          "ipLocation": "广东",
+          "likeCount": 78,
+          "subCommentCount": 7,
+          "createdAt": "2026-04-13T17:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_026"
+        }
+      ]
+    },
+    {
+      "noteId": "xhs_demo_027",
+      "keyword": "冻干益生菌测评",
+      "commentCount": 3,
+      "comments": [
+        {
+          "commentId": "xhs_demo_c_094",
+          "noteId": "xhs_demo_027",
+          "platform": "xiaohongshu",
+          "keyword": "冻干益生菌测评",
+          "batch": "P1",
+          "hypothesisTags": [
+            "H3",
+            "H5",
+            "H6"
+          ],
+          "theme": "决策",
+          "content": "独立条装、常温保存、少添加是我下单前最看重的。",
+          "user": {
+            "userId": "xhs_comment_user_094",
+            "nickname": "橙子爸"
+          },
+          "ipLocation": "江苏",
+          "likeCount": 85,
+          "subCommentCount": 2,
+          "createdAt": "2026-04-14T18:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_027"
+        },
+        {
+          "commentId": "xhs_demo_c_095",
+          "noteId": "xhs_demo_027",
+          "platform": "xiaohongshu",
+          "keyword": "冻干益生菌测评",
+          "batch": "P1",
+          "hypothesisTags": [
+            "H3",
+            "H5",
+            "H6",
+            "H4"
+          ],
+          "theme": "反馈",
+          "content": "吃了三天没明显变化,但一周后排便时间稳定了一点。",
+          "user": {
+            "userId": "xhs_comment_user_095",
+            "nickname": "理性下单中"
+          },
+          "ipLocation": "四川",
+          "likeCount": 92,
+          "subCommentCount": 5,
+          "createdAt": "2026-04-15T19:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_027"
+        },
+        {
+          "commentId": "xhs_demo_c_096",
+          "noteId": "xhs_demo_027",
+          "platform": "xiaohongshu",
+          "keyword": "冻干益生菌测评",
+          "batch": "P1",
+          "hypothesisTags": [
+            "H3",
+            "H5",
+            "H6"
+          ],
+          "theme": "竞品",
+          "content": "之前买的那款结块严重,这次会特别看包装密封。",
+          "user": {
+            "userId": "xhs_comment_user_096",
+            "nickname": "不想踩雷"
+          },
+          "ipLocation": "北京",
+          "likeCount": 3,
+          "subCommentCount": 0,
+          "createdAt": "2026-04-16T08:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_027"
+        }
+      ]
+    },
+    {
+      "noteId": "xhs_demo_028",
+      "keyword": "冻干益生菌测评",
+      "commentCount": 3,
+      "comments": [
+        {
+          "commentId": "xhs_demo_c_097",
+          "noteId": "xhs_demo_028",
+          "platform": "xiaohongshu",
+          "keyword": "冻干益生菌测评",
+          "batch": "P1",
+          "hypothesisTags": [
+            "H7",
+            "H8",
+            "H4"
+          ],
+          "theme": "反馈",
+          "content": "吃了三天没明显变化,但一周后排便时间稳定了一点。",
+          "user": {
+            "userId": "xhs_comment_user_097",
+            "nickname": "带娃观察员"
+          },
+          "ipLocation": "福建",
+          "likeCount": 10,
+          "subCommentCount": 3,
+          "createdAt": "2026-04-17T09:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_028"
+        },
+        {
+          "commentId": "xhs_demo_c_098",
+          "noteId": "xhs_demo_028",
+          "platform": "xiaohongshu",
+          "keyword": "冻干益生菌测评",
+          "batch": "P1",
+          "hypothesisTags": [
+            "H7",
+            "H8",
+            "H5"
+          ],
+          "theme": "竞品",
+          "content": "之前买的那款结块严重,这次会特别看包装密封。",
+          "user": {
+            "userId": "xhs_comment_user_098",
+            "nickname": "胃肠敏感星人"
+          },
+          "ipLocation": "湖北",
+          "likeCount": 17,
+          "subCommentCount": 6,
+          "createdAt": "2026-04-18T10:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_028"
+        },
+        {
+          "commentId": "xhs_demo_c_099",
+          "noteId": "xhs_demo_028",
+          "platform": "xiaohongshu",
+          "keyword": "冻干益生菌测评",
+          "batch": "P1",
+          "hypothesisTags": [
+            "H7",
+            "H8",
+            "H6"
+          ],
+          "theme": "信任",
+          "content": "能不能写清楚不适合哪些人?这比夸效果更重要。",
+          "user": {
+            "userId": "xhs_comment_user_099",
+            "nickname": "囤货前先问"
+          },
+          "ipLocation": "山东",
+          "likeCount": 24,
+          "subCommentCount": 1,
+          "createdAt": "2026-04-19T11:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_028"
+        }
+      ]
+    },
+    {
+      "noteId": "xhs_demo_029",
+      "keyword": "冻干益生菌测评",
+      "commentCount": 3,
+      "comments": [
+        {
+          "commentId": "xhs_demo_c_100",
+          "noteId": "xhs_demo_029",
+          "platform": "xiaohongshu",
+          "keyword": "冻干益生菌测评",
+          "batch": "P1",
+          "hypothesisTags": [
+            "H4",
+            "H6",
+            "H5"
+          ],
+          "theme": "竞品",
+          "content": "之前买的那款结块严重,这次会特别看包装密封。",
+          "user": {
+            "userId": "xhs_comment_user_100",
+            "nickname": "真实反馈bot"
+          },
+          "ipLocation": "重庆",
+          "likeCount": 31,
+          "subCommentCount": 4,
+          "createdAt": "2026-04-20T12:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_029"
+        },
+        {
+          "commentId": "xhs_demo_c_101",
+          "noteId": "xhs_demo_029",
+          "platform": "xiaohongshu",
+          "keyword": "冻干益生菌测评",
+          "batch": "P1",
+          "hypothesisTags": [
+            "H4",
+            "H6"
+          ],
+          "theme": "信任",
+          "content": "能不能写清楚不适合哪些人?这比夸效果更重要。",
+          "user": {
+            "userId": "xhs_comment_user_101",
+            "nickname": "小满妈妈"
+          },
+          "ipLocation": "浙江",
+          "likeCount": 38,
+          "subCommentCount": 7,
+          "createdAt": "2026-04-01T13:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_029"
+        },
+        {
+          "commentId": "xhs_demo_c_102",
+          "noteId": "xhs_demo_029",
+          "platform": "xiaohongshu",
+          "keyword": "冻干益生菌测评",
+          "batch": "P1",
+          "hypothesisTags": [
+            "H4",
+            "H6",
+            "H7"
+          ],
+          "theme": "价格",
+          "content": "希望先有7天试用装,有效果再买月装压力小。",
+          "user": {
+            "userId": "xhs_comment_user_102",
+            "nickname": "配料表先行"
+          },
+          "ipLocation": "上海",
+          "likeCount": 45,
+          "subCommentCount": 2,
+          "createdAt": "2026-04-02T14:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_029"
+        }
+      ]
+    },
+    {
+      "noteId": "xhs_demo_030",
+      "keyword": "冻干益生菌测评",
+      "commentCount": 3,
+      "comments": [
+        {
+          "commentId": "xhs_demo_c_103",
+          "noteId": "xhs_demo_030",
+          "platform": "xiaohongshu",
+          "keyword": "冻干益生菌测评",
+          "batch": "P1",
+          "hypothesisTags": [
+            "H2",
+            "H3",
+            "H8",
+            "H6"
+          ],
+          "theme": "信任",
+          "content": "能不能写清楚不适合哪些人?这比夸效果更重要。",
+          "user": {
+            "userId": "xhs_comment_user_103",
+            "nickname": "打工人小周"
+          },
+          "ipLocation": "广东",
+          "likeCount": 52,
+          "subCommentCount": 5,
+          "createdAt": "2026-04-03T15:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_030"
+        },
+        {
+          "commentId": "xhs_demo_c_104",
+          "noteId": "xhs_demo_030",
+          "platform": "xiaohongshu",
+          "keyword": "冻干益生菌测评",
+          "batch": "P1",
+          "hypothesisTags": [
+            "H2",
+            "H3",
+            "H8",
+            "H7"
+          ],
+          "theme": "价格",
+          "content": "希望先有7天试用装,有效果再买月装压力小。",
+          "user": {
+            "userId": "xhs_comment_user_104",
+            "nickname": "橙子爸"
+          },
+          "ipLocation": "江苏",
+          "likeCount": 59,
+          "subCommentCount": 0,
+          "createdAt": "2026-04-04T16:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_030"
+        },
+        {
+          "commentId": "xhs_demo_c_105",
+          "noteId": "xhs_demo_030",
+          "platform": "xiaohongshu",
+          "keyword": "冻干益生菌测评",
+          "batch": "P1",
+          "hypothesisTags": [
+            "H2",
+            "H3",
+            "H8"
+          ],
+          "theme": "话术",
+          "content": "我喜欢7天观察卡这种内容,不像广告。",
+          "user": {
+            "userId": "xhs_comment_user_105",
+            "nickname": "理性下单中"
+          },
+          "ipLocation": "四川",
+          "likeCount": 66,
+          "subCommentCount": 3,
+          "createdAt": "2026-04-05T17:20:00+08:00",
+          "sourceUrl": "https://example.com/xhs/demo/xhs_demo_030"
+        }
+      ]
+    }
+  ]
+}

+ 465 - 0
demo/xiaohongshu/raw-notes.json

@@ -0,0 +1,465 @@
+{
+  "metadata": {
+    "dataset": "xiaohongshu-course-demo",
+    "topic": "冻干益生菌 VOC 2小时课",
+    "product": "青禾轻养冻干益生菌(虚拟产品)",
+    "platform": "xiaohongshu",
+    "dataType": "synthetic_course_sample",
+    "generatedAt": "2026-04-29",
+    "noteCount": 30,
+    "keywords": ["儿童益生菌怎么选", "益生菌腹胀便秘", "冻干益生菌测评"],
+    "disclaimer": "本数据为课程合成样例,仅用于离线教学、字段演示和报告练习,不代表真实小红书抓取结果。"
+  },
+  "notes": [
+    {
+      "noteId": "xhs_demo_001",
+      "platform": "xiaohongshu",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": ["H1", "H3", "H6"],
+      "type": "normal",
+      "title": "给娃选益生菌我现在只看这4点",
+      "desc": "踩过甜味太重、吃完胀气、冲不开的坑后,我现在先看菌株编号、配料干净、独立小条和孩子愿不愿意坚持吃。",
+      "author": { "userId": "xhs_user_001", "nickname": "松松妈的养娃笔记" },
+      "ipLocation": "浙江",
+      "publishedAt": "2026-03-04T09:30:00+08:00",
+      "metrics": { "likeCount": 842, "commentCount": 46, "collectCount": 388, "shareCount": 31 },
+      "sourceUrl": "https://example.com/xhs/demo/xhs_demo_001"
+    },
+    {
+      "noteId": "xhs_demo_002",
+      "platform": "xiaohongshu",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": ["H3", "H6"],
+      "type": "normal",
+      "title": "儿童益生菌不是活菌数越高越好",
+      "desc": "看了好多测评,发现家长真正纠结的是菌株适不适合、有没有糖醇、需不需要冷藏,以及售后能不能解释清楚。",
+      "author": { "userId": "xhs_user_002", "nickname": "营养师梨梨" },
+      "ipLocation": "上海",
+      "publishedAt": "2026-03-05T12:10:00+08:00",
+      "metrics": { "likeCount": 1290, "commentCount": 63, "collectCount": 701, "shareCount": 58 },
+      "sourceUrl": "https://example.com/xhs/demo/xhs_demo_002"
+    },
+    {
+      "noteId": "xhs_demo_003",
+      "platform": "xiaohongshu",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": ["H1", "H2", "H4"],
+      "type": "video",
+      "title": "孩子换季肚子闹情绪,我怎么做记录",
+      "desc": "我会记录饮食、排便、睡眠和吃益生菌后的变化。不是神药,但能不能稳定,家长其实一周就有感觉。",
+      "author": { "userId": "xhs_user_003", "nickname": "一米阳光育儿" },
+      "ipLocation": "江苏",
+      "publishedAt": "2026-03-06T20:25:00+08:00",
+      "metrics": { "likeCount": 476, "commentCount": 35, "collectCount": 190, "shareCount": 21 },
+      "sourceUrl": "https://example.com/xhs/demo/xhs_demo_003"
+    },
+    {
+      "noteId": "xhs_demo_004",
+      "platform": "xiaohongshu",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": ["H3", "H7"],
+      "type": "normal",
+      "title": "一条装真的比大罐方便太多",
+      "desc": "早上送幼儿园前一撕一倒,不用勺子也不怕受潮。价格贵一点可以接受,但希望一盒至少够吃一个月。",
+      "author": { "userId": "xhs_user_004", "nickname": "阿元不熬夜" },
+      "ipLocation": "广东",
+      "publishedAt": "2026-03-07T08:15:00+08:00",
+      "metrics": { "likeCount": 365, "commentCount": 28, "collectCount": 142, "shareCount": 16 },
+      "sourceUrl": "https://example.com/xhs/demo/xhs_demo_004"
+    },
+    {
+      "noteId": "xhs_demo_005",
+      "platform": "xiaohongshu",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": ["H6", "H8"],
+      "type": "normal",
+      "title": "看到医生同款我会多停留几秒",
+      "desc": "不是盲信医生背书,而是希望品牌把适用人群、不能替代治疗、怎么吃写清楚。越夸张我越不敢买。",
+      "author": { "userId": "xhs_user_005", "nickname": "家有小柚子" },
+      "ipLocation": "北京",
+      "publishedAt": "2026-03-08T11:45:00+08:00",
+      "metrics": { "likeCount": 718, "commentCount": 41, "collectCount": 319, "shareCount": 27 },
+      "sourceUrl": "https://example.com/xhs/demo/xhs_demo_005"
+    },
+    {
+      "noteId": "xhs_demo_006",
+      "platform": "xiaohongshu",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": ["H1", "H4", "H8"],
+      "type": "normal",
+      "title": "别再用酸奶味掩盖配方问题了",
+      "desc": "孩子爱喝当然重要,但家长评论里更在意有没有蔗糖、香精、过敏原提示。好喝只是入门,不是核心卖点。",
+      "author": { "userId": "xhs_user_006", "nickname": "小敏配料表" },
+      "ipLocation": "四川",
+      "publishedAt": "2026-03-09T18:05:00+08:00",
+      "metrics": { "likeCount": 932, "commentCount": 52, "collectCount": 447, "shareCount": 39 },
+      "sourceUrl": "https://example.com/xhs/demo/xhs_demo_006"
+    },
+    {
+      "noteId": "xhs_demo_007",
+      "platform": "xiaohongshu",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": ["H2", "H3", "H7"],
+      "type": "video",
+      "title": "幼儿园开学后我家常备这类小条",
+      "desc": "开学、外出、吃火锅后是高频场景。小包装方便带,但最好能标注水温和冲调方式,老人也看得懂。",
+      "author": { "userId": "xhs_user_007", "nickname": "橙子妈在杭州" },
+      "ipLocation": "浙江",
+      "publishedAt": "2026-03-10T19:40:00+08:00",
+      "metrics": { "likeCount": 521, "commentCount": 37, "collectCount": 226, "shareCount": 24 },
+      "sourceUrl": "https://example.com/xhs/demo/xhs_demo_007"
+    },
+    {
+      "noteId": "xhs_demo_008",
+      "platform": "xiaohongshu",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": ["H3", "H5", "H6"],
+      "type": "normal",
+      "title": "进口牌子和国产牌子我怎么取舍",
+      "desc": "进口品牌让我觉得研究多,国产品牌胜在客服解释和发货快。最后还是看菌株证据、配料和孩子接受度。",
+      "author": { "userId": "xhs_user_008", "nickname": "认真买东西的桐桐妈" },
+      "ipLocation": "山东",
+      "publishedAt": "2026-03-11T10:20:00+08:00",
+      "metrics": { "likeCount": 684, "commentCount": 44, "collectCount": 295, "shareCount": 19 },
+      "sourceUrl": "https://example.com/xhs/demo/xhs_demo_008"
+    },
+    {
+      "noteId": "xhs_demo_009",
+      "platform": "xiaohongshu",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": ["H4", "H6"],
+      "type": "normal",
+      "title": "吃了没感觉是不是没用",
+      "desc": "很多家长焦虑三天没变化。我的经验是先看饮食和作息,益生菌最多是辅助,品牌也别暗示立竿见影。",
+      "author": { "userId": "xhs_user_009", "nickname": "慢慢养娃" },
+      "ipLocation": "湖北",
+      "publishedAt": "2026-03-12T14:55:00+08:00",
+      "metrics": { "likeCount": 413, "commentCount": 31, "collectCount": 168, "shareCount": 13 },
+      "sourceUrl": "https://example.com/xhs/demo/xhs_demo_009"
+    },
+    {
+      "noteId": "xhs_demo_010",
+      "platform": "xiaohongshu",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": ["H3", "H8"],
+      "type": "normal",
+      "title": "我最想在详情页看到一张选择表",
+      "desc": "不同年龄、不同肠胃状态、怎么冲、吃多久、什么时候停,如果能做成一张表,比堆概念更能打消疑虑。",
+      "author": { "userId": "xhs_user_010", "nickname": "表格控妈妈" },
+      "ipLocation": "福建",
+      "publishedAt": "2026-03-13T21:10:00+08:00",
+      "metrics": { "likeCount": 755, "commentCount": 49, "collectCount": 510, "shareCount": 42 },
+      "sourceUrl": "https://example.com/xhs/demo/xhs_demo_010"
+    },
+    {
+      "noteId": "xhs_demo_011",
+      "platform": "xiaohongshu",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": ["H1", "H2", "H4"],
+      "type": "normal",
+      "title": "便秘娃吃益生菌前我先做了这件事",
+      "desc": "先记录排便频率和饮水量,再看吃了之后有没有规律一些。只说解决便秘太绝对,家长更需要可观察指标。",
+      "author": { "userId": "xhs_user_011", "nickname": "便便观察日记" },
+      "ipLocation": "重庆",
+      "publishedAt": "2026-03-14T09:05:00+08:00",
+      "metrics": { "likeCount": 1180, "commentCount": 72, "collectCount": 633, "shareCount": 66 },
+      "sourceUrl": "https://example.com/xhs/demo/xhs_demo_011"
+    },
+    {
+      "noteId": "xhs_demo_012",
+      "platform": "xiaohongshu",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": ["H1", "H4", "H6"],
+      "type": "normal",
+      "title": "第一次吃反而胀气,我差点退货",
+      "desc": "客服解释说先减量观察,但详情页完全没写可能的适应期。这个信息如果提前说清楚,我就不会那么慌。",
+      "author": { "userId": "xhs_user_012", "nickname": "豆豆妈吐槽箱" },
+      "ipLocation": "河南",
+      "publishedAt": "2026-03-14T22:10:00+08:00",
+      "metrics": { "likeCount": 624, "commentCount": 58, "collectCount": 214, "shareCount": 18 },
+      "sourceUrl": "https://example.com/xhs/demo/xhs_demo_012"
+    },
+    {
+      "noteId": "xhs_demo_013",
+      "platform": "xiaohongshu",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": ["H2", "H4"],
+      "type": "video",
+      "title": "出差回来肠胃乱了两周",
+      "desc": "成人也会搜益生菌。外卖、熬夜、旅行后腹胀是高频场景,大家想要的是轻负担、好携带、别太甜。",
+      "author": { "userId": "xhs_user_013", "nickname": "打工人胃肠自救" },
+      "ipLocation": "上海",
+      "publishedAt": "2026-03-15T13:35:00+08:00",
+      "metrics": { "likeCount": 903, "commentCount": 61, "collectCount": 371, "shareCount": 46 },
+      "sourceUrl": "https://example.com/xhs/demo/xhs_demo_013"
+    },
+    {
+      "noteId": "xhs_demo_014",
+      "platform": "xiaohongshu",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": ["H1", "H3", "H4"],
+      "type": "normal",
+      "title": "我不想再买一堆没反馈的保健品",
+      "desc": "评论区最常问:多久有效、没效果怎么办、能不能和酸奶一起、孩子不爱喝怎么办。售后说明比硬广更重要。",
+      "author": { "userId": "xhs_user_014", "nickname": "买前先看差评" },
+      "ipLocation": "湖南",
+      "publishedAt": "2026-03-16T16:20:00+08:00",
+      "metrics": { "likeCount": 552, "commentCount": 43, "collectCount": 202, "shareCount": 17 },
+      "sourceUrl": "https://example.com/xhs/demo/xhs_demo_014"
+    },
+    {
+      "noteId": "xhs_demo_015",
+      "platform": "xiaohongshu",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": ["H2", "H8"],
+      "type": "normal",
+      "title": "饭局后肚子鼓鼓的,别只怪益生菌",
+      "desc": "真实使用场景常常伴随油腻饮食、作息乱和压力。话术如果能承认边界,反而更可信。",
+      "author": { "userId": "xhs_user_015", "nickname": "不装专家的生活记录" },
+      "ipLocation": "广东",
+      "publishedAt": "2026-03-17T23:05:00+08:00",
+      "metrics": { "likeCount": 338, "commentCount": 27, "collectCount": 119, "shareCount": 12 },
+      "sourceUrl": "https://example.com/xhs/demo/xhs_demo_015"
+    },
+    {
+      "noteId": "xhs_demo_016",
+      "platform": "xiaohongshu",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": ["H4", "H6"],
+      "type": "normal",
+      "title": "我更相信评论里的连续记录",
+      "desc": "一天一条的排便记录、腹胀感打分,比一句用了很好更有说服力。品牌可以引导用户做观察卡。",
+      "author": { "userId": "xhs_user_016", "nickname": "认真做复盘" },
+      "ipLocation": "陕西",
+      "publishedAt": "2026-03-18T07:45:00+08:00",
+      "metrics": { "likeCount": 487, "commentCount": 34, "collectCount": 265, "shareCount": 29 },
+      "sourceUrl": "https://example.com/xhs/demo/xhs_demo_016"
+    },
+    {
+      "noteId": "xhs_demo_017",
+      "platform": "xiaohongshu",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": ["H1", "H7"],
+      "type": "normal",
+      "title": "便秘焦虑让我愿意买小包装试用",
+      "desc": "大盒太贵怕没用,小盒7天体验装更友好。如果有效再复购月装,这个路径对新客压力小。",
+      "author": { "userId": "xhs_user_017", "nickname": "先买小样再说" },
+      "ipLocation": "天津",
+      "publishedAt": "2026-03-18T20:50:00+08:00",
+      "metrics": { "likeCount": 431, "commentCount": 39, "collectCount": 174, "shareCount": 15 },
+      "sourceUrl": "https://example.com/xhs/demo/xhs_demo_017"
+    },
+    {
+      "noteId": "xhs_demo_018",
+      "platform": "xiaohongshu",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": ["H3", "H4", "H8"],
+      "type": "video",
+      "title": "益生菌详情页别再只堆专利词",
+      "desc": "用户看不懂专利词,但看得懂:适合谁、不适合谁、怎么吃、预期多久观察、什么情况停用。",
+      "author": { "userId": "xhs_user_018", "nickname": "详情页改造师" },
+      "ipLocation": "北京",
+      "publishedAt": "2026-03-19T15:30:00+08:00",
+      "metrics": { "likeCount": 861, "commentCount": 55, "collectCount": 402, "shareCount": 51 },
+      "sourceUrl": "https://example.com/xhs/demo/xhs_demo_018"
+    },
+    {
+      "noteId": "xhs_demo_019",
+      "platform": "xiaohongshu",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": ["H1", "H5"],
+      "type": "normal",
+      "title": "换了三款益生菌后我才明白自己要什么",
+      "desc": "有的太甜,有的要冷藏,有的吃了没变化。最后留下的是冲调方便、味道淡、客服敢说适用边界的。",
+      "author": { "userId": "xhs_user_019", "nickname": "真实换购记录" },
+      "ipLocation": "安徽",
+      "publishedAt": "2026-03-20T12:05:00+08:00",
+      "metrics": { "likeCount": 692, "commentCount": 48, "collectCount": 286, "shareCount": 22 },
+      "sourceUrl": "https://example.com/xhs/demo/xhs_demo_019"
+    },
+    {
+      "noteId": "xhs_demo_020",
+      "platform": "xiaohongshu",
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "hypothesisTags": ["H2", "H4", "H6"],
+      "type": "normal",
+      "title": "老人也在问益生菌,但说明太年轻化",
+      "desc": "家里老人便秘会问能不能吃、怎么吃、会不会依赖。品牌如果只讲儿童和年轻女性,会漏掉家庭购买者。",
+      "author": { "userId": "xhs_user_020", "nickname": "给爸妈做功课" },
+      "ipLocation": "辽宁",
+      "publishedAt": "2026-03-21T09:40:00+08:00",
+      "metrics": { "likeCount": 377, "commentCount": 33, "collectCount": 151, "shareCount": 20 },
+      "sourceUrl": "https://example.com/xhs/demo/xhs_demo_020"
+    },
+    {
+      "noteId": "xhs_demo_021",
+      "platform": "xiaohongshu",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": ["H3", "H5", "H7"],
+      "type": "normal",
+      "title": "8款冻干益生菌横评:我最在意这三项",
+      "desc": "独立包装、菌株说明、口味清淡是高频加分项。冷链不是人人需要,但保存方式必须说清楚。",
+      "author": { "userId": "xhs_user_021", "nickname": "小鹿测评实验室" },
+      "ipLocation": "上海",
+      "publishedAt": "2026-03-22T11:00:00+08:00",
+      "metrics": { "likeCount": 2140, "commentCount": 118, "collectCount": 1320, "shareCount": 96 },
+      "sourceUrl": "https://example.com/xhs/demo/xhs_demo_021"
+    },
+    {
+      "noteId": "xhs_demo_022",
+      "platform": "xiaohongshu",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": ["H3", "H6"],
+      "type": "normal",
+      "title": "配料表干净比营销词更有用",
+      "desc": "我会直接翻配料表:有没有蔗糖、香精、麦芽糊精、过敏原提示。讲得越明白,收藏率越高。",
+      "author": { "userId": "xhs_user_022", "nickname": "配料表小侦探" },
+      "ipLocation": "四川",
+      "publishedAt": "2026-03-23T08:50:00+08:00",
+      "metrics": { "likeCount": 963, "commentCount": 54, "collectCount": 609, "shareCount": 33 },
+      "sourceUrl": "https://example.com/xhs/demo/xhs_demo_022"
+    },
+    {
+      "noteId": "xhs_demo_023",
+      "platform": "xiaohongshu",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": ["H5", "H7"],
+      "type": "video",
+      "title": "百元内和两百多的冻干益生菌差在哪",
+      "desc": "贵的不一定最好,但便宜款经常输在说明不清、客服弱、包装容易受潮。价格要和场景组合讲。",
+      "author": { "userId": "xhs_user_023", "nickname": "理性消费阿茶" },
+      "ipLocation": "福建",
+      "publishedAt": "2026-03-24T19:15:00+08:00",
+      "metrics": { "likeCount": 1502, "commentCount": 83, "collectCount": 770, "shareCount": 61 },
+      "sourceUrl": "https://example.com/xhs/demo/xhs_demo_023"
+    },
+    {
+      "noteId": "xhs_demo_024",
+      "platform": "xiaohongshu",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": ["H3", "H8"],
+      "type": "normal",
+      "title": "好的测评会把不适合人群写出来",
+      "desc": "只说全家都能吃很不可信。儿童、孕期、老人、过敏体质这些边界越清楚,用户越敢转发给家人。",
+      "author": { "userId": "xhs_user_024", "nickname": "不夸张测评" },
+      "ipLocation": "江苏",
+      "publishedAt": "2026-03-25T10:30:00+08:00",
+      "metrics": { "likeCount": 803, "commentCount": 47, "collectCount": 421, "shareCount": 36 },
+      "sourceUrl": "https://example.com/xhs/demo/xhs_demo_024"
+    },
+    {
+      "noteId": "xhs_demo_025",
+      "platform": "xiaohongshu",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": ["H4", "H5"],
+      "type": "normal",
+      "title": "我会先看差评再看种草",
+      "desc": "差评集中在没效果、太甜、结块、客服敷衍。能正面回应这些点的品牌,反而更容易建立信任。",
+      "author": { "userId": "xhs_user_025", "nickname": "差评先行者" },
+      "ipLocation": "山东",
+      "publishedAt": "2026-03-26T14:10:00+08:00",
+      "metrics": { "likeCount": 612, "commentCount": 59, "collectCount": 260, "shareCount": 24 },
+      "sourceUrl": "https://example.com/xhs/demo/xhs_demo_025"
+    },
+    {
+      "noteId": "xhs_demo_026",
+      "platform": "xiaohongshu",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": ["H2", "H7"],
+      "type": "normal",
+      "title": "旅行装益生菌是我没想到的场景",
+      "desc": "评论区很多人说出差、露营、亲子游会备几条。小盒装、常温保存、随身包,是可以单独做的 SKU。",
+      "author": { "userId": "xhs_user_026", "nickname": "周末出逃计划" },
+      "ipLocation": "云南",
+      "publishedAt": "2026-03-27T17:25:00+08:00",
+      "metrics": { "likeCount": 721, "commentCount": 51, "collectCount": 344, "shareCount": 29 },
+      "sourceUrl": "https://example.com/xhs/demo/xhs_demo_026"
+    },
+    {
+      "noteId": "xhs_demo_027",
+      "platform": "xiaohongshu",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": ["H3", "H5", "H6"],
+      "type": "video",
+      "title": "客服能不能解释菌株,真的影响下单",
+      "desc": "我问了几家客服,能讲清适用人群、保存、冲调和观察周期的,明显更让人安心。",
+      "author": { "userId": "xhs_user_027", "nickname": "客服问到崩溃" },
+      "ipLocation": "广东",
+      "publishedAt": "2026-03-28T12:45:00+08:00",
+      "metrics": { "likeCount": 1086, "commentCount": 73, "collectCount": 518, "shareCount": 54 },
+      "sourceUrl": "https://example.com/xhs/demo/xhs_demo_027"
+    },
+    {
+      "noteId": "xhs_demo_028",
+      "platform": "xiaohongshu",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": ["H7", "H8"],
+      "type": "normal",
+      "title": "别再只写每袋多少亿活菌了",
+      "desc": "用户更想知道一盒能吃多久、每天成本多少、什么时候适合吃、和其他产品怎么搭配。数字要翻译成生活语言。",
+      "author": { "userId": "xhs_user_028", "nickname": "把参数说人话" },
+      "ipLocation": "湖北",
+      "publishedAt": "2026-03-29T09:55:00+08:00",
+      "metrics": { "likeCount": 845, "commentCount": 66, "collectCount": 487, "shareCount": 41 },
+      "sourceUrl": "https://example.com/xhs/demo/xhs_demo_028"
+    },
+    {
+      "noteId": "xhs_demo_029",
+      "platform": "xiaohongshu",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": ["H4", "H6"],
+      "type": "normal",
+      "title": "结块一次就会让我不想复购",
+      "desc": "冻干粉最怕受潮结块。包装如果能展示密封测试、储存提醒和异常售后,能减少很多差评。",
+      "author": { "userId": "xhs_user_029", "nickname": "包装细节控" },
+      "ipLocation": "江西",
+      "publishedAt": "2026-03-30T18:35:00+08:00",
+      "metrics": { "likeCount": 534, "commentCount": 42, "collectCount": 238, "shareCount": 18 },
+      "sourceUrl": "https://example.com/xhs/demo/xhs_demo_029"
+    },
+    {
+      "noteId": "xhs_demo_030",
+      "platform": "xiaohongshu",
+      "keyword": "冻干益生菌测评",
+      "batch": "P1",
+      "hypothesisTags": ["H2", "H3", "H8"],
+      "type": "normal",
+      "title": "益生菌内容最值得做的是观察陪伴",
+      "desc": "比起一次性种草,我更愿意看7天记录、饮食搭配、冲调提醒和真实反馈。内容要像陪伴,不要像广告。",
+      "author": { "userId": "xhs_user_030", "nickname": "陪伴式种草" },
+      "ipLocation": "广西",
+      "publishedAt": "2026-03-31T20:20:00+08:00",
+      "metrics": { "likeCount": 996, "commentCount": 69, "collectCount": 542, "shareCount": 48 },
+      "sourceUrl": "https://example.com/xhs/demo/xhs_demo_030"
+    }
+  ]
+}

+ 1 - 4
dist/download-urls.json

@@ -1,6 +1,3 @@
 {
-  "voc-core": "https://repos.fmode.cn/x/openclaw-skills/packages/voc-core.zip",
-  "social-media": "https://repos.fmode.cn/x/openclaw-skills/packages/social-media.zip",
-  "workshop": "https://repos.fmode.cn/x/openclaw-skills/packages/workshop.zip",
-  "openclaw-all": "https://repos.fmode.cn/x/openclaw-skills/packages/openclaw-all.zip"
+  "xiaohongshu-platform": "https://repos.fmode.cn/x/openclaw-skills/packages/xiaohongshu-platform.zip"
 }

+ 91 - 3
dist/install.js

@@ -25,6 +25,7 @@ const os = require('os');
 // ============================================
 const VERSION = '1.0.0';
 const SKILLS_SUBDIR = 'skills'; // zip 包内的技能目录名
+const TOOLS_SUBDIR = 'tools';
 
 // ============================================
 // 参数解析
@@ -76,9 +77,20 @@ function parseArgs() {
 // ============================================
 // 工具函数
 // ============================================
+function getOpenClawDir() {
+    return path.join(os.homedir(), '.openclaw');
+}
+
 function getOpenClawSkillsDir() {
-    const home = os.homedir();
-    return path.join(home, '.openclaw', 'skills');
+    return path.join(getOpenClawDir(), 'skills');
+}
+
+function getOpenClawToolsDir() {
+    return path.join(getOpenClawDir(), 'tools');
+}
+
+function getOpenClawWorkspaceToolsDir() {
+    return path.join(getOpenClawDir(), 'workspace', 'scripts', 'tools');
 }
 
 function ensureDir(dir) {
@@ -175,6 +187,10 @@ Options:
   --dry-run           Preview what would be installed
   --help, -h          Show this help
 
+Tool installation:
+  tools/* is installed to ~/.openclaw/tools
+  tools/* is mirrored to ~/.openclaw/workspace/scripts/tools
+
 Examples:
   node install.js                               # Install all skills
   node install.js --list                         # List skills
@@ -200,6 +216,73 @@ function listSkills(skills) {
     console.log(`\n  Total: ${skills.length} skills, ${totalFiles} files, ${formatSize(totalSize)}\n`);
 }
 
+function discoverFilesRecursive(sourceDir, baseDir = sourceDir) {
+    if (!fs.existsSync(sourceDir)) return [];
+    const files = [];
+    for (const entry of fs.readdirSync(sourceDir, { withFileTypes: true })) {
+        const fullPath = path.join(sourceDir, entry.name);
+        if (entry.isDirectory()) {
+            files.push(...discoverFilesRecursive(fullPath, baseDir));
+        } else if (entry.isFile()) {
+            files.push({
+                name: path.relative(baseDir, fullPath),
+                path: fullPath,
+                size: getFileSize(fullPath)
+            });
+        }
+    }
+    return files.sort((a, b) => a.name.localeCompare(b.name));
+}
+
+function listTools(tools) {
+    if (tools.length === 0) return;
+    console.log('\n  Found ' + tools.length + ' tool files:\n');
+    let totalSize = 0;
+    for (const tool of tools) {
+        console.log('  ' + tool.name.padEnd(55) + ' ' + formatSize(tool.size).padStart(8));
+        totalSize += tool.size;
+    }
+    console.log('\n  Total tools: ' + tools.length + ' files, ' + formatSize(totalSize) + '\n');
+}
+
+function installTools(tools, opts) {
+    if (tools.length === 0) return { installed: 0, skipped: 0, errors: 0 };
+    const toolsTarget = getOpenClawToolsDir();
+    const workspaceToolsTarget = getOpenClawWorkspaceToolsDir();
+    const prefix = opts.dryRun ? '[DRY-RUN] ' : '';
+    console.log('\n' + prefix + 'Installing ' + tools.length + ' tool files to:');
+    console.log('  ' + toolsTarget);
+    console.log('  ' + workspaceToolsTarget + '\n');
+    let installed = 0;
+    let skipped = 0;
+    let errors = 0;
+    for (const tool of tools) {
+        try {
+            for (const targetRoot of [toolsTarget, workspaceToolsTarget]) {
+                const destFile = path.join(targetRoot, tool.name);
+                if (fs.existsSync(destFile)) {
+                    const existingContent = fs.readFileSync(destFile);
+                    const newContent = fs.readFileSync(tool.path);
+                    if (existingContent.equals(newContent)) {
+                        skipped++;
+                        continue;
+                    }
+                }
+                if (!opts.dryRun) {
+                    copyFileSync(tool.path, destFile);
+                }
+                installed++;
+            }
+            process.stdout.write('  [OK] ' + tool.name + '\n');
+        } catch (err) {
+            process.stdout.write('  [ERROR] ' + tool.name + ': ' + err.message + '\n');
+            errors++;
+        }
+    }
+    console.log('\n' + prefix + 'Tool files done! Installed: ' + installed + ', unchanged: ' + skipped + ', errors: ' + errors + '\n');
+    return { installed, skipped, errors };
+}
+
 function installSkills(skills, targetDir, opts) {
     const prefix = opts.dryRun ? '[DRY-RUN] ' : '';
 
@@ -287,6 +370,7 @@ function main() {
     // Determine source directory (skills/ next to this script)
     const scriptDir = __dirname;
     const sourceDir = path.join(scriptDir, SKILLS_SUBDIR);
+    const toolsSourceDir = path.join(scriptDir, TOOLS_SUBDIR);
 
     if (!fs.existsSync(sourceDir)) {
         console.error(`\n  ❌ Skills directory not found: ${sourceDir}`);
@@ -307,6 +391,7 @@ function main() {
 
     if (opts.list) {
         listSkills(skills);
+        listTools(discoverFilesRecursive(toolsSourceDir));
         return;
     }
 
@@ -319,15 +404,18 @@ function main() {
     const targetDir = opts.target || getOpenClawSkillsDir();
 
     // Pre-flight check
-    const openclawDir = path.join(os.homedir(), '.openclaw');
+    const openclawDir = getOpenClawDir();
     if (!opts.target && !fs.existsSync(openclawDir)) {
         console.error(`\n  ⚠️  OpenClaw directory not found: ${openclawDir}`);
         console.error('  Is OpenClaw installed? You can specify a custom target with --target PATH\n');
         process.exit(1);
     }
 
+    const tools = discoverFilesRecursive(toolsSourceDir);
+
     listSkills(skills);
     installSkills(skills, targetDir, opts);
+    installTools(tools, opts);
 }
 
 main();

BIN
dist/xiaohongshu-platform.zip


+ 102 - 0
docs/other/qiwe-platform-registration-flow.md

@@ -0,0 +1,102 @@
+# QiWe 平台注册流程整理
+
+## 1. 注册入口
+
+- **注册地址**:`https://manager.qiweapi.com/register`
+- **系统名称**:QiWe 后台管理系统
+- **登录页入口**:登录页点击 `立即注册` 可跳转到注册页
+- **已有账号入口**:注册页点击 `使用已有账户登录` 可返回登录页
+
+## 2. 注册前准备
+
+- **手机号**:用于作为登录账号,同时接收手机验证码
+- **邮箱地址**:注册表单要求填写有效邮箱
+- **公司名称**:作为账号主体/昵称信息填写
+- **登录密码**:需设置并二次确认
+- **图片验证码**:页面加载时自动获取,点击验证码图片可刷新
+- **手机验证码**:填写手机号和图片验证码后获取
+- **邀请链接**:如 URL 中带有 `inviteCode` 参数,系统会自动写入注册表单
+
+示例邀请注册链接:
+
+```text
+https://manager.qiweapi.com/register?inviteCode=邀请码
+```
+
+## 3. 页面字段与校验规则
+
+| 字段 | 页面含义 | 是否必填 | 校验/说明 |
+| --- | --- | --- | --- |
+| 公司名称 | 注册主体名称 | 是 | 不能为空 |
+| 手机号/账号 | 登录账号与短信接收手机号 | 是 | 必须为中国大陆手机号格式,正则约束为 `^1[3-9]\d{9}$` |
+| 邮箱 | 联系邮箱 | 是 | 必须符合邮箱格式 |
+| 密码 | 登录密码 | 是 | 长度需为 5-20 个字符 |
+| 确认密码 | 二次确认密码 | 是 | 必须与密码一致 |
+| 图片验证码 | 图形验证码 | 视系统配置而定 | 页面默认启用;若启用,发送短信验证码前必须填写 |
+| 手机验证码 | 短信验证码 | 是 | 点击 `获取验证码` 后填写 |
+
+
+## 4. 注册操作流程
+
+### Step 1:打开注册页
+
+访问:
+
+```text
+https://manager.qiweapi.com/register
+```
+
+如果是通过邀请链接注册,使用带 `inviteCode` 的链接进入。
+
+### Step 2:填写基础信息
+
+依次填写:
+
+- **公司名称**:填写公司或团队名称
+- **手机号/账号**:填写可接收短信的手机号
+- **邮箱**:填写有效邮箱地址
+- **密码**:设置 5-20 位登录密码
+- **确认密码**:再次输入同一密码
+
+### Step 3:填写图片验证码
+
+页面默认会展示图片验证码。
+
+- **刷新方式**:点击验证码图片可刷新
+- **用途**:获取手机验证码前需要先填写图片验证码
+
+### Step 4:获取手机验证码
+
+点击 `获取验证码`。
+
+系统前端会先检查:
+
+- **手机号是否为空**:为空时提示 `请输入手机号`
+- **手机号格式是否正确**:格式错误时提示 `请输入正确的手机号`
+- **图片验证码是否填写**:启用图片验证码时,未填写会提示 `请输入图片验证码`
+
+校验通过后,系统发送短信验证码。
+
+- **倒计时**:发送成功后进入 60 秒倒计时
+- **再次发送**:倒计时结束后才可再次获取验证码
+
+### Step 5:填写手机验证码并提交注册
+
+输入短信验证码后点击 `注册`。
+
+提交时系统会再次校验所有必填项和格式。校验通过后,页面进入注册中状态。
+
+### Step 6:注册成功并跳转登录
+
+注册成功后,系统弹出成功提示:
+
+```text
+恭喜你,您的账号 [手机号] 注册成功!
+```
+
+点击确认后跳转到登录页:
+
+```text
+https://manager.qiweapi.com/login
+```
+

+ 154 - 0
docs/voc-skills-course-plan/01-skill-productization.md

@@ -0,0 +1,154 @@
+# 01. VOC Skills 产品化与发布方案
+
+## 目标
+
+把当前 `openclaw-voc-skill` 从“OpenClaw 内部技能集合”升级为可以对外传播、课程售卖、技能市场上架、npm/zip 分发的 **VOC Skills 产品包**。
+
+建议对外统一使用:
+
+- **产品名**:VOC Skills
+- **课程/市场名**:voc-skills
+- **npm 包名候选**:`@voc-market/voc-skills`
+- **技能市场包名候选**:`voc-core`、`voc-social-data`、`voc-workshop`、`voc-report-factory`
+- **品牌归属**:voc.market / 商协云
+
+## 当前资产判断
+
+| 资产 | 当前状态 | 产品化价值 |
+|---|---|---|
+| 技能目录 | 已覆盖 Amazon、Sorftime、电商评论、TikTok、Instagram、抖音、竞品、评论分析、报告合成等 | 可拆成多个可售卖 skill suite |
+| `WORKSHOP-SKILL-MAPPING.md` | 已有 23 个数据采集层 + 18 个编排层映射 | 可作为技能市场说明书和课程大纲底稿 |
+| `workshop/` | 已有 6 个 session、Side Quest、Token 预飞、产品分析模式 | 可打包成“VOC 虾工作坊”安装包 |
+| `scripts/deploy/package-and-upload.js` | 可将技能套件和 workshop 打 zip,并上传 Qiniu | 已具备 zip 市场发布基础 |
+| `scripts/deploy/upload-skills.js` | 可同步 Qiniu CDN 与 Parse Skill 元数据,并生成 README | 已具备 skill marketplace 发布链路 |
+| `scripts/deploy/install-all.js` | 可安装技能、工作坊、token tools | 可作为全量一键安装入口 |
+| `scripts/deploy/install-workshop.js` | 支持 workshop、skills-only、playbook-only | 可支持课程中分层安装 |
+| `scripts/tools/set-voc-token.js` / `voc-token-preflight` | 支持 token 写入与预飞检查 | 可形成付费 API 转化闭环 |
+
+## 推荐套件拆分
+
+### 1. `voc-core`
+
+**定位**:跨境电商品类、产品、竞品、评论 VOC 的核心技能包。
+
+**面向用户**:Amazon 卖家、跨境选品团队、产品经理、运营负责人、VOC 系统课学员。
+
+**应包含能力**:
+
+- Amazon 产品搜索与详情
+- ASIN 销量/排名/价格/评分查询
+- 关键词搜索、趋势、类目树
+- 评论批量采集
+- 评论情感、关键词、痛点、亮点、场景分析
+- 品类全景、竞品发现、竞品对比、定价分析
+
+**主要交付物**:品类健康度、竞品矩阵、评论 VOC、痛点/亮点/功能/场景看板、HTML 报告基础数据。
+
+### 2. `voc-social-data`
+
+**定位**:社媒平台 VOC 采集与趋势验证。
+
+**面向用户**:小红书/抖音/海外社媒运营、内容团队、品牌营销负责人。
+
+**应包含能力**:
+
+- 小红书关键词搜索、笔记采集、评论采集、搜索筛选
+- 抖音通用搜索与评论/内容采集
+- TikTok 品类/品牌 VOC
+- Instagram 品牌 VOC
+- 跨平台趋势验证与社媒声量总结
+
+**发布前必须补齐**:现有报告方法论和江中案例中,小红书是核心数据源,但当前稳定技能包归类里还需要正式纳入 `xiaohongshu/`。建议将其放入 `voc-social-data`,并在市场 README 中明确适用中文消费品、健康医药、餐饮、生活方式场景。
+
+### 3. `voc-workshop`
+
+**定位**:2 天 VOC 虾工作坊完整 playbook 与技能编排包。
+
+**应包含内容**:
+
+- `workshop-global-rules.md`
+- `workshop-session-0-intake.md` 到 `workshop-session-5-report.md`
+- `product-analysis-playbook.md`
+- `synthesis-prompts.md`
+- `voc-report-schema-spec.md`
+- memory templates
+- token tools
+- 课程运行所需核心技能
+
+**核心卖点**:不只是技能集合,而是一套可恢复、可门控、可校准的 Agent 工作坊。每个 session 都有 Hard Stop、校准、Side Quest 和最终报告增强机制。
+
+### 4. `voc-report-factory`
+
+**定位**:把人工快速出报告经验固化成标准化报告工厂。
+
+**面向用户**:内部交付团队、高阶课程学员、认证助教、B 端陪跑团队。
+
+**应包含能力**:
+
+- 需求摄入模板
+- H1-H8 假设生成
+- 关键词 x 平台 x 批次采集矩阵
+- 多平台采集执行脚本模板
+- 数据合并与审计模板
+- 报告渲染器与 HTML 交付模板
+- 质量审计 checklist
+
+该套件目前能力分散在 VOC 方法论文档和江中报告脚本中,当前仓库可先以文档包形式发布,后续再抽象为正式 skills/scripts。
+
+## 对外市场包装
+
+### 市场首页推荐文案
+
+> VOC Skills 是面向品牌、产品、运营与 OPC 的 AI 用户洞察技能包。它把电商评论、社媒内容、竞品数据、品类趋势和用户原声转化为可落地的产品优化、内容策略与增长行动。
+
+### 三个价值锚点
+
+1. **VOC 为先**:先听用户真实声音,再做产品与内容决策。
+2. **内容为王**:把用户痛点、亮点和场景转化为标题、卖点、短视频与种草内容。
+3. **增长为果**:输出可执行的 30/60/90 天行动计划,连接产品改进、渠道策略与转化提升。
+
+## 定价建议
+
+| 产品 | 建议价格 | 权益 |
+|---|---:|---|
+| 单技能体验 | 0-99 元 | 低频体验、课程演示、样例数据 |
+| `voc-core` 月订阅 | 299 元/月 | Amazon 核心数据与评论 VOC 技能 |
+| `voc-social-data` 月订阅 | 299 元/月 | 小红书/抖音/TikTok/Instagram 数据技能 |
+| `voc-workshop` 课程包 | 2999-6999 元/人 | 工作坊 playbook + 技能安装 + 作业评审 |
+| 企业工作坊包 | 3-10 万/场 | 企业私域数据、现场工作坊、最终报告 |
+| B 端轻咨询 | 30-60 万/年 | 月度 VOC 报告、策略会、增长陪跑 |
+
+## 发布路线
+
+### 第 1 步:统一命名
+
+- `package.json` 保留仓库可读性,但新增对外说明:`VOC Skills for voc.market`。
+- 市场文案统一从 `OpenClaw VOC Skill Collection` 过渡到 `VOC Skills`。
+- 对外不强调 `openclaw`,只说明支持 OpenClaw 安装运行。
+
+### 第 2 步:调整发布套件
+
+- 保留现有 `voc-core`。
+- 将 `social-media` 升级命名为 `voc-social-data`。
+- 明确加入 `xiaohongshu/`。
+- 将 workshop 文件、memory 模板、token tools 打入 `voc-workshop`。
+- 将报告 SOP 文档加入 `voc-report-factory`。
+
+### 第 3 步:发布形态
+
+| 渠道 | 形态 | 说明 |
+|---|---|---|
+| OpenClaw Skill Market | zip + metadata | 使用现有 Qiniu + Parse 发布链路 |
+| npm | `@voc-market/voc-skills` | 提供安装脚本、manifest、课程文档入口 |
+| 课程资料包 | zip / GitHub release | 面向训练营学员安装 |
+| 企业交付 | 私有化包 | 可按客户隔离 token、memory、数据目录 |
+
+## 发布前检查清单
+
+- [ ] `xiaohongshu/` 纳入正式发布套件。
+- [ ] 市场 README 中套件名、价格、安装命令统一为 `VOC Skills`。
+- [ ] `install-all.js` 作为全量安装入口,`install-workshop.js` 明确支持 skills-only、playbook-only 等课程分层安装模式。
+- [ ] `voc-token-preflight` 与 `set-voc-token.js` 在课程包中可见。
+- [ ] npm 包名、仓库名、skill package name 三者关系写清楚。
+- [ ] 课程每节课映射到具体 skill 与输出字段。
+- [ ] `voc-report-factory` 至少先以 Markdown SOP 发布。

+ 265 - 0
docs/voc-skills-course-plan/02-standard-report-workflow.md

@@ -0,0 +1,265 @@
+# 02. 标准化报告工作流:从人工快速出报告到 VOC Report Factory
+
+## 目标
+
+把现有“人工快速出报告”的经验沉淀成可培训、可复用、可审计、可交付的 **VOC Report Factory 标准工作流**。
+
+该工作流适用于三类场景:
+
+- **内部交付**:让不同成员按照同一标准完成企业 VOC 报告。
+- **课程训练**:让学员从一次案例实操中掌握完整报告生产链路。
+- **技能产品化**:为 `voc-report-factory` 套件提供 SOP、模板和后续 skill 抽象依据。
+
+## 核心原则
+
+1. **先定义问题,再采数据**:不能先抓一堆数据再找结论。
+2. **先有假设,再有矩阵**:每个关键词、平台、批次都必须对应 H1-H8 假设。
+3. **先保留证据,再写洞察**:每个结论必须能回溯到 VOC 原声、平台、关键词、批次。
+4. **先审计,再交付**:没有经过完整 audit 的 HTML 报告不能对外交付。
+5. **人机协同,不是全自动**:AI 负责规模化采集、整理、归纳,人负责业务判断、章节逻辑和最终质量。
+
+## 标准 6 阶段流程
+
+| 阶段 | 名称 | 目标 | 产出物 |
+|---|---|---|---|
+| Phase 1 | 需求摄入 | 明确客户业务问题、决策场景、品类边界 | `0.Intake.md` |
+| Phase 2 | 假设与报告结构 | 将业务问题拆成 H1-H8 与章节框架 | `1.Hypothesis.md` / 报告大纲 |
+| Phase 3 | 采集矩阵设计 | 形成关键词 x 平台 x 批次计划 | `3.CollectionMatrix.md` |
+| Phase 4 | 数据采集执行 | API 调用、去重、合并、打标签 | `raw/`、`_merged.json`、`comments-flat.jsonl`、`audit.log` |
+| Phase 5 | 分析与报告生成 | 章节分析、VOC 证据卡、HTML 渲染 | `reports/*.html`、章节 JS/MD |
+| Phase 6 | 质量审计与交付 | 审计、摘要、交付包、客户沟通 | `4.CollectionExecutionSummary.md`、审计报告、交付清单 |
+
+## Phase 1:需求摄入
+
+### 输入
+
+- 客户品牌/产品信息
+- 当前业务目标
+- 决策时间点
+- 已知竞品
+- 目标平台
+- 希望回答的问题
+
+### 标准提问
+
+| 问题 | 目的 |
+|---|---|
+| 这次报告最终要支持哪个决策? | 确定报告不是泛调研,而是决策工具 |
+| 决策人是谁? | 决定报告语言、结构和深度 |
+| 你现在最不确定的 3 个判断是什么? | 形成核心假设 |
+| 已知竞品/替代品有哪些? | 建立竞品池 |
+| 你希望覆盖哪些平台? | 确定采集资源和费用 |
+| 交付时间与汇报形式是什么? | 约束报告规模 |
+
+### 产出模板
+
+`0.Intake.md` 至少包含:
+
+- 项目背景
+- 业务目标
+- 决策问题
+- 品类/产品边界
+- 平台范围
+- 已知竞品
+- 交付物定义
+- 风险与不做事项
+
+## Phase 2:假设与报告结构
+
+### H1-H8 建议框架
+
+| 假设 | 典型问题 |
+|---|---|
+| H1 品类机会 | 市场是否值得进入/加码? |
+| H2 用户需求 | 用户真实痛点和高频场景是什么? |
+| H3 产品缺口 | 当前产品/竞品哪里没有满足? |
+| H4 价格认知 | 用户对价格、规格、价值感如何判断? |
+| H5 渠道内容 | 哪些内容/平台影响用户决策? |
+| H6 竞品策略 | 竞品靠什么赢,哪里有漏洞? |
+| H7 定位表达 | 什么话术、概念、定位更能打动用户? |
+| H8 增长行动 | 下阶段最应该做哪些动作? |
+
+### 报告结构建议
+
+企业级深度报告建议采用 6-7 章:
+
+1. 执行摘要与核心判断
+2. 品类与需求全景
+3. 用户 VOC 与痛点结构
+4. 竞品与替代方案分析
+5. 定位、话术、产品/内容机会
+6. 渠道与场景策略
+7. 行动计划与验证路径
+
+轻量报告可压缩为 4 章:
+
+1. 结论先行
+2. 用户声音
+3. 竞品/平台发现
+4. 行动建议
+
+## Phase 3:采集矩阵设计
+
+### 矩阵字段
+
+| 字段 | 说明 |
+|---|---|
+| keyword | 关键词 |
+| platform | 平台,如小红书、抖音、Amazon、TikTok |
+| batch | P0/P1/P2 优先级批次 |
+| targetCount | 目标采集数量 |
+| hypothesisTags | 对应 H1-H8 |
+| purpose | 该关键词要验证什么 |
+| expectedSignal | 预期观察到的信号 |
+| risk | 可能噪声或偏差 |
+
+### 批次策略
+
+| 批次 | 用途 | 建议规模 |
+|---|---|---|
+| P0 | 核心关键词和高置信方向 | 20%-30% 数据量 |
+| P1 | 竞品、场景、功效、痛点扩展 | 40%-50% 数据量 |
+| P2 | 长尾、异常、补证与反证 | 20%-30% 数据量 |
+
+### 关键词四象限
+
+- **产品词**:产品名、成分、品类名、功能词。
+- **竞品词**:竞品品牌、替代品、对标品。
+- **场景词**:使用场景、购买场景、人群场景。
+- **长尾问题词**:怎么选、有没有用、副作用、避坑、对比。
+
+## Phase 4:采集执行
+
+### 数据目录建议
+
+```text
+docs/<project>/raw/
+  xhs-<keyword>.json
+  douyin-<keyword>.json
+  amazon-<asin>.json
+  _merged.json
+  comments-flat.jsonl
+  audit.log
+```
+
+### 执行顺序
+
+1. token / credentials 预飞。
+2. 单关键词小样本测试。
+3. P0 批次采集。
+4. 检查噪声、重复、平台偏差。
+5. P1/P2 批量采集。
+6. 合并、去重、字段归一。
+7. 写入 `audit.log`。
+
+### 必须保留字段
+
+| 字段 | 用途 |
+|---|---|
+| platform | 证明来源平台 |
+| keyword | 回溯采集入口 |
+| batch | 证明优先级和采集顺序 |
+| hypothesisTags | 对应 H1-H8 |
+| author/nickname | VOC 原声可信度 |
+| text/comment | 证据正文 |
+| likeCount/commentCount | 判断权重 |
+| url/noteId/videoId/asin | 可追溯链接或 ID |
+| collectedAt | 审计与复跑 |
+
+## Phase 5:分析与报告生成
+
+### 分析顺序
+
+1. 数据概况:平台、关键词、样本量、去重率。
+2. 假设覆盖:H1-H8 每个是否有足够证据。
+3. 高频主题:痛点、亮点、场景、竞品、价格、话术。
+4. 反常信号:高赞负面、低频高价值、跨平台矛盾。
+5. 章节写作:先结论,再证据,再业务解释。
+6. HTML 渲染:统一封面、章节、证据卡、图表、行动页。
+
+### 章节质量标准
+
+每个主要章节必须包含:
+
+- 一个结论性标题。
+- 3-5 条关键洞察。
+- 至少 3 张真实 VOC 证据卡。
+- 一个业务解释框。
+- 一个可执行建议。
+- 如适用,附平台/关键词/假设标签。
+
+## Phase 6:质量审计与交付
+
+### 自动审计项
+
+| 检查项 | 通过标准 |
+|---|---|
+| placeholder 检查 | 不得出现 `TODO`、`placeholder`、空章节 |
+| 样本量检查 | 每个平台、每批次数量可解释 |
+| 假设覆盖 | H1-H8 覆盖状态明确 |
+| 重复检查 | 重复内容不影响结论 |
+| 离题检查 | 高赞离题内容被标注或剔除 |
+| 证据回溯 | 关键结论能回到原始 VOC |
+| HTML 完整性 | 可打开、无明显样式破裂 |
+| 封面一致性 | 样本量、平台、日期与正文一致 |
+| 行动建议 | 有优先级、负责人/周期/验证方式 |
+
+### 交付包
+
+```text
+<project>-delivery/
+  report.html
+  executive-summary.md
+  4.CollectionExecutionSummary.md
+  raw/
+  scripts/
+  audit.log
+  README.md
+```
+
+## 从人工经验到技能化的拆解
+
+| 人工步骤 | 可标准化模板 | 可技能化方向 |
+|---|---|---|
+| 访谈理解需求 | `0.Intake.md` | `voc-intake-builder` |
+| 生成 H1-H8 | 假设模板 | `hypothesis-generator` |
+| 设计采集矩阵 | `3.CollectionMatrix.md` | `collection-matrix-builder` |
+| API 批量采集 | `collect.js` 模板 | 平台采集 skills |
+| 合并去重 | `_merged.json` 规则 | `voc-data-normalizer` |
+| 章节写作 | 报告章节模板 | `chapter-insight-writer` |
+| HTML 渲染 | v2 renderer | `html-report-generator` |
+| 审计交付 | audit checklist | `voc-report-auditor` |
+
+## `voc-report-factory` 初版文件清单
+
+在正式开发新 skill 之前,`voc-report-factory` 可以先作为 Markdown + script template 文档包发布。初版建议至少包含:
+
+| 文件 | 用途 | 最低要求 |
+|---|---|---|
+| `0.Intake.template.md` | 需求摄入 | 能记录业务目标、决策人、平台范围、竞品和不做事项 |
+| `1.Hypothesis.template.md` | H1-H8 假设 | 每条假设都有验证问题、所需平台和预期证据 |
+| `2.ReportOutline.template.md` | 报告结构 | 区分轻量 4 章和企业 6-7 章版本 |
+| `3.CollectionMatrix.template.md` | 采集矩阵 | 包含 keyword、platform、batch、targetCount、hypothesisTags |
+| `4.CollectionExecutionSummary.template.md` | 采集汇报 | 汇总样本、平台、假设覆盖、异常与下一步 |
+| `raw-schema.md` | 原始数据 schema | 规定 `_merged.json` 和 `comments-flat.jsonl` 必备字段 |
+| `report-quality-audit.md` | 质量审计 | 覆盖 placeholder、样本量、证据回溯、HTML 完整性 |
+| `delivery-readme.template.md` | 客户交付说明 | 说明报告、原始数据、脚本和复跑方式 |
+
+## 单项目完成定义
+
+每个使用该工作流交付的 VOC 报告,至少要满足以下完成定义:
+
+1. **问题闭环**:报告开头明确回答 Phase 1 的核心决策问题。
+2. **数据闭环**:封面样本量、正文平台分布、`_merged.json` 统计一致。
+3. **假设闭环**:H1-H8 每条都有“已验证 / 证据不足 / 被反证”状态。
+4. **证据闭环**:关键结论能追溯到真实 VOC 原声、平台、关键词与批次。
+5. **行动闭环**:至少输出 P0/P1/P2 行动建议,并说明验证方式。
+6. **审计闭环**:交付前完成质量审计,且严重问题为 0。
+7. **复跑闭环**:交付包保留原始数据、脚本、矩阵和执行摘要,方便 30 天后复盘更新。
+
+## 对课程和产品的意义
+
+- 对内部:形成可复制交付,不再依赖个人发挥。
+- 对课程:学员可以从一个小案例跑完整流程。
+- 对市场:`voc-report-factory` 成为高阶包,承接 699 元单平台课之后的升级。
+- 对 voc.market:将“99 元/月轻量 SaaS”与“AI Skills 299 元/月”连接到企业级报告能力。

+ 206 - 0
docs/voc-skills-course-plan/03-course-system.md

@@ -0,0 +1,206 @@
+# 03. VOC Skills 课程体系与 2 小时单平台课
+
+## 课程体系目标
+
+课程不是单纯教工具,而是把 `voc.market` 的产品定位落成一套可转化的用户路径:
+
+1. 让用户第一次看到 VOC 数据能回答真实业务问题。
+2. 让用户愿意继续购买技能包、订阅和进阶课。
+3. 让优秀学员能升级为企业交付助教或认证顾问。
+
+## 三层课程产品
+
+| 层级 | 产品 | 用户 | 目标 | 建议价格 |
+|---|---|---|---|---:|
+| L1 | 2 小时单平台 VOC 实战课 | OPC、中小商家、运营新人 | 用一个平台完成一次真实洞察 | 699 元/平台 |
+| L2 | VOC Skills 系统训练营 | 产品、运营、市场、跨境卖家 | 掌握完整技能组合和报告流程 | 2999-6999 元 |
+| L3 | 企业 VOC 虾工作坊 | 企业团队、品牌方 | 用企业真实产品完成完整报告 | 3-10 万/场 |
+
+## L1:2 小时单平台 VOC 实战课
+
+### 课程定位
+
+每次只讲一个平台,不追求完整方法论,而追求“用户当场拿到可用结果”。
+
+**一句话承诺**:
+
+> 2 小时内,在 OpenClaw 中调用 VOC Skills,用一个平台的真实用户声音,完成一份可用于产品、内容或投放决策的小型 VOC 洞察报告。
+
+**课程主入口**:
+
+```text
+voc/voc-single-platform-report
+```
+
+本课对外教学时不以本地脚本为主线。本地脚本只作为底层能力和助教验证链路。
+
+### 标准课型
+
+| 课型 | 适用人群 | 平台 | 当场交付 |
+|---|---|---|---|
+| 小红书 VOC 课 | 中文消费品、健康、餐饮、生活方式品牌 | 小红书 | 关键词矩阵 + 用户痛点/场景卡 |
+| 抖音 VOC 课 | 内容营销、电商、达人投放团队 | 抖音 | 爆点内容拆解 + 评论需求洞察 |
+| Amazon 评论 VOC 课 | 跨境卖家、选品团队 | Amazon | 竞品评论痛点 + Listing 优化建议 |
+| TikTok VOC 课 | 出海品牌、跨境内容团队 | TikTok | 海外内容趋势 + 用户兴趣信号 |
+| Instagram VOC 课 | DTC 品牌、生活方式品牌 | Instagram | 品牌内容反馈 + 视觉/场景洞察 |
+
+### 2 小时标准结构
+
+| 时间 | 模块 | 内容 | 学员产出 |
+|---:|---|---|---|
+| 0-10 分钟 | 开场与业务问题 | 明确产品、品类、目标用户、决策问题 | 1 个明确问题 |
+| 10-25 分钟 | 平台 VOC 逻辑 | 平台用户心智、关键词类型、可看不可看 | 关键词初稿 |
+| 25-45 分钟 | 关键词矩阵 | 产品词、竞品词、场景词、问题词 | 10-20 个关键词 |
+| 45-75 分钟 | OpenClaw 技能调用 | 调用 `voc-single-platform-report` 或平台 mini VOC skill | 原始数据样本与报告初稿 |
+| 75-100 分钟 | 洞察生成 | 查看痛点、亮点、场景、话术、竞品机会和证据卡 | 5-8 条洞察 |
+| 100-115 分钟 | 行动建议 | 转成标题、卖点、选品、内容或投放动作 | 3 条行动 + 报告链接 |
+| 115-120 分钟 | 升级路径 | 引导购买技能包、系统课或工作坊 | 下一步选择 |
+
+### 单平台课交付模板
+
+每节课结束至少给学员一份 `Platform VOC Mini Report`:
+
+```text
+1. 本次业务问题
+2. 平台与关键词范围
+3. 样本概况
+4. Top 用户痛点
+5. Top 使用场景
+6. Top 竞品/替代方案信号
+7. 可复用内容话术
+8. 3 条下周行动建议
+9. 推荐继续采集的关键词
+```
+
+### 课前准备与现场兜底
+
+2 小时课最怕现场安装失败、API 超时、关键词噪声过高,因此每节课必须准备三套路径:
+
+| 路径 | 触发条件 | 操作 | 目标 |
+|---|---|---|---|
+| Live 路径 | 学员环境和 token 正常 | 现场调用 skill 采集真实数据 | 让学员体验完整流程 |
+| Demo 路径 | API 慢、平台限流、token 异常 | 使用课前准备的 demo raw data | 保证课程不断档 |
+| Dry-run 路径 | 学员完全无法安装 | 讲师投屏演示,学员填写模板 | 保证每人仍有产出 |
+
+课前至少准备:
+
+- 1 份 OpenClaw 安装说明。
+- 1 份 token 预飞说明。
+- 1 份 demo 数据包。
+- 1 份 `voc-single-platform-report` 标准输入。
+- 1 份空白 mini report 模板。
+- 1 份已完成 mini report 示例。
+- 1 份课后转化页,说明如何购买 skills、系统训练营或企业工作坊。
+
+## L2:VOC Skills 系统训练营
+
+### 课程定位
+
+系统训练营面向想完整掌握 `voc-skills` 的用户,目标是能独立完成一次 6 阶段 VOC 报告。
+
+### 推荐周期
+
+- **轻量版**:2 天密集训练。
+- **标准版**:4 周训练营,每周 1 个主题 + 作业评审。
+- **认证版**:6-8 周,增加企业案例作业和交付答辩。
+
+### 4 周标准大纲
+
+| 周次 | 主题 | 核心能力 | 作业 |
+|---|---|---|---|
+| Week 1 | VOC 方法论与问题拆解 | 需求摄入、H1-H8、报告结构 | 完成 `0.Intake.md` + 假设表 |
+| Week 2 | 数据采集与矩阵 | 关键词矩阵、平台选择、批次策略 | 完成 `3.CollectionMatrix.md` |
+| Week 3 | 技能调用与数据分析 | Amazon/小红书/抖音/社媒技能调用,合并去重 | 完成 `raw/` + 样本摘要 |
+| Week 4 | 报告生成与交付 | 章节洞察、VOC 证据卡、HTML 报告、审计 | 完成小型 HTML 报告 |
+
+### 可选进阶模块
+
+| 模块 | 内容 | 适合对象 |
+|---|---|---|
+| 报告渲染器训练 | 学习 v2 report renderer、章节模块拆分、组件复用 | 技术型学员/助教 |
+| 企业访谈与提案 | 如何把 VOC 结论转成客户可买单的项目 | 顾问/销售/交付负责人 |
+| 工作坊主持 | 如何运行 2 天 VOC 虾工作坊和 Side Quest | 内训讲师/助教 |
+| 技能开发 | 如何把重复动作抽象成新 skill | 技术团队 |
+
+## L3:企业 VOC 虾工作坊
+
+### 课程定位
+
+企业工作坊不是公开课,而是团队共创式交付。它使用 `voc-workshop` 包中的 6 个 session 和 Side Quest 机制,让客户团队边学边完成真实项目。
+
+### 建议流程
+
+| 时间 | 阶段 | 内容 | 产出 |
+|---|---|---|---|
+| Day 0 | 预沟通 | 确定品牌、品类、ASIN/产品、平台、目标 | 项目 brief |
+| Day 1 上午 | Session 0-1 | 品牌建档、Token 预飞、品类全景 | 品类健康度 |
+| Day 1 下午 | Session 2 | 品牌画像、竞品发现、竞品对比 | 竞品矩阵 |
+| Day 1 晚上 | Session 3 | 评论采集与 VOC 初体验 | 评论语料库 |
+| Day 2 上午 | Session 4 | 深度 VOC、社媒、用户画像 | 痛点/亮点/场景/画像 |
+| Day 2 下午 | Session 5 | 提案与 HTML 报告 | 13 屏报告 + 行动计划 |
+| Day 3-7 | 复盘交付 | 审计、补证、汇报材料整理 | 最终交付包 |
+
+## 课程与订阅转化路径
+
+| 触点 | 用户状态 | 推荐动作 | 转化产品 |
+|---|---|---|---|
+| 免费公开课 | 好奇但未付费 | 展示一个真实案例前后对比 | 99 元/月基础版 |
+| 2 小时单平台课 | 已愿意为结果付费 | 给出可用小报告 | 299 元/月 AI Skills |
+| 系统训练营 | 想系统掌握 | 训练完整 SOP | 2999-6999 元课程 |
+| 企业工作坊 | 有团队和预算 | 以真实项目交付 | 3-10 万/场 |
+| 月度陪跑 | 已看到价值 | 定期更新 VOC 与行动建议 | 30-60 万/年 |
+
+## 单技能课程设计
+
+单技能课适合作为课程库、技能市场教程和售后教学资料。
+
+| 单技能课 | 学习目标 | 练习数据 | 交付物 |
+|---|---|---|---|
+| `product-search` | 学会用关键词找对标产品 | 1 个品类关键词 | Top 10 对标清单 |
+| `keyword-search` | 学会判断搜索热度与机会 | 5 个关键词 | 关键词优先级表 |
+| `review-batch-collection` | 学会批量获取评论语料 | 1-3 个 ASIN | 评论语料库 |
+| `review-pain-point-extraction` | 学会从差评找痛点 | 100+ 评论 | 痛点排序表 |
+| `review-highlight-extraction` | 学会从好评找卖点 | 100+ 评论 | Listing 卖点建议 |
+| `douyin-general-search` | 学会用抖音找内容需求 | 3 个中文关键词 | 内容信号表 |
+| 小红书采集技能 | 学会采中文种草平台 VOC | 3 个中文关键词 | 用户场景卡 |
+| `html-report-generator` | 学会把分析转成可演示报告 | 完整 stage output | HTML 报告 |
+
+## 作业与认证标准
+
+| 级别 | 要求 | 证书/权益 |
+|---|---|---|
+| 入门 | 完成 1 个单平台 mini report | VOC Skills 入门徽章 |
+| 实战 | 完成 1 个 4 章轻量报告 | VOC Analyst 证书 |
+| 高阶 | 完成 1 个 6 阶段完整报告并通过审计 | VOC Report Builder 证书 |
+| 助教 | 能带 3 人小组完成工作坊 | VOC Workshop Assistant |
+| 顾问 | 能独立服务企业客户并交付报告 | VOC Certified Consultant |
+
+## 定价包装建议
+
+| 产品 | 价格 | 说明 |
+|---|---:|---|
+| 单技能录播课 | 99-199 元 | 每个 skill 10-30 分钟,适合技能市场 |
+| 2 小时单平台直播课 | 699 元 | 主力获客付费产品 |
+| 单平台课 5 课套装 | 2999 元 | 小红书/抖音/Amazon/TikTok/Instagram |
+| 4 周系统训练营 | 4999 元 | 含作业评审与模板包 |
+| 认证训练营 | 6999-9999 元 | 增加报告答辩和助教资格 |
+| 企业内训 | 3-10 万/场 | 使用客户真实产品,含最终交付 |
+
+## 课后承接机制
+
+每节课结束不只发资料,还要给用户明确下一步:
+
+| 用户反馈 | 推荐承接 | 话术方向 |
+|---|---|---|
+| “我想自己继续跑” | 299 元/月 AI Skills | 给安装包、token、示例数据和复跑 SOP |
+| “我想系统学” | 4 周系统训练营 | 强调 H1-H8、采集矩阵、报告审计和完整交付 |
+| “我想团队一起做” | 企业 VOC 虾工作坊 | 强调两天内用真实产品产出报告 |
+| “我想你们帮我做” | B 端轻咨询/年度陪跑 | 强调月度 VOC 更新、策略会和行动追踪 |
+
+## 课程优先级
+
+1. **先做小红书 VOC 2 小时课**:中文案例最强、江中报告可作为证据、用户感知强。
+2. **再做 Amazon 评论 VOC 2 小时课**:与 `voc-core` 技能最匹配,适合跨境用户。
+3. **第三做抖音 VOC 课**:适合内容团队和本地消费品牌。
+4. **随后补 TikTok/Instagram**:适合出海课程和海外内容验证。
+5. **最后整合成 4 周系统训练营**:把单平台课作为训练营前置模块。

+ 149 - 0
docs/voc-skills-course-plan/04-skill-support-matrix.md

@@ -0,0 +1,149 @@
+# 04. 技能支撑矩阵:课程、工作流与报告字段映射
+
+## 目标
+
+建立一张“课程 - 工作流 - skill - 输出字段 - 报告章节”的对应表,确保每一节课、每一个报告步骤、每一个产品卖点都有明确技能支撑。
+
+这份矩阵用于:
+
+- 检查 `voc-skills` 发布包是否缺技能。
+- 设计课程时明确每节课调用哪些 skill。
+- 设计报告工厂时明确每个字段从哪里来。
+- 给技能市场用户解释“买了这个包能产出什么”。
+
+## 总体能力分层
+
+| 层级 | 说明 | 代表能力 |
+|---|---|---|
+| L0 配置层 | token、安装、预飞、凭证 | `set-voc-token.js`、`voc-token-preflight` |
+| L1 数据采集层 | 单平台、单接口、原子数据获取 | product、keyword、review、xiaohongshu、douyin、tiktok、instagram |
+| L2 数据整理层 | 合并、去重、标签、结构化 | normalizer、comments-flat、stage output |
+| L3 分析编排层 | 品类、竞品、VOC、社媒、画像 | category-landscape、competitor-analysis、review-analysis |
+| L4 报告生成层 | 提案、HTML、审计、交付 | voc-proposal、html-report-generator、report-auditor |
+| L5 教学/工作坊层 | playbook、session、side quest、课程模板 | workshop session、product-analysis-playbook |
+| L6 用户总入口层 | 对 OpenClaw 用户屏蔽脚本和多技能串联 | `voc-single-platform-report` |
+
+## 6 阶段报告工作流映射
+
+| 阶段 | 工作内容 | 当前支撑 | 缺口/建议 |
+|---|---|---|---|
+| Phase 1 需求摄入 | 品牌、产品、目标、平台、竞品 | `brand-context-builder`、workshop session 0 | 增加 `voc-intake-builder` 文档/skill |
+| Phase 2 假设结构 | H1-H8、章节框架、交付范围 | 现有方法论文档、人工判断 | 增加 `hypothesis-generator` 模板 |
+| Phase 3 采集矩阵 | 关键词 x 平台 x 批次 | fmode 方法论、人工表格 | 增加 `collection-matrix-builder` |
+| Phase 4 数据采集 | API 调用、合并、去重 | 平台 skills、collect 脚本模式 | 抽象统一 `voc-data-normalizer` |
+| Phase 5 分析生成 | 章节洞察、VOC 证据卡、HTML | review/competitor/synthesis/report skills | 固化 v2 报告组件库 |
+| Phase 6 审计交付 | placeholder、样本、假设、证据回溯 | 审计方法论、人工检查 | 增加 `voc-report-auditor` |
+
+## 工作坊 session 与技能映射
+
+| Session | 目标 | 关键 skills | 输出文件 | 报告章节 |
+|---|---|---|---|---|
+| Session 0 品牌建档 | 收集品牌、品类、ASIN、目标 | `brand-context-builder`、`voc-token-preflight` | `brand-context.json`、`workshop-progress.json` | 项目背景 |
+| Session 1 品类全景 | 判断品类机会、搜索、价格、竞争 | `category-landscape`、`product-search`、`keyword-search`、`keyword-search-trend`、`category-tree` | `stage-1-output.json` | 品类全景 |
+| Session 2 品牌竞品 | 发现竞品、画像、对比、定价 | `brand-profile`、`competitor-discovery`、`product-deep-analysis`、`competitor-product-comparison`、`competitor-pricing-analysis` | `stage-2-output.json` | 竞品矩阵/品牌画像 |
+| Session 3 评论 VOC | 采评论、情感、关键词 | `review-batch-collection`、`review-sentiment-analysis`、`review-keyword-cloud` | `stage-3-output.json` | 用户声音/情感地图 |
+| Session 4 深度 VOC | 痛点、亮点、场景、社媒、画像 | `review-pain-point-extraction`、`review-highlight-extraction`、`tiktok-category-voc`、`instagram-brand-voc`、`douyin-general-search`、`social-trend-analysis`、`user-persona` | `stage-4-output.json` | 痛点/亮点/社媒/画像 |
+| Session 5 最终报告 | 提案、行动、HTML 报告 | `voc-proposal`、`html-report-generator` | proposal + HTML | 最终报告/行动计划 |
+
+## 单平台 2 小时课映射
+
+对外录课和用户教学时,优先使用总入口:
+
+```text
+voc/voc-single-platform-report
+```
+
+平台 mini VOC skill 用于解释底层采集链路;本地脚本仅用于助教验证和开发者调试。
+
+### 小红书 VOC 课
+
+| 模块 | 学员动作 | 技能支撑 | 交付字段 |
+|---|---|---|---|
+| 总入口 | 输入平台、品类、关键词和业务问题 | `voc-single-platform-report` | mini report / HTML report |
+| 关键词矩阵 | 写产品词、竞品词、场景词、问题词 | `voc-single-platform-report` 入参或 `xiaohongshu-mini-voc` 的 `keywordMatrix` | `keywords[]` |
+| 笔记采集 | 获取高赞/新近/相关笔记 | `xiaohongshu-mini-voc` → `xiaohongshu-search-notes`、`xiaohongshu-note-detail` | `notes[]` |
+| 评论采集 | 抽取真实用户评论 | `xiaohongshu-mini-voc` → `xiaohongshu-note-comments` | `commentsFlat[]` |
+| 报告生成 | 聚合主题、证据卡、机会点 | `voc-single-platform-report` 编排报告生成层 | `themes`、`evidenceCards`、`actions` |
+
+**发布缺口**:小红书采集技能已进入 `voc-social-data`;课程主入口需要继续把报告生成层包装为可执行 Skill。
+
+### 抖音 VOC 课
+
+| 模块 | 学员动作 | 技能支撑 | 交付字段 |
+|---|---|---|---|
+| 总入口 | 输入平台、品类、关键词和业务问题 | `voc-single-platform-report` | mini report / HTML report |
+| 内容搜索 | 搜索关键词和爆款视频 | `douyin-mini-voc` → `douyin-general-search` | `videos[]` |
+| 评论观察 | 分析用户问题和情绪 | `douyin-mini-voc` → `douyin-video-comments`、`douyin-comment-replies` | `comments[]`、`replies[]` |
+| 爆点拆解 | 看标题、钩子、场景、互动 | `douyin-mini-voc` + 报告生成层 | `contentSignals` |
+| 行动建议 | 生成短视频选题/脚本方向 | `voc-single-platform-report` | `contentActions` |
+
+### Amazon 评论 VOC 课
+
+| 模块 | 学员动作 | 技能支撑 | 交付字段 |
+|---|---|---|---|
+| 找产品 | 搜索竞品与对标 ASIN | `product-search`、`product-detail-query` | `products[]` |
+| 采评论 | 获取代表性评论 | `review-batch-collection` | `reviews[]` |
+| 情感/关键词 | 看正负面与高频词 | `review-sentiment-analysis`、`review-keyword-cloud` | `sentiment`、`keywords` |
+| 痛点/卖点 | 提取差评痛点和好评亮点 | `review-pain-point-extraction`、`review-highlight-extraction` | `painPoints`、`highlights` |
+| Listing 优化 | 生成标题/Bullet/A+ 建议 | `voc-proposal` 可选 | `listingActions` |
+
+### TikTok / Instagram VOC 课
+
+| 模块 | 学员动作 | 技能支撑 | 交付字段 |
+|---|---|---|---|
+| 趋势观察 | 获取内容趋势和达人内容 | `tiktok-category-voc`、`tiktok-brand-voc`、`instagram-brand-voc` | `socialPosts[]` |
+| 互动信号 | 看点赞、评论、标签、视觉元素 | social analysis | `engagementSignals` |
+| 内容机会 | 总结内容钩子、场景、视觉风格 | synthesis prompts | `contentOpportunities` |
+| 跨平台验证 | 与 Amazon/小红书/抖音信号对照 | `social-trend-analysis` | `crossPlatformSignals` |
+
+## 报告字段与技能来源
+
+| 报告字段 | 来源 skill/流程 | 质量要求 |
+|---|---|---|
+| 样本量 | 采集脚本 / merged data | 平台、关键词、批次可拆分 |
+| 平台分布 | normalizer | 与封面数字一致 |
+| H1-H8 覆盖 | 采集矩阵 + tags | 每个假设有证据或标注不足 |
+| 用户痛点 | `review-pain-point-extraction` / 小红书评论归纳 | 有 VOC 原声支撑 |
+| 用户亮点 | `review-highlight-extraction` / 好评归纳 | 能转成卖点表达 |
+| 高频场景 | 评论/笔记/视频场景归纳 | 区分高频、失败、新兴场景 |
+| 竞品矩阵 | `competitor-discovery` + comparison skills | 至少 3-6 个竞品 |
+| 价格认知 | `competitor-pricing-analysis` + VOC | 不只列价格,要解释价值感 |
+| 社媒趋势 | TikTok/Instagram/抖音/小红书 skills | 标注平台偏差 |
+| 用户画像 | `user-persona` + VOC 聚类 | 画像要能指导行动 |
+| 行动计划 | `voc-proposal` + 人工校准 | P0/P1/P2、周期、验证方式 |
+| HTML 报告 | `html-report-generator` / v2 renderer | 无 placeholder,可演示 |
+
+## 当前技能缺口清单
+
+| 缺口 | 优先级 | 原因 | 建议落地 |
+|---|---|---|---|
+| `voc-single-platform-report` 执行层 | P0 | OpenClaw 用户课需要一个总入口,不能让学员串脚本 | 已新增规范,下一步接入报告生成执行层 |
+| `voc-platform-mini-report-generator` Skill 化 | P0 | 当前 mini report 生成仍是本地脚本 | 包装 `platform-mini-report-generator.js` |
+| `voc-html-report-generator` Skill 化 | P0 | 当前 HTML v2 生成仍是本地脚本 | 包装 `gen-report-template.js` |
+| `voc-data-normalizer` Skill 化 | P1 | 多平台字段不统一影响审计和报告 | 包装 `_merged.json` schema 与 normalizer |
+| `voc-report-auditor` Skill 化 | P1 | 企业交付必须可审计 | 包装 placeholder/样本/假设/证据检查 |
+| `hypothesis-generator` | P1 | 可提升课程和交付效率 | 由 intake 自动生成 H1-H8 |
+| `chapter-insight-writer` | P1 | 报告章节一致性关键 | 基于 stage output 生成章节草稿 |
+| `collection-matrix-builder` | P2 | 系统训练营和企业报告需要,不是 2 小时课首要入口 | 先做 Markdown 模板,再做 skill |
+
+## 发布包与课程的对应关系
+
+| 发布包 | 支撑课程 | 支撑交付 |
+|---|---|---|
+| `voc-core` | Amazon 评论 VOC 课、系统训练营 Week 2-4 | 跨境品类/竞品/评论报告 |
+| `voc-social-data` | 小红书课、抖音课、TikTok/Instagram 课 | 中文/海外社媒 VOC 报告 |
+| `voc-workshop` | 企业工作坊、认证训练营 | 2 天工作坊完整交付 |
+| `voc-report-factory` | 系统训练营、顾问认证 | 6 阶段标准化报告生产 |
+
+## 课程设计检查问题
+
+每节课设计完成前必须回答:
+
+1. 这节课服务哪个具体业务问题?
+2. 调用哪些 skill?
+3. 采集哪些平台与字段?
+4. 2 小时内能不能稳定完成?
+5. 交付物是否能被学员直接复制使用?
+6. 是否能引导购买技能包或系统课?
+7. 是否有样例数据兜底?
+8. 是否有审计或质量检查环节?

+ 179 - 0
docs/voc-skills-course-plan/05-execution-roadmap.md

@@ -0,0 +1,179 @@
+# 05. VOC Skills 30/60/90 天执行路线图
+
+## 目标
+
+用 90 天把当前资料沉淀为可发布、可教学、可销售的 `VOC Skills` 产品体系。
+
+路线图围绕三条主线推进:
+
+1. **技能发布线**:把 `openclaw-voc-skill` 整理为 `voc-skills`,完成技能市场和 npm/zip 发布。
+2. **报告工厂线**:把人工快速出报告流程固化为 `voc-report-factory` SOP。
+3. **课程转化线**:先上线 2 小时单平台课,再扩展系统训练营和企业工作坊。
+
+## 30 天:先做最小可售卖闭环
+
+### 核心目标
+
+在 30 天内完成一个可演示、可售卖、可复用的最小闭环:
+
+> 小红书 VOC 2 小时课 + `voc-social-data` 初版 + 标准 mini report 模板 + 技能市场说明页。
+
+### 关键任务
+
+| 模块 | 任务 | 交付物 | 优先级 |
+|---|---|---|---|
+| 命名与包装 | 统一 `VOC Skills`、`voc-skills`、`@voc-market/voc-skills` 的命名说明 | 市场文案、README 修订建议 | P0 |
+| 社媒技能包 | 将 `xiaohongshu/` 纳入 `voc-social-data` 发布包 | 发布脚本调整清单 | P0 |
+| 小红书课程 | 设计 2 小时小红书 VOC 课 | 课程大纲、讲义、作业模板 | P0 |
+| 样例数据 | 准备 1 个中文消费品 demo | demo raw data、mini report | P0 |
+| 报告模板 | 做 4 章 mini report 模板 | `Platform VOC Mini Report` | P0 |
+| 支付/Token | 确保课程中 token 预飞和安装步骤可讲清楚 | 安装说明、FAQ | P1 |
+| 市场发布 | 生成技能包 README 与安装链接 | Skill Market README | P1 |
+
+### 30 天验收标准
+
+- [ ] 新用户能看懂 `VOC Skills` 是什么。
+- [ ] 小红书技能被纳入正式发布口径。
+- [ ] 有一节完整 2 小时小红书 VOC 课。
+- [ ] 有一份真实 demo mini report。
+- [ ] 课程结束能自然引导到 299 元/月 AI Skills 或系统训练营。
+- [ ] 所有安装、token、预飞流程可在课前 10 分钟讲清楚。
+
+## 60 天:做成系统训练营与报告 SOP
+
+### 核心目标
+
+在 60 天内完成 `VOC Skills 系统训练营` 和 `VOC Report Factory` 文档化,让学员能从单平台 mini report 升级到 6 阶段完整报告。
+
+### 关键任务
+
+| 模块 | 任务 | 交付物 | 优先级 |
+|---|---|---|---|
+| 报告 SOP | 固化 6 阶段报告流程 | `voc-report-factory` 文档包 | P0 |
+| 采集矩阵 | 建立 `collection-matrix-builder` 模板 | `3.CollectionMatrix.md` 模板 | P0 |
+| 数据 schema | 明确 `_merged.json`、`comments-flat.jsonl` 字段标准 | schema 文档 | P0 |
+| 审计模板 | 建立 placeholder、样本量、假设覆盖、证据回溯检查 | audit checklist | P0 |
+| 系统训练营 | 设计 4 周课程 | Week 1-4 讲义和作业 | P0 |
+| Amazon 课程 | 上线 Amazon 评论 VOC 2 小时课 | 课程大纲 + demo | P1 |
+| 抖音课程 | 上线抖音 VOC 2 小时课 | 课程大纲 + demo | P1 |
+| 技能缺口 | 将 P0 缺口转为开发任务 | skill backlog | P1 |
+
+### 60 天验收标准
+
+- [ ] 学员能按模板完成 `0.Intake.md`、H1-H8、`3.CollectionMatrix.md`。
+- [ ] 有一套 4 周训练营大纲与作业评审标准。
+- [ ] 至少 3 个单平台课程可售卖:小红书、Amazon、抖音。
+- [ ] 报告 SOP 能支撑内部交付复用。
+- [ ] 审计 checklist 能发现 placeholder、样本不足、证据缺失。
+- [ ] `voc-report-factory` 具备独立上架为高阶包的条件。
+
+## 90 天:形成产品矩阵与企业交付能力
+
+### 核心目标
+
+在 90 天内形成“低价课获客 - 技能包订阅 - 系统训练营 - 企业工作坊 - 年度陪跑”的完整商业链路。
+
+### 关键任务
+
+| 模块 | 任务 | 交付物 | 优先级 |
+|---|---|---|---|
+| 技能市场 | 完成 `voc-core`、`voc-social-data`、`voc-workshop`、`voc-report-factory` 四包说明 | 市场首页、包详情页 | P0 |
+| npm 发布 | 准备 `@voc-market/voc-skills` 包 | package、manifest、install docs | P1 |
+| 课程矩阵 | 完成 5 个单平台课 + 4 周训练营 | 课程销售页与资料包 | P0 |
+| 认证体系 | 设计 Analyst / Builder / Assistant / Consultant 等级 | 认证规则、评分表 | P1 |
+| 企业工作坊 | 打磨 2 天 VOC 虾工作坊销售与交付材料 | 企业 pitch、报价、交付清单 | P0 |
+| 案例资产 | 整理江中/消费品/跨境等案例 | 案例页、样例报告 | P0 |
+| 年度陪跑 | 设计 30-60 万/年服务包 | 月度 VOC 报告模板、例会机制 | P1 |
+
+### 90 天验收标准
+
+- [ ] 技能包、课程、工作坊、陪跑服务有清晰价格梯度。
+- [ ] 每个课程都能映射到具体 skill、数据字段和交付物。
+- [ ] 企业客户能理解 3-10 万/场工作坊与 30-60 万/年陪跑的区别。
+- [ ] 内部团队能按 SOP 在 12-22 小时内完成一份 AI 辅助深度报告。
+- [ ] 至少有 2 个可公开展示的案例报告。
+- [ ] 有一套技能缺口 backlog 和迭代节奏。
+
+## 优先级总表
+
+| 优先级 | 事项 | 原因 |
+|---|---|---|
+| P0 | 小红书纳入 `voc-social-data` | 中文 VOC 课程和案例的核心入口 |
+| P0 | 小红书 2 小时课 | 最快形成付费转化和认知锚点 |
+| P0 | mini report 模板 | 单平台课必须有即时交付物 |
+| P0 | 6 阶段报告 SOP | 企业交付与高阶课的基础 |
+| P0 | audit checklist | 保障报告质量与可交付性 |
+| P0 | 技能-课程-报告映射 | 避免课程与技能脱节 |
+| P1 | Amazon/抖音单平台课 | 扩展课程矩阵和用户面 |
+| P1 | npm 包 | 对开发者和外部生态更友好 |
+| P1 | 认证体系 | 建立助教/顾问供给 |
+| P1 | 年度陪跑包 | 承接企业长期收入 |
+
+## 商业路径设计
+
+| 阶段 | 产品 | 用户心理 | 转化目标 |
+|---|---|---|---|
+| 认知 | 免费案例/公开课 | “原来 VOC 可以这样做” | 留资/进群 |
+| 首购 | 699 元单平台课 | “我也想用自己的产品试一次” | 课程付费 |
+| 复购 | 299 元/月 Skills | “我想持续自己跑数据” | 技能订阅 |
+| 进阶 | 4999 元训练营 | “我想系统掌握并做完整报告” | 高阶课程 |
+| 企业 | 3-10 万工作坊 | “团队需要一起学并产出报告” | 企业项目 |
+| 长期 | 30-60 万/年陪跑 | “需要持续更新和策略复盘” | 年度合同 |
+
+## 风险与应对
+
+| 风险 | 表现 | 应对 |
+|---|---|---|
+| 技能不稳定 | 直播课现场 API 失败 | 准备 demo data 和 dry-run 演示路径 |
+| 安装门槛高 | 学员卡在环境/Token | 课前安装包 + 预飞检查 + 助教值班 |
+| 数据噪声大 | 采集结果离题 | 先用 P0 关键词小样本校验 |
+| 报告质量不一 | 学员产出差距大 | 模板化 mini report + 审计 checklist |
+| 产品名混乱 | openclaw/voc/market 多套说法 | 对外统一叫 VOC Skills,OpenClaw 只是运行平台 |
+| 课程过重 | 2 小时讲不完 | 单平台课只交付 mini report,不讲完整 6 阶段 |
+| 价格承接弱 | 699 后不知道卖什么 | 课尾固定引导 Skills 订阅、系统课、工作坊 |
+
+## 最小可行动清单
+
+如果只能先做 7 件事,建议顺序如下:
+
+1. 修改发布脚本规划,把 `xiaohongshu/` 纳入 `voc-social-data`。
+2. 做小红书 VOC 2 小时课大纲和讲义。
+3. 准备一个真实 demo 数据包。
+4. 做 `Platform VOC Mini Report` 模板。
+5. 将 6 阶段报告 SOP 打包为 `voc-report-factory` 文档。
+6. 整理技能市场 README 的 `VOC Skills` 对外文案。
+7. 建立 P0 skill backlog:matrix builder、normalizer、auditor。
+
+## 前 14 天冲刺拆解
+
+为了避免 30 天计划过大,建议先按 14 天冲刺落地第一版:
+
+| 天数 | 任务 | 完成标准 |
+|---|---|---|
+| Day 1-2 | 确认 `voc-social-data` 发布边界 | 列出要进入套件的小红书、抖音、TikTok、Instagram 技能 |
+| Day 3-4 | 整理小红书 demo 数据 | 至少 3 个关键词、30 篇笔记/评论样本、1 份样例洞察 |
+| Day 5-6 | 完成 2 小时课讲义 | 有逐分钟流程、讲师脚本、学员作业 |
+| Day 7 | 完成 mini report 模板 | 空白模板 + 完成示例各 1 份 |
+| Day 8-9 | 走一遍 dry-run | 不依赖实时 API 也能完整讲完 |
+| Day 10-11 | 完成技能市场文案 | 四个套件介绍、价格、适用人群、安装入口 |
+| Day 12 | 完成课后转化页 | skills 订阅、训练营、工作坊、陪跑四个入口 |
+| Day 13 | 邀请内部试讲 | 记录卡点、耗时、转化问题 |
+| Day 14 | 修订并准备首场对外课 | 可对外招生或灰度交付 |
+
+## 复盘机制
+
+每完成一场课程或一次报告交付,都要记录四类复盘信息:
+
+1. **技能问题**:哪个 skill 不稳定、哪个字段不够、哪个安装步骤卡住。
+2. **课程问题**:哪个环节超时、哪个概念听不懂、哪个模板不好填。
+3. **交付问题**:客户最关心哪类结论、哪些章节证据不够。
+4. **商业问题**:用户是否愿意从 699 元课升级到 skills、训练营、工作坊或陪跑。
+
+## 90 天后的理想状态
+
+- `VOC Skills` 已经不是一堆技能,而是一个可理解的产品。
+- 新用户可以从 699 元单平台课进入。
+- 进阶用户可以购买 299 元/月 skills 或 4999 元训练营。
+- 企业客户可以购买 2 天工作坊或年度陪跑。
+- 内部团队可以用同一套 SOP 稳定产出深度报告。
+- `voc.market` 的“VOC 为先 · 内容为王 · 增长为果”有了技能、课程和交付三条落地路径。

+ 657 - 0
docs/voc-skills-course-plan/06-skill-gap-task-list.md

@@ -0,0 +1,657 @@
+# 06. VOC Skills 技能缺口与任务文档
+
+## 目标
+
+把 `04-skill-support-matrix.md` 中的技能缺口转成可分派、可验收、可排期的任务清单。
+
+本文件重点回答三个问题:
+
+1. 现在到底缺什么技能支持?
+2. 哪些是“已有技能但未发布/未映射”?
+3. 哪些需要新建 skill、script、template 或课程素材?
+
+## 一句话结论
+
+当前不缺 Amazon、抖音、TikTok、Instagram、小红书的基础采集能力;真正缺的是:
+
+- **发布归类缺口**:`xiaohongshu/` 已有源码技能,但还没有进入 `voc-social-data` 发布包。
+- **报告工厂缺口**:采集矩阵、数据归一化、报告审计、章节草稿仍依赖人工。
+- **课程交付缺口**:2 小时课需要 demo 数据包、mini report 模板、dry-run 演示链路。
+- **编排层缺口**:小红书和抖音适合补一层课程友好的 VOC 编排 skill,而不是只暴露原子采集 skill。
+
+## 当前已有能力盘点
+
+| 能力域 | 已有支撑 | 判断 |
+|---|---|---|
+| Amazon 电商 VOC | `voc/` 12 个原子技能 + `review-analysis/` + `competitor-analysis/` + `synthesis/` | 已能支撑 Amazon 评论 VOC 课和工作坊 |
+| 抖音数据 | `douyin-general-search`、`douyin-video-comments`、`douyin-video-detail`、`douyin-comment-replies` 等 | 原子采集可用,缺课程编排和 mini report 输出 |
+| TikTok / Instagram | `social-media/` 原子技能 + `social-voc/` 编排技能 | 已有基础课程支撑 |
+| 小红书数据 | `xiaohongshu-search-notes`、`xiaohongshu-note-detail`、`xiaohongshu-note-comments`、`xiaohongshu-user-info` | 源码已存在,但发布包和课程编排未闭环 |
+| Workshop | `brand-context-builder`、`voc-token-preflight`、6 个 session playbook | 已能支撑企业工作坊 |
+| 报告生成 | `voc-proposal`、`html-report-generator`、历史 v2 renderer 脚本 | 能生成报告,但尚未产品化为报告工厂 |
+| Token / 安装 | `set-voc-token.js`、`voc-token-preflight`、`install-all.js`、`install-workshop.js` | 已有基础设施,需要课程化说明 |
+
+## P0:必须先做的任务
+
+### T01. 将 `social-media` 发布口径升级为 `voc-social-data`
+
+**类型**:发布任务  
+**优先级**:P0  
+**状态**:已落实到发布脚本,待重新打包/上传刷新 CDN 产物  
+**服务目标**:让小红书、抖音、TikTok、Instagram 统一成为社媒 VOC 技能包。
+
+**原问题**:
+
+- `scripts/deploy/upload-skills.js` 中发布包曾仍叫 `social-media`。
+- `scripts/deploy/package-and-upload.js` 中打包列表曾未包含 `xiaohongshu` 技能。
+- 对外文档已经使用 `voc-social-data`,代码发布口径曾未同步。
+
+**处理结果**:
+
+1. 已将市场说明中的 canonical 包名升级为 `voc-social-data`。
+2. 已将 `categories` 增加 `xiaohongshu`。
+3. 已将以下技能加入打包清单:
+   - `xiaohongshu-search-notes`
+   - `xiaohongshu-note-detail`
+   - `xiaohongshu-note-comments`
+   - `xiaohongshu-user-info`
+4. 已保留兼容说明:旧包名 `social-media` 是历史命名,新产品名为 `voc-social-data`。
+
+**验收标准**:
+
+- 技能市场能看到 `voc-social-data` 套件。
+- 小红书 4 个技能出现在该套件安装清单中。
+- README、manifest、课程文档都使用同一套命名。
+
+**实现记录**:
+
+- `scripts/deploy/upload-skills.js` 已将 canonical 发布包改为 `voc-social-data`,并保留 `social-media` 兼容清单。
+- `scripts/deploy/package-and-upload.js` 已将小红书 4 个技能加入社媒数据包,并同时产出 `voc-social-data.zip` 与 `social-media.zip`。
+- `scripts/deploy/deploy-to-openclaw.ps1` 已包含 `xiaohongshu` 分类,源码部署到 `~/.openclaw/skills` 的链路已具备。
+
+### T02. 建立小红书 2 小时课 demo 数据包
+
+**类型**:课程素材任务  
+**优先级**:P0  
+**状态**:已完成 demo 数据包与 mini report 模板/示例  
+**服务目标**:保证小红书课即使 API 不稳定,也能完成现场交付。
+
+**建议内容**:
+
+| 文件 | 用途 |
+|---|---|
+| `demo/xiaohongshu/raw-notes.json` | 小红书笔记样本 |
+| `demo/xiaohongshu/raw-comments.json` | 评论样本 |
+| `demo/xiaohongshu/comments-flat.jsonl` | 课程练习用扁平评论 |
+| `demo/xiaohongshu/mini-report.example.md` | 完成版小报告 |
+| `demo/xiaohongshu/mini-report.template.md` | 学员空白模板 |
+| `demo/xiaohongshu/keywords.template.md` | 关键词矩阵模板 |
+
+**最低样本要求**:
+
+- 至少 3 个关键词。
+- 至少 30 篇笔记或视频内容。
+- 至少 100 条评论或可归纳 VOC 样本。
+- 每条样本保留平台、关键词、原文、互动指标、链接或来源标识。
+
+**验收标准**:
+
+- 不调用 API 也能完整讲完 2 小时课。
+- 学员能基于 demo 数据填完 `Platform VOC Mini Report`。
+- 讲师能用同一数据演示痛点、场景、话术、行动建议。
+
+**实现记录**:
+
+- 已创建 `demo/xiaohongshu/raw-notes.json`,包含 3 个关键词、30 篇课程合成笔记样本。
+- 已创建 `demo/xiaohongshu/raw-comments.json`,包含 30 篇笔记对应的 105 条课程合成评论样本。
+- 已创建 `demo/xiaohongshu/comments-flat.jsonl`,包含 105 行扁平 VOC 原声样本,可直接用于课堂归纳。
+- 已创建 `demo/xiaohongshu/keywords.template.md`,用于课前关键词矩阵拆解。
+- 已创建 `demo/xiaohongshu/mini-report.template.md` 与 `demo/xiaohongshu/mini-report.example.md`,支持学员填报和讲师演示。
+- 数据文件均标注为课程合成样例,不代表真实平台抓取结果。
+
+### T03. 建立 `voc-report-factory` 模板包
+
+**类型**:文档/模板任务  
+**优先级**:P0  
+**状态**:已完成 Markdown 模板包初版  
+**服务目标**:先不开发复杂 skill,也能让报告工厂开始交付。
+
+**建议文件**:
+
+| 文件 | 作用 |
+|---|---|
+| `0.Intake.template.md` | 需求摄入 |
+| `1.Hypothesis.template.md` | H1-H8 假设 |
+| `2.ReportOutline.template.md` | 报告章节结构 |
+| `3.CollectionMatrix.template.md` | 采集矩阵 |
+| `4.CollectionExecutionSummary.template.md` | 采集执行汇报 |
+| `raw-schema.md` | `_merged.json` / `comments-flat.jsonl` 字段标准 |
+| `report-quality-audit.md` | 报告审计 checklist |
+| `delivery-readme.template.md` | 客户交付说明 |
+
+**验收标准**:
+
+- 学员或交付同学可以按模板跑完 6 阶段流程。
+- 每个模板都有输入、输出、完成标准。
+- 模板能被系统训练营 Week 1-4 直接引用。
+
+**实现记录**:
+
+- 已创建 `voc-report-factory/README.md`,说明模板包用途、文件清单、使用顺序和单项目完成定义。
+- 已创建 `voc-report-factory/0.Intake.template.md`,用于项目需求摄入、边界确认和交付物定义。
+- 已创建 `voc-report-factory/1.Hypothesis.template.md`,用于 H1-H8 假设拆解、验证标准和反证信号定义。
+- 已创建 `voc-report-factory/2.ReportOutline.template.md`,覆盖轻量 4 章版和企业 6-7 章版报告结构。
+- 已创建 `voc-report-factory/3.CollectionMatrix.template.md`,覆盖平台、关键词、批次、样本量、假设标签和风险字段。
+- 已创建 `voc-report-factory/4.CollectionExecutionSummary.template.md`,用于记录样本量、H1-H8 覆盖、异常处理和补采建议。
+- 已创建 `voc-report-factory/raw-schema.md`,定义 `_merged.json` 与 `comments-flat.jsonl` 必备字段和审计规则。
+- 已创建 `voc-report-factory/report-quality-audit.md`,覆盖 placeholder、样本量、证据回溯、章节质量和行动建议审计。
+- 已创建 `voc-report-factory/delivery-readme.template.md`,用于客户交付包说明、数据口径、证据回溯和复跑方式。
+
+### T04. 实现 `voc-data-normalizer`
+
+**类型**:script / skill 任务  
+**优先级**:P0  
+**状态**:已完成最小可用脚本,小红书 demo 已验证  
+**服务目标**:把多平台原始结果统一成报告可用数据。
+
+**输入**:
+
+- 小红书 notes/comments。
+- 抖音 videos/comments。
+- Amazon reviews/products。
+- TikTok/Instagram posts/comments。
+- `3.CollectionMatrix.md` 或 `collection-matrix.json`。
+
+**输出**:
+
+| 输出 | 说明 |
+|---|---|
+| `_merged.json` | 按平台、关键词、批次聚合后的结构化数据 |
+| `comments-flat.jsonl` | 一行一条 VOC 原声,方便分析和审计 |
+| `normalizer-audit.json` | 去重、字段缺失、平台分布、异常样本统计 |
+
+**核心字段**:
+
+```text
+id
+platform
+sourceType
+keyword
+batch
+hypothesisTags[]
+author
+content
+likeCount
+commentCount
+publishTime
+url
+productId
+brand
+competitor
+sentiment
+raw
+```
+
+**验收标准**:
+
+- 能处理小红书、抖音、Amazon 至少 3 类数据。
+- 输出样本量与输入样本量差异可解释。
+- 去重逻辑可复核。
+- 报告封面数字能从 `_merged.json` 直接读取。
+
+**实现记录**:
+
+- 已创建 `scripts/tools/voc-data-normalizer.js`,使用 CommonJS,无新增依赖。
+- 支持命令行参数:`--input <raw-dir>`、`--output <out-dir>`、`--project <name>`、`--category <name>`。
+- 输出 `_merged.json`、`comments-flat.jsonl`、`normalizer-audit.json` 三类文件。
+- 已内置小红书 notes/comments、抖音 videos/comments、Amazon reviews/products 的最小字段映射。
+- 已实现基础去重、空正文剔除、必填字段缺失统计和 source 文件审计。
+- 已默认跳过输入目录中的既有 `_merged.json`、`comments-flat.jsonl`、`normalizer-audit.json`,避免重复归一化输出文件。
+- 已用 `demo/xiaohongshu/raw-notes.json` 与 `demo/xiaohongshu/raw-comments.json` 验证通过,输出到 `demo/xiaohongshu/normalized/`。
+- 验证结果:30 个 item、105 条有效 VOC、重复数 0、字段缺失 0、错误 0。
+- 抖音与 Amazon 映射已按现有 `api-config.json` 字段实现,后续需要用真实采集样本做回归验证。
+
+### T05. 实现 `voc-report-auditor`
+
+**类型**:script / skill 任务  
+**优先级**:P0  
+**状态**:已完成最小可用脚本,小红书 demo 审计通过  
+**服务目标**:让企业报告交付前有硬性质量闸门。
+
+**输入**:
+
+- HTML 或 Markdown 报告。
+- `_merged.json`。
+- `comments-flat.jsonl`。
+- `3.CollectionMatrix.md` 或 `collection-matrix.json`。
+
+**检查项**:
+
+| 检查项 | 失败表现 |
+|---|---|
+| placeholder 检查 | 出现 `TODO`、`placeholder`、空章节 |
+| 样本量一致性 | 封面、正文、数据文件数字不一致 |
+| H1-H8 覆盖 | 假设没有证据或状态 |
+| 证据回溯 | 结论没有 VOC 原声或来源 |
+| 平台分布 | 平台缺失、批次缺失、关键词缺失 |
+| HTML 完整性 | 图表、章节、目录、样式缺失 |
+| 行动建议 | 没有 P0/P1/P2 或验证方式 |
+
+**输出**:
+
+- `audit-report.md`
+- `audit-result.json`
+- `pass / warn / fail` 状态
+
+**验收标准**:
+
+- 能发现明显 placeholder。
+- 能发现样本量不一致。
+- 能列出缺证据章节。
+- 失败项能给出修复建议。
+
+**实现记录**:
+
+- 已创建 `scripts/tools/voc-report-auditor.js`,使用 CommonJS,无新增依赖。
+- 支持命令行参数:`--report <report.md|html>`、`--merged <_merged.json>`、`--comments <comments-flat.jsonl>`、`--matrix <matrix.md|json>`、`--output <out-dir>`。
+- 输出 `audit-result.json` 与 `audit-report.md`。
+- 已实现 `pass / warn / fail` 三态结果。
+- 已覆盖 placeholder、空章节、样本量一致性、H1-H8 覆盖、证据回溯、平台/关键词/批次分布、字段完整性、行动建议和风险边界检查。
+- 已修正 Markdown 父章节下直接进入子章节时被误判为空章节的问题。
+- 已用 `demo/xiaohongshu/mini-report.example.md`、`demo/xiaohongshu/normalized/_merged.json` 与 `demo/xiaohongshu/normalized/comments-flat.jsonl` 验证通过。
+- 已将审计输出写入 `demo/xiaohongshu/audit/`,结果为 `pass`,失败项 0、警告项 0。
+
+## P1:第二阶段开发任务
+
+### T06. 实现 `collection-matrix-builder`
+
+**类型**:template-first / skill-later 任务  
+**优先级**:P1  
+**状态**:已完成最小可用脚本,小红书 demo 矩阵已验证  
+**服务目标**:把业务问题和 H1-H8 假设转成可执行采集计划。
+
+**输入**:
+
+- `0.Intake.md`
+- H1-H8 假设
+- 目标平台
+- 品类、竞品、场景词
+
+**输出**:
+
+- `3.CollectionMatrix.md`
+- `collection-matrix.json`
+
+**验收标准**:
+
+- 每个假设至少有 3 个关键词支撑。
+- 每个关键词有 platform、batch、targetCount、hypothesisTags。
+- 支持 P0/P1/P2 批次设计。
+
+**实现记录**:
+
+- 已创建 `scripts/tools/collection-matrix-builder.js`,使用 CommonJS,无新增依赖。
+- 支持从 Markdown 关键词表或 JSON 输入生成采集矩阵。
+- 支持命令行参数:`--keywords <keywords.md|json>`、`--keyword <kw1,kw2>`、`--output <out-dir>`、`--project <name>`、`--category <name>`、`--platform <name>`、`--target <count>`、`--question <text>`。
+- 输出 `3.CollectionMatrix.md` 与 `collection-matrix.json`。
+- 已实现 `--expand-hypotheses` 显式扩展模式,可按 H1-H8 模板补齐到每个假设至少 3 个关键词。
+- 已实现矩阵审计,检查 H1-H8 覆盖数、platform、batch、targetCount、hypothesisTags 等必填字段。
+- 已用 `demo/xiaohongshu/keywords.template.md` 验证通过,输出到 `demo/xiaohongshu/matrix/`。
+- 验证结果:18 个关键词、targetCount 180、H1-H8 每个至少 3 个关键词、warnings 0。
+
+### T07. 实现 `hypothesis-generator`
+
+**类型**:prompt / skill 任务  
+**优先级**:P1  
+**状态**:已完成最小可用脚本,小红书 demo 假设生成与矩阵联动已验证  
+**服务目标**:降低新学员做 H1-H8 的门槛。
+
+**输入**:
+
+- 品牌/产品 brief。
+- 决策问题。
+- 目标用户与渠道。
+- 已知竞品。
+
+**输出**:
+
+- H1-H8 假设表。
+- 每条假设的验证问题。
+- 每条假设建议采集的平台和关键词方向。
+
+**验收标准**:
+
+- 假设不只是泛泛问题,而能指导采集。
+- 输出能直接喂给 `collection-matrix-builder`。
+- 支持轻量 4 章报告和企业 6-7 章报告两种粒度。
+
+**实现记录**:
+
+- 已创建 `scripts/tools/hypothesis-generator.js`,使用 CommonJS,无新增依赖。
+- 支持命令行参数:`--output <out-dir>`、`--category <name>`、`--brand <name>`、`--product <name>`、`--question <text>`、`--audience <text>`、`--channels <list>`、`--competitors <list>`、`--granularity light|enterprise`、`--brief <brief.md|json>`。
+- 输出 `1.Hypothesis.md` 与 `hypothesis.json`。
+- 已生成 H1-H8 假设表、每条假设的核心问题、假设表述、用户表达、推荐平台、关键词方向、证据标准、反证信号和报告章节映射。
+- `hypothesis.json` 中的 `keywords` 数组可直接作为 `collection-matrix-builder` 输入。
+- 已用小红书冻干益生菌 demo 验证通过,输出到 `demo/xiaohongshu/hypothesis/`。
+- 验证结果:8 条 H1-H8 假设、24 个关键词方向。
+- 已用 `demo/xiaohongshu/hypothesis/hypothesis.json` 驱动 `collection-matrix-builder` 生成矩阵,输出到 `demo/xiaohongshu/hypothesis-matrix/`。
+- 联动验证结果:24 个关键词、targetCount 240、warnings 0。
+
+### T08. 实现小红书 VOC 编排 skill
+
+**建议命名**:`xiaohongshu-category-voc` 或 `xiaohongshu-mini-voc`  
+**类型**:orchestration skill 任务  
+**优先级**:P1  
+**状态**:已完成最小编排 skill 配置与文档  
+**服务目标**:让 2 小时课不用手动串 3-4 个原子技能。
+
+**调用底层技能**:
+
+- `xiaohongshu-search-notes`
+- `xiaohongshu-note-detail`
+- `xiaohongshu-note-comments`
+- `xiaohongshu-user-info` 可选
+
+**输出字段**:
+
+```text
+keywords[]
+notes[]
+comments[]
+topPainPoints[]
+topScenarios[]
+contentHooks[]
+competitorSignals[]
+actionItems[]
+```
+
+**验收标准**:
+
+- 输入 3-5 个关键词即可输出一份 mini VOC summary。
+- 能服务小红书 2 小时课。
+- 输出可直接填入 `Platform VOC Mini Report`。
+
+**实现记录**:
+
+- 已创建 `xiaohongshu/xiaohongshu-mini-voc/api-config.json`。
+- 已创建 `xiaohongshu/xiaohongshu-mini-voc/SKILL.md`。
+- 编排底层技能:`xiaohongshu-search-notes`、`xiaohongshu-note-detail`、`xiaohongshu-note-comments`,以及可选 `xiaohongshu-user-info`。
+- 支持输入 `keywords`、`keywordMatrix`、`notesPerKeyword`、`maxCommentPages`、`sort`、`note_type`、`batch`、`hypothesisTags`、`includeUserInfo`。
+- 定义输出 `metadata`、`notes`、`commentsByNote`、`commentsFlat`、`keywordStats`、`audit`,字段可进入 `voc-data-normalizer`。
+- 已在 `scripts/deploy/package-and-upload.js` 的 `voc-social-data` 套件中加入 `xiaohongshu-mini-voc`。
+- 已完成 JSON 解析校验与部署/上传脚本语法校验。
+- 说明:当前版本为编排配置与执行规范,真实 API 串行执行由 OpenClaw orchestration runtime 承接。
+
+### T09. 实现抖音 VOC 编排 skill
+
+**建议命名**:`douyin-content-voc` 或 `douyin-mini-voc`  
+**类型**:orchestration skill 任务  
+**优先级**:P1  
+**状态**:已完成最小编排 skill 配置与文档  
+**服务目标**:把抖音搜索、视频详情、评论采集、爆点分析串成课程流程。
+
+**调用底层技能**:
+
+- `douyin-general-search`
+- `douyin-video-detail`
+- `douyin-video-comments`
+- `douyin-comment-replies`
+- `douyin-hashtag-search` 可选
+
+**输出字段**:
+
+```text
+videos[]
+comments[]
+contentSignals[]
+audienceQuestions[]
+hookPatterns[]
+contentActions[]
+```
+
+**验收标准**:
+
+- 能从关键词生成视频样本与评论样本。
+- 能输出 5-8 条内容洞察。
+- 能支撑抖音 2 小时课的 mini report。
+
+**实现记录**:
+
+- 已创建 `douyin/douyin-mini-voc/api-config.json`。
+- 已创建 `douyin/douyin-mini-voc/SKILL.md`。
+- 编排底层技能:`douyin-general-search`、`douyin-video-detail`、`douyin-video-comments`、`douyin-comment-replies`,以及可选 `douyin-hashtag-search`。
+- 支持输入 `keywords`、`keywordMatrix`、`videosPerKeyword`、`commentsPerVideo`、`maxCommentPages`、`includeReplies`、`repliesPerVideo`、`includeHashtags`、`sort_type`、`publish_time`、`filter_duration`、`content_type`、`batch`、`hypothesisTags`。
+- 定义输出 `metadata`、`videos`、`comments`、`replies`、`hashtags`、`contentSignals`、`audienceQuestions`、`hookPatterns`、`contentActions`、`audit`。
+- 已继承抖音数据网关 `vocToken` 配置、余额不足提示和 unauthorized 错误处理规范。
+- 已在 `scripts/deploy/package-and-upload.js` 的 `voc-social-data` 套件中加入 `douyin-mini-voc`。
+- 已完成 JSON 解析校验与部署/上传脚本语法校验。
+- 说明:当前版本为编排配置与执行规范,真实 API 串行执行由 OpenClaw orchestration runtime 承接。
+
+### T10. 抽象 v2 HTML 报告组件库
+
+**类型**:script/template 任务  
+**优先级**:P1  
+**状态**:已完成最小 HTML v2 组件库、模板与 demo 报告验证  
+**服务目标**:把江中报告验证过的 v2 renderer 模式产品化。
+
+**建议产物**:
+
+| 产物 | 说明 |
+|---|---|
+| `report-components.js` | 通用组件:标题、VOC 卡片、矩阵、柱图、行动列表 |
+| `report-renderer-template.js` | CHAPTERS + buildHTML 标准模板 |
+| `chapter-module-template.js` | 每章独立模块模板 |
+| `gen-report-template.js` | 生成入口模板 |
+
+**验收标准**:
+
+- 新报告不用从旧报告复制大段代码。
+- 支持按章拆分,避免单文件过大。
+- 能生成至少一份 demo HTML 报告。
+
+**实现记录**:
+
+- 已创建 `voc-report-factory/html-v2/report-components.js`,提供通用组件:封面、章节标题、指标卡、洞察卡、VOC 卡片、VOC 网格、柱图、对比表、2x2 矩阵、行动列表、证据表与完整 HTML 外壳。
+- 已创建 `voc-report-factory/html-v2/report-renderer-template.js`,提供 `CHAPTERS`、`SLIDE_RENDERERS`、`DEFAULT_REPORT_DATA`、`validateReportData()` 与 `buildHTML()` 标准模式。
+- 已创建 `voc-report-factory/html-v2/chapter-module-template.js`,提供按章拆分的 intro/evidence/analysis/action 模块模板。
+- 已创建 `voc-report-factory/html-v2/gen-report-template.js`,支持 `--output <report.html>` 与可选 `--data <report-data.json>` 生成 HTML。
+- 已在 `voc-report-factory/README.md` 中加入 `html-v2/` 文件清单与使用顺序。
+- 已生成 demo 报告:`demo/report-factory/html-v2-demo-report.html`。
+- 验证结果:4 个 JS 文件均通过 `node --check`;demo HTML 生成成功;未发现 `{{placeholder}}`、`Coming Soon`、`TODO`、`待填` 等未完成标记。
+
+## P2:增强任务
+
+### T11. 实现 `chapter-insight-writer`
+
+**类型**:AI writing / orchestration 任务  
+**优先级**:P2
+**状态**:已完成最小证据驱动章节草稿生成脚本  
+
+**作用**:基于 stage output、VOC evidence、hypothesis status,生成章节草稿。
+
+**验收标准**:
+
+- 每节至少包含结论、证据、解释、行动建议。
+- 不允许无证据结论。
+- 输出可由人工编辑进入 HTML renderer。
+
+**实现记录**:
+
+- 已创建 `scripts/tools/chapter-insight-writer.js`。
+- 支持输入 normalized 目录、`_merged.json` 或 `comments-flat.jsonl`。
+- 支持 `--version light|enterprise`、`--min-evidence`、`--evidence-limit`、`--project`、`--category`。
+- 输出 `chapter-insights.md` 与 `chapter-insights.json`。
+- 按章节映射 H1-H8,聚合 theme、keyword、platform、batch,并挑选可追溯 VOC 证据卡。
+- 每章包含章节目标、对应假设、证据量、章节结论、业务解释、行动建议、警告和 VOC 证据卡。
+- 已用 `demo/xiaohongshu/normalized` 验证,输出到 `demo/xiaohongshu/chapter-insights/`。
+- 验证结果:4 章、20 张证据卡、warnings 0、unsupportedConclusionCount 0。
+
+### T12. 实现 `platform-mini-report-generator`
+
+**类型**:课程交付任务  
+**优先级**:P2
+**状态**:已完成 Markdown 优先的单平台 mini report 生成脚本  
+
+**作用**:把单平台课程输出自动填入 `Platform VOC Mini Report`。
+
+**支持平台**:
+
+- 小红书
+- 抖音
+- Amazon
+- TikTok
+- Instagram
+
+**验收标准**:
+
+- 课程结束前 5 分钟能生成可展示小报告。
+- 支持 Markdown 优先,HTML 可后置。
+
+**实现记录**:
+
+- 已创建 `scripts/tools/platform-mini-report-generator.js`。
+- 支持输入 normalized 目录、`_merged.json` 或 `comments-flat.jsonl`。
+- 支持 `--platform xiaohongshu|douyin|amazon|tiktok|instagram`、`--project`、`--category`、`--data-nature`、`--owner`、`--date`。
+- 输出 `platform-mini-report.md` 与 `platform-mini-report.json`。
+- 自动填充报告信息、一句话结论、数据概况、H1-H8 假设覆盖、高频主题聚类、VOC 原声证据卡、产品/内容机会、平台内容建议、风险边界和结课行动清单。
+- 已用 `demo/xiaohongshu/normalized` 验证,输出到 `demo/xiaohongshu/platform-mini-report/`。
+- 验证结果:105 条 VOC、6 张证据卡、warnings 0、uncoveredHypothesisCount 0、hasTraceableEvidence true。
+
+### T13. 建立技能调用示例库
+
+**类型**:文档/课程任务  
+**优先级**:P2
+**状态**:已完成核心 skill 调用示例库初版  
+
+**作用**:每个核心 skill 提供一组可复制调用示例。
+
+**建议目录**:
+
+```text
+docs/voc-skills-course-plan/examples/
+  amazon-review-voc/
+  xiaohongshu-mini-voc/
+  douyin-content-voc/
+  tiktok-instagram-trend/
+  report-factory-demo/
+```
+
+**验收标准**:
+
+- 每个示例包含输入、输出、常见错误、课堂讲解点。
+- 助教可以按示例独立带练。
+
+**实现记录**:
+
+- 已创建 `docs/voc-skills-course-plan/examples/README.md` 作为示例库入口。
+- 已创建 `docs/voc-skills-course-plan/examples/amazon-review-voc/README.md`,映射真实 skill `voc/product-reviews-query`。
+- 已创建 `docs/voc-skills-course-plan/examples/xiaohongshu-mini-voc/README.md`,映射真实 skill `xiaohongshu/xiaohongshu-mini-voc`。
+- 已创建 `docs/voc-skills-course-plan/examples/douyin-content-voc/README.md`,映射真实 skill `douyin/douyin-mini-voc`。
+- 已创建 `docs/voc-skills-course-plan/examples/tiktok-instagram-trend/README.md`,映射 `social-voc/tiktok-category-voc`、`social-voc/instagram-brand-voc`、`social-voc/social-trend-analysis`。
+- 已创建 `docs/voc-skills-course-plan/examples/report-factory-demo/README.md`,覆盖 `chapter-insight-writer`、`platform-mini-report-generator` 和 HTML v2 demo 生成链路。
+- T15 已追加 `docs/voc-skills-course-plan/examples/openclaw-single-platform-report/README.md`,作为 OpenClaw 用户课总入口示例。
+- 验证结果:示例 README 均存在;示例文档未发现 `TODO`、`待填` 等占位;引用的 skill config 和本地脚本路径均存在。
+
+### T14. 打通 T11/T12 JSON 到 HTML v2 报告
+
+**类型**:report rendering / integration 任务  
+**优先级**:P2  
+**状态**:已完成 HTML v2 自动适配链路  
+
+**作用**:让 `platform-mini-report.json` 与 `chapter-insights.json` 可直接进入 HTML v2 renderer,形成 Markdown 初稿到 HTML 展示稿的闭环。
+
+**验收标准**:
+
+- `gen-report-template.js` 保持兼容原生 HTML v2 demo data。
+- `platform-mini-report.json` 可直接生成 HTML。
+- `chapter-insights.json` 可直接生成 HTML。
+- 生成结果无 `TODO`、`待填`、`Coming Soon`、`placeholder` 等未完成标记。
+
+**实现记录**:
+
+- 已在 `voc-report-factory/html-v2/report-renderer-template.js` 中新增 `adaptReportData`、`adaptPlatformMiniReport`、`adaptChapterInsights`。
+- 已更新 `voc-report-factory/html-v2/gen-report-template.js`,支持 `--data report-data.json|platform-mini-report.json|chapter-insights.json`。
+- 已更新 `voc-report-factory/README.md` 与 `docs/voc-skills-course-plan/examples/report-factory-demo/README.md` 的 HTML v2 使用示例。
+- 已生成并验证 `demo/report-factory/html-v2-demo-report.html`。
+- 已生成并验证 `demo/xiaohongshu/platform-mini-report/platform-mini-report.html`。
+- 已生成并验证 `demo/xiaohongshu/chapter-insights/chapter-insights.html`。
+
+### T15. OpenClaw 单平台 VOC 课程总入口与教学手册
+
+**类型**:课程产品化 / OpenClaw skill 编排规范  
+**优先级**:P0  
+**状态**:已完成课程主文档与总入口 skill 规范  
+
+**作用**:把 2 小时单平台 VOC 课从“本地脚本/内部 SOP”调整为“OpenClaw 用户调用技能生成 VOC 洞察报告”的课程主线。
+
+**验收标准**:
+
+- 有一份讲师录课可直接使用的总教学手册。
+- 有一份 OpenClaw 单平台课程详细流程和讲稿。
+- 有一份 OpenClaw VOC 技能链路图,明确总入口、平台采集、报告生成和审计关系。
+- 新增 `voc/voc-single-platform-report` 作为用户侧总入口 skill 规范。
+- 示例库中有 `openclaw-single-platform-report/` 调用示例。
+- 课程总览、课程体系、技能支撑矩阵均指向 OpenClaw 用户主线,而不是本地脚本主线。
+
+**实现记录**:
+
+- 已新增 `docs/voc-skills-course-plan/openclaw-single-platform-voc-teaching-manual.md`,作为录课和教学总入口。
+- 已新增 `docs/voc-skills-course-plan/07-openclaw-single-platform-course.md`,覆盖课程定位、标准输入、录课讲稿、课堂流程和讲师检查清单。
+- 已新增 `docs/voc-skills-course-plan/openclaw-voc-skill-map.md`,定义 `voc/voc-single-platform-report` 总链路。
+- 已新增 `docs/voc-skills-course-plan/examples/openclaw-single-platform-report/README.md`,提供 OpenClaw 用户课标准输入和演示步骤。
+- 已新增 `voc/voc-single-platform-report/SKILL.md` 与 `voc/voc-single-platform-report/api-config.json`,定义课程总入口 skill。
+- 已将 `voc-single-platform-report` 加入 `scripts/deploy/package-and-upload.js` 的 `voc-core` 打包清单。
+- 已更新 `docs/voc-skills-course-plan/README.md`、`03-course-system.md`、`04-skill-support-matrix.md` 与 `examples/README.md`,统一口径为 OpenClaw 用户技能课。
+
+## 不建议现在做的任务
+
+| 任务 | 暂缓原因 |
+|---|---|
+| 一次性开发完整自动报告 Agent | 当前最缺的是 SOP、schema、审计,不是全自动 |
+| 重写所有已有采集 skill | 原子采集能力已基本齐全,先补发布和编排 |
+| 过早做复杂 BI 看板 | 课程和报告交付优先,BI 可在 90 天后再做 |
+| 每个平台都做独立 HTML 报告生成器 | 先用统一 mini report 模板,避免维护成本过高 |
+
+## 任务依赖关系
+
+```text
+T01 发布归类
+  ↓
+T02 小红书 demo 数据包
+  ↓
+T08 小红书编排 skill
+  ↓
+小红书 2 小时课可售卖
+
+T03 report-factory 模板包
+  ↓
+T04 voc-data-normalizer
+  ↓
+T05 voc-report-auditor
+  ↓
+系统训练营 / 企业报告交付可复制
+
+T06 collection-matrix-builder
+  ↓
+T07 hypothesis-generator
+  ↓
+训练营 Week 1-2 自动化增强
+```
+
+## 30 天内建议只做这 5 件事
+
+1. **T01**:把 `xiaohongshu/` 纳入 `voc-social-data` 发布包。
+2. **T02**:完成小红书 2 小时课 demo 数据包。
+3. **T03**:完成 `voc-report-factory` 模板包。
+4. **T04**:先做 `voc-data-normalizer` 的 script 版本。
+5. **T05**:先做 `voc-report-auditor` 的 placeholder / 样本量 / 证据检查版本。
+
+## 与既有文档的对应关系
+
+| 文档 | 本文件如何承接 |
+|---|---|
+| `01-skill-productization.md` | 将套件发布缺口转成 T01 |
+| `02-standard-report-workflow.md` | 将报告工厂模板、normalizer、auditor 转成 T03-T05 |
+| `03-course-system.md` | 将 2 小时课兜底素材和 mini report 转成 T02、T12 |
+| `04-skill-support-matrix.md` | 将技能支撑缺口转成 T01-T13 |
+| `05-execution-roadmap.md` | 将 30/60/90 天路线细化为可派发任务 |

+ 342 - 0
docs/voc-skills-course-plan/07-openclaw-single-platform-course.md

@@ -0,0 +1,342 @@
+# 07. OpenClaw 单平台 VOC 洞察课教学手册
+
+> 课程定位:面向 OpenClaw 用户,教会学员在 OpenClaw 中调用 VOC Skills,完成一次单平台 VOC 洞察报告,而不是教学员在本地写脚本或理解内部开发链路。
+
+## 1. 课程一句话
+
+用 OpenClaw 的 VOC Skills,从一个品类和 3-5 个关键词出发,完成单平台 VOC 数据采集、用户原声归纳、机会判断和报告生成。
+
+## 2. 适用对象
+
+- 已安装或准备安装 OpenClaw 的用户。
+- 运营、产品、内容、电商、品牌负责人。
+- 想用小红书、抖音、Amazon、TikTok、Instagram 等平台做轻量 VOC 洞察的人。
+- 不要求会写代码,但需要能理解品类、关键词和业务问题。
+
+## 3. 本课不讲什么
+
+- 不讲本地 Node.js 脚本开发。
+- 不讲完整企业级多平台深度报告。
+- 不讲爬虫原理和 API 实现细节。
+- 不把用户原声直接包装成医学、功效或全市场结论。
+
+## 4. 课上最终成果
+
+学员完成课程后应拿到以下成果:
+
+| 成果 | 说明 |
+|---|---|
+| 单平台 VOC 数据包 | 平台内容样本、评论样本、关键词统计和采集审计 |
+| VOC 洞察报告 | Markdown 或 OpenClaw 可展示的报告正文 |
+| VOC 证据卡 | 能回到平台、关键词、批次和原声 ID 的证据 |
+| 机会判断 | 高频主题、产品/内容机会和风险边界 |
+| 行动清单 | P0/P1/P2 下一步动作和验证指标 |
+| 可选 HTML 报告 | 课程展示或交付演示用 HTML v2 报告 |
+
+## 5. 推荐课程主线
+
+录课时建议把课程分成 7 段:
+
+| 段落 | 标题 | 学员动作 | 讲师重点 |
+|---|---|---|---|
+| 1 | 今天要生成什么 | 看最终报告样例 | 明确不是学代码,而是用 OpenClaw 生成洞察 |
+| 2 | 准备品类和关键词 | 输入品类、平台、关键词 | 关键词决定数据质量 |
+| 3 | 调用平台采集技能 | 运行单平台 mini VOC skill | 看样本量、失败请求和数据边界 |
+| 4 | 生成 VOC 洞察 | 调用单平台报告技能 | 看主题、证据卡、机会点 |
+| 5 | 读懂报告 | 对照原声解释结论 | 结论必须能回到 VOC 原声 |
+| 6 | 导出与审计 | 生成 Markdown/HTML,检查质量 | 低样本只写阶段性信号 |
+| 7 | 换成自己的品类 | 替换关键词复跑 | 形成个人 SOP |
+
+## 6. 课前准备
+
+### 6.1 学员准备
+
+学员需要准备:
+
+- OpenClaw 已安装并可打开。
+- 已安装 VOC 相关技能包。
+- 已完成 Token 或数据服务权限配置。
+- 一个想分析的品类或产品方向。
+- 3-5 个关键词。
+
+### 6.2 讲师准备
+
+讲师需要准备:
+
+- 一份已跑通的课程样例报告。
+- 一份小红书课程样例数据,防止真实 API 不稳定。
+- 一套标准输入 JSON 或表单参数。
+- 一份“结果怎么看”的讲解脚本。
+
+课程样例可使用:
+
+```text
+demo/xiaohongshu/platform-mini-report/platform-mini-report.html
+```
+
+## 7. 标准课堂输入
+
+建议所有学员先用统一输入跑通,再换自己的品类。
+
+```json
+{
+  "project": "openclaw-voc-course-demo",
+  "platform": "xiaohongshu",
+  "category": "冻干益生菌",
+  "businessQuestion": "用户为什么会关注冻干益生菌,当前内容和产品机会在哪里?",
+  "keywords": [
+    "儿童益生菌怎么选",
+    "益生菌腹胀便秘",
+    "冻干益生菌测评"
+  ],
+  "sampleMode": true,
+  "outputFormat": "both"
+}
+```
+
+## 8. OpenClaw 技能调用主线
+
+### 8.1 课程理想链路
+
+```text
+voc/voc-single-platform-report
+  → token / 权限预检
+  → xiaohongshu/xiaohongshu-mini-voc 或 douyin/douyin-mini-voc
+  → VOC 数据归一化
+  → 单平台 mini report 生成
+  → HTML v2 报告生成
+  → 报告质量审计
+  → 返回报告和下一步建议
+```
+
+### 8.2 当前可用能力
+
+当前仓库已经具备底层能力:
+
+- 小红书采集编排:`xiaohongshu/xiaohongshu-mini-voc`
+- 抖音采集编排:`douyin/douyin-mini-voc`
+- 本地归一化脚本:`scripts/tools/voc-data-normalizer.js`
+- 本地单平台报告脚本:`scripts/tools/platform-mini-report-generator.js`
+- 本地章节草稿脚本:`scripts/tools/chapter-insight-writer.js`
+- 本地 HTML v2 生成入口:`voc-report-factory/html-v2/gen-report-template.js`
+
+### 8.3 当前缺口
+
+对 OpenClaw 用户来说,课程总入口规范已新增:
+
+```text
+voc/voc-single-platform-report
+```
+
+下一步需要把归一化、报告生成、HTML 渲染和审计包装成可执行层,让这个总入口真正完成无脚本用户体验。
+
+## 9. 讲师逐段讲稿
+
+### 第 1 段:展示最终成果
+
+讲师打开最终 HTML 报告,告诉学员:
+
+- 今天的目标不是“抓一堆数据”。
+- 今天的目标是得到一份能辅助决策的 VOC 洞察报告。
+- 每条关键判断都必须能回到用户原声。
+
+推荐展示:
+
+```text
+demo/xiaohongshu/platform-mini-report/platform-mini-report.html
+```
+
+### 第 2 段:解释最小输入
+
+讲师说明只需要 4 类输入:
+
+| 输入 | 例子 | 作用 |
+|---|---|---|
+| 平台 | 小红书 | 决定采集技能和报告语境 |
+| 品类 | 冻干益生菌 | 决定报告主题 |
+| 关键词 | 儿童益生菌怎么选 | 决定样本入口 |
+| 业务问题 | 用户为什么关注这个品类 | 决定报告解释方向 |
+
+### 第 3 段:调用平台 VOC 采集
+
+如果使用小红书,调用:
+
+```text
+xiaohongshu/xiaohongshu-mini-voc
+```
+
+如果使用抖音,调用:
+
+```text
+douyin/douyin-mini-voc
+```
+
+讲师重点提醒:
+
+- 样本量不足时不能做全市场判断。
+- 搜索结果可能有平台噪声。
+- 关键词不要只写品牌词,要包含痛点词、场景词、竞品词。
+
+### 第 4 段:生成单平台 VOC 洞察
+
+理想情况下调用:
+
+```text
+voc/voc-single-platform-report
+```
+
+该技能应输出:
+
+- 一句话结论
+- 数据概况
+- H1-H8 覆盖速查
+- 高频主题聚类
+- VOC 原声证据卡
+- 产品/内容机会
+- 风险与边界
+- 行动清单
+
+### 第 5 段:带学员读懂报告
+
+讲师不要只展示漂亮页面,要逐项解释:
+
+| 报告模块 | 教学重点 |
+|---|---|
+| 样本量 | 这份报告能支持多大范围的判断 |
+| 高频主题 | 用户在反复说什么 |
+| 原声证据卡 | 哪句话支撑哪个判断 |
+| 机会点 | 如何从声音转成产品或内容动作 |
+| 风险边界 | 哪些结论不能写过头 |
+| 行动清单 | 课后第一周怎么验证 |
+
+### 第 6 段:导出与审计
+
+讲师提醒学员交付前检查:
+
+- 是否有足够 VOC 原声。
+- 是否有来源、关键词、批次和 ID。
+- 是否出现空结论或占位文本。
+- 是否把用户感受写成未经验证的医学或功效结论。
+- 是否给出下一步验证动作。
+
+### 第 7 段:换成自己的品类
+
+学员课后复用步骤:
+
+1. 换成自己的品类。
+2. 写 3-5 个关键词。
+3. 先用一个平台跑小样本。
+4. 看报告中的主题和证据。
+5. 补充关键词或换平台复跑。
+6. 把行动清单改成自己的业务动作。
+
+## 10. 录课脚本建议
+
+### 开场 3 分钟
+
+今天我们用 OpenClaw 完成一份单平台 VOC 洞察报告。你不需要写代码,只需要准备平台、品类、关键词和想回答的问题。OpenClaw 会帮你调用对应技能,采集用户声音,并生成一份可追溯的 VOC 报告。
+
+### 方法讲解 10 分钟
+
+VOC 洞察报告不是数据截图,它至少要回答三件事:
+
+- 用户到底在说什么。
+- 哪些声音最稳定、最值得相信。
+- 这些声音能转成什么产品、内容或增长动作。
+
+### 实操演示 50-70 分钟
+
+按以下顺序录屏:
+
+1. 打开 OpenClaw。
+2. 选择或说明 `voc-single-platform-report` 总入口。
+3. 输入课程样例参数。
+4. 展示平台采集过程或样例数据。
+5. 展示生成的 mini report。
+6. 打开 HTML 报告。
+7. 逐项解释证据卡、主题和行动建议。
+
+### 复用讲解 10 分钟
+
+告诉学员换品类时不要直接换报告文本,而要换:
+
+- 平台
+- 关键词
+- 业务问题
+- 证据卡
+- 行动清单
+
+## 11. 课堂常见问题
+
+### Q1:关键词怎么选?
+
+先用 3 类关键词:
+
+- 痛点词:如 腹胀、便秘、没效果。
+- 场景词:如 儿童、熬夜、送礼、孕期。
+- 决策词:如 怎么选、测评、避坑、对比。
+
+### Q2:样本少能不能写报告?
+
+可以写阶段性观察,但不能写全市场结论。建议话术是:
+
+```text
+基于当前样本,观察到一个初步信号……
+```
+
+不要写:
+
+```text
+全市场用户都认为……
+```
+
+### Q3:能不能直接用于客户交付?
+
+课程版报告是初稿。客户交付前必须:
+
+- 补样本。
+- 人工复核原声。
+- 检查合规边界。
+- 做质量审计。
+
+### Q4:API 不稳定怎么办?
+
+课程录制和课堂演示必须准备 sample mode。先用课程样例跑通完整链路,再说明真实采集时需要 Token 和平台 API 稳定性。
+
+## 12. 与内部 6 阶段 SOP 的关系
+
+`02-standard-report-workflow.md` 是内部交付和高阶训练营 SOP。
+
+本教学手册是 OpenClaw 用户入门课。两者关系如下:
+
+| 场景 | 使用文档 |
+|---|---|
+| 2 小时 OpenClaw 单平台实操课 | `07-openclaw-single-platform-course.md` |
+| 内部报告交付 SOP | `02-standard-report-workflow.md` |
+| 高阶系统训练营 | `02-standard-report-workflow.md` + `voc-report-factory/` |
+| 开发者验证脚本链路 | `examples/report-factory-demo/README.md` |
+
+## 13. 讲师检查清单
+
+录课前确认:
+
+- 已有一份能打开的 HTML 样例报告。
+- 已准备课程标准输入。
+- 已说明 sample mode 和真实采集的区别。
+- 已说明低样本边界。
+- 已说明结论必须回到 VOC 原声。
+- 已说明 OpenClaw 用户不需要运行本地脚本。
+
+## 14. 后续产品化要求
+
+为了让课程真正面向 OpenClaw 用户,需要将以下能力产品化为 Skill:
+
+| 优先级 | Skill | 作用 |
+|---|---|---|
+| P0 | `voc/voc-single-platform-report` | 单平台 VOC 报告总入口 |
+| P0 | `voc/voc-platform-mini-report-generator` | 从 VOC 数据生成 mini report |
+| P0 | `voc/voc-html-report-generator` | 从 mini report 或 chapter insights 生成 HTML |
+| P1 | `voc/voc-data-normalizer` | 多平台数据归一化 |
+| P1 | `voc/voc-report-auditor` | 报告交付前质量审计 |
+| P2 | `voc/voc-hypothesis-generator` | H1-H8 假设辅助生成 |
+| P2 | `voc/voc-collection-matrix-builder` | 关键词矩阵辅助生成 |

+ 109 - 0
docs/voc-skills-course-plan/README.md

@@ -0,0 +1,109 @@
+# VOC Skills 工作流与课程方案总览
+
+> 目标:把现有 `openclaw-voc-skill`、VOC 深度报告方法论、江中企业服务案例、`voc.market` 官网/BP 定位,收敛成可发布、可教学、可交付的 `VOC Skills` 产品与课程体系。
+
+## 一句话结论
+
+当前最适合采用 **“技能产品化 + 工作流标准化 + 课程商品化”** 三线并进:
+
+- **技能产品化**:将 `openclaw-voc-skill` 对外更名为 `voc-skills` / `@voc-market/voc-skills`,形成 `voc-core`、`voc-social-data`、`voc-workshop`、`voc-report-factory` 四类套件。
+- **工作流标准化**:把同学已经能人工快速出报告的能力,固化为 6 阶段门控流程:需求摄入 → 方法论设计 → 采集矩阵 → 采集执行 → 分析渲染 → 质量交付。
+- **课程商品化**:形成三层课程:面向 C 端转化的“2 小时单平台实战课”、面向深度学员的“VOC Skills 系统训练营”、面向企业团队的“VOC 虾工作坊”,单平台课零售价可设为 699 元。
+
+## 背景资料来源
+
+| 来源 | 关键信息 | 对本方案的启发 |
+|---|---|---|
+| `openclaw-voc-skill` | 现有 50+ skills、工作坊 playbook、部署/安装脚本、`WORKSHOP-SKILL-MAPPING.md` | 已有技能底座,可直接包装成技能市场与课程工具包 |
+| `fmode-voc-projects` | VOC 深度洞察 6 阶段闭环、H1-H8、采集矩阵、审计交付、三份江中报告案例 | 标准化“人工快速出报告”流程的主模板 |
+| `jiangzhong-plgh` | 企业服务、产品策划、AI 组织进化、OPC/小龙虾矩阵思路 | 课程与 B 端陪跑可从“个人会用工具”升级为“组织能力迁移” |
+| `voc.market` | “VOC为先 · 内容为王 · 增长为果”、VOC/内容/增长三工厂、99 元/月、699-999 增值、AI Skills 299/月 | 对外产品包装与定价梯度依据 |
+
+## 建议拆成交付文档
+
+| 文档 | 用途 |
+|---|---|
+| `README.md` | 总览与决策摘要 |
+| `openclaw-single-platform-voc-teaching-manual.md` | OpenClaw 单平台 VOC 录课与教学总手册,优先给讲师使用 |
+| `07-openclaw-single-platform-course.md` | 面向 OpenClaw 用户的 2 小时单平台 VOC 课程流程与讲稿 |
+| `openclaw-voc-skill-map.md` | OpenClaw 技能调用链路、课程主入口和产品化缺口 |
+| `01-skill-productization.md` | `voc-skills` 命名、npm/技能市场发布、套件规划 |
+| `02-standard-report-workflow.md` | 方向 1:人工快速出报告后的标准化工作流 |
+| `03-course-system.md` | 方向 2:单技能课与 2 小时单平台课设计 |
+| `04-skill-support-matrix.md` | 课程/工作流与技能支撑矩阵 |
+| `05-execution-roadmap.md` | 30/60/90 天推进路线图与优先级 |
+| `06-skill-gap-task-list.md` | 技能缺口、发布归类、课程素材和报告工厂任务清单 |
+
+## 两个方向的总体判断
+
+### 方向 1:人工快速出报告后的标准化
+
+**适合定位**:内部交付 SOP、认证训练营、B 端陪跑交付标准。
+
+**核心问题**不是“能不能出报告”,而是:
+
+- **质量一致性**:不同同学产出的章节结构、证据密度、视觉标准不一致。
+- **可追溯性**:结论是否能回到原始 VOC、关键词、平台、批次、假设标签。
+- **交付可复制**:是否每次都能按 12-22 小时的 AI 辅助周期跑完,而不是依赖高手临场发挥。
+- **技能支撑闭环**:采集、清洗、分析、报告、审计都要有对应 skill 或脚本模板。
+
+建议把方向 1 包装为:
+
+> **VOC Report Factory 标准工作流**:从口头需求到董事会级 HTML 洞察报告的 6 阶段 SOP。
+
+### 方向 2:单独技能课与 2 小时单平台课
+
+**适合定位**:C 端获客产品、OPC/中小商家入门产品、技能市场转化课。
+
+**核心问题**不是“讲多少方法论”,而是:
+
+- **2 小时必须交付可见成果**:一份平台洞察小报告、一个关键词矩阵、一个竞品/VOC发现清单。
+- **平台课必须低门槛**:不要求学员理解完整 H1-H8,只要知道如何采、怎么看、怎么转行动。
+- **课程要反向带动技能消费**:课程结束后引导购买 `voc-skills`、按次 API、699-999 元/月增值版或 299 元/月 AI Skills 包。
+
+建议把方向 2 包装为:
+
+> **2 小时单平台 VOC 实战课**:每次只攻一个平台,让小老板用一次真实数据完成一次可落地决策。
+
+录课与对外教学时应以 OpenClaw 用户体验为主线:
+
+```text
+打开 OpenClaw
+→ 调用 voc/voc-single-platform-report
+→ 输入平台、品类、关键词和业务问题
+→ 生成单平台 VOC 洞察报告
+```
+
+本地脚本和 `voc-report-factory/` 作为底层能力与开发者验证链路,不作为用户课程主线。
+
+## 推荐产品层级
+
+| 层级 | 产品名 | 目标用户 | 交付物 | 建议价格 |
+|---|---|---|---|---|
+| 免费/低价引流 | VOC Skills 入门公开课 | 对 VOC 感兴趣的新用户 | 1 个案例拆解 + 技能地图 | 0-99 元 |
+| 单平台实战 | 2 小时单平台 VOC 课 | OPC、中小商家、运营/产品新人 | 平台小报告 + SOP | 699 元/平台 |
+| 系统训练营 | VOC Skills 系统课 | 想完整掌握技能组合的学员 | 6 阶段报告 + 认证 | 2999-6999 元 |
+| 企业工作坊 | 2 天 VOC 虾工作坊 | 企业市场/产品/电商团队 | 完整品类/产品 VOC 报告 | 3-10 万/场 |
+| B 端陪跑 | 年度 VOC 陪跑 | 年销千万级品牌 | 月度报告 + 策略会 + 自动化规则 | 30-60 万/年 |
+
+## 关键落地建议
+
+1. **优先做“标准报告工作流文档”**:这是内部规模化交付和外部高价课的地基。
+2. **再做“2 小时单平台课”**:用小红书、抖音、跨境电商评论、TikTok/Instagram 等平台做低门槛切入口。
+3. **同步整理技能市场发布**:把 `openclaw` 前缀弱化,对外统一叫 `VOC Skills`。
+4. **补齐小红书技能发布归类**:现有前期洞察实战高度依赖小红书,但当前发布套件清单中该目录未进入稳定发布包,需要纳入 `voc-social-data`。
+5. **建立技能-课程-报告一一映射**:每一节课必须明确调用哪些 skill,产出哪个报告字段,服务哪个业务问题。
+
+## 下一步
+
+按本文件夹的详细方案执行:
+
+1. 录课先看 `openclaw-single-platform-voc-teaching-manual.md`。
+2. 课程流程看 `07-openclaw-single-platform-course.md`。
+3. 技能链路看 `openclaw-voc-skill-map.md`。
+4. 再按 `01-skill-productization.md` 确定包名、套件和发布边界。
+5. 按 `02-standard-report-workflow.md` 固化方向 1 的交付 SOP。
+6. 按 `03-course-system.md` 设计方向 2 的课程和定价。
+7. 用 `04-skill-support-matrix.md` 检查技能缺口。
+8. 用 `05-execution-roadmap.md` 排 30/60/90 天执行优先级。
+9. 用 `06-skill-gap-task-list.md` 将技能缺口拆成可分派开发/发布/课程任务。

+ 32 - 0
docs/voc-skills-course-plan/examples/README.md

@@ -0,0 +1,32 @@
+# VOC Skills 调用示例库
+
+本目录用于给助教和学员提供可复制的核心 skill 调用示例。每个示例都包含输入、预期输出、常见错误和课堂讲解点。
+
+## 示例目录
+
+| 场景目录 | 实际调用对象 | 适用课堂环节 |
+|---|---|---|
+| `openclaw-single-platform-report/` | `voc/voc-single-platform-report` | OpenClaw 用户课主入口:输入平台、品类、关键词和业务问题,生成单平台 VOC 洞察报告 |
+| `amazon-review-voc/` | `voc/product-reviews-query` | Amazon 评论 VOC、差评/好评拆解、ASIN 体检 |
+| `xiaohongshu-mini-voc/` | `xiaohongshu/xiaohongshu-mini-voc` | 小红书 2 小时课采集链路 |
+| `douyin-content-voc/` | `douyin/douyin-mini-voc` | 抖音内容爆点、评论问题、热评回复 |
+| `tiktok-instagram-trend/` | `social-voc/tiktok-category-voc`、`social-voc/instagram-brand-voc`、`social-voc/social-trend-analysis` | 海外社媒趋势与品牌内容策略 |
+| `report-factory-demo/` | `scripts/tools/*` 与 `voc-report-factory/` | normalized VOC 到章节草稿、mini report、HTML demo |
+
+## 使用顺序
+
+1. OpenClaw 用户录课优先使用 `openclaw-single-platform-report/`。
+2. 先确认项目、品类、平台、关键词和业务问题。
+3. 复制示例 JSON 到对应 skill 调用面板。
+4. 如果是平台采集专项课,再进入小红书、抖音、Amazon、TikTok/Instagram 等分平台示例。
+5. 如果是开发者或助教验证链路,再使用 `report-factory-demo/` 的本地脚本流程。
+6. 用审计清单检查证据是否可追溯。
+
+## 课堂共通规则
+
+- **数据边界**:课程样例、合成样例、真实采集必须分开标注。
+- **证据追溯**:结论必须能追溯到 platform、keyword、batch、id/commentId。
+- **Token 前置**:需要数据网关的 skill 在课前完成 token 预飞。
+- **低样本提醒**:样本过少时只写“阶段性信号”,不写全市场判断。
+- **人工复核**:自动生成报告只作为初稿,交付前必须人工复核原声证据。
+- **课程主线**:对外录课讲 OpenClaw skill 调用,不讲本地脚本命令。

+ 79 - 0
docs/voc-skills-course-plan/examples/amazon-review-voc/README.md

@@ -0,0 +1,79 @@
+# 示例:Amazon Review VOC
+
+## 实际调用对象
+
+- **Skill**:`voc/product-reviews-query`
+- **用途**:按 ASIN 获取 Amazon 评论,用于差评痛点、好评喜爱点、验证购买反馈和使用场景分析。
+
+## 可复制输入
+
+### 1. 获取全部评论第一页
+
+```json
+{
+  "ASIN": "B0B24QJ217",
+  "domain": 1,
+  "PageIndex": 1
+}
+```
+
+### 2. 获取 1 星差评
+
+```json
+{
+  "ASIN": "B0B24QJ217",
+  "Star": "1",
+  "PageIndex": 1,
+  "OnlyPurchase": 1,
+  "domain": 1
+}
+```
+
+### 3. 获取近期验证购买评论
+
+```json
+{
+  "ASIN": "B0B24QJ217",
+  "OnlyPurchase": 1,
+  "QueryStartDt": "20250101",
+  "PageIndex": 1,
+  "domain": 1
+}
+```
+
+## 预期输出
+
+```json
+{
+  "TotalCount": 1200,
+  "Reviews": [
+    {
+      "Star": 1,
+      "Title": "review title",
+      "Content": "review content",
+      "ConsumerName": "customer",
+      "ReviewsDate": "20260204",
+      "ReviewedCountry": "United States",
+      "IsVP": true,
+      "Helpful": 12,
+      "Asin": "B0B24QJ217",
+      "ReviewsLink": "https://..."
+    }
+  ]
+}
+```
+
+## 常见错误
+
+- **ASIN 格式错误**:必须是 10 位大写字母数字。
+- **Star 类型错误**:星级要传字符串,例如 `"1"`,不是数字 `1`。
+- **分页遗漏**:每页约 10 条评论,课堂演示至少讲清楚 `PageIndex` 翻页。
+- **字段名写错**:使用 `ReviewsDate`、`ReviewedCountry`、`IsVP`、`ReviewsLink`,不要改成别的大小写。
+- **Token 问题**:该 skill 需要 `vocToken`,课前应完成 token 预飞。
+
+## 课堂讲解点
+
+- **差评深潜**:先用 1 星和 2 星评论找真实痛点,不要只看平均星级。
+- **验证购买优先**:`OnlyPurchase=1` 的评论更适合作为产品体验证据。
+- **好评不是广告词**:5 星评论应提炼用户主动复述的喜爱点和场景。
+- **证据卡写法**:每条结论要带 ASIN、Star、ReviewsDate、ReviewsLink 或评论唯一字段。

+ 74 - 0
docs/voc-skills-course-plan/examples/douyin-content-voc/README.md

@@ -0,0 +1,74 @@
+# 示例:抖音 Content VOC
+
+## 实际调用对象
+
+- **Skill**:`douyin/douyin-mini-voc`
+- **用途**:按关键词搜索抖音视频,采集视频详情、评论、热评回复和可选话题热度,用于内容爆点与用户问题分析。
+
+## 可复制输入
+
+```json
+{
+  "project": "douyin-course-demo",
+  "category": "冻干益生菌",
+  "keywords": [
+    "冻干益生菌测评",
+    "益生菌腹胀便秘",
+    "儿童益生菌怎么选"
+  ],
+  "videosPerKeyword": 8,
+  "commentsPerVideo": 40,
+  "maxCommentPages": 2,
+  "includeReplies": true,
+  "repliesPerVideo": 3,
+  "includeHashtags": true,
+  "sort_type": "1",
+  "publish_time": "7",
+  "filter_duration": "0",
+  "content_type": "1",
+  "batch": "P0",
+  "hypothesisTags": ["H2", "H5", "H8"]
+}
+```
+
+## 预期输出
+
+```json
+{
+  "metadata": {
+    "project": "douyin-course-demo",
+    "platform": "douyin",
+    "keywordCount": 3,
+    "videoCount": 24,
+    "commentCount": 960,
+    "replyCount": 72
+  },
+  "videos": [],
+  "comments": [],
+  "replies": [],
+  "hashtags": [],
+  "contentSignals": [],
+  "audienceQuestions": [],
+  "hookPatterns": [],
+  "contentActions": [],
+  "audit": {
+    "failedRequests": [],
+    "emptyComments": 0,
+    "missingFields": []
+  }
+}
+```
+
+## 常见错误
+
+- **参数枚举类型错误**:`sort_type`、`publish_time`、`content_type` 使用字符串,例如 `"1"`。
+- **热评误读**:高赞评论和回复代表强互动信号,不等于全体用户共识。
+- **采集量过大**:`includeReplies=true` 会增加请求量,课堂演示可先关闭或降低 `repliesPerVideo`。
+- **Token 问题**:抖音网关需要有效 `vocToken`,课前必须预飞。
+
+## 课堂讲解点
+
+- **抖音先看内容钩子**:视频文案、开头、话题、评论引导是核心分析对象。
+- **评论问题即内容选题**:高频追问可转成下一条视频标题和 FAQ。
+- **热评回复看争议**:回复能补充用户反驳、补充经验和更深层动机。
+- **报告写法**:结论应写成“抖音内容信号”,不要直接外推到全平台市场需求。

+ 139 - 0
docs/voc-skills-course-plan/examples/openclaw-single-platform-report/README.md

@@ -0,0 +1,139 @@
+# 示例:OpenClaw 单平台 VOC 洞察报告
+
+## 实际调用对象
+
+- **课程主入口 Skill**:`voc/voc-single-platform-report`
+- **小红书采集编排**:`xiaohongshu/xiaohongshu-mini-voc`
+- **抖音采集编排**:`douyin/douyin-mini-voc`
+- **底层报告能力**:`platform-mini-report-generator`、`html-v2/gen-report-template.js`
+
+## 适用课堂环节
+
+这个示例用于录制和讲授 OpenClaw 用户课:
+
+> 输入平台、品类、关键词和业务问题,使用 OpenClaw VOC Skills 生成单平台 VOC 洞察报告。
+
+## 标准输入
+
+```json
+{
+  "project": "openclaw-voc-course-demo",
+  "platform": "xiaohongshu",
+  "category": "冻干益生菌",
+  "businessQuestion": "用户为什么会关注冻干益生菌,当前内容和产品机会在哪里?",
+  "keywords": [
+    "儿童益生菌怎么选",
+    "益生菌腹胀便秘",
+    "冻干益生菌测评"
+  ],
+  "sampleMode": true,
+  "outputFormat": "both",
+  "depth": "light",
+  "owner": "VOC Skills 课程 demo"
+}
+```
+
+## 课堂演示顺序
+
+### Step 1:展示最终报告
+
+先打开课程样例报告:
+
+```text
+demo/xiaohongshu/platform-mini-report/platform-mini-report.html
+```
+
+讲清楚本课目标:
+
+- 不是学习写脚本。
+- 不是学习爬虫技术。
+- 是学会用 OpenClaw 技能生成一份可追溯 VOC 洞察报告。
+
+### Step 2:解释输入参数
+
+| 参数 | 课堂说法 |
+|---|---|
+| `platform` | 这次只选一个平台,例如小红书 |
+| `category` | 你要研究的品类或产品 |
+| `businessQuestion` | 这份报告最终要回答的问题 |
+| `keywords` | 用户会搜、会问、会比较的词 |
+| `sampleMode` | 录课和课堂演示可先用样例数据跑通 |
+| `outputFormat` | Markdown 用于编辑,HTML 用于展示 |
+
+### Step 3:调用总入口 Skill
+
+在 OpenClaw 中调用:
+
+```text
+voc/voc-single-platform-report
+```
+
+讲师口径:
+
+```text
+我现在不是单独调用某个采集 API,而是调用单平台 VOC 报告总入口。
+它会根据平台选择对应采集技能,再完成 VOC 整理、洞察生成、HTML 展示和质量检查。
+```
+
+### Step 4:解释报告结构
+
+报告至少包含:
+
+- 一句话结论
+- 数据概况
+- H1-H8 覆盖速查
+- 高频主题聚类
+- VOC 原声证据卡
+- 产品/内容机会
+- 风险与边界
+- 结课行动清单
+
+### Step 5:带学员复用
+
+让学员替换:
+
+- `category`
+- `businessQuestion`
+- `keywords`
+- `platform`
+
+再复跑一次,得到自己的单平台 VOC 洞察初稿。
+
+## 预期输出
+
+```json
+{
+  "metadata": {
+    "project": "openclaw-voc-course-demo",
+    "platform": "xiaohongshu",
+    "category": "冻干益生菌"
+  },
+  "summary": {
+    "itemCount": 30,
+    "commentCount": 105,
+    "keywordCount": 3,
+    "evidenceCardCount": 6,
+    "warningCount": 0
+  },
+  "outputs": {
+    "markdownReport": "platform-mini-report.md",
+    "jsonReport": "platform-mini-report.json",
+    "htmlReport": "platform-mini-report.html"
+  }
+}
+```
+
+## 常见错误
+
+- **把课程讲成脚本课**:学员应该看到的是 OpenClaw 技能调用,不是终端命令。
+- **关键词太泛**:例如只写“益生菌”,样本会很散;建议加场景和问题。
+- **样本量过低**:只能写阶段性信号,不能写全市场结论。
+- **忘记数据边界**:课程样例和真实采集必须分开说明。
+- **结论无证据**:每个关键判断都要能回到 VOC 原声。
+
+## 课堂讲解点
+
+- **总入口思维**:OpenClaw 用户需要一个主 Skill,而不是手动串多个脚本。
+- **证据驱动**:报告不是观点集合,而是用户原声证据的结构化表达。
+- **低门槛复用**:学员只要换平台、品类、问题和关键词,就能复用流程。
+- **边界意识**:单平台、短周期、小样本只能支撑轻量洞察,不能替代企业级全量研究。

+ 85 - 0
docs/voc-skills-course-plan/examples/report-factory-demo/README.md

@@ -0,0 +1,85 @@
+# 示例:Report Factory Demo
+
+## 实际调用对象
+
+- **模板目录**:`voc-report-factory/`
+- **章节草稿脚本**:`scripts/tools/chapter-insight-writer.js`
+- **单平台 mini report 脚本**:`scripts/tools/platform-mini-report-generator.js`
+- **HTML v2 demo 生成脚本**:`voc-report-factory/html-v2/gen-report-template.js`
+
+## 输入数据
+
+推荐使用小红书课程样例:
+
+```text
+demo/xiaohongshu/normalized/_merged.json
+demo/xiaohongshu/normalized/comments-flat.jsonl
+```
+
+## Step 1:生成章节草稿
+
+```powershell
+node scripts/tools/chapter-insight-writer.js --input demo/xiaohongshu/normalized --output demo/xiaohongshu/chapter-insights --project xiaohongshu-course-demo --category 冻干益生菌 --version light --min-evidence 3
+```
+
+预期输出:
+
+```text
+demo/xiaohongshu/chapter-insights/chapter-insights.md
+demo/xiaohongshu/chapter-insights/chapter-insights.json
+```
+
+## Step 2:生成单平台 mini report
+
+```powershell
+node scripts/tools/platform-mini-report-generator.js --input demo/xiaohongshu/normalized --output demo/xiaohongshu/platform-mini-report --project xiaohongshu-course-demo --category 冻干益生菌 --platform xiaohongshu --data-nature 课程合成样例 --owner "VOC Skills 课程 demo" --date 2026-04-29
+```
+
+预期输出:
+
+```text
+demo/xiaohongshu/platform-mini-report/platform-mini-report.md
+demo/xiaohongshu/platform-mini-report/platform-mini-report.json
+```
+
+## Step 3:生成 HTML v2
+
+内置 demo:
+
+```powershell
+node voc-report-factory/html-v2/gen-report-template.js --output demo/report-factory/html-v2-demo-report.html
+```
+
+从单平台 mini report 生成 HTML:
+
+```powershell
+node voc-report-factory/html-v2/gen-report-template.js --data demo/xiaohongshu/platform-mini-report/platform-mini-report.json --output demo/xiaohongshu/platform-mini-report/platform-mini-report.html
+```
+
+从章节草稿生成 HTML:
+
+```powershell
+node voc-report-factory/html-v2/gen-report-template.js --data demo/xiaohongshu/chapter-insights/chapter-insights.json --output demo/xiaohongshu/chapter-insights/chapter-insights.html
+```
+
+预期输出:
+
+```text
+demo/report-factory/html-v2-demo-report.html
+demo/xiaohongshu/platform-mini-report/platform-mini-report.html
+demo/xiaohongshu/chapter-insights/chapter-insights.html
+```
+
+## 常见错误
+
+- **输入目录不对**:脚本会优先找 `_merged.json`,找不到再读 `comments-flat.jsonl`。
+- **输出目录缺失**:脚本会自动创建输出目录,但路径应使用项目内相对路径。
+- **证据不足**:`--min-evidence` 太高会触发 warning;课堂 demo 建议从 3 开始。
+- **PowerShell 引号**:`--owner "VOC Skills 课程 demo"` 这类带空格参数要加引号。
+
+## 课堂讲解点
+
+- **先 Markdown 后 HTML**:课堂交付优先生成可编辑 Markdown,再进入 HTML renderer。
+- **审计字段**:重点看 `warnings`、`unsupportedConclusionCount`、`hasTraceableEvidence`。
+- **证据驱动**:所有章节结论都要能回到 VOC 原声证据卡。
+- **人工编辑**:自动生成内容是初稿,交付前要由助教补充业务判断和删改不稳结论。

+ 99 - 0
docs/voc-skills-course-plan/examples/tiktok-instagram-trend/README.md

@@ -0,0 +1,99 @@
+# 示例:TikTok + Instagram Trend
+
+## 实际调用对象
+
+- **TikTok 品类采集**:`social-voc/tiktok-category-voc`
+- **Instagram 品牌采集**:`social-voc/instagram-brand-voc`
+- **跨平台趋势分析**:`social-voc/social-trend-analysis`
+
+## Step 1:TikTok 品类 VOC 输入
+
+```json
+{
+  "keywords": [
+    "probiotics for kids",
+    "kids gut health",
+    "bloating probiotics"
+  ],
+  "videoCount": 20,
+  "commentsPerVideo": 50,
+  "hashtags": [
+    "kidsguthealth",
+    "probiotics",
+    "momtok"
+  ]
+}
+```
+
+## Step 2:Instagram 品牌 VOC 输入
+
+```json
+{
+  "brandNames": [
+    "Culturelle",
+    "Hiya Health",
+    "SmartyPants Vitamins"
+  ],
+  "postsPerBrand": 12
+}
+```
+
+## Step 3:跨平台趋势分析输入
+
+```json
+{
+  "categoryKeyword": "kids probiotics",
+  "tiktokCategoryVoc": {
+    "videos": [],
+    "comments": [],
+    "hashtags": [],
+    "vocAnalysis": {}
+  },
+  "tiktokBrandVoc": {
+    "brands": [],
+    "videos": [],
+    "comments": []
+  },
+  "instagramBrandVoc": {
+    "brands": [],
+    "crossBrandComparison": {}
+  }
+}
+```
+
+## 预期输出
+
+```json
+{
+  "platformComparison": {
+    "tiktok": {
+      "totalPlays": 1000000,
+      "avgEngagement": 0.08
+    },
+    "instagram": {
+      "totalFollowers": 500000,
+      "avgEngagement": 0.03
+    },
+    "dominantPlatform": "tiktok",
+    "insight": "TikTok 更适合趋势爆发,Instagram 更适合品牌资产沉淀"
+  },
+  "trendingTopics": [],
+  "brandRanking": [],
+  "opportunities": [],
+  "actionItems": []
+}
+```
+
+## 常见错误
+
+- **把 Step 3 当成采集入口**:`social-trend-analysis` 需要前两步输出作为输入。
+- **品牌名不清晰**:Instagram 搜索容易返回同名账号,要复核是否为官方或目标账号。
+- **话题标签过窄**:TikTok hashtag 太窄会导致样本不足。
+- **跨平台口径混用**:TikTok 播放量和 Instagram 粉丝量不是同一个指标,不能直接相加解释。
+
+## 课堂讲解点
+
+- **TikTok 看趋势爆发**:播放量、互动率、热门话题和评论问题。
+- **Instagram 看品牌资产**:账号定位、视觉一致性、发布频率和互动质量。
+- **跨平台结论写法**:先比较平台角色,再给内容机会,不要只排热度名次。
+- **行动建议**:输出未覆盖热门话题、内容形式缺口、发布节奏和 KOL 合作方向。

+ 93 - 0
docs/voc-skills-course-plan/examples/xiaohongshu-mini-voc/README.md

@@ -0,0 +1,93 @@
+# 示例:小红书 Mini VOC
+
+## 实际调用对象
+
+- **Skill**:`xiaohongshu/xiaohongshu-mini-voc`
+- **用途**:按关键词搜索小红书笔记,筛选高价值笔记,采集详情与评论,生成 2 小时课可用的 mini VOC 数据包。
+
+## 可复制输入
+
+```json
+{
+  "project": "xiaohongshu-course-demo",
+  "category": "冻干益生菌",
+  "keywords": [
+    "儿童益生菌怎么选",
+    "益生菌腹胀便秘",
+    "冻干益生菌测评"
+  ],
+  "notesPerKeyword": 10,
+  "maxCommentPages": 2,
+  "sort": "general",
+  "note_type": "_0",
+  "batch": "P0",
+  "hypothesisTags": ["H1", "H2", "H3"],
+  "includeUserInfo": false
+}
+```
+
+## 采集矩阵输入写法
+
+```json
+{
+  "project": "xhs-voc-workshop",
+  "category": "冻干益生菌",
+  "keywordMatrix": [
+    {
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "targetCount": 30,
+      "hypothesisTags": ["H1", "H3", "H6"],
+      "purpose": "验证家长选择标准",
+      "expectedSignal": "菌株、配料、冲调、坚持吃",
+      "risk": "测评号和商业笔记较多"
+    },
+    {
+      "keyword": "益生菌腹胀便秘",
+      "batch": "P0",
+      "targetCount": 30,
+      "hypothesisTags": ["H2", "H3", "H4"],
+      "purpose": "提取真实痛点和使用反馈"
+    }
+  ],
+  "notesPerKeyword": 10,
+  "maxCommentPages": 2
+}
+```
+
+## 预期输出
+
+```json
+{
+  "metadata": {
+    "project": "xiaohongshu-course-demo",
+    "platform": "xiaohongshu",
+    "keywordCount": 3,
+    "noteCount": 30,
+    "commentCount": 105
+  },
+  "notes": [],
+  "commentsByNote": [],
+  "commentsFlat": [],
+  "keywordStats": [],
+  "audit": {
+    "failedRequests": [],
+    "emptyComments": 0,
+    "missingFields": []
+  }
+}
+```
+
+## 常见错误
+
+- **关键词太泛**:例如只搜“益生菌”,容易得到广告和泛科普内容。
+- **maxCommentPages 太高**:课堂演示建议从 1-2 页开始,避免超时。
+- **标签过粗**:所有关键词都打同一组 H1-H8,会降低后续报告解释力。
+- **数据性质未标注**:课程样例、真实采集和混合数据必须分开说明。
+
+## 课堂讲解点
+
+- **关键词三层结构**:品类词、痛点词、测评/竞品词要同时覆盖。
+- **评论比笔记更像 VOC**:笔记适合看内容模式,评论适合写用户原声证据。
+- **下游衔接**:采集后进入 `voc-data-normalizer`,再生成 `platform-mini-report` 或章节草稿。
+- **边界提醒**:医疗、功效、症状表达只能作为用户声音,不能直接写成产品功效。

+ 282 - 0
docs/voc-skills-course-plan/openclaw-single-platform-voc-teaching-manual.md

@@ -0,0 +1,282 @@
+# OpenClaw 单平台 VOC 洞察课总教学手册
+
+> 这份文档是录课和教学主入口。课程对象是 OpenClaw 用户,目标是在 OpenClaw 中调用 VOC Skills,完成一份单平台 VOC 洞察报告。
+
+## 1. 课程定位
+
+本课不是开发课,也不是本地脚本课。
+
+本课要教会用户:
+
+```text
+打开 OpenClaw
+→ 输入平台、品类、关键词和业务问题
+→ 调用 VOC Skills
+→ 生成单平台 VOC 洞察报告
+→ 看懂证据卡、主题、机会点和行动建议
+```
+
+一句话课程名:
+
+> 用 OpenClaw 生成你的第一份单平台 VOC 洞察报告。
+
+## 2. 推荐录课主文件
+
+录课时优先打开这 4 个文件:
+
+| 顺序 | 文件 | 用途 |
+|---|---|---|
+| 1 | `docs/voc-skills-course-plan/openclaw-single-platform-voc-teaching-manual.md` | 当前总教学手册 |
+| 2 | `docs/voc-skills-course-plan/07-openclaw-single-platform-course.md` | 分段讲稿和课堂流程 |
+| 3 | `docs/voc-skills-course-plan/openclaw-voc-skill-map.md` | OpenClaw 技能链路图 |
+| 4 | `docs/voc-skills-course-plan/examples/openclaw-single-platform-report/README.md` | 标准输入和演示步骤 |
+
+可展示的样例报告:
+
+```text
+demo/xiaohongshu/platform-mini-report/platform-mini-report.html
+```
+
+## 3. 学员最终获得什么
+
+| 交付物 | 价值 |
+|---|---|
+| 单平台 VOC 洞察报告 | 看懂用户真实声音 |
+| VOC 证据卡 | 每个判断能回到原声 |
+| 高频主题聚类 | 知道用户反复讨论什么 |
+| 产品/内容机会 | 把用户声音转成动作 |
+| 风险与边界 | 知道哪些结论不能写过头 |
+| 行动清单 | 课后可以立即验证 |
+
+## 4. 课程主 Skill
+
+推荐把以下 Skill 作为录课主入口:
+
+```text
+voc/voc-single-platform-report
+```
+
+它的规范位置:
+
+```text
+voc/voc-single-platform-report/SKILL.md
+voc/voc-single-platform-report/api-config.json
+```
+
+它承担的角色:
+
+```text
+用户输入
+  → 平台采集
+  → VOC 归一化
+  → mini report
+  → HTML 报告
+  → 质量审计
+  → 返回报告和下一步建议
+```
+
+## 5. 标准课堂输入
+
+录课建议先用 sample mode 跑通链路:
+
+```json
+{
+  "project": "openclaw-voc-course-demo",
+  "platform": "xiaohongshu",
+  "category": "冻干益生菌",
+  "businessQuestion": "用户为什么会关注冻干益生菌,当前内容和产品机会在哪里?",
+  "keywords": [
+    "儿童益生菌怎么选",
+    "益生菌腹胀便秘",
+    "冻干益生菌测评"
+  ],
+  "sampleMode": true,
+  "outputFormat": "both",
+  "depth": "light",
+  "owner": "VOC Skills 课程 demo"
+}
+```
+
+讲师口径:
+
+```text
+我们先用课程样例数据跑完整流程,确保每个同学都能看到最终报告。
+真实业务中,把 sampleMode 改为 false,再接入真实平台采集。
+```
+
+## 6. 录课结构
+
+### 第 1 段:展示最终报告
+
+打开:
+
+```text
+demo/xiaohongshu/platform-mini-report/platform-mini-report.html
+```
+
+讲清楚:
+
+- 今天不是教写代码。
+- 今天是教 OpenClaw 用户用技能生成报告。
+- 报告不是观点堆砌,而是证据驱动。
+
+### 第 2 段:解释输入
+
+只讲 4 个核心输入:
+
+| 输入 | 说明 |
+|---|---|
+| 平台 | 这次只看一个平台 |
+| 品类 | 你要研究的产品或方向 |
+| 关键词 | 用户会搜索、会提问、会比较的词 |
+| 业务问题 | 报告最终要回答的问题 |
+
+### 第 3 段:调用 OpenClaw Skill
+
+主讲:
+
+```text
+voc/voc-single-platform-report
+```
+
+不要主讲:
+
+```text
+node scripts/tools/xxx.js
+```
+
+本地脚本只作为底层实现和开发验证存在,不应成为面向用户课程主线。
+
+### 第 4 段:解释报告模块
+
+按这个顺序讲报告:
+
+1. 样本量和关键词。
+2. 一句话结论。
+3. 高频主题。
+4. VOC 原声证据卡。
+5. 产品/内容机会。
+6. 风险与边界。
+7. 行动建议。
+
+### 第 5 段:带学员复用
+
+让学员替换:
+
+- `category`
+- `businessQuestion`
+- `keywords`
+- `platform`
+
+然后重新生成自己的报告。
+
+## 7. 技能链路说明
+
+理想 OpenClaw 链路:
+
+```text
+voc/voc-single-platform-report
+  ├─ token / 权限预检
+  ├─ xiaohongshu/xiaohongshu-mini-voc 或 douyin/douyin-mini-voc
+  ├─ voc-data-normalizer
+  ├─ voc-platform-mini-report-generator
+  ├─ voc-html-report-generator
+  ├─ voc-report-auditor
+  └─ 返回报告
+```
+
+当前仓库状态:
+
+| 能力 | 状态 |
+|---|---|
+| 小红书/抖音采集编排 | 已有 Skill 规范 |
+| normalized VOC 数据结构 | 已有本地脚本和样例数据 |
+| platform mini report | 已有本地脚本 |
+| HTML v2 生成 | 已打通 T14 |
+| 总入口 Skill | 已新增规范,待执行层产品化 |
+
+## 8. 讲师不要偏离的边界
+
+### 不要把课讲成开发者课
+
+不要让用户关注:
+
+- 本地目录结构。
+- Node.js 命令。
+- 渲染器源码。
+- 内部脚本参数。
+
+### 不要把轻量报告讲成企业全案
+
+单平台课程只负责:
+
+- 小样本验证。
+- 发现早期信号。
+- 输出内容/产品动作。
+
+不负责:
+
+- 多平台交叉验证。
+- 统计显著性证明。
+- 企业级董事会报告。
+
+### 不要把用户原声讲成功效证明
+
+尤其医疗、健康、功效、安全相关品类,只能说:
+
+```text
+用户表达了这样的感受或顾虑。
+```
+
+不能说:
+
+```text
+产品已经证明有效。
+```
+
+## 9. 与现有文档的分工
+
+| 文档 | 定位 |
+|---|---|
+| `openclaw-single-platform-voc-teaching-manual.md` | 总教学手册,录课主入口 |
+| `07-openclaw-single-platform-course.md` | 详细课程流程和讲稿 |
+| `openclaw-voc-skill-map.md` | 技能链路和产品化认知 |
+| `02-standard-report-workflow.md` | 内部交付和高阶训练营 SOP |
+| `examples/report-factory-demo/README.md` | 本地脚本验证链路 |
+| `examples/openclaw-single-platform-report/README.md` | OpenClaw 用户课标准示例 |
+
+## 10. 课程开场白
+
+可以直接照这个讲:
+
+```text
+这节课我们不写代码,也不做复杂市场研究。
+我们只做一件事:用 OpenClaw 的 VOC Skills,从一个平台、一组关键词和一个业务问题出发,生成一份可以阅读、可以追溯、可以转行动的 VOC 洞察报告。
+
+你会看到用户到底在说什么,哪些声音值得相信,以及这些声音能转成什么产品、内容或增长动作。
+```
+
+## 11. 课程结束语
+
+可以直接照这个讲:
+
+```text
+今天你已经完成了一次单平台 VOC 洞察闭环。
+以后换任何品类,都不要先写报告,而是先换平台、换关键词、换业务问题,让 OpenClaw 帮你重新采集和生成证据。
+
+报告可以自动生成,但最终判断一定要由你结合业务场景复核。
+```
+
+## 12. 后续产品化任务
+
+为了让课程完全不依赖本地脚本,还需要继续把以下能力 Skill 化:
+
+| 优先级 | Skill | 当前状态 |
+|---|---|---|
+| P0 | `voc-single-platform-report` | 已新增规范 |
+| P0 | `voc-platform-mini-report-generator` | 底层脚本已存在 |
+| P0 | `voc-html-report-generator` | HTML v2 已打通 |
+| P1 | `voc-data-normalizer` | 底层脚本已存在 |
+| P1 | `voc-report-auditor` | 底层脚本已存在 |
+| P2 | `voc-hypothesis-generator` | 底层脚本已存在 |
+| P2 | `voc-collection-matrix-builder` | 底层脚本已存在 |

+ 157 - 0
docs/voc-skills-course-plan/openclaw-voc-skill-map.md

@@ -0,0 +1,157 @@
+# OpenClaw VOC Skills 单平台报告链路图
+
+> 用途:把“OpenClaw 用户如何用技能生成单平台 VOC 洞察报告”固定成课程、产品和技能开发共用的认知地图。
+
+## 1. 用户侧目标
+
+用户在 OpenClaw 中不是为了学习脚本,而是为了完成一个业务结果:
+
+```text
+输入平台、品类、关键词和问题
+→ 调用 VOC Skills
+→ 得到一份可阅读、可追溯、可行动的单平台 VOC 洞察报告
+```
+
+## 2. 用户最小输入
+
+| 字段 | 示例 | 说明 |
+|---|---|---|
+| `platform` | `xiaohongshu` | 单次课程只选一个平台 |
+| `category` | `冻干益生菌` | 品类、产品或品牌方向 |
+| `businessQuestion` | 用户为什么关注冻干益生菌? | 报告要回答的核心问题 |
+| `keywords` | `儿童益生菌怎么选` | 3-5 个关键词起步 |
+| `sampleMode` | `true` | 课程演示可使用样例数据 |
+| `outputFormat` | `both` | `markdown` / `html` / `both` |
+
+## 3. 理想总入口
+
+OpenClaw 用户课推荐只暴露一个主入口:
+
+```text
+voc/voc-single-platform-report
+```
+
+用户不需要理解本地脚本,也不需要手动串联多个工具。
+
+## 4. 总链路
+
+```text
+voc/voc-single-platform-report
+  ├─ Step 0:Token / 权限预检
+  ├─ Step 1:确认平台、品类、关键词、业务问题
+  ├─ Step 2:调用平台采集编排 skill
+  │    ├─ xiaohongshu/xiaohongshu-mini-voc
+  │    ├─ douyin/douyin-mini-voc
+  │    ├─ social-voc/tiktok-category-voc
+  │    ├─ social-voc/instagram-brand-voc
+  │    └─ voc/product-reviews-query
+  ├─ Step 3:归一化为标准 VOC 数据
+  ├─ Step 4:生成单平台 mini report
+  ├─ Step 5:生成 HTML v2 报告
+  ├─ Step 6:质量审计
+  └─ Step 7:返回报告文件、证据卡和下一步建议
+```
+
+## 5. 平台技能映射
+
+| 平台 | 采集/编排 skill | 当前状态 | 课程使用建议 |
+|---|---|---|---|
+| 小红书 | `xiaohongshu/xiaohongshu-mini-voc` | 已有编排规范 | 2 小时课首选平台 |
+| 抖音 | `douyin/douyin-mini-voc` | 已有编排规范 | 内容爆点和评论问题课 |
+| Amazon | `voc/product-reviews-query` | 已有评论采集能力 | 跨境评论 VOC 课 |
+| TikTok | `social-voc/tiktok-category-voc` | 已有社媒 VOC 方向 | 海外趋势课 |
+| Instagram | `social-voc/instagram-brand-voc` | 已有品牌内容 VOC 方向 | 海外品牌内容课 |
+
+## 6. 报告生成能力映射
+
+| 能力 | 当前实现 | 面向 OpenClaw 的目标形态 |
+|---|---|---|
+| 数据归一化 | `scripts/tools/voc-data-normalizer.js` | `voc/voc-data-normalizer` |
+| 章节洞察 | `scripts/tools/chapter-insight-writer.js` | `voc/voc-chapter-insight-writer` |
+| 单平台 mini report | `scripts/tools/platform-mini-report-generator.js` | `voc/voc-platform-mini-report-generator` |
+| HTML v2 渲染 | `voc-report-factory/html-v2/gen-report-template.js` | `voc/voc-html-report-generator` |
+| 报告审计 | `scripts/tools/voc-report-auditor.js` | `voc/voc-report-auditor` |
+| 总入口 | 已新增课程总入口规范,执行层待产品化 | `voc/voc-single-platform-report` |
+
+## 7. 课程版最小闭环
+
+课程录制不应该展示本地脚本命令,而应展示以下 OpenClaw 交互:
+
+```text
+用户:我想用小红书看冻干益生菌用户声音,关键词是 A/B/C。
+OpenClaw:我会使用单平台 VOC 报告流程,先检查 token,再采集小红书数据,最后生成报告。
+OpenClaw:报告已生成,包含 105 条 VOC、6 张证据卡、H1-H8 覆盖情况和 4 个行动建议。
+用户:打开报告。
+OpenClaw:展示 Markdown 或 HTML 报告。
+```
+
+## 8. 课程录制口径
+
+### 应该说
+
+- “我们在 OpenClaw 中调用 VOC Skills。”
+- “这一步由技能完成采集和整理。”
+- “报告里的结论必须回到用户原声。”
+- “样本量不足时只写阶段性信号。”
+
+### 不应该说
+
+- “打开终端运行 Node.js 脚本。”
+- “这个报告完全自动等于最终结论。”
+- “一百条评论代表整个市场。”
+- “用户反馈可以直接证明医学功效。”
+
+## 9. OpenClaw 侧返回格式建议
+
+`voc-single-platform-report` 应返回:
+
+```json
+{
+  "metadata": {
+    "project": "openclaw-voc-course-demo",
+    "platform": "xiaohongshu",
+    "category": "冻干益生菌",
+    "generatedAt": "2026-04-30T00:00:00.000Z"
+  },
+  "summary": {
+    "commentCount": 105,
+    "itemCount": 30,
+    "keywordCount": 3,
+    "evidenceCardCount": 6,
+    "warningCount": 0
+  },
+  "outputs": {
+    "markdownReport": "platform-mini-report.md",
+    "jsonReport": "platform-mini-report.json",
+    "htmlReport": "platform-mini-report.html",
+    "auditReport": "audit-report.md"
+  },
+  "nextActions": [
+    "补充竞品关键词",
+    "复核高赞负面评论",
+    "把 P0 机会点转成内容 AB 测试"
+  ]
+}
+```
+
+## 10. 技能开发优先级
+
+| 优先级 | 项目 | 原因 |
+|---|---|---|
+| P0 | `voc/voc-single-platform-report` | 课程主入口,决定用户体验 |
+| P0 | `voc/voc-platform-mini-report-generator` | 把数据变成可读报告 |
+| P0 | `voc/voc-html-report-generator` | 生成可展示报告 |
+| P1 | `voc/voc-data-normalizer` | 支撑多平台输入统一 |
+| P1 | `voc/voc-report-auditor` | 形成交付质量闸门 |
+| P2 | `voc/voc-hypothesis-generator` | 系统训练营增强 |
+| P2 | `voc/voc-collection-matrix-builder` | 企业级报告增强 |
+
+## 11. 与现有文档关系
+
+| 文档 | 作用 |
+|---|---|
+| `07-openclaw-single-platform-course.md` | 录课主手册 |
+| `openclaw-voc-skill-map.md` | OpenClaw 技能链路认知图 |
+| `02-standard-report-workflow.md` | 内部交付/高阶训练营 SOP |
+| `examples/report-factory-demo/README.md` | 本地脚本链路验证 |
+| `voc-report-factory/README.md` | 报告模板包说明 |

+ 155 - 0
douyin/douyin-mini-voc/SKILL.md

@@ -0,0 +1,155 @@
+---
+name: douyin-mini-voc
+description: 按关键词搜索抖音视频,批量采集视频详情、评论和热评回复,生成 2 小时课和轻量 VOC 报告可用的数据包
+version: 0.1.0
+author: nkkj-BrainHack
+---
+
+# 抖音 Mini VOC 编排采集
+
+## 技能名称
+
+`douyin-mini-voc`
+
+## 技能目的
+
+把抖音 2 小时 VOC 课程中常用的内容采集链路编排成一个入口:关键词搜索视频、筛选高互动视频、获取视频详情、抓取评论、可选抓取热评回复和话题热度,并输出可继续进入 `voc-data-normalizer`、抖音 mini report 和报告审计的数据包。
+
+## 输入参数
+
+| 参数 | 类型 | 必填 | 默认值 | 说明 |
+|---|---|---|---|---|
+| project | string | 否 |  | 项目名称,用于输出 metadata |
+| category | string | 否 |  | 品类或产品方向 |
+| keywords | string[] | 是 |  | 抖音搜索关键词列表 |
+| videosPerKeyword | integer | 否 | 10 | 每个关键词保留的视频数量 |
+| commentsPerVideo | integer | 否 | 40 | 每个视频目标采集评论数量 |
+| maxCommentPages | integer | 否 | 2 | 每个视频最多抓取评论页数 |
+| includeReplies | boolean | 否 | true | 是否采集高赞热评下的回复 |
+| repliesPerVideo | integer | 否 | 3 | 每个视频选取多少条高赞评论抓回复 |
+| includeHashtags | boolean | 否 | false | 是否额外获取话题热度 |
+| sort_type | string | 否 | `1` | `0` 综合 / `1` 最多点赞 / `2` 最新发布 |
+| publish_time | string | 否 | `7` | `0` 不限 / `1` 最近一天 / `7` 最近一周 / `180` 最近半年 |
+| filter_duration | string | 否 | `0` | 视频时长筛选 |
+| content_type | string | 否 | `1` | `0` 不限 / `1` 视频 / `2` 图文 / `3` 文章 |
+| batch | string | 否 | P0 | 采集批次 |
+| hypothesisTags | string[] | 否 |  | 默认 H1-H8 标签 |
+| keywordMatrix | object[] | 否 |  | 可选采集矩阵行,支持 keyword、batch、targetCount、hypothesisTags、purpose、expectedSignal、risk |
+
+## 执行流程
+
+1. 对 `keywords` 或 `keywordMatrix[].keyword` 调用 `douyin-general-search`。
+2. 按点赞、评论、分享、播放综合排序,保留每个关键词 Top `videosPerKeyword`。
+3. 对入选视频调用 `douyin-video-detail` 获取完整文案、作者、互动数据、话题和发布时间。
+4. 对入选视频调用 `douyin-video-comments` 抓取评论,最多翻页 `maxCommentPages`。
+5. 如 `includeReplies=true`,对每个视频选取高赞且有回复的评论调用 `douyin-comment-replies`。
+6. 如 `includeHashtags=true`,对关键词调用 `douyin-hashtag-search` 获取话题热度。
+7. 汇总为抖音 mini VOC 数据包,生成 `contentSignals`、`audienceQuestions`、`hookPatterns` 和 `contentActions`。
+
+## 调用的底层 Skill
+
+- `douyin-general-search` — 抖音综合搜索
+- `douyin-video-detail` — 单视频详情
+- `douyin-video-comments` — 视频评论采集
+- `douyin-comment-replies` — 热评回复采集
+- `douyin-hashtag-search` — 可选话题热度采集
+
+## 推荐课程用法
+
+```json
+{
+  "project": "douyin-course-demo",
+  "category": "冻干益生菌",
+  "keywords": [
+    "冻干益生菌测评",
+    "益生菌腹胀便秘",
+    "儿童益生菌怎么选"
+  ],
+  "videosPerKeyword": 8,
+  "maxCommentPages": 2,
+  "includeReplies": true,
+  "includeHashtags": true,
+  "sort_type": "1",
+  "publish_time": "7",
+  "content_type": "1",
+  "batch": "P0",
+  "hypothesisTags": ["H2", "H5", "H8"]
+}
+```
+
+## 返回格式
+
+```json
+{
+  "metadata": {
+    "project": "douyin-course-demo",
+    "platform": "douyin",
+    "keywordCount": 3,
+    "videoCount": 24,
+    "commentCount": 960,
+    "replyCount": 72,
+    "generatedAt": "2026-04-29T00:00:00.000Z"
+  },
+  "videos": [
+    {
+      "id": "aweme_id",
+      "platform": "douyin",
+      "keyword": "冻干益生菌测评",
+      "batch": "P0",
+      "hypothesisTags": ["H5", "H8"],
+      "title": "视频文案",
+      "author": "作者昵称",
+      "playCount": 100000,
+      "likeCount": 8000,
+      "commentCount": 500,
+      "shareCount": 120,
+      "publishTime": "2026-04-29T00:00:00.000Z",
+      "raw": {}
+    }
+  ],
+  "comments": [
+    {
+      "id": "comment_id",
+      "platform": "douyin",
+      "sourceType": "comment",
+      "parentId": "aweme_id",
+      "keyword": "冻干益生菌测评",
+      "batch": "P0",
+      "hypothesisTags": ["H5", "H8"],
+      "author": "评论者昵称",
+      "text": "用户原声评论",
+      "likeCount": 20,
+      "replyCount": 3,
+      "ipLocation": "广东",
+      "raw": {}
+    }
+  ],
+  "replies": [],
+  "hashtags": [],
+  "contentSignals": [],
+  "audienceQuestions": [],
+  "hookPatterns": [],
+  "contentActions": [],
+  "audit": {
+    "failedRequests": [],
+    "emptyComments": 0,
+    "missingFields": []
+  }
+}
+```
+
+## 下游衔接
+
+- 用 `scripts/tools/voc-data-normalizer.js` 把 raw 输出归一化为 `_merged.json` 和 `comments-flat.jsonl`。
+- 用 `scripts/tools/voc-report-auditor.js` 对抖音 mini report 和 normalized 数据做交付前审计。
+- 可与 `hypothesis-generator` 和 `collection-matrix-builder` 串联,按 H1-H8 假设执行关键词采集。
+
+## 质量边界
+
+- 抖音内容强算法分发,搜索结果会受时间、账号、热点和商业内容影响。
+- 热评不等于全体用户共识,应结合评论量、回复数、发布时间和话题上下文判断。
+- 医疗、功效、症状相关表达只能作为用户声音,不能直接写成未经验证的功效结论。
+
+## 对应工作坊环节
+
+2 小时 VOC 课程:关键词矩阵 → 抖音爆款内容/评论采集 → 内容信号提炼 → mini report → 审计交付。

+ 420 - 0
douyin/douyin-mini-voc/api-config.json

@@ -0,0 +1,420 @@
+{
+  "name": "douyin-mini-voc",
+  "displayName": "抖音 Mini VOC 编排采集",
+  "description": "按关键词搜索抖音视频,筛选高互动内容并批量采集视频详情、评论和热评回复,输出支撑 2 小时课程和轻量 VOC 报告的内容洞察数据包。",
+  "category": "douyin",
+  "version": "0.1.0",
+  "type": "orchestration",
+  "parameters": {
+    "project": {
+      "type": "string",
+      "required": false,
+      "description": "项目名称,用于输出 metadata.project"
+    },
+    "category": {
+      "type": "string",
+      "required": false,
+      "description": "品类或产品方向,如 护肝片、冻干益生菌、猴菇饮"
+    },
+    "keywords": {
+      "type": "array",
+      "items": {
+        "type": "string"
+      },
+      "required": true,
+      "description": "抖音搜索关键词列表"
+    },
+    "videosPerKeyword": {
+      "type": "integer",
+      "required": false,
+      "default": 10,
+      "description": "每个关键词保留的视频数量"
+    },
+    "commentsPerVideo": {
+      "type": "integer",
+      "required": false,
+      "default": 40,
+      "description": "每个视频目标采集评论数量"
+    },
+    "maxCommentPages": {
+      "type": "integer",
+      "required": false,
+      "default": 2,
+      "description": "每个视频最多抓取评论页数,单页默认 20 条"
+    },
+    "includeReplies": {
+      "type": "boolean",
+      "required": false,
+      "default": true,
+      "description": "是否采集高赞热评下的回复"
+    },
+    "repliesPerVideo": {
+      "type": "integer",
+      "required": false,
+      "default": 3,
+      "description": "每个视频选取多少条高赞评论抓回复"
+    },
+    "includeHashtags": {
+      "type": "boolean",
+      "required": false,
+      "default": false,
+      "description": "是否额外调用 douyin-hashtag-search 获取话题热度"
+    },
+    "sort_type": {
+      "type": "string",
+      "required": false,
+      "default": "1",
+      "enum": [
+        "0",
+        "1",
+        "2"
+      ],
+      "description": "搜索排序方式:0 综合,1 最多点赞,2 最新发布"
+    },
+    "publish_time": {
+      "type": "string",
+      "required": false,
+      "default": "7",
+      "enum": [
+        "0",
+        "1",
+        "7",
+        "180"
+      ],
+      "description": "发布时间范围:0 不限,1 最近一天,7 最近一周,180 最近半年"
+    },
+    "filter_duration": {
+      "type": "string",
+      "required": false,
+      "default": "0",
+      "enum": [
+        "0",
+        "0-1",
+        "1-5",
+        "5-10000"
+      ],
+      "description": "视频时长筛选"
+    },
+    "content_type": {
+      "type": "string",
+      "required": false,
+      "default": "1",
+      "enum": [
+        "0",
+        "1",
+        "2",
+        "3"
+      ],
+      "description": "内容类型:0 不限,1 视频,2 图文,3 文章"
+    },
+    "batch": {
+      "type": "string",
+      "required": false,
+      "default": "P0",
+      "description": "采集批次,如 P0/P1/P2"
+    },
+    "hypothesisTags": {
+      "type": "array",
+      "items": {
+        "type": "string"
+      },
+      "required": false,
+      "description": "默认 H1-H8 假设标签"
+    },
+    "keywordMatrix": {
+      "type": "array",
+      "items": {
+        "type": "object"
+      },
+      "required": false,
+      "description": "可选采集矩阵行,支持 keyword、batch、targetCount、hypothesisTags、purpose、expectedSignal、risk"
+    }
+  },
+  "pipeline": [
+    {
+      "step": 1,
+      "name": "按关键词搜索抖音视频",
+      "forEach": "keywords 或 keywordMatrix[].keyword",
+      "api": {
+        "skill": "douyin/douyin-general-search",
+        "method": "POST",
+        "body": {
+          "keyword": "${keyword}",
+          "cursor": 0,
+          "sort_type": "${sort_type}",
+          "publish_time": "${publish_time}",
+          "filter_duration": "${filter_duration}",
+          "content_type": "${content_type}",
+          "search_id": "",
+          "backtrace": ""
+        }
+      },
+      "output": "searchResults",
+      "responseExtract": "data.business_data[].data.aweme_info → Array<{ aweme_id,desc,author,statistics,cha_list,text_extra,create_time }>"
+    },
+    {
+      "step": 2,
+      "name": "筛选高互动视频",
+      "type": "compute",
+      "logic": "对每个 keyword 的搜索结果按 digg_count、comment_count、share_count、play_count 综合排序,保留 videosPerKeyword 条,并继承 batch、hypothesisTags、purpose 等矩阵字段",
+      "output": "selectedVideos"
+    },
+    {
+      "step": 3,
+      "name": "批量获取视频详情",
+      "forEach": "selectedVideos",
+      "api": {
+        "skill": "douyin/douyin-video-detail",
+        "method": "GET",
+        "queryParams": {
+          "aweme_id": "${video.aweme_id}"
+        }
+      },
+      "output": "videoDetails",
+      "responseExtract": "data.aweme_detail → 完整视频文案、作者、互动数据、话题标签和发布时间"
+    },
+    {
+      "step": 4,
+      "name": "批量采集视频评论",
+      "forEach": "selectedVideos",
+      "api": {
+        "skill": "douyin/douyin-video-comments",
+        "method": "GET",
+        "queryParams": {
+          "aweme_id": "${video.aweme_id}",
+          "cursor": "${cursor}",
+          "count": 20
+        }
+      },
+      "pagination": {
+        "cursorField": "data.cursor",
+        "hasMoreField": "data.has_more",
+        "maxPages": "${maxCommentPages}"
+      },
+      "output": "videoComments",
+      "responseExtract": "data.comments[] → Array<{ cid,text,user,digg_count,reply_comment_total,create_time,ip_label }>"
+    },
+    {
+      "step": 5,
+      "name": "可选采集热评回复",
+      "condition": "includeReplies === true",
+      "forEach": "videoComments → 每个视频按 digg_count 取 top repliesPerVideo 且 reply_comment_total > 0 的评论",
+      "api": {
+        "skill": "douyin/douyin-comment-replies",
+        "method": "GET",
+        "queryParams": {
+          "item_id": "${video.aweme_id}",
+          "comment_id": "${comment.cid}",
+          "cursor": 0,
+          "count": 20
+        }
+      },
+      "output": "commentReplies",
+      "responseExtract": "data.comments[] → 热评回复正文、回复者、点赞数和时间"
+    },
+    {
+      "step": 6,
+      "name": "可选采集话题热度",
+      "condition": "includeHashtags === true",
+      "forEach": "keywords",
+      "api": {
+        "skill": "douyin/douyin-hashtag-search",
+        "method": "POST",
+        "body": {
+          "keyword": "${keyword}",
+          "cursor": 0,
+          "sort_type": "1",
+          "publish_time": "${publish_time}",
+          "filter_duration": "0",
+          "content_type": "0",
+          "search_id": ""
+        }
+      },
+      "output": "hashtagResults",
+      "responseExtract": "data.business_data[].data.challenge_info → 话题名称、描述、浏览量、参与人数"
+    },
+    {
+      "step": 7,
+      "name": "生成抖音 Mini VOC 数据包",
+      "type": "compute",
+      "logic": "汇总 videos、comments、replies、hashtags、contentSignals、audienceQuestions、hookPatterns、contentActions 和 audit;保留 platform、keyword、batch、hypothesisTags、videoId/commentId、author、text、likeCount、publishTime、raw,供 voc-data-normalizer 继续处理",
+      "output": "miniVocDataset"
+    }
+  ],
+  "response": {
+    "type": "object",
+    "properties": {
+      "metadata": {
+        "type": "object",
+        "description": "项目、平台、关键词、批次、采集时间、视频数、评论数和回复数汇总"
+      },
+      "videos": {
+        "type": "array",
+        "description": "筛选后的视频详情列表"
+      },
+      "comments": {
+        "type": "array",
+        "description": "扁平化评论 VOC,字段兼容 comments-flat.jsonl"
+      },
+      "replies": {
+        "type": "array",
+        "description": "热评回复,用于争议点和深层动机分析"
+      },
+      "hashtags": {
+        "type": "array",
+        "description": "可选话题热度数据"
+      },
+      "contentSignals": {
+        "type": "array",
+        "description": "内容结构、爆点、平台语境和互动信号"
+      },
+      "audienceQuestions": {
+        "type": "array",
+        "description": "评论和回复中高频用户问题"
+      },
+      "hookPatterns": {
+        "type": "array",
+        "description": "标题、开头、话题标签和评论引导模式"
+      },
+      "contentActions": {
+        "type": "array",
+        "description": "可执行内容动作与验证指标"
+      },
+      "audit": {
+        "type": "object",
+        "description": "失败请求、空评论、字段缺失、跳过样本和补采建议"
+      }
+    }
+  },
+  "reportMapping": {
+    "slides": [
+      "抖音 VOC 数据概况",
+      "抖音高互动视频与爆点模式",
+      "抖音评论原声与用户问题",
+      "抖音内容行动建议"
+    ],
+    "dataPoints": [
+      "关键词-视频-评论-回复四层样本量",
+      "爆款视频文案、话题和互动指标",
+      "高赞评论与回复中的用户问题",
+      "contentSignals、audienceQuestions、hookPatterns、contentActions",
+      "可交给 voc-data-normalizer 的 raw 数据包"
+    ]
+  },
+  "timeout": 180000,
+  "retry": {
+    "maxAttempts": 2,
+    "delay": 2000,
+    "backoffMultiplier": 2
+  },
+  "tokenConfig": {
+    "type": "bearer",
+    "configFile": "~/.openclaw/voc-credentials.json",
+    "tokenField": "vocToken",
+    "resolutionOrder": [
+      "configFile"
+    ],
+    "apigId": "Vo3ROWEvDy",
+    "paymentUrlResolution": {
+      "description": "动态构建充值URL:在已存在 session token 时查出用户 objectId,拼接到专属充值页面",
+      "steps": [
+        "1. 从 voc-credentials.json 获取当前 session token",
+        "2. 调用 GET https://server.fmode.cn/parse/users/me (Header: X-Parse-Application-Id: ncloudmaster, X-Parse-Session-Token: {token})获取用户 objectId",
+        "3. 拼接充值URL: https://app.fmode.cn/dev/apig-pay/?user={objectId}&apigid=Vo3ROWEvDy&fun_id=HOkkX72PMF",
+        "4. 将该URL展示给用户,引导扫码支付"
+      ],
+      "userResolveEndpoint": "https://server.fmode.cn/parse/users/me",
+      "userResolveHeaders": {
+        "X-Parse-Application-Id": "ncloudmaster",
+        "X-Parse-Session-Token": "{vocToken}"
+      },
+      "paymentBaseUrl": "https://app.fmode.cn/dev/apig-pay/",
+      "paymentParams": {
+        "user": "{resolvedUserId}",
+        "apigid": "Vo3ROWEvDy",
+        "fun_id": "HOkkX72PMF"
+      },
+      "balanceCheckEndpoint": "https://server.fmode.cn/api/apig/getApig"
+    },
+    "onMissing": {
+      "action": "showPaymentQR",
+      "qrCodeUrl": "https://app.fmode.cn/dev/apig-pay/?apigid=Vo3ROWEvDy&fun_id=HOkkX72PMF",
+      "title": "扫码开通 VOC-AI 数据服务",
+      "message": "此 Skill 需要有效的 API Token。请先打开充值页面完成登录和充值;当用户提供 session token 后,请由 OpenClaw 运行 node scripts/tools/set-voc-token.js <session-token> 写入 ~/.openclaw/voc-credentials.json 的 vocToken 字段,再重试当前 Skill。",
+      "tokenSetupCommandTemplate": "node scripts/tools/set-voc-token.js {sessionToken}",
+      "tokenSetupInstructions": "当用户完成登录和充值后,如果用户把 session token 发给你,请直接运行 node scripts/tools/set-voc-token.js <session-token> 写入 ~/.openclaw/voc-credentials.json,然后重试当前 Skill。"
+    },
+    "onBalanceInsufficient": {
+      "action": "resolveUserThenShowPayment",
+      "title": "VOC-AI Token 余额不足,请扫码充值",
+      "message": "当前 Token 余额不足,我将为你生成专属充值链接,扫码支付后即可继续使用。"
+    }
+  },
+  "errorHandling": {
+    "balanceInsufficient": {
+      "conditions": [
+        {
+          "responseField": "code",
+          "operator": "in",
+          "value": [
+            -2,
+            -3,
+            -10,
+            402,
+            429
+          ]
+        },
+        {
+          "responseField": "msg",
+          "operator": "contains",
+          "value": [
+            "余额不足",
+            "insufficient",
+            "balance",
+            "quota",
+            "没有开通",
+            "权限或余额"
+          ]
+        },
+        {
+          "responseField": "message",
+          "operator": "contains",
+          "value": [
+            "余额不足",
+            "insufficient",
+            "balance",
+            "没有开通",
+            "权限或余额"
+          ]
+        }
+      ],
+      "matchMode": "any",
+      "trigger": "tokenConfig.onBalanceInsufficient"
+    },
+    "unauthorized": {
+      "conditions": [
+        {
+          "responseField": "code",
+          "operator": "in",
+          "value": [
+            401,
+            403
+          ]
+        },
+        {
+          "responseField": "msg",
+          "operator": "contains",
+          "value": [
+            "unauthorized",
+            "token",
+            "invalid",
+            "auth"
+          ]
+        }
+      ],
+      "matchMode": "any",
+      "trigger": "tokenConfig.onMissing"
+    }
+  },
+  "notes": "本 skill 是抖音 VOC 课程和轻量报告的编排层,底层调用 douyin-general-search、douyin-video-detail、douyin-video-comments、douyin-comment-replies 和可选 douyin-hashtag-search。抖音数据网关需要有效 vocToken。"
+}

+ 42 - 2
scripts/deploy/deploy-to-openclaw.ps1

@@ -26,7 +26,23 @@ $utf8NoBom = New-Object System.Text.UTF8Encoding($false)
 $SkillsTarget    = Join-Path $OpenClawDir "skills"
 $WorkspaceTarget = Join-Path $OpenClawDir "workspace"
 $MemoryTarget    = Join-Path $WorkspaceTarget "memory"
-
+$ToolsTarget     = Join-Path $OpenClawDir "tools"
+$WorkspaceToolsTarget = Join-Path $WorkspaceTarget "scripts\tools"
+
+$ToolItems = @(
+    @{ Source = Join-Path $ProjectRoot "scripts\tools\openclaw-tool-runner.js"; Dest = "openclaw-tool-runner.js" },
+    @{ Source = Join-Path $ProjectRoot "scripts\tools\set-voc-token.js"; Dest = "set-voc-token.js" },
+    @{ Source = Join-Path $ProjectRoot "scripts\tools\voc-token-preflight.js"; Dest = "voc-token-preflight.js" },
+    @{ Source = Join-Path $ProjectRoot "scripts\tools\voc-single-platform-report.js"; Dest = "voc-single-platform-report.js" },
+    @{ Source = Join-Path $ProjectRoot "scripts\tools\voc-data-normalizer.js"; Dest = "voc-data-normalizer.js" },
+    @{ Source = Join-Path $ProjectRoot "scripts\tools\platform-mini-report-generator.js"; Dest = "platform-mini-report-generator.js" },
+    @{ Source = Join-Path $ProjectRoot "scripts\tools\chapter-insight-writer.js"; Dest = "chapter-insight-writer.js" },
+    @{ Source = Join-Path $ProjectRoot "scripts\tools\voc-report-auditor.js"; Dest = "voc-report-auditor.js" },
+    @{ Source = Join-Path $ProjectRoot "voc-report-factory\html-v2\gen-report-template.js"; Dest = "voc-report-factory\html-v2\gen-report-template.js" },
+    @{ Source = Join-Path $ProjectRoot "voc-report-factory\html-v2\report-renderer-template.js"; Dest = "voc-report-factory\html-v2\report-renderer-template.js" },
+    @{ Source = Join-Path $ProjectRoot "demo\xiaohongshu\raw-notes.json"; Dest = "course-samples\xiaohongshu\raw-notes.json" },
+    @{ Source = Join-Path $ProjectRoot "demo\xiaohongshu\raw-comments.json"; Dest = "course-samples\xiaohongshu\raw-comments.json" }
+)
 $SkillCategories = @(
     "voc",
     "social-media",
@@ -270,7 +286,30 @@ if (-not $SkillsOnly) {
 }
 
 # ============================================
-# Part 4: Credentials Template
+# Part 4: Deploy Local Tools
+# ============================================
+Write-Host "  [4/4] Deploying Local Tools" -ForegroundColor Cyan
+Write-Host "  $('-' * 48)"
+
+foreach ($tool in $ToolItems) {
+    if (-not (Test-Path $tool.Source)) {
+        Write-Host "    [SKIP] $($tool.Dest) - source not found" -ForegroundColor DarkGray
+        $totalSkipped++
+        continue
+    }
+
+    $toolsDest = Join-Path $ToolsTarget $tool.Dest
+    $workspaceDest = Join-Path $WorkspaceToolsTarget $tool.Dest
+    Deploy-File $tool.Source $toolsDest $tool.Dest
+    Deploy-File $tool.Source $workspaceDest ("workspace/scripts/tools/" + $tool.Dest)
+    if (-not $DryRun) { Write-Host "    [OK] $($tool.Dest)" -ForegroundColor Green }
+    $totalDeployed++
+}
+
+Write-Host ""
+
+# ============================================
+# Part 5: Credentials Template
 # ============================================
 if (-not $DryRun -and -not $WorkshopOnly) {
     $credTemplate = Join-Path $ProjectRoot "__config\voc-credentials.template.json"
@@ -308,5 +347,6 @@ if ($DryRun) {
     Write-Host "  Verify:" -ForegroundColor DarkGray
     Write-Host "    openclaw skills list" -ForegroundColor DarkGray
     Write-Host "    openclaw skills info <skill-name>" -ForegroundColor DarkGray
+    Write-Host "    Test-Path ~/.openclaw/workspace/scripts/tools/openclaw-tool-runner.js" -ForegroundColor DarkGray
 }
 Write-Host ""

+ 41 - 12
scripts/deploy/install-all.js

@@ -27,6 +27,7 @@ const SKILLS_TARGET = path.join(OPENCLAW_DIR, 'skills');
 const WORKSPACE_TARGET = path.join(OPENCLAW_DIR, 'workspace');
 const MEMORY_TARGET = path.join(WORKSPACE_TARGET, 'memory');
 const TOOLS_TARGET = path.join(OPENCLAW_DIR, 'tools');
+const WORKSPACE_TOOLS_TARGET = path.join(WORKSPACE_TARGET, 'scripts', 'tools');
 const CREDENTIALS_PATH = path.join(OPENCLAW_DIR, 'voc-credentials.json');
 
 // ============================================
@@ -54,6 +55,22 @@ function copyFile(src, dest) {
     fs.copyFileSync(src, dest);
 }
 
+function copyDirRecursive(srcDir, destDir) {
+    let count = 0;
+    if (!fs.existsSync(srcDir)) return count;
+    for (const entry of fs.readdirSync(srcDir, { withFileTypes: true })) {
+        const src = path.join(srcDir, entry.name);
+        const dest = path.join(destDir, entry.name);
+        if (entry.isDirectory()) {
+            count += copyDirRecursive(src, dest);
+        } else if (entry.isFile()) {
+            copyFile(src, dest);
+            count++;
+        }
+    }
+    return count;
+}
+
 function formatSize(bytes) {
     if (bytes < 1024) return bytes + ' B';
     if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';
@@ -192,24 +209,33 @@ function listWorkshop() {
 }
 
 // ============================================
-// Token 工具安装
+// 工具安装
 // ============================================
 function installTools() {
-    const tools = [
-        { name: 'set-voc-token.js', desc: 'Token 写入工具' },
-        { name: 'voc-token-preflight.js', desc: 'Token 预飞检测工具(Workshop 前置检查)' }
-    ];
+    let count = 0;
+    const packagedToolsDir = path.join(SRC_DIR, 'tools');
+
+    if (fs.existsSync(packagedToolsDir)) {
+        count += copyDirRecursive(packagedToolsDir, TOOLS_TARGET);
+        const mirrorCount = copyDirRecursive(packagedToolsDir, WORKSPACE_TOOLS_TARGET);
+        console.log(`  ✅ tools/* → ${TOOLS_TARGET} (${count} files)`);
+        console.log(`  ✅ tools/* → ${WORKSPACE_TOOLS_TARGET} (${mirrorCount} files)`);
+        return count;
+    }
 
-    for (const { name, desc } of tools) {
+    const legacyTools = ['set-voc-token.js', 'voc-token-preflight.js'];
+    for (const name of legacyTools) {
         const src = path.join(SRC_DIR, name);
         if (!fs.existsSync(src)) {
             console.log(`  ⚠️  ${name} 不存在,跳过`);
             continue;
         }
-        const dest = path.join(TOOLS_TARGET, name);
-        copyFile(src, dest);
-        console.log(`  ✅ ${name} → ${dest}  (${desc})`);
+        copyFile(src, path.join(TOOLS_TARGET, name));
+        copyFile(src, path.join(WORKSPACE_TOOLS_TARGET, name));
+        console.log(`  ✅ ${name}`);
+        count++;
     }
+    return count;
 }
 
 function installCredentialsTemplate() {
@@ -255,7 +281,8 @@ Options:
   Skills       → ~/.openclaw/skills/          (技能文件)
   Workshop     → ~/.openclaw/workspace/       (工作坊 playbooks)
   Memory       → ~/.openclaw/workspace/memory/(记忆模板)
-  Tools        → ~/.openclaw/tools/           (set-voc-token.js)
+  Tools        → ~/.openclaw/tools/           (本地脚本工具)
+  Tool mirror  → ~/.openclaw/workspace/scripts/tools/ (Skill 相对路径执行)
   Credentials  → ~/.openclaw/voc-credentials.json (Token 配置模板)
 
 Token 设置流程:
@@ -291,10 +318,11 @@ function main() {
     let totalSkills = 0;
     let totalFiles = 0;
     let totalWorkshop = 0;
+    let totalTools = 0;
 
     // Tools + Credentials(总是安装)
     console.log('── Token 工具 + 凭证 ──');
-    installTools();
+    totalTools = installTools();
     installCredentialsTemplate();
     console.log('');
 
@@ -320,7 +348,8 @@ function main() {
     console.log(`${prefix}安装完成!`);
     if (!WORKSHOP_ONLY) console.log(`  🔧 Skills: ${totalSkills} 个技能 (${totalFiles} 个文件) → ${SKILLS_TARGET}`);
     if (!SKILLS_ONLY) console.log(`  🦐 Workshop: ${totalWorkshop} 个文件 → ${WORKSPACE_TARGET}`);
-    console.log(`  🔑 Token 工具 → ${TOOLS_TARGET}`);
+    console.log(`  🔑 Tools: ${totalTools} 个文件 → ${TOOLS_TARGET}`);
+    console.log(`  🧰 Tool mirror → ${WORKSPACE_TOOLS_TARGET}`);
     console.log(`  📄 凭证配置 → ${CREDENTIALS_PATH}`);
     console.log('');
 

+ 40 - 14
scripts/deploy/install-workshop.js

@@ -36,6 +36,7 @@ const WORKSPACE_DIR = path.join(OPENCLAW_DIR, 'workspace');
 const MEMORY_DIR = path.join(WORKSPACE_DIR, 'memory');
 const SKILLS_TARGET = path.join(OPENCLAW_DIR, 'skills');
 const TOOLS_TARGET = path.join(OPENCLAW_DIR, 'tools');
+const WORKSPACE_TOOLS_TARGET = path.join(WORKSPACE_DIR, 'scripts', 'tools');
 const CREDENTIALS_PATH = path.join(OPENCLAW_DIR, 'voc-credentials.json');
 
 // ============================================
@@ -53,6 +54,22 @@ function copyFile(src, dest) {
     fs.copyFileSync(src, dest);
 }
 
+function copyDirRecursive(srcDir, destDir) {
+    let count = 0;
+    if (!fs.existsSync(srcDir)) return count;
+    for (const entry of fs.readdirSync(srcDir, { withFileTypes: true })) {
+        const src = path.join(srcDir, entry.name);
+        const dest = path.join(destDir, entry.name);
+        if (entry.isDirectory()) {
+            count += copyDirRecursive(src, dest);
+        } else if (entry.isFile()) {
+            copyFile(src, dest);
+            count++;
+        }
+    }
+    return count;
+}
+
 function formatSize(bytes) {
     if (bytes < 1024) return bytes + ' B';
     if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';
@@ -79,8 +96,8 @@ Options:
   skills/*              → ~/.openclaw/skills/
   *.md                  → ~/.openclaw/workspace/
   memory-templates/*    → ~/.openclaw/workspace/memory/
-  set-voc-token.js      → ~/.openclaw/tools/
-  voc-token-preflight.js → ~/.openclaw/tools/
+  tools/*               → ~/.openclaw/tools/
+  tools/*               → ~/.openclaw/workspace/scripts/tools/
   voc-credentials.template.json → ~/.openclaw/voc-credentials.json(若不存在)
 
 Token 设置流程:
@@ -188,25 +205,34 @@ function installPlaybooks() {
 // Tools 安装
 // ============================================
 function installTools() {
-    const tools = [
-        { name: 'set-voc-token.js', desc: 'Token 写入工具' },
-        { name: 'voc-token-preflight.js', desc: 'Token 预飞检测工具(Workshop 前置检查)' }
-    ];
+    let count = 0;
+    const packagedToolsDir = path.join(SRC_DIR, 'tools');
+
+    if (fs.existsSync(packagedToolsDir)) {
+        console.log(`── Tools → ${TOOLS_TARGET} ──`);
+        count += copyDirRecursive(packagedToolsDir, TOOLS_TARGET);
+        console.log(DRY_RUN ? `  📄 tools/* → ${TOOLS_TARGET}` : `  ✅ ${count} files`);
+        console.log(`── Workspace Tool Mirror → ${WORKSPACE_TOOLS_TARGET} ──`);
+        const mirrorCount = copyDirRecursive(packagedToolsDir, WORKSPACE_TOOLS_TARGET);
+        console.log(DRY_RUN ? `  📄 tools/* → ${WORKSPACE_TOOLS_TARGET}` : `  ✅ ${mirrorCount} files`);
+        console.log('');
+        return count;
+    }
 
-    const available = tools.filter(t => fs.existsSync(path.join(SRC_DIR, t.name)));
+    const legacyTools = ['set-voc-token.js', 'voc-token-preflight.js'];
+    const available = legacyTools.filter(name => fs.existsSync(path.join(SRC_DIR, name)));
     if (available.length === 0) return 0;
 
     console.log(`── Tools (${available.length}) → ${TOOLS_TARGET} ──`);
-    for (const { name, desc } of available) {
+    for (const name of available) {
         const src = path.join(SRC_DIR, name);
-        const dest = path.join(TOOLS_TARGET, name);
-        copyFile(src, dest);
-        console.log(DRY_RUN
-            ? `  📄 ${name} → ${dest}  (${desc})`
-            : `  ✅ ${name}  (${desc})`);
+        copyFile(src, path.join(TOOLS_TARGET, name));
+        copyFile(src, path.join(WORKSPACE_TOOLS_TARGET, name));
+        console.log(DRY_RUN ? `  📄 ${name}` : `  ✅ ${name}`);
+        count++;
     }
     console.log('');
-    return available.length;
+    return count;
 }
 
 // ============================================

+ 233 - 47
scripts/deploy/package-and-upload.js

@@ -29,6 +29,7 @@ const CDN_PREFIX = 'x/openclaw-skills/packages';
 // ============================================
 // 路径
 // ============================================
+const PROJECT_ROOT = path.join(__dirname, '..', '..');
 const SKILLS_DIR = path.join(os.homedir(), '.openclaw', 'skills');
 const INSTALL_JS = path.join(__dirname, '..', '..', 'dist', 'install.js');
 const SET_VOC_TOKEN_JS = path.join(__dirname, '..', 'tools', 'set-voc-token.js');
@@ -41,6 +42,21 @@ const TEMP_BASE = path.join(os.tmpdir(), 'openclaw-pkg');
 const WORKSHOP_DIR = path.join(os.homedir(), '.openclaw', 'workspace');
 const MEMORY_TEMPLATES_DIR = path.join(WORKSHOP_DIR, 'memory');
 
+const TOOL_PACKAGE_FILES = [
+    { src: path.join(__dirname, '..', 'tools', 'openclaw-tool-runner.js'), dest: 'openclaw-tool-runner.js' },
+    { src: path.join(__dirname, '..', 'tools', 'set-voc-token.js'), dest: 'set-voc-token.js' },
+    { src: path.join(__dirname, '..', 'tools', 'voc-token-preflight.js'), dest: 'voc-token-preflight.js' },
+    { src: path.join(__dirname, '..', 'tools', 'voc-single-platform-report.js'), dest: 'voc-single-platform-report.js' },
+    { src: path.join(__dirname, '..', 'tools', 'voc-data-normalizer.js'), dest: 'voc-data-normalizer.js' },
+    { src: path.join(__dirname, '..', 'tools', 'platform-mini-report-generator.js'), dest: 'platform-mini-report-generator.js' },
+    { src: path.join(__dirname, '..', 'tools', 'chapter-insight-writer.js'), dest: 'chapter-insight-writer.js' },
+    { src: path.join(__dirname, '..', 'tools', 'voc-report-auditor.js'), dest: 'voc-report-auditor.js' },
+    { src: path.join(__dirname, '..', '..', 'voc-report-factory', 'html-v2', 'gen-report-template.js'), dest: path.join('voc-report-factory', 'html-v2', 'gen-report-template.js') },
+    { src: path.join(__dirname, '..', '..', 'voc-report-factory', 'html-v2', 'report-renderer-template.js'), dest: path.join('voc-report-factory', 'html-v2', 'report-renderer-template.js') },
+    { src: path.join(__dirname, '..', '..', 'demo', 'xiaohongshu', 'raw-notes.json'), dest: path.join('course-samples', 'xiaohongshu', 'raw-notes.json') },
+    { src: path.join(__dirname, '..', '..', 'demo', 'xiaohongshu', 'raw-comments.json'), dest: path.join('course-samples', 'xiaohongshu', 'raw-comments.json') }
+];
+
 // OpenClaw 系统文件(不能打包,否则覆盖用户配置)
 const SYSTEM_MD_FILES = new Set([
     'AGENTS.md', 'BOOTSTRAP.md', 'HEARTBEAT.md', 'IDENTITY.md',
@@ -78,6 +94,11 @@ const MEMORY_TEMPLATE_WHITELIST = new Set([
 
 // 测试技能黑名单
 const SKILL_BLACKLIST = new Set(['test-billing', 'test-skill']);
+const SKILL_SOURCE_DIRS = [
+    SKILLS_DIR,
+    'voc', 'social-media', 'douyin', 'xiaohongshu', 'review-analysis',
+    'competitor-analysis', 'synthesis', 'social-voc', 'workshop'
+].map(dir => path.isAbsolute(dir) ? dir : path.join(PROJECT_ROOT, dir));
 
 // ============================================
 // 套件定义(技能名列表)
@@ -91,6 +112,8 @@ const PACKAGES = {
             'asin-reverse-keywords', 'asin-sales-volume', 'category-products', 'category-tree',
             'keyword-product-ranking', 'keyword-search', 'keyword-search-trend',
             'product-detail-query', 'product-monitor', 'product-reviews-query', 'product-search', 'similar-products',
+            'voc-single-platform-report', 'voc-data-normalizer', 'voc-platform-mini-report-generator',
+            'voc-html-report-generator', 'voc-report-auditor', 'voc-chapter-insight-writer',
             // review-analysis
             'review-batch-collection', 'review-highlight-extraction', 'review-keyword-cloud',
             'review-pain-point-extraction', 'review-sentiment-analysis',
@@ -104,9 +127,10 @@ const PACKAGES = {
             'brand-context-builder', 'voc-token-preflight'
         ]
     },
-    'social-media': {
-        label: '📱 社媒数据套件',
-        description: 'TikTok / Instagram / 抖音数据采集',
+    'voc-social-data': {
+        label: '📱 VOC 社媒数据套件',
+        description: '小红书 / 抖音 / TikTok / Instagram 数据采集',
+        aliases: ['social-media'],
         skills: [
             // social-media
             'instagram-search', 'instagram-user-info', 'instagram-user-posts',
@@ -115,11 +139,122 @@ const PACKAGES = {
             'tiktok-video-detail', 'tiktok-video-search',
             // douyin
             'douyin-comment-replies', 'douyin-general-search', 'douyin-hashtag-search',
-            'douyin-user-profile', 'douyin-user-search', 'douyin-video-comments', 'douyin-video-detail'
+            'douyin-mini-voc',
+            'douyin-user-profile', 'douyin-user-search', 'douyin-video-comments', 'douyin-video-detail',
+            // xiaohongshu
+            'xiaohongshu-mini-voc', 'xiaohongshu-note-comments', 'xiaohongshu-note-detail',
+            'xiaohongshu-search-notes', 'xiaohongshu-user-info'
+        ]
+    },
+    'xiaohongshu-platform': {
+        label: '📕 小红书平台 VOC 套件',
+        description: '小红书数据采集 + 小红书 mini VOC + 单平台 VOC 报告生成工具链',
+        skills: [
+            'xiaohongshu-search-notes', 'xiaohongshu-note-detail', 'xiaohongshu-note-comments',
+            'xiaohongshu-user-info', 'xiaohongshu-mini-voc',
+            'voc-single-platform-report', 'voc-data-normalizer', 'voc-platform-mini-report-generator',
+            'voc-html-report-generator', 'voc-report-auditor', 'voc-chapter-insight-writer',
+            'voc-token-preflight'
         ]
     }
 };
 
+const PACKAGE_ALIAS_TO_CANONICAL = Object.fromEntries(
+    Object.entries(PACKAGES).flatMap(([pkgId, pkg]) =>
+        (pkg.aliases || []).map(alias => [alias, pkgId])
+    )
+);
+
+function getPackageDefinition(pkgId) {
+    return PACKAGES[pkgId] || PACKAGES[PACKAGE_ALIAS_TO_CANONICAL[pkgId]];
+}
+
+function isLegacyPackageId(pkgId) {
+    return Boolean(PACKAGE_ALIAS_TO_CANONICAL[pkgId]);
+}
+
+function getPackageLogLabel(pkgId) {
+    const pkg = getPackageDefinition(pkgId);
+    if (!pkg) return pkgId;
+    const suffix = isLegacyPackageId(pkgId) ? `(兼容旧名 ${pkgId})` : '';
+    return `${pkg.label}${suffix}`;
+}
+
+function parseArgs(argv) {
+    const options = {
+        only: [],
+        skipWorkshop: false,
+        skipAll: false,
+        skipUpload: false,
+        help: false
+    };
+
+    for (let i = 0; i < argv.length; i++) {
+        const token = argv[i];
+        if (token === '--only') {
+            options.only = (argv[++i] || '').split(',').map(v => v.trim()).filter(Boolean);
+        } else if (token === '--skip-workshop') {
+            options.skipWorkshop = true;
+        } else if (token === '--skip-all') {
+            options.skipAll = true;
+        } else if (token === '--skip-upload') {
+            options.skipUpload = true;
+        } else if (token === '--help' || token === '-h') {
+            options.help = true;
+        }
+    }
+
+    return options;
+}
+
+function showHelp() {
+    console.log([
+        'Usage:',
+        '  node scripts/deploy/package-and-upload.js',
+        '  node scripts/deploy/package-and-upload.js --only xiaohongshu-platform --skip-workshop --skip-all',
+        '',
+        'Options:',
+        '  --only a,b,c       只打包/上传指定套件',
+        '  --skip-workshop    跳过 workshop.zip',
+        '  --skip-all         跳过 openclaw-all.zip',
+        '  --skip-upload      只生成本地 zip,不上传 CDN',
+        '  --help, -h         显示帮助'
+    ].join('\n'));
+}
+
+function getSelectedPackageEntries(only) {
+    if (!only || only.length === 0) {
+        return Object.entries(PACKAGES).map(([pkgId, pkg]) => [pkgId, pkg, pkgId]);
+    }
+
+    return only.map(pkgId => {
+        const pkg = getPackageDefinition(pkgId);
+        if (!pkg) {
+            throw new Error(`未知套件: ${pkgId}`);
+        }
+        const canonicalId = PACKAGE_ALIAS_TO_CANONICAL[pkgId] || pkgId;
+        return [pkgId, pkg, canonicalId];
+    });
+}
+
+function findSkillSourceDir(skillName) {
+    for (const sourceRoot of SKILL_SOURCE_DIRS) {
+        const candidate = path.join(sourceRoot, skillName);
+        if (fs.existsSync(candidate) && fs.existsSync(path.join(candidate, 'SKILL.md'))) {
+            return candidate;
+        }
+    }
+    return undefined;
+}
+
+function copySkillFiles(srcDir, destDir) {
+    fs.mkdirSync(destDir, { recursive: true });
+    const files = fs.readdirSync(srcDir).filter(f => fs.statSync(path.join(srcDir, f)).isFile());
+    for (const f of files) {
+        fs.copyFileSync(path.join(srcDir, f), path.join(destDir, f));
+    }
+}
+
 // ============================================
 // 七牛上传
 // ============================================
@@ -142,11 +277,31 @@ function uploadFile(localFile, cdnKey) {
     });
 }
 
+function copyToolPackageFiles(pkgDir) {
+    const toolsDir = path.join(pkgDir, 'tools');
+    fs.mkdirSync(toolsDir, { recursive: true });
+
+    let copied = 0;
+    let missing = 0;
+    for (const file of TOOL_PACKAGE_FILES) {
+        if (!fs.existsSync(file.src)) {
+            missing++;
+            continue;
+        }
+        const dest = path.join(toolsDir, file.dest);
+        fs.mkdirSync(path.dirname(dest), { recursive: true });
+        fs.copyFileSync(file.src, dest);
+        copied++;
+    }
+
+    return { copied, missing };
+}
+
 // ============================================
 // 打包逻辑
 // ============================================
-function buildPackage(pkgId, pkg) {
-    const pkgDir = path.join(TEMP_BASE, pkgId);
+function buildPackage(pkgId, pkg, outputPkgId = pkgId) {
+    const pkgDir = path.join(TEMP_BASE, outputPkgId);
     const skillsDir = path.join(pkgDir, 'skills');
 
     // 清理 + 创建目录
@@ -168,6 +323,8 @@ function buildPackage(pkgId, pkg) {
         fs.copyFileSync(VOC_TOKEN_PREFLIGHT_JS, path.join(pkgDir, 'voc-token-preflight.js'));
     }
 
+    const toolCopyResult = copyToolPackageFiles(pkgDir);
+
     // 生成 README.txt
     const readme = [
         `OpenClaw ${pkg.label}`,
@@ -176,12 +333,13 @@ function buildPackage(pkgId, pkg) {
         pkg.description,
         '',
         `包含 ${pkg.skills.length} 个技能`,
+        `包含 ${toolCopyResult.copied} 个本地工具文件(安装到 ~/.openclaw/tools 和 ~/.openclaw/workspace/scripts/tools)`,
         '',
         '安装方法:',
         '  1. 确保已安装 OpenClaw',
         '  2. 解压本压缩包',
         '  3. 在解压目录运行: node install.js',
-        '  4. 设置 Token: node set-voc-token.js <your-session-token>',
+        '  4. 设置 Token: node ~/.openclaw/tools/set-voc-token.js <your-session-token>',
         '  5. 重启 OpenClaw gateway',
         '',
         '其他命令:',
@@ -189,8 +347,8 @@ function buildPackage(pkgId, pkg) {
         '  node install.js --dry-run           # 预览模式',
         '  node install.js --only a,b,c        # 只安装指定技能',
         '  node install.js --skip a,b,c        # 跳过指定技能',
-        '  node set-voc-token.js <token>       # 设置/更新 VOC Token',
-        '  node voc-token-preflight.js          # 检测 Token 有效性和余额',
+        '  node ~/.openclaw/tools/set-voc-token.js <token>       # 设置/更新 VOC Token',
+        '  node ~/.openclaw/tools/voc-token-preflight.js          # 检测 Token 有效性和余额',
         '',
         '技能列表:',
         ...pkg.skills.map(s => `  - ${s}`),
@@ -202,27 +360,23 @@ function buildPackage(pkgId, pkg) {
     let copied = 0;
     let missing = 0;
     for (const skillName of pkg.skills) {
-        const srcDir = path.join(SKILLS_DIR, skillName);
-        if (!fs.existsSync(srcDir)) {
-            console.log(`    ⚠️  跳过 ${skillName}(未部署)`);
+        const srcDir = findSkillSourceDir(skillName);
+        if (!srcDir) {
+            console.log(`    ⚠️  跳过 ${skillName}(未找到源码或已安装目录)`);
             missing++;
             continue;
         }
 
         const destDir = path.join(skillsDir, skillName);
-        fs.mkdirSync(destDir, { recursive: true });
-
-        const files = fs.readdirSync(srcDir).filter(f => fs.statSync(path.join(srcDir, f)).isFile());
-        for (const f of files) {
-            fs.copyFileSync(path.join(srcDir, f), path.join(destDir, f));
-        }
+        copySkillFiles(srcDir, destDir);
         copied++;
     }
 
-    console.log(`    ✅ 复制 ${copied} 个技能(跳过 ${missing} 个)`);
+    console.log(`    ✅ 复制 ${copied} 个技能(跳过 ${missing} 个),${toolCopyResult.copied} 个工具文件` +
+        (toolCopyResult.missing > 0 ? `(工具缺失 ${toolCopyResult.missing} 个)` : ''));
 
     // 压缩
-    const zipPath = path.join(DIST_DIR, `${pkgId}.zip`);
+    const zipPath = path.join(DIST_DIR, `${outputPkgId}.zip`);
     if (fs.existsSync(zipPath)) fs.unlinkSync(zipPath);
 
     // 使用 PowerShell Compress-Archive
@@ -264,6 +418,8 @@ function buildWorkshopPackage() {
         fs.copyFileSync(VOC_TOKEN_PREFLIGHT_JS, path.join(pkgDir, 'voc-token-preflight.js'));
     }
 
+    const toolCopyResult = copyToolPackageFiles(pkgDir);
+
     // 复制凭证模板
     if (fs.existsSync(CREDENTIALS_TEMPLATE)) {
         fs.copyFileSync(CREDENTIALS_TEMPLATE, path.join(pkgDir, 'voc-credentials.template.json'));
@@ -321,7 +477,7 @@ function buildWorkshopPackage() {
         `  🔧 ${skillsCopied} 个 workshop 必需的 skills(品类/评论/竞品/合成/社媒VOC/工作坊)`,
         '  📘 11 份 playbook(入口+全局规则+6个Session+配套文档)',
         '  📄 9 份 memory templates(记忆模板)',
-        '  🔑 2 个 Token 工具(set-voc-token.js + voc-token-preflight.js)',
+        `  🔑 ${toolCopyResult.copied} 个本地工具文件(Token 工具 + VOC 报告脚本)`,
         '  📝 1 份凭证模板(voc-credentials.template.json)',
         '',
         '架构:6个Session + 17个Side Quest,主线感知 + 支线深耕',
@@ -370,6 +526,7 @@ function buildWorkshopPackage() {
         '  workshop-session-4-deep.md         ← Session 4: 深入 + 5 Side Quests',
         '  workshop-session-5-report.md       ← Session 5: 报告 + 2 Side Quests',
         '  memory-templates/*.json            ← 记忆模板(9个)',
+        '  tools/*                            ← 安装到 ~/.openclaw/tools 和 ~/.openclaw/workspace/scripts/tools',
         '  set-voc-token.js                   ← Token 写入工具',
         '  voc-token-preflight.js             ← Token 预飞检测工具',
         '  voc-credentials.template.json      ← 凭证模板',
@@ -377,8 +534,9 @@ function buildWorkshopPackage() {
     ].join('\n');
     fs.writeFileSync(path.join(pkgDir, 'README.txt'), readme, 'utf8');
 
-    console.log(`    ✅ 复制 ${copied} 个 playbook/template + ${skillsCopied} 个 skills` +
-        (skillsMissing > 0 ? ` (缺失 ${skillsMissing})` : ''));
+    console.log(`    ✅ 复制 ${copied} 个 playbook/template + ${skillsCopied} 个 skills + ${toolCopyResult.copied} 个工具文件` +
+        (skillsMissing > 0 ? ` (缺失 ${skillsMissing})` : '') +
+        (toolCopyResult.missing > 0 ? ` (工具缺失 ${toolCopyResult.missing})` : ''));
 
     // 压缩
     const zipPath = path.join(DIST_DIR, 'workshop.zip');
@@ -423,6 +581,8 @@ function buildAllPackage() {
         fs.copyFileSync(VOC_TOKEN_PREFLIGHT_JS, path.join(pkgDir, 'voc-token-preflight.js'));
     }
 
+    const toolCopyResult = copyToolPackageFiles(pkgDir);
+
     // 复制凭证模板
     if (fs.existsSync(CREDENTIALS_TEMPLATE)) {
         fs.copyFileSync(CREDENTIALS_TEMPLATE, path.join(pkgDir, 'voc-credentials.template.json'));
@@ -434,7 +594,7 @@ function buildAllPackage() {
     // 复制发布套件中的技能(排除测试技能和未发布的即梦/视频创作技能)
     const RELEASED_SKILLS = new Set([
         ...PACKAGES['voc-core'].skills,
-        ...PACKAGES['social-media'].skills
+        ...PACKAGES['voc-social-data'].skills
     ]);
     if (fs.existsSync(SKILLS_DIR)) {
         const allSkills = fs.readdirSync(SKILLS_DIR).filter(d => {
@@ -453,7 +613,8 @@ function buildAllPackage() {
             skillCount++;
         }
     }
-    console.log(`    ✅ 复制 ${skillCount} 个技能`);
+    console.log(`    ✅ 复制 ${skillCount} 个技能 + ${toolCopyResult.copied} 个工具文件` +
+        (toolCopyResult.missing > 0 ? `(工具缺失 ${toolCopyResult.missing} 个)` : ''));
 
     // 复制 workshop 文件(仅白名单)
     if (fs.existsSync(WORKSHOP_DIR)) {
@@ -481,7 +642,7 @@ function buildAllPackage() {
         'OpenClaw 全量安装包 v4.1',
         '==================================================',
         '',
-        `包含 ${skillCount} 个技能 + VOC虾工作坊 (${workshopCount}个文件) + Token 工具`,
+        `包含 ${skillCount} 个技能 + VOC虾工作坊 (${workshopCount}个文件) + ${toolCopyResult.copied} 个本地工具文件`,
         '',
         '安装方法:',
         '  1. 解压本压缩包',
@@ -498,8 +659,8 @@ function buildAllPackage() {
         '  node install-all.js --dry-run          # 预览模式',
         '  node install-all.js --skills-only      # 只装 Skills',
         '  node install-all.js --workshop-only    # 只装 Workshop',
-        '  node set-voc-token.js <token>          # 设置/更新 Token',
-        '  node voc-token-preflight.js            # 检测 Token 有效性和余额(Workshop 前置检查)',
+        '  node ~/.openclaw/tools/set-voc-token.js <token>          # 设置/更新 Token',
+        '  node ~/.openclaw/tools/voc-token-preflight.js            # 检测 Token 有效性和余额(Workshop 前置检查)',
         ''
     ].join('\n');
     fs.writeFileSync(path.join(pkgDir, 'README.txt'), readme, 'utf8');
@@ -524,6 +685,12 @@ function buildAllPackage() {
 // Main
 // ============================================
 async function main() {
+    const options = parseArgs(process.argv.slice(2));
+    if (options.help) {
+        showHelp();
+        return;
+    }
+
     console.log('');
     console.log('==================================================');
     console.log('  OpenClaw Skills + Workshop 打包 + CDN 上传 v4.1');
@@ -531,9 +698,9 @@ async function main() {
     console.log('');
 
     // 前置检查
-    if (!fs.existsSync(SKILLS_DIR)) {
-        console.error(`❌ Skills 目录不存在: ${SKILLS_DIR}`);
-        console.error('   请先运行 deploy-to-openclaw.ps1');
+    if (!SKILL_SOURCE_DIRS.some(dir => fs.existsSync(dir))) {
+        console.error(`❌ 未找到可用 Skills 目录`);
+        console.error(`   已检查: ${SKILL_SOURCE_DIRS.join(', ')}`);
         process.exit(1);
     }
     if (!fs.existsSync(INSTALL_JS)) {
@@ -547,35 +714,54 @@ async function main() {
     // Step 1: 打包 Skills
     console.log('── Step 1: 打包 Skills ──');
     const zipFiles = {};
-    for (const [pkgId, pkg] of Object.entries(PACKAGES)) {
+    const selectedPackageEntries = getSelectedPackageEntries(options.only);
+    for (const [pkgId, pkg, canonicalId] of selectedPackageEntries) {
         console.log(`  ${pkg.label} (${pkg.skills.length} 个技能)`);
-        zipFiles[pkgId] = buildPackage(pkgId, pkg);
+        zipFiles[pkgId] = buildPackage(canonicalId, pkg, pkgId);
+        if (options.only.length > 0) continue;
+        for (const alias of pkg.aliases || []) {
+            console.log(`  ${pkg.label}(兼容旧名 ${alias},${pkg.skills.length} 个技能)`);
+            zipFiles[alias] = buildPackage(canonicalId, pkg, alias);
+        }
     }
     console.log('');
 
     // Step 1b: 打包 Workshop
-    console.log('── Step 1b: 打包 Workshop ──');
-    if (fs.existsSync(WORKSHOP_DIR)) {
-        console.log('  🦐 VOC虾工作坊');
-        zipFiles['workshop'] = buildWorkshopPackage();
-    } else {
-        console.log('  ⚠️  Workshop 目录不存在,跳过');
+    if (!options.skipWorkshop) {
+        console.log('── Step 1b: 打包 Workshop ──');
+        if (fs.existsSync(WORKSHOP_DIR)) {
+            console.log('  🦐 VOC虾工作坊');
+            zipFiles['workshop'] = buildWorkshopPackage();
+        } else {
+            console.log('  ⚠️  Workshop 目录不存在,跳过');
+        }
+        console.log('');
     }
-    console.log('');
 
     // Step 1c: 打包全量包
-    console.log('── Step 1c: 打包全量包 ──');
-    console.log('  📦 openclaw-all (Skills + Workshop + Token工具)');
-    zipFiles['openclaw-all'] = buildAllPackage();
-    console.log('');
+    if (!options.skipAll) {
+        console.log('── Step 1c: 打包全量包 ──');
+        console.log('  📦 openclaw-all (Skills + Workshop + Token工具)');
+        zipFiles['openclaw-all'] = buildAllPackage();
+        console.log('');
+    }
+
+    if (options.skipUpload) {
+        console.log('── Step 2: 跳过上传 ──');
+        for (const [pkgId, zipPath] of Object.entries(zipFiles)) {
+            console.log(`  ${pkgId}: ${zipPath}`);
+        }
+        if (fs.existsSync(TEMP_BASE)) fs.rmSync(TEMP_BASE, { recursive: true, force: true });
+        return;
+    }
 
     // Step 2: 上传到七牛
     console.log('── Step 2: 上传到七牛云 CDN ──');
     const downloadUrls = {};
     for (const [pkgId, zipPath] of Object.entries(zipFiles)) {
-        const pkg = PACKAGES[pkgId];
+        const pkg = getPackageDefinition(pkgId);
         const cdnKey = `${CDN_PREFIX}/${pkgId}.zip`;
-        const label = pkgId === 'workshop' ? '🦐 VOC虾工作坊' : pkgId === 'openclaw-all' ? '📦 全量包' : pkg.label;
+        const label = pkgId === 'workshop' ? '🦐 VOC虾工作坊' : pkgId === 'openclaw-all' ? '📦 全量包' : getPackageLogLabel(pkgId);
         process.stdout.write(`  ${label} ... `);
         try {
             const result = await uploadFile(zipPath, cdnKey);
@@ -598,7 +784,7 @@ async function main() {
         } else if (pkgId === 'openclaw-all') {
             console.log('  📦 全量包');
         } else {
-            const pkg = PACKAGES[pkgId];
+            const pkg = getPackageDefinition(pkgId);
             if (pkg) console.log(`  ${pkg.label}`);
         }
         console.log(`  👉 ${url}`);

+ 56 - 15
scripts/deploy/upload-skills.js

@@ -66,12 +66,13 @@ const SKILL_PACKAGES = {
         status: 'stable',   // stable | testing | hidden
         emoji: '🔍'
     },
-    'social-media': {
-        label: '社媒数据套件',
-        description: 'TikTok / Instagram / 抖音数据采集',
-        categories: ['social-media', 'douyin'],
+    'voc-social-data': {
+        label: 'VOC 社媒数据套件',
+        description: '小红书 / 抖音 / TikTok / Instagram 数据采集',
+        categories: ['social-media', 'douyin', 'xiaohongshu'],
         status: 'stable',
-        emoji: '📱'
+        emoji: '📱',
+        aliases: ['social-media']
     },
     'ai-creation': {
         label: 'AI 创作套件',
@@ -89,6 +90,27 @@ const SKILL_PACKAGES = {
     }
 };
 
+const PACKAGE_ALIAS_TO_CANONICAL = Object.fromEntries(
+    Object.entries(SKILL_PACKAGES).flatMap(([pkgId, pkg]) =>
+        (pkg.aliases || []).map(alias => [alias, pkgId])
+    )
+);
+
+function getPackageDefinition(pkgId) {
+    return SKILL_PACKAGES[pkgId] || SKILL_PACKAGES[PACKAGE_ALIAS_TO_CANONICAL[pkgId]];
+}
+
+function isLegacyPackageId(pkgId) {
+    return Boolean(PACKAGE_ALIAS_TO_CANONICAL[pkgId]);
+}
+
+function getPackageLogLabel(pkgId) {
+    const pkg = getPackageDefinition(pkgId);
+    if (!pkg) return pkgId;
+    const suffix = isLegacyPackageId(pkgId) ? `(兼容旧名 ${pkgId})` : '';
+    return `${pkg.emoji} ${pkg.label}${suffix}`;
+}
+
 // ============================================
 // Workshop 文件定义 (v4.1)
 // ============================================
@@ -474,8 +496,11 @@ function generateReadme(skillEntries, workshopManifestUrl) {
         if (pkg.status === 'hidden') continue;
         const count = (pkgMap[pkgId] || []).length;
         const statusBadge = pkg.status === 'stable' ? '✅ 正式' : '🧪 测试中';
-        const installUrl = `${CDN_DOMAIN}/${CDN_PREFIX}/packages/${pkgId}.json`;
-        lines.push(`| ${pkg.emoji} **${pkg.label}** | ${pkg.description} | ${count} | ${statusBadge} | [${pkgId}.json](${installUrl}) |`);
+        const installLinks = [
+            `[${pkgId}.json](${CDN_DOMAIN}/${CDN_PREFIX}/packages/${pkgId}.json)`,
+            ...(pkg.aliases || []).map(alias => `[${alias}.json](${CDN_DOMAIN}/${CDN_PREFIX}/packages/${alias}.json)`)
+        ];
+        lines.push(`| ${pkg.emoji} **${pkg.label}** | ${pkg.description} | ${count} | ${statusBadge} | ${installLinks.join(' / ')} |`);
     }
     lines.push('');
     lines.push('---');
@@ -494,6 +519,10 @@ function generateReadme(skillEntries, workshopManifestUrl) {
         lines.push('>');
         const installUrl = `${CDN_DOMAIN}/${CDN_PREFIX}/packages/${pkgId}.json`;
         lines.push(`> 📥 一键安装清单:[\`${pkgId}.json\`](${installUrl})`);
+        if (pkg.aliases && pkg.aliases.length > 0) {
+            const aliasLinks = pkg.aliases.map(alias => `[\`${alias}.json\`](${CDN_DOMAIN}/${CDN_PREFIX}/packages/${alias}.json)`);
+            lines.push(`> ↩️ 兼容旧清单:${aliasLinks.join(' / ')}`);
+        }
         lines.push('');
 
         // 按 category 子分组
@@ -580,11 +609,12 @@ function generatePackageManifests(skillEntries) {
         const entries = pkgMap[pkgId] || [];
         if (entries.length === 0) continue;
 
-        manifests[pkgId] = {
+        const manifest = {
             package: pkgId,
             label: pkg.label,
             description: pkg.description,
             status: pkg.status,
+            aliases: pkg.aliases || [],
             skillCount: entries.length,
             generatedAt: new Date().toISOString(),
             skills: entries.map(e => ({
@@ -595,6 +625,15 @@ function generatePackageManifests(skillEntries) {
                 files: e.cdnUrls
             }))
         };
+        manifests[pkgId] = manifest;
+        for (const alias of pkg.aliases || []) {
+            manifests[alias] = {
+                ...manifest,
+                package: alias,
+                canonicalPackage: pkgId,
+                legacyPackage: true
+            };
+        }
     }
     return manifests;
 }
@@ -763,9 +802,10 @@ async function main() {
                 const buf = Buffer.from(JSON.stringify(manifest, null, 2), 'utf8');
                 const res = await uploadBuffer(buf, key);
                 packageUrls[pkgId] = res.url;
-                const pkg = SKILL_PACKAGES[pkgId];
-                const statusTag = pkg.status === 'testing' ? ' 🧪' : ' ✅';
-                console.log(`  ${statusTag} ${pkg.label} (${manifest.skillCount}个技能): ${res.url}`);
+                const pkg = getPackageDefinition(pkgId);
+                const statusTag = manifest.status === 'testing' ? ' 🧪' : ' ✅';
+                const legacyNote = isLegacyPackageId(pkgId) ? `(兼容旧名 ${pkgId})` : '';
+                console.log(`  ${statusTag} ${pkg.label}${legacyNote} (${manifest.skillCount}个技能): ${res.url}`);
             } catch (err) {
                 console.log(`  ❌ ${pkgId}.json 上传失败: ${err.message}`);
             }
@@ -809,10 +849,11 @@ async function main() {
         if (pkgId === 'workshop') {
             console.log(`  🦐 VOC虾工作坊`);
         } else {
-            const pkg = SKILL_PACKAGES[pkgId];
+            const pkg = getPackageDefinition(pkgId);
             if (!pkg) continue;
             const statusTag = pkg.status === 'testing' ? '🧪' : '✅';
-            console.log(`  ${statusTag} ${pkg.label}`);
+            const legacyNote = isLegacyPackageId(pkgId) ? `(兼容旧名 ${pkgId})` : '';
+            console.log(`  ${statusTag} ${pkg.label}${legacyNote}`);
         }
         console.log(`    👉 ${url}`);
     }
@@ -844,8 +885,8 @@ async function main() {
         if (pkgId === 'workshop') {
             console.log(`  🦐 VOC虾工作坊: ${url}`);
         } else {
-            const pkg = SKILL_PACKAGES[pkgId];
-            if (pkg) console.log(`  ${pkg.emoji} ${pkg.label}: ${url}`);
+            const pkg = getPackageDefinition(pkgId);
+            if (pkg) console.log(`  ${getPackageLogLabel(pkgId)}: ${url}`);
         }
     }
     console.log('==================================================');

+ 364 - 0
scripts/tools/chapter-insight-writer.js

@@ -0,0 +1,364 @@
+const fs = require('fs');
+const path = require('path');
+
+const HYPOTHESIS_LABELS = {
+  H1: '品类机会',
+  H2: '用户需求',
+  H3: '产品缺口',
+  H4: '价格认知',
+  H5: '渠道内容',
+  H6: '竞品策略',
+  H7: '定位表达',
+  H8: '增长行动'
+};
+
+const LIGHT_CHAPTERS = [
+  { id: 'Ch1', title: '结论先行', hypothesisTags: ['H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'H7', 'H8'], focus: '回答核心决策问题' },
+  { id: 'Ch2', title: '用户声音', hypothesisTags: ['H2', 'H3'], focus: '呈现痛点、场景、需求结构' },
+  { id: 'Ch3', title: '竞品/平台发现', hypothesisTags: ['H5', 'H6', 'H7'], focus: '解释平台内容、竞品策略和可用话术' },
+  { id: 'Ch4', title: '行动建议', hypothesisTags: ['H8'], focus: '输出下一步 P0/P1/P2 动作和验证指标' }
+];
+
+const ENTERPRISE_CHAPTERS = [
+  { id: 'Ch1', title: '执行摘要与核心判断', hypothesisTags: ['H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'H7', 'H8'], focus: '面向决策人给出结论' },
+  { id: 'Ch2', title: '品类与需求全景', hypothesisTags: ['H1', 'H2'], focus: '判断市场机会和需求结构' },
+  { id: 'Ch3', title: '用户 VOC 与痛点结构', hypothesisTags: ['H2', 'H3'], focus: '展示真实用户语言' },
+  { id: 'Ch4', title: '竞品与替代方案分析', hypothesisTags: ['H3', 'H6'], focus: '找到竞争位置和缺口' },
+  { id: 'Ch5', title: '定位、话术、产品/内容机会', hypothesisTags: ['H5', 'H7'], focus: '转化为表达与产品机会' },
+  { id: 'Ch6', title: '渠道与场景策略', hypothesisTags: ['H5', 'H8'], focus: '明确不同平台打法' },
+  { id: 'Ch7', title: '行动计划与验证路径', hypothesisTags: ['H8'], focus: '形成落地闭环' }
+];
+
+function parseArgs(argv) {
+  const args = {};
+  for (let i = 0; i < argv.length; i++) {
+    const token = argv[i];
+    if (!token.startsWith('--')) continue;
+    const eq = token.indexOf('=');
+    if (eq >= 0) {
+      args[token.slice(2, eq)] = token.slice(eq + 1);
+    } else {
+      const key = token.slice(2);
+      const next = argv[i + 1];
+      if (next && !next.startsWith('--')) {
+        args[key] = next;
+        i++;
+      } else {
+        args[key] = true;
+      }
+    }
+  }
+  return args;
+}
+
+function usage() {
+  return [
+    'Usage:',
+    '  node scripts/tools/chapter-insight-writer.js --input <normalized-dir|_merged.json|comments-flat.jsonl> --output <out-dir> [--project <name>] [--category <name>] [--version light|enterprise] [--min-evidence 3]',
+    '',
+    'Outputs:',
+    '  chapter-insights.md',
+    '  chapter-insights.json'
+  ].join('\n');
+}
+
+function ensureDir(dirPath) {
+  fs.mkdirSync(dirPath, { recursive: true });
+}
+
+function readJson(filePath) {
+  return JSON.parse(fs.readFileSync(filePath, 'utf8'));
+}
+
+function readJsonl(filePath) {
+  return fs.readFileSync(filePath, 'utf8')
+    .split(/\r?\n/)
+    .map(line => line.trim())
+    .filter(Boolean)
+    .map(line => JSON.parse(line));
+}
+
+function uniq(values) {
+  return [...new Set(values.filter(value => value !== undefined && value !== null && value !== ''))];
+}
+
+function asArray(value) {
+  if (!value) return [];
+  if (Array.isArray(value)) return value;
+  return [value];
+}
+
+function countBy(records, getter) {
+  const counts = new Map();
+  records.forEach(record => {
+    const key = getter(record) || '未标注';
+    counts.set(key, (counts.get(key) || 0) + 1);
+  });
+  return [...counts.entries()]
+    .map(([label, count]) => ({ label, count }))
+    .sort((a, b) => b.count - a.count || String(a.label).localeCompare(String(b.label)));
+}
+
+function scoreEvidence(record) {
+  return Number(record.likeCount || 0) + Number(record.replyCount || 0) * 2 + String(record.text || '').length / 80;
+}
+
+function cleanText(value) {
+  return String(value || '').replace(/\s+/g, ' ').trim();
+}
+
+function truncate(value, length = 96) {
+  const text = cleanText(value);
+  return text.length > length ? `${text.slice(0, length - 1)}…` : text;
+}
+
+function resolveInput(inputPath) {
+  const absolute = path.resolve(inputPath);
+  const stat = fs.statSync(absolute);
+  if (stat.isDirectory()) {
+    const merged = path.join(absolute, '_merged.json');
+    const flat = path.join(absolute, 'comments-flat.jsonl');
+    if (fs.existsSync(merged)) return { type: 'merged', filePath: merged, data: readJson(merged) };
+    if (fs.existsSync(flat)) return { type: 'jsonl', filePath: flat, data: readJsonl(flat) };
+    throw new Error(`no _merged.json or comments-flat.jsonl found in ${absolute}`);
+  }
+  if (absolute.endsWith('.jsonl')) return { type: 'jsonl', filePath: absolute, data: readJsonl(absolute) };
+  return { type: 'merged', filePath: absolute, data: readJson(absolute) };
+}
+
+function normalizeInput(resolved) {
+  if (resolved.type === 'jsonl') {
+    return {
+      metadata: {},
+      items: [],
+      comments: resolved.data,
+      sources: [{ file: path.basename(resolved.filePath), platform: 'jsonl', commentCount: resolved.data.length }]
+    };
+  }
+  const data = resolved.data;
+  if (Array.isArray(data)) return { metadata: {}, items: [], comments: data, sources: [] };
+  return {
+    metadata: data.metadata || {},
+    items: asArray(data.items),
+    comments: asArray(data.comments),
+    sources: asArray(data.sources)
+  };
+}
+
+function evidenceCard(record) {
+  return {
+    id: record.id || record.commentId,
+    platform: record.platform,
+    keyword: record.keyword,
+    batch: record.batch,
+    hypothesisTags: asArray(record.hypothesisTags),
+    text: cleanText(record.text || record.content),
+    author: record.author,
+    likeCount: Number(record.likeCount || 0),
+    replyCount: Number(record.replyCount || 0),
+    url: record.url,
+    parentId: record.parentId,
+    commentId: record.commentId || record.id,
+    theme: record.theme,
+    source: `${record.platform || 'unknown'} / ${record.keyword || 'unknown'} / ${record.batch || 'P0'} / ${record.commentId || record.id || 'no-id'}`
+  };
+}
+
+function filterByTags(records, tags) {
+  const set = new Set(tags);
+  return records.filter(record => asArray(record.hypothesisTags).some(tag => set.has(tag)));
+}
+
+function selectEvidence(records, limit) {
+  const seen = new Set();
+  return [...records]
+    .filter(record => cleanText(record.text || record.content))
+    .sort((a, b) => scoreEvidence(b) - scoreEvidence(a))
+    .filter(record => {
+      const key = cleanText(record.text || record.content).slice(0, 80);
+      if (seen.has(key)) return false;
+      seen.add(key);
+      return true;
+    })
+    .slice(0, limit)
+    .map(evidenceCard);
+}
+
+function inferConclusion(chapter, records, category) {
+  if (!records.length) return `当前样本不足,暂不支持对「${chapter.title}」做结论。`;
+  const themes = countBy(records, record => record.theme).slice(0, 3);
+  const keywords = countBy(records, record => record.keyword).slice(0, 3);
+  const themeText = themes.map(item => `${item.label}(${item.count})`).join('、');
+  const keywordText = keywords.map(item => item.label).join('、');
+  return `当前 ${records.length} 条可追溯 VOC 显示,${category || '该品类'} 在「${chapter.title}」中最稳定的信号集中在 ${themeText || '未标注主题'};主要由 ${keywordText || '未标注关键词'} 等关键词触发。`;
+}
+
+function inferExplanation(chapter, records) {
+  if (!records.length) return '该章节没有足够 VOC 支撑,只能作为补采方向,不能写成业务结论。';
+  const tags = chapter.hypothesisTags.map(tag => `${tag}${HYPOTHESIS_LABELS[tag] ? ` ${HYPOTHESIS_LABELS[tag]}` : ''}`).join('、');
+  const platforms = countBy(records, record => record.platform).map(item => `${item.label} ${item.count}`).join('、');
+  return `本章对应 ${tags}。证据来自 ${platforms || '未标注平台'},因此适合写成“当前样本支持的阶段性判断”,不应外推为全市场结论。`;
+}
+
+function inferAction(chapter, records, minEvidence) {
+  if (records.length < minEvidence) return `补采 ${chapter.hypothesisTags.join('/')} 相关关键词,至少补足 ${minEvidence} 条可引用 VOC 后再定稿。`;
+  if (chapter.id === 'Ch4' || chapter.title.includes('行动')) return '把证据最高的 3 个用户表达转成 P0/P1/P2 行动,并为每条行动指定验证指标。';
+  if (chapter.title.includes('用户')) return '优先把高频痛点、场景和决策标准转成 VOC 证据卡,进入报告正文。';
+  if (chapter.title.includes('平台') || chapter.title.includes('定位')) return '把高赞评论中的用户原话转成内容标题、详情页 FAQ 或话术 AB 测试。';
+  return '保留本章结论作为报告开头判断,并在后续章节用证据卡展开。';
+}
+
+function buildChapter(chapter, allComments, context, options) {
+  const records = filterByTags(allComments, chapter.hypothesisTags);
+  const evidence = selectEvidence(records, options.evidenceLimit);
+  const warnings = [];
+  if (evidence.length < options.minEvidence) warnings.push(`证据不足:${chapter.id} 只有 ${evidence.length} 条去重证据,低于 ${options.minEvidence} 条。`);
+  chapter.hypothesisTags.forEach(tag => {
+    const count = filterByTags(allComments, [tag]).length;
+    if (count < options.minEvidence) warnings.push(`${tag} ${HYPOTHESIS_LABELS[tag] || ''} 证据量不足:${count}/${options.minEvidence}。`);
+  });
+  return {
+    ...chapter,
+    evidenceCount: records.length,
+    uniqueEvidenceCount: evidence.length,
+    topThemes: countBy(records, record => record.theme).slice(0, 6),
+    topKeywords: countBy(records, record => record.keyword).slice(0, 6),
+    conclusion: inferConclusion(chapter, records, context.category),
+    evidence,
+    explanation: inferExplanation(chapter, records),
+    action: inferAction(chapter, records, options.minEvidence),
+    warnings: uniq(warnings)
+  };
+}
+
+function buildDraft(normalized, args) {
+  const version = args.version === 'enterprise' ? 'enterprise' : 'light';
+  const chapters = version === 'enterprise' ? ENTERPRISE_CHAPTERS : LIGHT_CHAPTERS;
+  const comments = normalized.comments.filter(comment => cleanText(comment.text || comment.content));
+  const context = {
+    project: args.project || normalized.metadata.project || 'chapter-insight-draft',
+    category: args.category || normalized.metadata.category || '',
+    version,
+    generatedAt: new Date().toISOString(),
+    platforms: uniq(comments.map(comment => comment.platform)),
+    keywords: uniq(comments.map(comment => comment.keyword)),
+    batches: uniq(comments.map(comment => comment.batch)),
+    hypothesisTags: uniq(comments.flatMap(comment => asArray(comment.hypothesisTags))),
+    commentCount: comments.length,
+    itemCount: normalized.items.length
+  };
+  const options = {
+    minEvidence: Number(args['min-evidence'] || 3),
+    evidenceLimit: Number(args['evidence-limit'] || 5)
+  };
+  const chapterDrafts = chapters.map(chapter => buildChapter(chapter, comments, context, options));
+  const audit = {
+    generatedAt: context.generatedAt,
+    minEvidence: options.minEvidence,
+    chapterCount: chapterDrafts.length,
+    warningCount: chapterDrafts.reduce((sum, chapter) => sum + chapter.warnings.length, 0),
+    unsupportedConclusionCount: chapterDrafts.filter(chapter => !chapter.evidence.length && !chapter.conclusion.includes('暂不支持')).length,
+    totalEvidenceCards: chapterDrafts.reduce((sum, chapter) => sum + chapter.evidence.length, 0)
+  };
+  return { metadata: context, chapters: chapterDrafts, audit };
+}
+
+function renderEvidenceMd(evidence) {
+  if (!evidence.length) return '- 暂无可引用证据。';
+  return evidence.map((item, index) => [
+    `### 证据 ${index + 1}:${truncate(item.text, 28)}`,
+    '',
+    `- **来源**:${item.source}`,
+    `- **原声**:“${item.text}”`,
+    `- **标签**:${item.hypothesisTags.join(', ') || '未标注'}`,
+    `- **互动**:${item.likeCount} 赞 / ${item.replyCount} 回复`,
+    `- **解释**:这条原声可支撑本章关于「${item.theme || '未标注主题'}」的阶段性判断。`
+  ].join('\n')).join('\n\n');
+}
+
+function renderMarkdown(draft) {
+  const meta = draft.metadata;
+  const lines = [];
+  lines.push('# Chapter Insight Draft');
+  lines.push('');
+  lines.push('| 字段 | 内容 |');
+  lines.push('|---|---|');
+  lines.push(`| 项目 | ${meta.project} |`);
+  lines.push(`| 品类 | ${meta.category || '未填写'} |`);
+  lines.push(`| 版本 | ${meta.version} |`);
+  lines.push(`| 平台 | ${meta.platforms.join('、') || '未标注'} |`);
+  lines.push(`| 关键词 | ${meta.keywords.join('、') || '未标注'} |`);
+  lines.push(`| VOC 数 | ${meta.commentCount} |`);
+  lines.push(`| 生成时间 | ${meta.generatedAt} |`);
+  lines.push('');
+  lines.push('## 0. 审计摘要');
+  lines.push('');
+  lines.push(`- **章节数**:${draft.audit.chapterCount}`);
+  lines.push(`- **证据卡数**:${draft.audit.totalEvidenceCards}`);
+  lines.push(`- **警告数**:${draft.audit.warningCount}`);
+  lines.push(`- **无证据结论数**:${draft.audit.unsupportedConclusionCount}`);
+  lines.push('');
+  draft.chapters.forEach(chapter => {
+    lines.push(`## ${chapter.id}. ${chapter.title}`);
+    lines.push('');
+    lines.push(`- **章节目标**:${chapter.focus}`);
+    lines.push(`- **对应假设**:${chapter.hypothesisTags.join(', ')}`);
+    lines.push(`- **证据量**:${chapter.evidenceCount} 条 VOC / ${chapter.uniqueEvidenceCount} 条证据卡`);
+    lines.push(`- **章节结论**:${chapter.conclusion}`);
+    lines.push(`- **业务解释**:${chapter.explanation}`);
+    lines.push(`- **行动建议**:${chapter.action}`);
+    if (chapter.warnings.length) lines.push(`- **警告**:${chapter.warnings.join(';')}`);
+    lines.push('');
+    lines.push('### 高频主题');
+    lines.push('');
+    lines.push('| 主题 | 频次 |');
+    lines.push('|---|---:|');
+    chapter.topThemes.forEach(item => lines.push(`| ${item.label} | ${item.count} |`));
+    lines.push('');
+    lines.push('### VOC 证据卡');
+    lines.push('');
+    lines.push(renderEvidenceMd(chapter.evidence));
+    lines.push('');
+  });
+  return `${lines.join('\n')}\n`;
+}
+
+function main() {
+  const args = parseArgs(process.argv.slice(2));
+  if (args.help || !args.input || !args.output) {
+    console.log(usage());
+    process.exit(args.help ? 0 : 1);
+  }
+  const resolved = resolveInput(args.input);
+  const normalized = normalizeInput(resolved);
+  const draft = buildDraft(normalized, args);
+  const outputDir = path.resolve(args.output);
+  ensureDir(outputDir);
+  fs.writeFileSync(path.join(outputDir, 'chapter-insights.json'), JSON.stringify(draft, null, 2) + '\n', 'utf8');
+  fs.writeFileSync(path.join(outputDir, 'chapter-insights.md'), renderMarkdown(draft), 'utf8');
+  console.log(JSON.stringify({
+    outputDir,
+    files: ['chapter-insights.md', 'chapter-insights.json'],
+    chapterCount: draft.audit.chapterCount,
+    evidenceCards: draft.audit.totalEvidenceCards,
+    warnings: draft.audit.warningCount,
+    unsupportedConclusionCount: draft.audit.unsupportedConclusionCount
+  }, null, 2));
+}
+
+if (require.main === module) {
+  try {
+    main();
+  } catch (error) {
+    console.error(error.message);
+    process.exit(1);
+  }
+}
+
+module.exports = {
+  parseArgs,
+  buildDraft,
+  renderMarkdown,
+  selectEvidence,
+  countBy
+};

+ 459 - 0
scripts/tools/collection-matrix-builder.js

@@ -0,0 +1,459 @@
+const fs = require('fs');
+const path = require('path');
+
+function parseArgs(argv) {
+  const args = {};
+  for (let i = 0; i < argv.length; i++) {
+    const token = argv[i];
+    if (!token.startsWith('--')) continue;
+    const eq = token.indexOf('=');
+    if (eq >= 0) {
+      args[token.slice(2, eq)] = token.slice(eq + 1);
+    } else {
+      const key = token.slice(2);
+      const next = argv[i + 1];
+      if (next && !next.startsWith('--')) {
+        args[key] = next;
+        i++;
+      } else {
+        args[key] = true;
+      }
+    }
+  }
+  return args;
+}
+
+function usage() {
+  return [
+    'Usage:',
+    '  node scripts/tools/collection-matrix-builder.js --keywords <keywords.md|json> --output <out-dir> [--project <name>] [--platform <name>] [--target 20]',
+    '  node scripts/tools/collection-matrix-builder.js --keyword "kw1,kw2" --output <out-dir> [--platform 小红书]',
+    '  add --expand-hypotheses to auto-fill H1-H8 to at least 3 keywords each',
+    '',
+    'Outputs:',
+    '  3.CollectionMatrix.md',
+    '  collection-matrix.json'
+  ].join('\n');
+}
+
+const HYPOTHESIS_TAGS = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'H7', 'H8'];
+
+const HYPOTHESIS_KEYWORD_TEMPLATES = {
+  H1: [
+    { keyword: '{category} 市场机会', type: '品类词', batch: 'P0' },
+    { keyword: '{category} 值不值得买', type: '长尾问题词', batch: 'P0' },
+    { keyword: '{category} 趋势', type: '品类词', batch: 'P1' }
+  ],
+  H2: [
+    { keyword: '{category} 使用场景', type: '场景词', batch: 'P0' },
+    { keyword: '{category} 痛点', type: '痛点场景词', batch: 'P0' },
+    { keyword: '{category} 人群', type: '场景词', batch: 'P1' }
+  ],
+  H3: [
+    { keyword: '{category} 怎么选', type: '长尾问题词', batch: 'P0' },
+    { keyword: '{category} 配方', type: '产品词', batch: 'P1' },
+    { keyword: '{category} 产品缺点', type: '长尾问题词', batch: 'P2' }
+  ],
+  H4: [
+    { keyword: '{category} 价格', type: '价格词', batch: 'P1' },
+    { keyword: '{category} 规格', type: '产品词', batch: 'P1' },
+    { keyword: '{category} 性价比', type: '长尾问题词', batch: 'P1' }
+  ],
+  H5: [
+    { keyword: '{category} 种草', type: '平台内容词', batch: 'P1' },
+    { keyword: '{category} 达人推荐', type: '平台内容词', batch: 'P1' },
+    { keyword: '{category} 内容笔记', type: '内容词', batch: 'P1' }
+  ],
+  H6: [
+    { keyword: '{category} 竞品', type: '竞品词', batch: 'P1' },
+    { keyword: '{category} 替代品', type: '竞品词', batch: 'P1' },
+    { keyword: '{category} 对比', type: '竞品词', batch: 'P1' }
+  ],
+  H7: [
+    { keyword: '{category} 卖点', type: '话术词', batch: 'P1' },
+    { keyword: '{category} 定位', type: '话术词', batch: 'P1' },
+    { keyword: '{category} 话术', type: '话术词', batch: 'P2' }
+  ],
+  H8: [
+    { keyword: '{category} 复购', type: '行动词', batch: 'P2' },
+    { keyword: '{category} 推荐', type: '行动词', batch: 'P2' },
+    { keyword: '{category} 转化', type: '行动词', batch: 'P2' }
+  ]
+};
+
+function ensureDir(dirPath) {
+  fs.mkdirSync(dirPath, { recursive: true });
+}
+
+function readJson(filePath) {
+  return JSON.parse(fs.readFileSync(filePath, 'utf8'));
+}
+
+function splitList(value) {
+  if (!value) return [];
+  if (Array.isArray(value)) return value;
+  return String(value).split(/[,,;;]/).map(item => item.trim()).filter(Boolean);
+}
+
+function normalizeHeader(header) {
+  return header.trim().replace(/`/g, '').toLowerCase();
+}
+
+function parseMarkdownTables(text) {
+  const lines = text.split(/\r?\n/);
+  const tables = [];
+  let i = 0;
+  while (i < lines.length) {
+    const line = lines[i];
+    if (!/^\s*\|.*\|\s*$/.test(line) || !lines[i + 1] || !/^\s*\|\s*:?-{3,}:?\s*\|/.test(lines[i + 1])) {
+      i++;
+      continue;
+    }
+    const headers = splitMarkdownRow(line).map(normalizeHeader);
+    const rows = [];
+    i += 2;
+    while (i < lines.length && /^\s*\|.*\|\s*$/.test(lines[i])) {
+      const values = splitMarkdownRow(lines[i]);
+      const row = {};
+      headers.forEach((header, index) => {
+        row[header] = values[index] ? values[index].trim() : '';
+      });
+      rows.push(row);
+      i++;
+    }
+    tables.push({ headers, rows });
+  }
+  return tables;
+}
+
+function splitMarkdownRow(line) {
+  return line.trim().replace(/^\|/, '').replace(/\|$/, '').split('|').map(cell => cell.trim());
+}
+
+function rowValue(row, keys) {
+  for (const key of keys) {
+    const normalized = normalizeHeader(key);
+    if (row[normalized] !== undefined && row[normalized] !== '') return row[normalized];
+  }
+  return '';
+}
+
+function parseKeywordsMarkdown(filePath) {
+  const text = fs.readFileSync(filePath, 'utf8');
+  const tables = parseMarkdownTables(text);
+  const keywordRows = [];
+  tables.forEach(table => {
+    const hasKeyword = table.headers.some(header => ['keyword', '关键词'].includes(header));
+    const hasBatch = table.headers.some(header => ['batch', '批次'].includes(header));
+    if (!hasKeyword || !hasBatch) return;
+    table.rows.forEach(row => {
+      const keyword = rowValue(row, ['keyword', '关键词']);
+      if (!keyword) return;
+      keywordRows.push({
+        platform: rowValue(row, ['platform', '平台']),
+        keyword,
+        keywordType: rowValue(row, ['keywordType', '关键词类型', '类型']),
+        batch: rowValue(row, ['batch', '批次']),
+        targetCount: rowValue(row, ['targetCount', '目标数量', '目标样本']),
+        hypothesisTags: rowValue(row, ['hypothesisTags', '假设标签', 'H1-H8']),
+        purpose: rowValue(row, ['purpose', '目的', '用途']),
+        expectedSignal: rowValue(row, ['expectedSignal', '预期信号', '预期观察']),
+        risk: rowValue(row, ['risk', '风险', '噪声'])
+      });
+    });
+  });
+  return keywordRows;
+}
+
+function parseKeywordsJson(filePath) {
+  const data = readJson(filePath);
+  if (Array.isArray(data)) return data;
+  if (Array.isArray(data.matrix)) return data.matrix;
+  if (Array.isArray(data.keywords)) return data.keywords;
+  return [];
+}
+
+function inferKeywordType(keyword) {
+  if (/怎么选|有没有用|副作用|避坑|对比|测评|review|best/i.test(keyword)) return '长尾问题词';
+  if (/竞品|替代|vs|对标|品牌|测评/i.test(keyword)) return '竞品词';
+  if (/开学|熬夜|送礼|旅行|饭局|便秘|腹胀|场景/i.test(keyword)) return '场景词';
+  return '产品词';
+}
+
+function inferBatch(keyword, index) {
+  if (/核心|怎么选|痛点|便秘|腹胀|差评/i.test(keyword)) return 'P0';
+  if (/竞品|测评|替代|场景|价格|规格/i.test(keyword)) return 'P1';
+  return index < 3 ? 'P0' : 'P2';
+}
+
+function inferHypothesisTags(keyword, type) {
+  const tags = new Set();
+  if (/痛点|焦虑|便秘|腹胀|差评|避坑/i.test(keyword)) tags.add('H2');
+  if (/怎么选|配方|成分|参数|菌株|功能|产品/i.test(keyword)) tags.add('H3');
+  if (/价格|规格|贵|便宜|性价比/i.test(keyword)) tags.add('H4');
+  if (/平台|小红书|抖音|内容|种草|达人/i.test(keyword)) tags.add('H5');
+  if (/竞品|替代|对标|vs|品牌/i.test(keyword)) tags.add('H6');
+  if (/话术|定位|概念|卖点|表达/i.test(keyword)) tags.add('H7');
+  if (/行动|复购|推荐|转化|增长/i.test(keyword)) tags.add('H8');
+  if (/品类|趋势|市场|机会/i.test(keyword)) tags.add('H1');
+  if (tags.size === 0) {
+    if (/竞品/.test(type)) tags.add('H6');
+    else if (/场景/.test(type)) tags.add('H2');
+    else if (/问题/.test(type)) tags.add('H2');
+    else tags.add('H3');
+  }
+  return Array.from(tags);
+}
+
+function inferPurpose(keyword, type, tags) {
+  if (tags.includes('H2')) return `识别「${keyword}」相关的用户痛点、触发场景与真实表达`;
+  if (tags.includes('H6')) return `分析「${keyword}」相关的竞品、替代方案和用户比较标准`;
+  if (tags.includes('H4')) return `观察「${keyword}」相关的价格、规格和价值感判断`;
+  if (tags.includes('H7')) return `提炼「${keyword}」相关的定位、卖点和话术表达`;
+  return `验证「${keyword}」相关的品类、产品和购买决策信号`;
+}
+
+function inferExpectedSignal(type, tags) {
+  const signals = [];
+  if (tags.includes('H1')) signals.push('品类机会');
+  if (tags.includes('H2')) signals.push('高频场景', '痛点原声');
+  if (tags.includes('H3')) signals.push('产品参数', '购买标准');
+  if (tags.includes('H4')) signals.push('价格带', '规格偏好');
+  if (tags.includes('H5')) signals.push('内容形式', '平台决策链路');
+  if (tags.includes('H6')) signals.push('竞品优劣势', '替代原因');
+  if (tags.includes('H7')) signals.push('用户复述话术', '定位表达');
+  if (tags.includes('H8')) signals.push('行动建议', '验证指标');
+  return Array.from(new Set(signals)).join('、') || `${type || '关键词'}相关 VOC`;
+}
+
+function normalizeMatrixRows(rows, options) {
+  return rows
+    .filter(row => row.keyword || row.keyword === undefined)
+    .map((row, index) => {
+      const keyword = row.keyword || row.Keyword || row.关键词 || '';
+      const keywordType = row.keywordType || row['关键词类型'] || row.type || inferKeywordType(keyword);
+      const batch = row.batch || row.批次 || inferBatch(keyword, index);
+      const hypothesisTags = splitList(row.hypothesisTags || row['假设标签'] || row.tags || row.H || '').length
+        ? splitList(row.hypothesisTags || row['假设标签'] || row.tags || row.H || '')
+        : inferHypothesisTags(keyword, keywordType);
+      return {
+        id: row.id || `M${String(index + 1).padStart(3, '0')}`,
+        platform: row.platform || row.平台 || options.platform || '小红书',
+        keyword,
+        keywordType,
+        batch,
+        targetCount: Number(row.targetCount || row['目标数量'] || row.count || options.target || 20),
+        hypothesisTags,
+        purpose: row.purpose || row.目的 || inferPurpose(keyword, keywordType, hypothesisTags),
+        expectedSignal: row.expectedSignal || row['预期信号'] || inferExpectedSignal(keywordType, hypothesisTags),
+        risk: row.risk || row.风险 || '需检查离题、广告、重复和平台偏差',
+        status: row.status || '未开始'
+      };
+    })
+    .filter(row => row.keyword);
+}
+
+function nextMatrixId(rows, offset = 1) {
+  const max = rows.reduce((current, row) => {
+    const match = String(row.id || '').match(/^M(\d+)$/);
+    return match ? Math.max(current, Number(match[1])) : current;
+  }, 0);
+  return `M${String(max + offset).padStart(3, '0')}`;
+}
+
+function expandHypotheses(rows, options) {
+  const expanded = rows.map(row => ({ ...row, hypothesisTags: [...row.hypothesisTags] }));
+  const category = options.category || options.project || '品类';
+  const existingKeywords = new Set(expanded.map(row => row.keyword));
+  HYPOTHESIS_TAGS.forEach(tag => {
+    let currentCount = expanded.filter(row => row.hypothesisTags.includes(tag)).length;
+    let templateIndex = 0;
+    while (currentCount < 3) {
+      const templates = HYPOTHESIS_KEYWORD_TEMPLATES[tag] || [];
+      const template = templates[templateIndex % templates.length];
+      const baseKeyword = template.keyword.replace('{category}', category);
+      let keyword = baseKeyword;
+      let suffix = 2;
+      while (existingKeywords.has(keyword)) {
+        keyword = `${baseKeyword} ${suffix}`;
+        suffix++;
+      }
+      const row = {
+        id: nextMatrixId(expanded),
+        platform: options.platform || '小红书',
+        keyword,
+        keywordType: template.type,
+        batch: template.batch,
+        targetCount: Number(options.target || 20),
+        hypothesisTags: [tag],
+        purpose: inferPurpose(keyword, template.type, [tag]),
+        expectedSignal: inferExpectedSignal(template.type, [tag]),
+        risk: '自动补齐关键词,执行前需人工确认搜索噪声和业务相关性',
+        status: '待确认'
+      };
+      expanded.push(row);
+      existingKeywords.add(keyword);
+      currentCount++;
+      templateIndex++;
+    }
+  });
+  return expanded.map((row, index) => ({ ...row, id: `M${String(index + 1).padStart(3, '0')}` }));
+}
+
+function buildRows(args) {
+  if (args.keywords) {
+    const filePath = path.resolve(args.keywords);
+    if (filePath.endsWith('.json')) return parseKeywordsJson(filePath);
+    return parseKeywordsMarkdown(filePath);
+  }
+  return splitList(args.keyword).map(keyword => ({ keyword }));
+}
+
+function auditMatrix(rows) {
+  const byHypothesis = {};
+  HYPOTHESIS_TAGS.forEach(tag => {
+    byHypothesis[tag] = [];
+  });
+  rows.forEach(row => {
+    row.hypothesisTags.forEach(tag => {
+      byHypothesis[tag] = byHypothesis[tag] || [];
+      byHypothesis[tag].push(row.keyword);
+    });
+  });
+  const warnings = [];
+  Object.entries(byHypothesis).forEach(([tag, keywords]) => {
+    const uniqueKeywords = Array.from(new Set(keywords));
+    if (uniqueKeywords.length < 3) warnings.push(`${tag} 仅有 ${uniqueKeywords.length} 个关键词支撑,建议至少 3 个`);
+  });
+  const missingFields = rows
+    .filter(row => !row.platform || !row.batch || !row.targetCount || !row.hypothesisTags.length)
+    .map(row => row.id);
+  if (missingFields.length) warnings.push(`以下矩阵行缺少必填字段:${missingFields.join(', ')}`);
+  return { byHypothesis, warnings };
+}
+
+function renderMarkdown(rows, meta, audit) {
+  const lines = [];
+  lines.push('# 3. VOC 采集矩阵');
+  lines.push('');
+  lines.push('## 1. 采集目标');
+  lines.push('');
+  lines.push('| 字段 | 填写 |');
+  lines.push('|---|---|');
+  lines.push(`| 项目名称 | ${meta.project} |`);
+  lines.push(`| 核心决策问题 | ${meta.question} |`);
+  lines.push(`| 覆盖平台 | ${Array.from(new Set(rows.map(row => row.platform))).join('、')} |`);
+  lines.push(`| 计划采集周期 | ${meta.period} |`);
+  lines.push(`| 目标原始样本数 | ${rows.reduce((sum, row) => sum + Number(row.targetCount || 0), 0)} |`);
+  lines.push(`| 目标有效 VOC 数 | ${rows.reduce((sum, row) => sum + Number(row.targetCount || 0), 0)} |`);
+  lines.push(`| 采集负责人 | ${meta.owner} |`);
+  lines.push('');
+  lines.push('## 2. 批次策略');
+  lines.push('');
+  lines.push('| 批次 | 用途 | 建议占比 | 启动条件 | 完成标准 |');
+  lines.push('|---|---|---:|---|---|');
+  lines.push('| P0 | 核心关键词和高置信方向 | 20%-30% | Intake 与 H1-H3 已确认 | 核心问题有初步证据 |');
+  lines.push('| P1 | 竞品、场景、功效、痛点扩展 | 40%-50% | P0 噪声可控 | 主要假设都有样本覆盖 |');
+  lines.push('| P2 | 长尾、异常、补证与反证 | 20%-30% | P0/P1 发现空白或矛盾 | 关键结论有反证检查 |');
+  lines.push('');
+  lines.push('## 3. 采集矩阵');
+  lines.push('');
+  lines.push('| id | platform | keyword | keywordType | batch | targetCount | hypothesisTags | purpose | expectedSignal | risk | status |');
+  lines.push('|---|---|---|---|---|---:|---|---|---|---|---|');
+  rows.forEach(row => {
+    lines.push(`| ${row.id} | ${row.platform} | ${row.keyword} | ${row.keywordType} | ${row.batch} | ${row.targetCount} | ${row.hypothesisTags.join(',')} | ${row.purpose} | ${row.expectedSignal} | ${row.risk} | ${row.status} |`);
+  });
+  lines.push('');
+  lines.push('## 4. H1-H8 覆盖审计');
+  lines.push('');
+  lines.push('| 假设 | 关键词数 | 关键词 | 状态 |');
+  lines.push('|---|---:|---|---|');
+  Object.entries(audit.byHypothesis).sort().forEach(([tag, keywords]) => {
+    lines.push(`| ${tag} | ${keywords.length} | ${Array.from(new Set(keywords)).join('、')} | ${keywords.length >= 3 ? '通过' : '需补充'} |`);
+  });
+  if (!Object.keys(audit.byHypothesis).length) lines.push('| - | 0 | - | 需补充 |');
+  lines.push('');
+  lines.push('## 5. 采集前检查');
+  lines.push('');
+  lines.push('| 检查项 | 标准 | 状态 |');
+  lines.push('|---|---|---|');
+  lines.push('| Token / credentials | 已预飞或确认可用 | 未检查 |');
+  lines.push('| 单关键词小样本 | 每个平台至少试采 1 个关键词 | 未检查 |');
+  lines.push('| 噪声评估 | 离题、高赞广告、重复内容可控 | 未检查 |');
+  lines.push('| 去重口径 | ID、URL、正文相似度口径明确 | 未检查 |');
+  lines.push('| 文件命名 | raw 文件命名与矩阵 id 可对应 | 未检查 |');
+  lines.push('');
+  lines.push('## 6. Builder 审计提示');
+  lines.push('');
+  if (audit.warnings.length) audit.warnings.forEach(warning => lines.push(`- **Warning**: ${warning}`));
+  else lines.push('- **通过**:矩阵基础字段完整,假设覆盖达到当前规则。');
+  return lines.join('\n') + '\n';
+}
+
+function main() {
+  const args = parseArgs(process.argv.slice(2));
+  if (args.help || (!args.keywords && !args.keyword) || !args.output) {
+    console.log(usage());
+    process.exit(args.help ? 0 : 1);
+  }
+  const outputDir = path.resolve(args.output);
+  ensureDir(outputDir);
+  const rawRows = buildRows(args);
+  let rows = normalizeMatrixRows(rawRows, {
+    platform: args.platform,
+    target: args.target
+  });
+  if (args['expand-hypotheses']) {
+    rows = expandHypotheses(rows, {
+      platform: args.platform,
+      target: args.target,
+      category: args.category,
+      project: args.project
+    });
+  }
+  const audit = auditMatrix(rows);
+  const meta = {
+    project: args.project || path.basename(outputDir),
+    question: args.question || '待确认核心决策问题',
+    period: args.period || '待确认',
+    owner: args.owner || '待确认'
+  };
+  const output = {
+    metadata: {
+      project: meta.project,
+      generatedAt: new Date().toISOString(),
+      platforms: Array.from(new Set(rows.map(row => row.platform))),
+      keywordCount: rows.length,
+      targetCount: rows.reduce((sum, row) => sum + Number(row.targetCount || 0), 0),
+      warningCount: audit.warnings.length
+    },
+    matrix: rows,
+    audit
+  };
+  fs.writeFileSync(path.join(outputDir, 'collection-matrix.json'), JSON.stringify(output, null, 2) + '\n', 'utf8');
+  fs.writeFileSync(path.join(outputDir, '3.CollectionMatrix.md'), renderMarkdown(rows, meta, audit), 'utf8');
+  console.log(JSON.stringify({
+    outputDir,
+    files: ['3.CollectionMatrix.md', 'collection-matrix.json'],
+    keywordCount: rows.length,
+    targetCount: output.metadata.targetCount,
+    warnings: audit.warnings.length
+  }, null, 2));
+}
+
+if (require.main === module) {
+  try {
+    main();
+  } catch (error) {
+    console.error(error.message);
+    process.exit(1);
+  }
+}
+
+module.exports = {
+  parseArgs,
+  parseKeywordsMarkdown,
+  normalizeMatrixRows,
+  auditMatrix,
+  renderMarkdown
+};

+ 286 - 0
scripts/tools/hypothesis-generator.js

@@ -0,0 +1,286 @@
+const fs = require('fs');
+const path = require('path');
+
+function parseArgs(argv) {
+  const args = {};
+  for (let i = 0; i < argv.length; i++) {
+    const token = argv[i];
+    if (!token.startsWith('--')) continue;
+    const eq = token.indexOf('=');
+    if (eq >= 0) {
+      args[token.slice(2, eq)] = token.slice(eq + 1);
+    } else {
+      const key = token.slice(2);
+      const next = argv[i + 1];
+      if (next && !next.startsWith('--')) {
+        args[key] = next;
+        i++;
+      } else {
+        args[key] = true;
+      }
+    }
+  }
+  return args;
+}
+
+function usage() {
+  return [
+    'Usage:',
+    '  node scripts/tools/hypothesis-generator.js --output <out-dir> --category <name> --question <text> [--brand <name>] [--product <name>] [--audience <text>] [--channels 小红书,抖音] [--competitors A,B] [--granularity light|enterprise]',
+    '  node scripts/tools/hypothesis-generator.js --output <out-dir> --brief <brief.md|json> [--category <name>] [--question <text>]',
+    '',
+    'Outputs:',
+    '  1.Hypothesis.md',
+    '  hypothesis.json'
+  ].join('\n');
+}
+
+function ensureDir(dirPath) {
+  fs.mkdirSync(dirPath, { recursive: true });
+}
+
+function splitList(value) {
+  if (!value) return [];
+  if (Array.isArray(value)) return value;
+  return String(value).split(/[,,;;、]/).map(item => item.trim()).filter(Boolean);
+}
+
+function readBrief(filePath) {
+  if (!filePath) return {};
+  const absolute = path.resolve(filePath);
+  const text = fs.readFileSync(absolute, 'utf8');
+  if (absolute.endsWith('.json')) return JSON.parse(text);
+  return parseBriefMarkdown(text);
+}
+
+function parseBriefMarkdown(text) {
+  const output = { raw: text };
+  const patterns = {
+    brand: /(?:品牌|brand)\s*[::]\s*([^\n]+)/i,
+    product: /(?:产品|product)\s*[::]\s*([^\n]+)/i,
+    category: /(?:品类|category)\s*[::]\s*([^\n]+)/i,
+    audience: /(?:目标用户|人群|audience)\s*[::]\s*([^\n]+)/i,
+    channels: /(?:平台|渠道|channels?)\s*[::]\s*([^\n]+)/i,
+    competitors: /(?:竞品|competitors?)\s*[::]\s*([^\n]+)/i,
+    question: /(?:决策问题|核心问题|question)\s*[::]\s*([^\n]+)/i
+  };
+  Object.entries(patterns).forEach(([key, pattern]) => {
+    const match = text.match(pattern);
+    if (match) output[key] = match[1].replace(/^\*+|\*+$/g, '').trim();
+  });
+  return output;
+}
+
+function firstDefined(...values) {
+  for (const value of values) {
+    if (value !== undefined && value !== null && value !== '') return value;
+  }
+  return undefined;
+}
+
+function contextFromArgs(args) {
+  const brief = readBrief(args.brief);
+  const category = firstDefined(args.category, brief.category, '待确认品类');
+  const brand = firstDefined(args.brand, brief.brand, '待确认品牌');
+  const product = firstDefined(args.product, brief.product, category);
+  const question = firstDefined(args.question, brief.question, `${category} 是否值得进入/加码,下一步应该怎么做?`);
+  const audience = firstDefined(args.audience, brief.audience, '目标用户');
+  const channels = splitList(firstDefined(args.channels, brief.channels, args.platform, '小红书'));
+  const competitors = splitList(firstDefined(args.competitors, brief.competitors, '主要竞品'));
+  return {
+    category,
+    brand,
+    product,
+    question,
+    audience,
+    channels,
+    competitors,
+    granularity: args.granularity || 'light',
+    generatedAt: new Date().toISOString()
+  };
+}
+
+function h(tag, direction, coreQuestion, assumption, userExpression, keywordDirections, evidenceStandard, counterSignal, reportMapping) {
+  return {
+    tag,
+    direction,
+    coreQuestion,
+    assumption,
+    userExpression,
+    platforms: [],
+    keywordDirections,
+    evidenceStandard,
+    counterSignal,
+    finalJudgement: '未验证',
+    evidenceStrength: '低',
+    reportMapping
+  };
+}
+
+function buildHypotheses(context) {
+  const category = context.category;
+  const product = context.product;
+  const brand = context.brand;
+  const audience = context.audience;
+  const channels = context.channels.length ? context.channels : ['小红书'];
+  const competitors = context.competitors.length ? context.competitors : ['主要竞品'];
+  const competitorText = competitors.join('、');
+  const hypotheses = [
+    h('H1', '品类机会', '市场是否值得进入/加码?', `${category} 的机会来自用户对现有方案仍有未满足需求,${brand} 可以通过更清晰的产品解释和场景切入获得机会。`, `用户会主动表达为什么搜索、购买、踩雷或重新选择 ${category}。`, [`${category} 市场机会`, `${category} 值不值得买`, `${category} 趋势`, `${category} 痛点`], '至少 30 条 VOC 能解释进入动机、现有不满和机会窗口。', `用户讨论稀少,或高频表达显示 ${category} 需求已被现有方案充分满足。`, '轻量报告 Ch1 / 企业报告 Ch1-Ch2'),
+    h('H2', '用户需求', '用户真实痛点和高频场景是什么?', `${audience} 对 ${category} 的需求不是抽象功能,而是被具体场景、症状、任务或生活时刻触发。`, '用户会说出具体使用前后情境、触发原因、焦虑和选择门槛。', [`${category} 使用场景`, `${category} 痛点`, `${category} 人群`, `${category} 怎么用`], '至少 50 条 VOC 能聚类出 3 个以上高频场景或痛点。', '评论集中在泛泛夸奖、抽奖、广告或无场景表达,无法形成稳定需求结构。', '轻量报告 Ch2 / 企业报告 Ch2-Ch3'),
+    h('H3', '产品缺口', '当前产品/竞品哪里没有满足?', `${product} 的产品机会来自用户对配方、体验、包装、说明、服务或使用边界的不满。`, '用户会提到“不好用/看不懂/不方便/不适合/客服讲不清”等具体缺口。', [`${category} 怎么选`, `${category} 配方`, `${category} 产品缺点`, `${product} 测评`], '至少 30 条 VOC 能归纳 3 类产品缺口,并能映射到产品或详情页动作。', '负面反馈高度分散,无法证明存在稳定产品缺口。', '轻量报告 Ch2-Ch4 / 企业报告 Ch3-Ch5'),
+    h('H4', '价格认知', '用户对价格、规格、价值感如何判断?', `用户对 ${category} 的价格接受度取决于规格、使用周期、风险感和可验证效果,而不只是绝对价格。`, '用户会比较贵不贵、够不够用、是否先试用、每天成本和复购压力。', [`${category} 价格`, `${category} 规格`, `${category} 性价比`, `${category} 试用装`], '至少 20 条 VOC 能说明价格带、规格偏好或试用/复购路径。', '用户很少讨论价格或规格,价格并非主要决策因素。', '轻量报告 Ch3-Ch4 / 企业报告 Ch4-Ch5'),
+    h('H5', '渠道内容', '哪些内容/平台影响用户决策?', `${channels.join('、')} 上真正影响用户决策的内容不是单纯曝光,而是能降低理解成本和风险感的内容。`, '用户会收藏、追问、转述或对比某类内容形式,例如测评、避坑、观察卡、清单和达人解释。', [`${category} 种草`, `${category} 达人推荐`, `${category} 内容笔记`, `${category} 避坑`], '至少 20 条 VOC 或内容样本能识别 3 类有效内容形式。', '平台内容互动高但评论离题,或无法影响购买/咨询/收藏行为。', '轻量报告 Ch3 / 企业报告 Ch5-Ch6'),
+    h('H6', '竞品策略', '竞品靠什么赢,哪里有漏洞?', `${competitorText} 的优势和漏洞会在用户对比、替代和吐槽中暴露,${brand} 可以找到差异化切口。`, '用户会主动拿竞品比较效果、价格、包装、信任背书、渠道和使用体验。', [`${category} 竞品`, `${category} 替代品`, `${category} 对比`, competitors[0] || `${category} 竞品`], '每个主要竞品至少 20 条 VOC,能说明赢点、输点和替代原因。', '用户没有明确竞品参照,或竞品比较主要来自营销号而非用户表达。', '轻量报告 Ch3 / 企业报告 Ch4-Ch5'),
+    h('H7', '定位表达', '什么话术、概念、定位更能打动用户?', `${product} 更容易被接受的表达应来自用户原话,把专业参数翻译成场景、结果、边界和选择标准。`, '用户会复述某些词、问法、标题或卖点,也会反感夸大、玄学和看不懂的表达。', [`${category} 卖点`, `${category} 定位`, `${category} 话术`, `${category} 标题`], '至少 30 条 VOC 能抽取用户高频词、反感词和可测试话术。', '用户表达没有稳定词汇,或话术偏好与平台互动指标不一致。', '轻量报告 Ch3-Ch4 / 企业报告 Ch5'),
+    h('H8', '增长行动', '下阶段最应该做哪些动作?', `下一阶段行动应优先选择能最快验证 ${category} 需求、产品缺口和内容表达的 P0 动作。`, '用户会给出复购、推荐、咨询、犹豫、放弃和改进建议等行动信号。', [`${category} 复购`, `${category} 推荐`, `${category} 转化`, `${category} 咨询`], '至少 20 条 VOC 能支撑 P0/P1/P2 行动建议和验证指标。', 'VOC 只能描述现象,无法转成明确动作或验证指标。', '轻量报告 Ch4 / 企业报告 Ch7')
+  ];
+  return hypotheses.map(item => ({ ...item, platforms: channels }));
+}
+
+function keywordRowsFromHypotheses(hypotheses, targetCount) {
+  const rows = [];
+  hypotheses.forEach(hypothesis => {
+    hypothesis.keywordDirections.slice(0, 3).forEach((keyword, index) => {
+      rows.push({
+        keyword,
+        keywordType: keywordTypeForHypothesis(hypothesis.tag),
+        batch: batchForHypothesis(hypothesis.tag, index),
+        targetCount,
+        hypothesisTags: [hypothesis.tag],
+        purpose: hypothesis.coreQuestion,
+        expectedSignal: hypothesis.userExpression,
+        risk: hypothesis.counterSignal
+      });
+    });
+  });
+  return rows;
+}
+
+function keywordTypeForHypothesis(tag) {
+  return {
+    H1: '品类词',
+    H2: '场景词',
+    H3: '产品词',
+    H4: '价格词',
+    H5: '平台内容词',
+    H6: '竞品词',
+    H7: '话术词',
+    H8: '行动词'
+  }[tag] || '长尾问题词';
+}
+
+function batchForHypothesis(tag, index) {
+  if (['H1', 'H2', 'H3'].includes(tag) && index === 0) return 'P0';
+  if (['H8'].includes(tag)) return 'P2';
+  return index === 2 ? 'P2' : 'P1';
+}
+
+function renderMarkdown(context, hypotheses) {
+  const lines = [];
+  lines.push('# 1. VOC H1-H8 假设');
+  lines.push('');
+  lines.push('## 1. 项目上下文');
+  lines.push('');
+  lines.push('| 字段 | 内容 |');
+  lines.push('|---|---|');
+  lines.push(`| 品类 | ${context.category} |`);
+  lines.push(`| 品牌 | ${context.brand} |`);
+  lines.push(`| 产品 | ${context.product} |`);
+  lines.push(`| 决策问题 | ${context.question} |`);
+  lines.push(`| 目标用户 | ${context.audience} |`);
+  lines.push(`| 目标渠道 | ${context.channels.join('、')} |`);
+  lines.push(`| 已知竞品 | ${context.competitors.join('、')} |`);
+  lines.push(`| 报告粒度 | ${context.granularity === 'enterprise' ? '企业 6-7 章' : '轻量 4 章'} |`);
+  lines.push('');
+  lines.push('## 2. 假设总览');
+  lines.push('');
+  lines.push('| 假设 | 方向 | 核心问题 | 验证状态 | 证据强度 |');
+  lines.push('|---|---|---|---|---|');
+  hypotheses.forEach(item => {
+    lines.push(`| ${item.tag} | ${item.direction} | ${item.coreQuestion} | ${item.finalJudgement} | ${item.evidenceStrength} |`);
+  });
+  lines.push('');
+  lines.push('## 3. 假设展开卡');
+  hypotheses.forEach(item => {
+    lines.push('');
+    lines.push(`### ${item.tag} ${item.direction}`);
+    lines.push('');
+    lines.push('| 字段 | 填写 |');
+    lines.push('|---|---|');
+    lines.push(`| 假设表述 | ${item.assumption} |`);
+    lines.push(`| 对应决策问题 | ${context.question} |`);
+    lines.push(`| 需要验证的用户表达 | ${item.userExpression} |`);
+    lines.push(`| 需要覆盖的平台 | ${item.platforms.join('、')} |`);
+    lines.push(`| 关键词方向 | ${item.keywordDirections.join('、')} |`);
+    lines.push(`| 支持证据标准 | ${item.evidenceStandard} |`);
+    lines.push(`| 反证信号 | ${item.counterSignal} |`);
+    lines.push(`| 报告映射 | ${item.reportMapping} |`);
+    lines.push(`| 最终判断 | ${item.finalJudgement} |`);
+  });
+  lines.push('');
+  lines.push('## 4. 假设到采集矩阵映射');
+  lines.push('');
+  lines.push('| 假设 | 推荐关键词类型 | 推荐平台 | 最低证据量 | 备注 |');
+  lines.push('|---|---|---|---:|---|');
+  hypotheses.forEach(item => {
+    const evidenceNumber = Number((item.evidenceStandard.match(/\d+/) || ['20'])[0]);
+    lines.push(`| ${item.tag} | ${keywordTypeForHypothesis(item.tag)} | ${item.platforms.join(' / ')} | ${evidenceNumber} 条 VOC | ${item.keywordDirections.slice(0, 3).join('、')} |`);
+  });
+  lines.push('');
+  lines.push('## 5. Builder 输入');
+  lines.push('');
+  lines.push('- `hypothesis.json` 中的 `keywords` 数组可直接作为 `collection-matrix-builder` 输入。');
+  return lines.join('\n') + '\n';
+}
+
+function main() {
+  const args = parseArgs(process.argv.slice(2));
+  if (args.help || !args.output) {
+    console.log(usage());
+    process.exit(args.help ? 0 : 1);
+  }
+  const outputDir = path.resolve(args.output);
+  ensureDir(outputDir);
+  const context = contextFromArgs(args);
+  const hypotheses = buildHypotheses(context);
+  const keywords = keywordRowsFromHypotheses(hypotheses, Number(args.target || 20));
+  const output = {
+    metadata: {
+      project: args.project || context.category,
+      generatedAt: context.generatedAt,
+      granularity: context.granularity,
+      hypothesisCount: hypotheses.length,
+      keywordCount: keywords.length
+    },
+    context,
+    hypotheses,
+    keywords
+  };
+  fs.writeFileSync(path.join(outputDir, 'hypothesis.json'), JSON.stringify(output, null, 2) + '\n', 'utf8');
+  fs.writeFileSync(path.join(outputDir, '1.Hypothesis.md'), renderMarkdown(context, hypotheses), 'utf8');
+  console.log(JSON.stringify({
+    outputDir,
+    files: ['1.Hypothesis.md', 'hypothesis.json'],
+    hypothesisCount: hypotheses.length,
+    keywordCount: keywords.length,
+    granularity: context.granularity
+  }, null, 2));
+}
+
+if (require.main === module) {
+  try {
+    main();
+  } catch (error) {
+    console.error(error.message);
+    process.exit(1);
+  }
+}
+
+module.exports = {
+  parseArgs,
+  contextFromArgs,
+  buildHypotheses,
+  keywordRowsFromHypotheses,
+  renderMarkdown
+};

+ 142 - 0
scripts/tools/openclaw-tool-runner.js

@@ -0,0 +1,142 @@
+#!/usr/bin/env node
+const fs = require('fs');
+const path = require('path');
+const { spawnSync } = require('child_process');
+
+function parseArgs(argv) {
+  const args = { toolArgs: [] };
+  for (let i = 0; i < argv.length; i++) {
+    const token = argv[i];
+    if (token === '--') {
+      args.toolArgs = argv.slice(i + 1);
+      break;
+    }
+    if (token === '--tool') {
+      args.tool = argv[++i];
+      continue;
+    }
+    if (token === '--result-prefix') {
+      args.resultPrefix = argv[++i];
+      continue;
+    }
+  }
+  return args;
+}
+
+function usage() {
+  return [
+    'Usage:',
+    '  node openclaw-tool-runner.js --tool <tool.js> --result-prefix <PREFIX> -- [tool args]',
+    '',
+    'The runner resolves tools from ~/.openclaw/tools first and emits PREFIX=<json> after the child tool output.'
+  ].join('\n');
+}
+
+function unique(values) {
+  return Array.from(new Set(values.filter(Boolean)));
+}
+
+function resolveTool(tool) {
+  if (!tool) return undefined;
+  if (path.isAbsolute(tool) && fs.existsSync(tool)) return tool;
+
+  const cwd = process.cwd();
+  const toolRoot = __dirname;
+  const projectRoot = path.resolve(__dirname, '..', '..');
+  const candidates = unique([
+    path.join(toolRoot, tool),
+    path.join(cwd, tool),
+    path.join(cwd, 'scripts', 'tools', tool),
+    path.join(projectRoot, 'scripts', 'tools', tool),
+    path.join(projectRoot, tool)
+  ]);
+
+  return candidates.find(candidate => fs.existsSync(candidate));
+}
+
+function extractLastJson(stdout) {
+  const text = String(stdout || '').trim();
+  if (!text) return undefined;
+  for (let i = text.lastIndexOf('{'); i >= 0; i = text.lastIndexOf('{', i - 1)) {
+    const candidate = text.slice(i).trim();
+    try {
+      return JSON.parse(candidate);
+    } catch {
+      continue;
+    }
+  }
+  return undefined;
+}
+
+function isUnresolvedValue(value) {
+  if (value === undefined || value === null) return true;
+  const text = String(value).trim();
+  return text === '' || /^\{\{[^}]+\}\}$/.test(text);
+}
+
+function sanitizeToolArgs(toolArgs) {
+  const sanitized = [];
+  for (let i = 0; i < toolArgs.length; i++) {
+    const token = toolArgs[i];
+    const next = toolArgs[i + 1];
+    if (token.startsWith('--') && next !== undefined && !next.startsWith('--')) {
+      if (!isUnresolvedValue(next)) {
+        sanitized.push(token, next);
+      }
+      i++;
+      continue;
+    }
+    if (!isUnresolvedValue(token)) {
+      sanitized.push(token);
+    }
+  }
+  return sanitized;
+}
+
+function main() {
+  const args = parseArgs(process.argv.slice(2));
+  if (!args.tool || !args.resultPrefix || args.help) {
+    console.log(usage());
+    process.exit(args.help ? 0 : 1);
+  }
+
+  const toolPath = resolveTool(args.tool);
+  if (!toolPath) {
+    const result = {
+      status: 'error',
+      message: `Tool not found: ${args.tool}`,
+      searchedFrom: {
+        cwd: process.cwd(),
+        runnerDir: __dirname
+      }
+    };
+    console.log(`${args.resultPrefix}=${JSON.stringify(result)}`);
+    process.exit(1);
+  }
+
+  const child = spawnSync(process.execPath, [toolPath, ...sanitizeToolArgs(args.toolArgs)], {
+    cwd: process.cwd(),
+    encoding: 'utf8',
+    maxBuffer: 1024 * 1024 * 100
+  });
+
+  if (child.stdout) process.stdout.write(child.stdout);
+  if (child.stderr) process.stderr.write(child.stderr);
+
+  const parsed = extractLastJson(child.stdout);
+  const result = parsed || {
+    status: child.status === 0 ? 'ok' : 'error',
+    tool: args.tool,
+    toolPath,
+    message: parsed ? undefined : 'Tool did not emit parseable JSON on stdout'
+  };
+  console.log(`${args.resultPrefix}=${JSON.stringify(result)}`);
+
+  if (child.error) {
+    console.error(child.error.message);
+    process.exit(1);
+  }
+  process.exit(child.status === null || child.status === undefined ? 1 : child.status);
+}
+
+main();

+ 528 - 0
scripts/tools/platform-mini-report-generator.js

@@ -0,0 +1,528 @@
+const fs = require('fs');
+const path = require('path');
+
+const HYPOTHESIS_LABELS = {
+  H1: '品类机会',
+  H2: '用户需求',
+  H3: '产品缺口',
+  H4: '价格认知',
+  H5: '渠道内容',
+  H6: '竞品策略',
+  H7: '定位表达',
+  H8: '增长行动'
+};
+
+const PLATFORM_NAMES = {
+  xiaohongshu: '小红书',
+  xhs: '小红书',
+  douyin: '抖音',
+  amazon: 'Amazon',
+  tiktok: 'TikTok',
+  instagram: 'Instagram'
+};
+
+const PLATFORM_PURPOSES = {
+  xiaohongshu: ['获客', '建信任', '转化', '复购'],
+  xhs: ['获客', '建信任', '转化', '复购'],
+  douyin: ['曝光', '互动', '转化', '复购'],
+  amazon: ['转化', '留评', 'Listing 优化', '复购'],
+  tiktok: ['曝光', '种草', '互动', '转化'],
+  instagram: ['品牌感知', '种草', '互动', '转化']
+};
+
+const THEME_EXPLANATIONS = {
+  痛点: '用户正在规避闲置、无效、焦虑或使用失败风险,应优先转成产品改进和 FAQ。',
+  场景: '需求由具体生活时刻触发,适合拆成场景化内容、组合装或使用说明。',
+  决策: '用户需要明确选择标准,应把专业参数翻译成能下单的判断表。',
+  反馈: '使用反馈能暴露观察周期、体感边界和售后解释需求。',
+  信任: '信任门槛来自适用边界、合规表达和不夸大的风险提示。',
+  价格: '价格接受度与规格、试用成本、复购压力和效果确定性绑定。',
+  竞品: '竞品/替代方案能暴露现有方案的赢点、输点和差异化切口。',
+  话术: '用户原话可转成标题、详情页模块、客服脚本和内容 AB 测试。'
+};
+
+function parseArgs(argv) {
+  const args = {};
+  for (let i = 0; i < argv.length; i++) {
+    const token = argv[i];
+    if (!token.startsWith('--')) continue;
+    const eq = token.indexOf('=');
+    if (eq >= 0) {
+      args[token.slice(2, eq)] = token.slice(eq + 1);
+    } else {
+      const key = token.slice(2);
+      const next = argv[i + 1];
+      if (next && !next.startsWith('--')) {
+        args[key] = next;
+        i++;
+      } else {
+        args[key] = true;
+      }
+    }
+  }
+  return args;
+}
+
+function usage() {
+  return [
+    'Usage:',
+    '  node scripts/tools/platform-mini-report-generator.js --input <normalized-dir|_merged.json|comments-flat.jsonl> --output <out-dir> [--project <name>] [--category <name>] [--platform xiaohongshu|douyin|amazon|tiktok|instagram] [--data-nature <text>] [--owner <name>] [--date YYYY-MM-DD]',
+    '',
+    'Outputs:',
+    '  platform-mini-report.md',
+    '  platform-mini-report.json'
+  ].join('\n');
+}
+
+function ensureDir(dirPath) {
+  fs.mkdirSync(dirPath, { recursive: true });
+}
+
+function readJson(filePath) {
+  return JSON.parse(fs.readFileSync(filePath, 'utf8'));
+}
+
+function readJsonl(filePath) {
+  return fs.readFileSync(filePath, 'utf8')
+    .split(/\r?\n/)
+    .map(line => line.trim())
+    .filter(Boolean)
+    .map(line => JSON.parse(line));
+}
+
+function asArray(value) {
+  if (!value) return [];
+  if (Array.isArray(value)) return value;
+  return [value];
+}
+
+function uniq(values) {
+  return [...new Set(values.filter(value => value !== undefined && value !== null && value !== ''))];
+}
+
+function cleanText(value) {
+  return String(value || '').replace(/\s+/g, ' ').trim();
+}
+
+function truncate(value, length = 72) {
+  const text = cleanText(value);
+  return text.length > length ? `${text.slice(0, length - 1)}…` : text;
+}
+
+function resolveInput(inputPath) {
+  const absolute = path.resolve(inputPath);
+  const stat = fs.statSync(absolute);
+  if (stat.isDirectory()) {
+    const merged = path.join(absolute, '_merged.json');
+    const flat = path.join(absolute, 'comments-flat.jsonl');
+    if (fs.existsSync(merged)) return { type: 'merged', filePath: merged, data: readJson(merged) };
+    if (fs.existsSync(flat)) return { type: 'jsonl', filePath: flat, data: readJsonl(flat) };
+    throw new Error(`no _merged.json or comments-flat.jsonl found in ${absolute}`);
+  }
+  if (absolute.endsWith('.jsonl')) return { type: 'jsonl', filePath: absolute, data: readJsonl(absolute) };
+  return { type: 'merged', filePath: absolute, data: readJson(absolute) };
+}
+
+function normalizeInput(resolved) {
+  if (resolved.type === 'jsonl') {
+    return { metadata: {}, items: [], comments: resolved.data, sources: [{ file: path.basename(resolved.filePath), platform: 'jsonl', commentCount: resolved.data.length }] };
+  }
+  const data = resolved.data;
+  if (Array.isArray(data)) return { metadata: {}, items: [], comments: data, sources: [] };
+  return { metadata: data.metadata || {}, items: asArray(data.items), comments: asArray(data.comments), sources: asArray(data.sources) };
+}
+
+function countBy(records, getter) {
+  const counts = new Map();
+  records.forEach(record => {
+    const key = getter(record) || '未标注';
+    counts.set(key, (counts.get(key) || 0) + 1);
+  });
+  return [...counts.entries()]
+    .map(([label, count]) => ({ label, count }))
+    .sort((a, b) => b.count - a.count || String(a.label).localeCompare(String(b.label)));
+}
+
+function scoreEvidence(record) {
+  return Number(record.likeCount || 0) + Number(record.replyCount || 0) * 2 + cleanText(record.text || record.content).length / 80;
+}
+
+function platformKey(value) {
+  const raw = String(value || '').toLowerCase();
+  if (raw.includes('xiaohongshu') || raw === 'xhs' || raw.includes('小红书')) return 'xiaohongshu';
+  if (raw.includes('douyin') || raw.includes('抖音')) return 'douyin';
+  if (raw.includes('amazon')) return 'amazon';
+  if (raw.includes('tiktok')) return 'tiktok';
+  if (raw.includes('instagram')) return 'instagram';
+  return raw || 'unknown';
+}
+
+function displayPlatform(value) {
+  const key = platformKey(value);
+  return PLATFORM_NAMES[key] || value || '未标注平台';
+}
+
+function evidenceCard(record) {
+  return {
+    id: record.id || record.commentId,
+    source: `${displayPlatform(record.platform)} / ${record.keyword || '未标注关键词'} / ${record.batch || 'P0'} / ${record.commentId || record.id || 'no-id'}`,
+    platform: record.platform,
+    keyword: record.keyword,
+    batch: record.batch || 'P0',
+    text: cleanText(record.text || record.content),
+    hypothesisTags: asArray(record.hypothesisTags),
+    theme: record.theme || '未标注',
+    likeCount: Number(record.likeCount || 0),
+    replyCount: Number(record.replyCount || 0),
+    url: record.url,
+    parentId: record.parentId,
+    commentId: record.commentId || record.id
+  };
+}
+
+function selectEvidence(records, limit = 6) {
+  const seen = new Set();
+  return [...records]
+    .filter(record => cleanText(record.text || record.content))
+    .sort((a, b) => scoreEvidence(b) - scoreEvidence(a))
+    .filter(record => {
+      const key = cleanText(record.text || record.content).slice(0, 80);
+      if (seen.has(key)) return false;
+      seen.add(key);
+      return true;
+    })
+    .slice(0, limit)
+    .map(evidenceCard);
+}
+
+function highInteractionCount(items) {
+  return items.filter(item => Number(item.likeCount || 0) > 500 || Number(item.commentCount || 0) > 100 || Number(item.raw?.metrics?.collectCount || 0) > 300).length;
+}
+
+function buildStats(normalized, comments) {
+  const items = normalized.items;
+  const keywords = uniq([...items.map(item => item.keyword), ...comments.map(comment => comment.keyword)]);
+  const platforms = uniq([...items.map(item => item.platform), ...comments.map(comment => comment.platform)]);
+  return {
+    platformCount: platforms.length,
+    keywordCount: keywords.length,
+    itemCount: items.length,
+    commentCount: comments.length,
+    highInteractionItemCount: highInteractionCount(items),
+    keywords,
+    platforms,
+    hypothesisTags: uniq(comments.flatMap(comment => asArray(comment.hypothesisTags))),
+    batches: uniq(comments.map(comment => comment.batch))
+  };
+}
+
+function buildHypothesisCoverage(comments) {
+  return Object.keys(HYPOTHESIS_LABELS).map(tag => {
+    const records = comments.filter(comment => asArray(comment.hypothesisTags).includes(tag));
+    return {
+      tag,
+      label: HYPOTHESIS_LABELS[tag],
+      count: records.length,
+      status: records.length >= 3 ? '已覆盖' : records.length > 0 ? '弱覆盖' : '未覆盖',
+      usage: inferHypothesisUsage(tag)
+    };
+  });
+}
+
+function inferHypothesisUsage(tag) {
+  const usage = {
+    H1: '用于判断品类机会、进入动机和核心阻力',
+    H2: '用于提炼用户痛点、场景和真实需求',
+    H3: '用于定位产品缺口、体验问题和详情页改进',
+    H4: '用于判断价格、规格、周期和价值感',
+    H5: '用于识别平台内容形式、种草路径和渠道触点',
+    H6: '用于分析竞品替代、对比和差异化空间',
+    H7: '用于抽取定位表达、标题和话术偏好',
+    H8: '用于输出下一轮行动、验证指标和优先级'
+  };
+  return usage[tag] || '用于支撑报告判断';
+}
+
+function buildThemeClusters(comments) {
+  const total = Math.max(comments.length, 1);
+  return countBy(comments, comment => comment.theme).slice(0, 8).map(item => {
+    const records = comments.filter(comment => (comment.theme || '未标注') === item.label);
+    const evidence = selectEvidence(records, 1)[0];
+    return {
+      theme: item.label,
+      count: item.count,
+      ratio: `${Math.round(item.count / total * 100)}%`,
+      quote: evidence ? evidence.text : '',
+      source: evidence ? evidence.source : '',
+      explanation: THEME_EXPLANATIONS[item.label] || '该主题需要人工结合原声继续解释。'
+    };
+  });
+}
+
+function evidenceStrength(comments, coverage) {
+  const covered = coverage.filter(item => item.status === '已覆盖').length;
+  if (comments.length >= 100 && covered >= 8) return '高';
+  if (comments.length >= 30 && covered >= 4) return '中';
+  return '低';
+}
+
+function buildConclusion(context, themes, comments, coverage) {
+  if (!comments.length) return '当前没有可引用 VOC,不能生成核心结论。';
+  const topThemes = themes.slice(0, 3).map(item => `${item.theme}(${item.count})`).join('、');
+  const covered = coverage.filter(item => item.status !== '未覆盖').map(item => item.tag).join(', ');
+  return `${context.platformName} ${comments.length} 条可追溯 VOC 显示,${context.category || '该品类'} 当前最稳定的用户信号集中在 ${topThemes || '未标注主题'};这些证据覆盖 ${covered || '暂无 H1-H8'},适合先形成单平台阶段性判断,再进入下一轮采集或报告定稿。`;
+}
+
+function buildOpportunities(themes, evidenceCards) {
+  const selected = themes.slice(0, 5);
+  return selected.map((theme, index) => {
+    const evidence = evidenceCards.find(card => card.theme === theme.theme) || {};
+    return {
+      opportunity: `${theme.theme}机会`,
+      evidence: evidence.text ? truncate(evidence.text, 42) : truncate(theme.quote, 42),
+      action: opportunityAction(theme.theme),
+      priority: index < 3 ? 'P0' : 'P1'
+    };
+  });
+}
+
+function opportunityAction(theme) {
+  const actions = {
+    痛点: '把高频痛点转成详情页 FAQ、客服脚本和反向避坑内容。',
+    场景: '围绕高触发场景设计内容专题、组合装或使用指南。',
+    决策: '输出选择标准表,把专业参数翻译成用户能判断的语言。',
+    反馈: '补充观察周期、适应期和售后解释,降低误解与退货。',
+    信任: '强化适用/不适用人群、风险边界和合规表达。',
+    价格: '设计试用装、月装和每天成本解释,降低首次购买压力。',
+    竞品: '提炼竞品漏洞,形成差异化卖点或替代理由。',
+    话术: '把用户原话改写成标题、开头和内容 AB 测试。'
+  };
+  return actions[theme] || '把该主题对应原声转成一个可验证动作。';
+}
+
+function buildContentRecommendations(context, themes, evidenceCards) {
+  const purposes = PLATFORM_PURPOSES[context.platformKey] || ['获客', '建信任', '转化', '复购'];
+  return themes.slice(0, 5).map((theme, index) => {
+    const evidence = evidenceCards.find(card => card.theme === theme.theme) || {};
+    return {
+      angle: theme.theme,
+      title: titleForTheme(context.category, theme.theme, context.platformName),
+      source: evidence.source || theme.source || '待关联证据',
+      purpose: purposes[index % purposes.length]
+    };
+  });
+}
+
+function titleForTheme(category, theme, platformName) {
+  const subject = category || '这个产品';
+  const titles = {
+    痛点: `《${subject}到底解决什么问题?先看这些真实顾虑》`,
+    场景: `《什么时候才需要${subject}?把场景讲清楚》`,
+    决策: `《选${subject}别只看参数:先看这几条标准》`,
+    反馈: `《用${subject}多久观察一次?真实反馈怎么判断》`,
+    信任: `《${subject}适合谁、不适合谁,一次说清楚》`,
+    价格: `《先买试用装还是月装?${subject}新手这样选》`,
+    竞品: `《${subject}和常见替代方案怎么选?真实对比清单》`,
+    话术: `《把${subject}参数翻译成生活语言:${platformName}用户更爱看这个》`
+  };
+  return titles[theme] || `《${subject}用户最关心的 ${theme} 问题》`;
+}
+
+function buildRisks(context, comments) {
+  const synthetic = String(context.dataNature || '').includes('样例') || String(context.dataNature || '').includes('合成');
+  return {
+    dataBoundary: synthetic ? `本报告使用${context.dataNature},不能代表真实市场规模、真实互动分布或真实品牌口碑。` : `本报告仅代表当前输入数据和采集窗口,不能直接外推为全平台或全市场结论。`,
+    noiseSource: `${context.platformName} 内容可能包含商业合作、测评号、重复评论、算法推荐和主观体验偏差。`,
+    cannotConclude: '不能把用户原声直接写成未经验证的功效、医学、安全或全市场结论。',
+    nextValidation: comments.length < 100 ? '建议补足更多关键词和评论样本,再进行跨平台交叉验证。' : '建议用竞品词、差评词和成交评价做交叉验证。'
+  };
+}
+
+function buildActions(context, opportunities) {
+  return opportunities.slice(0, 4).map((item, index) => ({
+    action: item.action,
+    owner: ['产品经理', '内容运营', '电商/客服', '项目负责人'][index] || '项目负责人',
+    deadline: ['1 周', '1 周', '2 周', '2 周'][index] || '2 周',
+    metric: actionMetric(item.opportunity)
+  }));
+}
+
+function actionMetric(opportunity) {
+  if (opportunity.includes('价格')) return '试用装转月装率、咨询转化率';
+  if (opportunity.includes('信任')) return 'FAQ 点击率、客服重复问题下降';
+  if (opportunity.includes('话术')) return '收藏率、评论追问率、标题点击率';
+  if (opportunity.includes('场景')) return '场景内容互动率、搜索词覆盖数';
+  return '有效评论数、转化线索数、负反馈下降';
+}
+
+function buildReport(normalized, args) {
+  const comments = normalized.comments.filter(comment => cleanText(comment.text || comment.content));
+  const stats = buildStats(normalized, comments);
+  const inferredPlatform = args.platform || stats.platforms[0] || normalized.metadata.platform || 'unknown';
+  const context = {
+    project: args.project || normalized.metadata.project || 'platform-mini-report',
+    category: args.category || normalized.metadata.category || '',
+    platformKey: platformKey(inferredPlatform),
+    platformName: displayPlatform(inferredPlatform),
+    dataNature: args['data-nature'] || args.dataNature || '未标注',
+    owner: args.owner || 'VOC Skills 课程 demo',
+    date: args.date || new Date().toISOString().slice(0, 10),
+    generatedAt: new Date().toISOString()
+  };
+  const coverage = buildHypothesisCoverage(comments);
+  const themes = buildThemeClusters(comments);
+  const evidenceCards = selectEvidence(comments, Number(args['evidence-limit'] || 6));
+  const strength = evidenceStrength(comments, coverage);
+  const conclusion = buildConclusion(context, themes, comments, coverage);
+  const opportunities = buildOpportunities(themes, evidenceCards);
+  const contentRecommendations = buildContentRecommendations(context, themes, evidenceCards);
+  const risks = buildRisks(context, comments);
+  const actions = buildActions(context, opportunities);
+  const audit = {
+    generatedAt: context.generatedAt,
+    commentCount: comments.length,
+    evidenceCardCount: evidenceCards.length,
+    warningCount: 0,
+    uncoveredHypothesisCount: coverage.filter(item => item.status === '未覆盖').length,
+    emptyConclusion: !comments.length,
+    hasTraceableEvidence: evidenceCards.every(card => card.source && card.text)
+  };
+  if (!comments.length) audit.warningCount++;
+  if (!audit.hasTraceableEvidence) audit.warningCount++;
+  return { metadata: context, stats, conclusion, evidenceStrength: strength, hypothesisCoverage: coverage, themes, evidenceCards, opportunities, contentRecommendations, risks, actions, audit };
+}
+
+function renderMarkdown(report) {
+  const meta = report.metadata;
+  const lines = [];
+  lines.push(`# Platform VOC Mini Report:${meta.platformName}${meta.category ? meta.category : ''}`);
+  lines.push('');
+  lines.push(`> 本报告由 \`platform-mini-report-generator\` 基于 normalized VOC 数据自动生成,所有关键结论必须回溯到 VOC 证据卡。`);
+  lines.push('');
+  lines.push('## 0. 报告信息');
+  lines.push('');
+  lines.push('| 字段 | 填写 |');
+  lines.push('|---|---|');
+  lines.push(`| 项目/品类 | ${meta.project}${meta.category ? ` / ${meta.category}` : ''} |`);
+  lines.push(`| 分析平台 | ${meta.platformName} |`);
+  lines.push(`| 分析关键词 | ${report.stats.keywords.join('、') || '未标注'} |`);
+  lines.push(`| 样本范围 | ${report.stats.itemCount} 条内容 / ${report.stats.commentCount} 条 VOC |`);
+  lines.push(`| 数据性质 | ${meta.dataNature} |`);
+  lines.push(`| 完成人 | ${meta.owner} |`);
+  lines.push(`| 日期 | ${meta.date} |`);
+  lines.push('');
+  lines.push('## 1. 一句话结论');
+  lines.push('');
+  lines.push(`- **核心结论**:${report.conclusion}`);
+  lines.push(`- **证据强度**:${report.evidenceStrength}`);
+  lines.push(`- **最关键证据**:${report.evidenceCards[0] ? `“${report.evidenceCards[0].text}”(${report.evidenceCards[0].source})` : '暂无可引用证据'}`);
+  lines.push('');
+  lines.push('## 2. 数据概况');
+  lines.push('');
+  lines.push('| 指标 | 数值 | 说明 |');
+  lines.push('|---|---:|---|');
+  lines.push(`| 关键词数 | ${report.stats.keywordCount} | ${report.stats.keywords.join('、') || '未标注'} |`);
+  lines.push(`| 内容数 | ${report.stats.itemCount} | normalized items |`);
+  lines.push(`| VOC 数 | ${report.stats.commentCount} | normalized comments |`);
+  lines.push(`| 高互动内容数 | ${report.stats.highInteractionItemCount} | 点赞 > 500 / 收藏 > 300 / 评论 > 100 |`);
+  lines.push(`| 覆盖假设数 | ${report.hypothesisCoverage.filter(item => item.status !== '未覆盖').length} | H1-H8 覆盖 |`);
+  lines.push(`| 主要场景/主题 | ${report.themes.slice(0, 3).map(item => item.theme).join('、') || '未标注'} | 按 theme 聚合 |`);
+  lines.push('');
+  lines.push('### 2.1 H1-H8 假设覆盖速查');
+  lines.push('');
+  lines.push('| 假设 | 覆盖判断 | VOC 数 | 本报告中的使用方式 |');
+  lines.push('|---|---|---:|---|');
+  report.hypothesisCoverage.forEach(item => lines.push(`| ${item.tag} ${item.label} | ${item.status} | ${item.count} | ${item.usage} |`));
+  lines.push('');
+  lines.push('## 3. 高频主题聚类');
+  lines.push('');
+  lines.push('| 主题 | 占比/频次 | 典型原声 | 业务解释 |');
+  lines.push('|---|---:|---|---|');
+  report.themes.forEach(item => lines.push(`| ${item.theme} | ${item.ratio} / ${item.count} | “${truncate(item.quote, 52)}” | ${item.explanation} |`));
+  lines.push('');
+  lines.push('## 4. VOC 原声证据卡');
+  lines.push('');
+  report.evidenceCards.forEach((item, index) => {
+    lines.push(`### 证据 ${index + 1}:${truncate(item.text, 32)}`);
+    lines.push('');
+    lines.push(`- **来源**:${item.source}`);
+    lines.push(`- **原声**:“${item.text}”`);
+    lines.push(`- **标签**:${item.hypothesisTags.join(', ') || '未标注'}`);
+    lines.push(`- **解释**:这条原声可支撑「${item.theme}」相关判断。`);
+    lines.push('');
+  });
+  lines.push('## 5. 产品/内容机会');
+  lines.push('');
+  lines.push('| 机会点 | 对应 VOC | 建议动作 | 优先级 |');
+  lines.push('|---|---|---|---|');
+  report.opportunities.forEach(item => lines.push(`| ${item.opportunity} | “${item.evidence}” | ${item.action} | ${item.priority} |`));
+  lines.push('');
+  lines.push(`## 6. ${meta.platformName}内容建议`);
+  lines.push('');
+  lines.push('| 内容角度 | 推荐标题 | 证据来源 | 目的 |');
+  lines.push('|---|---|---|---|');
+  report.contentRecommendations.forEach(item => lines.push(`| ${item.angle} | ${item.title} | ${item.source} | ${item.purpose} |`));
+  lines.push('');
+  lines.push('## 7. 风险与边界');
+  lines.push('');
+  lines.push(`- **数据边界**:${report.risks.dataBoundary}`);
+  lines.push(`- **噪声来源**:${report.risks.noiseSource}`);
+  lines.push(`- **不能推出的结论**:${report.risks.cannotConclude}`);
+  lines.push(`- **下一步需要补采/验证**:${report.risks.nextValidation}`);
+  lines.push('');
+  lines.push('## 8. 结课行动清单');
+  lines.push('');
+  lines.push('| 行动 | 负责人 | 截止时间 | 验证指标 |');
+  lines.push('|---|---|---|---|');
+  report.actions.forEach(item => lines.push(`| ${item.action} | ${item.owner} | ${item.deadline} | ${item.metric} |`));
+  lines.push('');
+  lines.push('## 9. 生成审计');
+  lines.push('');
+  lines.push(`- **证据卡数**:${report.audit.evidenceCardCount}`);
+  lines.push(`- **警告数**:${report.audit.warningCount}`);
+  lines.push(`- **未覆盖假设数**:${report.audit.uncoveredHypothesisCount}`);
+  lines.push(`- **证据可追溯**:${report.audit.hasTraceableEvidence ? '是' : '否'}`);
+  return `${lines.join('\n')}\n`;
+}
+
+function main() {
+  const args = parseArgs(process.argv.slice(2));
+  if (args.help || !args.input || !args.output) {
+    console.log(usage());
+    process.exit(args.help ? 0 : 1);
+  }
+  const resolved = resolveInput(args.input);
+  const normalized = normalizeInput(resolved);
+  const report = buildReport(normalized, args);
+  const outputDir = path.resolve(args.output);
+  ensureDir(outputDir);
+  fs.writeFileSync(path.join(outputDir, 'platform-mini-report.json'), JSON.stringify(report, null, 2) + '\n', 'utf8');
+  fs.writeFileSync(path.join(outputDir, 'platform-mini-report.md'), renderMarkdown(report), 'utf8');
+  console.log(JSON.stringify({
+    outputDir,
+    files: ['platform-mini-report.md', 'platform-mini-report.json'],
+    platform: report.metadata.platformName,
+    commentCount: report.stats.commentCount,
+    evidenceCards: report.audit.evidenceCardCount,
+    warnings: report.audit.warningCount,
+    uncoveredHypothesisCount: report.audit.uncoveredHypothesisCount
+  }, null, 2));
+}
+
+if (require.main === module) {
+  try {
+    main();
+  } catch (error) {
+    console.error(error.message);
+    process.exit(1);
+  }
+}
+
+module.exports = {
+  parseArgs,
+  buildReport,
+  renderMarkdown,
+  selectEvidence,
+  buildThemeClusters,
+  buildHypothesisCoverage
+};

+ 528 - 0
scripts/tools/voc-data-normalizer.js

@@ -0,0 +1,528 @@
+const fs = require('fs');
+const path = require('path');
+
+function parseArgs(argv) {
+  const args = {};
+  for (let i = 0; i < argv.length; i++) {
+    const token = argv[i];
+    if (!token.startsWith('--')) continue;
+    const eq = token.indexOf('=');
+    if (eq >= 0) {
+      args[token.slice(2, eq)] = token.slice(eq + 1);
+    } else {
+      const key = token.slice(2);
+      const next = argv[i + 1];
+      if (next && !next.startsWith('--')) {
+        args[key] = next;
+        i++;
+      } else {
+        args[key] = true;
+      }
+    }
+  }
+  return args;
+}
+
+function usage() {
+  return [
+    'Usage:',
+    '  node scripts/tools/voc-data-normalizer.js --input <raw-dir> [--output <out-dir>] [--project <name>] [--category <name>]',
+    '',
+    'Outputs:',
+    '  _merged.json',
+    '  comments-flat.jsonl',
+    '  normalizer-audit.json'
+  ].join('\n');
+}
+
+function readJson(filePath) {
+  return JSON.parse(fs.readFileSync(filePath, 'utf8'));
+}
+
+function readJsonl(filePath) {
+  return fs.readFileSync(filePath, 'utf8')
+    .split(/\r?\n/)
+    .map(line => line.trim())
+    .filter(Boolean)
+    .map(line => JSON.parse(line));
+}
+
+function ensureDir(dirPath) {
+  fs.mkdirSync(dirPath, { recursive: true });
+}
+
+function listDataFiles(inputDir) {
+  return fs.readdirSync(inputDir)
+    .filter(name => name.endsWith('.json') || name.endsWith('.jsonl'))
+    .filter(name => !['_merged.json', 'normalizer-audit.json'].includes(name))
+    .filter(name => !['comments-flat.jsonl', 'comments-flat.normalized.jsonl'].includes(name))
+    .map(name => path.join(inputDir, name));
+}
+
+function asArray(value) {
+  if (!value) return [];
+  return Array.isArray(value) ? value : [value];
+}
+
+function firstDefined(...values) {
+  for (const value of values) {
+    if (value !== undefined && value !== null && value !== '') return value;
+  }
+  return undefined;
+}
+
+function toNumber(value) {
+  if (value === undefined || value === null || value === '') return undefined;
+  const number = Number(value);
+  return Number.isFinite(number) ? number : undefined;
+}
+
+function normalizeTime(value) {
+  if (value === undefined || value === null || value === '') return undefined;
+  if (typeof value === 'string') return value;
+  if (typeof value !== 'number') return String(value);
+  const ms = value > 100000000000 ? value : value * 1000;
+  return new Date(ms).toISOString();
+}
+
+function cleanText(value) {
+  if (value === undefined || value === null) return '';
+  return String(value).replace(/\s+/g, ' ').trim();
+}
+
+function uniq(values) {
+  return Array.from(new Set(values.filter(value => value !== undefined && value !== null && value !== '')));
+}
+
+function makeId(prefix, value, fallbackIndex) {
+  const base = firstDefined(value, `${prefix}_${fallbackIndex}`);
+  return `${prefix}_${String(base).replace(/[^a-zA-Z0-9_-]+/g, '_')}`;
+}
+
+function sourceUrl(record) {
+  return firstDefined(record.url, record.sourceUrl, record.link, record.share_url, record.ReviewsLink, record.detailUrl);
+}
+
+function authorName(record) {
+  if (record && typeof record === 'object' && !Array.isArray(record)) {
+    const nested = firstDefined(
+      record.nickname,
+      record.name,
+      record.user?.nickname,
+      record.user_info?.nickname,
+      record.author?.nickname,
+      record.author?.name,
+      record.ConsumerName,
+      record.shop_name
+    );
+    if (nested !== undefined) return nested;
+  }
+  return firstDefined(
+    record.author,
+    record.nickname,
+    record.user?.nickname,
+    record.user_info?.nickname,
+    record.user?.unique_id,
+    record.ConsumerName,
+    record.shop_name
+  );
+}
+
+function xhsNoteToItem(note, source, index) {
+  const metrics = note.metrics || {};
+  return {
+    id: makeId('xhs_note', firstDefined(note.noteId, note.id, note.note_id), index),
+    platform: 'xiaohongshu',
+    sourceType: firstDefined(note.type, 'note'),
+    keyword: firstDefined(note.keyword, source.keyword, source.metadata?.keyword),
+    batch: firstDefined(note.batch, source.batch, 'P0'),
+    hypothesisTags: asArray(firstDefined(note.hypothesisTags, source.hypothesisTags)),
+    author: authorName(note),
+    title: note.title,
+    content: cleanText(firstDefined(note.desc, note.content, note.text, note.title)),
+    likeCount: toNumber(firstDefined(metrics.likeCount, note.likeCount, note.liked_count)),
+    commentCount: toNumber(firstDefined(metrics.commentCount, note.commentCount, note.comments_count)),
+    publishTime: normalizeTime(firstDefined(note.publishedAt, note.publishTime, note.timestamp, note.create_time)),
+    collectedAt: firstDefined(note.collectedAt, source.metadata?.generatedAt, new Date().toISOString()),
+    url: sourceUrl(note),
+    productId: firstDefined(note.noteId, note.id, note.note_id),
+    brand: note.brand,
+    competitor: note.competitor,
+    sentiment: note.sentiment,
+    raw: note
+  };
+}
+
+function xhsCommentToVoc(comment, source, index) {
+  const user = comment.user || comment.user_info || {};
+  return {
+    id: makeId('xhs_comment', firstDefined(comment.commentId, comment.id, comment.comment_id), index),
+    platform: 'xiaohongshu',
+    sourceType: 'comment',
+    keyword: firstDefined(comment.keyword, source.keyword, source.metadata?.keyword),
+    batch: firstDefined(comment.batch, source.batch, 'P0'),
+    hypothesisTags: asArray(firstDefined(comment.hypothesisTags, source.hypothesisTags)),
+    author: firstDefined(comment.author, user.nickname, user.name),
+    text: cleanText(firstDefined(comment.content, comment.text, comment.desc)),
+    likeCount: toNumber(firstDefined(comment.likeCount, comment.like_count, comment.digg_count)),
+    replyCount: toNumber(firstDefined(comment.subCommentCount, comment.sub_comment_count, comment.reply_comment_total)),
+    rating: toNumber(comment.rating),
+    publishTime: normalizeTime(firstDefined(comment.createdAt, comment.create_time, comment.publishTime)),
+    collectedAt: firstDefined(comment.collectedAt, source.metadata?.generatedAt, new Date().toISOString()),
+    url: sourceUrl(comment),
+    parentId: firstDefined(comment.noteId, comment.note_id, comment.parentId),
+    commentId: firstDefined(comment.commentId, comment.id, comment.comment_id),
+    ipLocation: firstDefined(comment.ipLocation, comment.ip_location, comment.ip_label),
+    sentiment: comment.sentiment,
+    theme: comment.theme,
+    raw: comment
+  };
+}
+
+function douyinVideoToItem(video, source, index) {
+  const stats = video.statistics || video.stats || {};
+  return {
+    id: makeId('douyin_video', firstDefined(video.aweme_id, video.videoId, video.id), index),
+    platform: 'douyin',
+    sourceType: 'video',
+    keyword: firstDefined(video.keyword, source.keyword, source.metadata?.keyword),
+    batch: firstDefined(video.batch, source.batch, 'P0'),
+    hypothesisTags: asArray(firstDefined(video.hypothesisTags, source.hypothesisTags)),
+    author: authorName(video.author || video),
+    title: firstDefined(video.title, video.desc),
+    content: cleanText(firstDefined(video.desc, video.title, video.text)),
+    likeCount: toNumber(firstDefined(stats.digg_count, video.digg_count, video.likeCount)),
+    commentCount: toNumber(firstDefined(stats.comment_count, video.comment_count, video.commentCount)),
+    publishTime: normalizeTime(firstDefined(video.create_time, video.publishedAt, video.publishTime)),
+    collectedAt: firstDefined(video.collectedAt, source.metadata?.generatedAt, new Date().toISOString()),
+    url: sourceUrl(video),
+    productId: firstDefined(video.aweme_id, video.videoId, video.id),
+    brand: video.brand,
+    competitor: video.competitor,
+    sentiment: video.sentiment,
+    raw: video
+  };
+}
+
+function douyinCommentToVoc(comment, source, index) {
+  return {
+    id: makeId('douyin_comment', firstDefined(comment.cid, comment.commentId, comment.id), index),
+    platform: 'douyin',
+    sourceType: 'comment',
+    keyword: firstDefined(comment.keyword, source.keyword, source.metadata?.keyword),
+    batch: firstDefined(comment.batch, source.batch, 'P0'),
+    hypothesisTags: asArray(firstDefined(comment.hypothesisTags, source.hypothesisTags)),
+    author: authorName(comment),
+    text: cleanText(firstDefined(comment.text, comment.content, comment.desc)),
+    likeCount: toNumber(firstDefined(comment.digg_count, comment.likeCount, comment.like_count)),
+    replyCount: toNumber(firstDefined(comment.reply_comment_total, comment.replyCount, comment.sub_comment_count)),
+    rating: undefined,
+    publishTime: normalizeTime(firstDefined(comment.create_time, comment.createdAt, comment.publishTime)),
+    collectedAt: firstDefined(comment.collectedAt, source.metadata?.generatedAt, new Date().toISOString()),
+    url: sourceUrl(comment),
+    parentId: firstDefined(comment.aweme_id, comment.videoId, comment.parentId),
+    commentId: firstDefined(comment.cid, comment.commentId, comment.id),
+    ipLocation: firstDefined(comment.ip_label, comment.ipLocation, comment.ip_location),
+    sentiment: comment.sentiment,
+    theme: comment.theme,
+    raw: comment
+  };
+}
+
+function amazonReviewToVoc(review, source, index) {
+  return {
+    id: makeId('amazon_review', firstDefined(review.ReviewId, review.reviewId, review.ReviewsLink, review.Id), index),
+    platform: 'amazon',
+    sourceType: 'review',
+    keyword: firstDefined(review.keyword, source.keyword, source.ASIN, review.Asin, review.ASIN),
+    batch: firstDefined(review.batch, source.batch, 'P0'),
+    hypothesisTags: asArray(firstDefined(review.hypothesisTags, source.hypothesisTags)),
+    author: firstDefined(review.ConsumerName, review.author, review.nickname),
+    text: cleanText([review.Title, review.Content, review.content, review.text].filter(Boolean).join(' ')),
+    likeCount: toNumber(firstDefined(review.Helpful, review.likeCount)),
+    replyCount: undefined,
+    rating: toNumber(firstDefined(review.Star, review.rating)),
+    publishTime: normalizeTime(firstDefined(review.ReviewsDate, review.publishTime, review.date)),
+    collectedAt: firstDefined(review.collectedAt, source.metadata?.generatedAt, review.UpdateTime, new Date().toISOString()),
+    url: sourceUrl(review),
+    parentId: firstDefined(review.Asin, review.ASIN, source.ASIN),
+    commentId: firstDefined(review.ReviewId, review.reviewId, review.ReviewsLink),
+    ipLocation: firstDefined(review.ReviewedCountry, review.ipLocation),
+    sentiment: review.sentiment,
+    theme: review.theme,
+    raw: review
+  };
+}
+
+function amazonProductToItem(product, source, index) {
+  return {
+    id: makeId('amazon_product', firstDefined(product.Asin, product.ASIN, product.asin, product.productId), index),
+    platform: 'amazon',
+    sourceType: 'product',
+    keyword: firstDefined(product.keyword, source.keyword, source.ASIN, product.Asin, product.ASIN),
+    batch: firstDefined(product.batch, source.batch, 'P0'),
+    hypothesisTags: asArray(firstDefined(product.hypothesisTags, source.hypothesisTags)),
+    author: firstDefined(product.Brand, product.brand, product.shop_name),
+    title: firstDefined(product.Title, product.title, product.productTitle),
+    content: cleanText(firstDefined(product.Description, product.description, product.Title, product.title)),
+    likeCount: undefined,
+    commentCount: toNumber(firstDefined(product.ReviewsCount, product.reviewCount, product.commentCount)),
+    rating: toNumber(firstDefined(product.Rating, product.rating)),
+    publishTime: normalizeTime(firstDefined(product.UpdateTime, product.publishTime)),
+    collectedAt: firstDefined(product.collectedAt, source.metadata?.generatedAt, new Date().toISOString()),
+    url: sourceUrl(product),
+    productId: firstDefined(product.Asin, product.ASIN, product.asin, product.productId),
+    brand: firstDefined(product.Brand, product.brand),
+    competitor: product.competitor,
+    sentiment: product.sentiment,
+    raw: product
+  };
+}
+
+function collectXiaohongshu(data, filePath) {
+  const items = [];
+  const comments = [];
+  if (Array.isArray(data.notes)) {
+    data.notes.forEach((note, index) => items.push(xhsNoteToItem(note, data, index + 1)));
+  }
+  if (Array.isArray(data.commentsByNote)) {
+    data.commentsByNote.forEach(group => {
+      asArray(group.comments).forEach((comment, index) => {
+        comments.push(xhsCommentToVoc({ ...comment, noteId: firstDefined(comment.noteId, group.noteId), keyword: firstDefined(comment.keyword, group.keyword) }, data, comments.length + index + 1));
+      });
+    });
+  }
+  if (Array.isArray(data.comments)) {
+    data.comments.forEach((comment, index) => comments.push(xhsCommentToVoc(comment, data, index + 1)));
+  }
+  return { items, comments, source: sourceRecord(filePath, 'xiaohongshu', items.length, comments.length) };
+}
+
+function collectDouyin(data, filePath) {
+  const items = [];
+  const comments = [];
+  const videos = asArray(firstDefined(data.videos, data.aweme_list, data.data?.aweme_list, data.data?.videos));
+  videos.forEach((video, index) => items.push(douyinVideoToItem(video, data, index + 1)));
+  const rawComments = asArray(firstDefined(data.comments, data.data?.comments));
+  rawComments.forEach((comment, index) => comments.push(douyinCommentToVoc(comment, data, index + 1)));
+  return { items, comments, source: sourceRecord(filePath, 'douyin', items.length, comments.length) };
+}
+
+function collectAmazon(data, filePath) {
+  const items = [];
+  const comments = [];
+  const products = asArray(firstDefined(data.Products, data.products, data.Items, data.items));
+  products.forEach((product, index) => items.push(amazonProductToItem(product, data, index + 1)));
+  const reviews = asArray(firstDefined(data.Reviews, data.reviews, data.data?.Reviews, data.data?.reviews));
+  reviews.forEach((review, index) => comments.push(amazonReviewToVoc(review, data, index + 1)));
+  return { items, comments, source: sourceRecord(filePath, 'amazon', items.length, comments.length) };
+}
+
+function collectJsonl(records, filePath) {
+  const items = [];
+  const comments = [];
+  records.forEach((record, index) => {
+    const platform = String(firstDefined(record.platform, '')).toLowerCase();
+    if (platform.includes('xiaohongshu') || platform === 'xhs') comments.push(xhsCommentToVoc(record, {}, index + 1));
+    else if (platform.includes('douyin')) comments.push(douyinCommentToVoc(record, {}, index + 1));
+    else if (platform.includes('amazon')) comments.push(amazonReviewToVoc(record, {}, index + 1));
+    else comments.push(genericVoc(record, index + 1));
+  });
+  return { items, comments, source: sourceRecord(filePath, 'jsonl', items.length, comments.length) };
+}
+
+function genericVoc(record, index) {
+  return {
+    id: makeId('voc', firstDefined(record.id, record.commentId, record.reviewId), index),
+    platform: firstDefined(record.platform, 'unknown'),
+    sourceType: firstDefined(record.sourceType, 'comment'),
+    keyword: record.keyword,
+    batch: firstDefined(record.batch, 'P0'),
+    hypothesisTags: asArray(record.hypothesisTags),
+    author: authorName(record),
+    text: cleanText(firstDefined(record.text, record.content, record.comment)),
+    likeCount: toNumber(firstDefined(record.likeCount, record.like_count, record.digg_count, record.Helpful)),
+    replyCount: toNumber(firstDefined(record.replyCount, record.subCommentCount, record.reply_comment_total)),
+    rating: toNumber(firstDefined(record.rating, record.Star)),
+    publishTime: normalizeTime(firstDefined(record.publishTime, record.createdAt, record.create_time, record.ReviewsDate)),
+    collectedAt: firstDefined(record.collectedAt, new Date().toISOString()),
+    url: sourceUrl(record),
+    parentId: firstDefined(record.parentId, record.noteId, record.videoId, record.Asin, record.ASIN),
+    commentId: firstDefined(record.commentId, record.id, record.reviewId, record.ReviewId),
+    ipLocation: firstDefined(record.ipLocation, record.ip_location, record.ip_label, record.ReviewedCountry),
+    sentiment: record.sentiment,
+    theme: record.theme,
+    raw: record
+  };
+}
+
+function sourceRecord(filePath, platform, itemCount, commentCount) {
+  return {
+    file: path.basename(filePath),
+    platform,
+    itemCount,
+    commentCount
+  };
+}
+
+function inferCollector(data, filePath) {
+  const name = path.basename(filePath).toLowerCase();
+  const platform = String(firstDefined(data.metadata?.platform, data.platform, '')).toLowerCase();
+  if (name.endsWith('.jsonl')) return collectJsonl(data, filePath);
+  if (platform.includes('xiaohongshu') || platform === 'xhs' || name.includes('xhs') || name.includes('xiaohongshu') || Array.isArray(data.notes) || Array.isArray(data.commentsByNote)) return collectXiaohongshu(data, filePath);
+  if (platform.includes('douyin') || name.includes('douyin') || data.data?.comments || data.data?.aweme_list) return collectDouyin(data, filePath);
+  if (platform.includes('amazon') || name.includes('amazon') || Array.isArray(data.Reviews) || Array.isArray(data.reviews) || data.ASIN || data.TotalCount !== undefined) return collectAmazon(data, filePath);
+  return { items: [], comments: [], source: sourceRecord(filePath, 'unknown', 0, 0) };
+}
+
+function dedupe(records, keyFn) {
+  const seen = new Map();
+  const duplicates = [];
+  const output = [];
+  records.forEach(record => {
+    const key = keyFn(record);
+    if (seen.has(key)) {
+      duplicates.push({ key, keptId: seen.get(key).id, duplicateId: record.id });
+      return;
+    }
+    seen.set(key, record);
+    output.push(record);
+  });
+  return { output, duplicates };
+}
+
+function missingRequired(record, fields) {
+  return fields.filter(field => {
+    const value = record[field];
+    if (Array.isArray(value)) return value.length === 0;
+    return value === undefined || value === null || value === '';
+  });
+}
+
+function main() {
+  const args = parseArgs(process.argv.slice(2));
+  if (args.help || !args.input) {
+    console.log(usage());
+    process.exit(args.help ? 0 : 1);
+  }
+
+  const inputDir = path.resolve(args.input);
+  const outputDir = path.resolve(args.output || inputDir);
+  if (!fs.existsSync(inputDir) || !fs.statSync(inputDir).isDirectory()) {
+    throw new Error(`input directory not found: ${inputDir}`);
+  }
+  ensureDir(outputDir);
+
+  const files = listDataFiles(inputDir);
+  const sources = [];
+  const items = [];
+  const comments = [];
+  const errors = [];
+
+  files.forEach(filePath => {
+    try {
+      const data = filePath.endsWith('.jsonl') ? readJsonl(filePath) : readJson(filePath);
+      const collected = inferCollector(data, filePath);
+      sources.push(collected.source);
+      items.push(...collected.items);
+      comments.push(...collected.comments);
+    } catch (error) {
+      errors.push({ file: path.basename(filePath), message: error.message });
+    }
+  });
+
+  const itemDedupe = dedupe(items.filter(item => cleanText(item.content)), item => `${item.platform}|${item.id}|${cleanText(item.content).slice(0, 120)}`);
+  const commentDedupe = dedupe(comments.filter(comment => cleanText(comment.text)), comment => `${comment.platform}|${firstDefined(comment.commentId, comment.id)}|${cleanText(comment.text).slice(0, 120)}`);
+
+  const normalizedItems = itemDedupe.output;
+  const normalizedComments = commentDedupe.output;
+  const missing = {
+    items: normalizedItems.map(item => ({ id: item.id, missing: missingRequired(item, ['id', 'platform', 'sourceType', 'keyword', 'batch', 'hypothesisTags', 'content', 'collectedAt']) })).filter(row => row.missing.length),
+    comments: normalizedComments.map(comment => ({ id: comment.id, missing: missingRequired(comment, ['id', 'platform', 'sourceType', 'keyword', 'batch', 'hypothesisTags', 'text', 'collectedAt']) })).filter(row => row.missing.length)
+  };
+
+  const platforms = uniq([...normalizedItems.map(item => item.platform), ...normalizedComments.map(comment => comment.platform)]);
+  const keywords = uniq([...normalizedItems.map(item => item.keyword), ...normalizedComments.map(comment => comment.keyword)]);
+  const batches = uniq([...normalizedItems.map(item => item.batch), ...normalizedComments.map(comment => comment.batch)]);
+  const hypothesisTags = uniq([...normalizedItems.flatMap(item => item.hypothesisTags), ...normalizedComments.flatMap(comment => comment.hypothesisTags)]);
+
+  const audit = {
+    generatedAt: new Date().toISOString(),
+    inputDir,
+    outputDir,
+    files: files.map(file => path.basename(file)),
+    sources,
+    rawItemCount: items.length,
+    rawVocCount: comments.length,
+    validItemCount: normalizedItems.length,
+    validVocCount: normalizedComments.length,
+    duplicateItemCount: itemDedupe.duplicates.length,
+    duplicateVocCount: commentDedupe.duplicates.length,
+    emptyItemDroppedCount: items.length - items.filter(item => cleanText(item.content)).length,
+    emptyVocDroppedCount: comments.length - comments.filter(comment => cleanText(comment.text)).length,
+    missingRequired: missing,
+    errors,
+    dedupeRule: 'platform + id/commentId + first 120 normalized text characters'
+  };
+
+  const merged = {
+    metadata: {
+      project: firstDefined(args.project, path.basename(inputDir)),
+      category: firstDefined(args.category, ''),
+      generatedAt: audit.generatedAt,
+      platforms,
+      keywords,
+      batches,
+      hypothesisTags,
+      rawSampleCount: items.length + comments.length,
+      rawItemCount: items.length,
+      rawVocCount: comments.length,
+      itemCount: normalizedItems.length,
+      validVocCount: normalizedComments.length,
+      dedupeRule: audit.dedupeRule
+    },
+    sources,
+    items: normalizedItems,
+    comments: normalizedComments,
+    audit: {
+      duplicateItemCount: audit.duplicateItemCount,
+      duplicateVocCount: audit.duplicateVocCount,
+      emptyItemDroppedCount: audit.emptyItemDroppedCount,
+      emptyVocDroppedCount: audit.emptyVocDroppedCount,
+      missingRequiredCount: missing.items.length + missing.comments.length,
+      errorCount: errors.length
+    }
+  };
+
+  fs.writeFileSync(path.join(outputDir, '_merged.json'), JSON.stringify(merged, null, 2) + '\n', 'utf8');
+  fs.writeFileSync(path.join(outputDir, 'comments-flat.jsonl'), normalizedComments.map(comment => JSON.stringify(comment)).join('\n') + (normalizedComments.length ? '\n' : ''), 'utf8');
+  fs.writeFileSync(path.join(outputDir, 'normalizer-audit.json'), JSON.stringify(audit, null, 2) + '\n', 'utf8');
+
+  console.log(JSON.stringify({
+    outputDir,
+    files: ['_merged.json', 'comments-flat.jsonl', 'normalizer-audit.json'],
+    itemCount: normalizedItems.length,
+    validVocCount: normalizedComments.length,
+    duplicateItemCount: audit.duplicateItemCount,
+    duplicateVocCount: audit.duplicateVocCount,
+    errors: errors.length
+  }, null, 2));
+}
+
+if (require.main === module) {
+  try {
+    main();
+  } catch (error) {
+    console.error(error.message);
+    process.exit(1);
+  }
+}
+
+module.exports = {
+  parseArgs,
+  inferCollector,
+  collectXiaohongshu,
+  collectDouyin,
+  collectAmazon,
+  dedupe
+};

+ 439 - 0
scripts/tools/voc-report-auditor.js

@@ -0,0 +1,439 @@
+const fs = require('fs');
+const path = require('path');
+
+function parseArgs(argv) {
+  const args = {};
+  for (let i = 0; i < argv.length; i++) {
+    const token = argv[i];
+    if (!token.startsWith('--')) continue;
+    const eq = token.indexOf('=');
+    if (eq >= 0) {
+      args[token.slice(2, eq)] = token.slice(eq + 1);
+    } else {
+      const key = token.slice(2);
+      const next = argv[i + 1];
+      if (next && !next.startsWith('--')) {
+        args[key] = next;
+        i++;
+      } else {
+        args[key] = true;
+      }
+    }
+  }
+  return args;
+}
+
+function usage() {
+  return [
+    'Usage:',
+    '  node scripts/tools/voc-report-auditor.js --report <report.md|html> --merged <_merged.json> --comments <comments-flat.jsonl> [--matrix <matrix.md|json>] [--output <out-dir>]',
+    '',
+    'Outputs:',
+    '  audit-result.json',
+    '  audit-report.md'
+  ].join('\n');
+}
+
+function readText(filePath) {
+  return fs.readFileSync(filePath, 'utf8');
+}
+
+function readJson(filePath) {
+  return JSON.parse(readText(filePath));
+}
+
+function readJsonl(filePath) {
+  return readText(filePath)
+    .split(/\r?\n/)
+    .map(line => line.trim())
+    .filter(Boolean)
+    .map(line => JSON.parse(line));
+}
+
+function ensureDir(dirPath) {
+  fs.mkdirSync(dirPath, { recursive: true });
+}
+
+function addIssue(issues, severity, check, message, suggestion, details = {}) {
+  issues.push({ severity, check, message, suggestion, details });
+}
+
+function uniq(values) {
+  return Array.from(new Set(values.filter(value => value !== undefined && value !== null && value !== '')));
+}
+
+function asArray(value) {
+  if (!value) return [];
+  return Array.isArray(value) ? value : [value];
+}
+
+function cleanText(value) {
+  if (value === undefined || value === null) return '';
+  return String(value).replace(/\s+/g, ' ').trim();
+}
+
+function getHeadings(reportText) {
+  return reportText
+    .split(/\r?\n/)
+    .map((line, index) => ({ line: index + 1, text: line }))
+    .filter(row => /^#{1,6}\s+/.test(row.text))
+    .map(row => ({ ...row, level: row.text.match(/^#{1,6}/)[0].length }));
+}
+
+function extractReportNumbers(reportText) {
+  const normalized = reportText.replace(/,/g, '');
+  const noteMatch = normalized.match(/(\d+)\s*(?:篇)?\s*(?:笔记|note|notes|item|items)/i);
+  const commentMatch = normalized.match(/(\d+)\s*(?:条)?\s*(?:评论|VOC|voc|原声|comment|comments|review|reviews)/i);
+  const keywordMatch = normalized.match(/(\d+)\s*(?:个)?\s*(?:关键词|keyword|keywords)/i);
+  return {
+    itemCount: noteMatch ? Number(noteMatch[1]) : undefined,
+    vocCount: commentMatch ? Number(commentMatch[1]) : undefined,
+    keywordCount: keywordMatch ? Number(keywordMatch[1]) : undefined
+  };
+}
+
+function dataStats(merged, comments) {
+  const items = asArray(merged.items);
+  const mergedComments = asArray(merged.comments);
+  const vocs = comments.length ? comments : mergedComments;
+  const platforms = uniq([
+    ...asArray(merged.metadata?.platforms),
+    ...items.map(item => item.platform),
+    ...vocs.map(comment => comment.platform)
+  ]);
+  const keywords = uniq([
+    ...asArray(merged.metadata?.keywords),
+    ...items.map(item => item.keyword),
+    ...vocs.map(comment => comment.keyword)
+  ]);
+  const batches = uniq([
+    ...asArray(merged.metadata?.batches),
+    ...items.map(item => item.batch),
+    ...vocs.map(comment => comment.batch)
+  ]);
+  const hypothesisTags = uniq([
+    ...asArray(merged.metadata?.hypothesisTags),
+    ...items.flatMap(item => asArray(item.hypothesisTags)),
+    ...vocs.flatMap(comment => asArray(comment.hypothesisTags))
+  ]);
+  return {
+    itemCount: Number(merged.metadata?.itemCount ?? items.length),
+    vocCount: Number(merged.metadata?.validVocCount ?? vocs.length),
+    rawSampleCount: Number(merged.metadata?.rawSampleCount ?? items.length + vocs.length),
+    platforms,
+    keywords,
+    batches,
+    hypothesisTags,
+    items,
+    vocs
+  };
+}
+
+function buildEvidenceIndex(stats) {
+  const index = new Set();
+  stats.items.forEach(item => {
+    [item.id, item.productId, item.url, item.parentId].forEach(value => value && index.add(String(value)));
+  });
+  stats.vocs.forEach(voc => {
+    [voc.id, voc.commentId, voc.parentId, voc.url].forEach(value => value && index.add(String(value)));
+  });
+  return index;
+}
+
+function extractEvidenceReferences(reportText) {
+  const refs = new Set();
+  const idPattern = /\b(?:xhs|douyin|amazon|voc|note|video|review|comment)[a-zA-Z0-9_-]*\b/g;
+  let match;
+  while ((match = idPattern.exec(reportText)) !== null) {
+    refs.add(match[0]);
+  }
+  const urlPattern = /https?:\/\/[^\s)\]}>"']+/g;
+  while ((match = urlPattern.exec(reportText)) !== null) {
+    refs.add(match[0]);
+  }
+  return Array.from(refs);
+}
+
+function hasDataNatureText(reportText) {
+  return /(课程合成样例|真实采集|混合数据|模拟数据|合成样例|real\s+data|synthetic)/i.test(reportText);
+}
+
+function hasMedicalBoundary(reportText) {
+  return /(不能替代|不代表|医学建议|临床|功效|合规|边界|风险)/i.test(reportText);
+}
+
+function checkPlaceholder(reportText, issues) {
+  const patterns = [/\bTODO\b/i, /placeholder/i, /待补充/, /待完善/, /xxx/i, /TBD/i];
+  const hits = [];
+  reportText.split(/\r?\n/).forEach((line, index) => {
+    if (patterns.some(pattern => pattern.test(line))) hits.push({ line: index + 1, text: line.trim() });
+  });
+  if (hits.length) {
+    addIssue(issues, 'fail', 'placeholder', `发现 ${hits.length} 处 placeholder 或待补内容`, '删除或填充所有 TODO、placeholder、待补充内容。', { hits: hits.slice(0, 20) });
+  }
+}
+
+function checkReportIntegrity(reportText, reportPath, issues) {
+  const ext = path.extname(reportPath).toLowerCase();
+  const headings = getHeadings(reportText);
+  if (!reportText.trim()) {
+    addIssue(issues, 'fail', 'report-integrity', '报告文件为空', '检查报告生成流程并重新导出。');
+    return;
+  }
+  if (ext === '.html' || /<html[\s>]/i.test(reportText)) {
+    if (!/<\/html>/i.test(reportText)) addIssue(issues, 'fail', 'html-integrity', 'HTML 缺少结束标签 </html>', '重新渲染 HTML 报告。');
+    if (!/<body[\s>]/i.test(reportText)) addIssue(issues, 'warn', 'html-integrity', 'HTML 缺少 body 标签', '确认 HTML 是否为完整交付文件。');
+  } else if (!headings.length) {
+    addIssue(issues, 'fail', 'markdown-integrity', 'Markdown 报告缺少标题结构', '至少添加一级标题和主要章节标题。');
+  }
+  const emptyHeadings = headings.filter((heading, index) => {
+    const next = headings[index + 1];
+    if (next && next.level > heading.level) return false;
+    const lines = reportText.split(/\r?\n/).slice(heading.line, next ? next.line - 1 : undefined).join('').trim();
+    return !lines;
+  });
+  if (emptyHeadings.length) {
+    addIssue(issues, 'fail', 'empty-section', `发现 ${emptyHeadings.length} 个空章节`, '为空章节补充结论、证据和业务解释,或删除空章节。', { headings: emptyHeadings });
+  }
+}
+
+function checkSampleCounts(reportText, stats, issues) {
+  const numbers = extractReportNumbers(reportText);
+  if (numbers.itemCount !== undefined && numbers.itemCount !== stats.itemCount) {
+    addIssue(issues, 'fail', 'sample-count', `报告笔记/item 数为 ${numbers.itemCount},数据为 ${stats.itemCount}`, '同步报告封面和数据概况中的样本量。');
+  }
+  if (numbers.vocCount !== undefined && numbers.vocCount !== stats.vocCount) {
+    addIssue(issues, 'fail', 'sample-count', `报告评论/VOC 数为 ${numbers.vocCount},数据为 ${stats.vocCount}`, '同步报告封面、正文和 comments-flat.jsonl 的样本量。');
+  }
+  if (numbers.keywordCount !== undefined && numbers.keywordCount !== stats.keywords.length) {
+    addIssue(issues, 'warn', 'keyword-count', `报告关键词数为 ${numbers.keywordCount},数据为 ${stats.keywords.length}`, '确认关键词去重口径,并同步报告数字。');
+  }
+  if (numbers.itemCount === undefined && numbers.vocCount === undefined) {
+    addIssue(issues, 'warn', 'sample-count', '报告中未识别到样本量数字', '在报告信息或数据概况中写明 item 数和 VOC 数。');
+  }
+}
+
+function checkHypothesis(reportText, stats, issues) {
+  const reportTags = uniq((reportText.match(/\bH[1-8]\b/g) || []));
+  const dataTags = stats.hypothesisTags.filter(tag => /^H[1-8]$/.test(tag));
+  if (!dataTags.length) {
+    addIssue(issues, 'fail', 'hypothesis-coverage', '数据中没有 H1-H8 标签', '在采集矩阵或 normalizer 输入中补充 hypothesisTags。');
+    return;
+  }
+  const missingInReport = dataTags.filter(tag => !reportTags.includes(tag));
+  if (missingInReport.length) {
+    addIssue(issues, 'warn', 'hypothesis-coverage', `报告未提及数据中的假设标签:${missingInReport.join(', ')}`, '在报告假设覆盖或证据卡中补充对应 H 标签。');
+  }
+  const counts = {};
+  stats.vocs.forEach(voc => {
+    asArray(voc.hypothesisTags).forEach(tag => {
+      counts[tag] = (counts[tag] || 0) + 1;
+    });
+  });
+  const zeroEvidence = dataTags.filter(tag => !counts[tag]);
+  if (zeroEvidence.length) {
+    addIssue(issues, 'fail', 'hypothesis-evidence', `以下假设标签没有 VOC 证据:${zeroEvidence.join(', ')}`, '补采或从结论中移除无证据假设。');
+  }
+}
+
+function checkEvidenceTraceability(reportText, stats, issues) {
+  const refs = extractEvidenceReferences(reportText);
+  const evidenceIndex = buildEvidenceIndex(stats);
+  const knownRefs = refs.filter(ref => evidenceIndex.has(ref) || Array.from(evidenceIndex).some(value => value.includes(ref) || ref.includes(value)));
+  const evidenceMarkers = (reportText.match(/VOC|原声|来源|证据|commentId|noteId|videoId|asin|review/gi) || []).length;
+  if (!knownRefs.length && evidenceMarkers < 3) {
+    addIssue(issues, 'fail', 'evidence-traceability', '报告缺少可回溯的 VOC 证据引用', '在证据卡中加入 platform、keyword、batch、noteId/commentId/url。');
+  }
+  const suspiciousRefs = refs
+    .filter(ref => /^(?:xhs|douyin|amazon|voc|note|video|review|comment)/i.test(ref))
+    .filter(ref => !knownRefs.includes(ref));
+  if (suspiciousRefs.length) {
+    addIssue(issues, 'warn', 'evidence-traceability', `发现 ${suspiciousRefs.length} 个未匹配到数据的证据 ID`, '检查报告证据 ID 是否与 _merged.json 或 comments-flat.jsonl 一致。', { refs: suspiciousRefs.slice(0, 20) });
+  }
+}
+
+function checkDistribution(stats, issues) {
+  if (!stats.platforms.length) addIssue(issues, 'fail', 'platform-distribution', '数据缺少 platform 分布', '检查 normalizer 输出中的 platform 字段。');
+  if (!stats.keywords.length) addIssue(issues, 'fail', 'keyword-distribution', '数据缺少 keyword 分布', '检查采集矩阵和 raw 数据 keyword 字段。');
+  if (!stats.batches.length) addIssue(issues, 'warn', 'batch-distribution', '数据缺少 batch 分布', '补充 P0/P1/P2 批次信息,方便审计采集优先级。');
+  const missingRequired = stats.vocs.filter(voc => !voc.platform || !voc.keyword || !voc.batch || !cleanText(voc.text) || !asArray(voc.hypothesisTags).length);
+  if (missingRequired.length) {
+    addIssue(issues, 'fail', 'field-completeness', `comments-flat 中有 ${missingRequired.length} 条 VOC 缺少必填字段`, '补齐 platform、keyword、batch、hypothesisTags、text。', { ids: missingRequired.slice(0, 20).map(voc => voc.id) });
+  }
+}
+
+function checkActions(reportText, issues) {
+  const hasPriority = /\bP0\b|\bP1\b|\bP2\b/.test(reportText);
+  const hasOwner = /负责人|负责角色|owner/i.test(reportText);
+  const hasMetric = /验证指标|指标|转化率|点击率|满意度|复购率|metric/i.test(reportText);
+  if (!hasPriority) addIssue(issues, 'fail', 'action-priority', '行动建议缺少 P0/P1/P2 优先级', '为关键行动补充 P0/P1/P2。');
+  if (!hasOwner) addIssue(issues, 'warn', 'action-owner', '行动建议缺少负责人或负责角色', '为 P0 行动补充负责人或负责角色。');
+  if (!hasMetric) addIssue(issues, 'warn', 'action-metric', '行动建议缺少验证指标', '为每条关键行动补充验证方式或指标。');
+}
+
+function checkBoundaries(reportText, issues) {
+  if (!hasDataNatureText(reportText)) {
+    addIssue(issues, 'fail', 'data-nature', '报告未标注数据性质', '标注真实采集、课程样例或混合数据。');
+  }
+  if (!hasMedicalBoundary(reportText)) {
+    addIssue(issues, 'warn', 'risk-boundary', '报告未识别到明显风险/医学/功效边界说明', '补充数据边界、平台噪声、医学/功效边界和不能推出的结论。');
+  }
+}
+
+function checkMatrix(matrixPath, issues) {
+  if (!matrixPath) return;
+  if (!fs.existsSync(matrixPath)) {
+    addIssue(issues, 'warn', 'collection-matrix', '传入的采集矩阵文件不存在', '检查 --matrix 路径。', { matrixPath });
+    return;
+  }
+  const text = readText(matrixPath);
+  if (!/keyword|关键词/i.test(text) || !/platform|平台/i.test(text) || !/batch|P0|P1|P2/i.test(text)) {
+    addIssue(issues, 'warn', 'collection-matrix', '采集矩阵缺少 keyword/platform/batch 基础字段', '补齐采集矩阵字段,保证样本可回溯。');
+  }
+}
+
+function statusFromIssues(issues) {
+  const failCount = issues.filter(issue => issue.severity === 'fail').length;
+  const warnCount = issues.filter(issue => issue.severity === 'warn').length;
+  if (failCount) return 'fail';
+  if (warnCount) return 'warn';
+  return 'pass';
+}
+
+function renderAuditMarkdown(result) {
+  const lines = [];
+  lines.push('# VOC Report Audit Result');
+  lines.push('');
+  lines.push(`- **Status**: ${result.status}`);
+  lines.push(`- **Report**: ${result.inputs.report}`);
+  lines.push(`- **Merged**: ${result.inputs.merged}`);
+  lines.push(`- **Comments**: ${result.inputs.comments}`);
+  lines.push(`- **GeneratedAt**: ${result.generatedAt}`);
+  lines.push('');
+  lines.push('## Summary');
+  lines.push('');
+  lines.push('| Metric | Value |');
+  lines.push('|---|---:|');
+  lines.push(`| Fail | ${result.summary.fail} |`);
+  lines.push(`| Warn | ${result.summary.warn} |`);
+  lines.push(`| Pass checks | ${result.summary.passChecks} |`);
+  lines.push(`| Item count | ${result.data.itemCount} |`);
+  lines.push(`| VOC count | ${result.data.vocCount} |`);
+  lines.push(`| Platform count | ${result.data.platforms.length} |`);
+  lines.push(`| Keyword count | ${result.data.keywords.length} |`);
+  lines.push('');
+  lines.push('## Data Distribution');
+  lines.push('');
+  lines.push(`- **Platforms**: ${result.data.platforms.join(', ') || 'N/A'}`);
+  lines.push(`- **Keywords**: ${result.data.keywords.join(', ') || 'N/A'}`);
+  lines.push(`- **Batches**: ${result.data.batches.join(', ') || 'N/A'}`);
+  lines.push(`- **HypothesisTags**: ${result.data.hypothesisTags.join(', ') || 'N/A'}`);
+  lines.push('');
+  lines.push('## Issues');
+  lines.push('');
+  if (!result.issues.length) {
+    lines.push('No issues found.');
+  } else {
+    result.issues.forEach((issue, index) => {
+      lines.push(`### ${index + 1}. [${issue.severity}] ${issue.check}`);
+      lines.push('');
+      lines.push(`- **Message**: ${issue.message}`);
+      lines.push(`- **Suggestion**: ${issue.suggestion}`);
+      if (issue.details && Object.keys(issue.details).length) {
+        lines.push(`- **Details**: ${JSON.stringify(issue.details)}`);
+      }
+      lines.push('');
+    });
+  }
+  return lines.join('\n') + '\n';
+}
+
+function main() {
+  const args = parseArgs(process.argv.slice(2));
+  if (args.help || !args.report || !args.merged || !args.comments) {
+    console.log(usage());
+    process.exit(args.help ? 0 : 1);
+  }
+
+  const reportPath = path.resolve(args.report);
+  const mergedPath = path.resolve(args.merged);
+  const commentsPath = path.resolve(args.comments);
+  const matrixPath = args.matrix ? path.resolve(args.matrix) : undefined;
+  const outputDir = path.resolve(args.output || path.dirname(reportPath));
+
+  const reportText = readText(reportPath);
+  const merged = readJson(mergedPath);
+  const comments = readJsonl(commentsPath);
+  const stats = dataStats(merged, comments);
+  const issues = [];
+
+  checkPlaceholder(reportText, issues);
+  checkReportIntegrity(reportText, reportPath, issues);
+  checkSampleCounts(reportText, stats, issues);
+  checkHypothesis(reportText, stats, issues);
+  checkEvidenceTraceability(reportText, stats, issues);
+  checkDistribution(stats, issues);
+  checkActions(reportText, issues);
+  checkBoundaries(reportText, issues);
+  checkMatrix(matrixPath, issues);
+
+  const status = statusFromIssues(issues);
+  const result = {
+    status,
+    generatedAt: new Date().toISOString(),
+    inputs: {
+      report: reportPath,
+      merged: mergedPath,
+      comments: commentsPath,
+      matrix: matrixPath
+    },
+    summary: {
+      fail: issues.filter(issue => issue.severity === 'fail').length,
+      warn: issues.filter(issue => issue.severity === 'warn').length,
+      passChecks: 8 - uniq(issues.map(issue => issue.check)).length
+    },
+    data: {
+      itemCount: stats.itemCount,
+      vocCount: stats.vocCount,
+      rawSampleCount: stats.rawSampleCount,
+      platforms: stats.platforms,
+      keywords: stats.keywords,
+      batches: stats.batches,
+      hypothesisTags: stats.hypothesisTags
+    },
+    issues
+  };
+
+  ensureDir(outputDir);
+  fs.writeFileSync(path.join(outputDir, 'audit-result.json'), JSON.stringify(result, null, 2) + '\n', 'utf8');
+  fs.writeFileSync(path.join(outputDir, 'audit-report.md'), renderAuditMarkdown(result), 'utf8');
+
+  console.log(JSON.stringify({
+    status: result.status,
+    fail: result.summary.fail,
+    warn: result.summary.warn,
+    outputDir,
+    files: ['audit-result.json', 'audit-report.md']
+  }, null, 2));
+
+  if (status === 'fail' && args.strict) process.exit(1);
+}
+
+if (require.main === module) {
+  try {
+    main();
+  } catch (error) {
+    console.error(error.message);
+    process.exit(1);
+  }
+}
+
+module.exports = {
+  parseArgs,
+  dataStats,
+  checkPlaceholder,
+  checkSampleCounts,
+  checkHypothesis,
+  checkEvidenceTraceability,
+  statusFromIssues
+};

+ 290 - 0
scripts/tools/voc-single-platform-report.js

@@ -0,0 +1,290 @@
+#!/usr/bin/env node
+const fs = require('fs');
+const os = require('os');
+const path = require('path');
+const { spawnSync } = require('child_process');
+
+function parseArgs(argv) {
+  const args = {};
+  for (let i = 0; i < argv.length; i++) {
+    const token = argv[i];
+    if (!token.startsWith('--')) continue;
+    const eq = token.indexOf('=');
+    if (eq >= 0) {
+      args[token.slice(2, eq)] = token.slice(eq + 1);
+    } else {
+      const key = token.slice(2);
+      const next = argv[i + 1];
+      if (next && !next.startsWith('--')) {
+        args[key] = next;
+        i++;
+      } else {
+        args[key] = true;
+      }
+    }
+  }
+  return args;
+}
+
+function usage() {
+  return [
+    'Usage:',
+    '  node voc-single-platform-report.js --platform <platform> --category <category> --raw-dir <raw-data-dir> [--output <out-dir>]',
+    '  node voc-single-platform-report.js --platform xiaohongshu --category <category> --sample-mode true [--output <out-dir>]',
+    '',
+    'Inputs:',
+    '  --raw-dir          Raw platform data directory for normalization',
+    '  --normalized-dir   Existing normalized VOC directory containing _merged.json and comments-flat.jsonl',
+    '  --sample-mode      Use packaged Xiaohongshu course sample data when true',
+    '',
+    'Outputs:',
+    '  normalized/_merged.json',
+    '  platform-mini-report/platform-mini-report.md',
+    '  platform-mini-report/platform-mini-report.json',
+    '  platform-mini-report/platform-mini-report.html',
+    '  audit/audit-report.md',
+    '  audit/audit-result.json'
+  ].join('\n');
+}
+
+function toBool(value) {
+  if (typeof value === 'boolean') return value;
+  if (value === undefined || value === null) return false;
+  return ['1', 'true', 'yes', 'y'].includes(String(value).toLowerCase());
+}
+
+function slugify(value) {
+  return String(value || 'voc-report')
+    .trim()
+    .replace(/[\\/:*?"<>|\s]+/g, '-')
+    .replace(/-+/g, '-')
+    .replace(/^-|-$/g, '') || 'voc-report';
+}
+
+function parseKeywords(value) {
+  if (!value) return [];
+  if (Array.isArray(value)) return value;
+  const text = String(value).trim();
+  if (!text) return [];
+  if (text.startsWith('[')) {
+    try {
+      const parsed = JSON.parse(text);
+      return Array.isArray(parsed) ? parsed.map(String).filter(Boolean) : [];
+    } catch {
+      return [];
+    }
+  }
+  return text.split(/[,,;;|]/).map(item => item.trim()).filter(Boolean);
+}
+
+function readJson(filePath) {
+  return JSON.parse(fs.readFileSync(filePath, 'utf8'));
+}
+
+function ensureDir(dirPath) {
+  fs.mkdirSync(dirPath, { recursive: true });
+}
+
+function unique(values) {
+  return Array.from(new Set(values.filter(Boolean)));
+}
+
+function existingPath(candidates) {
+  return unique(candidates).find(candidate => fs.existsSync(candidate));
+}
+
+function resolveTool(relativePath) {
+  const home = os.homedir();
+  const openclawTools = path.join(home, '.openclaw', 'tools');
+  const openclawWorkspace = path.join(home, '.openclaw', 'workspace');
+  const projectRoot = path.resolve(__dirname, '..', '..');
+  const baseName = path.basename(relativePath);
+  return existingPath([
+    path.isAbsolute(relativePath) ? relativePath : '',
+    path.join(process.cwd(), relativePath),
+    path.join(projectRoot, relativePath),
+    path.join(__dirname, relativePath),
+    path.join(__dirname, baseName),
+    path.join(openclawTools, relativePath.replace(/^scripts[\\/]tools[\\/]/, '')),
+    path.join(openclawTools, relativePath),
+    path.join(openclawWorkspace, relativePath)
+  ]);
+}
+
+function resolveSampleDir(platform) {
+  const normalizedPlatform = platform === 'xhs' ? 'xiaohongshu' : platform;
+  const home = os.homedir();
+  return existingPath([
+    path.join(process.cwd(), 'demo', normalizedPlatform),
+    path.join(path.resolve(__dirname, '..', '..'), 'demo', normalizedPlatform),
+    path.join(__dirname, 'course-samples', normalizedPlatform),
+    path.join(home, '.openclaw', 'tools', 'course-samples', normalizedPlatform),
+    path.join(home, '.openclaw', 'workspace', 'scripts', 'tools', 'course-samples', normalizedPlatform)
+  ]);
+}
+
+function parseLastJson(stdout) {
+  const text = String(stdout || '').trim();
+  if (!text) return {};
+  for (let i = text.lastIndexOf('{'); i >= 0; i = text.lastIndexOf('{', i - 1)) {
+    try {
+      return JSON.parse(text.slice(i));
+    } catch {
+      continue;
+    }
+  }
+  return {};
+}
+
+function runNode(scriptPath, args, label) {
+  const child = spawnSync(process.execPath, [scriptPath, ...args], {
+    cwd: process.cwd(),
+    encoding: 'utf8',
+    maxBuffer: 1024 * 1024 * 100
+  });
+  if (child.stdout) process.stdout.write(child.stdout);
+  if (child.stderr) process.stderr.write(child.stderr);
+  if (child.error) throw child.error;
+  if (child.status !== 0) throw new Error(`${label} failed with exit code ${child.status}`);
+  return parseLastJson(child.stdout);
+}
+
+function requiredTool(relativePath) {
+  const resolved = resolveTool(relativePath);
+  if (!resolved) throw new Error(`Required tool not found: ${relativePath}`);
+  return resolved;
+}
+
+function main() {
+  const args = parseArgs(process.argv.slice(2));
+  if (args.help) {
+    console.log(usage());
+    return;
+  }
+
+  const platform = args.platform || 'xiaohongshu';
+  const category = args.category || '';
+  const project = args.project || 'openclaw-voc-course';
+  const outputFormat = args['output-format'] || args.outputFormat || 'both';
+  const sampleMode = toBool(args['sample-mode'] ?? args.sampleMode);
+  const keywords = parseKeywords(args.keywords);
+  const date = args.date || new Date().toISOString().slice(0, 10);
+  const owner = args.owner || 'OpenClaw VOC Skills';
+
+  if (!category) throw new Error('Missing required argument: --category');
+  if (!['markdown', 'html', 'both'].includes(outputFormat)) throw new Error(`Invalid --output-format: ${outputFormat}`);
+
+  const outputRoot = path.resolve(args.output || path.join(process.cwd(), 'openclaw-voc-output', `${slugify(platform)}-${slugify(category)}-${date}`));
+  const normalizedDir = path.resolve(args['normalized-dir'] || args.normalizedDir || path.join(outputRoot, 'normalized'));
+  const reportDir = path.join(outputRoot, 'platform-mini-report');
+  const auditDir = path.join(outputRoot, 'audit');
+  ensureDir(outputRoot);
+
+  const rawDir = args['raw-dir'] || args.rawDir
+    ? path.resolve(args['raw-dir'] || args.rawDir)
+    : sampleMode
+      ? resolveSampleDir(platform)
+      : undefined;
+
+  if (!rawDir && !fs.existsSync(path.join(normalizedDir, '_merged.json'))) {
+    throw new Error('Provide --raw-dir, --normalized-dir, or --sample-mode true with packaged sample data. The local executable does not perform remote data collection by itself.');
+  }
+
+  const normalizer = requiredTool('scripts/tools/voc-data-normalizer.js');
+  const miniReport = requiredTool('scripts/tools/platform-mini-report-generator.js');
+  const auditor = requiredTool('scripts/tools/voc-report-auditor.js');
+  const htmlGenerator = outputFormat === 'html' || outputFormat === 'both'
+    ? requiredTool('voc-report-factory/html-v2/gen-report-template.js')
+    : undefined;
+
+  const steps = {};
+  if (rawDir) {
+    steps.normalizer = runNode(normalizer, [
+      '--input', rawDir,
+      '--output', normalizedDir,
+      '--project', project,
+      '--category', category
+    ], 'voc-data-normalizer');
+  }
+
+  steps.miniReport = runNode(miniReport, [
+    '--input', normalizedDir,
+    '--output', reportDir,
+    '--project', project,
+    '--category', category,
+    '--platform', platform,
+    '--owner', owner,
+    '--date', date,
+    '--business-question', args['business-question'] || args.businessQuestion || '',
+    '--keywords', keywords.join(',')
+  ], 'platform-mini-report-generator');
+
+  let htmlReportPath;
+  if (htmlGenerator) {
+    htmlReportPath = path.join(reportDir, 'platform-mini-report.html');
+    steps.htmlReport = runNode(htmlGenerator, [
+      '--data', path.join(reportDir, 'platform-mini-report.json'),
+      '--output', htmlReportPath
+    ], 'voc-html-report-generator');
+  }
+
+  steps.audit = runNode(auditor, [
+    '--report', path.join(reportDir, 'platform-mini-report.md'),
+    '--merged', path.join(normalizedDir, '_merged.json'),
+    '--comments', path.join(normalizedDir, 'comments-flat.jsonl'),
+    '--output', auditDir
+  ], 'voc-report-auditor');
+
+  const merged = readJson(path.join(normalizedDir, '_merged.json'));
+  const report = readJson(path.join(reportDir, 'platform-mini-report.json'));
+  const audit = readJson(path.join(auditDir, 'audit-result.json'));
+  const result = {
+    status: audit.status === 'fail' ? 'needs_review' : 'ok',
+    metadata: {
+      project,
+      platform,
+      category,
+      businessQuestion: args['business-question'] || args.businessQuestion || '',
+      keywords,
+      generatedAt: new Date().toISOString()
+    },
+    summary: {
+      itemCount: merged.metadata?.itemCount || 0,
+      commentCount: merged.metadata?.validVocCount || report.stats?.commentCount || 0,
+      keywordCount: keywords.length || merged.metadata?.keywords?.length || 0,
+      evidenceCardCount: report.audit?.evidenceCardCount || 0,
+      warningCount: (report.audit?.warningCount || 0) + (audit.summary?.warn || 0),
+      auditStatus: audit.status
+    },
+    outputs: {
+      outputRoot,
+      normalized: normalizedDir,
+      markdownReport: path.join(reportDir, 'platform-mini-report.md'),
+      jsonReport: path.join(reportDir, 'platform-mini-report.json'),
+      htmlReport: htmlReportPath,
+      auditReport: path.join(auditDir, 'audit-report.md'),
+      auditResult: path.join(auditDir, 'audit-result.json')
+    },
+    steps,
+    nextActions: [
+      '复核 audit-report.md 中的 warn/fail 项',
+      '补充真实采集数据后复跑同一链路',
+      '将 P0 机会点转成内容或产品验证动作'
+    ]
+  };
+
+  console.log(`SINGLE_PLATFORM_REPORT_RESULT=${JSON.stringify(result)}`);
+}
+
+try {
+  main();
+} catch (error) {
+  const result = {
+    status: 'error',
+    message: error.message,
+    generatedAt: new Date().toISOString()
+  };
+  console.error(error.message);
+  console.log(`SINGLE_PLATFORM_REPORT_RESULT=${JSON.stringify(result)}`);
+  process.exit(1);
+}

+ 91 - 0
voc-report-factory/0.Intake.template.md

@@ -0,0 +1,91 @@
+# 0. VOC 项目需求摄入模板
+
+> 目标:在采集和写报告前,把业务目标、决策问题、范围边界和交付标准一次性确认清楚。
+
+## 1. 基本信息
+
+| 字段 | 填写 |
+|---|---|
+| 项目名称 |  |
+| 客户/品牌 |  |
+| 品类/产品 |  |
+| 当前阶段 | 新品立项 / 上市前验证 / 增长复盘 / 竞品研究 / 其它 |
+| 决策人 |  |
+| 使用者 | 创始人 / 产品 / 市场 / 电商 / 内容 / 销售 / 其它 |
+| 交付日期 |  |
+| 汇报形式 | Markdown / HTML / PPT / 工作坊讲解 / 其它 |
+
+## 2. 业务背景
+
+| 问题 | 填写 |
+|---|---|
+| 这次为什么要做 VOC? |  |
+| 当前业务目标是什么? |  |
+| 已经掌握了哪些确定信息? |  |
+| 当前最不确定的判断是什么? |  |
+| 如果本报告完成,应该帮助团队做出什么决策? |  |
+
+## 3. 核心决策问题
+
+| 编号 | 决策问题 | 优先级 | 判断口径 |
+|---|---|---|---|
+| Q1 |  | P0 |  |
+| Q2 |  | P1 |  |
+| Q3 |  | P2 |  |
+
+## 4. 品类与产品边界
+
+| 字段 | 填写 |
+|---|---|
+| 目标品类 |  |
+| 目标人群 |  |
+| 目标价格带 |  |
+| 核心卖点/成分/功能 |  |
+| 使用场景 |  |
+| 不纳入本次研究的品类/人群/场景 |  |
+
+## 5. 平台与数据范围
+
+| 平台 | 是否纳入 | 目的 | 预期样本 | 风险 |
+|---|---|---|---:|---|
+| 小红书 | 是 / 否 |  |  |  |
+| 抖音 | 是 / 否 |  |  |  |
+| Amazon | 是 / 否 |  |  |  |
+| TikTok / Instagram | 是 / 否 |  |  |  |
+| 其它 | 是 / 否 |  |  |  |
+
+## 6. 竞品与替代方案
+
+| 类型 | 名称 | 为什么纳入 | 已知信息 |
+|---|---|---|---|
+| 直接竞品 |  |  |  |
+| 间接竞品 |  |  |  |
+| 替代方案 |  |  |  |
+
+## 7. 交付物定义
+
+| 交付物 | 是否需要 | 完成标准 |
+|---|---|---|
+| 执行摘要 | 是 / 否 |  |
+| 完整报告 | 是 / 否 |  |
+| HTML 报告 | 是 / 否 |  |
+| 原始数据包 | 是 / 否 |  |
+| 采集矩阵 | 是 / 否 |  |
+| 审计记录 | 是 / 否 |  |
+| 行动建议表 | 是 / 否 |  |
+
+## 8. 风险与不做事项
+
+| 类型 | 内容 | 处理方式 |
+|---|---|---|
+| 数据风险 |  |  |
+| 平台风险 |  |  |
+| 合规风险 |  |  |
+| 时间风险 |  |  |
+| 明确不做 |  |  |
+
+## 9. 本模板输入、输出与完成标准
+
+- **输入**:客户访谈、产品资料、现有竞品清单、目标平台、交付时间要求。
+- **输出**:已确认的项目背景、决策问题、平台范围、竞品范围、交付物和不做事项。
+- **完成标准**:Q1-Q3 至少有 1 个 P0 问题;平台范围和样本口径明确;交付物和截止时间明确;风险与不做事项已被客户或项目负责人确认。

+ 141 - 0
voc-report-factory/1.Hypothesis.template.md

@@ -0,0 +1,141 @@
+# 1. VOC H1-H8 假设模板
+
+> 目标:把 Intake 中的决策问题拆成可采集、可验证、可反证的 H1-H8 假设。
+
+## 1. 假设总览
+
+| 假设 | 方向 | 核心问题 | 验证状态 | 证据强度 |
+|---|---|---|---|---|
+| H1 | 品类机会 | 市场是否值得进入/加码? | 未验证 / 已验证 / 证据不足 / 被反证 | 高 / 中 / 低 |
+| H2 | 用户需求 | 用户真实痛点和高频场景是什么? | 未验证 / 已验证 / 证据不足 / 被反证 | 高 / 中 / 低 |
+| H3 | 产品缺口 | 当前产品/竞品哪里没有满足? | 未验证 / 已验证 / 证据不足 / 被反证 | 高 / 中 / 低 |
+| H4 | 价格认知 | 用户对价格、规格、价值感如何判断? | 未验证 / 已验证 / 证据不足 / 被反证 | 高 / 中 / 低 |
+| H5 | 渠道内容 | 哪些内容/平台影响用户决策? | 未验证 / 已验证 / 证据不足 / 被反证 | 高 / 中 / 低 |
+| H6 | 竞品策略 | 竞品靠什么赢,哪里有漏洞? | 未验证 / 已验证 / 证据不足 / 被反证 | 高 / 中 / 低 |
+| H7 | 定位表达 | 什么话术、概念、定位更能打动用户? | 未验证 / 已验证 / 证据不足 / 被反证 | 高 / 中 / 低 |
+| H8 | 增长行动 | 下阶段最应该做哪些动作? | 未验证 / 已验证 / 证据不足 / 被反证 | 高 / 中 / 低 |
+
+## 2. 假设展开卡
+
+### H1 品类机会
+
+| 字段 | 填写 |
+|---|---|
+| 假设表述 |  |
+| 对应决策问题 |  |
+| 需要验证的用户表达 |  |
+| 需要覆盖的平台 |  |
+| 关键词方向 |  |
+| 支持证据标准 |  |
+| 反证信号 |  |
+| 最终判断 | 未验证 / 已验证 / 证据不足 / 被反证 |
+
+### H2 用户需求
+
+| 字段 | 填写 |
+|---|---|
+| 假设表述 |  |
+| 对应决策问题 |  |
+| 需要验证的用户表达 |  |
+| 需要覆盖的平台 |  |
+| 关键词方向 |  |
+| 支持证据标准 |  |
+| 反证信号 |  |
+| 最终判断 | 未验证 / 已验证 / 证据不足 / 被反证 |
+
+### H3 产品缺口
+
+| 字段 | 填写 |
+|---|---|
+| 假设表述 |  |
+| 对应决策问题 |  |
+| 需要验证的用户表达 |  |
+| 需要覆盖的平台 |  |
+| 关键词方向 |  |
+| 支持证据标准 |  |
+| 反证信号 |  |
+| 最终判断 | 未验证 / 已验证 / 证据不足 / 被反证 |
+
+### H4 价格认知
+
+| 字段 | 填写 |
+|---|---|
+| 假设表述 |  |
+| 对应决策问题 |  |
+| 需要验证的用户表达 |  |
+| 需要覆盖的平台 |  |
+| 关键词方向 |  |
+| 支持证据标准 |  |
+| 反证信号 |  |
+| 最终判断 | 未验证 / 已验证 / 证据不足 / 被反证 |
+
+### H5 渠道内容
+
+| 字段 | 填写 |
+|---|---|
+| 假设表述 |  |
+| 对应决策问题 |  |
+| 需要验证的用户表达 |  |
+| 需要覆盖的平台 |  |
+| 关键词方向 |  |
+| 支持证据标准 |  |
+| 反证信号 |  |
+| 最终判断 | 未验证 / 已验证 / 证据不足 / 被反证 |
+
+### H6 竞品策略
+
+| 字段 | 填写 |
+|---|---|
+| 假设表述 |  |
+| 对应决策问题 |  |
+| 需要验证的用户表达 |  |
+| 需要覆盖的平台 |  |
+| 关键词方向 |  |
+| 支持证据标准 |  |
+| 反证信号 |  |
+| 最终判断 | 未验证 / 已验证 / 证据不足 / 被反证 |
+
+### H7 定位表达
+
+| 字段 | 填写 |
+|---|---|
+| 假设表述 |  |
+| 对应决策问题 |  |
+| 需要验证的用户表达 |  |
+| 需要覆盖的平台 |  |
+| 关键词方向 |  |
+| 支持证据标准 |  |
+| 反证信号 |  |
+| 最终判断 | 未验证 / 已验证 / 证据不足 / 被反证 |
+
+### H8 增长行动
+
+| 字段 | 填写 |
+|---|---|
+| 假设表述 |  |
+| 对应决策问题 |  |
+| 需要验证的用户表达 |  |
+| 需要覆盖的平台 |  |
+| 关键词方向 |  |
+| 支持证据标准 |  |
+| 反证信号 |  |
+| 最终判断 | 未验证 / 已验证 / 证据不足 / 被反证 |
+
+## 3. 假设到采集矩阵映射
+
+| 假设 | 推荐关键词类型 | 推荐平台 | 最低证据量 | 备注 |
+|---|---|---|---:|---|
+| H1 | 品类词、趋势词、痛点词 | 小红书 / 抖音 / Amazon | 30 条 VOC |  |
+| H2 | 场景词、人群词、问题词 | 小红书 / 抖音 | 50 条 VOC |  |
+| H3 | 产品词、差评词、参数词 | Amazon / 小红书 | 30 条 VOC |  |
+| H4 | 价格词、规格词、促销词 | Amazon / 电商评论 | 20 条 VOC |  |
+| H5 | 平台词、内容词、达人词 | 小红书 / 抖音 / TikTok | 20 条 VOC |  |
+| H6 | 竞品品牌词、替代方案词 | 全平台 | 每个竞品 20 条 VOC |  |
+| H7 | 话术词、概念词、卖点词 | 小红书 / 抖音 | 30 条 VOC |  |
+| H8 | 行动词、复购词、推荐词 | 全平台 | 20 条 VOC |  |
+
+## 4. 本模板输入、输出与完成标准
+
+- **输入**:`0.Intake.md` 中的核心决策问题、平台范围、产品边界、竞品范围。
+- **输出**:H1-H8 假设表、每条假设的验证问题、关键词方向、证据标准和反证信号。
+- **完成标准**:至少 H1-H3 填写完整;每个 P0 决策问题至少对应 1 条假设;每条进入采集的假设都有关键词方向、平台和最低证据量。

+ 78 - 0
voc-report-factory/2.ReportOutline.template.md

@@ -0,0 +1,78 @@
+# 2. VOC 报告结构模板
+
+> 目标:把 H1-H8 假设转成报告章节结构,确保每一章都有结论、证据、业务解释和行动建议。
+
+## 1. 报告版本选择
+
+| 版本 | 适用场景 | 建议页数/章节 | 交付形式 |
+|---|---|---:|---|
+| 轻量 4 章版 | 单平台课程作业、快速验证、内部同步 | 4 章 | Markdown / HTML |
+| 企业 6-7 章版 | 多平台深度报告、客户交付、工作坊复盘 | 6-7 章 | HTML / PPT / 工作坊讲解 |
+
+## 2. 轻量 4 章版结构
+
+| 章节 | 章节目标 | 对应假设 | 必备内容 | 完成标准 |
+|---|---|---|---|---|
+| Ch1 结论先行 | 回答核心决策问题 | H1-H8 汇总 | 一句话结论、证据强度、样本概况 | 读者 3 分钟内知道该怎么决策 |
+| Ch2 用户声音 | 呈现痛点、场景、需求结构 | H2, H3 | 高频主题、VOC 原声、用户角色 | 至少 3 张 VOC 证据卡 |
+| Ch3 竞品/平台发现 | 解释平台内容和竞品策略 | H5, H6, H7 | 竞品对比、内容话术、平台差异 | 至少 2 个可对比发现 |
+| Ch4 行动建议 | 输出下一步动作 | H8 | P0/P1/P2 行动表、验证指标 | 每条建议有负责人、周期、验证方式 |
+
+## 3. 企业 6-7 章版结构
+
+| 章节 | 章节目标 | 对应假设 | 必备内容 | 完成标准 |
+|---|---|---|---|---|
+| Ch1 执行摘要与核心判断 | 面向决策人给出结论 | H1-H8 汇总 | 核心判断、风险、行动优先级 | 不依赖正文也能做初步判断 |
+| Ch2 品类与需求全景 | 判断市场机会和需求结构 | H1, H2 | 品类机会、用户分层、场景地图 | 能解释为什么值得/不值得进入 |
+| Ch3 用户 VOC 与痛点结构 | 展示真实用户语言 | H2, H3 | 高频痛点、正负反馈、证据卡 | 每个关键结论可追溯到原声 |
+| Ch4 竞品与替代方案分析 | 找到竞争位置和缺口 | H3, H6 | 竞品池、优劣势、替代路径 | 至少覆盖直接竞品和替代方案 |
+| Ch5 定位、话术、产品/内容机会 | 转化为表达与产品机会 | H5, H7 | 定位句、话术 AB、内容建议、产品机会 | 能直接进入内容或产品迭代 |
+| Ch6 渠道与场景策略 | 明确不同平台打法 | H5, H8 | 平台角色、渠道策略、场景组合 | 每个平台有任务分工 |
+| Ch7 行动计划与验证路径 | 形成落地闭环 | H8 | P0/P1/P2 roadmap、指标、复盘节奏 | 能进入项目管理和下一轮采集 |
+
+## 4. 章节卡片模板
+
+### ChX 章节名称
+
+| 字段 | 填写 |
+|---|---|
+| 章节结论标题 |  |
+| 对应假设 |  |
+| 核心洞察 1 |  |
+| 核心洞察 2 |  |
+| 核心洞察 3 |  |
+| 证据来源 | 平台 / 关键词 / batch / noteId / commentId |
+| 业务解释 |  |
+| 行动建议 |  |
+| 风险边界 |  |
+
+## 5. VOC 证据卡模板
+
+| 字段 | 填写 |
+|---|---|
+| 证据 ID |  |
+| 平台 |  |
+| 关键词 |  |
+| batch | P0 / P1 / P2 |
+| hypothesisTags | H1-H8 |
+| 原声 |  |
+| 互动指标 | likeCount / commentCount / rating |
+| 业务解释 |  |
+| 支持的结论 |  |
+
+## 6. 报告封面数字
+
+| 指标 | 数值 | 来源文件 | 备注 |
+|---|---:|---|---|
+| 平台数 |  | `_merged.json` |  |
+| 关键词数 |  | `3.CollectionMatrix.md` / `_merged.json` |  |
+| 原始样本数 |  | raw files |  |
+| 去重后 VOC 数 |  | `comments-flat.jsonl` |  |
+| 覆盖假设数 |  | `1.Hypothesis.md` |  |
+| 交付日期 |  | README / report metadata |  |
+
+## 7. 本模板输入、输出与完成标准
+
+- **输入**:`0.Intake.md` 的决策问题、`1.Hypothesis.md` 的 H1-H8、平台和样本范围。
+- **输出**:已选定的报告版本、章节结构、每章对应假设、证据卡要求和封面数字口径。
+- **完成标准**:每个 P0 决策问题至少出现在 1 个章节;每个主要章节有结论、证据、业务解释和行动建议;封面数字能回溯到原始数据文件。

+ 77 - 0
voc-report-factory/3.CollectionMatrix.template.md

@@ -0,0 +1,77 @@
+# 3. VOC 采集矩阵模板
+
+> 目标:把 H1-H8 假设转成可执行的关键词、平台、批次和样本量计划。
+
+## 1. 采集目标
+
+| 字段 | 填写 |
+|---|---|
+| 项目名称 |  |
+| 核心决策问题 |  |
+| 覆盖平台 |  |
+| 计划采集周期 |  |
+| 目标原始样本数 |  |
+| 目标有效 VOC 数 |  |
+| 采集负责人 |  |
+
+## 2. 批次策略
+
+| 批次 | 用途 | 建议占比 | 启动条件 | 完成标准 |
+|---|---|---:|---|---|
+| P0 | 核心关键词和高置信方向 | 20%-30% | Intake 与 H1-H3 已确认 | 核心问题有初步证据 |
+| P1 | 竞品、场景、功效、痛点扩展 | 40%-50% | P0 噪声可控 | 主要假设都有样本覆盖 |
+| P2 | 长尾、异常、补证与反证 | 20%-30% | P0/P1 发现空白或矛盾 | 关键结论有反证检查 |
+
+## 3. 关键词四象限
+
+| 类型 | 用途 | 示例 | 适合平台 |
+|---|---|---|---|
+| 产品词 | 找产品认知和参数反馈 | 品牌名、品类名、成分、功能词 | Amazon / 小红书 / 抖音 |
+| 竞品词 | 找竞争结构和替代方案 | 竞品品牌、对标品、替代品 | 全平台 |
+| 场景词 | 找真实使用和购买触发 | 开学、熬夜、送礼、旅行、饭局 | 小红书 / 抖音 |
+| 长尾问题词 | 找疑虑、避坑和决策语言 | 怎么选、有没有用、副作用、测评 | 小红书 / 搜索型内容 |
+
+## 4. 采集矩阵
+
+| id | platform | keyword | keywordType | batch | targetCount | hypothesisTags | purpose | expectedSignal | risk | status |
+|---|---|---|---|---|---:|---|---|---|---|---|
+| M001 | 小红书 |  | 产品词 / 竞品词 / 场景词 / 长尾问题词 | P0 |  | H1,H2 |  |  |  | 未开始 |
+| M002 | 抖音 |  | 产品词 / 竞品词 / 场景词 / 长尾问题词 | P1 |  | H5,H7 |  |  |  | 未开始 |
+| M003 | Amazon |  | 产品词 / 竞品词 / 场景词 / 长尾问题词 | P1 |  | H3,H4,H6 |  |  |  | 未开始 |
+
+## 5. 平台采集字段要求
+
+| 平台 | 内容对象 | 评论对象 | 必须保留字段 |
+|---|---|---|---|
+| 小红书 | noteId、title、desc、author、metrics、url | commentId、content、author、likeCount、ipLocation | platform、keyword、batch、hypothesisTags、collectedAt |
+| 抖音 | videoId、title、desc、author、metrics、url | commentId、text、author、likeCount、replyCount | platform、keyword、batch、hypothesisTags、collectedAt |
+| Amazon | asin、title、brand、rating、price、url | reviewId、title、text、rating、verified、date | platform、keyword、batch、hypothesisTags、collectedAt |
+| TikTok / Instagram | postId、caption、author、metrics、url | commentId、text、author、likeCount | platform、keyword、batch、hypothesisTags、collectedAt |
+
+## 6. 采集前检查
+
+| 检查项 | 标准 | 状态 |
+|---|---|---|
+| Token / credentials | 已预飞或确认可用 | 未检查 / 通过 / 失败 |
+| 单关键词小样本 | 每个平台至少试采 1 个关键词 | 未检查 / 通过 / 失败 |
+| 噪声评估 | 离题、高赞广告、重复内容可控 | 未检查 / 通过 / 失败 |
+| 去重口径 | ID、URL、正文相似度口径明确 | 未检查 / 通过 / 失败 |
+| 文件命名 | raw 文件命名与矩阵 id 可对应 | 未检查 / 通过 / 失败 |
+
+## 7. 文件命名建议
+
+```text
+docs/<project>/raw/
+  xhs-M001-<keyword>.json
+  douyin-M002-<keyword>.json
+  amazon-M003-<asin-or-keyword>.json
+  _merged.json
+  comments-flat.jsonl
+  audit.log
+```
+
+## 8. 本模板输入、输出与完成标准
+
+- **输入**:`0.Intake.md` 的平台范围、`1.Hypothesis.md` 的 H1-H8、`2.ReportOutline.md` 的章节证据需求。
+- **输出**:可执行的采集矩阵,包含平台、关键词、批次、目标样本量、假设标签、采集目的和风险。
+- **完成标准**:每个 P0 假设至少有 1 条采集任务;每条采集任务都有 targetCount、purpose、expectedSignal 和 risk;文件命名能回溯到矩阵 id。

+ 79 - 0
voc-report-factory/4.CollectionExecutionSummary.template.md

@@ -0,0 +1,79 @@
+# 4. VOC 采集执行摘要模板
+
+> 目标:记录采集执行结果、样本量、假设覆盖、异常处理和下一步补采建议,为报告写作和审计提供依据。
+
+## 1. 执行概况
+
+| 字段 | 填写 |
+|---|---|
+| 项目名称 |  |
+| 执行日期 |  |
+| 执行负责人 |  |
+| 使用采集矩阵 | `3.CollectionMatrix.md` |
+| 原始数据目录 | `raw/` |
+| 合并数据文件 | `raw/_merged.json` |
+| 扁平 VOC 文件 | `raw/comments-flat.jsonl` |
+| 审计日志 | `raw/audit.log` |
+
+## 2. 样本量总览
+
+| 平台 | 计划样本 | 原始样本 | 去重后 VOC | 有效率 | 备注 |
+|---|---:|---:|---:|---:|---|
+| 小红书 |  |  |  |  |  |
+| 抖音 |  |  |  |  |  |
+| Amazon |  |  |  |  |  |
+| TikTok / Instagram |  |  |  |  |  |
+| 合计 |  |  |  |  |  |
+
+## 3. 关键词执行结果
+
+| matrixId | platform | keyword | batch | targetCount | rawCount | validVocCount | status | 异常说明 |
+|---|---|---|---|---:|---:|---:|---|---|
+| M001 |  |  | P0 |  |  |  | 完成 / 部分完成 / 失败 |  |
+| M002 |  |  | P1 |  |  |  | 完成 / 部分完成 / 失败 |  |
+| M003 |  |  | P2 |  |  |  | 完成 / 部分完成 / 失败 |  |
+
+## 4. H1-H8 覆盖情况
+
+| 假设 | 目标证据量 | 实际证据量 | 覆盖状态 | 关键发现 | 是否需要补采 |
+|---|---:|---:|---|---|---|
+| H1 品类机会 |  |  | 充分 / 一般 / 不足 |  | 是 / 否 |
+| H2 用户需求 |  |  | 充分 / 一般 / 不足 |  | 是 / 否 |
+| H3 产品缺口 |  |  | 充分 / 一般 / 不足 |  | 是 / 否 |
+| H4 价格认知 |  |  | 充分 / 一般 / 不足 |  | 是 / 否 |
+| H5 渠道内容 |  |  | 充分 / 一般 / 不足 |  | 是 / 否 |
+| H6 竞品策略 |  |  | 充分 / 一般 / 不足 |  | 是 / 否 |
+| H7 定位表达 |  |  | 充分 / 一般 / 不足 |  | 是 / 否 |
+| H8 增长行动 |  |  | 充分 / 一般 / 不足 |  | 是 / 否 |
+
+## 5. 数据质量记录
+
+| 问题类型 | 发现数量 | 影响范围 | 处理方式 | 是否影响结论 |
+|---|---:|---|---|---|
+| 重复样本 |  |  | 去重 / 保留 / 标注 | 是 / 否 |
+| 离题样本 |  |  | 剔除 / 降权 / 标注 | 是 / 否 |
+| 商业内容 |  |  | 剔除 / 降权 / 标注 | 是 / 否 |
+| 字段缺失 |  |  | 补齐 / 标注 / 剔除 | 是 / 否 |
+| 平台偏差 |  |  | 补采 / 说明边界 | 是 / 否 |
+
+## 6. 初步发现
+
+| 发现 | 对应假设 | 证据来源 | 可能进入报告章节 |
+|---|---|---|---|
+|  | H1-H8 | platform / keyword / commentId | Ch1-Ch7 |
+|  | H1-H8 | platform / keyword / commentId | Ch1-Ch7 |
+|  | H1-H8 | platform / keyword / commentId | Ch1-Ch7 |
+
+## 7. 补采建议
+
+| 补采方向 | 原因 | 平台 | 关键词/对象 | 目标样本 | 优先级 |
+|---|---|---|---|---:|---|
+|  |  |  |  |  | P0 / P1 / P2 |
+|  |  |  |  |  | P0 / P1 / P2 |
+|  |  |  |  |  | P0 / P1 / P2 |
+
+## 8. 本模板输入、输出与完成标准
+
+- **输入**:`3.CollectionMatrix.md`、原始采集文件、`_merged.json`、`comments-flat.jsonl`、采集日志。
+- **输出**:采集执行摘要、样本量统计、H1-H8 覆盖状态、异常处理记录和补采建议。
+- **完成标准**:所有 matrixId 都有执行状态;封面样本量能从本摘要回溯;不足和异常均有处理方式;报告写作前已明确是否需要补采。

+ 71 - 0
voc-report-factory/README.md

@@ -0,0 +1,71 @@
+# VOC Report Factory 模板包
+
+> 用途:把 VOC 报告交付流程从个人经验沉淀成可复用模板。当前版本是 Markdown 模板包,后续可升级为 `voc-report-factory` skill。
+
+## 适用场景
+
+- 单平台 mini VOC 报告
+- 多平台品类/竞品 VOC 报告
+- 企业工作坊后的深度验证报告
+- 课程学员从采集矩阵到报告交付的练习
+
+## 文件清单
+
+| 文件 | 阶段 | 作用 |
+|---|---|---|
+| `0.Intake.template.md` | Phase 1 | 需求摄入与边界确认 |
+| `1.Hypothesis.template.md` | Phase 2 | H1-H8 假设与验证问题 |
+| `2.ReportOutline.template.md` | Phase 2 | 轻量/企业版报告结构 |
+| `3.CollectionMatrix.template.md` | Phase 3 | 平台、关键词、批次、样本量设计 |
+| `4.CollectionExecutionSummary.template.md` | Phase 4 | 采集执行、样本概况、异常记录 |
+| `raw-schema.md` | Phase 4 | `_merged.json` 与 `comments-flat.jsonl` 字段标准 |
+| `report-quality-audit.md` | Phase 6 | 报告交付前质量审计 checklist |
+| `delivery-readme.template.md` | Phase 6 | 客户交付包说明模板 |
+| `html-v2/report-components.js` | Phase 6 | HTML v2 通用组件:标题、VOC 卡片、矩阵、柱图、行动列表 |
+| `html-v2/report-renderer-template.js` | Phase 6 | `CHAPTERS + buildHTML` 标准渲染模板 |
+| `html-v2/chapter-module-template.js` | Phase 6 | 按章拆分的章节模块模板 |
+| `html-v2/gen-report-template.js` | Phase 6 | HTML 报告生成入口模板 |
+
+## 推荐使用顺序
+
+1. 复制本目录到项目目录,例如 `docs/<project>/report-factory/`。
+2. 填写 `0.Intake.template.md`,确认业务目标、决策问题、平台范围和不做事项。
+3. 填写 `1.Hypothesis.template.md`,把问题拆成 H1-H8。
+4. 选择 `2.ReportOutline.template.md` 中的轻量 4 章或企业 6-7 章结构。
+5. 填写 `3.CollectionMatrix.template.md`,再执行采集。
+6. 填写 `4.CollectionExecutionSummary.template.md`,说明样本量、覆盖度和异常。
+7. 按 `raw-schema.md` 保留 `_merged.json` 与 `comments-flat.jsonl`。
+8. 报告完成后用 `report-quality-audit.md` 做交付前审计。
+9. 用 `delivery-readme.template.md` 生成客户交付包 README。
+10. 如需 HTML v2 报告,可基于 `html-v2/` 组件库与渲染模板生成可演示 HTML。
+
+## HTML v2 快速生成
+
+内置 demo:
+
+```powershell
+node voc-report-factory/html-v2/gen-report-template.js --output demo/report-factory/html-v2-demo-report.html
+```
+
+从单平台 mini report 生成 HTML:
+
+```powershell
+node voc-report-factory/html-v2/gen-report-template.js --data demo/xiaohongshu/platform-mini-report/platform-mini-report.json --output demo/xiaohongshu/platform-mini-report/platform-mini-report.html
+```
+
+从章节草稿生成 HTML:
+
+```powershell
+node voc-report-factory/html-v2/gen-report-template.js --data demo/xiaohongshu/chapter-insights/chapter-insights.json --output demo/xiaohongshu/chapter-insights/chapter-insights.html
+```
+
+`gen-report-template.js` 会自动识别原生 HTML v2 data、`platform-mini-report.json` 和 `chapter-insights.json`。
+
+## 单项目完成定义
+
+- **问题闭环**:报告开头明确回答 Intake 中的核心决策问题。
+- **数据闭环**:封面样本量、正文统计、原始数据文件一致。
+- **假设闭环**:H1-H8 每条都有验证状态。
+- **证据闭环**:关键结论能追溯到原始 VOC、平台、关键词与批次。
+- **行动闭环**:输出 P0/P1/P2 行动建议,并说明验证方式。
+- **审计闭环**:交付前完成质量审计,严重问题为 0。

+ 109 - 0
voc-report-factory/delivery-readme.template.md

@@ -0,0 +1,109 @@
+# VOC 报告交付包 README 模板
+
+> 用途:随客户交付包一起提供,说明交付物、数据口径、复跑方式、风险边界和下一步建议。
+
+## 1. 交付包信息
+
+| 字段 | 填写 |
+|---|---|
+| 项目名称 |  |
+| 客户/品牌 |  |
+| 品类/产品 |  |
+| 交付日期 |  |
+| 交付版本 | v1.0 |
+| 交付负责人 |  |
+| 联系方式 |  |
+
+## 2. 交付物清单
+
+```text
+<project>-delivery/
+  report.html
+  executive-summary.md
+  0.Intake.md
+  1.Hypothesis.md
+  2.ReportOutline.md
+  3.CollectionMatrix.md
+  4.CollectionExecutionSummary.md
+  raw/
+    _merged.json
+    comments-flat.jsonl
+    audit.log
+  scripts/
+  report-quality-audit.md
+  README.md
+```
+
+| 文件/目录 | 是否包含 | 说明 |
+|---|---|---|
+| `report.html` | 是 / 否 | 完整 HTML 报告 |
+| `executive-summary.md` | 是 / 否 | 决策摘要 |
+| `0.Intake.md` | 是 / 否 | 项目需求与边界 |
+| `1.Hypothesis.md` | 是 / 否 | H1-H8 假设与验证状态 |
+| `2.ReportOutline.md` | 是 / 否 | 报告结构与章节映射 |
+| `3.CollectionMatrix.md` | 是 / 否 | 采集矩阵 |
+| `4.CollectionExecutionSummary.md` | 是 / 否 | 采集执行摘要 |
+| `raw/` | 是 / 否 | 原始与归一化数据 |
+| `scripts/` | 是 / 否 | 采集、归一、渲染或复跑脚本 |
+| `report-quality-audit.md` | 是 / 否 | 质量审计记录 |
+
+## 3. 数据口径
+
+| 指标 | 数值 | 说明 |
+|---|---:|---|
+| 覆盖平台 |  |  |
+| 关键词数 |  |  |
+| 原始样本数 |  |  |
+| 去重后 VOC 数 |  |  |
+| 覆盖时间范围 |  |  |
+| H1-H8 覆盖情况 |  |  |
+| 去重规则 |  |  |
+
+## 4. 如何阅读报告
+
+1. 先阅读 `executive-summary.md` 或报告 Ch1,确认核心判断和行动优先级。
+2. 再阅读与当前决策最相关的章节,例如用户需求、竞品、定位话术或渠道策略。
+3. 查看每章 VOC 证据卡,确认结论是否来自真实用户表达。
+4. 最后查看行动计划,确认负责人、周期和验证指标。
+
+## 5. 如何回溯证据
+
+| 报告元素 | 回溯方式 |
+|---|---|
+| 封面样本量 | 查看 `4.CollectionExecutionSummary.md` 和 `raw/_merged.json` |
+| VOC 证据卡 | 根据 platform、keyword、batch、commentId 在 `raw/comments-flat.jsonl` 中查找 |
+| 假设判断 | 查看 `1.Hypothesis.md` 的验证状态 |
+| 采集范围 | 查看 `3.CollectionMatrix.md` |
+| 异常处理 | 查看 `raw/audit.log` 和 `report-quality-audit.md` |
+
+## 6. 复跑方式
+
+| 场景 | 建议操作 |
+|---|---|
+| 30 天后更新 | 复用 `3.CollectionMatrix.md`,补采 P0/P1 关键词 |
+| 新竞品出现 | 在 `3.CollectionMatrix.md` 增加竞品词,更新 H6 |
+| 新平台加入 | 增加平台任务,补充 `raw-schema.md` 中对应字段 |
+| 报告扩展为企业版 | 基于 `2.ReportOutline.md` 扩展到 6-7 章 |
+| 行动复盘 | 对照 H8 和行动建议表,检查验证指标变化 |
+
+## 7. 风险边界
+
+- **数据边界**:本报告仅代表本次采集范围内的公开 VOC 样本,不等于全市场结论。
+- **平台边界**:不同平台用户结构和内容机制不同,不能直接相互替代。
+- **时间边界**:用户讨论和竞品策略会变化,建议按 30-60 天周期复盘。
+- **医学/功效边界**:用户表达不能替代临床或合规证明。
+- **商业内容边界**:达人合作、广告内容和测评号可能影响平台信号。
+
+## 8. 下一步建议
+
+| 优先级 | 行动 | 负责人 | 时间窗口 | 验证指标 |
+|---|---|---|---|---|
+| P0 |  |  |  |  |
+| P1 |  |  |  |  |
+| P2 |  |  |  |  |
+
+## 9. 本模板输入、输出与完成标准
+
+- **输入**:最终交付包、质量审计结果、采集执行摘要、报告行动建议。
+- **输出**:客户可阅读的交付说明,包含交付物清单、数据口径、证据回溯、复跑方式和风险边界。
+- **完成标准**:客户能根据 README 找到所有交付物;报告数字和证据回溯路径明确;下一步行动和复跑方式清楚。

+ 65 - 0
voc-report-factory/html-v2/chapter-module-template.js

@@ -0,0 +1,65 @@
+const {
+  renderSlide,
+  renderMetricGrid,
+  renderInsightCards,
+  renderVocGrid,
+  renderBarChart,
+  renderCompareTable,
+  renderMatrix2x2,
+  renderDecisionList
+} = require('./report-components');
+
+function renderChapterIntro(data = {}) {
+  return renderSlide({
+    id: data.id || 'chapter-intro',
+    eyebrow: data.eyebrow || 'Chapter',
+    title: data.title || '章节标题',
+    subtitle: data.subtitle || '章节副标题',
+    tone: data.tone || 'green',
+    body: renderInsightCards(data.insights || [])
+  });
+}
+
+function renderChapterEvidence(data = {}) {
+  return renderSlide({
+    id: data.id || 'chapter-evidence',
+    eyebrow: data.eyebrow || 'Evidence',
+    title: data.title || '证据页标题',
+    subtitle: data.subtitle || '证据页副标题',
+    tone: data.tone || 'blue',
+    body: renderVocGrid(data.vocs || [])
+  });
+}
+
+function renderChapterAnalysis(data = {}) {
+  const table = data.table ? renderCompareTable(data.table) : '';
+  const matrix = data.matrix ? renderMatrix2x2(data.matrix) : '';
+  const bars = data.bars ? renderBarChart(data.bars) : '';
+  const metrics = data.metrics ? renderMetricGrid(data.metrics) : '';
+  return renderSlide({
+    id: data.id || 'chapter-analysis',
+    eyebrow: data.eyebrow || 'Analysis',
+    title: data.title || '分析页标题',
+    subtitle: data.subtitle || '分析页副标题',
+    tone: data.tone || 'gold',
+    body: `${metrics}${bars}${matrix}${table}`
+  });
+}
+
+function renderChapterAction(data = {}) {
+  return renderSlide({
+    id: data.id || 'chapter-action',
+    eyebrow: data.eyebrow || 'Action',
+    title: data.title || '行动页标题',
+    subtitle: data.subtitle || '行动页副标题',
+    tone: data.tone || 'orange',
+    body: renderDecisionList(data.actions || [])
+  });
+}
+
+module.exports = {
+  renderChapterIntro,
+  renderChapterEvidence,
+  renderChapterAnalysis,
+  renderChapterAction
+};

+ 79 - 0
voc-report-factory/html-v2/gen-report-template.js

@@ -0,0 +1,79 @@
+const fs = require('fs');
+const path = require('path');
+const { buildHTML, DEFAULT_REPORT_DATA, adaptReportData } = require('./report-renderer-template');
+
+function parseArgs(argv) {
+  const args = {};
+  for (let i = 0; i < argv.length; i++) {
+    const token = argv[i];
+    if (!token.startsWith('--')) continue;
+    const eq = token.indexOf('=');
+    if (eq >= 0) {
+      args[token.slice(2, eq)] = token.slice(eq + 1);
+    } else {
+      const key = token.slice(2);
+      const next = argv[i + 1];
+      if (next && !next.startsWith('--')) {
+        args[key] = next;
+        i++;
+      } else {
+        args[key] = true;
+      }
+    }
+  }
+  return args;
+}
+
+function usage() {
+  return [
+    'Usage:',
+    '  node voc-report-factory/html-v2/gen-report-template.js --output <report.html> [--data report-data.json|platform-mini-report.json|chapter-insights.json]',
+    '',
+    'If --data is omitted, the built-in demo data is used.'
+  ].join('\n');
+}
+
+function readData(filePath) {
+  if (!filePath) return DEFAULT_REPORT_DATA;
+  const absolute = path.resolve(filePath);
+  return JSON.parse(fs.readFileSync(absolute, 'utf8'));
+}
+
+function ensureDir(filePath) {
+  fs.mkdirSync(path.dirname(filePath), { recursive: true });
+}
+
+function main() {
+  const args = parseArgs(process.argv.slice(2));
+  if (args.help || !args.output) {
+    console.log(usage());
+    process.exit(args.help ? 0 : 1);
+  }
+  const outputPath = path.resolve(args.output);
+  const data = readData(args.data);
+  const adapted = adaptReportData(data);
+  const html = buildHTML(data);
+  ensureDir(outputPath);
+  fs.writeFileSync(outputPath, html, 'utf8');
+  console.log(JSON.stringify({
+    output: outputPath,
+    bytes: Buffer.byteLength(html, 'utf8'),
+    title: adapted.metadata?.title || data.metadata?.title || 'VOC Insight Report'
+  }, null, 2));
+}
+
+if (require.main === module) {
+  try {
+    main();
+  } catch (error) {
+    console.error(error.message);
+    process.exit(1);
+  }
+}
+
+module.exports = {
+  parseArgs,
+  readData,
+  adaptReportData,
+  buildHTML
+};

Разница между файлами не показана из-за своего большого размера
+ 226 - 0
voc-report-factory/html-v2/report-components.js


+ 397 - 0
voc-report-factory/html-v2/report-renderer-template.js

@@ -0,0 +1,397 @@
+const {
+  renderSlide,
+  renderCover,
+  renderMetricGrid,
+  renderInsightCards,
+  renderVocGrid,
+  renderBarChart,
+  renderCompareTable,
+  renderMatrix2x2,
+  renderDecisionList,
+  renderEvidenceTable,
+  renderHtml
+} = require('./report-components');
+
+const CHAPTERS = [
+  { id: 'summary', title: '执行摘要', shortTitle: '摘要', tone: 'green' },
+  { id: 'evidence', title: 'VOC 证据', shortTitle: '证据', tone: 'blue' },
+  { id: 'opportunity', title: '机会判断', shortTitle: '机会', tone: 'gold' },
+  { id: 'action', title: '行动计划', shortTitle: '行动', tone: 'orange' }
+];
+
+const DEFAULT_REPORT_DATA = {
+  metadata: {
+    title: 'VOC HTML v2 Demo Report',
+    subtitle: '模板化组件库生成示例',
+    project: 'voc-report-factory-demo',
+    period: '2026-04',
+    owner: 'VOC Report Factory',
+    version: 'HTML v2'
+  },
+  metrics: [
+    { value: '180', label: '目标 VOC 样本', note: '来自采集矩阵 targetCount' },
+    { value: '8/8', label: 'H1-H8 覆盖', note: '每条假设至少 3 个关键词' },
+    { value: '3', label: '平台关键词', note: '小红书课程 demo' },
+    { value: '0', label: '审计警告', note: '可进入采集执行' }
+  ],
+  insights: [
+    { tag: 'H1', title: '品类机会明确', text: '用户搜索和讨论集中在怎么选、是否有效和安全边界。', tone: 'green' },
+    { tag: 'H2', title: '场景触发强', text: '腹胀、便秘、儿童肠胃和日常调理是主要触发场景。', tone: 'blue' },
+    { tag: 'H7', title: '话术需要降噪', text: '用户更接受具体场景解释,而不是泛泛功效承诺。', tone: 'purple' }
+  ],
+  vocs: [
+    { quote: '给孩子吃之前最怕配方看不懂,想知道到底适不适合。', author: '课程样例用户 A', source: '小红书', likeCount: 18, tags: ['安全', '配方'] },
+    { quote: '腹胀的时候才想起来买,最好能说清楚多久有感觉。', author: '课程样例用户 B', source: '小红书', likeCount: 12, tags: ['场景', '见效'] },
+    { quote: '测评太多了,看来看去还是不知道哪个适合自己。', author: '课程样例用户 C', source: '小红书', likeCount: 25, tags: ['测评', '选择困难'] }
+  ],
+  bars: [
+    { label: '使用场景', value: 42, display: '42%', tone: 'green' },
+    { label: '购买决策', value: 31, display: '31%', tone: 'blue' },
+    { label: '竞品参照', value: 18, display: '18%', tone: 'gold' },
+    { label: '价格规格', value: 9, display: '9%', tone: 'rose' }
+  ],
+  matrix: {
+    xLabel: '机会确定性',
+    yLabel: '执行难度',
+    quadrants: [
+      { label: 'P0', title: '优先采集', text: '怎么选、腹胀便秘、测评类关键词。', tone: 'green' },
+      { label: 'P1', title: '放大验证', text: '价格、规格、达人推荐和竞品对比。', tone: 'gold' },
+      { label: 'P2', title: '观察补采', text: '复购、推荐、转化等后链路信号。', tone: 'blue' },
+      { label: '暂缓', title: '低信号区域', text: '广告噪声高且用户原声不足的关键词。', tone: 'rose' }
+    ]
+  },
+  table: {
+    columns: ['假设', '关键词数', '状态', '备注'],
+    rows: [
+      { '假设': 'H1', '关键词数': '3', '状态': '通过', '备注': '品类机会' },
+      { '假设': 'H2', '关键词数': '3', '状态': '通过', '备注': '用户需求' },
+      { '假设': 'H3', '关键词数': '3', '状态': '通过', '备注': '产品缺口' },
+      { '假设': 'H8', '关键词数': '3', '状态': '通过', '备注': '增长行动' }
+    ]
+  },
+  evidence: [
+    { claim: '用户需要明确选择标准', evidence: '怎么选、测评、配方类词反复出现', source: '关键词矩阵', confidence: '中' },
+    { claim: '安全与体感边界要写清楚', evidence: '评论会追问适合人群和见效周期', source: 'VOC 原声', confidence: '中' },
+    { claim: '内容应从场景切入', evidence: '痛点场景词比纯品类词更利于收集原声', source: '采集计划', confidence: '高' }
+  ],
+  actions: [
+    { rank: 'P0', title: '先跑 3 个核心关键词', text: '儿童益生菌怎么选、益生菌腹胀便秘、冻干益生菌测评。', owner: '采集负责人', metric: '每词 10 条有效评论' },
+    { rank: 'P1', title: '扩展 H1-H8 覆盖词', text: '使用 collection-matrix-builder 的 expand 模式补齐覆盖。', owner: '分析负责人', metric: 'warnings = 0' },
+    { rank: 'P2', title: '生成 mini report 并审计', text: '用 voc-report-auditor 检查样本量、假设覆盖和证据回溯。', owner: '交付负责人', metric: '严重问题 = 0' }
+  ]
+};
+
+const TONE_SEQUENCE = ['green', 'blue', 'gold', 'purple', 'orange', 'rose'];
+
+function asArray(value) {
+  if (!value) return [];
+  return Array.isArray(value) ? value : [value];
+}
+
+function firstDefined(...values) {
+  for (const value of values) {
+    if (value !== undefined && value !== null && value !== '') return value;
+  }
+  return undefined;
+}
+
+function uniqueBy(items, getter) {
+  const seen = new Set();
+  const output = [];
+  items.forEach(item => {
+    const key = getter(item);
+    if (!key || seen.has(key)) return;
+    seen.add(key);
+    output.push(item);
+  });
+  return output;
+}
+
+function shortText(value, length = 96) {
+  const text = String(value || '').replace(/\s+/g, ' ').trim();
+  return text.length > length ? `${text.slice(0, length - 1)}…` : text;
+}
+
+function toneAt(index) {
+  return TONE_SEQUENCE[index % TONE_SEQUENCE.length];
+}
+
+function isNativeReportData(data) {
+  return Array.isArray(data?.metrics) && Array.isArray(data?.insights) && Array.isArray(data?.actions);
+}
+
+function isPlatformMiniReport(data) {
+  return data && data.stats && Array.isArray(data.themes) && Array.isArray(data.evidenceCards);
+}
+
+function isChapterInsights(data) {
+  return data && Array.isArray(data.chapters) && data.audit;
+}
+
+function adaptEvidenceCard(card = {}, index = 0) {
+  return {
+    quote: card.text || card.quote,
+    author: card.author || card.commentId || card.id || `VOC ${index + 1}`,
+    source: card.source || [card.platform, card.keyword, card.batch, card.commentId || card.id].filter(Boolean).join(' / '),
+    likeCount: card.likeCount,
+    tags: asArray(card.hypothesisTags || card.tags || card.theme).filter(Boolean),
+    tone: toneAt(index)
+  };
+}
+
+function adaptPlatformMiniReport(data) {
+  const meta = data.metadata || {};
+  const stats = data.stats || {};
+  const audit = data.audit || {};
+  const themes = asArray(data.themes);
+  const evidenceCards = asArray(data.evidenceCards);
+  const coverage = asArray(data.hypothesisCoverage);
+  const opportunities = asArray(data.opportunities);
+  const actions = asArray(data.actions);
+  const platformName = meta.platformName || meta.platformKey || '单平台';
+  const category = meta.category || '';
+  const title = `${platformName}${category ? ` · ${category}` : ''} VOC Mini Report`;
+
+  return {
+    metadata: {
+      title,
+      subtitle: shortText(data.conclusion || '单平台 VOC mini report 自动生成版', 120),
+      project: meta.project || title,
+      period: meta.date || String(meta.generatedAt || '').slice(0, 10),
+      owner: meta.owner || 'VOC Report Factory',
+      version: 'HTML v2 · Platform Mini Report'
+    },
+    metrics: [
+      { value: String(stats.commentCount ?? audit.commentCount ?? 0), label: 'VOC 样本', note: 'normalized comments' },
+      { value: String(stats.itemCount ?? 0), label: '内容样本', note: 'normalized items' },
+      { value: String(stats.keywordCount ?? asArray(stats.keywords).length), label: '关键词数', note: asArray(stats.keywords).slice(0, 3).join('、') },
+      { value: data.evidenceStrength || '未标注', label: '证据强度', note: `warnings ${audit.warningCount ?? 0}` }
+    ],
+    insights: [
+      { tag: '结论', title: '核心判断', text: data.conclusion, tone: 'green' },
+      ...themes.slice(0, 3).map((theme, index) => ({
+        tag: theme.ratio || theme.count,
+        title: theme.theme,
+        text: theme.explanation || theme.quote,
+        tone: toneAt(index + 1)
+      }))
+    ].filter(item => item.text || item.title),
+    vocs: evidenceCards.map(adaptEvidenceCard),
+    bars: themes.map((theme, index) => ({
+      label: theme.theme,
+      value: theme.count,
+      display: `${theme.ratio || ''}${theme.ratio ? ' / ' : ''}${theme.count}`,
+      tone: toneAt(index)
+    })),
+    matrix: {
+      xLabel: '机会优先级',
+      yLabel: '证据强度',
+      quadrants: opportunities.slice(0, 4).map((item, index) => ({
+        label: item.priority || `P${index}`,
+        title: item.opportunity,
+        text: item.action || item.evidence,
+        tone: toneAt(index)
+      }))
+    },
+    table: {
+      columns: ['假设', '状态', 'VOC数', '用途'],
+      rows: coverage.map(item => ({
+        '假设': `${item.tag || ''} ${item.label || ''}`.trim(),
+        '状态': item.status,
+        'VOC数': item.count,
+        '用途': item.usage
+      }))
+    },
+    evidence: evidenceCards.map(card => ({
+      claim: `${card.theme || 'VOC'} 判断`,
+      evidence: card.text,
+      source: card.source,
+      confidence: data.evidenceStrength || '中'
+    })),
+    actions: actions.map((item, index) => ({
+      rank: item.priority || `P${index}`,
+      title: item.action || item.title,
+      text: [item.deadline, item.metric].filter(Boolean).join(' · '),
+      owner: item.owner,
+      metric: item.metric
+    })),
+    theme: data.theme
+  };
+}
+
+function aggregateThemeBars(chapters) {
+  const counts = new Map();
+  chapters.forEach(chapter => {
+    asArray(chapter.topThemes).forEach(item => {
+      const label = item.label || item.theme;
+      if (!label) return;
+      counts.set(label, (counts.get(label) || 0) + Number(item.count || 0));
+    });
+  });
+  return [...counts.entries()]
+    .map(([label, value], index) => ({ label, value, display: value, tone: toneAt(index) }))
+    .sort((a, b) => b.value - a.value)
+    .slice(0, 8);
+}
+
+function adaptChapterInsights(data) {
+  const meta = data.metadata || {};
+  const audit = data.audit || {};
+  const chapters = asArray(data.chapters);
+  const evidenceCards = uniqueBy(chapters.flatMap(chapter => asArray(chapter.evidence)), card => card.id || card.commentId || card.source || card.text);
+  const title = `${meta.category || meta.project || 'VOC'} Chapter Insights`;
+
+  return {
+    metadata: {
+      title,
+      subtitle: `基于 ${meta.commentCount || 0} 条 VOC 自动生成的证据驱动章节草稿`,
+      project: meta.project || title,
+      period: String(meta.generatedAt || audit.generatedAt || '').slice(0, 10),
+      owner: 'chapter-insight-writer',
+      version: `HTML v2 · ${meta.version || 'chapter draft'}`
+    },
+    metrics: [
+      { value: String(meta.commentCount ?? 0), label: 'VOC 样本', note: asArray(meta.platforms).join('、') },
+      { value: String(chapters.length), label: '章节数', note: meta.version || 'draft' },
+      { value: String(audit.totalEvidenceCards ?? evidenceCards.length), label: '证据卡', note: '去重 VOC 原声' },
+      { value: String(audit.warningCount ?? 0), label: '警告数', note: `unsupported ${audit.unsupportedConclusionCount ?? 0}` }
+    ],
+    insights: chapters.slice(0, 4).map((chapter, index) => ({
+      tag: chapter.id,
+      title: chapter.title,
+      text: chapter.conclusion,
+      tone: toneAt(index)
+    })),
+    vocs: evidenceCards.map(adaptEvidenceCard),
+    bars: aggregateThemeBars(chapters),
+    matrix: {
+      xLabel: '章节优先级',
+      yLabel: '证据密度',
+      quadrants: chapters.slice(0, 4).map((chapter, index) => ({
+        label: chapter.id,
+        title: chapter.title,
+        text: chapter.action || chapter.focus,
+        tone: toneAt(index)
+      }))
+    },
+    table: {
+      columns: ['章节', '假设', '证据量', '警告'],
+      rows: chapters.map(chapter => ({
+        '章节': `${chapter.id} ${chapter.title}`,
+        '假设': asArray(chapter.hypothesisTags).join(', '),
+        '证据量': `${chapter.evidenceCount || 0} / ${chapter.uniqueEvidenceCount || 0}`,
+        '警告': asArray(chapter.warnings).length
+      }))
+    },
+    evidence: chapters.map(chapter => ({
+      claim: chapter.title,
+      evidence: chapter.conclusion,
+      source: `${chapter.evidenceCount || 0} 条 VOC / ${chapter.uniqueEvidenceCount || 0} 张证据卡`,
+      confidence: asArray(chapter.warnings).length ? '需补证' : '中'
+    })),
+    actions: chapters.map((chapter, index) => ({
+      rank: chapter.id || `P${index}`,
+      title: chapter.title,
+      text: chapter.action,
+      owner: asArray(chapter.hypothesisTags).join(', '),
+      metric: `${chapter.uniqueEvidenceCount || 0} 张证据卡`
+    })),
+    theme: data.theme
+  };
+}
+
+function adaptReportData(input = {}) {
+  if (isNativeReportData(input)) return input;
+  if (isPlatformMiniReport(input)) return adaptPlatformMiniReport(input);
+  if (isChapterInsights(input)) return adaptChapterInsights(input);
+  return input;
+}
+
+function validateReportData(data) {
+  const errors = [];
+  if (!data || typeof data !== 'object') errors.push('report data must be an object');
+  if (!data.metadata) errors.push('metadata is required');
+  if (!Array.isArray(data.metrics) || !data.metrics.length) errors.push('metrics must not be empty');
+  if (!Array.isArray(data.insights) || !data.insights.length) errors.push('insights must not be empty');
+  if (!Array.isArray(data.actions) || !data.actions.length) errors.push('actions must not be empty');
+  return errors;
+}
+
+function renderSummary(data) {
+  return renderSlide({
+    id: 'summary',
+    eyebrow: 'Chapter 01',
+    title: '执行摘要',
+    subtitle: '用统一组件表达关键数字、核心洞察和报告结论。',
+    tone: 'green',
+    body: `${renderMetricGrid(data.metrics)}${renderInsightCards(data.insights)}`
+  });
+}
+
+function renderEvidence(data) {
+  return renderSlide({
+    id: 'evidence',
+    eyebrow: 'Chapter 02',
+    title: 'VOC 证据',
+    subtitle: '每个关键判断都应该能回到用户原声、平台、关键词和批次。',
+    tone: 'blue',
+    body: `${renderVocGrid(data.vocs)}${renderEvidenceTable(data.evidence)}`
+  });
+}
+
+function renderOpportunity(data) {
+  return renderSlide({
+    id: 'opportunity',
+    eyebrow: 'Chapter 03',
+    title: '机会判断',
+    subtitle: '用矩阵、表格和条形图表达机会优先级。',
+    tone: 'gold',
+    body: `${renderBarChart(data.bars)}${renderMatrix2x2(data.matrix)}${renderCompareTable(data.table)}`
+  });
+}
+
+function renderAction(data) {
+  return renderSlide({
+    id: 'action',
+    eyebrow: 'Chapter 04',
+    title: '行动计划',
+    subtitle: '把 VOC 发现转成 P0/P1/P2 的下一步验证动作。',
+    tone: 'orange',
+    body: renderDecisionList(data.actions)
+  });
+}
+
+const SLIDE_RENDERERS = {
+  summary: renderSummary,
+  evidence: renderEvidence,
+  opportunity: renderOpportunity,
+  action: renderAction
+};
+
+function buildHTML(input = {}) {
+  const adapted = adaptReportData(input);
+  const data = { ...DEFAULT_REPORT_DATA, ...adapted, metadata: { ...DEFAULT_REPORT_DATA.metadata, ...(adapted.metadata || {}) } };
+  const errors = validateReportData(data);
+  if (errors.length) throw new Error(errors.join('; '));
+  const slides = [renderCover(data.metadata, data.metrics)];
+  CHAPTERS.forEach(chapter => {
+    const renderer = SLIDE_RENDERERS[chapter.id];
+    if (renderer) slides.push(renderer(data));
+  });
+  return renderHtml({ metadata: data.metadata, chapters: CHAPTERS, slides, theme: data.theme });
+}
+
+module.exports = {
+  CHAPTERS,
+  DEFAULT_REPORT_DATA,
+  SLIDE_RENDERERS,
+  adaptReportData,
+  adaptPlatformMiniReport,
+  adaptChapterInsights,
+  validateReportData,
+  buildHTML,
+  renderSummary,
+  renderEvidence,
+  renderOpportunity,
+  renderAction
+};

+ 124 - 0
voc-report-factory/raw-schema.md

@@ -0,0 +1,124 @@
+# VOC 原始数据 Schema
+
+> 目标:统一 `_merged.json` 与 `comments-flat.jsonl` 的字段口径,保证报告封面数字、证据卡和审计能回溯。
+
+## 1. 文件约定
+
+```text
+raw/
+  _merged.json
+  comments-flat.jsonl
+  audit.log
+```
+
+| 文件 | 用途 | 格式 |
+|---|---|---|
+| `_merged.json` | 聚合后的项目级数据包 | JSON |
+| `comments-flat.jsonl` | 一行一条 VOC 原声,便于分析和审计 | JSONL |
+| `audit.log` | 采集、去重、剔除、补采记录 | text / markdown |
+
+## 2. `_merged.json` 顶层结构
+
+```json
+{
+  "metadata": {
+    "project": "",
+    "category": "",
+    "generatedAt": "",
+    "platforms": [],
+    "keywords": [],
+    "rawSampleCount": 0,
+    "validVocCount": 0,
+    "dedupeRule": ""
+  },
+  "sources": [],
+  "items": [],
+  "comments": [],
+  "audit": {}
+}
+```
+
+## 3. metadata 字段
+
+| 字段 | 类型 | 必填 | 说明 |
+|---|---|---|---|
+| project | string | 是 | 项目名称 |
+| category | string | 否 | 品类或产品线 |
+| generatedAt | string | 是 | ISO 时间 |
+| platforms | array | 是 | 覆盖平台列表 |
+| keywords | array | 是 | 采集关键词列表 |
+| rawSampleCount | number | 是 | 原始样本量 |
+| validVocCount | number | 是 | 去重后有效 VOC 数 |
+| dedupeRule | string | 是 | 去重口径说明 |
+
+## 4. item 内容对象字段
+
+| 字段 | 类型 | 必填 | 说明 |
+|---|---|---|---|
+| id | string | 是 | 统一内容 ID |
+| platform | string | 是 | xiaohongshu / douyin / amazon / tiktok / instagram |
+| sourceType | string | 是 | note / video / review / post / product |
+| keyword | string | 是 | 采集关键词 |
+| batch | string | 是 | P0 / P1 / P2 |
+| hypothesisTags | array | 是 | H1-H8 |
+| author | string | 否 | 作者昵称或店铺名 |
+| title | string | 否 | 标题 |
+| content | string | 是 | 正文、描述或评论内容 |
+| likeCount | number | 否 | 点赞数 |
+| commentCount | number | 否 | 评论数 |
+| rating | number | 否 | 电商评分 |
+| publishTime | string | 否 | 发布时间 |
+| collectedAt | string | 是 | 采集时间 |
+| url | string | 否 | 可追溯链接 |
+| productId | string | 否 | ASIN、商品 ID 或平台商品 ID |
+| brand | string | 否 | 品牌 |
+| competitor | string | 否 | 是否为竞品或竞品名 |
+| sentiment | string | 否 | positive / neutral / negative / mixed |
+| raw | object | 否 | 平台原始记录 |
+
+## 5. comment 扁平 VOC 字段
+
+| 字段 | 类型 | 必填 | 说明 |
+|---|---|---|---|
+| id | string | 是 | 统一 VOC ID |
+| platform | string | 是 | 来源平台 |
+| sourceType | string | 是 | comment / review / reply |
+| keyword | string | 是 | 采集关键词 |
+| batch | string | 是 | P0 / P1 / P2 |
+| hypothesisTags | array | 是 | H1-H8 |
+| author | string | 否 | 用户昵称 |
+| text | string | 是 | VOC 原声 |
+| likeCount | number | 否 | 点赞数 |
+| replyCount | number | 否 | 回复数 |
+| rating | number | 否 | 星级评分 |
+| publishTime | string | 否 | 发布时间 |
+| collectedAt | string | 是 | 采集时间 |
+| url | string | 否 | 来源链接 |
+| parentId | string | 否 | noteId / videoId / asin / postId |
+| commentId | string | 否 | 平台评论 ID |
+| ipLocation | string | 否 | 平台展示地域 |
+| sentiment | string | 否 | positive / neutral / negative / mixed |
+| theme | string | 否 | 痛点 / 场景 / 价格 / 竞品 / 话术等 |
+| raw | object | 否 | 原始评论记录 |
+
+## 6. `comments-flat.jsonl` 示例
+
+```jsonl
+{"id":"voc_001","platform":"xiaohongshu","sourceType":"comment","keyword":"儿童益生菌怎么选","batch":"P0","hypothesisTags":["H2","H3"],"author":"用户昵称","text":"独立条装、常温保存、少添加是我下单前最看重的。","likeCount":24,"replyCount":1,"collectedAt":"2026-04-29T14:45:00+08:00","url":"https://example.com","parentId":"xhs_demo_001","commentId":"xhs_demo_c_001","theme":"决策"}
+```
+
+## 7. 审计规则
+
+| 规则 | 标准 |
+|---|---|
+| 样本可追溯 | 关键结论引用的 VOC 必须能回到 platform、keyword、batch、url 或 ID |
+| 字段完整 | platform、keyword、batch、hypothesisTags、text/content、collectedAt 必须存在 |
+| 去重可解释 | 重复 ID、重复 URL、正文相似样本的处理方式必须记录 |
+| 离题可标注 | 高互动但离题样本不得直接作为结论证据 |
+| 合成样例标注 | 课程 demo 或模拟数据必须明确标注,不得伪装真实采集 |
+
+## 8. 本文件输入、输出与完成标准
+
+- **输入**:平台原始采集结果、采集矩阵、去重规则、字段归一化规则。
+- **输出**:`_merged.json` 与 `comments-flat.jsonl` 的统一字段标准、必填字段说明和审计规则。
+- **完成标准**:报告引用的所有 VOC 证据都能通过 platform、keyword、batch、url 或 ID 回溯;必填字段完整;去重和离题处理可解释。

+ 94 - 0
voc-report-factory/report-quality-audit.md

@@ -0,0 +1,94 @@
+# VOC 报告质量审计 Checklist
+
+> 目标:在交付前统一检查报告质量、数据闭环、证据回溯和行动建议,避免 placeholder、样本口径不一致或结论无法追溯。
+
+## 1. 审计信息
+
+| 字段 | 填写 |
+|---|---|
+| 项目名称 |  |
+| 报告文件 |  |
+| 原始数据目录 |  |
+| 审计人 |  |
+| 审计日期 |  |
+| 报告版本 |  |
+| 交付状态 | 待审计 / 需修改 / 可交付 |
+
+## 2. 严重问题检查
+
+| 检查项 | 通过标准 | 状态 | 备注 |
+|---|---|---|---|
+| placeholder 检查 | 不得出现 `TODO`、`placeholder`、`待补充`、空章节 | 通过 / 失败 |  |
+| 报告可打开 | HTML/Markdown/PPT 可正常打开,无明显损坏 | 通过 / 失败 |  |
+| 封面数字一致 | 封面平台数、样本量、日期与正文和数据一致 | 通过 / 失败 |  |
+| 结论可追溯 | 每个核心结论至少能回到 1 条 VOC 或数据表 | 通过 / 失败 |  |
+| 数据性质标注 | 真实采集、课程样例、混合数据必须明确标注 | 通过 / 失败 |  |
+| 医疗/功效边界 | 不把用户表达写成未经验证的功效结论 | 通过 / 失败 |  |
+
+## 3. 数据闭环检查
+
+| 检查项 | 通过标准 | 状态 | 备注 |
+|---|---|---|---|
+| 原始文件齐全 | raw 文件、`_merged.json`、`comments-flat.jsonl` 存在 | 通过 / 失败 |  |
+| 采集矩阵可回溯 | 样本能对应 `3.CollectionMatrix.md` 中的 matrixId 或 keyword | 通过 / 失败 |  |
+| 样本量可解释 | 每个平台、每批次数量变化有说明 | 通过 / 失败 |  |
+| 去重逻辑记录 | 重复 ID、重复 URL、正文相似度处理有记录 | 通过 / 失败 |  |
+| 离题样本处理 | 高互动离题内容被剔除、降权或标注 | 通过 / 失败 |  |
+| 字段完整性 | platform、keyword、batch、hypothesisTags、text/content、collectedAt 齐全 | 通过 / 失败 |  |
+
+## 4. 假设闭环检查
+
+| 假设 | 状态明确 | 证据充分 | 反证检查 | 备注 |
+|---|---|---|---|---|
+| H1 品类机会 | 是 / 否 | 是 / 否 | 是 / 否 |  |
+| H2 用户需求 | 是 / 否 | 是 / 否 | 是 / 否 |  |
+| H3 产品缺口 | 是 / 否 | 是 / 否 | 是 / 否 |  |
+| H4 价格认知 | 是 / 否 | 是 / 否 | 是 / 否 |  |
+| H5 渠道内容 | 是 / 否 | 是 / 否 | 是 / 否 |  |
+| H6 竞品策略 | 是 / 否 | 是 / 否 | 是 / 否 |  |
+| H7 定位表达 | 是 / 否 | 是 / 否 | 是 / 否 |  |
+| H8 增长行动 | 是 / 否 | 是 / 否 | 是 / 否 |  |
+
+## 5. 章节质量检查
+
+| 检查项 | 通过标准 | 状态 | 备注 |
+|---|---|---|---|
+| 结论性标题 | 每个主要章节标题表达判断,不只是主题名 | 通过 / 失败 |  |
+| 洞察数量 | 每个主要章节有 3-5 条关键洞察 | 通过 / 失败 |  |
+| VOC 证据卡 | 每个主要章节至少 3 张 VOC 证据卡或等价证据 | 通过 / 失败 |  |
+| 业务解释 | 每章说明该发现对产品、内容、渠道或增长的意义 | 通过 / 失败 |  |
+| 行动建议 | 每章至少有 1 条可执行建议或明确不行动原因 | 通过 / 失败 |  |
+| 风险边界 | 样本不足、平台偏差、噪声来源有说明 | 通过 / 失败 |  |
+
+## 6. 行动建议检查
+
+| 检查项 | 通过标准 | 状态 | 备注 |
+|---|---|---|---|
+| 优先级 | 建议按 P0/P1/P2 排序 | 通过 / 失败 |  |
+| 负责人 | P0 行动有建议负责人或负责角色 | 通过 / 失败 |  |
+| 周期 | P0/P1 行动有时间窗口 | 通过 / 失败 |  |
+| 验证指标 | 每条关键行动有验证指标 | 通过 / 失败 |  |
+| 复盘机制 | 说明下一轮采集、复盘或 AB 测试方式 | 通过 / 失败 |  |
+
+## 7. 审计结论
+
+| 分类 | 数量 |
+|---|---:|
+| 严重问题 |  |
+| 一般问题 |  |
+| 建议优化 |  |
+| 已修复 |  |
+| 遗留但可交付 |  |
+
+## 8. 修复记录
+
+| 问题 | 级别 | 修复方式 | 负责人 | 状态 |
+|---|---|---|---|---|
+|  | 严重 / 一般 / 建议 |  |  | 未修复 / 已修复 / 接受风险 |
+|  | 严重 / 一般 / 建议 |  |  | 未修复 / 已修复 / 接受风险 |
+
+## 9. 本模板输入、输出与完成标准
+
+- **输入**:最终报告、`0.Intake.md`、`1.Hypothesis.md`、`3.CollectionMatrix.md`、`4.CollectionExecutionSummary.md`、raw 数据目录。
+- **输出**:审计结论、问题清单、修复记录和是否可交付判断。
+- **完成标准**:严重问题为 0;一般问题均已修复或接受风险;封面数字、核心结论、VOC 证据和行动建议全部可回溯。

+ 73 - 0
voc/voc-chapter-insight-writer/SKILL.md

@@ -0,0 +1,73 @@
+---
+name: voc-chapter-insight-writer
+description: 基于归一化 VOC 数据生成带证据卡的章节洞察草稿 chapter-insights.md 和 chapter-insights.json
+version: 1.0.0
+author: nkkj-BrainHack
+---
+
+# VOC 章节洞察写作器
+
+## 技能名称
+
+`voc-chapter-insight-writer`
+
+## 技能目的
+
+把归一化 VOC 数据转成章节化洞察草稿,适合生成长报告章节、HTML v2 报告输入和课程中的证据卡讲解材料。
+
+## 输入参数
+
+| 参数 | 类型 | 必填 | 默认值 | 说明 |
+|---|---|---|---|---|
+| input | string | 是 |  | 归一化目录、`_merged.json` 或 `comments-flat.jsonl` |
+| output | string | 是 |  | 章节洞察输出目录 |
+| project | string | 否 | openclaw-voc-course | 项目名称 |
+| category | string | 否 |  | 品类、产品或品牌方向 |
+| version | string | 否 | light | `light` 或 `enterprise` |
+
+## 输出文件
+
+| 文件 | 说明 |
+|---|---|
+| `chapter-insights.md` | 可读章节洞察草稿 |
+| `chapter-insights.json` | 结构化章节洞察数据,可交给 HTML v2 渲染器 |
+
+## 执行方式
+
+这是本地脚本型 Skill。安装后 OpenClaw 应能在以下位置识别:
+
+| 组件 | 用户设备路径 |
+|---|---|
+| Skill | `~/.openclaw/skills/voc-chapter-insight-writer/` |
+| 执行脚本 | `~/.openclaw/tools/chapter-insight-writer.js` |
+| workspace 兼容路径 | `~/.openclaw/workspace/scripts/tools/chapter-insight-writer.js` |
+
+## 调用示例
+
+```json
+{
+  "input": "demo/xiaohongshu/normalized",
+  "output": "demo/xiaohongshu/chapter-insights",
+  "project": "openclaw-voc-course-demo",
+  "category": "冻干益生菌",
+  "version": "light"
+}
+```
+
+## 章节版本
+
+| version | 输出结构 |
+|---|---|
+| light | 4 章课程轻量报告结构 |
+| enterprise | 7 章企业报告草稿结构 |
+
+## 下游衔接
+
+- `voc-html-report-generator` 可读取 `chapter-insights.json` 生成 HTML v2。
+- `voc-report-auditor` 可继续审计生成后的报告。
+
+## 质量边界
+
+- 本 Skill 只生成证据支撑的章节草稿,不替代最终商业判断。
+- 样本不足或证据不足时会在输出中保留 warning。
+- 客户交付前必须人工复核章节标题、结论强度和合规边界。

+ 112 - 0
voc/voc-chapter-insight-writer/api-config.json

@@ -0,0 +1,112 @@
+{
+  "name": "voc-chapter-insight-writer",
+  "displayName": "VOC 章节洞察写作器",
+  "description": "读取归一化 VOC 数据,生成带证据卡的 chapter-insights.md 和 chapter-insights.json,可作为 HTML v2 或长报告章节草稿输入。",
+  "category": "voc",
+  "version": "1.0.0",
+  "type": "local-script",
+  "execution": {
+    "kind": "command",
+    "command": "node",
+    "args": [
+      "scripts/tools/openclaw-tool-runner.js",
+      "--tool",
+      "chapter-insight-writer.js",
+      "--result-prefix",
+      "CHAPTER_INSIGHT_RESULT",
+      "--",
+      "--input",
+      "{{input}}",
+      "--output",
+      "{{output}}",
+      "--project",
+      "{{project}}",
+      "--category",
+      "{{category}}",
+      "--version",
+      "{{version}}"
+    ],
+    "cwd": "{{workspaceRoot}}",
+    "outputParser": {
+      "type": "stdout-prefix-json",
+      "prefix": "CHAPTER_INSIGHT_RESULT=",
+      "description": "解析 stdout 中以 CHAPTER_INSIGHT_RESULT= 开头的最后一行。"
+    },
+    "exitCodes": {
+      "0": "ok",
+      "1": "error"
+    }
+  },
+  "parameters": {
+    "type": "object",
+    "required": [
+      "input",
+      "output"
+    ],
+    "properties": {
+      "input": {
+        "type": "string",
+        "description": "归一化目录、_merged.json 或 comments-flat.jsonl。"
+      },
+      "output": {
+        "type": "string",
+        "description": "章节洞察输出目录。"
+      },
+      "project": {
+        "type": "string",
+        "default": "openclaw-voc-course"
+      },
+      "category": {
+        "type": "string",
+        "default": ""
+      },
+      "version": {
+        "type": "string",
+        "default": "light",
+        "enum": [
+          "light",
+          "enterprise"
+        ]
+      }
+    }
+  },
+  "output": {
+    "type": "object",
+    "properties": {
+      "outputDir": {
+        "type": "string"
+      },
+      "files": {
+        "type": "array",
+        "items": {
+          "type": "string"
+        }
+      },
+      "chapterCount": {
+        "type": "integer"
+      },
+      "evidenceCards": {
+        "type": "integer"
+      },
+      "warnings": {
+        "type": "integer"
+      },
+      "unsupportedConclusionCount": {
+        "type": "integer"
+      }
+    }
+  },
+  "deployment": {
+    "skillInstallDir": "~/.openclaw/skills/voc-chapter-insight-writer",
+    "toolInstallPaths": [
+      "~/.openclaw/tools/chapter-insight-writer.js",
+      "~/.openclaw/workspace/scripts/tools/chapter-insight-writer.js",
+      "~/.openclaw/workspace/scripts/tools/openclaw-tool-runner.js"
+    ]
+  },
+  "relatedFiles": {
+    "executor": "scripts/tools/chapter-insight-writer.js",
+    "runner": "scripts/tools/openclaw-tool-runner.js",
+    "htmlRenderer": "voc-report-factory/html-v2/gen-report-template.js"
+  }
+}

+ 66 - 0
voc/voc-data-normalizer/SKILL.md

@@ -0,0 +1,66 @@
+---
+name: voc-data-normalizer
+description: 将平台原始 VOC 文件归一化为 _merged.json、comments-flat.jsonl 和 normalizer-audit.json
+version: 1.0.0
+author: nkkj-BrainHack
+---
+
+# VOC 数据归一化
+
+## 技能名称
+
+`voc-data-normalizer`
+
+## 技能目的
+
+把小红书、抖音、Amazon、TikTok、Instagram 等平台的原始 VOC 文件统一整理成报告生成链路可复用的数据格式。
+
+## 输入参数
+
+| 参数 | 类型 | 必填 | 默认值 | 说明 |
+|---|---|---|---|---|
+| input | string | 是 |  | 原始平台数据目录 |
+| output | string | 是 |  | 归一化输出目录 |
+| project | string | 否 | openclaw-voc-course | 项目名称 |
+| category | string | 否 |  | 品类、产品或品牌方向 |
+
+## 输出文件
+
+| 文件 | 说明 |
+|---|---|
+| `_merged.json` | 归一化后的 items、comments、sources、metadata 和 audit 汇总 |
+| `comments-flat.jsonl` | 扁平 VOC 原声记录,一行一条 |
+| `normalizer-audit.json` | 去重、缺字段、错误文件和样本统计 |
+
+## 执行方式
+
+这是本地脚本型 Skill。安装后 OpenClaw 应能在以下位置识别:
+
+| 组件 | 用户设备路径 |
+|---|---|
+| Skill | `~/.openclaw/skills/voc-data-normalizer/` |
+| 执行脚本 | `~/.openclaw/tools/voc-data-normalizer.js` |
+| workspace 兼容路径 | `~/.openclaw/workspace/scripts/tools/voc-data-normalizer.js` |
+
+## 调用示例
+
+```json
+{
+  "input": "demo/xiaohongshu",
+  "output": "demo/xiaohongshu/normalized",
+  "project": "openclaw-voc-course-demo",
+  "category": "冻干益生菌"
+}
+```
+
+## 下游衔接
+
+- `voc-platform-mini-report-generator` 读取 `_merged.json` 或 `comments-flat.jsonl` 生成 Markdown/JSON 报告。
+- `voc-html-report-generator` 可读取 `platform-mini-report.json` 生成 HTML v2 报告。
+- `voc-report-auditor` 对报告和归一化数据做质量审计。
+
+## 质量边界
+
+- 只做结构归一化、去重和字段补齐,不替代平台采集。
+- 输入目录内的原始文件必须是 JSON 或 JSONL。
+- 样本质量仍取决于上游采集关键词、时间窗和平台返回质量。

+ 107 - 0
voc/voc-data-normalizer/api-config.json

@@ -0,0 +1,107 @@
+{
+  "name": "voc-data-normalizer",
+  "displayName": "VOC 数据归一化",
+  "description": "将小红书、抖音、Amazon、TikTok、Instagram 等平台的原始 VOC 文件归一化为 _merged.json、comments-flat.jsonl 和 normalizer-audit.json,供报告生成链路复用。",
+  "category": "voc",
+  "version": "1.0.0",
+  "type": "local-script",
+  "execution": {
+    "kind": "command",
+    "command": "node",
+    "args": [
+      "scripts/tools/openclaw-tool-runner.js",
+      "--tool",
+      "voc-data-normalizer.js",
+      "--result-prefix",
+      "NORMALIZER_RESULT",
+      "--",
+      "--input",
+      "{{input}}",
+      "--output",
+      "{{output}}",
+      "--project",
+      "{{project}}",
+      "--category",
+      "{{category}}"
+    ],
+    "cwd": "{{workspaceRoot}}",
+    "outputParser": {
+      "type": "stdout-prefix-json",
+      "prefix": "NORMALIZER_RESULT=",
+      "description": "解析 stdout 中以 NORMALIZER_RESULT= 开头的最后一行,去掉前缀后即为归一化结果 JSON。"
+    },
+    "exitCodes": {
+      "0": "ok",
+      "1": "error"
+    }
+  },
+  "parameters": {
+    "type": "object",
+    "required": [
+      "input",
+      "output"
+    ],
+    "properties": {
+      "input": {
+        "type": "string",
+        "description": "原始平台数据目录,目录内可包含 json/jsonl 文件。"
+      },
+      "output": {
+        "type": "string",
+        "description": "归一化输出目录。"
+      },
+      "project": {
+        "type": "string",
+        "default": "openclaw-voc-course",
+        "description": "项目名称,写入 _merged.json.metadata.project。"
+      },
+      "category": {
+        "type": "string",
+        "default": "",
+        "description": "品类、产品或品牌方向。"
+      }
+    }
+  },
+  "output": {
+    "type": "object",
+    "properties": {
+      "outputDir": {
+        "type": "string"
+      },
+      "files": {
+        "type": "array",
+        "items": {
+          "type": "string"
+        }
+      },
+      "itemCount": {
+        "type": "integer"
+      },
+      "validVocCount": {
+        "type": "integer"
+      },
+      "duplicateItemCount": {
+        "type": "integer"
+      },
+      "duplicateVocCount": {
+        "type": "integer"
+      },
+      "errors": {
+        "type": "integer"
+      }
+    }
+  },
+  "deployment": {
+    "skillInstallDir": "~/.openclaw/skills/voc-data-normalizer",
+    "toolInstallPaths": [
+      "~/.openclaw/tools/voc-data-normalizer.js",
+      "~/.openclaw/workspace/scripts/tools/voc-data-normalizer.js",
+      "~/.openclaw/workspace/scripts/tools/openclaw-tool-runner.js"
+    ]
+  },
+  "relatedFiles": {
+    "executor": "scripts/tools/voc-data-normalizer.js",
+    "runner": "scripts/tools/openclaw-tool-runner.js",
+    "courseUsage": "docs/voc-skills-course-plan/07-openclaw-single-platform-course.md"
+  }
+}

+ 67 - 0
voc/voc-html-report-generator/SKILL.md

@@ -0,0 +1,67 @@
+---
+name: voc-html-report-generator
+description: 将 report-data.json、platform-mini-report.json 或 chapter-insights.json 渲染为 HTML v2 VOC 洞察报告
+version: 1.0.0
+author: nkkj-BrainHack
+---
+
+# VOC HTML v2 报告生成器
+
+## 技能名称
+
+`voc-html-report-generator`
+
+## 技能目的
+
+把结构化 VOC 报告数据渲染成可直接在浏览器打开的 HTML v2 报告,适用于课程演示、轻量交付和报告工厂验证。
+
+## 输入参数
+
+| 参数 | 类型 | 必填 | 默认值 | 说明 |
+|---|---|---|---|---|
+| data | string | 是 |  | `report-data.json`、`platform-mini-report.json` 或 `chapter-insights.json` |
+| output | string | 是 |  | HTML 输出文件路径 |
+
+## 输出结果
+
+| 字段 | 说明 |
+|---|---|
+| output | HTML 文件路径 |
+| bytes | HTML 文件字节数 |
+| title | 报告标题 |
+
+## 执行方式
+
+这是本地脚本型 Skill。安装后 OpenClaw 应能在以下位置识别:
+
+| 组件 | 用户设备路径 |
+|---|---|
+| Skill | `~/.openclaw/skills/voc-html-report-generator/` |
+| 生成脚本 | `~/.openclaw/tools/voc-report-factory/html-v2/gen-report-template.js` |
+| 渲染模板 | `~/.openclaw/tools/voc-report-factory/html-v2/report-renderer-template.js` |
+| workspace 兼容路径 | `~/.openclaw/workspace/scripts/tools/voc-report-factory/html-v2/` |
+
+## 调用示例
+
+```json
+{
+  "data": "demo/xiaohongshu/platform-mini-report/platform-mini-report.json",
+  "output": "demo/xiaohongshu/platform-mini-report/platform-mini-report.html"
+}
+```
+
+## 可接受输入
+
+- 原生 HTML v2 `report-data.json`
+- `voc-platform-mini-report-generator` 输出的 `platform-mini-report.json`
+- `voc-chapter-insight-writer` 输出的 `chapter-insights.json`
+
+## 下游衔接
+
+- `voc-report-auditor` 可继续检查 HTML 或 Markdown 报告质量。
+- `voc-single-platform-report` 会在 `outputFormat=html|both` 时调用本能力。
+
+## 质量边界
+
+- 本 Skill 只负责渲染,不负责采集和数据真实性判断。
+- 如果输入 JSON 缺字段,会由 HTML v2 适配层尽量补齐,但客户交付前仍需审计。

+ 81 - 0
voc/voc-html-report-generator/api-config.json

@@ -0,0 +1,81 @@
+{
+  "name": "voc-html-report-generator",
+  "displayName": "VOC HTML v2 报告生成器",
+  "description": "读取 report-data.json、platform-mini-report.json 或 chapter-insights.json,生成可直接浏览器打开的 HTML v2 VOC 洞察报告。",
+  "category": "voc",
+  "version": "1.0.0",
+  "type": "local-script",
+  "execution": {
+    "kind": "command",
+    "command": "node",
+    "args": [
+      "scripts/tools/openclaw-tool-runner.js",
+      "--tool",
+      "voc-report-factory/html-v2/gen-report-template.js",
+      "--result-prefix",
+      "HTML_REPORT_RESULT",
+      "--",
+      "--data",
+      "{{data}}",
+      "--output",
+      "{{output}}"
+    ],
+    "cwd": "{{workspaceRoot}}",
+    "outputParser": {
+      "type": "stdout-prefix-json",
+      "prefix": "HTML_REPORT_RESULT=",
+      "description": "解析 stdout 中以 HTML_REPORT_RESULT= 开头的最后一行。"
+    },
+    "exitCodes": {
+      "0": "ok",
+      "1": "error"
+    }
+  },
+  "parameters": {
+    "type": "object",
+    "required": [
+      "data",
+      "output"
+    ],
+    "properties": {
+      "data": {
+        "type": "string",
+        "description": "输入 JSON 文件,可为 report-data.json、platform-mini-report.json 或 chapter-insights.json。"
+      },
+      "output": {
+        "type": "string",
+        "description": "HTML 输出文件路径。"
+      }
+    }
+  },
+  "output": {
+    "type": "object",
+    "properties": {
+      "output": {
+        "type": "string"
+      },
+      "bytes": {
+        "type": "integer"
+      },
+      "title": {
+        "type": "string"
+      }
+    }
+  },
+  "deployment": {
+    "skillInstallDir": "~/.openclaw/skills/voc-html-report-generator",
+    "toolInstallPaths": [
+      "~/.openclaw/tools/voc-report-factory/html-v2/gen-report-template.js",
+      "~/.openclaw/tools/voc-report-factory/html-v2/report-renderer-template.js",
+      "~/.openclaw/workspace/scripts/tools/voc-report-factory/html-v2/gen-report-template.js",
+      "~/.openclaw/workspace/scripts/tools/voc-report-factory/html-v2/report-renderer-template.js",
+      "~/.openclaw/workspace/scripts/tools/openclaw-tool-runner.js"
+    ]
+  },
+  "relatedFiles": {
+    "executor": "voc-report-factory/html-v2/gen-report-template.js",
+    "renderer": "voc-report-factory/html-v2/report-renderer-template.js",
+    "runner": "scripts/tools/openclaw-tool-runner.js",
+    "courseUsage": "docs/voc-skills-course-plan/07-openclaw-single-platform-course.md"
+  }
+}

+ 78 - 0
voc/voc-platform-mini-report-generator/SKILL.md

@@ -0,0 +1,78 @@
+---
+name: voc-platform-mini-report-generator
+description: 基于归一化 VOC 数据生成单平台 platform-mini-report.md 和 platform-mini-report.json
+version: 1.0.0
+author: nkkj-BrainHack
+---
+
+# VOC 单平台 mini report 生成器
+
+## 技能名称
+
+`voc-platform-mini-report-generator`
+
+## 技能目的
+
+读取 `_merged.json` 或 `comments-flat.jsonl`,生成 2 小时课程和轻量交付可用的单平台 VOC mini report。
+
+## 输入参数
+
+| 参数 | 类型 | 必填 | 默认值 | 说明 |
+|---|---|---|---|---|
+| input | string | 是 |  | 归一化目录、`_merged.json` 或 `comments-flat.jsonl` |
+| output | string | 是 |  | 报告输出目录 |
+| platform | string | 是 |  | `xiaohongshu` / `douyin` / `amazon` / `tiktok` / `instagram` |
+| project | string | 否 | openclaw-voc-course | 项目名称 |
+| category | string | 否 |  | 品类、产品或品牌方向 |
+| owner | string | 否 | OpenClaw VOC Skills | 报告负责人 |
+| date | string | 否 |  | 报告日期 |
+
+## 输出文件
+
+| 文件 | 说明 |
+|---|---|
+| `platform-mini-report.md` | 可直接阅读和交付的 Markdown 报告 |
+| `platform-mini-report.json` | 结构化报告数据,可继续生成 HTML v2 |
+
+## 执行方式
+
+这是本地脚本型 Skill。安装后 OpenClaw 应能在以下位置识别:
+
+| 组件 | 用户设备路径 |
+|---|---|
+| Skill | `~/.openclaw/skills/voc-platform-mini-report-generator/` |
+| 执行脚本 | `~/.openclaw/tools/platform-mini-report-generator.js` |
+| workspace 兼容路径 | `~/.openclaw/workspace/scripts/tools/platform-mini-report-generator.js` |
+
+## 调用示例
+
+```json
+{
+  "input": "demo/xiaohongshu/normalized",
+  "output": "demo/xiaohongshu/platform-mini-report",
+  "platform": "xiaohongshu",
+  "project": "openclaw-voc-course-demo",
+  "category": "冻干益生菌",
+  "owner": "VOC Skills 课程 demo",
+  "date": "2026-04-30"
+}
+```
+
+## 报告结构
+
+- 一句话结论
+- 数据概况
+- H1-H8 假设覆盖
+- 高频主题
+- VOC 证据卡
+- 产品/内容机会
+- 平台内容建议
+- 风险与边界
+- 结课行动清单
+- 生成审计
+
+## 质量边界
+
+- 该 Skill 不做远程采集,只处理已归一化数据。
+- 报告结论必须受样本量、关键词和平台窗口限制。
+- 医疗、功效、安全等内容只能作为用户声音引用,不能写成未经验证的确定性结论。

+ 130 - 0
voc/voc-platform-mini-report-generator/api-config.json

@@ -0,0 +1,130 @@
+{
+  "name": "voc-platform-mini-report-generator",
+  "displayName": "VOC 单平台 mini report 生成器",
+  "description": "读取归一化 VOC 数据,生成单平台平台报告 platform-mini-report.md 和 platform-mini-report.json,覆盖样本概况、H1-H8、证据卡、机会点、风险边界和行动清单。",
+  "category": "voc",
+  "version": "1.0.0",
+  "type": "local-script",
+  "execution": {
+    "kind": "command",
+    "command": "node",
+    "args": [
+      "scripts/tools/openclaw-tool-runner.js",
+      "--tool",
+      "platform-mini-report-generator.js",
+      "--result-prefix",
+      "PLATFORM_MINI_REPORT_RESULT",
+      "--",
+      "--input",
+      "{{input}}",
+      "--output",
+      "{{output}}",
+      "--project",
+      "{{project}}",
+      "--category",
+      "{{category}}",
+      "--platform",
+      "{{platform}}",
+      "--owner",
+      "{{owner}}",
+      "--date",
+      "{{date}}"
+    ],
+    "cwd": "{{workspaceRoot}}",
+    "outputParser": {
+      "type": "stdout-prefix-json",
+      "prefix": "PLATFORM_MINI_REPORT_RESULT=",
+      "description": "解析 stdout 中以 PLATFORM_MINI_REPORT_RESULT= 开头的最后一行。"
+    },
+    "exitCodes": {
+      "0": "ok",
+      "1": "error"
+    }
+  },
+  "parameters": {
+    "type": "object",
+    "required": [
+      "input",
+      "output",
+      "platform"
+    ],
+    "properties": {
+      "input": {
+        "type": "string",
+        "description": "归一化目录、_merged.json 或 comments-flat.jsonl。"
+      },
+      "output": {
+        "type": "string",
+        "description": "报告输出目录。"
+      },
+      "project": {
+        "type": "string",
+        "default": "openclaw-voc-course"
+      },
+      "category": {
+        "type": "string",
+        "default": ""
+      },
+      "platform": {
+        "type": "string",
+        "enum": [
+          "xiaohongshu",
+          "douyin",
+          "amazon",
+          "tiktok",
+          "instagram"
+        ]
+      },
+      "owner": {
+        "type": "string",
+        "default": "OpenClaw VOC Skills"
+      },
+      "date": {
+        "type": "string",
+        "description": "报告日期,格式 YYYY-MM-DD。"
+      }
+    }
+  },
+  "output": {
+    "type": "object",
+    "properties": {
+      "outputDir": {
+        "type": "string"
+      },
+      "files": {
+        "type": "array",
+        "items": {
+          "type": "string"
+        }
+      },
+      "platform": {
+        "type": "string"
+      },
+      "commentCount": {
+        "type": "integer"
+      },
+      "evidenceCards": {
+        "type": "integer"
+      },
+      "warnings": {
+        "type": "integer"
+      },
+      "uncoveredHypothesisCount": {
+        "type": "integer"
+      }
+    }
+  },
+  "deployment": {
+    "skillInstallDir": "~/.openclaw/skills/voc-platform-mini-report-generator",
+    "toolInstallPaths": [
+      "~/.openclaw/tools/platform-mini-report-generator.js",
+      "~/.openclaw/workspace/scripts/tools/platform-mini-report-generator.js",
+      "~/.openclaw/workspace/scripts/tools/openclaw-tool-runner.js"
+    ]
+  },
+  "relatedFiles": {
+    "executor": "scripts/tools/platform-mini-report-generator.js",
+    "runner": "scripts/tools/openclaw-tool-runner.js",
+    "courseUsage": "docs/voc-skills-course-plan/07-openclaw-single-platform-course.md"
+  }
+}

+ 70 - 0
voc/voc-report-auditor/SKILL.md

@@ -0,0 +1,70 @@
+---
+name: voc-report-auditor
+description: 对 VOC 报告做交付前质量审计,检查占位文本、样本量、H1-H8 覆盖、证据可追溯、风险边界和行动建议
+version: 1.0.0
+author: nkkj-BrainHack
+---
+
+# VOC 报告质量审计
+
+## 技能名称
+
+`voc-report-auditor`
+
+## 技能目的
+
+对 Markdown 或 HTML VOC 报告做交付前质量审计,帮助 OpenClaw 用户判断报告是否可以进入课堂展示、内部讨论或客户交付前人工复核。
+
+## 输入参数
+
+| 参数 | 类型 | 必填 | 默认值 | 说明 |
+|---|---|---|---|---|
+| report | string | 是 |  | 待审计报告文件,可为 Markdown 或 HTML |
+| merged | string | 是 |  | 归一化数据 `_merged.json` |
+| comments | string | 是 |  | 归一化 VOC 原声 `comments-flat.jsonl` |
+| output | string | 否 | report 所在目录 | 审计输出目录 |
+
+## 输出文件
+
+| 文件 | 说明 |
+|---|---|
+| `audit-result.json` | 结构化审计结果 |
+| `audit-report.md` | 可读审计报告 |
+
+## 执行方式
+
+这是本地脚本型 Skill。安装后 OpenClaw 应能在以下位置识别:
+
+| 组件 | 用户设备路径 |
+|---|---|
+| Skill | `~/.openclaw/skills/voc-report-auditor/` |
+| 执行脚本 | `~/.openclaw/tools/voc-report-auditor.js` |
+| workspace 兼容路径 | `~/.openclaw/workspace/scripts/tools/voc-report-auditor.js` |
+
+## 调用示例
+
+```json
+{
+  "report": "demo/xiaohongshu/platform-mini-report/platform-mini-report.md",
+  "merged": "demo/xiaohongshu/normalized/_merged.json",
+  "comments": "demo/xiaohongshu/normalized/comments-flat.jsonl",
+  "output": "demo/xiaohongshu/audit"
+}
+```
+
+## 审计项
+
+- 占位文本和模板残留
+- 报告结构完整性
+- 样本量一致性
+- H1-H8 覆盖情况
+- VOC 证据可追溯性
+- 平台、关键词和批次分布
+- 行动建议是否足够具体
+- 风险边界是否明确
+
+## 质量边界
+
+- 审计结果用于发现明显问题,不替代人工判断。
+- `warn` 不一定阻断交付,但必须人工复核。
+- `fail` 表示存在结构、证据或合规边界风险,建议先修复再交付。

+ 105 - 0
voc/voc-report-auditor/api-config.json

@@ -0,0 +1,105 @@
+{
+  "name": "voc-report-auditor",
+  "displayName": "VOC 报告质量审计",
+  "description": "对 Markdown 或 HTML VOC 报告做交付前审计,检查占位文本、样本量、H1-H8 覆盖、证据可追溯、风险边界和行动建议。",
+  "category": "voc",
+  "version": "1.0.0",
+  "type": "local-script",
+  "execution": {
+    "kind": "command",
+    "command": "node",
+    "args": [
+      "scripts/tools/openclaw-tool-runner.js",
+      "--tool",
+      "voc-report-auditor.js",
+      "--result-prefix",
+      "VOC_REPORT_AUDIT_RESULT",
+      "--",
+      "--report",
+      "{{report}}",
+      "--merged",
+      "{{merged}}",
+      "--comments",
+      "{{comments}}",
+      "--output",
+      "{{output}}"
+    ],
+    "cwd": "{{workspaceRoot}}",
+    "outputParser": {
+      "type": "stdout-prefix-json",
+      "prefix": "VOC_REPORT_AUDIT_RESULT=",
+      "description": "解析 stdout 中以 VOC_REPORT_AUDIT_RESULT= 开头的最后一行。"
+    },
+    "exitCodes": {
+      "0": "pass | warn | fail",
+      "1": "error"
+    }
+  },
+  "parameters": {
+    "type": "object",
+    "required": [
+      "report",
+      "merged",
+      "comments"
+    ],
+    "properties": {
+      "report": {
+        "type": "string",
+        "description": "待审计报告文件,可为 Markdown 或 HTML。"
+      },
+      "merged": {
+        "type": "string",
+        "description": "归一化输出 _merged.json。"
+      },
+      "comments": {
+        "type": "string",
+        "description": "归一化输出 comments-flat.jsonl。"
+      },
+      "output": {
+        "type": "string",
+        "description": "审计输出目录,默认同 report 所在目录。"
+      }
+    }
+  },
+  "output": {
+    "type": "object",
+    "properties": {
+      "status": {
+        "type": "string",
+        "enum": [
+          "pass",
+          "warn",
+          "fail"
+        ]
+      },
+      "fail": {
+        "type": "integer"
+      },
+      "warn": {
+        "type": "integer"
+      },
+      "outputDir": {
+        "type": "string"
+      },
+      "files": {
+        "type": "array",
+        "items": {
+          "type": "string"
+        }
+      }
+    }
+  },
+  "deployment": {
+    "skillInstallDir": "~/.openclaw/skills/voc-report-auditor",
+    "toolInstallPaths": [
+      "~/.openclaw/tools/voc-report-auditor.js",
+      "~/.openclaw/workspace/scripts/tools/voc-report-auditor.js",
+      "~/.openclaw/workspace/scripts/tools/openclaw-tool-runner.js"
+    ]
+  },
+  "relatedFiles": {
+    "executor": "scripts/tools/voc-report-auditor.js",
+    "runner": "scripts/tools/openclaw-tool-runner.js",
+    "courseUsage": "docs/voc-skills-course-plan/07-openclaw-single-platform-course.md"
+  }
+}

+ 144 - 0
voc/voc-single-platform-report/SKILL.md

@@ -0,0 +1,144 @@
+---
+name: voc-single-platform-report
+description: 面向 OpenClaw 用户的单平台 VOC 洞察报告总入口,按平台、品类、关键词和业务问题编排采集、归一化、mini report、HTML 报告与质量审计
+version: 0.1.0
+author: nkkj-BrainHack
+---
+
+# VOC 单平台洞察报告总入口
+
+## 技能名称
+
+`voc-single-platform-report`
+
+## 技能目的
+
+这是面向 OpenClaw 用户和 2 小时单平台 VOC 课程的主入口 Skill。用户不需要理解本地脚本,也不需要手动串联采集、归一化、报告生成和审计。用户只需要提供平台、品类、关键词和业务问题,OpenClaw 就应该引导完成一次单平台 VOC 洞察报告。
+
+## 适用课程
+
+- 小红书单平台 VOC 洞察课
+- 抖音内容/VOC 洞察课
+- Amazon 评论 VOC 入门课
+- TikTok / Instagram 海外社媒趋势课
+- VOC Skills 入门公开课后的实操转化课
+
+## 输入参数
+
+| 参数 | 类型 | 必填 | 默认值 | 说明 |
+|---|---|---|---|---|
+| project | string | 否 | openclaw-voc-course | 项目名称 |
+| platform | string | 是 |  | `xiaohongshu` / `douyin` / `amazon` / `tiktok` / `instagram` |
+| category | string | 是 |  | 品类、产品或品牌方向 |
+| businessQuestion | string | 否 |  | 本次报告要回答的业务问题 |
+| keywords | string[] | 是 |  | 3-5 个关键词起步 |
+| sampleMode | boolean | 否 | false | 是否使用课程样例数据,适合录课和 API 不稳定时使用 |
+| outputFormat | string | 否 | both | `markdown` / `html` / `both` |
+| depth | string | 否 | light | `light` / `standard`,2 小时课默认 light |
+| owner | string | 否 | OpenClaw VOC Skills | 报告负责人或课程班级 |
+| date | string | 否 | 当前日期 | 报告日期 |
+
+## 推荐课程调用示例
+
+```json
+{
+  "project": "openclaw-voc-course-demo",
+  "platform": "xiaohongshu",
+  "category": "冻干益生菌",
+  "businessQuestion": "用户为什么会关注冻干益生菌,当前内容和产品机会在哪里?",
+  "keywords": [
+    "儿童益生菌怎么选",
+    "益生菌腹胀便秘",
+    "冻干益生菌测评"
+  ],
+  "sampleMode": true,
+  "outputFormat": "both",
+  "depth": "light",
+  "owner": "VOC Skills 课程 demo"
+}
+```
+
+## 执行流程
+
+1. 检查平台、关键词和输出格式是否合法。
+2. 如果 `sampleMode=true`,优先使用课程样例数据跑完整链路。
+3. 如果 `sampleMode=false`,按平台调用对应采集或编排 Skill。
+4. 将平台输出归一化为标准 VOC 数据结构。
+5. 基于标准 VOC 数据生成单平台 mini report。
+6. 根据 `outputFormat` 生成 Markdown 和/或 HTML v2 报告。
+7. 对报告做质量审计,检查样本量、证据卡、占位文本、H1-H8 覆盖和风险边界。
+8. 返回报告文件、核心摘要、证据卡数量、警告数量和下一步建议。
+
+## 调用的下游 Skill / 能力
+
+### 平台采集层
+
+| 平台 | 下游能力 |
+|---|---|
+| xiaohongshu | `xiaohongshu/xiaohongshu-mini-voc` |
+| douyin | `douyin/douyin-mini-voc` |
+| amazon | `voc/product-reviews-query` |
+| tiktok | `social-voc/tiktok-category-voc` |
+| instagram | `social-voc/instagram-brand-voc` |
+
+### 报告处理层
+
+| 能力 | 当前底层实现 | 目标 Skill 化名称 |
+|---|---|---|
+| 数据归一化 | `scripts/tools/voc-data-normalizer.js` | `voc-data-normalizer` |
+| 单平台报告 | `scripts/tools/platform-mini-report-generator.js` | `voc-platform-mini-report-generator` |
+| HTML v2 渲染 | `voc-report-factory/html-v2/gen-report-template.js` | `voc-html-report-generator` |
+| 报告审计 | `scripts/tools/voc-report-auditor.js` | `voc-report-auditor` |
+
+## 返回格式
+
+```json
+{
+  "metadata": {
+    "project": "openclaw-voc-course-demo",
+    "platform": "xiaohongshu",
+    "category": "冻干益生菌",
+    "generatedAt": "2026-04-30T00:00:00.000Z"
+  },
+  "summary": {
+    "itemCount": 30,
+    "commentCount": 105,
+    "keywordCount": 3,
+    "evidenceCardCount": 6,
+    "warningCount": 0,
+    "evidenceStrength": "高"
+  },
+  "outputs": {
+    "markdownReport": "platform-mini-report.md",
+    "jsonReport": "platform-mini-report.json",
+    "htmlReport": "platform-mini-report.html",
+    "auditReport": "audit-report.md"
+  },
+  "nextActions": [
+    "补充竞品关键词",
+    "复核高赞负面评论",
+    "把 P0 机会点转成内容 AB 测试"
+  ]
+}
+```
+
+## 质量边界
+
+- 单平台报告只能代表当前平台、关键词和采集窗口,不代表全市场。
+- 样本量不足时只能写阶段性信号,不能写确定性结论。
+- 医疗、功效、症状、安全等表达只能作为用户声音,不能直接写成未经验证的功效结论。
+- 自动生成报告是课程初稿,客户交付前必须人工复核和补充审计。
+
+## 课程讲师提示
+
+录课时应把本 Skill 作为主入口讲解:
+
+```text
+输入品类和关键词 → 调用 voc-single-platform-report → 生成 VOC 洞察报告
+```
+
+不要把课堂主线讲成本地命令行脚本。脚本只作为底层能力和开发者验证链路存在。
+
+## 当前实现状态
+
+当前版本是 OpenClaw 课程总入口的编排规范。底层能力已在仓库中存在,但归一化、mini report、HTML 生成和审计仍需进一步包装成正式 OpenClaw Skill,才能实现完全无脚本的用户体验。

+ 257 - 0
voc/voc-single-platform-report/api-config.json

@@ -0,0 +1,257 @@
+{
+  "name": "voc-single-platform-report",
+  "displayName": "VOC 单平台洞察报告总入口",
+  "description": "面向 OpenClaw 用户的单平台 VOC 报告编排入口:输入平台、品类、关键词和业务问题,串联采集、归一化、mini report、HTML 报告和质量审计,输出课程和轻量交付可用的 VOC 洞察报告。",
+  "category": "voc",
+  "version": "0.1.0",
+  "type": "local-script",
+  "execution": {
+    "kind": "command",
+    "command": "node",
+    "args": [
+      "scripts/tools/openclaw-tool-runner.js",
+      "--tool",
+      "voc-single-platform-report.js",
+      "--result-prefix",
+      "SINGLE_PLATFORM_REPORT_RESULT",
+      "--",
+      "--platform",
+      "{{platform}}",
+      "--category",
+      "{{category}}",
+      "--project",
+      "{{project}}",
+      "--business-question",
+      "{{businessQuestion}}",
+      "--keywords",
+      "{{keywords}}",
+      "--sample-mode",
+      "{{sampleMode}}",
+      "--output-format",
+      "{{outputFormat}}",
+      "--output",
+      "{{output}}",
+      "--raw-dir",
+      "{{rawDir}}",
+      "--normalized-dir",
+      "{{normalizedDir}}",
+      "--owner",
+      "{{owner}}",
+      "--date",
+      "{{date}}"
+    ],
+    "cwd": "{{workspaceRoot}}",
+    "outputParser": {
+      "type": "stdout-prefix-json",
+      "prefix": "SINGLE_PLATFORM_REPORT_RESULT=",
+      "description": "解析 stdout 中以 SINGLE_PLATFORM_REPORT_RESULT= 开头的最后一行。"
+    },
+    "exitCodes": {
+      "0": "ok | needs_review",
+      "1": "error"
+    }
+  },
+  "parameters": {
+    "project": {
+      "type": "string",
+      "required": false,
+      "default": "openclaw-voc-course",
+      "description": "项目名称,用于报告 metadata.project"
+    },
+    "platform": {
+      "type": "string",
+      "required": true,
+      "enum": [
+        "xiaohongshu",
+        "douyin",
+        "amazon",
+        "tiktok",
+        "instagram"
+      ],
+      "description": "单平台 VOC 分析平台"
+    },
+    "category": {
+      "type": "string",
+      "required": true,
+      "description": "品类、产品或品牌方向"
+    },
+    "businessQuestion": {
+      "type": "string",
+      "required": false,
+      "description": "本次报告要回答的核心业务问题"
+    },
+    "keywords": {
+      "type": "array",
+      "items": {
+        "type": "string"
+      },
+      "required": true,
+      "description": "3-5 个关键词起步,可包含痛点词、场景词、决策词、竞品词"
+    },
+    "rawDir": {
+      "type": "string",
+      "required": false,
+      "description": "本地原始平台数据目录。sampleMode=false 且没有 normalizedDir 时必须提供;本地执行器不直接发起远程采集。"
+    },
+    "normalizedDir": {
+      "type": "string",
+      "required": false,
+      "description": "已有归一化数据目录,目录内需包含 _merged.json 和 comments-flat.jsonl。"
+    },
+    "output": {
+      "type": "string",
+      "required": false,
+      "description": "报告输出根目录;不填时输出到 workspaceRoot/openclaw-voc-output/。"
+    },
+    "sampleMode": {
+      "type": "boolean",
+      "required": false,
+      "default": false,
+      "description": "是否使用课程样例数据,适合录课和 API 不稳定时使用"
+    },
+    "outputFormat": {
+      "type": "string",
+      "required": false,
+      "default": "both",
+      "enum": [
+        "markdown",
+        "html",
+        "both"
+      ],
+      "description": "报告输出格式"
+    },
+    "depth": {
+      "type": "string",
+      "required": false,
+      "default": "light",
+      "enum": [
+        "light",
+        "standard"
+      ],
+      "description": "报告深度,2 小时课程默认 light"
+    },
+    "owner": {
+      "type": "string",
+      "required": false,
+      "default": "OpenClaw VOC Skills",
+      "description": "报告负责人或课程班级"
+    },
+    "date": {
+      "type": "string",
+      "required": false,
+      "description": "报告日期,格式 YYYY-MM-DD"
+    }
+  },
+  "pipeline": [
+    {
+      "step": 0,
+      "name": "课程输入校验与 Token 预检",
+      "type": "guardrail",
+      "logic": "校验 platform、category、keywords、outputFormat;真实采集模式下执行对应平台 token 或数据服务可用性预检;sampleMode=true 时可跳过真实 API。",
+      "output": "preflightResult"
+    },
+    {
+      "step": 1,
+      "name": "选择数据来源",
+      "type": "router",
+      "logic": "sampleMode=true 时读取课程样例数据;sampleMode=false 时按 platform 路由到对应平台采集编排 Skill。",
+      "routes": {
+        "xiaohongshu": "xiaohongshu/xiaohongshu-mini-voc",
+        "douyin": "douyin/douyin-mini-voc",
+        "amazon": "voc/product-reviews-query",
+        "tiktok": "social-voc/tiktok-category-voc",
+        "instagram": "social-voc/instagram-brand-voc"
+      },
+      "output": "rawPlatformVocDataset"
+    },
+    {
+      "step": 2,
+      "name": "归一化 VOC 数据",
+      "type": "compute",
+      "logic": "将平台输出统一为 items、comments、sources、metadata,保留 platform、keyword、batch、hypothesisTags、author、text/content、likeCount、url、raw 等字段。当前底层实现为 scripts/tools/voc-data-normalizer.js,目标 Skill 名称为 voc-data-normalizer。",
+      "output": "normalizedVocDataset"
+    },
+    {
+      "step": 3,
+      "name": "生成单平台 mini report",
+      "type": "compute",
+      "logic": "基于 normalized VOC 生成 platform-mini-report.md/json,包含一句话结论、数据概况、H1-H8 覆盖、高频主题、VOC 证据卡、机会点、风险边界和行动清单。当前底层实现为 scripts/tools/platform-mini-report-generator.js。",
+      "output": "platformMiniReport"
+    },
+    {
+      "step": 4,
+      "name": "生成 HTML v2 报告",
+      "type": "compute",
+      "condition": "outputFormat === 'html' || outputFormat === 'both'",
+      "logic": "将 platform-mini-report.json 转换为 HTML v2 报告。当前底层实现为 voc-report-factory/html-v2/gen-report-template.js。",
+      "output": "htmlReport"
+    },
+    {
+      "step": 5,
+      "name": "质量审计",
+      "type": "compute",
+      "logic": "检查 placeholder、样本量、H1-H8 覆盖、证据可追溯、风险边界、行动建议和 HTML 完整性。当前底层实现为 scripts/tools/voc-report-auditor.js。",
+      "output": "auditResult"
+    },
+    {
+      "step": 6,
+      "name": "返回报告与下一步建议",
+      "type": "response",
+      "logic": "汇总报告文件、样本量、证据卡数量、警告数量和下一步建议,提示用户如何换成自己的品类复跑。",
+      "output": "singlePlatformReportResult"
+    }
+  ],
+  "response": {
+    "type": "object",
+    "properties": {
+      "metadata": {
+        "type": "object",
+        "description": "项目、平台、品类、业务问题、生成时间"
+      },
+      "summary": {
+        "type": "object",
+        "description": "内容数、VOC 数、关键词数、证据卡数、警告数、证据强度"
+      },
+      "outputs": {
+        "type": "object",
+        "description": "Markdown、JSON、HTML 和审计报告输出位置"
+      },
+      "evidenceCards": {
+        "type": "array",
+        "description": "关键 VOC 原声证据卡"
+      },
+      "nextActions": {
+        "type": "array",
+        "description": "课后复跑和业务落地建议"
+      },
+      "audit": {
+        "type": "object",
+        "description": "质量审计结果"
+      }
+    }
+  },
+  "courseMapping": {
+    "lesson": "2 小时 OpenClaw 单平台 VOC 洞察课",
+    "teacherManual": "docs/voc-skills-course-plan/07-openclaw-single-platform-course.md",
+    "skillMap": "docs/voc-skills-course-plan/openclaw-voc-skill-map.md",
+    "demoReport": "demo/xiaohongshu/platform-mini-report/platform-mini-report.html"
+  },
+  "qualityBoundaries": [
+    "单平台报告只代表当前平台、关键词和采集窗口,不代表全市场。",
+    "样本量不足时只能写阶段性信号,不能写确定性结论。",
+    "医疗、功效、症状、安全等表达只能作为用户声音,不能直接写成未经验证的功效结论。",
+    "自动生成报告是课程初稿,客户交付前必须人工复核和补充审计。"
+  ],
+  "deployment": {
+    "skillInstallDir": "~/.openclaw/skills/voc-single-platform-report",
+    "toolInstallPaths": [
+      "~/.openclaw/tools/voc-single-platform-report.js",
+      "~/.openclaw/tools/voc-data-normalizer.js",
+      "~/.openclaw/tools/platform-mini-report-generator.js",
+      "~/.openclaw/tools/voc-report-auditor.js",
+      "~/.openclaw/tools/voc-report-factory/html-v2/gen-report-template.js",
+      "~/.openclaw/workspace/scripts/tools/openclaw-tool-runner.js"
+    ]
+  },
+  "notes": "本 Skill 是 OpenClaw 用户课程总入口的可执行本地脚本型 Skill。打包安装后,OpenClaw 通过 ~/.openclaw/skills/voc-single-platform-report 识别 Skill,并通过 ~/.openclaw/workspace/scripts/tools 与 ~/.openclaw/tools 定位底层工具脚本。"
+}

+ 143 - 0
xiaohongshu/xiaohongshu-mini-voc/SKILL.md

@@ -0,0 +1,143 @@
+---
+name: xiaohongshu-mini-voc
+description: 按关键词搜索小红书笔记,批量采集笔记详情与评论,生成 2 小时课和轻量 VOC 报告可用的数据包
+version: 0.1.0
+author: nkkj-BrainHack
+---
+
+# 小红书 Mini VOC 编排采集
+
+## 技能名称
+
+`xiaohongshu-mini-voc`
+
+## 技能目的
+
+把 2 小时 VOC 课程中最常用的小红书采集链路编排成一个入口:关键词搜索笔记、筛选高价值笔记、获取笔记详情、抓取评论,并输出可继续进入 `voc-data-normalizer`、`voc-report-auditor` 和 mini report 的数据包。
+
+## 输入参数
+
+| 参数 | 类型 | 必填 | 默认值 | 说明 |
+|---|---|---|---|---|
+| project | string | 否 |  | 项目名称,用于输出 metadata |
+| category | string | 否 |  | 品类或产品方向,如 冻干益生菌、护肝片、猴菇饮 |
+| keywords | string[] | 是 |  | 小红书搜索关键词列表 |
+| notesPerKeyword | integer | 否 | 10 | 每个关键词保留的笔记数量 |
+| maxCommentPages | integer | 否 | 2 | 每篇笔记最多抓取评论页数 |
+| sort | string | 否 | general | `general` / `time_descending` / `popularity_descending` |
+| note_type | string | 否 | `_0` | `_0` 不限 / `_1` 视频 / `_2` 图文 |
+| batch | string | 否 | P0 | 采集批次,如 P0/P1/P2 |
+| hypothesisTags | string[] | 否 |  | 默认 H1-H8 标签 |
+| keywordMatrix | object[] | 否 |  | 可选采集矩阵行,支持 keyword、batch、targetCount、hypothesisTags、purpose、expectedSignal、risk |
+| includeUserInfo | boolean | 否 | false | 是否额外调用用户详情 skill |
+
+## 执行流程
+
+1. 对 `keywords` 或 `keywordMatrix[].keyword` 调用 `xiaohongshu-search-notes`。
+2. 按评论数、点赞数、收藏数综合排序,保留每个关键词 Top `notesPerKeyword`。
+3. 对入选笔记调用 `xiaohongshu-note-detail` 获取完整正文、图片、话题和互动数据。
+4. 对入选笔记调用 `xiaohongshu-note-comments` 抓取评论,最多翻页 `maxCommentPages`。
+5. 如 `includeUserInfo=true`,对作者去重后调用 `xiaohongshu-user-info` 获取 KOL/KOC 画像。
+6. 汇总为 mini VOC 数据包,保留 platform、keyword、batch、hypothesisTags、noteId、commentId、author、content、likeCount、publishTime、url、raw 等字段。
+
+## 调用的底层 Skill
+
+- `xiaohongshu-search-notes` — 按关键词搜索笔记
+- `xiaohongshu-note-detail` — 获取笔记完整详情
+- `xiaohongshu-note-comments` — 获取笔记评论
+- `xiaohongshu-user-info` — 可选获取作者画像
+
+## 推荐课程用法
+
+```json
+{
+  "project": "xiaohongshu-course-demo",
+  "category": "冻干益生菌",
+  "keywords": [
+    "儿童益生菌怎么选",
+    "益生菌腹胀便秘",
+    "冻干益生菌测评"
+  ],
+  "notesPerKeyword": 10,
+  "maxCommentPages": 2,
+  "sort": "general",
+  "batch": "P0",
+  "hypothesisTags": ["H1", "H2", "H3"]
+}
+```
+
+## 返回格式
+
+```json
+{
+  "metadata": {
+    "project": "xiaohongshu-course-demo",
+    "platform": "xiaohongshu",
+    "keywordCount": 3,
+    "noteCount": 30,
+    "commentCount": 105,
+    "generatedAt": "2026-04-29T00:00:00.000Z"
+  },
+  "notes": [
+    {
+      "id": "xhs_note_id",
+      "platform": "xiaohongshu",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": ["H1", "H3"],
+      "title": "笔记标题",
+      "content": "完整正文",
+      "author": "作者昵称",
+      "likeCount": 1200,
+      "commentCount": 88,
+      "url": "https://www.xiaohongshu.com/explore/...",
+      "raw": {}
+    }
+  ],
+  "commentsByNote": [
+    {
+      "noteId": "xhs_note_id",
+      "keyword": "儿童益生菌怎么选",
+      "comments": []
+    }
+  ],
+  "commentsFlat": [
+    {
+      "id": "xhs_comment_id",
+      "platform": "xiaohongshu",
+      "sourceType": "comment",
+      "parentId": "xhs_note_id",
+      "keyword": "儿童益生菌怎么选",
+      "batch": "P0",
+      "hypothesisTags": ["H1", "H3"],
+      "author": "评论者昵称",
+      "text": "用户原声评论",
+      "likeCount": 12,
+      "publishTime": "2026-04-29T00:00:00.000Z",
+      "raw": {}
+    }
+  ],
+  "keywordStats": [],
+  "audit": {
+    "failedRequests": [],
+    "emptyComments": 0,
+    "missingFields": []
+  }
+}
+```
+
+## 下游衔接
+
+- 用 `scripts/tools/voc-data-normalizer.js` 把 raw 输出归一化为 `_merged.json` 和 `comments-flat.jsonl`。
+- 用 `scripts/tools/voc-report-auditor.js` 对 mini report 和 normalized 数据做交付前审计。
+- 用 `voc-report-factory/` 模板生成采集矩阵、执行摘要和交付 README。
+
+## 质量边界
+
+- 小红书搜索和评论采集存在平台噪声,执行前应确认关键词是否离题。
+- 课程 demo 可用合成样例数据;真实交付必须明确标注真实采集、课程样例或混合数据。
+- 医疗、功效、症状相关表达只能作为用户声音,不能直接写成未经验证的功效结论。
+
+## 对应工作坊环节
+
+2 小时 VOC 课程:关键词矩阵 → 小红书采集 → 归一化 → mini report → 审计交付。

+ 230 - 0
xiaohongshu/xiaohongshu-mini-voc/api-config.json

@@ -0,0 +1,230 @@
+{
+  "name": "xiaohongshu-mini-voc",
+  "displayName": "小红书 Mini VOC 编排采集",
+  "description": "按关键词搜索小红书笔记,筛选高价值笔记并批量采集笔记详情与评论,输出适合 2 小时课程和轻量 VOC 报告的数据包。",
+  "category": "xiaohongshu",
+  "version": "0.1.0",
+  "type": "orchestration",
+  "parameters": {
+    "project": {
+      "type": "string",
+      "required": false,
+      "description": "项目名称,用于输出 metadata.project"
+    },
+    "category": {
+      "type": "string",
+      "required": false,
+      "description": "品类或产品方向,如 冻干益生菌、护肝片、猴菇饮"
+    },
+    "keywords": {
+      "type": "array",
+      "items": {
+        "type": "string"
+      },
+      "required": true,
+      "description": "小红书搜索关键词列表"
+    },
+    "notesPerKeyword": {
+      "type": "integer",
+      "required": false,
+      "default": 10,
+      "description": "每个关键词保留的笔记数量"
+    },
+    "maxCommentPages": {
+      "type": "integer",
+      "required": false,
+      "default": 2,
+      "description": "每篇笔记最多抓取评论页数,单页约 10-20 条"
+    },
+    "sort": {
+      "type": "string",
+      "required": false,
+      "default": "general",
+      "enum": [
+        "general",
+        "time_descending",
+        "popularity_descending"
+      ],
+      "description": "搜索排序方式"
+    },
+    "note_type": {
+      "type": "string",
+      "required": false,
+      "default": "_0",
+      "enum": [
+        "_0",
+        "_1",
+        "_2"
+      ],
+      "description": "笔记类型筛选:不限、视频、图文"
+    },
+    "batch": {
+      "type": "string",
+      "required": false,
+      "default": "P0",
+      "description": "采集批次,如 P0/P1/P2"
+    },
+    "hypothesisTags": {
+      "type": "array",
+      "items": {
+        "type": "string"
+      },
+      "required": false,
+      "description": "默认 H1-H8 假设标签,写入每条关键词采集任务"
+    },
+    "keywordMatrix": {
+      "type": "array",
+      "items": {
+        "type": "object"
+      },
+      "required": false,
+      "description": "可选采集矩阵行,支持 keyword、batch、targetCount、hypothesisTags、purpose、expectedSignal、risk"
+    },
+    "includeUserInfo": {
+      "type": "boolean",
+      "required": false,
+      "default": false,
+      "description": "是否额外调用 xiaohongshu-user-info 获取作者画像"
+    }
+  },
+  "pipeline": [
+    {
+      "step": 1,
+      "name": "按关键词搜索小红书笔记",
+      "forEach": "keywords 或 keywordMatrix[].keyword",
+      "api": {
+        "skill": "xiaohongshu/xiaohongshu-search-notes",
+        "method": "GET",
+        "queryParams": {
+          "keyword": "${keyword}",
+          "page": 1,
+          "sort": "${sort}",
+          "note_type": "${note_type}"
+        }
+      },
+      "output": "searchResults",
+      "responseExtract": "data.data.items[].note → Array<{ id,title,desc,type,timestamp,user,liked_count,comments_count,collected_count,shared_count,xsec_token }>"
+    },
+    {
+      "step": 2,
+      "name": "筛选高价值笔记",
+      "type": "compute",
+      "logic": "对每个 keyword 的搜索结果按 comments_count、liked_count、collected_count 综合排序,保留 notesPerKeyword 条,并继承 batch、hypothesisTags、purpose 等矩阵字段",
+      "output": "selectedNotes"
+    },
+    {
+      "step": 3,
+      "name": "批量获取笔记详情",
+      "forEach": "selectedNotes",
+      "api": {
+        "skill": "xiaohongshu/xiaohongshu-note-detail",
+        "method": "GET",
+        "queryParams": {
+          "note_id": "${note.id}"
+        }
+      },
+      "output": "noteDetails",
+      "responseExtract": "data.data.note_list[0] → 完整正文、图片、视频、话题、互动数据和作者信息"
+    },
+    {
+      "step": 4,
+      "name": "批量采集笔记评论",
+      "forEach": "selectedNotes",
+      "api": {
+        "skill": "xiaohongshu/xiaohongshu-note-comments",
+        "method": "GET",
+        "queryParams": {
+          "note_id": "${note.id}",
+          "cursor": "${cursor}"
+        }
+      },
+      "pagination": {
+        "cursorField": "data.data.cursor",
+        "hasMoreField": "data.data.has_more",
+        "maxPages": "${maxCommentPages}"
+      },
+      "output": "noteComments",
+      "responseExtract": "data.data.comments[] → Array<{ id,content,user_info,like_count,create_time,ip_location,sub_comment_count }>"
+    },
+    {
+      "step": 5,
+      "name": "可选获取作者画像",
+      "condition": "includeUserInfo === true",
+      "forEach": "selectedNotes[].user.userid 去重",
+      "api": {
+        "skill": "xiaohongshu/xiaohongshu-user-info",
+        "method": "GET",
+        "queryParams": {
+          "user_id": "${user_id}"
+        }
+      },
+      "output": "userProfiles"
+    },
+    {
+      "step": 6,
+      "name": "生成 Mini VOC 数据包",
+      "type": "compute",
+      "logic": "汇总 notes、comments、keywordStats、audit;保留 platform、keyword、batch、hypothesisTags、noteId/commentId、author、content、likeCount、publishTime、url、raw,供 voc-data-normalizer 继续处理",
+      "output": "miniVocDataset"
+    }
+  ],
+  "response": {
+    "type": "object",
+    "properties": {
+      "metadata": {
+        "type": "object",
+        "description": "项目、平台、关键词、批次、采集时间、样本量汇总"
+      },
+      "notes": {
+        "type": "array",
+        "description": "筛选后的笔记详情列表"
+      },
+      "commentsByNote": {
+        "type": "array",
+        "description": "按 noteId 分组的评论采集结果"
+      },
+      "commentsFlat": {
+        "type": "array",
+        "description": "扁平化评论 VOC,字段兼容 comments-flat.jsonl"
+      },
+      "keywordStats": {
+        "type": "array",
+        "description": "每个关键词的搜索、入选、评论数量和异常统计"
+      },
+      "audit": {
+        "type": "object",
+        "description": "缺字段、空评论、失败请求、跳过样本和下一步补采建议"
+      }
+    }
+  },
+  "reportMapping": {
+    "slides": [
+      "小红书 VOC 数据概况",
+      "小红书高互动笔记与内容模式",
+      "小红书用户原声与痛点聚类",
+      "小红书产品/内容机会建议"
+    ],
+    "dataPoints": [
+      "关键词-笔记-评论三层样本量",
+      "高赞/高评笔记标题与正文",
+      "评论原声、点赞数、IP 地域和回复数",
+      "H1-H8 假设标签覆盖情况",
+      "可交给 voc-data-normalizer 的 raw 数据包"
+    ]
+  },
+  "timeout": 180000,
+  "retry": {
+    "maxAttempts": 2,
+    "delay": 2000,
+    "backoffMultiplier": 2,
+    "retryOn": [
+      400,
+      429,
+      500,
+      502,
+      503,
+      504
+    ]
+  },
+  "notes": "本 skill 是小红书 VOC 课程和轻量报告的编排层,底层调用 xiaohongshu-search-notes、xiaohongshu-note-detail、xiaohongshu-note-comments 和可选 xiaohongshu-user-info。社媒网关使用共享订阅,不经过 APIG 计费。"
+}

Некоторые файлы не были показаны из-за большого количества измененных файлов