Bläddra i källkod

feat(frontend): add legacy decode detail demo

SamLee 3 veckor sedan
förälder
incheckning
8aed9432c3
62 ändrade filer med 6966 tillägg och 3 borttagningar
  1. 0 0
      app/frontend/dist/assets/index-CkGW0KOY.css
  2. 0 0
      app/frontend/dist/assets/index-DBbetMuX.css
  3. 1 1
      app/frontend/dist/assets/index-DO9zjFER.js
  4. 2 2
      app/frontend/dist/index.html
  5. BIN
      app/frontend/dist/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_1.webp
  6. BIN
      app/frontend/dist/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_10.webp
  7. BIN
      app/frontend/dist/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_11.webp
  8. BIN
      app/frontend/dist/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_12.webp
  9. BIN
      app/frontend/dist/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_2.webp
  10. BIN
      app/frontend/dist/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_3.webp
  11. BIN
      app/frontend/dist/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_4.webp
  12. BIN
      app/frontend/dist/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_5.webp
  13. BIN
      app/frontend/dist/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_6.webp
  14. BIN
      app/frontend/dist/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_7.webp
  15. BIN
      app/frontend/dist/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_8.webp
  16. BIN
      app/frontend/dist/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_9.webp
  17. 2022 0
      app/frontend/dist/legacy-decode/frameworks.json
  18. 472 0
      app/frontend/dist/legacy-decode/index.html
  19. 473 0
      app/frontend/dist/legacy-decode/payloads.json
  20. 55 0
      app/frontend/dist/legacy-decode/prompt-read/extract.txt
  21. 23 0
      app/frontend/dist/legacy-decode/prompt-read/extract_video.txt
  22. 13 0
      app/frontend/dist/legacy-decode/prompt-read/gate_admit.txt
  23. 7 0
      app/frontend/dist/legacy-decode/prompt-read/gate_how_admit.txt
  24. 13 0
      app/frontend/dist/legacy-decode/prompt-read/gate_how_refute.txt
  25. 8 0
      app/frontend/dist/legacy-decode/prompt-read/gate_how_tiebreak.txt
  26. 11 0
      app/frontend/dist/legacy-decode/prompt-read/gate_refute.txt
  27. 11 0
      app/frontend/dist/legacy-decode/prompt-read/gate_tiebreak.txt
  28. 8 0
      app/frontend/dist/legacy-decode/prompt-read/normalize_scope.txt
  29. 196 0
      app/frontend/dist/legacy-decode/prompt-skill/phase1-frame.md
  30. 145 0
      app/frontend/dist/legacy-decode/prompt-skill/phase2-scope.md
  31. 1 0
      app/frontend/dist/legacy-decode/runs/index.json
  32. BIN
      app/frontend/public/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_1.webp
  33. BIN
      app/frontend/public/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_10.webp
  34. BIN
      app/frontend/public/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_11.webp
  35. BIN
      app/frontend/public/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_12.webp
  36. BIN
      app/frontend/public/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_2.webp
  37. BIN
      app/frontend/public/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_3.webp
  38. BIN
      app/frontend/public/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_4.webp
  39. BIN
      app/frontend/public/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_5.webp
  40. BIN
      app/frontend/public/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_6.webp
  41. BIN
      app/frontend/public/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_7.webp
  42. BIN
      app/frontend/public/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_8.webp
  43. BIN
      app/frontend/public/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_9.webp
  44. 2022 0
      app/frontend/public/legacy-decode/frameworks.json
  45. 472 0
      app/frontend/public/legacy-decode/index.html
  46. 473 0
      app/frontend/public/legacy-decode/payloads.json
  47. 55 0
      app/frontend/public/legacy-decode/prompt-read/extract.txt
  48. 23 0
      app/frontend/public/legacy-decode/prompt-read/extract_video.txt
  49. 13 0
      app/frontend/public/legacy-decode/prompt-read/gate_admit.txt
  50. 7 0
      app/frontend/public/legacy-decode/prompt-read/gate_how_admit.txt
  51. 13 0
      app/frontend/public/legacy-decode/prompt-read/gate_how_refute.txt
  52. 8 0
      app/frontend/public/legacy-decode/prompt-read/gate_how_tiebreak.txt
  53. 11 0
      app/frontend/public/legacy-decode/prompt-read/gate_refute.txt
  54. 11 0
      app/frontend/public/legacy-decode/prompt-read/gate_tiebreak.txt
  55. 8 0
      app/frontend/public/legacy-decode/prompt-read/normalize_scope.txt
  56. 196 0
      app/frontend/public/legacy-decode/prompt-skill/phase1-frame.md
  57. 145 0
      app/frontend/public/legacy-decode/prompt-skill/phase2-scope.md
  58. 1 0
      app/frontend/public/legacy-decode/runs/index.json
  59. 6 0
      app/frontend/src/App.jsx
  60. 1 0
      app/frontend/src/pages/CreationDemo.jsx
  61. 20 0
      app/frontend/src/pages/LegacyDecodeDemo.jsx
  62. 20 0
      app/frontend/src/styles.css

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
app/frontend/dist/assets/index-CkGW0KOY.css


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
app/frontend/dist/assets/index-DBbetMuX.css


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 1 - 1
app/frontend/dist/assets/index-DO9zjFER.js


+ 2 - 2
app/frontend/dist/index.html

@@ -4,8 +4,8 @@
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <title>创作知识 · Query 正交 Demo</title>
-    <script type="module" crossorigin src="/app/assets/index-DEWR-s1T.js"></script>
-    <link rel="stylesheet" crossorigin href="/app/assets/index-CkGW0KOY.css">
+    <script type="module" crossorigin src="/app/assets/index-DO9zjFER.js"></script>
+    <link rel="stylesheet" crossorigin href="/app/assets/index-DBbetMuX.css">
   </head>
   <body>
     <div id="root"></div>

BIN
app/frontend/dist/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_1.webp


BIN
app/frontend/dist/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_10.webp


BIN
app/frontend/dist/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_11.webp


BIN
app/frontend/dist/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_12.webp


BIN
app/frontend/dist/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_2.webp


BIN
app/frontend/dist/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_3.webp


BIN
app/frontend/dist/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_4.webp


BIN
app/frontend/dist/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_5.webp


BIN
app/frontend/dist/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_6.webp


BIN
app/frontend/dist/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_7.webp


BIN
app/frontend/dist/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_8.webp


BIN
app/frontend/dist/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_9.webp


+ 2022 - 0
app/frontend/dist/legacy-decode/frameworks.json

@@ -0,0 +1,2022 @@
+{
+ "count": 1,
+ "posts": [
+  {
+   "post_id": "699308fa0000000016009697",
+   "source_id": "xhs_699308fa0000000016009697",
+   "title": "真正能爆的选题,往往是你写完后感觉羞耻的",
+   "platform": "xiaohongshu",
+   "url": "https://www.xiaohongshu.com/explore/699308fa0000000016009697",
+   "media": {
+    "type": "image",
+    "video_url": null,
+    "images": [
+     "/app/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_1.webp",
+     "/app/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_2.webp",
+     "/app/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_3.webp",
+     "/app/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_4.webp",
+     "/app/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_5.webp",
+     "/app/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_6.webp",
+     "/app/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_7.webp",
+     "/app/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_8.webp",
+     "/app/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_9.webp",
+     "/app/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_10.webp",
+     "/app/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_11.webp",
+     "/app/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_12.webp"
+    ]
+   },
+   "cards": [
+    {
+     "index": 1,
+     "content": "真正能爆的选题往往是写完后让人感觉羞耻的,因为太正确的选题缺乏情绪共鸣。",
+     "image_url": "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_1.webp"
+    },
+    {
+     "index": 2,
+     "content": "",
+     "image_url": "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_2.webp"
+    },
+    {
+     "index": 3,
+     "content": "羞耻感是好选题的防伪标签,因为它意味着触碰了真实但被包裹的痛点。",
+     "image_url": "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_3.webp"
+    },
+    {
+     "index": 4,
+     "content": "如果写完后内心没有波澜、觉得没问题,大概率是无感选题;而写完后有点犹豫或不好意思,则可能是好选题。",
+     "image_url": "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_4.webp"
+    },
+    {
+     "index": 5,
+     "content": "冒犯感是对正确共识的撕裂,能触动公共痛点,引发观众共鸣。",
+     "image_url": "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_5.webp"
+    },
+    {
+     "index": 6,
+     "content": "真正的爆款选题带有冒犯感,不是脏话式的冒犯,而是对正确共识的挑战。",
+     "image_url": "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_6.webp"
+    },
+    {
+     "index": 7,
+     "content": "没有情绪触发的内容不可能爆红,安全的选题等于无感。",
+     "image_url": "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_7.webp"
+    },
+    {
+     "index": 8,
+     "content": "寻找共识崩塌的场景,比如职场中‘能力强的人一定会被看见’这一信念的失效时刻。",
+     "image_url": "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_8.webp"
+    },
+    {
+     "index": 9,
+     "content": "实操方法:找到赛道中的‘圣经句’(正确共识),然后找到它失效的场景。",
+     "image_url": "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_9.webp"
+    },
+    {
+     "index": 10,
+     "content": "第一招:寻找正确共识的失灵瞬间,问自己什么情况下严格按这句话做反而越做越差。",
+     "image_url": "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_10.webp"
+    },
+    {
+     "index": 11,
+     "content": "第二招:去竞品评论区找‘懂但没说出口’的评论(‘但是……’类型的评论),这些是经过市场验证的选题。",
+     "image_url": "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_11.webp"
+    },
+    {
+     "index": 12,
+     "content": "",
+     "image_url": "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_12.webp"
+    }
+   ],
+   "knowledges": [
+    {
+     "id": "k1",
+     "type": "how",
+     "role": "主",
+     "parent": null,
+     "title": "爆款选题双招法",
+     "purpose": "产出一个能引发情绪共鸣的爆款选题",
+     "业务阶段": [
+      "选题"
+     ],
+     "steps": [
+      {
+       "id": "s1",
+       "input": "选定目标赛道",
+       "directive": "提取该赛道中被广泛默认、反复复述的‘圣经句’(即正确共识),如『能力强的人一定会被看见』;必须是大众信奉但未经质疑的断言。例:『…能力强的人一定会被看见…』",
+       "output": "〈赛道圣经句〉",
+       "出处": [
+        "卡片9"
+       ],
+       "创作阶段": "定向",
+       "动作": "提取共识句",
+       "作用域": [
+        {
+         "scope_type": "substance",
+         "value": "赛道圣经句",
+         "candidate": "赛道圣经句",
+         "link": "新建",
+         "score": 0.5348,
+         "top": [
+          {
+           "name": "人生哲理",
+           "score": 0.5348,
+           "path": "/理念/观念/个人观念/人生感悟/观点表达/人生哲理"
+          },
+          {
+           "name": "标语",
+           "score": 0.5054,
+           "path": "/表象/视觉/符号/文字符号/标语"
+          },
+          {
+           "name": "谚语",
+           "score": 0.5047,
+           "path": "/理念/知识/文化/语言文字/谚语"
+          }
+         ]
+        },
+        {
+         "scope_type": "substance",
+         "value": "正确共识",
+         "candidate": "正确共识",
+         "link": "新建",
+         "score": 0.6723,
+         "top": [
+          {
+           "name": "通用共识符号",
+           "score": 0.6723,
+           "path": "/表象/视觉/符号/图案符号/标识图案/通用共识符号"
+          },
+          {
+           "name": "通识百科",
+           "score": 0.5524,
+           "path": "/理念/知识/文化/传统文化/文化知识/通识百科"
+          },
+          {
+           "name": "认知思辨",
+           "score": 0.5432,
+           "path": "/理念/知识/思想/概念范畴/认知思辨"
+          }
+         ]
+        },
+        {
+         "scope_type": "substance",
+         "value": "大众信奉断言",
+         "candidate": "大众信奉断言",
+         "link": "新建",
+         "score": 0.5042,
+         "top": [
+          {
+           "name": "民间传说",
+           "score": 0.5042,
+           "path": "/理念/知识/文化/民间传说"
+          },
+          {
+           "name": "意识形态",
+           "score": 0.492,
+           "path": "/理念/知识/思想/思想理论/政治思想/意识形态"
+          },
+          {
+           "name": "个人观念",
+           "score": 0.4916,
+           "path": "/理念/观念/个人观念"
+          }
+         ]
+        },
+        {
+         "scope_type": "form",
+         "value": "提取法",
+         "candidate": "提取法",
+         "link": "新建",
+         "score": 0.5628,
+         "top": [
+          {
+           "name": "方法建议",
+           "score": 0.5628,
+           "path": "/架构/策略/互动方式/实用指引/方法建议"
+          },
+          {
+           "name": "归纳提炼",
+           "score": 0.5485,
+           "path": "/架构/逻辑/信息编排逻辑/归纳论证/归纳提炼"
+          },
+          {
+           "name": "概括浓缩",
+           "score": 0.5416,
+           "path": "/架构/逻辑/信息编排逻辑/归纳论证/归纳提炼/概括浓缩"
+          }
+         ]
+        },
+        {
+         "scope_type": "effect",
+         "value": "共识",
+         "candidate": "共识",
+         "link": "新建",
+         "score": 0.5708,
+         "top": [
+          {
+           "name": "情感共鸣",
+           "score": 0.5708,
+           "path": "/表达/互动引导/情感连接/情感共鸣"
+          },
+          {
+           "name": "解决方案",
+           "score": 0.5446,
+           "path": "/表达/论证说理/解决方案"
+          },
+          {
+           "name": "价值肯定",
+           "score": 0.5343,
+           "path": "/表达/论证说理/分析论证/论证评判/肯定论证/价值肯定"
+          }
+         ]
+        },
+        {
+         "scope_type": "intent",
+         "value": "识别共识起点",
+         "candidate": "识别共识起点",
+         "link": "新建",
+         "score": 0.4449,
+         "top": [
+          {
+           "name": "事实呈现",
+           "score": 0.4449,
+           "path": "/信息传递/事实呈现"
+          },
+          {
+           "name": "解读",
+           "score": 0.4326,
+           "path": "/信息传递/知识传递/解读"
+          },
+          {
+           "name": "行为引导",
+           "score": 0.4271,
+           "path": "/行为引导"
+          }
+         ]
+        }
+       ]
+      },
+      {
+       "id": "s2",
+       "input": "← s1 的〈赛道圣经句〉",
+       "directive": "针对该句,追问:什么情况下严格按这句话做,反而导致结果恶化?即寻找其失效的现实场景(共识崩塌点)。例:『职场中能力强却长期被埋没、汇报不力反被提拔』",
+       "output": "〈共识失灵场景清单〉",
+       "出处": [
+        "卡片8",
+        "卡片10"
+       ],
+       "创作阶段": "构思",
+       "动作": "逆向推演失效场景",
+       "作用域": [
+        {
+         "scope_type": "substance",
+         "value": "共识失灵场景",
+         "candidate": "共识失灵场景",
+         "link": "新建",
+         "score": 0.5923,
+         "top": [
+          {
+           "name": "使用场景",
+           "score": 0.5923,
+           "path": "/理念/知识/商业/产品服务/使用场景"
+          },
+          {
+           "name": "通用共识符号",
+           "score": 0.5892,
+           "path": "/表象/视觉/符号/图案符号/标识图案/通用共识符号"
+          },
+          {
+           "name": "场景感悟",
+           "score": 0.5638,
+           "path": "/理念/观念/个人观念/人生感悟/观点表达/场景感悟"
+          }
+         ]
+        },
+        {
+         "scope_type": "substance",
+         "value": "现实失效条件",
+         "candidate": "现实失效条件",
+         "link": "新建",
+         "score": 0.5311,
+         "top": [
+          {
+           "name": "现实人物",
+           "score": 0.5311,
+           "path": "/表象/视觉/实体/人物/个体/现实人物"
+          },
+          {
+           "name": "逻辑异常",
+           "score": 0.4974,
+           "path": "/理念/知识/思想/逻辑原理/逻辑异常"
+          },
+          {
+           "name": "实力概念",
+           "score": 0.4971,
+           "path": "/理念/知识/政治/国家治理/国家实力/实力概念"
+          }
+         ]
+        },
+        {
+         "scope_type": "substance",
+         "value": "共识崩塌点",
+         "candidate": "共识崩塌点",
+         "link": "新建",
+         "score": 0.6008,
+         "top": [
+          {
+           "name": "通用共识符号",
+           "score": 0.6008,
+           "path": "/表象/视觉/符号/图案符号/标识图案/通用共识符号"
+          },
+          {
+           "name": "集体记忆",
+           "score": 0.5823,
+           "path": "/理念/知识/文化/传统文化/文化知识/集体记忆"
+          },
+          {
+           "name": "地缘冲突",
+           "score": 0.5716,
+           "path": "/理念/知识/政治/国际政治/地缘政治/地缘冲突"
+          }
+         ]
+        },
+        {
+         "scope_type": "form",
+         "value": "反事实追问",
+         "candidate": "反事实追问",
+         "link": "新建",
+         "score": 0.6494,
+         "top": [
+          {
+           "name": "因果逻辑",
+           "score": 0.6494,
+           "path": "/架构/逻辑/叙事逻辑/因果逻辑"
+          },
+          {
+           "name": "反问式",
+           "score": 0.6444,
+           "path": "/架构/修辞/修辞意象/句式辞格/问答句式/反问式"
+          },
+          {
+           "name": "因果推理",
+           "score": 0.6443,
+           "path": "/架构/逻辑/信息编排逻辑/归纳论证/分析解读/因果推理"
+          }
+         ]
+        },
+        {
+         "scope_type": "effect",
+         "value": "共识解构",
+         "candidate": "共识解构",
+         "link": "新建",
+         "score": 0.7691,
+         "top": [
+          {
+           "name": "分析解构",
+           "score": 0.7691,
+           "path": "/表达/信息传达/传达深度/详细说明/分析解构"
+          },
+          {
+           "name": "价值建构",
+           "score": 0.5888,
+           "path": "/表达/论证说理/提炼升华/价值建构"
+          },
+          {
+           "name": "拆解剖析",
+           "score": 0.5854,
+           "path": "/表达/论证说理/分析论证/拆解剖析"
+          }
+         ]
+        },
+        {
+         "scope_type": "effect",
+         "value": "结构性矛盾暴露",
+         "candidate": "结构性矛盾暴露",
+         "link": "新建",
+         "score": 0.5408,
+         "top": [
+          {
+           "name": "矛盾冲突",
+           "score": 0.5408,
+           "path": "/表达/论证说理/分析论证/对比反差/矛盾冲突"
+          },
+          {
+           "name": "结构模式",
+           "score": 0.502,
+           "path": "/结构/结构模式"
+          },
+          {
+           "name": "结构",
+           "score": 0.4949,
+           "path": "/结构"
+          }
+         ]
+        },
+        {
+         "scope_type": "intent",
+         "value": "挖掘认知裂缝",
+         "candidate": "挖掘认知裂缝",
+         "link": "新建",
+         "score": 0.5464,
+         "top": [
+          {
+           "name": "裂变",
+           "score": 0.5464,
+           "path": "/行为引导/裂变"
+          },
+          {
+           "name": "揭露",
+           "score": 0.5336,
+           "path": "/信息传递/事实呈现/揭露"
+          },
+          {
+           "name": "事实呈现",
+           "score": 0.5062,
+           "path": "/信息传递/事实呈现"
+          }
+         ]
+        }
+       ]
+      },
+      {
+       "id": "s3",
+       "input": "← s1 的〈赛道圣经句〉",
+       "directive": "前往同赛道热门竞品评论区,筛选含『但是……』『其实……』『没人敢说……』等转折/压抑表达的评论——这些是用户‘懂但没说出口’的真实痛点,已通过市场反馈验证。例:『标题很干货,但是看完还是不会写』",
+       "output": "〈竞品评论区沉默痛点集〉",
+       "出处": [
+        "卡片11"
+       ],
+       "创作阶段": "构思",
+       "动作": "挖掘评论区未言明反馈",
+       "作用域": [
+        {
+         "scope_type": "substance",
+         "value": "竞品评论区沉默痛点",
+         "candidate": "竞品评论区沉默痛点",
+         "link": "新建",
+         "score": 0.6387,
+         "top": [
+          {
+           "name": "痛点问题",
+           "score": 0.6387,
+           "path": "/理念/知识/商业/产品服务/痛点问题"
+          },
+          {
+           "name": "产品矩阵",
+           "score": 0.5079,
+           "path": "/理念/知识/商业/产品服务/产品矩阵"
+          },
+          {
+           "name": "政策评论",
+           "score": 0.5053,
+           "path": "/理念/观念/社会观念/时政评议/政策评论"
+          }
+         ]
+        },
+        {
+         "scope_type": "substance",
+         "value": "用户未言明真实痛点",
+         "candidate": "用户未言明真实痛点",
+         "link": "新建",
+         "score": 0.7331,
+         "top": [
+          {
+           "name": "痛点问题",
+           "score": 0.7331,
+           "path": "/理念/知识/商业/产品服务/痛点问题"
+          },
+          {
+           "name": "消费体验",
+           "score": 0.5443,
+           "path": "/理念/观念/个人观念/人生感悟/内心感受/消费体验"
+          },
+          {
+           "name": "行业乱象",
+           "score": 0.5379,
+           "path": "/理念/现象/社会问题/文化精神/社会风气/行业乱象"
+          }
+         ]
+        },
+        {
+         "scope_type": "substance",
+         "value": "市场验证型压抑表达",
+         "candidate": "市场验证型压抑表达",
+         "link": "新建",
+         "score": 0.5608,
+         "top": [
+          {
+           "name": "情感表达",
+           "score": 0.5608,
+           "path": "/表象/视觉/行为/人际互动/表达沟通/情感表达"
+          },
+          {
+           "name": "立场表达",
+           "score": 0.5474,
+           "path": "/理念/知识/政治/国际政治/外交立场/立场表达"
+          },
+          {
+           "name": "观点表达",
+           "score": 0.5364,
+           "path": "/理念/观念/个人观念/人生感悟/观点表达"
+          }
+         ]
+        },
+        {
+         "scope_type": "form",
+         "value": "评论区语义",
+         "candidate": "评论区语义",
+         "link": "新建",
+         "score": 0.6481,
+         "top": [
+          {
+           "name": "讽刺评论",
+           "score": 0.6481,
+           "path": "/架构/修辞/语调风格/讽刺犀利/讽刺手法/讽刺评论"
+          },
+          {
+           "name": "情感修辞",
+           "score": 0.5881,
+           "path": "/架构/策略/情感调动/情感激发/情感渲染/情感修辞"
+          },
+          {
+           "name": "反讽句式",
+           "score": 0.5867,
+           "path": "/架构/修辞/修辞意象/句式辞格/反讽句式"
+          }
+         ]
+        },
+        {
+         "scope_type": "form",
+         "value": "转折词筛选",
+         "candidate": "转折词筛选",
+         "link": "新建",
+         "score": 0.5684,
+         "top": [
+          {
+           "name": "逻辑反转",
+           "score": 0.5684,
+           "path": "/架构/叙事/叙事技法/戏剧张力/反转/逻辑反转"
+          },
+          {
+           "name": "差异对比",
+           "score": 0.5595,
+           "path": "/架构/创意/对比反差/反差错位/通用反差/差异对比"
+          },
+          {
+           "name": "情感反转",
+           "score": 0.5263,
+           "path": "/架构/叙事/叙事技法/戏剧张力/反转/情感反转"
+          }
+         ]
+        },
+        {
+         "scope_type": "effect",
+         "value": "真实痛点捕获",
+         "candidate": "真实痛点捕获",
+         "link": "新建",
+         "score": 0.506,
+         "top": [
+          {
+           "name": "细节呈现",
+           "score": 0.506,
+           "path": "/表达/信息传达/传达深度/详细说明/展示呈现/细节呈现"
+          },
+          {
+           "name": "数据实证",
+           "score": 0.5031,
+           "path": "/表达/论证说理/证据支撑/数据实证"
+          },
+          {
+           "name": "情感共鸣",
+           "score": 0.502,
+           "path": "/表达/互动引导/情感连接/情感共鸣"
+          }
+         ]
+        },
+        {
+         "scope_type": "effect",
+         "value": "情感共鸣",
+         "candidate": "情绪共鸣",
+         "link": "复用",
+         "score": 0.9174,
+         "top": [
+          {
+           "name": "情感共鸣",
+           "score": 0.9174,
+           "path": "/表达/互动引导/情感连接/情感共鸣"
+          },
+          {
+           "name": "情感表达",
+           "score": 0.6986,
+           "path": "/表达/情感表达"
+          },
+          {
+           "name": "情感连接",
+           "score": 0.6967,
+           "path": "/表达/互动引导/情感连接"
+          }
+         ]
+        },
+        {
+         "scope_type": "intent",
+         "value": "锚定已验证情绪触点",
+         "candidate": "锚定已验证情绪触点",
+         "link": "新建",
+         "score": 0.5382,
+         "top": [
+          {
+           "name": "情感联结",
+           "score": 0.5382,
+           "path": "/情感联结"
+          },
+          {
+           "name": "情感抒发",
+           "score": 0.4704,
+           "path": "/情感联结/情感抒发"
+          },
+          {
+           "name": "行为引导",
+           "score": 0.4492,
+           "path": "/行为引导"
+          }
+         ]
+        }
+       ]
+      },
+      {
+       "id": "s4",
+       "input": "← s2 的〈共识失灵场景清单〉, ← s3 的〈竞品评论区沉默痛点集〉",
+       "directive": "将二者交叉比对,选取同时满足‘共识崩塌’+‘用户已有压抑共鸣’的交集点,将其转化为具体选题表述,确保带有羞耻感或冒犯感(非攻击性,而是撕裂正确表象)。例:『别再信“努力就有回报”,这届打工人正在用离职投票』",
+       "output": "一个能引发情绪共鸣的爆款选题",
+       "出处": [
+        "卡片1",
+        "卡片5",
+        "卡片6"
+       ],
+       "创作阶段": "结构",
+       "动作": "交叉验证并具象化选题",
+       "作用域": [
+        {
+         "scope_type": "substance",
+         "value": "共识崩塌",
+         "candidate": "共识崩塌",
+         "link": "新建",
+         "score": 0.6191,
+         "top": [
+          {
+           "name": "集体记忆",
+           "score": 0.6191,
+           "path": "/理念/知识/文化/传统文化/文化知识/集体记忆"
+          },
+          {
+           "name": "通用共识符号",
+           "score": 0.6048,
+           "path": "/表象/视觉/符号/图案符号/标识图案/通用共识符号"
+          },
+          {
+           "name": "社会失序",
+           "score": 0.5973,
+           "path": "/理念/现象/社会问题/文化精神/社会风气/社会失序"
+          }
+         ]
+        },
+        {
+         "scope_type": "substance",
+         "value": "用户压抑交集点",
+         "candidate": "用户压抑交集点",
+         "link": "新建",
+         "score": 0.4964,
+         "top": [
+          {
+           "name": "空间区域",
+           "score": 0.4964,
+           "path": "/表象/视觉/空间/空间区域"
+          },
+          {
+           "name": "痛点问题",
+           "score": 0.4826,
+           "path": "/理念/知识/商业/产品服务/痛点问题"
+          },
+          {
+           "name": "空间",
+           "score": 0.4785,
+           "path": "/表象/视觉/空间"
+          }
+         ]
+        },
+        {
+         "scope_type": "substance",
+         "value": "羞耻感选题",
+         "candidate": "羞耻感选题",
+         "link": "新建",
+         "score": 0.5641,
+         "top": [
+          {
+           "name": "人生议题",
+           "score": 0.5641,
+           "path": "/理念/观念/个人观念/人生感悟/人生议题"
+          },
+          {
+           "name": "情绪情感",
+           "score": 0.5142,
+           "path": "/理念/现象/生活状态/个人境遇/身心状态/情绪情感"
+          },
+          {
+           "name": "婚恋情感",
+           "score": 0.5121,
+           "path": "/理念/情感/人际情感/婚恋情感"
+          }
+         ]
+        },
+        {
+         "scope_type": "substance",
+         "value": "冒犯感选题",
+         "candidate": "冒犯感选题",
+         "link": "新建",
+         "score": 0.5564,
+         "top": [
+          {
+           "name": "人生议题",
+           "score": 0.5564,
+           "path": "/理念/观念/个人观念/人生感悟/人生议题"
+          },
+          {
+           "name": "婚恋情感",
+           "score": 0.5261,
+           "path": "/理念/情感/人际情感/婚恋情感"
+          },
+          {
+           "name": "标题",
+           "score": 0.526,
+           "path": "/表象/视觉/符号/文字符号/标题"
+          }
+         ]
+        },
+        {
+         "scope_type": "substance",
+         "value": "情绪共鸣型爆款选题",
+         "candidate": "情绪共鸣型爆款选题",
+         "link": "新建",
+         "score": 0.5817,
+         "top": [
+          {
+           "name": "情绪情感",
+           "score": 0.5817,
+           "path": "/理念/现象/生活状态/个人境遇/身心状态/情绪情感"
+          },
+          {
+           "name": "情绪意境",
+           "score": 0.5404,
+           "path": "/表象/视觉/画面/后期/情绪意境"
+          },
+          {
+           "name": "婚恋情感",
+           "score": 0.5247,
+           "path": "/理念/情感/人际情感/婚恋情感"
+          }
+         ]
+        },
+        {
+         "scope_type": "form",
+         "value": "交叉比对法",
+         "candidate": "交叉比对法",
+         "link": "新建",
+         "score": 0.6617,
+         "top": [
+          {
+           "name": "对比分析",
+           "score": 0.6617,
+           "path": "/架构/逻辑/信息编排逻辑/归纳论证/分析解读/对比分析"
+          },
+          {
+           "name": "数据对比",
+           "score": 0.6166,
+           "path": "/架构/逻辑/信息编排逻辑/归纳论证/数据实证/数据对比"
+          },
+          {
+           "name": "差异对比",
+           "score": 0.5998,
+           "path": "/架构/创意/对比反差/反差错位/通用反差/差异对比"
+          }
+         ]
+        },
+        {
+         "scope_type": "form",
+         "value": "交集转化",
+         "candidate": "交集转化",
+         "link": "新建",
+         "score": 0.678,
+         "top": [
+          {
+           "name": "符号转化",
+           "score": 0.678,
+           "path": "/架构/修辞/修辞意象/比拟转化/符号转化"
+          },
+          {
+           "name": "转化阐释",
+           "score": 0.6387,
+           "path": "/架构/逻辑/信息编排逻辑/归纳论证/归纳提炼/转化阐释"
+          },
+          {
+           "name": "拟人转化",
+           "score": 0.5867,
+           "path": "/架构/修辞/修辞意象/比拟转化/拟人转化"
+          }
+         ]
+        },
+        {
+         "scope_type": "effect",
+         "value": "情绪信号强化",
+         "candidate": "情绪信号强化",
+         "link": "新建",
+         "score": 0.801,
+         "top": [
+          {
+           "name": "情感强化",
+           "score": 0.801,
+           "path": "/表达/信息传达/传达手法/强调突出/情感强化"
+          },
+          {
+           "name": "论证强化",
+           "score": 0.6296,
+           "path": "/表达/论证说理/分析论证/论证评判/肯定论证/论证强化"
+          },
+          {
+           "name": "情感收束",
+           "score": 0.6189,
+           "path": "/结构/叙事推进/收束归纳/情感收束"
+          }
+         ]
+        },
+        {
+         "scope_type": "effect",
+         "value": "选题冒犯性校准",
+         "candidate": "选题冒犯性校准",
+         "link": "新建",
+         "score": 0.4805,
+         "top": [
+          {
+           "name": "界定范畴",
+           "score": 0.4805,
+           "path": "/表达/论证说理/提炼升华/定义定性/界定范畴"
+          },
+          {
+           "name": "性质定性",
+           "score": 0.4656,
+           "path": "/表达/论证说理/分析论证/论证评判/定性确立/性质定性"
+          },
+          {
+           "name": "引用援引",
+           "score": 0.4621,
+           "path": "/表达/论证说理/证据支撑/引用援引"
+          }
+         ]
+        },
+        {
+         "scope_type": "effect",
+         "value": "羞耻感注入",
+         "candidate": "羞耻感注入",
+         "link": "新建",
+         "score": 0.5476,
+         "top": [
+          {
+           "name": "情感收束",
+           "score": 0.5476,
+           "path": "/结构/叙事推进/收束归纳/情感收束"
+          },
+          {
+           "name": "情感强化",
+           "score": 0.5419,
+           "path": "/表达/信息传达/传达手法/强调突出/情感强化"
+          },
+          {
+           "name": "情感共鸣",
+           "score": 0.5388,
+           "path": "/表达/互动引导/情感连接/情感共鸣"
+          }
+         ]
+        },
+        {
+         "scope_type": "intent",
+         "value": "生成高共鸣选题",
+         "candidate": "生成高共鸣选题",
+         "link": "新建",
+         "score": 0.4688,
+         "top": [
+          {
+           "name": "裂变",
+           "score": 0.4688,
+           "path": "/行为引导/裂变"
+          },
+          {
+           "name": "粉丝互动",
+           "score": 0.4132,
+           "path": "/情感联结/关系维护/粉丝互动"
+          },
+          {
+           "name": "信息扩散",
+           "score": 0.4119,
+           "path": "/信息传递/信息扩散"
+          }
+         ]
+        }
+       ]
+      }
+     ],
+     "dropped": []
+    },
+    {
+     "id": "k2",
+     "type": "what",
+     "role": "主",
+     "parent": null,
+     "title": "好选题的情绪信号",
+     "business_stage": [
+      "选题"
+     ],
+     "出处": [
+      "卡片1",
+      "卡片3",
+      "卡片4",
+      "卡片5",
+      "卡片6",
+      "卡片7"
+     ],
+     "概要": "羞耻感和冒犯感是识别高潜力选题的关键情绪信号。",
+     "kind": "子集",
+     "维度拆分规则": "情绪触发类型",
+     "body": [
+      {
+       "item_name": "羞耻感",
+       "item_desc": "写完后内心犹豫、不好意思、想删掉——因为它触碰了真实但被社交礼仪层层包裹的痛点;是好选题的防伪标签。例:『…写完后感觉羞耻的,因为太正确的选题缺乏情绪共鸣…』",
+       "作用域": []
+      },
+      {
+       "item_name": "冒犯感",
+       "item_desc": "不是脏话式冒犯,而是对大众信奉的‘正确共识’进行温和撕裂,从而触动公共痛点;能引发强烈共鸣。例:『…真正的爆款选题带有冒犯感,不是脏话式的冒犯,而是对正确共识的挑战…』",
+       "作用域": []
+      }
+     ],
+     "作用域": [
+      {
+       "scope_type": "substance",
+       "value": "羞耻感",
+       "candidate": "羞耻感",
+       "link": "新建",
+       "score": 0.6283,
+       "top": [
+        {
+         "name": "情感",
+         "score": 0.6283,
+         "path": "/理念/情感"
+        },
+        {
+         "name": "情绪情感",
+         "score": 0.6224,
+         "path": "/理念/现象/生活状态/个人境遇/身心状态/情绪情感"
+        },
+        {
+         "name": "道德伦理",
+         "score": 0.5963,
+         "path": "/理念/观念/个人观念/处世智慧/道德伦理"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "冒犯感",
+       "candidate": "冒犯感",
+       "link": "新建",
+       "score": 0.5689,
+       "top": [
+        {
+         "name": "情感",
+         "score": 0.5689,
+         "path": "/理念/情感"
+        },
+        {
+         "name": "利益关系",
+         "score": 0.5435,
+         "path": "/理念/知识/政治/国际政治/国际博弈/利益关系"
+        },
+        {
+         "name": "情感表达",
+         "score": 0.5415,
+         "path": "/表象/视觉/行为/人际互动/表达沟通/情感表达"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "情绪信号",
+       "candidate": "情绪信号",
+       "link": "新建",
+       "score": 0.7612,
+       "top": [
+        {
+         "name": "情绪情感",
+         "score": 0.7612,
+         "path": "/理念/现象/生活状态/个人境遇/身心状态/情绪情感"
+        },
+        {
+         "name": "情绪困扰",
+         "score": 0.7127,
+         "path": "/理念/知识/身心科学/心理认知/心理状态问题/情绪困扰"
+        },
+        {
+         "name": "情绪意境",
+         "score": 0.6856,
+         "path": "/表象/视觉/画面/后期/情绪意境"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "社交礼仪包裹痛点",
+       "candidate": "社交礼仪包裹痛点",
+       "link": "新建",
+       "score": 0.627,
+       "top": [
+        {
+         "name": "痛点问题",
+         "score": 0.627,
+         "path": "/理念/知识/商业/产品服务/痛点问题"
+        },
+        {
+         "name": "礼仪规范",
+         "score": 0.6144,
+         "path": "/理念/知识/文化/礼仪习俗/礼仪规范"
+        },
+        {
+         "name": "社交场合",
+         "score": 0.5785,
+         "path": "/表象/视觉/空间/空间场所/生活场景/社交场合"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "公共痛点",
+       "candidate": "公共痛点",
+       "link": "新建",
+       "score": 0.8071,
+       "top": [
+        {
+         "name": "痛点问题",
+         "score": 0.8071,
+         "path": "/理念/知识/商业/产品服务/痛点问题"
+        },
+        {
+         "name": "机构公共事件",
+         "score": 0.5777,
+         "path": "/理念/事件/社会事件/机构公共事件"
+        },
+        {
+         "name": "公共安全",
+         "score": 0.5717,
+         "path": "/理念/现象/社会问题/民生生活/公共安全"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "正确共识挑战",
+       "candidate": "正确共识挑战",
+       "link": "新建",
+       "score": 0.6102,
+       "top": [
+        {
+         "name": "通用共识符号",
+         "score": 0.6102,
+         "path": "/表象/视觉/符号/图案符号/标识图案/通用共识符号"
+        },
+        {
+         "name": "认知思辨",
+         "score": 0.512,
+         "path": "/理念/知识/思想/概念范畴/认知思辨"
+        },
+        {
+         "name": "冲突对抗",
+         "score": 0.5059,
+         "path": "/表象/视觉/行为/人际互动/关系行为/冲突对抗"
+        }
+       ]
+      },
+      {
+       "scope_type": "form",
+       "value": "情绪防伪标签法",
+       "candidate": "情绪防伪标签法",
+       "link": "新建",
+       "score": 0.6535,
+       "top": [
+        {
+         "name": "情绪强化",
+         "score": 0.6535,
+         "path": "/架构/策略/情感调动/情感激发/情绪基调/情绪强化"
+        },
+        {
+         "name": "情绪引导",
+         "score": 0.6233,
+         "path": "/架构/策略/情感调动/情感激发/共鸣触发/情绪引导"
+        },
+        {
+         "name": "标签话术",
+         "score": 0.6138,
+         "path": "/架构/策略/认知引导/话语影响/话术策略/标签话术"
+        }
+       ]
+      },
+      {
+       "scope_type": "effect",
+       "value": "选题真伪甄别",
+       "candidate": "选题真伪甄别",
+       "link": "新建",
+       "score": 0.5416,
+       "top": [
+        {
+         "name": "论证评判",
+         "score": 0.5416,
+         "path": "/表达/论证说理/分析论证/论证评判"
+        },
+        {
+         "name": "印证核实",
+         "score": 0.5377,
+         "path": "/表达/论证说理/证据支撑/印证核实"
+        },
+        {
+         "name": "否定批驳",
+         "score": 0.5248,
+         "path": "/表达/论证说理/分析论证/论证评判/否定驳论/否定批驳"
+        }
+       ]
+      },
+      {
+       "scope_type": "effect",
+       "value": "情绪共鸣触发",
+       "candidate": "情绪共鸣触发",
+       "link": "新建",
+       "score": 0.8255,
+       "top": [
+        {
+         "name": "情感共鸣",
+         "score": 0.8255,
+         "path": "/表达/互动引导/情感连接/情感共鸣"
+        },
+        {
+         "name": "情感连接",
+         "score": 0.6488,
+         "path": "/表达/互动引导/情感连接"
+        },
+        {
+         "name": "情感动员",
+         "score": 0.6475,
+         "path": "/表达/互动引导/情感连接/情感动员"
+        }
+       ]
+      },
+      {
+       "scope_type": "intent",
+       "value": "识别高潜力选题",
+       "candidate": "识别高潜力选题",
+       "link": "新建",
+       "score": 0.452,
+       "top": [
+        {
+         "name": "裂变",
+         "score": 0.452,
+         "path": "/行为引导/裂变"
+        },
+        {
+         "name": "科普",
+         "score": 0.4345,
+         "path": "/信息传递/知识传递/科普"
+        },
+        {
+         "name": "分析",
+         "score": 0.4231,
+         "path": "/信息传递/知识传递/分析"
+        }
+       ]
+      }
+     ],
+     "业务阶段": []
+    },
+    {
+     "id": "k3",
+     "type": "what",
+     "role": "组件",
+     "parent": {
+      "how_id": "k1",
+      "step": 1
+     },
+     "title": "赛道圣经句",
+     "business_stage": [
+      "选题"
+     ],
+     "出处": [
+      "卡片9"
+     ],
+     "概要": "赛道内被广泛默认、反复复述的正确共识性断言,是共识撕裂的起点。",
+     "kind": "子集",
+     "维度拆分规则": "共识性质",
+     "body": [
+      {
+       "item_name": "职场类圣经句",
+       "item_desc": "『能力强的人一定会被看见』",
+       "作用域": []
+      }
+     ],
+     "作用域": [
+      {
+       "scope_type": "substance",
+       "value": "赛道圣经句",
+       "candidate": "赛道圣经句",
+       "link": "新建",
+       "score": 0.5348,
+       "top": [
+        {
+         "name": "人生哲理",
+         "score": 0.5348,
+         "path": "/理念/观念/个人观念/人生感悟/观点表达/人生哲理"
+        },
+        {
+         "name": "标语",
+         "score": 0.5054,
+         "path": "/表象/视觉/符号/文字符号/标语"
+        },
+        {
+         "name": "谚语",
+         "score": 0.5047,
+         "path": "/理念/知识/文化/语言文字/谚语"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "正确共识性断言",
+       "candidate": "正确共识性断言",
+       "link": "新建",
+       "score": 0.6055,
+       "top": [
+        {
+         "name": "通用共识符号",
+         "score": 0.6055,
+         "path": "/表象/视觉/符号/图案符号/标识图案/通用共识符号"
+        },
+        {
+         "name": "因果推理",
+         "score": 0.4928,
+         "path": "/理念/知识/思想/逻辑原理/因果推理"
+        },
+        {
+         "name": "认知思辨",
+         "score": 0.4821,
+         "path": "/理念/知识/思想/概念范畴/认知思辨"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "广泛默认断言",
+       "candidate": "广泛默认断言",
+       "link": "新建",
+       "score": 0.4918,
+       "top": [
+        {
+         "name": "程度范围",
+         "score": 0.4918,
+         "path": "/理念/知识/思想/概念范畴/性质属性/程度范围"
+        },
+        {
+         "name": "逻辑异常",
+         "score": 0.4818,
+         "path": "/理念/知识/思想/逻辑原理/逻辑异常"
+        },
+        {
+         "name": "通用共识符号",
+         "score": 0.4695,
+         "path": "/表象/视觉/符号/图案符号/标识图案/通用共识符号"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "反复复述共识",
+       "candidate": "反复复述共识",
+       "link": "新建",
+       "score": 0.5451,
+       "top": [
+        {
+         "name": "通用共识符号",
+         "score": 0.5451,
+         "path": "/表象/视觉/符号/图案符号/标识图案/通用共识符号"
+        },
+        {
+         "name": "立场表达",
+         "score": 0.4944,
+         "path": "/理念/知识/政治/国际政治/外交立场/立场表达"
+        },
+        {
+         "name": "集体记忆",
+         "score": 0.492,
+         "path": "/理念/知识/文化/传统文化/文化知识/集体记忆"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "共识撕裂起点",
+       "candidate": "共识撕裂起点",
+       "link": "新建",
+       "score": 0.5664,
+       "top": [
+        {
+         "name": "通用共识符号",
+         "score": 0.5664,
+         "path": "/表象/视觉/符号/图案符号/标识图案/通用共识符号"
+        },
+        {
+         "name": "冲突对抗",
+         "score": 0.5146,
+         "path": "/表象/视觉/行为/人际互动/关系行为/冲突对抗"
+        },
+        {
+         "name": "地缘冲突",
+         "score": 0.5063,
+         "path": "/理念/知识/政治/国际政治/地缘政治/地缘冲突"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "职场类圣经句",
+       "candidate": "职场类圣经句",
+       "link": "新建",
+       "score": 0.6158,
+       "top": [
+        {
+         "name": "职场境遇",
+         "score": 0.6158,
+         "path": "/理念/现象/生活状态/个人境遇/职场境遇"
+        },
+        {
+         "name": "职场劳作",
+         "score": 0.6049,
+         "path": "/表象/视觉/行为/日常活动/职场劳作"
+        },
+        {
+         "name": "人生哲理",
+         "score": 0.5466,
+         "path": "/理念/观念/个人观念/人生感悟/观点表达/人生哲理"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "能力强的人一定会被看见",
+       "candidate": "能力强的人一定会被看见",
+       "link": "新建",
+       "score": 0.5232,
+       "top": [
+        {
+         "name": "运营能力",
+         "score": 0.5232,
+         "path": "/理念/知识/商业/运营策略/运营能力"
+        },
+        {
+         "name": "实力概念",
+         "score": 0.517,
+         "path": "/理念/知识/政治/国家治理/国家实力/实力概念"
+        },
+        {
+         "name": "因果报应",
+         "score": 0.4883,
+         "path": "/理念/观念/个人观念/处世智慧/道德伦理/因果报应"
+        }
+       ]
+      },
+      {
+       "scope_type": "form",
+       "value": "共识类型",
+       "candidate": "共识类型",
+       "link": "新建",
+       "score": 0.6861,
+       "top": [
+        {
+         "name": "共识论证",
+         "score": 0.6861,
+         "path": "/架构/逻辑/信息编排逻辑/归纳论证/共识论证"
+        },
+        {
+         "name": "框架类型",
+         "score": 0.6225,
+         "path": "/架构/叙事/叙事组织/脉络铺排/结构编排/框架类型"
+        },
+        {
+         "name": "声音类型",
+         "score": 0.6209,
+         "path": "/呈现/听觉/配乐/声音类型"
+        }
+       ]
+      },
+      {
+       "scope_type": "effect",
+       "value": "共识锚定",
+       "candidate": "共识锚定",
+       "link": "新建",
+       "score": 0.5709,
+       "top": [
+        {
+         "name": "闭环收束",
+         "score": 0.5709,
+         "path": "/结构/叙事推进/收束归纳/闭环收束"
+        },
+        {
+         "name": "论点加固",
+         "score": 0.567,
+         "path": "/表达/信息传达/传达手法/强调突出/论点加固"
+        },
+        {
+         "name": "情感收束",
+         "score": 0.5482,
+         "path": "/结构/叙事推进/收束归纳/情感收束"
+        }
+       ]
+      },
+      {
+       "scope_type": "intent",
+       "value": "界定共识基线",
+       "candidate": "界定共识基线",
+       "link": "新建",
+       "score": 0.466,
+       "top": [
+        {
+         "name": "事实呈现",
+         "score": 0.466,
+         "path": "/信息传递/事实呈现"
+        },
+        {
+         "name": "解读",
+         "score": 0.4599,
+         "path": "/信息传递/知识传递/解读"
+        },
+        {
+         "name": "行为引导",
+         "score": 0.457,
+         "path": "/行为引导"
+        }
+       ]
+      }
+     ],
+     "业务阶段": []
+    },
+    {
+     "id": "k4",
+     "type": "why",
+     "role": "主",
+     "parent": null,
+     "title": "羞耻感作为选题信号的原理",
+     "business_stage": [
+      "选题"
+     ],
+     "出处": [
+      "卡片3",
+      "卡片4",
+      "卡片7"
+     ],
+     "阐述": "羞耻感是好选题的防伪标签,因为它意味着内容触碰了真实存在但被社交礼仪、群体沉默或自我审查层层包裹的痛点;这种包裹使痛点难以被公开讨论,一旦被精准表达,就会引发强烈情绪共鸣。而没有情绪触发的内容不可能爆红,安全的选题等于无感——写完后内心没有波澜、觉得没问题,大概率是无效选题;反之,写完后有点犹豫或不好意思,则可能是好选题。",
+     "作用域": [
+      {
+       "scope_type": "substance",
+       "value": "羞耻感",
+       "candidate": "羞耻感",
+       "link": "新建",
+       "score": 0.6273,
+       "top": [
+        {
+         "name": "情感",
+         "score": 0.6273,
+         "path": "/理念/情感"
+        },
+        {
+         "name": "情绪情感",
+         "score": 0.6212,
+         "path": "/理念/现象/生活状态/个人境遇/身心状态/情绪情感"
+        },
+        {
+         "name": "道德伦理",
+         "score": 0.5949,
+         "path": "/理念/观念/个人观念/处世智慧/道德伦理"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "社交礼仪包裹痛点",
+       "candidate": "社交礼仪包裹痛点",
+       "link": "新建",
+       "score": 0.627,
+       "top": [
+        {
+         "name": "痛点问题",
+         "score": 0.627,
+         "path": "/理念/知识/商业/产品服务/痛点问题"
+        },
+        {
+         "name": "礼仪规范",
+         "score": 0.6144,
+         "path": "/理念/知识/文化/礼仪习俗/礼仪规范"
+        },
+        {
+         "name": "社交场合",
+         "score": 0.5785,
+         "path": "/表象/视觉/空间/空间场所/生活场景/社交场合"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "群体沉默",
+       "candidate": "群体沉默",
+       "link": "新建",
+       "score": 0.7098,
+       "top": [
+        {
+         "name": "群体",
+         "score": 0.7098,
+         "path": "/表象/视觉/实体/人物/群体"
+        },
+        {
+         "name": "群体境遇",
+         "score": 0.6675,
+         "path": "/理念/现象/生活状态/个人境遇/群体境遇"
+        },
+        {
+         "name": "集体记忆",
+         "score": 0.6634,
+         "path": "/理念/知识/文化/传统文化/文化知识/集体记忆"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "自我审查",
+       "candidate": "自我审查",
+       "link": "新建",
+       "score": 0.6629,
+       "top": [
+        {
+         "name": "自我关怀",
+         "score": 0.6629,
+         "path": "/理念/观念/个人观念/人生感悟/人生态度/自我关怀"
+        },
+        {
+         "name": "内省沉思",
+         "score": 0.6172,
+         "path": "/表象/视觉/画面/后期/情绪意境/内省沉思"
+        },
+        {
+         "name": "价值观反思",
+         "score": 0.568,
+         "path": "/理念/现象/社会问题/文化精神/价值观反思"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "情绪共鸣触发机制",
+       "candidate": "情绪共鸣触发机制",
+       "link": "新建",
+       "score": 0.6777,
+       "top": [
+        {
+         "name": "情绪情感",
+         "score": 0.6777,
+         "path": "/理念/现象/生活状态/个人境遇/身心状态/情绪情感"
+        },
+        {
+         "name": "情绪意境",
+         "score": 0.6414,
+         "path": "/表象/视觉/画面/后期/情绪意境"
+        },
+        {
+         "name": "生理机制",
+         "score": 0.6218,
+         "path": "/理念/知识/身心科学/健康养生/身体健康/生理机制"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "理性认知缺口",
+       "candidate": "理性认知缺口",
+       "link": "新建",
+       "score": 0.6684,
+       "top": [
+        {
+         "name": "认知思辨",
+         "score": 0.6684,
+         "path": "/理念/知识/思想/概念范畴/认知思辨"
+        },
+        {
+         "name": "心理认知",
+         "score": 0.666,
+         "path": "/理念/知识/身心科学/心理认知"
+        },
+        {
+         "name": "心理认知偏差",
+         "score": 0.6518,
+         "path": "/理念/知识/身心科学/心理认知/心理状态问题/心理认知偏差"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "感性情绪开关",
+       "candidate": "感性情绪开关",
+       "link": "新建",
+       "score": 0.671,
+       "top": [
+        {
+         "name": "情绪情感",
+         "score": 0.671,
+         "path": "/理念/现象/生活状态/个人境遇/身心状态/情绪情感"
+        },
+        {
+         "name": "情感",
+         "score": 0.6387,
+         "path": "/理念/情感"
+        },
+        {
+         "name": "情绪意境",
+         "score": 0.6351,
+         "path": "/表象/视觉/画面/后期/情绪意境"
+        }
+       ]
+      },
+      {
+       "scope_type": "effect",
+       "value": "痛点精准表达",
+       "candidate": "痛点精准表达",
+       "link": "新建",
+       "score": 0.5965,
+       "top": [
+        {
+         "name": "核心点明",
+         "score": 0.5965,
+         "path": "/表达/信息传达/传达手法/强调突出/核心点明"
+        },
+        {
+         "name": "情感表达",
+         "score": 0.5853,
+         "path": "/表达/情感表达"
+        },
+        {
+         "name": "表达",
+         "score": 0.5685,
+         "path": "/表达"
+        }
+       ]
+      },
+      {
+       "scope_type": "effect",
+       "value": "情绪共振密度构建",
+       "candidate": "情绪共振密度构建",
+       "link": "新建",
+       "score": 0.6511,
+       "top": [
+        {
+         "name": "情感共鸣",
+         "score": 0.6511,
+         "path": "/表达/互动引导/情感连接/情感共鸣"
+        },
+        {
+         "name": "高潮构建",
+         "score": 0.627,
+         "path": "/结构/叙事推进/叙事推进节点/高潮构建"
+        },
+        {
+         "name": "情感收束",
+         "score": 0.596,
+         "path": "/结构/叙事推进/收束归纳/情感收束"
+        }
+       ]
+      },
+      {
+       "scope_type": "effect",
+       "value": "选题无效性排除",
+       "candidate": "选题无效性排除",
+       "link": "新建",
+       "score": 0.5388,
+       "top": [
+        {
+         "name": "否定驳论",
+         "score": 0.5388,
+         "path": "/表达/论证说理/分析论证/论证评判/否定驳论"
+        },
+        {
+         "name": "否定批驳",
+         "score": 0.5374,
+         "path": "/表达/论证说理/分析论证/论证评判/否定驳论/否定批驳"
+        },
+        {
+         "name": "界定范畴",
+         "score": 0.4983,
+         "path": "/表达/论证说理/提炼升华/定义定性/界定范畴"
+        }
+       ]
+      },
+      {
+       "scope_type": "intent",
+       "value": "解释羞耻感的选题价值",
+       "candidate": "解释羞耻感的选题价值",
+       "link": "新建",
+       "score": 0.3797,
+       "top": [
+        {
+         "name": "揭露",
+         "score": 0.3797,
+         "path": "/信息传递/事实呈现/揭露"
+        },
+        {
+         "name": "情感抒发",
+         "score": 0.3778,
+         "path": "/情感联结/情感抒发"
+        },
+        {
+         "name": "解读",
+         "score": 0.3679,
+         "path": "/信息传递/知识传递/解读"
+        }
+       ]
+      }
+     ],
+     "业务阶段": []
+    },
+    {
+     "id": "k5",
+     "type": "why",
+     "role": "组件",
+     "parent": {
+      "how_id": "k1",
+      "step": 4
+     },
+     "title": "交叉验证提升选题共鸣效力的原理",
+     "business_stage": [
+      "选题"
+     ],
+     "出处": [
+      "卡片1",
+      "卡片5",
+      "卡片6",
+      "卡片11"
+     ],
+     "阐述": "共识失灵场景代表结构性矛盾,竞品评论区沉默痛点代表已被市场验证的个体压抑体验;二者的交集既具备现实根基又自带情感共振密度,因此转化出的选题能同时击中理性认知缺口与感性情绪开关,形成不可替代的共鸣效力。",
+     "作用域": [
+      {
+       "scope_type": "substance",
+       "value": "共识失灵场景",
+       "candidate": "共识失灵场景",
+       "link": "新建",
+       "score": 0.5923,
+       "top": [
+        {
+         "name": "使用场景",
+         "score": 0.5923,
+         "path": "/理念/知识/商业/产品服务/使用场景"
+        },
+        {
+         "name": "通用共识符号",
+         "score": 0.5892,
+         "path": "/表象/视觉/符号/图案符号/标识图案/通用共识符号"
+        },
+        {
+         "name": "场景感悟",
+         "score": 0.5638,
+         "path": "/理念/观念/个人观念/人生感悟/观点表达/场景感悟"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "竞品评论区沉默痛点",
+       "candidate": "竞品评论区沉默痛点",
+       "link": "新建",
+       "score": 0.6387,
+       "top": [
+        {
+         "name": "痛点问题",
+         "score": 0.6387,
+         "path": "/理念/知识/商业/产品服务/痛点问题"
+        },
+        {
+         "name": "产品矩阵",
+         "score": 0.5079,
+         "path": "/理念/知识/商业/产品服务/产品矩阵"
+        },
+        {
+         "name": "政策评论",
+         "score": 0.5053,
+         "path": "/理念/观念/社会观念/时政评议/政策评论"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "结构性矛盾",
+       "candidate": "结构性矛盾",
+       "link": "新建",
+       "score": 0.6542,
+       "top": [
+        {
+         "name": "利益矛盾",
+         "score": 0.6542,
+         "path": "/理念/现象/社会问题/民生生活/利益矛盾"
+        },
+        {
+         "name": "社会结构",
+         "score": 0.59,
+         "path": "/理念/知识/社会知识/社会结构"
+        },
+        {
+         "name": "制度问题",
+         "score": 0.5683,
+         "path": "/理念/知识/政治/国家治理/政策制度/制度问题"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "个体压抑体验",
+       "candidate": "个体压抑体验",
+       "link": "新建",
+       "score": 0.6593,
+       "top": [
+        {
+         "name": "个体",
+         "score": 0.6593,
+         "path": "/表象/视觉/实体/人物/个体"
+        },
+        {
+         "name": "情感体验",
+         "score": 0.6316,
+         "path": "/理念/观念/个人观念/人生感悟/内心感受/情感体验"
+        },
+        {
+         "name": "群体境遇",
+         "score": 0.591,
+         "path": "/理念/现象/生活状态/个人境遇/群体境遇"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "理性认知缺口",
+       "candidate": "理性认知缺口",
+       "link": "新建",
+       "score": 0.6648,
+       "top": [
+        {
+         "name": "认知思辨",
+         "score": 0.6648,
+         "path": "/理念/知识/思想/概念范畴/认知思辨"
+        },
+        {
+         "name": "心理认知",
+         "score": 0.6624,
+         "path": "/理念/知识/身心科学/心理认知"
+        },
+        {
+         "name": "心理认知偏差",
+         "score": 0.6479,
+         "path": "/理念/知识/身心科学/心理认知/心理状态问题/心理认知偏差"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "感性情绪开关",
+       "candidate": "感性情绪开关",
+       "link": "新建",
+       "score": 0.6691,
+       "top": [
+        {
+         "name": "情绪情感",
+         "score": 0.6691,
+         "path": "/理念/现象/生活状态/个人境遇/身心状态/情绪情感"
+        },
+        {
+         "name": "情感",
+         "score": 0.6358,
+         "path": "/理念/情感"
+        },
+        {
+         "name": "情绪意境",
+         "score": 0.6328,
+         "path": "/表象/视觉/画面/后期/情绪意境"
+        }
+       ]
+      },
+      {
+       "scope_type": "effect",
+       "value": "交叉",
+       "candidate": "交叉",
+       "link": "新建",
+       "score": 0.458,
+       "top": [
+        {
+         "name": "维度对比",
+         "score": 0.458,
+         "path": "/表达/论证说理/分析论证/对比反差/维度对比"
+        },
+        {
+         "name": "视角转换",
+         "score": 0.4567,
+         "path": "/结构/叙事推进/承接转换/视角转换"
+        },
+        {
+         "name": "闭环收束",
+         "score": 0.4519,
+         "path": "/结构/叙事推进/收束归纳/闭环收束"
+        }
+       ]
+      },
+      {
+       "scope_type": "effect",
+       "value": "共鸣效力叠加",
+       "candidate": "共鸣效力叠加",
+       "link": "新建",
+       "score": 0.6443,
+       "top": [
+        {
+         "name": "情感共鸣",
+         "score": 0.6443,
+         "path": "/表达/互动引导/情感连接/情感共鸣"
+        },
+        {
+         "name": "属性效能",
+         "score": 0.5841,
+         "path": "/表达/信息传达/传达手法/强调突出/属性效能"
+        },
+        {
+         "name": "强化收束",
+         "score": 0.5662,
+         "path": "/结构/叙事推进/收束归纳/强化收束"
+        }
+       ]
+      },
+      {
+       "scope_type": "effect",
+       "value": "不可替代性",
+       "candidate": "不可替代性",
+       "link": "新建",
+       "score": 0.5362,
+       "top": [
+        {
+         "name": "价值肯定",
+         "score": 0.5362,
+         "path": "/表达/论证说理/分析论证/论证评判/肯定论证/价值肯定"
+        },
+        {
+         "name": "地位确认",
+         "score": 0.5034,
+         "path": "/表达/论证说理/分析论证/论证评判/定性确立/地位确认"
+        },
+        {
+         "name": "逻辑自洽",
+         "score": 0.5021,
+         "path": "/结构/叙事推进/收束归纳/闭环收束/逻辑自洽"
+        }
+       ]
+      },
+      {
+       "scope_type": "intent",
+       "value": "阐明交叉验证原理",
+       "candidate": "阐明交叉验证原理",
+       "link": "新建",
+       "score": 0.431,
+       "top": [
+        {
+         "name": "科普",
+         "score": 0.431,
+         "path": "/信息传递/知识传递/科普"
+        },
+        {
+         "name": "解读",
+         "score": 0.4181,
+         "path": "/信息传递/知识传递/解读"
+        },
+        {
+         "name": "事实呈现",
+         "score": 0.3974,
+         "path": "/信息传递/事实呈现"
+        }
+       ]
+      }
+     ],
+     "业务阶段": []
+    }
+   ]
+  }
+ ]
+}

+ 472 - 0
app/frontend/dist/legacy-decode/index.html

@@ -0,0 +1,472 @@
+<!doctype html>
+<html lang="zh">
+<head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<title>创作知识的解构</title>
+<script crossorigin src="https://unpkg.com/react@18/umd/react.production.min.js"></script>
+<script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js"></script>
+<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
+<style>
+  *{box-sizing:border-box}
+  html,body{margin:0;padding:0;font-family:-apple-system,"PingFang SC","Microsoft YaHei",sans-serif;font-size:13px;color:#111827;background:#f5f5f7;height:100vh;overflow:hidden}
+  .app{height:100vh;display:flex;flex-direction:column}
+  header.top{padding:11px 18px 9px;background:#fff;border-bottom:1px solid #e5e7eb;flex:none}
+  header.top h1{margin:0 0 7px;font-size:16px;font-weight:600}
+  .picker{display:flex;gap:6px;flex-wrap:wrap;align-items:center}
+  .picker .lab{font-size:11.5px;color:#9ca3af;margin-right:2px}
+  .pill{font-size:12px;padding:4px 11px;border-radius:14px;border:1px solid #e5e7eb;background:#fff;color:#6b7280;cursor:pointer}
+  .pill:hover{background:#f3f4f6}
+  .pill.on{background:#1e293b;color:#fff;border-color:#1e293b;font-weight:600}
+  .pill .n{font-size:10px;opacity:.7;margin-left:4px}
+  .scroll{flex:1;overflow:auto;background:#f5f5f7;padding-bottom:40px}
+  details.src{margin:10px 18px 0;background:#fff;border:1px solid #e2e8f0;border-radius:6px}
+  details.src summary{padding:8px 14px;cursor:pointer;font-size:12px;color:#475569;list-style:none}
+  details.src summary::before{content:'▶ ';color:#94a3b8;font-size:10px}
+  details.src[open] summary::before{content:'▼ '}
+  .srcbody{padding:4px 16px 12px;font-size:12px}
+  .srcbody a{color:#2563eb;word-break:break-all}
+  .srcprompt{color:#0e7490;font-size:11.5px;cursor:pointer}.srcprompt:hover{text-decoration:underline}
+  .srcimgs{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
+  .srcimgs img{width:80px;height:80px;object-fit:cover;border-radius:4px;border:1px solid #e2e8f0;cursor:zoom-in}
+  .barhint{margin:8px 18px 0;font-size:11.5px;color:#6b7280}
+  .ribbon{margin:11px 18px 0;background:#fff;border:1px solid #e2e8f0;border-radius:8px;padding:10px 14px}
+  .rcap{font-size:11.5px;color:#6b7280;margin-bottom:8px}
+  .rsteps{display:flex;align-items:stretch;flex-wrap:wrap}
+  .rstep{flex:1;min-width:118px;border:1px solid #e2e8f0;border-radius:8px;padding:8px 9px;cursor:pointer;background:#f8fafc}
+  .rstep:hover{background:#ecfeff;border-color:#99d5d0}
+  .rstep.auto{cursor:default;background:#f1f5f9;opacity:.9}.rstep.auto:hover{background:#f1f5f9;border-color:#e2e8f0}
+  .rtop{display:flex;align-items:center;gap:7px}
+  .rn{width:18px;height:18px;border-radius:50%;background:#0e7490;color:#fff;font-size:11px;display:flex;align-items:center;justify-content:center;flex:none}
+  .rstep.auto .rn{background:#94a3b8}
+  .rlab{font-size:13.5px;font-weight:600}
+  .rdesc{font-size:11.5px;color:#6b7280;margin:5px 0 7px;line-height:1.5}
+  .rbtn{font-size:11.5px;color:#0e7490}.rstep.auto .rbtn{color:#94a3b8}
+  .rarrow{display:flex;align-items:center;color:#cbd5e1;font-size:18px;padding:0 4px;flex:none}
+  .pmwhy{font-size:12.5px;color:#92400e;background:#fffbeb;border:1px solid #fde68a;border-radius:6px;padding:8px 11px;margin-bottom:12px;line-height:1.6}
+  .pmwhy b{color:#78350f}
+  .lbtn{padding:3px 9px;border:1px solid #cbd5e1;border-radius:5px;background:#fff;cursor:pointer;font-size:11.5px;color:#334155;font-family:inherit}
+  .lbtn:hover{background:#f1f5f9}.lbtn.on{background:#fef3c7;border-color:#d97706;color:#92400e;font-weight:600}
+  /* 颗卡 */
+  .kcard{margin:12px 18px 0;background:#fff;border:1px solid #e2e8f0;border-radius:8px;overflow:hidden}
+  .khead{display:flex;align-items:center;gap:8px;padding:9px 14px;border-bottom:1px solid #eef2f7;flex-wrap:wrap}
+  .kno{font-size:11px;font-weight:700;color:#fff;background:#475569;border-radius:4px;padding:1px 7px}
+  .ktype{font-size:11px;font-weight:700;border-radius:4px;padding:1px 8px}
+  .ty-how{background:#cffafe;color:#155e75}.ty-what{background:#fae8ff;color:#86198f}.ty-why{background:#fef9c3;color:#854d0e}
+  .ktitle{font-size:14px;font-weight:600}
+  .krole{font-size:10.5px;padding:1px 6px;border-radius:3px;background:#f1f5f9;color:#64748b}
+  .kref{font-size:11px;color:#0e7490;cursor:pointer}.kref:hover{text-decoration:underline}
+  .srcbtn{cursor:pointer;color:#0e7490;margin-left:3px;user-select:none}.srcbtn:hover{color:#155e75}
+  .srccard{border:1px solid #e2e8f0;border-radius:6px;padding:8px 10px;margin:8px 0;background:#f8fafc}
+  .srccard .ci{font-size:11.5px;color:#6b7280;font-weight:600;margin-bottom:5px}
+  .srccard img{max-width:100%;max-height:360px;border-radius:5px;border:1px solid #e2e8f0;cursor:zoom-in}
+  .srccard video{max-width:100%;max-height:300px;border-radius:5px}
+  .srcread{font-size:12.5px;color:#1f2937;line-height:1.6;margin-top:6px;background:#fff;border-left:3px solid #0e7490;padding:6px 9px}
+  .kbiz{font-size:11px;padding:1px 7px;border-radius:3px;background:#fef3c7;color:#92400e}
+  .kacts{margin-left:auto;display:flex;gap:6px}
+  .kbody{padding:6px 14px 13px}
+  /* how 工序表 */
+  .twrap{overflow:auto;border:1px solid #e5e7eb;border-radius:6px;margin-top:8px}
+  table.proc{width:max-content;min-width:100%;border-collapse:collapse;font-size:12px}
+  table.proc th,table.proc td{border:1px solid #e5e7eb;padding:6px 8px;vertical-align:top;line-height:1.5}
+  table.proc thead th{font-weight:600;text-align:center;font-size:12px;position:sticky;top:0;z-index:3}
+  table.proc thead tr:nth-child(2) th{top:30px}
+  td.idx{width:30px;text-align:center;color:#6b7280;background:#f8fafc}
+  th.c-intent,td.intent{width:210px;min-width:210px;max-width:210px;white-space:pre-wrap}
+  th.c-cstage,td.cstage{width:54px;text-align:center;background:#ecfeff}
+  th.c-act,td.act{min-width:110px;max-width:140px;word-break:break-word;background:#ecfeff}
+  th.c-dir,td.dir{min-width:230px;max-width:330px;white-space:pre-wrap;word-break:break-word;background:#ecfeff}
+  th.c-out,td.out{min-width:160px;max-width:240px;white-space:pre-wrap;background:#ecfeff}
+  th.c-scope,td.scope{width:92px;min-width:92px;max-width:92px;word-break:break-word}
+  th.g-frame{background:#0e7490;color:#fff}
+  th.g-scope{background:#7c3aed;color:#fff}
+  th.cstage-h{cursor:pointer}th.cstage-h:hover{background:#0e7490}
+  th.c-idx{background:#475569;color:#fff;vertical-align:middle}
+  thead tr:nth-child(2) th.c-intent,thead tr:nth-child(2) th.c-cstage,thead tr:nth-child(2) th.c-act,thead tr:nth-child(2) th.c-dir,thead tr:nth-child(2) th.c-out{background:#0891b2;color:#fff}
+  thead tr:nth-child(2) th.s-substance{background:#dc2626;color:#fff}thead tr:nth-child(2) th.s-form{background:#2563eb;color:#fff}
+  thead tr:nth-child(2) th.s-feeling{background:#db2777;color:#fff}thead tr:nth-child(2) th.s-effect{background:#16a34a;color:#fff}thead tr:nth-child(2) th.s-intent{background:#d97706;color:#fff}
+  td.scope.s-substance{background:#fef2f2}td.scope.s-form{background:#eff6ff}td.scope.s-feeling{background:#fdf2f8}td.scope.s-effect{background:#f0fdf4}td.scope.s-intent{background:#fffbeb}
+  tr.step>td{border-top:1.5px solid #cbd5e1}
+  .cstage-chip{display:inline-block;font-size:11px;padding:1px 6px;border-radius:10px;background:#ede9fe;color:#5b21b6}
+  .act-chip{display:inline-block;font-size:11.5px;padding:1px 7px;border-radius:4px;background:#fff7ed;color:#9a3412;border:1px solid #fed7aa}
+  .dir-txt{font-size:11.5px;color:#33312c;line-height:1.65}.out-txt{font-size:11.5px;color:#166534}
+  .in-txt{font-size:11.5px;color:#1e40af;line-height:1.6}
+  .cue{font-size:11px;color:#7c2d12;background:#fff7ed;border-left:2px solid #fb923c;padding:3px 7px;margin-top:4px;border-radius:0 4px 4px 0}
+  .cue b{color:#9a3412}
+  .kindb{font-size:10.5px;font-weight:700;padding:1px 8px;border-radius:9px;margin-right:8px;vertical-align:middle}
+  .kind-子集{background:#dbeafe;color:#1e40af}.kind-多维关系{background:#dcfce7;color:#166534}.kind-序列{background:#fef3c7;color:#92400e}
+  .dimrule{font-size:10.5px;padding:1px 8px;border-radius:9px;background:#ecfccb;color:#3f6212;margin-right:8px;vertical-align:middle}
+  .ksec-f.key{background:#fde68a;color:#92400e;font-weight:700}
+  .glossbtn{background:#ede9fe!important;color:#6d28d9!important;border-color:#ddd6fe!important}
+  .from{font-size:11px;color:#9ca3af}
+  /* what/why 自由小节 */
+  .def{font-size:13px;background:#fdf4ff;border-left:3px solid #a21caf;border-radius:0 6px 6px 0;padding:8px 12px;margin:6px 0 10px}
+  .ksec{margin:9px 0;padding-left:11px;border-left:3px solid #e2e8f0}
+  .ksec-h{display:flex;align-items:center;gap:7px;margin-bottom:4px}
+  .ksec-t{font-size:13px;font-weight:600;color:#334155}
+  .ksec-f{font-size:10.5px;padding:1px 7px;border-radius:9px;background:#f1f5f9;color:#64748b}
+  .ksec-c{font-size:12.5px;line-height:1.65;color:#1f2937;margin-bottom:4px}
+  table.elem{border-collapse:collapse;width:100%;font-size:12.5px}
+  table.elem td{border:1px solid #f0e6f5;padding:6px 10px;text-align:left;vertical-align:top}
+  table.elem td.el{font-weight:600;color:#86198f;background:#fdf4ff;width:130px}
+  /* why 论点卡 */
+  .why-row{display:flex;gap:10px;margin:7px 0}
+  .why-lab{font-size:11px;font-weight:700;border-radius:4px;padding:2px 8px;flex:none;height:20px}
+  .wl-claim{background:#fef9c3;color:#854d0e}.wl-basis{background:#e0e7ff;color:#3730a3}.wl-impact{background:#dcfce7;color:#166534}
+  .why-txt{font-size:12.5px;line-height:1.65;color:#1f2937}
+  .why-exp{font-size:12.5px;line-height:1.72;color:#1f2937;background:#fdf4ff;border-left:3px solid #a21caf;border-radius:0 6px 6px 0;padding:9px 13px;margin:6px 0}
+  /* 颗级作用域 */
+  .kscopes{margin-top:9px;display:flex;gap:5px;flex-wrap:wrap;align-items:center}
+  .kscopes .lab{font-size:11px;color:#9ca3af}
+  .sv{display:inline-block;cursor:pointer;font-size:11.5px;padding:1px 5px;border-radius:3px;border:1px solid rgba(0,0,0,.08);background:rgba(255,255,255,.7);margin:1px 0}
+  .sv:hover{box-shadow:0 0 0 1px #1e293b}
+  .sv .k{font-size:11.5px;opacity:.85;font-weight:700;margin-right:4px}
+  table.proc th.c-scope{font-size:13.5px}
+  .sv .mk{font-size:9px;padding:0 3px;border-radius:2px;margin-left:3px;vertical-align:top}
+  .mk-new{background:#fde68a;color:#92400e}.mk-reuse{background:#bbf7d0;color:#166534}
+  .sv.s-substance{background:#fef2f2}.sv.s-form{background:#eff6ff}.sv.s-feeling{background:#fdf2f8}.sv.s-effect{background:#f0fdf4}.sv.s-intent{background:#fffbeb}
+  body.hl .sv .mk-new{outline:2px solid #d97706}
+  /* drawer + modal */
+  .ov{position:fixed;inset:0;background:rgba(0,0,0,.35);z-index:100}
+  .drawer{position:fixed;right:0;top:0;bottom:0;width:440px;max-width:92vw;background:#fff;box-shadow:-4px 0 16px rgba(0,0,0,.15);z-index:101;overflow-y:auto}
+  .drawer h2{margin:0;padding:13px 16px;background:#1e293b;color:#fff;font-size:14px;display:flex;align-items:center}
+  .drawer h2 .x{margin-left:auto;cursor:pointer;font-size:18px}
+  .dc{padding:14px 16px;font-size:12.5px;line-height:1.6}.dc .row{margin:6px 0}.dc b{color:#374151}
+  .verdict{display:inline-block;padding:2px 9px;border-radius:5px;font-weight:600;font-size:12px}
+  .v-new{background:#fef3c7;color:#92400e}.v-reuse{background:#dcfce7;color:#166534}
+  .nn{margin:5px 0;padding:7px 10px;border:1px solid #e5e7eb;border-radius:5px;background:#f8fafc}
+  .nn .nm{font-weight:600}.nn .sc{float:right;color:#6b7280;font-family:ui-monospace,monospace}
+  .nn .pth{color:#9ca3af;font-size:11px;font-family:ui-monospace,monospace;word-break:break-all}
+  .modal{position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:110;display:flex;align-items:center;justify-content:center;padding:20px}
+  .mbox{background:#fff;width:760px;max-width:94vw;max-height:86vh;border-radius:10px;overflow:hidden;display:flex;flex-direction:column}
+  .mbox h2{margin:0;padding:13px 18px;background:#0f766e;color:#fff;font-size:14px;display:flex;align-items:center}
+  .mbox h2 .x{margin-left:auto;cursor:pointer;font-size:18px}
+  .mbox .body{padding:15px 18px;overflow:auto}.mbox pre{margin:0;font:12.5px/1.7 ui-monospace,Menlo,monospace;white-space:pre-wrap;color:#1f2937}
+  /* 提示词 Markdown 渲染 */
+  .md{font-size:13px;line-height:1.7;color:#1f2937}
+  .md h3{font-size:16px;margin:18px 0 8px;padding-bottom:5px;border-bottom:2px solid #0f766e;color:#0f766e}
+  .md h4{font-size:14px;margin:15px 0 6px;color:#0f766e}
+  .md h5,.md h6{font-size:13px;margin:12px 0 5px;color:#115e59}
+  .md p{margin:8px 0}
+  .md strong{color:#9a3412;font-weight:700}
+  .md code{background:#f1f5f9;color:#be123c;padding:1px 5px;border-radius:4px;font:12px ui-monospace,Menlo,monospace}
+  .md pre{background:#0f172a;border-radius:8px;padding:12px 14px;overflow-x:auto;margin:10px 0}
+  .md pre code{background:none;color:#e2e8f0;padding:0;font-size:12px;line-height:1.6}
+  .md blockquote{margin:10px 0;padding:8px 12px;background:#f0fdfa;border-left:3px solid #14b8a6;border-radius:0 6px 6px 0;color:#134e4a}
+  .md ul,.md ol{margin:8px 0;padding-left:22px}.md li{margin:4px 0}
+  .md hr{border:none;border-top:1px dashed #cbd5e1;margin:14px 0}
+  .md table{border-collapse:collapse;width:100%;margin:10px 0;font-size:12.5px}
+  .md th,.md td{border:1px solid #cbd5e1;padding:6px 9px;text-align:left;vertical-align:top}
+  .md th{background:#0f766e;color:#fff;font-weight:600;white-space:nowrap}
+  .md tbody tr:nth-child(even){background:#f8fafc}
+  .md a{color:#0e7490;text-decoration:underline}
+  .md .ptag{font-size:14px;font-weight:700;color:#0f766e;margin:16px 0 7px;padding:4px 10px;background:#ccfbf1;border-radius:6px;display:inline-block}
+  .md .ptag-ex{font-size:12px;font-weight:600;color:#92400e;background:#fef3c7;margin:11px 0 5px;padding:2px 9px}
+  .md .ptag-sub{font-weight:400;font-size:11.5px;opacity:.8;margin-left:7px}
+  .lb{position:fixed;inset:0;background:rgba(0,0,0,.85);display:flex;align-items:center;justify-content:center;z-index:120;cursor:zoom-out}.lb img{max-width:92vw;max-height:92vh;border-radius:6px}
+  .empty{color:#9ca3af;padding:50px;text-align:center}
+</style>
+</head>
+<body>
+<div id="root"></div>
+<script type="text/x-jsx" id="app-src">
+const {useState,useEffect}=React;
+const j=u=>fetch(u,{cache:"no-store"}).then(r=>r.json());
+// 复制到剪贴板:http/裸IP 下 navigator.clipboard 不可用,降级到 textarea+execCommand
+function copyText(t){
+  if(navigator.clipboard&&window.isSecureContext) return navigator.clipboard.writeText(t);
+  return new Promise(function(res,rej){try{var ta=document.createElement("textarea");ta.value=t;ta.style.position="fixed";ta.style.top="-9999px";ta.style.opacity="0";document.body.appendChild(ta);ta.focus();ta.select();var ok=document.execCommand("copy");document.body.removeChild(ta);ok?res():rej();}catch(e){rej(e);}});
+}
+const SCOPES=[["substance","实质"],["form","形式"],["feeling","感受"],["effect","作用"],["intent","意图"]];
+const SC_CN={substance:"实质",form:"形式",feeling:"感受",effect:"作用",intent:"意图"};
+const TYPECN={how:"How",what:"What",why:"Why"};
+const CSTAGE_DOC=`## 创作阶段:写死的 5 个(每步选 1 个)
+how 工序每一步命中其中**一个**;不在这 5 个里的值会被代码丢弃(受控词表,不开放)。
+
+| 阶段 | 在干什么 |
+|---|---|
+| **定向** | 定主题 / 方向 / 受众——还没开始具体创作 |
+| **构思** | 生成核心创意 / 钩子 / 角度 / 冲突 |
+| **结构** | 搭骨架 / 大纲 / 顺序 |
+| **成文** | 把结构写成具体文字 / 镜头 |
+| **打磨** | 修改 / 精炼 / 优化 / 定稿 |
+
+(区别于「动作」:动作是模型从帖子里实时抽的、不固定;创作阶段是定死的 5 选 1。)`;
+const GLOSSARY=`## 一篇帖子能拆出三种知识(平级的)
+这三种各帮你做一个不同的决定,没有谁更重要。
+
+| 标签 | 大白话 | 它帮你决定 |
+|---|---|---|
+| **怎么做** (How) | 一步步把东西做出来的流程 | 按什么**顺序**做 |
+| **是什么** (What) | 某东西由什么组成 / 有哪些种类 | 用**哪些料** |
+| **为什么** (Why) | 背后的道理、标准、平台规则 | 该**留什么、砍什么** |
+
+## 「是什么」按结构分三种
+- **子集**:像菜单,几个**互不隶属**的项,**归其一 or 挑着用**(例:7 种叙事结构挑一种、构图六法按场景挑)。
+  - 每个项后面那句 **👉 什么时候用** 就是「**选择线索**」——告诉你哪种情况该挑它。没有它,就只能背、不会选。
+- **多维关系**:像配方,几个部件**都要、合起来才完整、无先后**(例:人物 = 生理+社会+心理)。
+- **序列**:几个部件**都要、且有前后位置**(例:故事五部分、黄金三段式)。只是位置顺序——后段若**消费**前段产出、换序就崩,那就成 how 工序了。
+
+## 「为什么」是什么
+- **一段「阐述」**:把原帖讲这条原理的内容**忠实整合**成一段——这条原理**是什么 + 为什么成立**。
+- 解构阶段只**还原原理本身**,不加工"该怎么用"(那是下游应用的事)。`;
+
+const STEPS=[
+  {key:"read",label:"读懂帖子",desc:"把图、视频读成文字",
+   why:"创作知识常在图里、不在正文;这一步只忠实转写、不判断,避免一步干两件事。",
+   src:["/app/legacy-decode/prompt-read/extract.txt","/app/legacy-decode/prompt-read/extract_video.txt"]},
+  {key:"gate",label:"判断是否是创作知识",desc:"判这帖是不是『图文/视频创作』知识:两次判断+分歧裁决,不是就整帖跳过",
+   why:"靠模型语义理解判、不靠关键词(换措辞就绕过);两视角(一个判'是创作'、一个专挑'是制作/越界'的茬)+ 边界倾向排除,把『用工具做视频/游戏设计』挡在门外,省下后面整条拆解。",
+   src:["/app/legacy-decode/prompt-read/gate_admit.txt","/app/legacy-decode/prompt-read/gate_refute.txt","/app/legacy-decode/prompt-read/gate_tiebreak.txt"]},
+  {key:"frame",label:"拆出知识",desc:"从文字里拆出一条条知识,理清每条是 怎么做 / 是什么 / 为什么",
+   why:"先判类型再拆——三类成形不同,默认 how 会把纯 what 硬掰成假 how;how 先吸进步骤里的 what/why,吸不进的才独立成一条。",
+   src:["/app/legacy-decode/prompt-skill/phase1-frame.md"]},
+  {key:"howgate",label:"校验how的严谨性",desc:"每条『怎么做』再验一次:步骤真有先后依赖,还是离散知识被硬串成的假工序?两次判断+裁决,判假就拆回 是什么 / 为什么",
+   why:"模型有『教程=步骤』的先验,爱把几块离散知识(如 前提/人物/冲突)硬串成假工序。这步逐条核验:后步是否真消费前步产出、有没有『定义式拆解』(后步产出其实是前步里已点名的成分);假的当场拆成 what/why,真链原样保留。",
+   src:["/app/legacy-decode/prompt-read/gate_how_admit.txt","/app/legacy-decode/prompt-read/gate_how_refute.txt","/app/legacy-decode/prompt-read/gate_how_tiebreak.txt"]},
+  {key:"scope",label:"给知识归类",desc:"标好 讲什么 / 起什么作用 / 哪个创作环节 → 标签收成规范名词 → 和已有分类库对上号",
+   why:"这 5 类标签最容易串味,单独写厚;标签先名词化(动宾→名词)再做向量定位,既规范又能挂上分类库。",
+   src:["/app/legacy-decode/prompt-skill/phase2-scope.md","/app/legacy-decode/prompt-read/normalize_scope.txt"]},
+  {key:"store",label:"存进知识库",desc:"整理成统一格式存起来,供以后调用",
+   why:"纯拼接 + 校验的确定性活,程序自动做——没有提示词,让 AI 来干只会帮倒忙。",
+   src:null}
+];
+const STEPMAP={}; STEPS.forEach(s=>STEPMAP[s.key]=s);
+
+// 极简 Markdown 渲染(自带、无外部依赖):标题/表格/代码/引用/列表/加粗/行内码/链接
+function mdToHtml(src){
+  var escc=function(t){return t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");};
+  var inline=function(t){
+    t=escc(t);
+    t=t.replace(/`([^`]+)`/g,'<code>$1</code>');
+    t=t.replace(/\*\*([^*]+)\*\*/g,'<strong>$1</strong>');
+    t=t.replace(/\[([^\]]+)\]\(([^)]+)\)/g,'<a href="$2" target="_blank">$1</a>');
+    return t;
+  };
+  var L=(src||"").split("\n"), out=[], i=0;
+  var isStruct=function(s){return /^```/.test(s)||/^\s*#{1,6}\s/.test(s)||/^\s*>\s?/.test(s)||/^\s*[-*]\s+/.test(s)||/^\s*\d+\.\s+/.test(s)||/^\s*([-*_])(\s*\1){2,}\s*$/.test(s)||/^\s*\|/.test(s)||/^\s*<\/?[^<>]+>/.test(s);};
+  while(i<L.length){
+    var ln=L[i];
+    if(/^```/.test(ln)){ var b=[]; i++; while(i<L.length&&!/^```/.test(L[i])){b.push(L[i]);i++;} i++; out.push("<pre><code>"+escc(b.join("\n"))+"</code></pre>"); continue; }
+    if(/^\s*\|/.test(ln)&&i+1<L.length&&/^\s*\|?[\s:|-]*-[\s:|-]*\|?\s*$/.test(L[i+1])){
+      var head=ln, rows=[]; i+=2;
+      while(i<L.length&&/^\s*\|/.test(L[i])&&L[i].trim()!==""){rows.push(L[i]);i++;}
+      var cells=function(r){r=r.trim().replace(/^\|/,"").replace(/\|$/,"");return r.split("|").map(function(c){return c.trim();});};
+      var th=cells(head).map(function(c){return "<th>"+inline(c)+"</th>";}).join("");
+      var tb=rows.map(function(r){return "<tr>"+cells(r).map(function(c){return "<td>"+inline(c)+"</td>";}).join("")+"</tr>";}).join("");
+      out.push("<table><thead><tr>"+th+"</tr></thead><tbody>"+tb+"</tbody></table>"); continue;
+    }
+    if(/^\s*([-*_])(\s*\1){2,}\s*$/.test(ln)){ out.push("<hr/>"); i++; continue; }
+    var tag=ln.match(/^\s*<(\/?)([^<>\/][^<>]*)>\s*(.*)$/);  // 行首伪标签(如 <工作要点> / <example> 描述)→ 当小节标题
+    if(tag){ if(tag[1]){i++;continue;} var nm=tag[2], rest=tag[3].trim(), ex=/^example$/i.test(nm);
+      out.push('<div class="ptag'+(ex?' ptag-ex':'')+'">'+inline(ex?'示例':nm)+(rest?'<span class="ptag-sub">'+inline(rest)+'</span>':'')+"</div>"); i++; continue; }
+    var h=ln.match(/^\s*(#{1,6})\s+(.*)$/);
+    if(h){ var lv=Math.min(h[1].length+2,6); out.push("<h"+lv+">"+inline(h[2])+"</h"+lv+">"); i++; continue; }
+    if(/^\s*>\s?/.test(ln)){ var q=[]; while(i<L.length&&/^\s*>\s?/.test(L[i])){q.push(inline(L[i].replace(/^\s*>\s?/,"")));i++;} out.push("<blockquote>"+q.join("<br/>")+"</blockquote>"); continue; }
+    if(/^\s*[-*]\s+/.test(ln)){ var ul=[]; while(i<L.length&&/^\s*[-*]\s+/.test(L[i])){ul.push("<li>"+inline(L[i].replace(/^\s*[-*]\s+/,""))+"</li>");i++;} out.push("<ul>"+ul.join("")+"</ul>"); continue; }
+    if(/^\s*\d+\.\s+/.test(ln)){ var ol=[]; while(i<L.length&&/^\s*\d+\.\s+/.test(L[i])){ol.push("<li>"+inline(L[i].replace(/^\s*\d+\.\s+/,""))+"</li>");i++;} out.push("<ol>"+ol.join("")+"</ol>"); continue; }
+    if(ln.trim()===""){ i++; continue; }
+    var p=[]; while(i<L.length&&L[i].trim()!==""&&!isStruct(L[i])){p.push(inline(L[i]));i++;} out.push("<p>"+p.join("<br/>")+"</p>");
+  }
+  return out.join("\n");
+}
+
+function Ribbon({onOpen}){
+  return <div className="ribbon">
+    <div className="rcap">这套系统怎么「从帖子拆解知识」——点任一步看它的提示词</div>
+    <div className="rsteps">{STEPS.map((s,i)=><React.Fragment key={s.key}>
+      {i>0&&<span className="rarrow">→</span>}
+      <div className={"rstep"+(s.src?"":" auto")} onClick={()=>onOpen(s.key)}>
+        <div className="rtop"><span className="rn">{i+1}</span><span className="rlab">{s.label}</span></div>
+        <div className="rdesc">{s.desc}</div>
+        <div className="rbtn">{s.src?"📄 看提示词":"⚙️ 程序自动"}</div>
+      </div></React.Fragment>)}</div>
+  </div>;
+}
+
+function ScopeChip({x,onScope,showType}){
+  return <span className={"sv s-"+x.scope_type} onClick={()=>onScope(x)}>{showType&&<span className="k">{SC_CN[x.scope_type]||x.scope_type}</span>}{x.value}<span className={"mk "+(x.link==="复用"?"mk-reuse":"mk-new")}>{x.link==="复用"?"复":"新"}</span></span>;
+}
+function KScopes({list,onScope}){
+  if(!list||!list.length) return null;
+  return <div className="kscopes"><span className="lab">作用域(5 棵树):</span>
+    {list.map((x,i)=><ScopeChip key={i} x={{...x}} onScope={onScope} showType={true}/>)}</div>;
+}
+
+function HowTable({k,onScope,onPrompt,onSource,onCstage}){
+  const steps=k.steps||[];
+  const scOf=(s,t)=>(s.作用域||[]).filter(x=>x.scope_type===t);
+  return <div className="twrap"><table className="proc">
+    <thead>
+      <tr><th className="c-idx" rowSpan="2">#</th>
+        <th className="g-frame" colSpan="5">② 拆框架</th>
+        <th className="g-scope" colSpan="5">③ 作用域</th></tr>
+      <tr><th className="c-intent">输入</th><th className="c-cstage cstage-h" title="看 5 个写死的创作阶段" onClick={()=>onCstage&&onCstage()}>创作<br/>阶段 ▸</th><th className="c-act">动作<br/>(模型推导)</th><th className="c-dir">方法</th><th className="c-out">产出</th>
+        {SCOPES.map(([kk,cn])=><th key={kk} className={"c-scope s-"+kk}>{cn}</th>)}</tr>
+    </thead>
+    <tbody>{steps.map((s,i)=><tr className="step" key={i}>
+      <td className="idx">{i+1}</td>
+      <td className="intent"><span className="in-txt">{s.input}</span>{s.出处&&s.出处.length>0&&<span className="srcbtn" title={"看原文出处 "+s.出处.join(" ")} onClick={()=>onSource(s.出处)}>🔍</span>}</td>
+      <td className="cstage">{s.创作阶段&&<span className="cstage-chip">{s.创作阶段}</span>}</td>
+      <td className="act">{s.动作&&<span className="act-chip">{s.动作}</span>}</td>
+      <td className="dir"><span className="dir-txt">{s.directive}</span></td>
+      <td className="out"><span className="out-txt">{s.output}</span></td>
+      {SCOPES.map(([kk])=><td key={kk} className={"scope s-"+kk}>{scOf(s,kk).map((x,j)=><ScopeChip key={j} x={x} onScope={onScope}/>)}</td>)}
+    </tr>)}</tbody>
+  </table></div>;
+}
+function WhatCard({k,onScope,onGloss}){
+  return <div>
+    {k.概要&&<div className="def">
+      {k.kind&&<span className={"kindb kind-"+k.kind}>{k.kind}</span>}
+      {k.维度拆分规则&&<span className="dimrule" title="维度拆分规则(仅子集)">按「{k.维度拆分规则}」拆</span>}
+      概要:{k.概要}</div>}
+    {(k.body||[]).length>0&&<table className="elem"><tbody>{k.body.map((it,i)=><tr key={i}>
+      <td className="el">{it.item_name}</td><td>{it.item_desc}</td></tr>)}</tbody></table>}
+    <KScopes list={k.作用域} onScope={onScope}/>
+  </div>;
+}
+function WhyCard({k,onScope}){
+  return <div>
+    {k.阐述&&<div className="why-exp">{k.阐述}</div>}
+    <KScopes list={k.作用域} onScope={onScope}/>
+  </div>;
+}
+
+function KnowledgeCard({k,idx,onScope,onPrompt,onJson,onSource,payload,how_titles,onGloss,onCstage}){
+  const par=k.parent;
+  return <div className="kcard" id={"k-"+k.id}>
+    <div className="khead">
+      <span className="kno">第{idx+1}颗知识</span>
+      <span className={"ktype ty-"+k.type}>{TYPECN[k.type]}</span>
+      <span className="ktitle">{k.title}</span>
+      {k.出处&&k.出处.length>0&&<span className="kref" title={"看原文出处 "+k.出处.join(" ")} onClick={()=>onSource(k.出处)}>🔍 出处 {k.出处.join(" ")}</span>}
+      {par&&<span className="kref" onClick={()=>{var e=document.getElementById("k-"+par.how_id);if(e)e.scrollIntoView({behavior:"smooth",block:"center"});}}>↑ 出自「{how_titles[par.how_id]||par.how_id}」第{par.step}步</span>}
+      {(k.业务阶段||[]).map((b,i)=><span key={i} className="kbiz">业务阶段:{b}</span>)}
+      <span className="kacts">{payload&&<button className="lbtn" onClick={()=>onJson(payload)}>⚙️ 入库 payload</button>}</span>
+    </div>
+    <div className="kbody">
+      {k.type==="how"&&<HowTable k={k} onScope={onScope} onPrompt={onPrompt} onSource={onSource} onCstage={onCstage}/>}
+      {k.type==="what"&&<WhatCard k={k} onScope={onScope} onGloss={onGloss}/>}
+      {k.type==="why"&&<WhyCard k={k} onScope={onScope}/>}
+    </div>
+  </div>;
+}
+
+function App(){
+  const [items,setItems]=useState([]);
+  const [sel,setSel]=useState(0);
+  const [scope,setScope]=useState(null);
+  const [runs,setRuns]=useState([]);     // web/app/legacy-decode/legacy-decode/runs/index.json 清单(搜索批次)
+  const [run,setRun]=useState(null);     // 选中的 run slug;null=默认样本 frameworks.json
+  const [pm,setPm]=useState(null);
+  const [json,setJson]=useState(null);
+  const [copied,setCopied]=useState(false);
+  const [zoom,setZoom]=useState(null);
+  const [src,setSrc]=useState(null);
+  const [hl,setHl]=useState(false);
+  const [gloss,setGloss]=useState(false);
+  const [cstage,setCstage]=useState(false);
+  useEffect(()=>{j("/app/legacy-decode/legacy-decode/runs/index.json").then(r=>setRuns(Array.isArray(r)?r:[])).catch(()=>setRuns([]));},[]);
+  useEffect(()=>{
+    const fw=run?("/app/legacy-decode/runs/"+run+".json"):"/app/legacy-decode/frameworks.json";
+    const pls=run?("/app/legacy-decode/runs/"+run+".payloads.json"):"/app/legacy-decode/payloads.json";
+    Promise.all([j(fw),j(pls).catch(()=>[])]).then(([f,pl])=>{
+      setSel(0);setScope(null);
+      setItems((f.posts||[]).map(p=>({...p,payloads:(pl||[]).filter(x=>(x.source||{}).id===(p.source_id||("xhs_"+p.post_id)))})));});},[run]);
+  useEffect(()=>{document.body.classList.toggle("hl",hl);},[hl]);
+  function openPrompt(key){
+    const st=STEPMAP[key]; if(!st) return;
+    if(!st.src){ setPm({label:st.label,why:st.why,text:"(这一步是程序自动完成的,没有提示词。)"}); return; }
+    setPm({label:st.label,why:st.why,text:"加载中…"});
+    const multi=st.src.length>1;
+    Promise.all(st.src.map(u=>fetch(u,{cache:"no-store"}).then(r=>r.ok?r.text():"(未找到 "+u+")").catch(()=>"(加载失败 "+u+")")
+      .then(t=>multi?("## 〔"+u.split("/").pop()+"〕\n\n"+t):t)))
+      .then(txts=>setPm({label:st.label,why:st.why,text:txts.join("\n\n")}));
+  }
+  if(!items.length) return <div className="empty">加载中…</div>;
+  const it=items[sel];
+  const ks=it.knowledges||[];
+  const how_titles={}; ks.forEach(k=>{if(k.type==="how")how_titles[k.id]=k.title;});
+  const payloadOf=k=>(it.payloads||[]).find(p=>p.title===k.title);
+  const media=it.media||{}; const imgs=media.images||[]; const videoUrl=media.video_url;
+  const cardsById={}; (it.cards||[]).forEach(c=>cardsById[c.index]=c);
+  const openSource=list=>{var cs=(list||[]).map(s=>{var m=String(s).match(/\d+/);return m?cardsById[parseInt(m[0])]:null;}).filter(Boolean);if(cs.length)setSrc({cards:cs});};
+  const fmtT=s=>{s=Math.floor(s||0);return Math.floor(s/60)+":"+String(s%60).padStart(2,"0");};
+  return <div className="app">
+    <header className="top">
+      <h1>创作知识的解构</h1>
+      <div className="picker"><span className="lab">批次:</span>
+        <select className="runsel" value={run||""} onChange={e=>setRun(e.target.value||null)}>
+          <option value="">样本(frameworks)</option>
+          {runs.map((r,i)=><option key={i} value={r.slug}>{(r.queries||[]).join("+")||r.slug}({r.count}帖)</option>)}
+          {runs.length===0 && <option value="" disabled>(暂无搜索批次——跑一次 query 后出现)</option>}
+        </select>
+      </div>
+      <div className="picker"><span className="lab">帖子:</span>
+        {items.map((x,i)=><div key={i} className={"pill"+(sel===i?" on":"")} onClick={()=>{setSel(i);setScope(null);}}>{x.title.slice(0,16)}<span className="n">{(x.knowledges||[]).length}颗</span></div>)}
+      </div>
+    </header>
+    <div className="scroll">
+      <Ribbon onOpen={openPrompt}/>
+      <details className="src" open><summary>原帖:{it.title}(这一帖的原料)· {it.platform}{videoUrl?" · 视频":(imgs.length?` · ${imgs.length} 图`:"")}</summary>
+        <div className="srcbody"><a href={it.url} target="_blank" rel="noreferrer">{it.url}</a>
+          {videoUrl
+            ? <div style={{marginTop:8}}><video src={videoUrl} controls style={{maxWidth:"380px",maxHeight:"320px",borderRadius:"6px",border:"1px solid #e2e8f0"}}/></div>
+            : <div className="srcimgs">{imgs.map((u,i)=><img key={i} src={u} title={u} onClick={()=>setZoom(u)} onError={e=>{var ph="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='80' height='80'><rect width='80' height='80' fill='%23f1f5f9' stroke='%23cbd5e1' stroke-dasharray='4'/></svg>"; if(e.target.src.slice(0,4)!=='data')e.target.src=ph;}}/>)}</div>}
+        </div>
+      </details>
+      <div className="barhint" style={{display:"flex",gap:8,alignItems:"center"}}>
+        <span>这一帖拆出 <b>{ks.length}</b> 颗知识(how 工序表 / what 知识卡 / why 论点卡);组件颗标「出自某 how 第 N 步」可点跳。</span>
+        <button className="lbtn glossbtn" onClick={()=>setGloss(true)} style={{marginLeft:"auto"}}>❓ 名词说明</button>
+        <button className={"lbtn"+(hl?" on":"")} onClick={()=>setHl(!hl)}>高亮「新值」</button>
+      </div>
+      {ks.length===0 && <div className="kcard"><div className="kbody" style={{padding:"20px 16px",color:"#9ca3af",fontSize:"13px"}}>🚫 这帖<b style={{color:"#6b7280"}}>没有可提取的创作知识</b>(纯作品 / 展示 / 无关)——① 读懂时 <code>is_empty=true</code>,后面拆颗/归类/入库已自动跳过。</div></div>}
+      {ks.map((k,i)=><KnowledgeCard key={i} k={k} idx={i} onScope={setScope} onPrompt={openPrompt} onJson={setJson} onSource={openSource} payload={payloadOf(k)} how_titles={how_titles} onGloss={()=>setGloss(true)} onCstage={()=>setCstage(true)}/>)}
+    </div>
+    {scope&&<div><div className="ov" onClick={()=>setScope(null)}></div>
+      <div className="drawer"><h2>作用域定位详情<span className="x" onClick={()=>setScope(null)}>×</span></h2>
+        <div className="dc">
+          <div className="row"><b>提取候选值</b>:{scope.candidate||scope.value}</div>
+          <div className="row"><b>归属树</b>:<span className={"sv s-"+scope.scope_type} style={{cursor:"default"}}>{SC_CN[scope.scope_type]||scope.scope_type}</span>(在这棵树里找最近邻)</div>
+          <div className="row"><b>判定</b>:<span className={"verdict "+(scope.link==="复用"?"v-reuse":"v-new")}>{scope.link==="复用"?"复用现有节点":"新建(树里没有)"}</span> = 最近邻 {scope.score}</div>
+          <div className="row"><b>最终入库值</b>:{scope.value}</div>
+          <h3 style={{margin:"12px 0 6px",fontSize:12.5,color:"#475569"}}>分类树最近邻 top-{(scope.top||[]).length} · 【{SC_CN[scope.scope_type]||scope.scope_type}】树(火山余弦)</h3>
+          {(scope.top||[]).map((h,i)=><div className="nn" key={i}><span className="sc">{h.score}</span><span className="nm">{h.name}</span><div className="pth">【{SC_CN[scope.scope_type]||scope.scope_type}】 {h.path}</div></div>)}
+          {(!scope.top||!scope.top.length)&&<div style={{color:"#9ca3af"}}>无最近邻</div>}
+        </div></div></div>}
+    {pm&&<div className="modal" onClick={()=>setPm(null)}><div className="mbox" onClick={e=>e.stopPropagation()}>
+      <h2>📄 {pm.label} · 这一步的提示词<span className="x" onClick={()=>setPm(null)}>×</span></h2>
+      <div className="body">
+        <div className="pmwhy"><b>为什么这么做:</b>{pm.why}</div>
+        {pm.text==="加载中…"?<pre>{pm.text}</pre>:<div className="md" dangerouslySetInnerHTML={{__html:mdToHtml(pm.text)}}/>}</div></div></div>}
+    {json&&<div className="modal" onClick={()=>{setJson(null);setCopied(false);}}><div className="mbox" onClick={e=>e.stopPropagation()}>
+      <h2>⚙️ ingest payload(给机器看)
+        <button className="lbtn" style={{marginLeft:"auto",marginRight:8}} onClick={()=>copyText(JSON.stringify(json,null,2)).then(()=>{setCopied(true);setTimeout(()=>setCopied(false),1500);}).catch(()=>{})}>{copied?"✓ 已复制":"📋 复制 JSON"}</button>
+        <span className="x" style={{marginLeft:0}} onClick={()=>{setJson(null);setCopied(false);}}>×</span></h2>
+      <div className="body"><pre>{JSON.stringify(json,null,2)}</pre></div></div></div>}
+    {src&&<div className="modal" onClick={()=>setSrc(null)}><div className="mbox" onClick={e=>e.stopPropagation()}>
+      <h2>🔍 原文出处(① 读到的卡片)<span className="x" onClick={()=>setSrc(null)}>×</span></h2>
+      <div className="body">{src.cards.map((c,i)=><div className="srccard" key={i}>
+        <div className="ci">卡片{c.index}{c.start!=null?(" · "+fmtT(c.start)+"–"+fmtT(c.end)):""}</div>
+        {c.image_url&&<img src={c.image_url} onClick={()=>setZoom(c.image_url)} onError={e=>e.target.style.display='none'}/>}
+        {c.video_url&&<video src={c.video_url+(c.start!=null?("#t="+Math.floor(c.start)+","+Math.floor(c.end)):"")} controls/>}
+        {c.content?<div className="srcread">① 在这张卡读到的:{c.content}</div>:<div style={{color:"#9ca3af",fontSize:"12px",marginTop:5}}>(这张卡没读到要点)</div>}
+      </div>)}</div></div></div>}
+    {cstage&&<div className="modal" onClick={()=>setCstage(false)}><div className="mbox" onClick={e=>e.stopPropagation()}>
+      <h2>📐 创作阶段 · 写死的 5 个<span className="x" onClick={()=>setCstage(false)}>×</span></h2>
+      <div className="body"><div className="md" dangerouslySetInnerHTML={{__html:mdToHtml(CSTAGE_DOC)}}/></div></div></div>}
+    {gloss&&<div className="modal" onClick={()=>setGloss(false)}><div className="mbox" onClick={e=>e.stopPropagation()}>
+      <h2>❓ 名词说明 · 用大白话讲清楚<span className="x" onClick={()=>setGloss(false)}>×</span></h2>
+      <div className="body"><div className="md" dangerouslySetInnerHTML={{__html:mdToHtml(GLOSSARY)}}/></div></div></div>}
+    {zoom&&<div className="lb" onClick={()=>setZoom(null)}><img src={zoom}/></div>}
+  </div>;
+}
+ReactDOM.createRoot(document.getElementById("root")).render(<App/>);
+</script>
+<script>
+(function(){var src=document.getElementById("app-src").textContent;
+ var out=Babel.transform(src,{presets:[["react",{runtime:"classic"}]]}).code;(0,eval)(out);})();
+</script>
+</body>
+</html>

+ 473 - 0
app/frontend/dist/legacy-decode/payloads.json

@@ -0,0 +1,473 @@
+[
+ {
+  "source": {
+   "id": "xhs_699308fa0000000016009697",
+   "source_type": "post",
+   "title": "真正能爆的选题,往往是你写完后感觉羞耻的",
+   "author": "方圆的增长飞轮",
+   "source_metadata": {
+    "platform": "xiaohongshu",
+    "url": "https://www.xiaohongshu.com/explore/699308fa0000000016009697"
+   }
+  },
+  "title": "爆款选题双招法",
+  "content": "目标:产出一个能引发情绪共鸣的爆款选题\n步骤1\n  输入:选定目标赛道\n  方法:提取该赛道中被广泛默认、反复复述的‘圣经句’(即正确共识),如『能力强的人一定会被看见』;必须是大众信奉但未经质疑的断言。例:『…能力强的人一定会被看见…』\n  产出:〈赛道圣经句〉\n步骤2\n  输入:← s1 的〈赛道圣经句〉\n  方法:针对该句,追问:什么情况下严格按这句话做,反而导致结果恶化?即寻找其失效的现实场景(共识崩塌点)。例:『职场中能力强却长期被埋没、汇报不力反被提拔』\n  产出:〈共识失灵场景清单〉\n步骤3\n  输入:← s1 的〈赛道圣经句〉\n  方法:前往同赛道热门竞品评论区,筛选含『但是……』『其实……』『没人敢说……』等转折/压抑表达的评论——这些是用户‘懂但没说出口’的真实痛点,已通过市场反馈验证。例:『标题很干货,但是看完还是不会写』\n  产出:〈竞品评论区沉默痛点集〉\n步骤4\n  输入:← s2 的〈共识失灵场景清单〉, ← s3 的〈竞品评论区沉默痛点集〉\n  方法:将二者交叉比对,选取同时满足‘共识崩塌’+‘用户已有压抑共鸣’的交集点,将其转化为具体选题表述,确保带有羞耻感或冒犯感(非攻击性,而是撕裂正确表象)。例:『别再信“努力就有回报”,这届打工人正在用离职投票』\n  产出:一个能引发情绪共鸣的爆款选题",
+  "dim_creations": [
+   "创作"
+  ],
+  "dim_attributes": [
+   "how"
+  ],
+  "scopes": [
+   {
+    "scope_type": "substance",
+    "value": "赛道圣经句"
+   },
+   {
+    "scope_type": "substance",
+    "value": "正确共识"
+   },
+   {
+    "scope_type": "substance",
+    "value": "大众信奉断言"
+   },
+   {
+    "scope_type": "form",
+    "value": "提取法"
+   },
+   {
+    "scope_type": "effect",
+    "value": "共识"
+   },
+   {
+    "scope_type": "intent",
+    "value": "识别共识起点"
+   },
+   {
+    "scope_type": "substance",
+    "value": "共识失灵场景"
+   },
+   {
+    "scope_type": "substance",
+    "value": "现实失效条件"
+   },
+   {
+    "scope_type": "substance",
+    "value": "共识崩塌点"
+   },
+   {
+    "scope_type": "form",
+    "value": "反事实追问"
+   },
+   {
+    "scope_type": "effect",
+    "value": "共识解构"
+   },
+   {
+    "scope_type": "effect",
+    "value": "结构性矛盾暴露"
+   },
+   {
+    "scope_type": "intent",
+    "value": "挖掘认知裂缝"
+   },
+   {
+    "scope_type": "substance",
+    "value": "竞品评论区沉默痛点"
+   },
+   {
+    "scope_type": "substance",
+    "value": "用户未言明真实痛点"
+   },
+   {
+    "scope_type": "substance",
+    "value": "市场验证型压抑表达"
+   },
+   {
+    "scope_type": "form",
+    "value": "评论区语义"
+   },
+   {
+    "scope_type": "form",
+    "value": "转折词筛选"
+   },
+   {
+    "scope_type": "effect",
+    "value": "真实痛点捕获"
+   },
+   {
+    "scope_type": "effect",
+    "value": "情感共鸣"
+   },
+   {
+    "scope_type": "intent",
+    "value": "锚定已验证情绪触点"
+   },
+   {
+    "scope_type": "substance",
+    "value": "共识崩塌"
+   },
+   {
+    "scope_type": "substance",
+    "value": "用户压抑交集点"
+   },
+   {
+    "scope_type": "substance",
+    "value": "羞耻感选题"
+   },
+   {
+    "scope_type": "substance",
+    "value": "冒犯感选题"
+   },
+   {
+    "scope_type": "substance",
+    "value": "情绪共鸣型爆款选题"
+   },
+   {
+    "scope_type": "form",
+    "value": "交叉比对法"
+   },
+   {
+    "scope_type": "form",
+    "value": "交集转化"
+   },
+   {
+    "scope_type": "effect",
+    "value": "情绪信号强化"
+   },
+   {
+    "scope_type": "effect",
+    "value": "选题冒犯性校准"
+   },
+   {
+    "scope_type": "effect",
+    "value": "羞耻感注入"
+   },
+   {
+    "scope_type": "intent",
+    "value": "生成高共鸣选题"
+   }
+  ],
+  "custom_ext": [
+   {
+    "key": "业务阶段",
+    "type": "str",
+    "value": "选题"
+   },
+   {
+    "key": "创作阶段",
+    "type": "str",
+    "value": "定向"
+   },
+   {
+    "key": "创作阶段",
+    "type": "str",
+    "value": "构思"
+   },
+   {
+    "key": "创作阶段",
+    "type": "str",
+    "value": "结构"
+   },
+   {
+    "key": "动作",
+    "type": "str",
+    "value": "提取共识句"
+   },
+   {
+    "key": "动作",
+    "type": "str",
+    "value": "逆向推演失效场景"
+   },
+   {
+    "key": "动作",
+    "type": "str",
+    "value": "挖掘评论区未言明反馈"
+   },
+   {
+    "key": "动作",
+    "type": "str",
+    "value": "交叉验证并具象化选题"
+   }
+  ]
+ },
+ {
+  "source": {
+   "id": "xhs_699308fa0000000016009697",
+   "source_type": "post",
+   "title": "真正能爆的选题,往往是你写完后感觉羞耻的",
+   "author": "方圆的增长飞轮",
+   "source_metadata": {
+    "platform": "xiaohongshu",
+    "url": "https://www.xiaohongshu.com/explore/699308fa0000000016009697"
+   }
+  },
+  "title": "好选题的情绪信号",
+  "content": "{\"name\": \"好选题的情绪信号\", \"kind\": \"子集\", \"维度拆分规则\": \"情绪触发类型\", \"body\": [{\"item_name\": \"羞耻感\", \"item_desc\": \"写完后内心犹豫、不好意思、想删掉——因为它触碰了真实但被社交礼仪层层包裹的痛点;是好选题的防伪标签。例:『…写完后感觉羞耻的,因为太正确的选题缺乏情绪共鸣…』\", \"作用域\": []}, {\"item_name\": \"冒犯感\", \"item_desc\": \"不是脏话式冒犯,而是对大众信奉的‘正确共识’进行温和撕裂,从而触动公共痛点;能引发强烈共鸣。例:『…真正的爆款选题带有冒犯感,不是脏话式的冒犯,而是对正确共识的挑战…』\", \"作用域\": []}]}",
+  "dim_creations": [
+   "创作"
+  ],
+  "dim_attributes": [
+   "what"
+  ],
+  "scopes": [
+   {
+    "scope_type": "substance",
+    "value": "羞耻感"
+   },
+   {
+    "scope_type": "substance",
+    "value": "冒犯感"
+   },
+   {
+    "scope_type": "substance",
+    "value": "情绪信号"
+   },
+   {
+    "scope_type": "substance",
+    "value": "社交礼仪包裹痛点"
+   },
+   {
+    "scope_type": "substance",
+    "value": "公共痛点"
+   },
+   {
+    "scope_type": "substance",
+    "value": "正确共识挑战"
+   },
+   {
+    "scope_type": "form",
+    "value": "情绪防伪标签法"
+   },
+   {
+    "scope_type": "effect",
+    "value": "选题真伪甄别"
+   },
+   {
+    "scope_type": "effect",
+    "value": "情绪共鸣触发"
+   },
+   {
+    "scope_type": "intent",
+    "value": "识别高潜力选题"
+   }
+  ],
+  "custom_ext": [
+   {
+    "key": "概要",
+    "type": "str",
+    "value": "羞耻感和冒犯感是识别高潜力选题的关键情绪信号。"
+   }
+  ]
+ },
+ {
+  "source": {
+   "id": "xhs_699308fa0000000016009697",
+   "source_type": "post",
+   "title": "真正能爆的选题,往往是你写完后感觉羞耻的",
+   "author": "方圆的增长飞轮",
+   "source_metadata": {
+    "platform": "xiaohongshu",
+    "url": "https://www.xiaohongshu.com/explore/699308fa0000000016009697"
+   }
+  },
+  "title": "赛道圣经句",
+  "content": "{\"name\": \"赛道圣经句\", \"kind\": \"子集\", \"维度拆分规则\": \"共识性质\", \"body\": [{\"item_name\": \"职场类圣经句\", \"item_desc\": \"『能力强的人一定会被看见』\", \"作用域\": []}]}",
+  "dim_creations": [
+   "创作"
+  ],
+  "dim_attributes": [
+   "what"
+  ],
+  "scopes": [
+   {
+    "scope_type": "substance",
+    "value": "赛道圣经句"
+   },
+   {
+    "scope_type": "substance",
+    "value": "正确共识性断言"
+   },
+   {
+    "scope_type": "substance",
+    "value": "广泛默认断言"
+   },
+   {
+    "scope_type": "substance",
+    "value": "反复复述共识"
+   },
+   {
+    "scope_type": "substance",
+    "value": "共识撕裂起点"
+   },
+   {
+    "scope_type": "substance",
+    "value": "职场类圣经句"
+   },
+   {
+    "scope_type": "substance",
+    "value": "能力强的人一定会被看见"
+   },
+   {
+    "scope_type": "form",
+    "value": "共识类型"
+   },
+   {
+    "scope_type": "effect",
+    "value": "共识锚定"
+   },
+   {
+    "scope_type": "intent",
+    "value": "界定共识基线"
+   }
+  ],
+  "custom_ext": [
+   {
+    "key": "概要",
+    "type": "str",
+    "value": "赛道内被广泛默认、反复复述的正确共识性断言,是共识撕裂的起点。"
+   },
+   {
+    "key": "出自",
+    "type": "str",
+    "value": "爆款选题双招法 第1步"
+   }
+  ]
+ },
+ {
+  "source": {
+   "id": "xhs_699308fa0000000016009697",
+   "source_type": "post",
+   "title": "真正能爆的选题,往往是你写完后感觉羞耻的",
+   "author": "方圆的增长飞轮",
+   "source_metadata": {
+    "platform": "xiaohongshu",
+    "url": "https://www.xiaohongshu.com/explore/699308fa0000000016009697"
+   }
+  },
+  "title": "羞耻感作为选题信号的原理",
+  "content": "{\"name\": \"羞耻感作为选题信号的原理\", \"desc\": \"羞耻感是好选题的防伪标签,因为它意味着内容触碰了真实存在但被社交礼仪、群体沉默或自我审查层层包裹的痛点;这种包裹使痛点难以被公开讨论,一旦被精准表达,就会引发强烈情绪共鸣。而没有情绪触发的内容不可能爆红,安全的选题等于无感——写完后内心没有波澜、觉得没问题,大概率是无效选题;反之,写完后有点犹豫或不好意思,则可能是好选题。\"}",
+  "dim_creations": [
+   "创作"
+  ],
+  "dim_attributes": [
+   "why"
+  ],
+  "scopes": [
+   {
+    "scope_type": "substance",
+    "value": "羞耻感"
+   },
+   {
+    "scope_type": "substance",
+    "value": "社交礼仪包裹痛点"
+   },
+   {
+    "scope_type": "substance",
+    "value": "群体沉默"
+   },
+   {
+    "scope_type": "substance",
+    "value": "自我审查"
+   },
+   {
+    "scope_type": "substance",
+    "value": "情绪共鸣触发机制"
+   },
+   {
+    "scope_type": "substance",
+    "value": "理性认知缺口"
+   },
+   {
+    "scope_type": "substance",
+    "value": "感性情绪开关"
+   },
+   {
+    "scope_type": "effect",
+    "value": "痛点精准表达"
+   },
+   {
+    "scope_type": "effect",
+    "value": "情绪共振密度构建"
+   },
+   {
+    "scope_type": "effect",
+    "value": "选题无效性排除"
+   },
+   {
+    "scope_type": "intent",
+    "value": "解释羞耻感的选题价值"
+   }
+  ],
+  "custom_ext": []
+ },
+ {
+  "source": {
+   "id": "xhs_699308fa0000000016009697",
+   "source_type": "post",
+   "title": "真正能爆的选题,往往是你写完后感觉羞耻的",
+   "author": "方圆的增长飞轮",
+   "source_metadata": {
+    "platform": "xiaohongshu",
+    "url": "https://www.xiaohongshu.com/explore/699308fa0000000016009697"
+   }
+  },
+  "title": "交叉验证提升选题共鸣效力的原理",
+  "content": "{\"name\": \"交叉验证提升选题共鸣效力的原理\", \"desc\": \"共识失灵场景代表结构性矛盾,竞品评论区沉默痛点代表已被市场验证的个体压抑体验;二者的交集既具备现实根基又自带情感共振密度,因此转化出的选题能同时击中理性认知缺口与感性情绪开关,形成不可替代的共鸣效力。\"}",
+  "dim_creations": [
+   "创作"
+  ],
+  "dim_attributes": [
+   "why"
+  ],
+  "scopes": [
+   {
+    "scope_type": "substance",
+    "value": "共识失灵场景"
+   },
+   {
+    "scope_type": "substance",
+    "value": "竞品评论区沉默痛点"
+   },
+   {
+    "scope_type": "substance",
+    "value": "结构性矛盾"
+   },
+   {
+    "scope_type": "substance",
+    "value": "个体压抑体验"
+   },
+   {
+    "scope_type": "substance",
+    "value": "理性认知缺口"
+   },
+   {
+    "scope_type": "substance",
+    "value": "感性情绪开关"
+   },
+   {
+    "scope_type": "effect",
+    "value": "交叉"
+   },
+   {
+    "scope_type": "effect",
+    "value": "共鸣效力叠加"
+   },
+   {
+    "scope_type": "effect",
+    "value": "不可替代性"
+   },
+   {
+    "scope_type": "intent",
+    "value": "阐明交叉验证原理"
+   }
+  ],
+  "custom_ext": [
+   {
+    "key": "出自",
+    "type": "str",
+    "value": "爆款选题双招法 第4步"
+   }
+  ]
+ }
+]

+ 55 - 0
app/frontend/dist/legacy-decode/prompt-read/extract.txt

@@ -0,0 +1,55 @@
+你在从一篇小红书帖子(标题、正文、图片、视频)里提取「创作知识」:能指导别人"如何创作内容"的方法、原理、认知或清单。本步只忠实提取,不判断好坏,不拆分归类。
+
+<什么算创作知识>
+能迁移、能复用、能教别人"怎么创作图文/视频内容"的方法、原理、清单。**判断要同时过两条轴,缺一不算:**
+
+【轴A·产出物是不是「内容」】这条知识帮你创作出来的成品,是不是 图文 / 视频 / 脚本 / 剧本 / 小说 这类**内容**?题材不限(美食/游戏/健身/穿搭…都行),卡的是产出物:
+- 算:产出"关于某题材的**内容**"——美食视频拍法、游戏实况/解说脚本、健身图文写法、剧本/小说写法。
+- 不算:产出"那个题材**本身**"——一道菜的做法、一个**游戏的玩法/关卡设计**、一个产品、一套运营/选品策略(这是做题材本身,不是做关于它的内容)。
+
+【轴B·是「创作」不是「制作」】它教的是"怎么构思/选题/写/结构/呈现"(创作),还是"用哪个软件/AI、点哪个按钮把成品产出来"(制作/工具操作)?
+- 算(创作):选题/构思方法、结构或排版公式、要素清单、为什么某种开头/呈现更抓人、镜头/构图/配色的设计判断。
+- 不算(制作):打开某 App/小程序 → 输入/粘贴 → 点生成/扩写 → 设参数 → 导出/保存 这类工具操作步骤;纯器材/剪辑软件/调色/导出操作。
+- **特别强调(最常被误判)**:「**用某 AI/App 帮你生成内容成品**」的操作教程——例:『打开豆包/某AI → 输入需求 → 让它生成文案/图/视频 → 选一个满意的用』——这是**让工具替你做(制作/工具使用),不是教你自己怎么创作**,即便产出是视频/文案也**不算**。除非它真的在教"怎么把创作需求拆成可复用的判断/方法"(而不仅是"让 AI 生成再挑一个")。**整帖只是这种"用 AI 几步做出视频/文案"的流程 → 轴B 不过 → 判 is_empty。**
+
+【两轴 AND】两条都过才算;任一不过 → 不算。
+另外不算(作品本身):一段具体文案、一张图的 AI 出图提示词、一个具体选题标题、一份具体食谱用量、纯展示内容(风景/产品/生活)。
+作品里有时夹带可迁移的**创作**方法,有就提、没有就如实标空。
+</什么算创作知识>
+
+<工作要点>
+- 知识常在图片/视频里,正文常常只是话题串(如 "#短剧编剧# #写作#")。为什么强调:只读正文会系统性漏掉真正的知识,所以必须看图、看视频。
+- 以原始素材为准,忠实转述,不编造、不补全、不替作者总结它没说的结论;有的尽量提全。
+- **按卡片归因**:每张图/帧旁都标了【卡片N】。除了 text(综合所有卡片把创作知识讲清楚,主产物),还要填 cards——每张**有知识**的卡片一条 {{"index": N, "content": "这张卡上的知识要点"}},N 就是【卡片N】里的号;某张卡没有知识就不列它。为什么:后续要据此把每条知识溯源到具体卡片。
+- **is_empty(整条流程的总闸)**:判 `true` 后,后面的拆颗 / 归类 / 入库**全部不走**。两种情况标 `true`:
+  ① **纯作品/纯展示/纯无关**——通篇看完确实没有任何可迁移的创作方法/原理/清单。
+  ② **整帖不在范围内(越界要果断判 true,别放行)**——整帖产出物不是图文/视频内容(如游戏玩法/关卡设计、产品/运营/选品、做菜本身),**或**整帖是制作/工具操作(如"用某 AI/App 几步做出一段视频"的打开→点按钮→导出流程)。这类即便看着像"教程/步骤",也按轴A/轴B 判定为越界。
+  只要有一点点"怎么**创作内容**"的可迁移方法就 `false`;**范围内但拿不准有没有知识 → `false`**(交后面再筛);**但"在不在范围内"要果断**——明确越界(游戏设计/纯工具操作)就标 `true`,别用"拿不准"把越界帖放进来。标 `true` 时 `text` 留空字符串、`cards` 留空数组。
+</工作要点>
+
+<示例>
+(下面两例只示意「输出格式」和「忠实/留空」的尺度,**别把示例里的题材/内容当成要找的东西**——每帖都从它自己的真实内容抽。)
+<example>  知识在图里、正文为空(多张卡片)
+正文:"#短剧编剧# #写作#";【卡片1】图:前提 = 作者立场+人物+冲突+结论;【卡片2】图:人物三维度——生理/社会/心理。
+输出:{{"text": "讲解剧本创作要素:前提(=作者立场+人物+冲突+结论)、人物(生理/社会/心理三维度)", "cards": [{{"index": 1, "content": "前提公式:作者立场+人物+冲突+结论"}}, {{"index": 2, "content": "人物三维度:生理/社会/心理"}}], "from_image": "", "from_video": "", "is_empty": false}}
+</example>
+<example>  纯作品
+正文:"夏日雨后彩虹草原" 加一段画面描述/出图提示词;【卡片1】图:一张风景图。
+输出:{{"text": "", "cards": [], "from_image": "", "from_video": "", "is_empty": true}}
+</example>
+</示例>
+
+<输入>
+帖子标题:{title}
+话题:{topics}
+正文(可能为空或只是话题串,不要只看它):
+{body}
+(图片与视频已作为多模态输入一并给你,请查看)
+</输入>
+
+<输出>
+只输出一个 JSON 对象:
+{{"text": "把创作知识完整忠实讲清楚;没有就空字符串",
+  "cards": [{{"index": 卡片号, "content": "这张卡上的知识要点"}}],
+  "from_image": "", "from_video": "", "is_empty": false}}
+</输出>

+ 23 - 0
app/frontend/dist/legacy-decode/prompt-read/extract_video.txt

@@ -0,0 +1,23 @@
+你在从一条短视频里提炼「创作知识」——能指导别人怎么做内容的方法、原理、清单。
+
+<什么算创作知识>
+能迁移、能复用、能教别人"怎么做内容"的东西(选题法、爆款结构、起号逻辑、脚本/文案/镜头技巧、为什么某种做法有效)。不算的:一条具体作品本身、纯展示内容。
+</什么算创作知识>
+
+<工作要点>
+- 视频是口播 + 画面 + 字幕,请**同时听口播、看画面与字幕**——口播里往往是核心知识,别只看画面。
+- 以视频实际内容为准,忠实提炼,原文没有的不要编造、不要拔高。
+- **按视频时间顺序分段**,每段给时间戳和这段讲到的创作知识;一段对应一个相对完整的知识点/小主题。
+- 每段标 What/Why/How(这段讲的是"是什么/有哪些"、"为什么有效"、"怎么做"),有哪个填哪个,没有的填 null。
+</工作要点>
+
+<输出>
+只输出一个 JSON 对象:
+{{"video_title": "视频在讲什么的简短标题",
+  "overall": "全片在教什么,一两句话",
+  "segments": [
+    {{"start": "MM:SS", "end": "MM:SS", "title": "这段小标题",
+      "knowledge_types": ["what 和/或 why 和/或 how"],
+      "what": "或 null", "why": "或 null", "how": "或 null"}}
+  ]}}
+</输出>

+ 13 - 0
app/frontend/dist/legacy-decode/prompt-read/gate_admit.txt

@@ -0,0 +1,13 @@
+你在判断:一篇帖子「读懂后的内容」,是不是【图文/视频内容创作】的可迁移知识。用户消息就是这帖读懂后的内容。
+
+两条轴**都过**,才算"创作知识"(in_scope=true):
+- 轴A·产出物是内容:它教你创作出来的成品,是 图文 / 视频 / 脚本 / 剧本 / 小说 这类【内容】(题材不限:美食/游戏/健身都行)。
+- 轴B·是创作不是制作:它教"怎么构思/选题/写/结构/呈现"(创作),不是"用某 App/AI、打开→输入→生成→导出 把成品做出来"(制作/工具操作)。
+
+**题材不限,只看产出物 + 层面**——同样涉及游戏/电商也可能是创作:
+- ✅ 算:『如何创作**游戏实况/解说视频**』『如何构思**电商带货视频**的 idea』『如何构思**小说**结构』——产出是视频/小说**内容**、教的是创作。
+- ❌ 不算:『如何**设计游戏玩法/关卡**』『如何**做电商选品/运营**』——产出是游戏/生意**本身**,不是"关于它的内容"。
+一句话:**做题材本身→不算;做"关于题材的内容"→算。**
+
+先用一句话复述"这帖到底在教什么",再对照两轴判定。
+输出 JSON:{"复述":"<一句话>","轴A":true/false,"轴B":true/false,"in_scope":true/false,"category":"创作/制作/越界","理由":"<为什么>"}

+ 7 - 0
app/frontend/dist/legacy-decode/prompt-read/gate_how_admit.txt

@@ -0,0 +1,7 @@
+你在判断:下面这颗「how 工序」是不是【真流水线】——后一步必须消费前一步的**具体产出**,缺了前步、后步就做不了,打乱顺序就跑不通。
+
+用户消息是这颗 how 的 purpose + 各步(input/方法/产出),可能附带「代码信号」。
+逐对相邻步骤检查:**后步是否真用到前步产出的那个具体物**(不是"话题相关",是"没有前步那个产出就无法进行")。
+只要存在"步骤各自独立、可换序、或只是并列地讲'X 是什么/分几类'",就不是真流水线。
+
+输出 JSON:{"复述":"<这颗在教什么,一句话>","逐步依赖":"<s2 用了 s1 的什么…逐对说,说不出就写'无'>","is_real_how":true/false,"理由":"..."}

+ 13 - 0
app/frontend/dist/legacy-decode/prompt-read/gate_how_refute.txt

@@ -0,0 +1,13 @@
+你在审查(带着怀疑核验,但只认事实、命中才算):下面这颗「how 工序」是不是【假 how】——其实是几块离散构成/原理,被硬串成了步骤。
+
+逐条对照下面判据,命中任一 → is_fake=true:
+- 步骤的产出彼此近义/重复(都产出"同一类东西");
+- 打乱步骤顺序,成品仍成立(无强制先后);
+- 某步的"输入"其实是工序总输入、而非前一步的产出(步骤各自起头、互不喂给);
+- 这些"步骤"各自是"X 是什么 / 分几类"(如 前提 / 人物 / 冲突 这种离散构成),互为定义但**无"产出→输入"传递**;
+- 【定义式拆解】某后步的产出,是更早某步的"方法/产出"里**已经点名的成分**——例:s1 方法写「前提 = 作者立场 + 人物 + 冲突 + 结论」,而 s2 产出"人物"、s3 产出"冲突",人物/冲突在 s1 就已点名 → 这是把前面的复合产出**拆开逐个展开**,不是"加工出新东西",是并列。
+
+【必做核验】逐个后步:拿它产出的核心词,去前面每一步的"方法/产出"里搜;在更早步骤里已被点名,就记一处"定义式拆解"命中。**注意区分:是"前步已点名的成分被展开"才算,不是单纯出现同一个普通词(如"剧本/故事")。**
+
+用户消息含该 how 的 purpose + 各步,可能附「代码信号」。如实核验:命中哪条就指出哪条;**一条都不命中,就如实判 is_fake=false——不要为了挑刺硬凑理由**。
+输出 JSON:{"复述":"...","假链证据":"...","is_fake":true/false,"若假how建议拆成":"<几颗 what/why,如:前提构成(what)/人物维度(what)/冲突类型(what)/势均力敌原理(why)>"}

+ 8 - 0
app/frontend/dist/legacy-decode/prompt-read/gate_how_tiebreak.txt

@@ -0,0 +1,8 @@
+两个判断者对"这颗 how 是不是真流水线"产生分歧,你来裁决。用户消息是该 how 的 purpose + 各步(可能附「代码信号」)。
+
+标准:
+- 真流水线 = 后步消费前步的**具体产出**、打乱顺序就跑不通(如 腌制→下锅→收汁)。
+- 假 how = 离散构成/原理被硬串成步骤(如"前提/人物/冲突"各自是"是什么"、互不传递)。
+
+**重要:拿不准、或像"几块各自是什么"硬串的 → 判 is_real_how=false(边界倾向"假how")。**
+输出 JSON:{"复述":"...","is_real_how":true/false,"理由":"..."}

+ 11 - 0
app/frontend/dist/legacy-decode/prompt-read/gate_refute.txt

@@ -0,0 +1,11 @@
+你在审查(带着怀疑核验,但只认事实、命中才算):一篇帖子「读懂后的内容」,是不是其实【不该进创作知识库】。用户消息就是这帖读懂后的内容。
+
+属于以下任一 → out_of_scope=true(该排除):
+- 制作/工具操作:核心是"用某 App/AI/软件,打开→输入/粘贴→生成/扩写→设参数→导出/保存"把成品产出来。**哪怕它教你"怎么给 AI 下指令 / 设身份 / 给字数要求",只要本质是让工具替你产出,就算制作。**
+- 越界题材本身:教的是"做那个东西本身"——游戏玩法/关卡设计、产品开发、电商/运营/选品、行业分析等(不是"做关于它的内容")。
+
+⚠️ **别把题材当越界(最容易误伤)**:题材是游戏/电商/任何都没关系——『如何创作**游戏视频** / 构思**电商带货视频** idea / 构思**小说**结构』是**创作**(产出是视频/小说内容),**不要排除**;只有"做**游戏玩法** / 做**电商选品运营**本身"(产出是游戏/生意、不是关于它的内容)才排除。判据就一句:**做题材本身→排除;做"关于题材的内容"→收。**
+
+逐条对照上面的越界判据**如实核验**:确实命中就判 out_of_scope=true;一条都不命中,就如实判 out_of_scope=false——不要硬凑越界理由。
+先用一句话复述"这帖在教什么",再判。
+输出 JSON:{"复述":"<一句话>","out_of_scope":true/false,"category":"创作/制作/越界","理由":"<越界点;或为何确实没有>"}

+ 11 - 0
app/frontend/dist/legacy-decode/prompt-read/gate_tiebreak.txt

@@ -0,0 +1,11 @@
+两个判断者对"这帖是否属于【图文/视频内容创作知识】"产生了分歧,你来裁决。用户消息就是这帖读懂后的内容。
+
+标准(两轴**都过**才算创作 in_scope=true):
+- 轴A:产出物是 图文 / 视频 / 脚本 / 剧本 / 小说 这类内容;
+- 轴B:教创作(构思/选题/写/结构/呈现),不是"用工具产出成品"、也不是"做题材本身"(游戏/产品/运营/选品/行业分析)。
+
+**题材不限,看产出物+层面、不看题材词**:『创作游戏视频 / 构思电商带货视频 idea / 构思小说结构』= 创作(收);『设计游戏玩法 / 做电商选品运营』= 越界(排除)。
+
+**重要:拿不准、模棱两可、半创作半制作 → 一律判 in_scope=false(边界倾向排除)。**
+先用一句话复述"这帖在教什么",再裁决。
+输出 JSON:{"复述":"<一句话>","in_scope":true/false,"category":"创作/制作/越界","理由":"<为什么>"}

+ 8 - 0
app/frontend/dist/legacy-decode/prompt-read/normalize_scope.txt

@@ -0,0 +1,8 @@
+你在把一批「作用域标签值」规范成【纯名词】。用户消息是一个 JSON 字符串数组。
+
+规则:
+- 若值是"动宾/带动词"(如 寻找共识裂缝、爆发力核验、推导选题落点、完播率提升、现实阻碍提取),去掉动词、保留【名词核心】:共识裂缝、爆发力、选题落点、完播率、现实阻碍。
+- 若值本就是名词——**包括"氛围营造、行动引导、情感表达、推进节奏、形象塑造、概括叙述"这类规范的"名词+动词语素"复合名词——【原样不动】**。
+- 不要合并、不要新增、不要删项、不要解释。每个输入值都必须在输出里有对应(哪怕原样返回)。
+
+输出 JSON:{"映射": {"<原值>":"<规范名词>", "...":"..."}}

+ 196 - 0
app/frontend/dist/legacy-decode/prompt-skill/phase1-frame.md

@@ -0,0 +1,196 @@
+# ② 判颗 + 类型闸 + 三 lane 成形 + 轻标签
+
+输入:①读懂后的文字内容。
+干三件事:**判这帖有几颗、各是什么类型**(how/what/why)→ **按类型把每颗成形** → **顺手打轻标签**。
+**不碰作用域**(留给 ③)。产物:`framework.json` 的 `knowledges[]`(一帖多颗)。
+
+> 核心:**颗是单位,一帖 = N 颗**(可混类型)。what/why 既能独立成颗,也能作为某 how 的「组件颗」单列。
+
+---
+
+## A. 拆颗顺序 —— 类型中立:先切单元,逐元按「驱动哪个决策」判类型
+
+**三类是对等的**(what/how/why 各驱动一个不同决策),**不预设谁是主角、不先找 how**。
+
+```
+1. 切单元:把帖里能独立检索复用的知识,切成一个个「单元」(先不贴类型)。
+2. 逐元判类型——问这个单元「驱动哪个创作决策」(用官方定义):
+   · 影响【元素选择】(是什么 / 由什么构成 / 有哪些可选)        → What
+   · 影响【脉络与结构】(怎么一步步把某输入做成成品)            → How
+   · 影响【取舍判断】(背后的原理 / 标准 / 平台逻辑)            → Why
+3. How 凭「序列为真」上位(A2节 两道闸):只有「后步吃前步 + 走到成品」才算 How;
+   并列招式/选项清单 → 其实是 What;单讲道理/取舍 → Why。别因为「看着像步骤」就判 How。
+4. 组件链接(分类之后才做,不是抽取入口):某 What/Why 若【恰好】是某 How 某步的
+   产出(what)或判断依据(why) → 标 role=组件、parent={how_id,step}(既单列成颗、又连回 how);
+   其余 What/Why 是 role=主、parent=null。
+```
+
+> 每个单元都是**独立一颗**;组件只是"分类后顺手连了一条到 how 的链接",**不改变它是独立知识**这件事。三类谁多谁少都正常——一帖可能全 What、也可能 how+what+why 混。
+
+**判 step(某动作压进 how 当一步,不单拎)**:①产出半成品 ②被同帖另一块当输入 ③拿走则成品残缺。
+**判组件颗(连回 how 的那条链接该不该建)**:见 C节 判据。
+
+### A2. how 资格闸 —— 两道硬闸,任一过不了就别当 how
+
+把一组动作封成 how 之前,必须同时过这两闸;否则它不是 how。
+
+**闸① 有序性(步骤之间真有「产出→输入」传递吗?)**
+> 后一步是否**消费前一步的具体产出**、换了顺序就跑不通?
+> - 是 → 真有序,可成 how。**且每个后步的 `input` 必须实指它消费的前步产出物原话**(写"← s1 的〈赛道圣经句清单〉",**禁止空泛的"←s1产出"**)——指不出具体消费物 = 不依赖。
+> - **否 → 不是工序**:一组并列招式/途径 → 一颗 **What 清单**;几块"各自是什么"的离散构成 → **各拆一颗 What**(原理拆 Why)。
+> 识别信号:①相邻 step 的 output 近义/重复;②打乱顺序成品仍成立;③多个 step 的 input 其实都是工序总输入、彼此不喂给;④这些"步骤"各自是"X 是什么/分几类";⑤【定义式拆解】后步产出是前步"方法/产出"里已点名的成分(前提=…人物…冲突…,后步逐个产出"人物""冲突")→ 是把复合体拆开展开、不是加工出新东西。
+> **反驳自检(封 how 前必做)**:逐对说出"s2 用了 s1 产出的什么具体物";再查"s2 的产出是不是 s1 里已点名的成分"——说不出消费物、或产出只是前步成分的展开,就拆成 What,别硬编链。
+> ⚠️ 离散构成例(**应拆 What/Why,不是 how**):「故事 = 前提 + 人物 + 冲突」——前提/人物/冲突各自是"是什么/分几类"、互为定义但**无产出→输入传递**(拟定前提并不消费"切入点")→ 拆成「前提构成」「人物维度」「冲突类型」几颗 What(+「冲突靠势均力敌升级」这类原理拆 Why),别硬串成 step1→2→3。
+
+**闸② 走到交付物(最后一步的 output = purpose 承诺的成品吗?)**
+> purpose 用什么名词收尾("一篇成稿"/"一个选题"/"一条脚本"),**最后一步的 output 就必须是那个东西**。
+> - 是 → 工序完整。
+> - **否(步骤只产出"原料/半成品/草图/一堆分析",没有把它们收口成成品的那一步)→ 半截 how**。两条出路选一:**(a) 补上收尾步**(整合/筛选/定稿那一步,原帖若真有就补);**(b) 把 purpose 降到与实际 output 对齐**(别用"…法/…矩阵/…框架"把半成品吹成成品)。purpose 的抽象层不能比 steps 高一截、中间断链。
+
+**铁律**:没工序**别硬造假 how**;一颗 = 一个完整东西,不拆碎,也不把半截工序包装成完整方法论。
+
+> 🌰 跨题材示例(只示意判法,**别套用这里的题材/词**):
+> - 假 how(应改 What 清单):「找选题灵感的 3 个途径:①翻同行评论区 ②看搜索下拉词 ③问目标读者」——三者并列、可换序、做一个就行 → 是一颗 What(途径清单),不是 step1→2→3。
+> - 真 how:「腌制 → 下锅 → 收汁」——收汁吃下锅的产出,换序就崩,最后一步出成品 → 合格 how。
+> - 半截 how(应补收尾或降 purpose):purpose 写「写出一篇成稿」,但步骤只到「列大纲、攒素材」就停了 → 缺"把大纲素材写成稿"的收尾步;要么补上,要么把 purpose 降为「成稿前的备料法」。
+
+---
+
+## B. 三类成形模板(三条对等 lane)
+
+> **核心原则:每类知识都要落在它的「决策落点」上**——这是这条知识对下游 AI 的真正价值。
+> - **How**(影响脉络/结构)→ 落点 = **输入→方法→产出 的链**(每步吃什么、吐什么)。
+> - **What**(影响元素选择)→ 落点 = **可选元素 + 选用判断**(子集型把每个选项"何时/为何选它"并入其 item_desc)。
+> - **Why**(解释为什么)→ 落点 = **把原理本身(是什么+为什么)忠实整合说清**;"怎么用/取舍"是下游应用的事,解构不做。
+> 描述部分尽管自由,但**决策落点必须落到**——只描述不落点 = 半成品知识。
+
+### How(工序)— role 主(必须先过 A2节 两道闸)
+`purpose`(把某输入一路做成成品;**它的收尾名词 = 最后一步 output**,见闸②)+ 有序 `steps`(**后步消费前步 output**,见闸①),每步是一次**变换 输入→方法→产出**:
+- `input` 输入(这步**吃什么**:首步=工序总输入;后步**必须实指前步产出物原话**,如 `← s1 的〈赛道圣经句清单〉`,**禁空泛"←s1产出"**——指不出就说明不依赖前步,见 A2节 闸①)
+- `directive` 方法(怎么做,含判断标准;**原帖示例必须原文保留** `例:『…』`;不编原文没有的例子)
+- `output` 产出(这步**吐什么**;会成为下一步的 `input`)
+- `出处`(图N / 视频时间)
+
+> **为什么用 输入→方法→产出 而不是"目的"**:旧的"目的"和产出重复("找X"≈产出"X"),是冗余。改成显式的 input 让"后步吃前步"(闸①)变成结构可验证,也让 AI 真能把状态一步步串下去。整条工序的总目标只在颗级 `purpose` 说一次,不在每步重复。
+
+> **每颗都带 `出处`(溯源用)**:How 颗的 `出处` 在每个 step 上(这步来自哪些卡);What/Why 颗在颗级给 `出处`(这颗来自哪些卡,如 ["图3","卡片2"])。出处填卡片号(图N=第N张图,卡片N=视频第N段),让前端能点回原图/原视频段。
+
+### What(是什么)— role 主 或 组件
+`概要`(**唯一必填**,一句话这是什么,做锚点)+ `kind`(**必填**:恰好取 `子集` / `多维关系` / `序列` 之一,**勿写变体**如"多维度关系")+ `维度拆分规则`(**仅子集填**:这组选项的**单一划分轴**短词,如「冲突范围」;**套不出单一轴就填 `类型枚举`**;多维关系/序列填 null)+ `body`:**1..N 个扁平条目**,每条 `{item_name, item_desc, 作用域:[]}`(无小节、无形式标)。无 steps。+ 颗级 `出处`。
+
+**先判这颗 What 是哪种(决定 item_desc 要不要带"何时选"):**
+按"部件之间什么关系"分三种(两步判:①部件是**可挑着用的选项/清单(挑一个或多个都行)**?→ `子集`;②否则**多个组成部分/维度并陈、不是挑出来的**——有"从头到尾的时间/线性先后"(换序就读不通)?有→`序列`;没有(只是并列的组成/侧面/大小层级)→`多维关系`):
+- **`子集`型**(**并列·挑着用·可多挑**):「X 有 A/B/C 几种/几个」,**各自独立、不合成一个整体**,按需**挑一个或多个**(如 7种叙事结构、冲突四类型、构图六法、标题九技巧)。落点 = **元素选择**——**每条 `item_desc` 必须把原帖给的「何时/为何选它」一并写进去**(没有"何时选",AI 只能背不能选 = 这颗废了一半)。
+  - **填 `维度拆分规则`**:先试**单一轴**——套进"**按【X】分,每个选项都是 X 上的一个取值**":
+    - 套得进 → 填那**一个短词**,命名"按什么分"的**轴**、**不是分出来的结果/效果**,且**禁用"与/、/及其"拼两个**。✅ 冲突三层面→`冲突范围`(内心/个人/社会);拍摄构图→`构图的几何布局`(**不是**"画面视觉效果");Vlog五公式→`想引发的观众反应`(**不是**"内容驱动目的")。
+    - **套不进**(选项是各按不同东西命名的大杂烩、找不到统一轴)→ 老实填 **`类型枚举`**,**别硬拼假轴**。❌ 7种叙事结构(非线性按时间序、多线按线数、嵌套按套层…无统一轴)、9种标题技巧(句式/心理/内容混杂)→ 都填 `类型枚举`,别写"叙事组织逻辑与时间线""心理触发机制/切入视角"这种拼凑。
+- **`多维关系`型**(**几块并列的组成部分/维度/层级,彼此无时间先后**):一个对象由**几块并列的组成**、或从**几个不同维度/侧面**刻画,**之间没有"从头到尾"的时序**——三种形态都算:① **正交侧面**(人物=生理/社会/心理);② **构成要素**(前提=立场+人物+冲突+结论、场景四要素);③ **大小层级/包含**(故事结构=节拍⊂场景⊂序列⊂幕,**只是粒度不同、不是时间先后**)。⚠️部件由本帖内容决定、不固定;**不要求凑齐**(给几块写几块)。与子集的区别:**子集是同类选项、从中挑**(7种叙事结构都是"一种结构");**多维关系是几块并列、不是挑**。**每条 body 条目 = 一块**:item_name=部件/维度名,item_desc=展开内容(子值并入 item_desc,不另起一层)。落点 = 各部件及其内容。
+- **`序列`型**(**沿作品从头到尾的时间/线性先后**):「X 由 A→B→C **按发生时间、或在作品里从头到尾的位置**排成,**换序就读不通**」(如 故事五部分 激励事件→…→结局、黄金三段式 开头→中间→结尾)。⚠️**只认这种"从头走到尾"的线性先后**;**"大的套小的"包含/层级(节拍⊂场景⊂幕)不是序列**——那是粒度不同的并列组成,归 `多维关系`。后段**不消费**前段产出——若后段吃前段产出、换序就崩,那是 **how 工序**不是 what。落点 = 完备性+顺序,**body 按序排列**,`item_desc` 只写"是什么"。
+
+每条 body 条目 `{item_name, item_desc, 作用域:[]}`:
+- `item_name`:要点名(如 静态冲突 / 激励事件)。
+- `item_desc`:忠实保留原帖对该点的描述,几句留几句。**子集型**还要把原帖给的「何时/为何选它」并入这段(严格抽取——原帖没说就只写是什么,别编)。
+- `作用域`:**一律留空 `[]`**(item 级作用域当前不用,③ 只填颗级)。
+- ⚠️ **保留原文、不转译不脑补(What 的命根)**:`概要 / item_desc`**尽量照搬原帖原话**——能引原文就引,少改写、少换词;**原帖给了几句就留几句,别压成一句**(这是知识本体,删了就废)。**严禁补原帖没有的内容**:原帖写"生理(性别、年龄、外表)"就只写这些,不许擅自加"遗传";原帖只给公式"作者立场+人物+冲突+结论"就照写,不许替作者给每个词编定义。**宁可保留原帖的口语/不完美措辞,也不要 AI 润色后的"漂亮转译"。**
+- 若某点有**子结构**(如"三幕式"含一幕/二幕/三幕),把**每个子点的原文描述都带进 `item_desc`**(可分行)。例:三幕式 item_desc 应含"一幕交代背景人设、二幕是主体冲突升级、三幕高潮爆发并解决",而不是只写"分一二三幕"。
+- **别套模板**:条目数由本帖内容决定。
+> 组件 what:对应某 how 的某一步(那步的产出物),但本身是独立一颗、可单独复用。不对应任何步 → 就是单独的一条(role=主)。
+> ⚠️ 子集型即使原帖只列了选项没说何时用 → `item_desc` 只写是什么(别编"何时选"),但仍要标 `kind:子集` 并给 `维度拆分规则`。
+
+### Why(为什么)— role 主 或 组件
+`阐述`(**唯一必填**,一段连贯文字:这条原理**是什么 + 为什么成立/起作用**)。无 steps、无小节、无形式标。+ 颗级 `出处`。
+- **忠实整合(命根)**:把原帖讲这条原理的几张卡,缝成一段**读得通的话**。
+  - ✅ 允许(为通顺):串接、调顺序、加连接词、删重复。
+  - ❌ 禁止(守忠实):改实质、补原帖没有的观点、润色成"漂亮转译"、把描述改成祈使("应/必须/严禁")。
+- **只说"是什么+为什么",不延伸"怎么用"**:原帖即便给了创作建议,也按原话留在阐述里、不单独加工成取舍/操作指令——"怎么用"是下游的事。一句话:**AI 只做缝,不做编,不教怎么用。**
+> 组件 why:对应某 how 的某一步(那步的依据/原理),但本身是独立一颗、可单独复用。不对应任何步 → 就是单独的一条(role=主)。
+> ⚠️ 阐述里**只还原原理本身**(是什么+为什么),原帖即使顺带给了"该怎么做"的建议,也别把它单独拎出来加工成指令——按原话融在阐述里即可。
+
+---
+
+## C. 组件链接判据(分类之后才问)
+
+每颗 What/Why 都已是独立一颗(A节)。**定死:只有两态**——要么对应某 how 的某一步(组件),要么单独的一条(主)。没有第三种。
+
+> **这颗 What/Why 对应某 how 的某一步吗?**(what = 那步的产出物;why = 那步的依据/原理)
+> - **是 → 标 `role=组件, parent={how_id,step}`**(仍是独立一颗,只多一条到 how 的链接)。
+> - **否 → `role=主, parent=null`**(就是单独的一条)。
+> - **反向提醒**:如果某"指令"只是某步一次性的话、脱离那步就不成立、无复用价值 → 它**不该单独成颗**,留在 step 的 directive 里即可。
+> - **N 选 1 并列清单**:一组「X 种结构 / X 种手法 / X 个要素」整体可复用 → 它就是一颗 **What(子集型)**,不是 how 的步骤。
+
+> ⚠️ 本文示例(含下方模板里的词)都只是示意结构,**值一律从本帖内容抽,别套用示例里的任何具体词**。
+
+---
+
+## D. 创作 vs 制作(剔除写进 `dropped`)
+剔:纯工艺执行(器材/打光/剪辑软件/调色/导出)、具体素材、太空泛。
+边界看「设计决策 vs 工艺执行」:景别/构图/字幕/结构=设计决策→保留为 step;操作设备软件那层→剔。
+
+**整颗级 drop(兜底——①若已判越界整帖 is_empty 就不会到这;这里拦"混在 in-scope 里的越界颗")。按两轴判,任一不过即 drop:**
+1. **轴A 不过·产出物不是内容**:这颗教你做出来的是"题材本身"而非"关于它的内容"——游戏玩法/关卡设计、产品开发、电商/运营/选品、行业分析等 → drop(同样讲游戏:做游戏=drop,做游戏视频=收)。
+2. **轴B 不过·是制作不是创作**:一整颗全是「打开某 App/小程序 → 粘贴/点按钮 → 设参数 → 生成/导出」的工具操作路径,没有可迁移的创作决策 → drop。判据:把平台名一换这套就失效 = 不可迁移 = 制作不是创作。
+> ⚠️ **别靠硬标业务阶段蒙混过关**:业务阶段(灵感/选题/脚本)是给 in-scope 颗用的;一颗越界(游戏/工具操作)却被硬塞个"脚本/选题"来过关 = 错。**贴不上三值本身就是越界信号**——该 drop,不是改标签。
+
+---
+
+## E. 轻标签(顺手打,按类型分流)
+
+| 标签 | how | what | why | 取值 |
+|---|:--:|:--:|:--:|---|
+| 知识类型 | ✓ | ✓ | ✓ | how/what/why(已在 type 字段) |
+| 业务阶段(颗级多值,**必填≥1**) | ✓ | ✓ | ✓ | 灵感/选题/脚本 |
+| 创作阶段(**每步1个**) | ✓ | ✗ | ✗ | 定向/构思/结构/成文/打磨 |
+| 动作(**每步1个**,开放) | ✓ | ✗ | ✗ | 具体手法,帖子语言 |
+
+> 创作阶段/动作只有 how 有(要有步骤)。what/why 只给业务阶段。
+> **业务阶段每颗至少 1 个、不许空**:按"这条知识用在内容创作的哪个环节"判——找方向/找题材前的认知=灵感;定具体选题/角度=选题;写脚本/正文/结构=脚本(可多选)。**拿不准就选最贴近的,但只能在这三个里选**;三个都贴不上 → 见 D节,这颗多半不是内容创作知识,回头看是否该 drop(而不是硬塞一个或留空)。
+> 含义对齐:灵感/选题/脚本是**内容创作的业务环节**,不是泛义的"阶段";别把游戏设计/产品改造这类硬塞进"脚本"。
+
+---
+
+## framework.json 模板(②产出,作用域留空待③)
+
+```json
+{
+  "source": {"id":"xhs_<id>","source_type":"post","title":"<原帖标题>","author":"<作者>",
+             "source_metadata":{"platform":"<小红书/抖音>","url":"<…>","date":"<…>"}},
+  "knowledges": [
+    {
+      "id": "k1", "type": "how", "role": "主", "parent": null,
+      "title": "<框架名,从本帖抽>", "purpose": "<一句话目标>", "业务阶段": ["<灵感/选题/脚本,可多选>"],
+      "steps": [
+        {"id":"s1","input":"<这步吃什么:首步=工序总输入;后步实指前步产出物原话,如 ← s1 的〈赛道圣经句清单〉>","directive":"<方法,含判断标准,原帖示例用 例:『…』 原文保留>","output":"<这步吐什么,会成下一步 input>",
+         "出处":["<图N/视频时间>"],"创作阶段":"<定向/构思/结构/成文/打磨>","动作":"<这步的具体手法,从内容抽>","作用域":[]}
+      ],
+      "dropped": ["<剔除项 — 理由>"]
+    },
+    {
+      "id": "k2", "type": "what", "role": "组件", "parent": {"how_id":"k1","step":2},
+      "title": "<某 how 步骤产出的、可独立复用的清单/构成名>", "业务阶段": ["<…>"],
+      "出处": ["<这颗来自哪些卡片,如 图3 / 卡片2>"],
+      "概要": "<一句话这是什么(必填)>", "kind": "<子集 / 多维关系 / 序列(必填)>",
+      "维度拆分规则": "<仅子集:单一划分轴短词(命名轴、不是结果),如 冲突范围;无单一轴填 类型枚举;多维关系/序列填 null>",
+      "body": [
+        {"item_name":"<要点名>","item_desc":"<忠实保留原帖描述,几句留几句;有子结构带各子点描述;子集型把『何时/为何选它』并入>","作用域":[]},
+        {"item_name":"<另一条>","item_desc":"<…>","作用域":[]}
+      ],
+      "作用域": []
+    },
+    {
+      "id": "k3", "type": "why", "role": "主", "parent": null,
+      "title": "<原理名>", "业务阶段": ["<…>"], "出处": ["<这颗来自哪些卡片>"],
+      "阐述": "<一段:这条原理是什么+为什么成立。忠实整合原帖几张卡原话——可缝接,不可改实质/补/润色/转祈使>",
+      "作用域": []
+    }
+  ]
+}
+```
+
+## 过关条件 → 进 ③
+- 颗数合理(how 主颗 + 组件颗 + orphan,可混);每颗有 type/role/parent。
+- **每颗 how 都过了 A2节 两道闸**:步骤真有序(后步吃前步)+ 最后一步 output = purpose 收尾名词。并列招式已改 What;半截工序已补收尾或已降 purpose。
+- **决策落点都落到了**:how 每步有 `input`(首步=工序输入,后步指向前步产出);what `kind` 已填、子集型 `维度拆分规则` 已填且每条 `item_desc` 含「何时/为何选」(原帖没说才只写是什么);why `阐述` 已忠实整合(无改实质/补/润色/转祈使)。
+- how 颗:每步 input/directive/output/出处 + 创作阶段 + 动作;what 颗:概要 + kind + 维度拆分规则(子集) + body 条目(item_name/item_desc);why 颗:title + 阐述(忠实整合"是什么+为什么")。
+- 组件颗有 parent cross-ref;**每颗业务阶段非空(≥1,∈灵感/选题/脚本)**;贴不上三值的非内容创作颗已 drop。
+- 纯软件操作流程 / 非内容创作题材已整颗 drop(D节)。
+- 所有颗的 `作用域` 留空(含 how 的每步),③ 来填。

+ 145 - 0
app/frontend/dist/legacy-decode/prompt-skill/phase2-scope.md

@@ -0,0 +1,145 @@
+# ③ 作用域(重)
+
+本步**只干一件事**:给 ②产出的每颗知识标 5 类作用域里相关的几类,每类**平铺标出所有相关的具体值**,并把每个值**定位**到 5 棵分类树。
+不碰框架结构、不碰其它标签(那些 ② 已做)。
+
+> ⚠️ **本文里出现的所有具体词(食材搭配、制造悬念、治愈感…)都只是「示例」**,用来帮你认清每一类管什么。
+> **真正的值必须从当前这篇帖子的内容里抽,严禁照搬示例里的任何词。**
+> 作用域的「值」是**开放**的(定位不上就新建),固定的只有 5 个**类别**。
+
+**按类型分粒度**:
+- **How 颗**:**逐步**标——每个 step 一组作用域(写回 `step.作用域`)。
+- **What / Why 颗**:**颗级**标——整颗一组作用域(写回 `knowledge.作用域`);读 What 的 `概要` + `body`各条目(item_name/item_desc)、Why 的 `阐述`(整段)来判。
+
+> 这是全流程最容易"串味"的一刀(5 类边界模糊),所以单独、写厚。判不准就标空 `[]`,不硬塞。
+
+## 核心原则:平铺多值 + 摊正交(贯穿 5 类)
+
+- 每类不是"给一个值",而是标出这颗在这类里**真正涉及的所有值**,**全部对等、不选主次、不限数量**——一颗真有 3 个实质就标 3 个,只有 1 个就 1 个。
+- 标多值前先脑内把它们**摊成几路不同视角(facet)**:同一视角下的值必须是**同一上位语义类型**(讲人物的归人物、讲题材的归题材);若发现是近义或子面(人物 / 人物性格 / 人物动机)→ **收敛回一个**,别堆。
+- "视角"只是**脑内组织、不输出成字段**;输出仍是多条 `{scope_type, value}`,定位由代码事后做。
+- 意图除外:意图讲终极目的,**自然收敛到很少**(多为 1 个),不强求多值。
+
+---
+
+## 1. 五类列定义(认清各管什么;所有示例**勿照搬**)
+
+> **`substance` 实质 —— 这颗讲的实质信息("呈现了什么")**
+> 题材 / 对象 / 实体 / 概念 / 行为 / 关系。
+> - **平铺多值、摊正交**:一颗真覆盖几个实质就标几个,不选主次、不限数量;同一视角下的值同一上位语义类型,近义/子面收敛回一个。
+> - **边界**:≠形式(那是"怎么呈现");≠作用(那是创作效果,如"节奏控制");≠感受。✅「增肌动作」「冲突设置」=实质;❌「步骤分解」是形式。
+> - **格式**:名词短语,砍前置动作动词(定位/揭示/制造… → 认知裂缝/人物刻画/悬念),原子化,专有名可略长。
+
+> **`form` 形式 —— 剥离题材后、可迁移到别的题材的"怎么呈现/组织/表达"(覆盖视觉/文字/音频三模态)**
+> 形式只改变**接收体验**(同一实质换种形式 → 理解/情绪/节奏/传播都变),不改变"讲什么"。平铺多值、摊正交。
+> - **核心判据·可迁移性**:自检「**把题材换掉,这个"形式"还成立、还能照搬到别的题材吗?**」成立 → 是形式(三幕结构、悬念开头、九宫格排版);只在这个题材里成立 → 那是实质。
+> - **偏结构/手法层(关键分工)**:创作知识的形式重在**结构与手法**(叙事结构 / 悬念 / 对比 / 钩子 / 句式);**具体表层呈现(配色 / 景别 / 字体 / 运镜)只在原帖把它当"原则/方法"教时才标,否则不追**——那是下游"形式元素"逐帧拆样片的活,我们不抢。
+>   - 例:帖子讲「短视频前3秒要用悬念钩子」→ 标 `悬念钩子`(结构手法 ✅);帖子只是某画面恰好用了高饱和配色、并没教"要用高饱和" → **不标**(只是样片表层,不是这条知识的形式)。
+> - **三模态别漏**:视觉(构图/排版/字体动效)、文字(修辞/句式/叙事手法)、音频(语气/配乐)。
+> - **实质剥离**:剥掉它承载的题材。❌`剧本三幕结构`→✅`三幕结构`;❌`美食九宫格`→✅`九宫格排版`。
+> - **边界**(用判据划清):↔**实质** = 题材绑定 vs 题材无关(可迁移性就是分界线);↔**作用** = 手法本身 vs 它达成的功能("悬念开头"是形式,"勾注意力/制造悬念"是作用)。
+> - **格式**:名词/形容词短语(三幕结构、口语化、排比句式、慢节奏),原子化、砍前置动作动词。
+
+> **`feeling` 感受 —— 这颗内容勾起观众的情绪体验("看的人感到什么")**
+> - **平铺多值、摊正交**:一颗能同时勾多种感受(好奇 + 羞耻),都对等标上。
+> - **要具体到"这颗真正勾的那种"**:别用可套万物的宽泛情绪(紧张/震撼/感动),能更准就更准(面对两难抉择那种 →「两难煎熬感」,比「紧迫感」贴)。定位分偏低(<0.75)只说明树里还没有,正常新建。
+> - **边界**:感受=**观众实际感到的**,≠意图(创作者想要的)、≠作用(段内功能)。✅「治愈感」「羞耻感」=感受;❌「促进收藏」是意图。
+> - **格式**:情绪名词/形容词,砍前置动作动词(营造治愈感 → 治愈感)。
+
+> **`effect` 作用 —— 这颗帮创作者在内容里干成的活 / 创作效果(动名词)**
+> - **"手段层"**:段落 / 手法在内容里**起的功能**(创作元动词名词化——展示/强化/铺垫/对比/收束 → 强化、铺垫、对比、悬念设置、节奏控制)。
+> - **平铺多值、摊正交**:一颗常同时起几种作用(制造悬念 + 节奏控制),都对等标。
+> - **边界(最易串)**:作用=**创作效果/段内干的活(手段)**,≠意图(最终目的)、≠实质(讲的对象)、≠形式(结构形态)。✅「冲突」「看点」「节奏控制」=作用;❌「完播」是意图、「三幕结构」是形式。
+> - **格式**:**动名词**——名词+动作语素后缀(营造/设置/引导/控制)保留、是对的;只砍前置裸动词(「制造悬念」→「悬念」或「悬念设置」)。
+
+> **`intent` 意图 —— 创作者做这颗最终图什么(创作目的·必须动词)**
+> - 对齐意图树(仅 46 节点、讲终极目的),**自然收敛到很少**(多为 1 个,偶 2 个);真有多个目的(科普 + 引流)才标多。
+> - **层级对齐(别跳层)**:值贴**这颗本身的层级**——具体工具/手法颗标它自己那层(某叙事工具 →「勾住注意力/驱动情节」),别跳到整条内容的运营终极目标(涨粉/完播/下单),那是更大颗的意图,贴小颗上就串味。
+> - **边界**:意图=**创作者最终目的**,≠作用(手段/段内效果)、≠感受(观众情绪)。✅「科普」「引流」「种草」=意图;❌「制造悬念」是作用。
+> - **格式**:**动词**(科普/教学/引流/呼吁/种草/批判),别写成名词(流量/完播率/人设 → 引流/提升完播/立人设)。
+
+**一颗/一步不必 5 类都给**——只给真正涉及的;判不准的类标空 `[]`。
+
+---
+
+## 2. 互斥边界(最容易错;反例跨题材,看的是"归类逻辑"不是词本身)
+
+判每个值前,先过这几条边界,确认它没站错列:
+
+- **实质 ↔ 形式**:实质=讲什么(内容对象);形式=怎么呈现(结构/手法)。✅「增肌动作」=实质;「步骤分解」=形式。
+- **实质 ↔ 作用**:实质=讲的对象本身;作用=帮创作者做成的**创作效果**(动名词)。✅「通勤穿搭」=实质;「节奏控制」=作用。
+- **作用 ↔ 意图**:作用=创作动作/效果(**手段层**);意图=**最终**想要的结果(目的层)。✅「看点」=作用;「完播」=意图。
+- **感受 ↔ 意图**:感受=**观众**的情绪体验;意图=**创作者**的目的。✅「治愈感」=感受;「促进收藏」=意图。
+- **形式 ↔ 作用**:形式=呈现的**结构形态**;作用=帮创作者达成的**创作效果**。✅「对比清单」=形式;「节奏控制」=作用。
+- **层级对齐(意图别跳层)** / **自洽(值别和这颗自相矛盾)**:一颗讲「打破/反某结构」的知识,`substance` 不能标那个"被打破的结构"本身;先想清这颗到底在讲什么,再起词。
+
+---
+
+## 3. 值的格式与多值约束
+
+1. **词性按类**:实质/形式/感受 = 名词/形容词短语;**作用 = 动名词**(营造/设置/引导后缀保留,只砍前置裸动词);**意图 = 动词**。多为 2-4 字、上限约 6 字(专有名可略长,别写成长句否则定位不上)。
+2. **原子化(拆到"独立有意义的概念"为止,平铺多值)**:
+   - **含连接词(和/与/、/,)必拆**(代码也会兜底拆)。例:`主使人物与对立人物`→`主使人物`+`对立人物`;`社会共识与个体真实矛盾`→`社会共识`+`个体真实`。
+   - **把捆在一起的几个独立概念拆开,但拆到"概念"为止、别再往下碎**。例:`爆款选题逻辑`→`爆款`+`选题逻辑`("选题逻辑"是个完整方法概念,**别再削成`选题`、也别丢掉`逻辑`**);`短视频创意策略`→`短视频`+`创意策略`。
+   - **底线·空壳词不单独成值**:`逻辑 / 信号 / 模型 / 策略 / 方式`这类单独拎出来是放之四海的空壳,**不单独成一个值**;但它们和题材组成的完整概念(`选题逻辑`、`爆款信号`)**是合法原子**——别为了去壳反而把概念拆没了。
+   - **张力/对照若本身就是要表达的实质**:用**单个不含连接词的词**命名(如 `虚实对照`、`知行落差`),别写成"虚拟与现实"这种连接式(会被拆开、丢掉那层关系)。
+3. **平铺多值、摊正交**(见核心原则):同一类的多个值必须是不同视角、同一视角内同一上位语义类型;近义/子面收敛回一个。
+4. **不跨类重复**:一个值只进它该进的那列。
+5. **去重**:同一组同一类不重复同义值。
+6. 用**本帖语境里的具体词**,不要泛词("内容/主题/信息"),更不要照搬本文示例词。
+
+---
+
+## 4. 判别顺序(每个候选值按序过一遍)
+
+1. **范畴检查**:它是"讲什么/怎么呈现/勾情绪/起功能/图什么"哪一类?(对照 第1节+第2节,站错列就移列或剔除)
+2. **原子检查**:复合?→ 拆。整句?→ 精简成短词。
+3. **正交检查**:同一类已有的值里,它是不是某个值的近义/子面?是 → 收敛,别堆。
+4. **泛词检查**:放之四海皆准的框架词、或本文示例词?→ 剔或换成本帖具体词。
+5. 通过 → 进定位(第5节)。
+
+---
+
+## 5. 执行三阶段
+
+### 阶段一 · 提候选值(平铺多值)
+逐组读这颗(how 读 `input/directive/output`;what 读 概要+body各条目;why 读 阐述整段)的真实内容,按 第1节-第4节 标相关的几类,**每类把这颗真正涉及的值全部平铺列出**(先脑内摊正交、收敛近义),意图通常 1 个。
+
+### 阶段二 · 定位对齐(调工具)
+对每个候选值跑:
+```bash
+python 创作知识提取-skill/tools/scope-link.py "<候选值>" --type <substance/form/feeling/effect/intent> --top-k 5
+```
+按返回的 top-1 余弦分判定:
+- **≥ 0.90**:复用返回的 `name`(value 写树原名),记 `link: "复用"`、`score`。
+- **0.75–0.90**:看 top-K 有没有**真同义**的——有就复用其 name,没有就用自己的候选值(新值)。
+- **< 0.75**:保留候选值为**新值**,记 `link: "新建"`、`score`(顺手丰富树)。
+
+> 定位是代码(火山 embedding 最近邻),你只负责"起词"和"看分判定复用/新建";**树上没有不是问题,新建即可**。
+
+### 阶段三 · 验证(自检)
+- 每个值都过了 第2节 边界、第3节 原子+正交、第4节 泛词?**有没有照搬本文示例词?**
+- 同一类的多个值是不是真不同视角(没堆近义)?同一组没有跨类重复值?
+- 判不准 / 模糊两可的类 → 标空 `[]`,别猜。
+
+---
+
+## 6. 输出格式(写回 `作用域`;下面是中性示例,值要换成本帖真实值)
+
+```json
+"作用域": [
+  {"scope_type":"substance","value":"<实质值1>","link":"复用","score":0.93},
+  {"scope_type":"substance","value":"<实质值2,另一视角>","link":"新建","score":0.61},
+  {"scope_type":"form","value":"<形式值1>","link":"复用","score":0.91},
+  {"scope_type":"form","value":"<形式值2,另一模态>","link":"新建","score":0.58},
+  {"scope_type":"effect","value":"<作用值>","link":"新建","score":0.66},
+  {"scope_type":"intent","value":"<意图值,通常1个>","link":"新建","score":0.55}
+]
+```
+- **同一类可出现多条**(平铺多值);`value`=定位后最终值(复用=树原名,新建=候选词)。
+- `link`:`复用` / `新建`(前端 drawer 用)。`score`:top-1 余弦分(留痕)。
+
+## 过关条件 → 进 ⑤组装
+- 每颗/每步 `作用域` 已填(相关类带值、无关类不出现/标空);**该多值的类已平铺、未硬压成单值**。
+- 每个值都定位过、有 link+score。
+- 边界没串味、值原子、同类多值无近义堆叠、无泛词、**没照搬示例词**。

+ 1 - 0
app/frontend/dist/legacy-decode/runs/index.json

@@ -0,0 +1 @@
+[]

BIN
app/frontend/public/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_1.webp


BIN
app/frontend/public/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_10.webp


BIN
app/frontend/public/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_11.webp


BIN
app/frontend/public/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_12.webp


BIN
app/frontend/public/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_2.webp


BIN
app/frontend/public/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_3.webp


BIN
app/frontend/public/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_4.webp


BIN
app/frontend/public/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_5.webp


BIN
app/frontend/public/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_6.webp


BIN
app/frontend/public/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_7.webp


BIN
app/frontend/public/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_8.webp


BIN
app/frontend/public/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_9.webp


+ 2022 - 0
app/frontend/public/legacy-decode/frameworks.json

@@ -0,0 +1,2022 @@
+{
+ "count": 1,
+ "posts": [
+  {
+   "post_id": "699308fa0000000016009697",
+   "source_id": "xhs_699308fa0000000016009697",
+   "title": "真正能爆的选题,往往是你写完后感觉羞耻的",
+   "platform": "xiaohongshu",
+   "url": "https://www.xiaohongshu.com/explore/699308fa0000000016009697",
+   "media": {
+    "type": "image",
+    "video_url": null,
+    "images": [
+     "/app/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_1.webp",
+     "/app/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_2.webp",
+     "/app/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_3.webp",
+     "/app/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_4.webp",
+     "/app/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_5.webp",
+     "/app/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_6.webp",
+     "/app/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_7.webp",
+     "/app/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_8.webp",
+     "/app/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_9.webp",
+     "/app/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_10.webp",
+     "/app/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_11.webp",
+     "/app/legacy-decode/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_12.webp"
+    ]
+   },
+   "cards": [
+    {
+     "index": 1,
+     "content": "真正能爆的选题往往是写完后让人感觉羞耻的,因为太正确的选题缺乏情绪共鸣。",
+     "image_url": "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_1.webp"
+    },
+    {
+     "index": 2,
+     "content": "",
+     "image_url": "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_2.webp"
+    },
+    {
+     "index": 3,
+     "content": "羞耻感是好选题的防伪标签,因为它意味着触碰了真实但被包裹的痛点。",
+     "image_url": "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_3.webp"
+    },
+    {
+     "index": 4,
+     "content": "如果写完后内心没有波澜、觉得没问题,大概率是无感选题;而写完后有点犹豫或不好意思,则可能是好选题。",
+     "image_url": "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_4.webp"
+    },
+    {
+     "index": 5,
+     "content": "冒犯感是对正确共识的撕裂,能触动公共痛点,引发观众共鸣。",
+     "image_url": "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_5.webp"
+    },
+    {
+     "index": 6,
+     "content": "真正的爆款选题带有冒犯感,不是脏话式的冒犯,而是对正确共识的挑战。",
+     "image_url": "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_6.webp"
+    },
+    {
+     "index": 7,
+     "content": "没有情绪触发的内容不可能爆红,安全的选题等于无感。",
+     "image_url": "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_7.webp"
+    },
+    {
+     "index": 8,
+     "content": "寻找共识崩塌的场景,比如职场中‘能力强的人一定会被看见’这一信念的失效时刻。",
+     "image_url": "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_8.webp"
+    },
+    {
+     "index": 9,
+     "content": "实操方法:找到赛道中的‘圣经句’(正确共识),然后找到它失效的场景。",
+     "image_url": "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_9.webp"
+    },
+    {
+     "index": 10,
+     "content": "第一招:寻找正确共识的失灵瞬间,问自己什么情况下严格按这句话做反而越做越差。",
+     "image_url": "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_10.webp"
+    },
+    {
+     "index": 11,
+     "content": "第二招:去竞品评论区找‘懂但没说出口’的评论(‘但是……’类型的评论),这些是经过市场验证的选题。",
+     "image_url": "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_11.webp"
+    },
+    {
+     "index": 12,
+     "content": "",
+     "image_url": "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_12.webp"
+    }
+   ],
+   "knowledges": [
+    {
+     "id": "k1",
+     "type": "how",
+     "role": "主",
+     "parent": null,
+     "title": "爆款选题双招法",
+     "purpose": "产出一个能引发情绪共鸣的爆款选题",
+     "业务阶段": [
+      "选题"
+     ],
+     "steps": [
+      {
+       "id": "s1",
+       "input": "选定目标赛道",
+       "directive": "提取该赛道中被广泛默认、反复复述的‘圣经句’(即正确共识),如『能力强的人一定会被看见』;必须是大众信奉但未经质疑的断言。例:『…能力强的人一定会被看见…』",
+       "output": "〈赛道圣经句〉",
+       "出处": [
+        "卡片9"
+       ],
+       "创作阶段": "定向",
+       "动作": "提取共识句",
+       "作用域": [
+        {
+         "scope_type": "substance",
+         "value": "赛道圣经句",
+         "candidate": "赛道圣经句",
+         "link": "新建",
+         "score": 0.5348,
+         "top": [
+          {
+           "name": "人生哲理",
+           "score": 0.5348,
+           "path": "/理念/观念/个人观念/人生感悟/观点表达/人生哲理"
+          },
+          {
+           "name": "标语",
+           "score": 0.5054,
+           "path": "/表象/视觉/符号/文字符号/标语"
+          },
+          {
+           "name": "谚语",
+           "score": 0.5047,
+           "path": "/理念/知识/文化/语言文字/谚语"
+          }
+         ]
+        },
+        {
+         "scope_type": "substance",
+         "value": "正确共识",
+         "candidate": "正确共识",
+         "link": "新建",
+         "score": 0.6723,
+         "top": [
+          {
+           "name": "通用共识符号",
+           "score": 0.6723,
+           "path": "/表象/视觉/符号/图案符号/标识图案/通用共识符号"
+          },
+          {
+           "name": "通识百科",
+           "score": 0.5524,
+           "path": "/理念/知识/文化/传统文化/文化知识/通识百科"
+          },
+          {
+           "name": "认知思辨",
+           "score": 0.5432,
+           "path": "/理念/知识/思想/概念范畴/认知思辨"
+          }
+         ]
+        },
+        {
+         "scope_type": "substance",
+         "value": "大众信奉断言",
+         "candidate": "大众信奉断言",
+         "link": "新建",
+         "score": 0.5042,
+         "top": [
+          {
+           "name": "民间传说",
+           "score": 0.5042,
+           "path": "/理念/知识/文化/民间传说"
+          },
+          {
+           "name": "意识形态",
+           "score": 0.492,
+           "path": "/理念/知识/思想/思想理论/政治思想/意识形态"
+          },
+          {
+           "name": "个人观念",
+           "score": 0.4916,
+           "path": "/理念/观念/个人观念"
+          }
+         ]
+        },
+        {
+         "scope_type": "form",
+         "value": "提取法",
+         "candidate": "提取法",
+         "link": "新建",
+         "score": 0.5628,
+         "top": [
+          {
+           "name": "方法建议",
+           "score": 0.5628,
+           "path": "/架构/策略/互动方式/实用指引/方法建议"
+          },
+          {
+           "name": "归纳提炼",
+           "score": 0.5485,
+           "path": "/架构/逻辑/信息编排逻辑/归纳论证/归纳提炼"
+          },
+          {
+           "name": "概括浓缩",
+           "score": 0.5416,
+           "path": "/架构/逻辑/信息编排逻辑/归纳论证/归纳提炼/概括浓缩"
+          }
+         ]
+        },
+        {
+         "scope_type": "effect",
+         "value": "共识",
+         "candidate": "共识",
+         "link": "新建",
+         "score": 0.5708,
+         "top": [
+          {
+           "name": "情感共鸣",
+           "score": 0.5708,
+           "path": "/表达/互动引导/情感连接/情感共鸣"
+          },
+          {
+           "name": "解决方案",
+           "score": 0.5446,
+           "path": "/表达/论证说理/解决方案"
+          },
+          {
+           "name": "价值肯定",
+           "score": 0.5343,
+           "path": "/表达/论证说理/分析论证/论证评判/肯定论证/价值肯定"
+          }
+         ]
+        },
+        {
+         "scope_type": "intent",
+         "value": "识别共识起点",
+         "candidate": "识别共识起点",
+         "link": "新建",
+         "score": 0.4449,
+         "top": [
+          {
+           "name": "事实呈现",
+           "score": 0.4449,
+           "path": "/信息传递/事实呈现"
+          },
+          {
+           "name": "解读",
+           "score": 0.4326,
+           "path": "/信息传递/知识传递/解读"
+          },
+          {
+           "name": "行为引导",
+           "score": 0.4271,
+           "path": "/行为引导"
+          }
+         ]
+        }
+       ]
+      },
+      {
+       "id": "s2",
+       "input": "← s1 的〈赛道圣经句〉",
+       "directive": "针对该句,追问:什么情况下严格按这句话做,反而导致结果恶化?即寻找其失效的现实场景(共识崩塌点)。例:『职场中能力强却长期被埋没、汇报不力反被提拔』",
+       "output": "〈共识失灵场景清单〉",
+       "出处": [
+        "卡片8",
+        "卡片10"
+       ],
+       "创作阶段": "构思",
+       "动作": "逆向推演失效场景",
+       "作用域": [
+        {
+         "scope_type": "substance",
+         "value": "共识失灵场景",
+         "candidate": "共识失灵场景",
+         "link": "新建",
+         "score": 0.5923,
+         "top": [
+          {
+           "name": "使用场景",
+           "score": 0.5923,
+           "path": "/理念/知识/商业/产品服务/使用场景"
+          },
+          {
+           "name": "通用共识符号",
+           "score": 0.5892,
+           "path": "/表象/视觉/符号/图案符号/标识图案/通用共识符号"
+          },
+          {
+           "name": "场景感悟",
+           "score": 0.5638,
+           "path": "/理念/观念/个人观念/人生感悟/观点表达/场景感悟"
+          }
+         ]
+        },
+        {
+         "scope_type": "substance",
+         "value": "现实失效条件",
+         "candidate": "现实失效条件",
+         "link": "新建",
+         "score": 0.5311,
+         "top": [
+          {
+           "name": "现实人物",
+           "score": 0.5311,
+           "path": "/表象/视觉/实体/人物/个体/现实人物"
+          },
+          {
+           "name": "逻辑异常",
+           "score": 0.4974,
+           "path": "/理念/知识/思想/逻辑原理/逻辑异常"
+          },
+          {
+           "name": "实力概念",
+           "score": 0.4971,
+           "path": "/理念/知识/政治/国家治理/国家实力/实力概念"
+          }
+         ]
+        },
+        {
+         "scope_type": "substance",
+         "value": "共识崩塌点",
+         "candidate": "共识崩塌点",
+         "link": "新建",
+         "score": 0.6008,
+         "top": [
+          {
+           "name": "通用共识符号",
+           "score": 0.6008,
+           "path": "/表象/视觉/符号/图案符号/标识图案/通用共识符号"
+          },
+          {
+           "name": "集体记忆",
+           "score": 0.5823,
+           "path": "/理念/知识/文化/传统文化/文化知识/集体记忆"
+          },
+          {
+           "name": "地缘冲突",
+           "score": 0.5716,
+           "path": "/理念/知识/政治/国际政治/地缘政治/地缘冲突"
+          }
+         ]
+        },
+        {
+         "scope_type": "form",
+         "value": "反事实追问",
+         "candidate": "反事实追问",
+         "link": "新建",
+         "score": 0.6494,
+         "top": [
+          {
+           "name": "因果逻辑",
+           "score": 0.6494,
+           "path": "/架构/逻辑/叙事逻辑/因果逻辑"
+          },
+          {
+           "name": "反问式",
+           "score": 0.6444,
+           "path": "/架构/修辞/修辞意象/句式辞格/问答句式/反问式"
+          },
+          {
+           "name": "因果推理",
+           "score": 0.6443,
+           "path": "/架构/逻辑/信息编排逻辑/归纳论证/分析解读/因果推理"
+          }
+         ]
+        },
+        {
+         "scope_type": "effect",
+         "value": "共识解构",
+         "candidate": "共识解构",
+         "link": "新建",
+         "score": 0.7691,
+         "top": [
+          {
+           "name": "分析解构",
+           "score": 0.7691,
+           "path": "/表达/信息传达/传达深度/详细说明/分析解构"
+          },
+          {
+           "name": "价值建构",
+           "score": 0.5888,
+           "path": "/表达/论证说理/提炼升华/价值建构"
+          },
+          {
+           "name": "拆解剖析",
+           "score": 0.5854,
+           "path": "/表达/论证说理/分析论证/拆解剖析"
+          }
+         ]
+        },
+        {
+         "scope_type": "effect",
+         "value": "结构性矛盾暴露",
+         "candidate": "结构性矛盾暴露",
+         "link": "新建",
+         "score": 0.5408,
+         "top": [
+          {
+           "name": "矛盾冲突",
+           "score": 0.5408,
+           "path": "/表达/论证说理/分析论证/对比反差/矛盾冲突"
+          },
+          {
+           "name": "结构模式",
+           "score": 0.502,
+           "path": "/结构/结构模式"
+          },
+          {
+           "name": "结构",
+           "score": 0.4949,
+           "path": "/结构"
+          }
+         ]
+        },
+        {
+         "scope_type": "intent",
+         "value": "挖掘认知裂缝",
+         "candidate": "挖掘认知裂缝",
+         "link": "新建",
+         "score": 0.5464,
+         "top": [
+          {
+           "name": "裂变",
+           "score": 0.5464,
+           "path": "/行为引导/裂变"
+          },
+          {
+           "name": "揭露",
+           "score": 0.5336,
+           "path": "/信息传递/事实呈现/揭露"
+          },
+          {
+           "name": "事实呈现",
+           "score": 0.5062,
+           "path": "/信息传递/事实呈现"
+          }
+         ]
+        }
+       ]
+      },
+      {
+       "id": "s3",
+       "input": "← s1 的〈赛道圣经句〉",
+       "directive": "前往同赛道热门竞品评论区,筛选含『但是……』『其实……』『没人敢说……』等转折/压抑表达的评论——这些是用户‘懂但没说出口’的真实痛点,已通过市场反馈验证。例:『标题很干货,但是看完还是不会写』",
+       "output": "〈竞品评论区沉默痛点集〉",
+       "出处": [
+        "卡片11"
+       ],
+       "创作阶段": "构思",
+       "动作": "挖掘评论区未言明反馈",
+       "作用域": [
+        {
+         "scope_type": "substance",
+         "value": "竞品评论区沉默痛点",
+         "candidate": "竞品评论区沉默痛点",
+         "link": "新建",
+         "score": 0.6387,
+         "top": [
+          {
+           "name": "痛点问题",
+           "score": 0.6387,
+           "path": "/理念/知识/商业/产品服务/痛点问题"
+          },
+          {
+           "name": "产品矩阵",
+           "score": 0.5079,
+           "path": "/理念/知识/商业/产品服务/产品矩阵"
+          },
+          {
+           "name": "政策评论",
+           "score": 0.5053,
+           "path": "/理念/观念/社会观念/时政评议/政策评论"
+          }
+         ]
+        },
+        {
+         "scope_type": "substance",
+         "value": "用户未言明真实痛点",
+         "candidate": "用户未言明真实痛点",
+         "link": "新建",
+         "score": 0.7331,
+         "top": [
+          {
+           "name": "痛点问题",
+           "score": 0.7331,
+           "path": "/理念/知识/商业/产品服务/痛点问题"
+          },
+          {
+           "name": "消费体验",
+           "score": 0.5443,
+           "path": "/理念/观念/个人观念/人生感悟/内心感受/消费体验"
+          },
+          {
+           "name": "行业乱象",
+           "score": 0.5379,
+           "path": "/理念/现象/社会问题/文化精神/社会风气/行业乱象"
+          }
+         ]
+        },
+        {
+         "scope_type": "substance",
+         "value": "市场验证型压抑表达",
+         "candidate": "市场验证型压抑表达",
+         "link": "新建",
+         "score": 0.5608,
+         "top": [
+          {
+           "name": "情感表达",
+           "score": 0.5608,
+           "path": "/表象/视觉/行为/人际互动/表达沟通/情感表达"
+          },
+          {
+           "name": "立场表达",
+           "score": 0.5474,
+           "path": "/理念/知识/政治/国际政治/外交立场/立场表达"
+          },
+          {
+           "name": "观点表达",
+           "score": 0.5364,
+           "path": "/理念/观念/个人观念/人生感悟/观点表达"
+          }
+         ]
+        },
+        {
+         "scope_type": "form",
+         "value": "评论区语义",
+         "candidate": "评论区语义",
+         "link": "新建",
+         "score": 0.6481,
+         "top": [
+          {
+           "name": "讽刺评论",
+           "score": 0.6481,
+           "path": "/架构/修辞/语调风格/讽刺犀利/讽刺手法/讽刺评论"
+          },
+          {
+           "name": "情感修辞",
+           "score": 0.5881,
+           "path": "/架构/策略/情感调动/情感激发/情感渲染/情感修辞"
+          },
+          {
+           "name": "反讽句式",
+           "score": 0.5867,
+           "path": "/架构/修辞/修辞意象/句式辞格/反讽句式"
+          }
+         ]
+        },
+        {
+         "scope_type": "form",
+         "value": "转折词筛选",
+         "candidate": "转折词筛选",
+         "link": "新建",
+         "score": 0.5684,
+         "top": [
+          {
+           "name": "逻辑反转",
+           "score": 0.5684,
+           "path": "/架构/叙事/叙事技法/戏剧张力/反转/逻辑反转"
+          },
+          {
+           "name": "差异对比",
+           "score": 0.5595,
+           "path": "/架构/创意/对比反差/反差错位/通用反差/差异对比"
+          },
+          {
+           "name": "情感反转",
+           "score": 0.5263,
+           "path": "/架构/叙事/叙事技法/戏剧张力/反转/情感反转"
+          }
+         ]
+        },
+        {
+         "scope_type": "effect",
+         "value": "真实痛点捕获",
+         "candidate": "真实痛点捕获",
+         "link": "新建",
+         "score": 0.506,
+         "top": [
+          {
+           "name": "细节呈现",
+           "score": 0.506,
+           "path": "/表达/信息传达/传达深度/详细说明/展示呈现/细节呈现"
+          },
+          {
+           "name": "数据实证",
+           "score": 0.5031,
+           "path": "/表达/论证说理/证据支撑/数据实证"
+          },
+          {
+           "name": "情感共鸣",
+           "score": 0.502,
+           "path": "/表达/互动引导/情感连接/情感共鸣"
+          }
+         ]
+        },
+        {
+         "scope_type": "effect",
+         "value": "情感共鸣",
+         "candidate": "情绪共鸣",
+         "link": "复用",
+         "score": 0.9174,
+         "top": [
+          {
+           "name": "情感共鸣",
+           "score": 0.9174,
+           "path": "/表达/互动引导/情感连接/情感共鸣"
+          },
+          {
+           "name": "情感表达",
+           "score": 0.6986,
+           "path": "/表达/情感表达"
+          },
+          {
+           "name": "情感连接",
+           "score": 0.6967,
+           "path": "/表达/互动引导/情感连接"
+          }
+         ]
+        },
+        {
+         "scope_type": "intent",
+         "value": "锚定已验证情绪触点",
+         "candidate": "锚定已验证情绪触点",
+         "link": "新建",
+         "score": 0.5382,
+         "top": [
+          {
+           "name": "情感联结",
+           "score": 0.5382,
+           "path": "/情感联结"
+          },
+          {
+           "name": "情感抒发",
+           "score": 0.4704,
+           "path": "/情感联结/情感抒发"
+          },
+          {
+           "name": "行为引导",
+           "score": 0.4492,
+           "path": "/行为引导"
+          }
+         ]
+        }
+       ]
+      },
+      {
+       "id": "s4",
+       "input": "← s2 的〈共识失灵场景清单〉, ← s3 的〈竞品评论区沉默痛点集〉",
+       "directive": "将二者交叉比对,选取同时满足‘共识崩塌’+‘用户已有压抑共鸣’的交集点,将其转化为具体选题表述,确保带有羞耻感或冒犯感(非攻击性,而是撕裂正确表象)。例:『别再信“努力就有回报”,这届打工人正在用离职投票』",
+       "output": "一个能引发情绪共鸣的爆款选题",
+       "出处": [
+        "卡片1",
+        "卡片5",
+        "卡片6"
+       ],
+       "创作阶段": "结构",
+       "动作": "交叉验证并具象化选题",
+       "作用域": [
+        {
+         "scope_type": "substance",
+         "value": "共识崩塌",
+         "candidate": "共识崩塌",
+         "link": "新建",
+         "score": 0.6191,
+         "top": [
+          {
+           "name": "集体记忆",
+           "score": 0.6191,
+           "path": "/理念/知识/文化/传统文化/文化知识/集体记忆"
+          },
+          {
+           "name": "通用共识符号",
+           "score": 0.6048,
+           "path": "/表象/视觉/符号/图案符号/标识图案/通用共识符号"
+          },
+          {
+           "name": "社会失序",
+           "score": 0.5973,
+           "path": "/理念/现象/社会问题/文化精神/社会风气/社会失序"
+          }
+         ]
+        },
+        {
+         "scope_type": "substance",
+         "value": "用户压抑交集点",
+         "candidate": "用户压抑交集点",
+         "link": "新建",
+         "score": 0.4964,
+         "top": [
+          {
+           "name": "空间区域",
+           "score": 0.4964,
+           "path": "/表象/视觉/空间/空间区域"
+          },
+          {
+           "name": "痛点问题",
+           "score": 0.4826,
+           "path": "/理念/知识/商业/产品服务/痛点问题"
+          },
+          {
+           "name": "空间",
+           "score": 0.4785,
+           "path": "/表象/视觉/空间"
+          }
+         ]
+        },
+        {
+         "scope_type": "substance",
+         "value": "羞耻感选题",
+         "candidate": "羞耻感选题",
+         "link": "新建",
+         "score": 0.5641,
+         "top": [
+          {
+           "name": "人生议题",
+           "score": 0.5641,
+           "path": "/理念/观念/个人观念/人生感悟/人生议题"
+          },
+          {
+           "name": "情绪情感",
+           "score": 0.5142,
+           "path": "/理念/现象/生活状态/个人境遇/身心状态/情绪情感"
+          },
+          {
+           "name": "婚恋情感",
+           "score": 0.5121,
+           "path": "/理念/情感/人际情感/婚恋情感"
+          }
+         ]
+        },
+        {
+         "scope_type": "substance",
+         "value": "冒犯感选题",
+         "candidate": "冒犯感选题",
+         "link": "新建",
+         "score": 0.5564,
+         "top": [
+          {
+           "name": "人生议题",
+           "score": 0.5564,
+           "path": "/理念/观念/个人观念/人生感悟/人生议题"
+          },
+          {
+           "name": "婚恋情感",
+           "score": 0.5261,
+           "path": "/理念/情感/人际情感/婚恋情感"
+          },
+          {
+           "name": "标题",
+           "score": 0.526,
+           "path": "/表象/视觉/符号/文字符号/标题"
+          }
+         ]
+        },
+        {
+         "scope_type": "substance",
+         "value": "情绪共鸣型爆款选题",
+         "candidate": "情绪共鸣型爆款选题",
+         "link": "新建",
+         "score": 0.5817,
+         "top": [
+          {
+           "name": "情绪情感",
+           "score": 0.5817,
+           "path": "/理念/现象/生活状态/个人境遇/身心状态/情绪情感"
+          },
+          {
+           "name": "情绪意境",
+           "score": 0.5404,
+           "path": "/表象/视觉/画面/后期/情绪意境"
+          },
+          {
+           "name": "婚恋情感",
+           "score": 0.5247,
+           "path": "/理念/情感/人际情感/婚恋情感"
+          }
+         ]
+        },
+        {
+         "scope_type": "form",
+         "value": "交叉比对法",
+         "candidate": "交叉比对法",
+         "link": "新建",
+         "score": 0.6617,
+         "top": [
+          {
+           "name": "对比分析",
+           "score": 0.6617,
+           "path": "/架构/逻辑/信息编排逻辑/归纳论证/分析解读/对比分析"
+          },
+          {
+           "name": "数据对比",
+           "score": 0.6166,
+           "path": "/架构/逻辑/信息编排逻辑/归纳论证/数据实证/数据对比"
+          },
+          {
+           "name": "差异对比",
+           "score": 0.5998,
+           "path": "/架构/创意/对比反差/反差错位/通用反差/差异对比"
+          }
+         ]
+        },
+        {
+         "scope_type": "form",
+         "value": "交集转化",
+         "candidate": "交集转化",
+         "link": "新建",
+         "score": 0.678,
+         "top": [
+          {
+           "name": "符号转化",
+           "score": 0.678,
+           "path": "/架构/修辞/修辞意象/比拟转化/符号转化"
+          },
+          {
+           "name": "转化阐释",
+           "score": 0.6387,
+           "path": "/架构/逻辑/信息编排逻辑/归纳论证/归纳提炼/转化阐释"
+          },
+          {
+           "name": "拟人转化",
+           "score": 0.5867,
+           "path": "/架构/修辞/修辞意象/比拟转化/拟人转化"
+          }
+         ]
+        },
+        {
+         "scope_type": "effect",
+         "value": "情绪信号强化",
+         "candidate": "情绪信号强化",
+         "link": "新建",
+         "score": 0.801,
+         "top": [
+          {
+           "name": "情感强化",
+           "score": 0.801,
+           "path": "/表达/信息传达/传达手法/强调突出/情感强化"
+          },
+          {
+           "name": "论证强化",
+           "score": 0.6296,
+           "path": "/表达/论证说理/分析论证/论证评判/肯定论证/论证强化"
+          },
+          {
+           "name": "情感收束",
+           "score": 0.6189,
+           "path": "/结构/叙事推进/收束归纳/情感收束"
+          }
+         ]
+        },
+        {
+         "scope_type": "effect",
+         "value": "选题冒犯性校准",
+         "candidate": "选题冒犯性校准",
+         "link": "新建",
+         "score": 0.4805,
+         "top": [
+          {
+           "name": "界定范畴",
+           "score": 0.4805,
+           "path": "/表达/论证说理/提炼升华/定义定性/界定范畴"
+          },
+          {
+           "name": "性质定性",
+           "score": 0.4656,
+           "path": "/表达/论证说理/分析论证/论证评判/定性确立/性质定性"
+          },
+          {
+           "name": "引用援引",
+           "score": 0.4621,
+           "path": "/表达/论证说理/证据支撑/引用援引"
+          }
+         ]
+        },
+        {
+         "scope_type": "effect",
+         "value": "羞耻感注入",
+         "candidate": "羞耻感注入",
+         "link": "新建",
+         "score": 0.5476,
+         "top": [
+          {
+           "name": "情感收束",
+           "score": 0.5476,
+           "path": "/结构/叙事推进/收束归纳/情感收束"
+          },
+          {
+           "name": "情感强化",
+           "score": 0.5419,
+           "path": "/表达/信息传达/传达手法/强调突出/情感强化"
+          },
+          {
+           "name": "情感共鸣",
+           "score": 0.5388,
+           "path": "/表达/互动引导/情感连接/情感共鸣"
+          }
+         ]
+        },
+        {
+         "scope_type": "intent",
+         "value": "生成高共鸣选题",
+         "candidate": "生成高共鸣选题",
+         "link": "新建",
+         "score": 0.4688,
+         "top": [
+          {
+           "name": "裂变",
+           "score": 0.4688,
+           "path": "/行为引导/裂变"
+          },
+          {
+           "name": "粉丝互动",
+           "score": 0.4132,
+           "path": "/情感联结/关系维护/粉丝互动"
+          },
+          {
+           "name": "信息扩散",
+           "score": 0.4119,
+           "path": "/信息传递/信息扩散"
+          }
+         ]
+        }
+       ]
+      }
+     ],
+     "dropped": []
+    },
+    {
+     "id": "k2",
+     "type": "what",
+     "role": "主",
+     "parent": null,
+     "title": "好选题的情绪信号",
+     "business_stage": [
+      "选题"
+     ],
+     "出处": [
+      "卡片1",
+      "卡片3",
+      "卡片4",
+      "卡片5",
+      "卡片6",
+      "卡片7"
+     ],
+     "概要": "羞耻感和冒犯感是识别高潜力选题的关键情绪信号。",
+     "kind": "子集",
+     "维度拆分规则": "情绪触发类型",
+     "body": [
+      {
+       "item_name": "羞耻感",
+       "item_desc": "写完后内心犹豫、不好意思、想删掉——因为它触碰了真实但被社交礼仪层层包裹的痛点;是好选题的防伪标签。例:『…写完后感觉羞耻的,因为太正确的选题缺乏情绪共鸣…』",
+       "作用域": []
+      },
+      {
+       "item_name": "冒犯感",
+       "item_desc": "不是脏话式冒犯,而是对大众信奉的‘正确共识’进行温和撕裂,从而触动公共痛点;能引发强烈共鸣。例:『…真正的爆款选题带有冒犯感,不是脏话式的冒犯,而是对正确共识的挑战…』",
+       "作用域": []
+      }
+     ],
+     "作用域": [
+      {
+       "scope_type": "substance",
+       "value": "羞耻感",
+       "candidate": "羞耻感",
+       "link": "新建",
+       "score": 0.6283,
+       "top": [
+        {
+         "name": "情感",
+         "score": 0.6283,
+         "path": "/理念/情感"
+        },
+        {
+         "name": "情绪情感",
+         "score": 0.6224,
+         "path": "/理念/现象/生活状态/个人境遇/身心状态/情绪情感"
+        },
+        {
+         "name": "道德伦理",
+         "score": 0.5963,
+         "path": "/理念/观念/个人观念/处世智慧/道德伦理"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "冒犯感",
+       "candidate": "冒犯感",
+       "link": "新建",
+       "score": 0.5689,
+       "top": [
+        {
+         "name": "情感",
+         "score": 0.5689,
+         "path": "/理念/情感"
+        },
+        {
+         "name": "利益关系",
+         "score": 0.5435,
+         "path": "/理念/知识/政治/国际政治/国际博弈/利益关系"
+        },
+        {
+         "name": "情感表达",
+         "score": 0.5415,
+         "path": "/表象/视觉/行为/人际互动/表达沟通/情感表达"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "情绪信号",
+       "candidate": "情绪信号",
+       "link": "新建",
+       "score": 0.7612,
+       "top": [
+        {
+         "name": "情绪情感",
+         "score": 0.7612,
+         "path": "/理念/现象/生活状态/个人境遇/身心状态/情绪情感"
+        },
+        {
+         "name": "情绪困扰",
+         "score": 0.7127,
+         "path": "/理念/知识/身心科学/心理认知/心理状态问题/情绪困扰"
+        },
+        {
+         "name": "情绪意境",
+         "score": 0.6856,
+         "path": "/表象/视觉/画面/后期/情绪意境"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "社交礼仪包裹痛点",
+       "candidate": "社交礼仪包裹痛点",
+       "link": "新建",
+       "score": 0.627,
+       "top": [
+        {
+         "name": "痛点问题",
+         "score": 0.627,
+         "path": "/理念/知识/商业/产品服务/痛点问题"
+        },
+        {
+         "name": "礼仪规范",
+         "score": 0.6144,
+         "path": "/理念/知识/文化/礼仪习俗/礼仪规范"
+        },
+        {
+         "name": "社交场合",
+         "score": 0.5785,
+         "path": "/表象/视觉/空间/空间场所/生活场景/社交场合"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "公共痛点",
+       "candidate": "公共痛点",
+       "link": "新建",
+       "score": 0.8071,
+       "top": [
+        {
+         "name": "痛点问题",
+         "score": 0.8071,
+         "path": "/理念/知识/商业/产品服务/痛点问题"
+        },
+        {
+         "name": "机构公共事件",
+         "score": 0.5777,
+         "path": "/理念/事件/社会事件/机构公共事件"
+        },
+        {
+         "name": "公共安全",
+         "score": 0.5717,
+         "path": "/理念/现象/社会问题/民生生活/公共安全"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "正确共识挑战",
+       "candidate": "正确共识挑战",
+       "link": "新建",
+       "score": 0.6102,
+       "top": [
+        {
+         "name": "通用共识符号",
+         "score": 0.6102,
+         "path": "/表象/视觉/符号/图案符号/标识图案/通用共识符号"
+        },
+        {
+         "name": "认知思辨",
+         "score": 0.512,
+         "path": "/理念/知识/思想/概念范畴/认知思辨"
+        },
+        {
+         "name": "冲突对抗",
+         "score": 0.5059,
+         "path": "/表象/视觉/行为/人际互动/关系行为/冲突对抗"
+        }
+       ]
+      },
+      {
+       "scope_type": "form",
+       "value": "情绪防伪标签法",
+       "candidate": "情绪防伪标签法",
+       "link": "新建",
+       "score": 0.6535,
+       "top": [
+        {
+         "name": "情绪强化",
+         "score": 0.6535,
+         "path": "/架构/策略/情感调动/情感激发/情绪基调/情绪强化"
+        },
+        {
+         "name": "情绪引导",
+         "score": 0.6233,
+         "path": "/架构/策略/情感调动/情感激发/共鸣触发/情绪引导"
+        },
+        {
+         "name": "标签话术",
+         "score": 0.6138,
+         "path": "/架构/策略/认知引导/话语影响/话术策略/标签话术"
+        }
+       ]
+      },
+      {
+       "scope_type": "effect",
+       "value": "选题真伪甄别",
+       "candidate": "选题真伪甄别",
+       "link": "新建",
+       "score": 0.5416,
+       "top": [
+        {
+         "name": "论证评判",
+         "score": 0.5416,
+         "path": "/表达/论证说理/分析论证/论证评判"
+        },
+        {
+         "name": "印证核实",
+         "score": 0.5377,
+         "path": "/表达/论证说理/证据支撑/印证核实"
+        },
+        {
+         "name": "否定批驳",
+         "score": 0.5248,
+         "path": "/表达/论证说理/分析论证/论证评判/否定驳论/否定批驳"
+        }
+       ]
+      },
+      {
+       "scope_type": "effect",
+       "value": "情绪共鸣触发",
+       "candidate": "情绪共鸣触发",
+       "link": "新建",
+       "score": 0.8255,
+       "top": [
+        {
+         "name": "情感共鸣",
+         "score": 0.8255,
+         "path": "/表达/互动引导/情感连接/情感共鸣"
+        },
+        {
+         "name": "情感连接",
+         "score": 0.6488,
+         "path": "/表达/互动引导/情感连接"
+        },
+        {
+         "name": "情感动员",
+         "score": 0.6475,
+         "path": "/表达/互动引导/情感连接/情感动员"
+        }
+       ]
+      },
+      {
+       "scope_type": "intent",
+       "value": "识别高潜力选题",
+       "candidate": "识别高潜力选题",
+       "link": "新建",
+       "score": 0.452,
+       "top": [
+        {
+         "name": "裂变",
+         "score": 0.452,
+         "path": "/行为引导/裂变"
+        },
+        {
+         "name": "科普",
+         "score": 0.4345,
+         "path": "/信息传递/知识传递/科普"
+        },
+        {
+         "name": "分析",
+         "score": 0.4231,
+         "path": "/信息传递/知识传递/分析"
+        }
+       ]
+      }
+     ],
+     "业务阶段": []
+    },
+    {
+     "id": "k3",
+     "type": "what",
+     "role": "组件",
+     "parent": {
+      "how_id": "k1",
+      "step": 1
+     },
+     "title": "赛道圣经句",
+     "business_stage": [
+      "选题"
+     ],
+     "出处": [
+      "卡片9"
+     ],
+     "概要": "赛道内被广泛默认、反复复述的正确共识性断言,是共识撕裂的起点。",
+     "kind": "子集",
+     "维度拆分规则": "共识性质",
+     "body": [
+      {
+       "item_name": "职场类圣经句",
+       "item_desc": "『能力强的人一定会被看见』",
+       "作用域": []
+      }
+     ],
+     "作用域": [
+      {
+       "scope_type": "substance",
+       "value": "赛道圣经句",
+       "candidate": "赛道圣经句",
+       "link": "新建",
+       "score": 0.5348,
+       "top": [
+        {
+         "name": "人生哲理",
+         "score": 0.5348,
+         "path": "/理念/观念/个人观念/人生感悟/观点表达/人生哲理"
+        },
+        {
+         "name": "标语",
+         "score": 0.5054,
+         "path": "/表象/视觉/符号/文字符号/标语"
+        },
+        {
+         "name": "谚语",
+         "score": 0.5047,
+         "path": "/理念/知识/文化/语言文字/谚语"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "正确共识性断言",
+       "candidate": "正确共识性断言",
+       "link": "新建",
+       "score": 0.6055,
+       "top": [
+        {
+         "name": "通用共识符号",
+         "score": 0.6055,
+         "path": "/表象/视觉/符号/图案符号/标识图案/通用共识符号"
+        },
+        {
+         "name": "因果推理",
+         "score": 0.4928,
+         "path": "/理念/知识/思想/逻辑原理/因果推理"
+        },
+        {
+         "name": "认知思辨",
+         "score": 0.4821,
+         "path": "/理念/知识/思想/概念范畴/认知思辨"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "广泛默认断言",
+       "candidate": "广泛默认断言",
+       "link": "新建",
+       "score": 0.4918,
+       "top": [
+        {
+         "name": "程度范围",
+         "score": 0.4918,
+         "path": "/理念/知识/思想/概念范畴/性质属性/程度范围"
+        },
+        {
+         "name": "逻辑异常",
+         "score": 0.4818,
+         "path": "/理念/知识/思想/逻辑原理/逻辑异常"
+        },
+        {
+         "name": "通用共识符号",
+         "score": 0.4695,
+         "path": "/表象/视觉/符号/图案符号/标识图案/通用共识符号"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "反复复述共识",
+       "candidate": "反复复述共识",
+       "link": "新建",
+       "score": 0.5451,
+       "top": [
+        {
+         "name": "通用共识符号",
+         "score": 0.5451,
+         "path": "/表象/视觉/符号/图案符号/标识图案/通用共识符号"
+        },
+        {
+         "name": "立场表达",
+         "score": 0.4944,
+         "path": "/理念/知识/政治/国际政治/外交立场/立场表达"
+        },
+        {
+         "name": "集体记忆",
+         "score": 0.492,
+         "path": "/理念/知识/文化/传统文化/文化知识/集体记忆"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "共识撕裂起点",
+       "candidate": "共识撕裂起点",
+       "link": "新建",
+       "score": 0.5664,
+       "top": [
+        {
+         "name": "通用共识符号",
+         "score": 0.5664,
+         "path": "/表象/视觉/符号/图案符号/标识图案/通用共识符号"
+        },
+        {
+         "name": "冲突对抗",
+         "score": 0.5146,
+         "path": "/表象/视觉/行为/人际互动/关系行为/冲突对抗"
+        },
+        {
+         "name": "地缘冲突",
+         "score": 0.5063,
+         "path": "/理念/知识/政治/国际政治/地缘政治/地缘冲突"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "职场类圣经句",
+       "candidate": "职场类圣经句",
+       "link": "新建",
+       "score": 0.6158,
+       "top": [
+        {
+         "name": "职场境遇",
+         "score": 0.6158,
+         "path": "/理念/现象/生活状态/个人境遇/职场境遇"
+        },
+        {
+         "name": "职场劳作",
+         "score": 0.6049,
+         "path": "/表象/视觉/行为/日常活动/职场劳作"
+        },
+        {
+         "name": "人生哲理",
+         "score": 0.5466,
+         "path": "/理念/观念/个人观念/人生感悟/观点表达/人生哲理"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "能力强的人一定会被看见",
+       "candidate": "能力强的人一定会被看见",
+       "link": "新建",
+       "score": 0.5232,
+       "top": [
+        {
+         "name": "运营能力",
+         "score": 0.5232,
+         "path": "/理念/知识/商业/运营策略/运营能力"
+        },
+        {
+         "name": "实力概念",
+         "score": 0.517,
+         "path": "/理念/知识/政治/国家治理/国家实力/实力概念"
+        },
+        {
+         "name": "因果报应",
+         "score": 0.4883,
+         "path": "/理念/观念/个人观念/处世智慧/道德伦理/因果报应"
+        }
+       ]
+      },
+      {
+       "scope_type": "form",
+       "value": "共识类型",
+       "candidate": "共识类型",
+       "link": "新建",
+       "score": 0.6861,
+       "top": [
+        {
+         "name": "共识论证",
+         "score": 0.6861,
+         "path": "/架构/逻辑/信息编排逻辑/归纳论证/共识论证"
+        },
+        {
+         "name": "框架类型",
+         "score": 0.6225,
+         "path": "/架构/叙事/叙事组织/脉络铺排/结构编排/框架类型"
+        },
+        {
+         "name": "声音类型",
+         "score": 0.6209,
+         "path": "/呈现/听觉/配乐/声音类型"
+        }
+       ]
+      },
+      {
+       "scope_type": "effect",
+       "value": "共识锚定",
+       "candidate": "共识锚定",
+       "link": "新建",
+       "score": 0.5709,
+       "top": [
+        {
+         "name": "闭环收束",
+         "score": 0.5709,
+         "path": "/结构/叙事推进/收束归纳/闭环收束"
+        },
+        {
+         "name": "论点加固",
+         "score": 0.567,
+         "path": "/表达/信息传达/传达手法/强调突出/论点加固"
+        },
+        {
+         "name": "情感收束",
+         "score": 0.5482,
+         "path": "/结构/叙事推进/收束归纳/情感收束"
+        }
+       ]
+      },
+      {
+       "scope_type": "intent",
+       "value": "界定共识基线",
+       "candidate": "界定共识基线",
+       "link": "新建",
+       "score": 0.466,
+       "top": [
+        {
+         "name": "事实呈现",
+         "score": 0.466,
+         "path": "/信息传递/事实呈现"
+        },
+        {
+         "name": "解读",
+         "score": 0.4599,
+         "path": "/信息传递/知识传递/解读"
+        },
+        {
+         "name": "行为引导",
+         "score": 0.457,
+         "path": "/行为引导"
+        }
+       ]
+      }
+     ],
+     "业务阶段": []
+    },
+    {
+     "id": "k4",
+     "type": "why",
+     "role": "主",
+     "parent": null,
+     "title": "羞耻感作为选题信号的原理",
+     "business_stage": [
+      "选题"
+     ],
+     "出处": [
+      "卡片3",
+      "卡片4",
+      "卡片7"
+     ],
+     "阐述": "羞耻感是好选题的防伪标签,因为它意味着内容触碰了真实存在但被社交礼仪、群体沉默或自我审查层层包裹的痛点;这种包裹使痛点难以被公开讨论,一旦被精准表达,就会引发强烈情绪共鸣。而没有情绪触发的内容不可能爆红,安全的选题等于无感——写完后内心没有波澜、觉得没问题,大概率是无效选题;反之,写完后有点犹豫或不好意思,则可能是好选题。",
+     "作用域": [
+      {
+       "scope_type": "substance",
+       "value": "羞耻感",
+       "candidate": "羞耻感",
+       "link": "新建",
+       "score": 0.6273,
+       "top": [
+        {
+         "name": "情感",
+         "score": 0.6273,
+         "path": "/理念/情感"
+        },
+        {
+         "name": "情绪情感",
+         "score": 0.6212,
+         "path": "/理念/现象/生活状态/个人境遇/身心状态/情绪情感"
+        },
+        {
+         "name": "道德伦理",
+         "score": 0.5949,
+         "path": "/理念/观念/个人观念/处世智慧/道德伦理"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "社交礼仪包裹痛点",
+       "candidate": "社交礼仪包裹痛点",
+       "link": "新建",
+       "score": 0.627,
+       "top": [
+        {
+         "name": "痛点问题",
+         "score": 0.627,
+         "path": "/理念/知识/商业/产品服务/痛点问题"
+        },
+        {
+         "name": "礼仪规范",
+         "score": 0.6144,
+         "path": "/理念/知识/文化/礼仪习俗/礼仪规范"
+        },
+        {
+         "name": "社交场合",
+         "score": 0.5785,
+         "path": "/表象/视觉/空间/空间场所/生活场景/社交场合"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "群体沉默",
+       "candidate": "群体沉默",
+       "link": "新建",
+       "score": 0.7098,
+       "top": [
+        {
+         "name": "群体",
+         "score": 0.7098,
+         "path": "/表象/视觉/实体/人物/群体"
+        },
+        {
+         "name": "群体境遇",
+         "score": 0.6675,
+         "path": "/理念/现象/生活状态/个人境遇/群体境遇"
+        },
+        {
+         "name": "集体记忆",
+         "score": 0.6634,
+         "path": "/理念/知识/文化/传统文化/文化知识/集体记忆"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "自我审查",
+       "candidate": "自我审查",
+       "link": "新建",
+       "score": 0.6629,
+       "top": [
+        {
+         "name": "自我关怀",
+         "score": 0.6629,
+         "path": "/理念/观念/个人观念/人生感悟/人生态度/自我关怀"
+        },
+        {
+         "name": "内省沉思",
+         "score": 0.6172,
+         "path": "/表象/视觉/画面/后期/情绪意境/内省沉思"
+        },
+        {
+         "name": "价值观反思",
+         "score": 0.568,
+         "path": "/理念/现象/社会问题/文化精神/价值观反思"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "情绪共鸣触发机制",
+       "candidate": "情绪共鸣触发机制",
+       "link": "新建",
+       "score": 0.6777,
+       "top": [
+        {
+         "name": "情绪情感",
+         "score": 0.6777,
+         "path": "/理念/现象/生活状态/个人境遇/身心状态/情绪情感"
+        },
+        {
+         "name": "情绪意境",
+         "score": 0.6414,
+         "path": "/表象/视觉/画面/后期/情绪意境"
+        },
+        {
+         "name": "生理机制",
+         "score": 0.6218,
+         "path": "/理念/知识/身心科学/健康养生/身体健康/生理机制"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "理性认知缺口",
+       "candidate": "理性认知缺口",
+       "link": "新建",
+       "score": 0.6684,
+       "top": [
+        {
+         "name": "认知思辨",
+         "score": 0.6684,
+         "path": "/理念/知识/思想/概念范畴/认知思辨"
+        },
+        {
+         "name": "心理认知",
+         "score": 0.666,
+         "path": "/理念/知识/身心科学/心理认知"
+        },
+        {
+         "name": "心理认知偏差",
+         "score": 0.6518,
+         "path": "/理念/知识/身心科学/心理认知/心理状态问题/心理认知偏差"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "感性情绪开关",
+       "candidate": "感性情绪开关",
+       "link": "新建",
+       "score": 0.671,
+       "top": [
+        {
+         "name": "情绪情感",
+         "score": 0.671,
+         "path": "/理念/现象/生活状态/个人境遇/身心状态/情绪情感"
+        },
+        {
+         "name": "情感",
+         "score": 0.6387,
+         "path": "/理念/情感"
+        },
+        {
+         "name": "情绪意境",
+         "score": 0.6351,
+         "path": "/表象/视觉/画面/后期/情绪意境"
+        }
+       ]
+      },
+      {
+       "scope_type": "effect",
+       "value": "痛点精准表达",
+       "candidate": "痛点精准表达",
+       "link": "新建",
+       "score": 0.5965,
+       "top": [
+        {
+         "name": "核心点明",
+         "score": 0.5965,
+         "path": "/表达/信息传达/传达手法/强调突出/核心点明"
+        },
+        {
+         "name": "情感表达",
+         "score": 0.5853,
+         "path": "/表达/情感表达"
+        },
+        {
+         "name": "表达",
+         "score": 0.5685,
+         "path": "/表达"
+        }
+       ]
+      },
+      {
+       "scope_type": "effect",
+       "value": "情绪共振密度构建",
+       "candidate": "情绪共振密度构建",
+       "link": "新建",
+       "score": 0.6511,
+       "top": [
+        {
+         "name": "情感共鸣",
+         "score": 0.6511,
+         "path": "/表达/互动引导/情感连接/情感共鸣"
+        },
+        {
+         "name": "高潮构建",
+         "score": 0.627,
+         "path": "/结构/叙事推进/叙事推进节点/高潮构建"
+        },
+        {
+         "name": "情感收束",
+         "score": 0.596,
+         "path": "/结构/叙事推进/收束归纳/情感收束"
+        }
+       ]
+      },
+      {
+       "scope_type": "effect",
+       "value": "选题无效性排除",
+       "candidate": "选题无效性排除",
+       "link": "新建",
+       "score": 0.5388,
+       "top": [
+        {
+         "name": "否定驳论",
+         "score": 0.5388,
+         "path": "/表达/论证说理/分析论证/论证评判/否定驳论"
+        },
+        {
+         "name": "否定批驳",
+         "score": 0.5374,
+         "path": "/表达/论证说理/分析论证/论证评判/否定驳论/否定批驳"
+        },
+        {
+         "name": "界定范畴",
+         "score": 0.4983,
+         "path": "/表达/论证说理/提炼升华/定义定性/界定范畴"
+        }
+       ]
+      },
+      {
+       "scope_type": "intent",
+       "value": "解释羞耻感的选题价值",
+       "candidate": "解释羞耻感的选题价值",
+       "link": "新建",
+       "score": 0.3797,
+       "top": [
+        {
+         "name": "揭露",
+         "score": 0.3797,
+         "path": "/信息传递/事实呈现/揭露"
+        },
+        {
+         "name": "情感抒发",
+         "score": 0.3778,
+         "path": "/情感联结/情感抒发"
+        },
+        {
+         "name": "解读",
+         "score": 0.3679,
+         "path": "/信息传递/知识传递/解读"
+        }
+       ]
+      }
+     ],
+     "业务阶段": []
+    },
+    {
+     "id": "k5",
+     "type": "why",
+     "role": "组件",
+     "parent": {
+      "how_id": "k1",
+      "step": 4
+     },
+     "title": "交叉验证提升选题共鸣效力的原理",
+     "business_stage": [
+      "选题"
+     ],
+     "出处": [
+      "卡片1",
+      "卡片5",
+      "卡片6",
+      "卡片11"
+     ],
+     "阐述": "共识失灵场景代表结构性矛盾,竞品评论区沉默痛点代表已被市场验证的个体压抑体验;二者的交集既具备现实根基又自带情感共振密度,因此转化出的选题能同时击中理性认知缺口与感性情绪开关,形成不可替代的共鸣效力。",
+     "作用域": [
+      {
+       "scope_type": "substance",
+       "value": "共识失灵场景",
+       "candidate": "共识失灵场景",
+       "link": "新建",
+       "score": 0.5923,
+       "top": [
+        {
+         "name": "使用场景",
+         "score": 0.5923,
+         "path": "/理念/知识/商业/产品服务/使用场景"
+        },
+        {
+         "name": "通用共识符号",
+         "score": 0.5892,
+         "path": "/表象/视觉/符号/图案符号/标识图案/通用共识符号"
+        },
+        {
+         "name": "场景感悟",
+         "score": 0.5638,
+         "path": "/理念/观念/个人观念/人生感悟/观点表达/场景感悟"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "竞品评论区沉默痛点",
+       "candidate": "竞品评论区沉默痛点",
+       "link": "新建",
+       "score": 0.6387,
+       "top": [
+        {
+         "name": "痛点问题",
+         "score": 0.6387,
+         "path": "/理念/知识/商业/产品服务/痛点问题"
+        },
+        {
+         "name": "产品矩阵",
+         "score": 0.5079,
+         "path": "/理念/知识/商业/产品服务/产品矩阵"
+        },
+        {
+         "name": "政策评论",
+         "score": 0.5053,
+         "path": "/理念/观念/社会观念/时政评议/政策评论"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "结构性矛盾",
+       "candidate": "结构性矛盾",
+       "link": "新建",
+       "score": 0.6542,
+       "top": [
+        {
+         "name": "利益矛盾",
+         "score": 0.6542,
+         "path": "/理念/现象/社会问题/民生生活/利益矛盾"
+        },
+        {
+         "name": "社会结构",
+         "score": 0.59,
+         "path": "/理念/知识/社会知识/社会结构"
+        },
+        {
+         "name": "制度问题",
+         "score": 0.5683,
+         "path": "/理念/知识/政治/国家治理/政策制度/制度问题"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "个体压抑体验",
+       "candidate": "个体压抑体验",
+       "link": "新建",
+       "score": 0.6593,
+       "top": [
+        {
+         "name": "个体",
+         "score": 0.6593,
+         "path": "/表象/视觉/实体/人物/个体"
+        },
+        {
+         "name": "情感体验",
+         "score": 0.6316,
+         "path": "/理念/观念/个人观念/人生感悟/内心感受/情感体验"
+        },
+        {
+         "name": "群体境遇",
+         "score": 0.591,
+         "path": "/理念/现象/生活状态/个人境遇/群体境遇"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "理性认知缺口",
+       "candidate": "理性认知缺口",
+       "link": "新建",
+       "score": 0.6648,
+       "top": [
+        {
+         "name": "认知思辨",
+         "score": 0.6648,
+         "path": "/理念/知识/思想/概念范畴/认知思辨"
+        },
+        {
+         "name": "心理认知",
+         "score": 0.6624,
+         "path": "/理念/知识/身心科学/心理认知"
+        },
+        {
+         "name": "心理认知偏差",
+         "score": 0.6479,
+         "path": "/理念/知识/身心科学/心理认知/心理状态问题/心理认知偏差"
+        }
+       ]
+      },
+      {
+       "scope_type": "substance",
+       "value": "感性情绪开关",
+       "candidate": "感性情绪开关",
+       "link": "新建",
+       "score": 0.6691,
+       "top": [
+        {
+         "name": "情绪情感",
+         "score": 0.6691,
+         "path": "/理念/现象/生活状态/个人境遇/身心状态/情绪情感"
+        },
+        {
+         "name": "情感",
+         "score": 0.6358,
+         "path": "/理念/情感"
+        },
+        {
+         "name": "情绪意境",
+         "score": 0.6328,
+         "path": "/表象/视觉/画面/后期/情绪意境"
+        }
+       ]
+      },
+      {
+       "scope_type": "effect",
+       "value": "交叉",
+       "candidate": "交叉",
+       "link": "新建",
+       "score": 0.458,
+       "top": [
+        {
+         "name": "维度对比",
+         "score": 0.458,
+         "path": "/表达/论证说理/分析论证/对比反差/维度对比"
+        },
+        {
+         "name": "视角转换",
+         "score": 0.4567,
+         "path": "/结构/叙事推进/承接转换/视角转换"
+        },
+        {
+         "name": "闭环收束",
+         "score": 0.4519,
+         "path": "/结构/叙事推进/收束归纳/闭环收束"
+        }
+       ]
+      },
+      {
+       "scope_type": "effect",
+       "value": "共鸣效力叠加",
+       "candidate": "共鸣效力叠加",
+       "link": "新建",
+       "score": 0.6443,
+       "top": [
+        {
+         "name": "情感共鸣",
+         "score": 0.6443,
+         "path": "/表达/互动引导/情感连接/情感共鸣"
+        },
+        {
+         "name": "属性效能",
+         "score": 0.5841,
+         "path": "/表达/信息传达/传达手法/强调突出/属性效能"
+        },
+        {
+         "name": "强化收束",
+         "score": 0.5662,
+         "path": "/结构/叙事推进/收束归纳/强化收束"
+        }
+       ]
+      },
+      {
+       "scope_type": "effect",
+       "value": "不可替代性",
+       "candidate": "不可替代性",
+       "link": "新建",
+       "score": 0.5362,
+       "top": [
+        {
+         "name": "价值肯定",
+         "score": 0.5362,
+         "path": "/表达/论证说理/分析论证/论证评判/肯定论证/价值肯定"
+        },
+        {
+         "name": "地位确认",
+         "score": 0.5034,
+         "path": "/表达/论证说理/分析论证/论证评判/定性确立/地位确认"
+        },
+        {
+         "name": "逻辑自洽",
+         "score": 0.5021,
+         "path": "/结构/叙事推进/收束归纳/闭环收束/逻辑自洽"
+        }
+       ]
+      },
+      {
+       "scope_type": "intent",
+       "value": "阐明交叉验证原理",
+       "candidate": "阐明交叉验证原理",
+       "link": "新建",
+       "score": 0.431,
+       "top": [
+        {
+         "name": "科普",
+         "score": 0.431,
+         "path": "/信息传递/知识传递/科普"
+        },
+        {
+         "name": "解读",
+         "score": 0.4181,
+         "path": "/信息传递/知识传递/解读"
+        },
+        {
+         "name": "事实呈现",
+         "score": 0.3974,
+         "path": "/信息传递/事实呈现"
+        }
+       ]
+      }
+     ],
+     "业务阶段": []
+    }
+   ]
+  }
+ ]
+}

+ 472 - 0
app/frontend/public/legacy-decode/index.html

@@ -0,0 +1,472 @@
+<!doctype html>
+<html lang="zh">
+<head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<title>创作知识的解构</title>
+<script crossorigin src="https://unpkg.com/react@18/umd/react.production.min.js"></script>
+<script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js"></script>
+<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
+<style>
+  *{box-sizing:border-box}
+  html,body{margin:0;padding:0;font-family:-apple-system,"PingFang SC","Microsoft YaHei",sans-serif;font-size:13px;color:#111827;background:#f5f5f7;height:100vh;overflow:hidden}
+  .app{height:100vh;display:flex;flex-direction:column}
+  header.top{padding:11px 18px 9px;background:#fff;border-bottom:1px solid #e5e7eb;flex:none}
+  header.top h1{margin:0 0 7px;font-size:16px;font-weight:600}
+  .picker{display:flex;gap:6px;flex-wrap:wrap;align-items:center}
+  .picker .lab{font-size:11.5px;color:#9ca3af;margin-right:2px}
+  .pill{font-size:12px;padding:4px 11px;border-radius:14px;border:1px solid #e5e7eb;background:#fff;color:#6b7280;cursor:pointer}
+  .pill:hover{background:#f3f4f6}
+  .pill.on{background:#1e293b;color:#fff;border-color:#1e293b;font-weight:600}
+  .pill .n{font-size:10px;opacity:.7;margin-left:4px}
+  .scroll{flex:1;overflow:auto;background:#f5f5f7;padding-bottom:40px}
+  details.src{margin:10px 18px 0;background:#fff;border:1px solid #e2e8f0;border-radius:6px}
+  details.src summary{padding:8px 14px;cursor:pointer;font-size:12px;color:#475569;list-style:none}
+  details.src summary::before{content:'▶ ';color:#94a3b8;font-size:10px}
+  details.src[open] summary::before{content:'▼ '}
+  .srcbody{padding:4px 16px 12px;font-size:12px}
+  .srcbody a{color:#2563eb;word-break:break-all}
+  .srcprompt{color:#0e7490;font-size:11.5px;cursor:pointer}.srcprompt:hover{text-decoration:underline}
+  .srcimgs{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
+  .srcimgs img{width:80px;height:80px;object-fit:cover;border-radius:4px;border:1px solid #e2e8f0;cursor:zoom-in}
+  .barhint{margin:8px 18px 0;font-size:11.5px;color:#6b7280}
+  .ribbon{margin:11px 18px 0;background:#fff;border:1px solid #e2e8f0;border-radius:8px;padding:10px 14px}
+  .rcap{font-size:11.5px;color:#6b7280;margin-bottom:8px}
+  .rsteps{display:flex;align-items:stretch;flex-wrap:wrap}
+  .rstep{flex:1;min-width:118px;border:1px solid #e2e8f0;border-radius:8px;padding:8px 9px;cursor:pointer;background:#f8fafc}
+  .rstep:hover{background:#ecfeff;border-color:#99d5d0}
+  .rstep.auto{cursor:default;background:#f1f5f9;opacity:.9}.rstep.auto:hover{background:#f1f5f9;border-color:#e2e8f0}
+  .rtop{display:flex;align-items:center;gap:7px}
+  .rn{width:18px;height:18px;border-radius:50%;background:#0e7490;color:#fff;font-size:11px;display:flex;align-items:center;justify-content:center;flex:none}
+  .rstep.auto .rn{background:#94a3b8}
+  .rlab{font-size:13.5px;font-weight:600}
+  .rdesc{font-size:11.5px;color:#6b7280;margin:5px 0 7px;line-height:1.5}
+  .rbtn{font-size:11.5px;color:#0e7490}.rstep.auto .rbtn{color:#94a3b8}
+  .rarrow{display:flex;align-items:center;color:#cbd5e1;font-size:18px;padding:0 4px;flex:none}
+  .pmwhy{font-size:12.5px;color:#92400e;background:#fffbeb;border:1px solid #fde68a;border-radius:6px;padding:8px 11px;margin-bottom:12px;line-height:1.6}
+  .pmwhy b{color:#78350f}
+  .lbtn{padding:3px 9px;border:1px solid #cbd5e1;border-radius:5px;background:#fff;cursor:pointer;font-size:11.5px;color:#334155;font-family:inherit}
+  .lbtn:hover{background:#f1f5f9}.lbtn.on{background:#fef3c7;border-color:#d97706;color:#92400e;font-weight:600}
+  /* 颗卡 */
+  .kcard{margin:12px 18px 0;background:#fff;border:1px solid #e2e8f0;border-radius:8px;overflow:hidden}
+  .khead{display:flex;align-items:center;gap:8px;padding:9px 14px;border-bottom:1px solid #eef2f7;flex-wrap:wrap}
+  .kno{font-size:11px;font-weight:700;color:#fff;background:#475569;border-radius:4px;padding:1px 7px}
+  .ktype{font-size:11px;font-weight:700;border-radius:4px;padding:1px 8px}
+  .ty-how{background:#cffafe;color:#155e75}.ty-what{background:#fae8ff;color:#86198f}.ty-why{background:#fef9c3;color:#854d0e}
+  .ktitle{font-size:14px;font-weight:600}
+  .krole{font-size:10.5px;padding:1px 6px;border-radius:3px;background:#f1f5f9;color:#64748b}
+  .kref{font-size:11px;color:#0e7490;cursor:pointer}.kref:hover{text-decoration:underline}
+  .srcbtn{cursor:pointer;color:#0e7490;margin-left:3px;user-select:none}.srcbtn:hover{color:#155e75}
+  .srccard{border:1px solid #e2e8f0;border-radius:6px;padding:8px 10px;margin:8px 0;background:#f8fafc}
+  .srccard .ci{font-size:11.5px;color:#6b7280;font-weight:600;margin-bottom:5px}
+  .srccard img{max-width:100%;max-height:360px;border-radius:5px;border:1px solid #e2e8f0;cursor:zoom-in}
+  .srccard video{max-width:100%;max-height:300px;border-radius:5px}
+  .srcread{font-size:12.5px;color:#1f2937;line-height:1.6;margin-top:6px;background:#fff;border-left:3px solid #0e7490;padding:6px 9px}
+  .kbiz{font-size:11px;padding:1px 7px;border-radius:3px;background:#fef3c7;color:#92400e}
+  .kacts{margin-left:auto;display:flex;gap:6px}
+  .kbody{padding:6px 14px 13px}
+  /* how 工序表 */
+  .twrap{overflow:auto;border:1px solid #e5e7eb;border-radius:6px;margin-top:8px}
+  table.proc{width:max-content;min-width:100%;border-collapse:collapse;font-size:12px}
+  table.proc th,table.proc td{border:1px solid #e5e7eb;padding:6px 8px;vertical-align:top;line-height:1.5}
+  table.proc thead th{font-weight:600;text-align:center;font-size:12px;position:sticky;top:0;z-index:3}
+  table.proc thead tr:nth-child(2) th{top:30px}
+  td.idx{width:30px;text-align:center;color:#6b7280;background:#f8fafc}
+  th.c-intent,td.intent{width:210px;min-width:210px;max-width:210px;white-space:pre-wrap}
+  th.c-cstage,td.cstage{width:54px;text-align:center;background:#ecfeff}
+  th.c-act,td.act{min-width:110px;max-width:140px;word-break:break-word;background:#ecfeff}
+  th.c-dir,td.dir{min-width:230px;max-width:330px;white-space:pre-wrap;word-break:break-word;background:#ecfeff}
+  th.c-out,td.out{min-width:160px;max-width:240px;white-space:pre-wrap;background:#ecfeff}
+  th.c-scope,td.scope{width:92px;min-width:92px;max-width:92px;word-break:break-word}
+  th.g-frame{background:#0e7490;color:#fff}
+  th.g-scope{background:#7c3aed;color:#fff}
+  th.cstage-h{cursor:pointer}th.cstage-h:hover{background:#0e7490}
+  th.c-idx{background:#475569;color:#fff;vertical-align:middle}
+  thead tr:nth-child(2) th.c-intent,thead tr:nth-child(2) th.c-cstage,thead tr:nth-child(2) th.c-act,thead tr:nth-child(2) th.c-dir,thead tr:nth-child(2) th.c-out{background:#0891b2;color:#fff}
+  thead tr:nth-child(2) th.s-substance{background:#dc2626;color:#fff}thead tr:nth-child(2) th.s-form{background:#2563eb;color:#fff}
+  thead tr:nth-child(2) th.s-feeling{background:#db2777;color:#fff}thead tr:nth-child(2) th.s-effect{background:#16a34a;color:#fff}thead tr:nth-child(2) th.s-intent{background:#d97706;color:#fff}
+  td.scope.s-substance{background:#fef2f2}td.scope.s-form{background:#eff6ff}td.scope.s-feeling{background:#fdf2f8}td.scope.s-effect{background:#f0fdf4}td.scope.s-intent{background:#fffbeb}
+  tr.step>td{border-top:1.5px solid #cbd5e1}
+  .cstage-chip{display:inline-block;font-size:11px;padding:1px 6px;border-radius:10px;background:#ede9fe;color:#5b21b6}
+  .act-chip{display:inline-block;font-size:11.5px;padding:1px 7px;border-radius:4px;background:#fff7ed;color:#9a3412;border:1px solid #fed7aa}
+  .dir-txt{font-size:11.5px;color:#33312c;line-height:1.65}.out-txt{font-size:11.5px;color:#166534}
+  .in-txt{font-size:11.5px;color:#1e40af;line-height:1.6}
+  .cue{font-size:11px;color:#7c2d12;background:#fff7ed;border-left:2px solid #fb923c;padding:3px 7px;margin-top:4px;border-radius:0 4px 4px 0}
+  .cue b{color:#9a3412}
+  .kindb{font-size:10.5px;font-weight:700;padding:1px 8px;border-radius:9px;margin-right:8px;vertical-align:middle}
+  .kind-子集{background:#dbeafe;color:#1e40af}.kind-多维关系{background:#dcfce7;color:#166534}.kind-序列{background:#fef3c7;color:#92400e}
+  .dimrule{font-size:10.5px;padding:1px 8px;border-radius:9px;background:#ecfccb;color:#3f6212;margin-right:8px;vertical-align:middle}
+  .ksec-f.key{background:#fde68a;color:#92400e;font-weight:700}
+  .glossbtn{background:#ede9fe!important;color:#6d28d9!important;border-color:#ddd6fe!important}
+  .from{font-size:11px;color:#9ca3af}
+  /* what/why 自由小节 */
+  .def{font-size:13px;background:#fdf4ff;border-left:3px solid #a21caf;border-radius:0 6px 6px 0;padding:8px 12px;margin:6px 0 10px}
+  .ksec{margin:9px 0;padding-left:11px;border-left:3px solid #e2e8f0}
+  .ksec-h{display:flex;align-items:center;gap:7px;margin-bottom:4px}
+  .ksec-t{font-size:13px;font-weight:600;color:#334155}
+  .ksec-f{font-size:10.5px;padding:1px 7px;border-radius:9px;background:#f1f5f9;color:#64748b}
+  .ksec-c{font-size:12.5px;line-height:1.65;color:#1f2937;margin-bottom:4px}
+  table.elem{border-collapse:collapse;width:100%;font-size:12.5px}
+  table.elem td{border:1px solid #f0e6f5;padding:6px 10px;text-align:left;vertical-align:top}
+  table.elem td.el{font-weight:600;color:#86198f;background:#fdf4ff;width:130px}
+  /* why 论点卡 */
+  .why-row{display:flex;gap:10px;margin:7px 0}
+  .why-lab{font-size:11px;font-weight:700;border-radius:4px;padding:2px 8px;flex:none;height:20px}
+  .wl-claim{background:#fef9c3;color:#854d0e}.wl-basis{background:#e0e7ff;color:#3730a3}.wl-impact{background:#dcfce7;color:#166534}
+  .why-txt{font-size:12.5px;line-height:1.65;color:#1f2937}
+  .why-exp{font-size:12.5px;line-height:1.72;color:#1f2937;background:#fdf4ff;border-left:3px solid #a21caf;border-radius:0 6px 6px 0;padding:9px 13px;margin:6px 0}
+  /* 颗级作用域 */
+  .kscopes{margin-top:9px;display:flex;gap:5px;flex-wrap:wrap;align-items:center}
+  .kscopes .lab{font-size:11px;color:#9ca3af}
+  .sv{display:inline-block;cursor:pointer;font-size:11.5px;padding:1px 5px;border-radius:3px;border:1px solid rgba(0,0,0,.08);background:rgba(255,255,255,.7);margin:1px 0}
+  .sv:hover{box-shadow:0 0 0 1px #1e293b}
+  .sv .k{font-size:11.5px;opacity:.85;font-weight:700;margin-right:4px}
+  table.proc th.c-scope{font-size:13.5px}
+  .sv .mk{font-size:9px;padding:0 3px;border-radius:2px;margin-left:3px;vertical-align:top}
+  .mk-new{background:#fde68a;color:#92400e}.mk-reuse{background:#bbf7d0;color:#166534}
+  .sv.s-substance{background:#fef2f2}.sv.s-form{background:#eff6ff}.sv.s-feeling{background:#fdf2f8}.sv.s-effect{background:#f0fdf4}.sv.s-intent{background:#fffbeb}
+  body.hl .sv .mk-new{outline:2px solid #d97706}
+  /* drawer + modal */
+  .ov{position:fixed;inset:0;background:rgba(0,0,0,.35);z-index:100}
+  .drawer{position:fixed;right:0;top:0;bottom:0;width:440px;max-width:92vw;background:#fff;box-shadow:-4px 0 16px rgba(0,0,0,.15);z-index:101;overflow-y:auto}
+  .drawer h2{margin:0;padding:13px 16px;background:#1e293b;color:#fff;font-size:14px;display:flex;align-items:center}
+  .drawer h2 .x{margin-left:auto;cursor:pointer;font-size:18px}
+  .dc{padding:14px 16px;font-size:12.5px;line-height:1.6}.dc .row{margin:6px 0}.dc b{color:#374151}
+  .verdict{display:inline-block;padding:2px 9px;border-radius:5px;font-weight:600;font-size:12px}
+  .v-new{background:#fef3c7;color:#92400e}.v-reuse{background:#dcfce7;color:#166534}
+  .nn{margin:5px 0;padding:7px 10px;border:1px solid #e5e7eb;border-radius:5px;background:#f8fafc}
+  .nn .nm{font-weight:600}.nn .sc{float:right;color:#6b7280;font-family:ui-monospace,monospace}
+  .nn .pth{color:#9ca3af;font-size:11px;font-family:ui-monospace,monospace;word-break:break-all}
+  .modal{position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:110;display:flex;align-items:center;justify-content:center;padding:20px}
+  .mbox{background:#fff;width:760px;max-width:94vw;max-height:86vh;border-radius:10px;overflow:hidden;display:flex;flex-direction:column}
+  .mbox h2{margin:0;padding:13px 18px;background:#0f766e;color:#fff;font-size:14px;display:flex;align-items:center}
+  .mbox h2 .x{margin-left:auto;cursor:pointer;font-size:18px}
+  .mbox .body{padding:15px 18px;overflow:auto}.mbox pre{margin:0;font:12.5px/1.7 ui-monospace,Menlo,monospace;white-space:pre-wrap;color:#1f2937}
+  /* 提示词 Markdown 渲染 */
+  .md{font-size:13px;line-height:1.7;color:#1f2937}
+  .md h3{font-size:16px;margin:18px 0 8px;padding-bottom:5px;border-bottom:2px solid #0f766e;color:#0f766e}
+  .md h4{font-size:14px;margin:15px 0 6px;color:#0f766e}
+  .md h5,.md h6{font-size:13px;margin:12px 0 5px;color:#115e59}
+  .md p{margin:8px 0}
+  .md strong{color:#9a3412;font-weight:700}
+  .md code{background:#f1f5f9;color:#be123c;padding:1px 5px;border-radius:4px;font:12px ui-monospace,Menlo,monospace}
+  .md pre{background:#0f172a;border-radius:8px;padding:12px 14px;overflow-x:auto;margin:10px 0}
+  .md pre code{background:none;color:#e2e8f0;padding:0;font-size:12px;line-height:1.6}
+  .md blockquote{margin:10px 0;padding:8px 12px;background:#f0fdfa;border-left:3px solid #14b8a6;border-radius:0 6px 6px 0;color:#134e4a}
+  .md ul,.md ol{margin:8px 0;padding-left:22px}.md li{margin:4px 0}
+  .md hr{border:none;border-top:1px dashed #cbd5e1;margin:14px 0}
+  .md table{border-collapse:collapse;width:100%;margin:10px 0;font-size:12.5px}
+  .md th,.md td{border:1px solid #cbd5e1;padding:6px 9px;text-align:left;vertical-align:top}
+  .md th{background:#0f766e;color:#fff;font-weight:600;white-space:nowrap}
+  .md tbody tr:nth-child(even){background:#f8fafc}
+  .md a{color:#0e7490;text-decoration:underline}
+  .md .ptag{font-size:14px;font-weight:700;color:#0f766e;margin:16px 0 7px;padding:4px 10px;background:#ccfbf1;border-radius:6px;display:inline-block}
+  .md .ptag-ex{font-size:12px;font-weight:600;color:#92400e;background:#fef3c7;margin:11px 0 5px;padding:2px 9px}
+  .md .ptag-sub{font-weight:400;font-size:11.5px;opacity:.8;margin-left:7px}
+  .lb{position:fixed;inset:0;background:rgba(0,0,0,.85);display:flex;align-items:center;justify-content:center;z-index:120;cursor:zoom-out}.lb img{max-width:92vw;max-height:92vh;border-radius:6px}
+  .empty{color:#9ca3af;padding:50px;text-align:center}
+</style>
+</head>
+<body>
+<div id="root"></div>
+<script type="text/x-jsx" id="app-src">
+const {useState,useEffect}=React;
+const j=u=>fetch(u,{cache:"no-store"}).then(r=>r.json());
+// 复制到剪贴板:http/裸IP 下 navigator.clipboard 不可用,降级到 textarea+execCommand
+function copyText(t){
+  if(navigator.clipboard&&window.isSecureContext) return navigator.clipboard.writeText(t);
+  return new Promise(function(res,rej){try{var ta=document.createElement("textarea");ta.value=t;ta.style.position="fixed";ta.style.top="-9999px";ta.style.opacity="0";document.body.appendChild(ta);ta.focus();ta.select();var ok=document.execCommand("copy");document.body.removeChild(ta);ok?res():rej();}catch(e){rej(e);}});
+}
+const SCOPES=[["substance","实质"],["form","形式"],["feeling","感受"],["effect","作用"],["intent","意图"]];
+const SC_CN={substance:"实质",form:"形式",feeling:"感受",effect:"作用",intent:"意图"};
+const TYPECN={how:"How",what:"What",why:"Why"};
+const CSTAGE_DOC=`## 创作阶段:写死的 5 个(每步选 1 个)
+how 工序每一步命中其中**一个**;不在这 5 个里的值会被代码丢弃(受控词表,不开放)。
+
+| 阶段 | 在干什么 |
+|---|---|
+| **定向** | 定主题 / 方向 / 受众——还没开始具体创作 |
+| **构思** | 生成核心创意 / 钩子 / 角度 / 冲突 |
+| **结构** | 搭骨架 / 大纲 / 顺序 |
+| **成文** | 把结构写成具体文字 / 镜头 |
+| **打磨** | 修改 / 精炼 / 优化 / 定稿 |
+
+(区别于「动作」:动作是模型从帖子里实时抽的、不固定;创作阶段是定死的 5 选 1。)`;
+const GLOSSARY=`## 一篇帖子能拆出三种知识(平级的)
+这三种各帮你做一个不同的决定,没有谁更重要。
+
+| 标签 | 大白话 | 它帮你决定 |
+|---|---|---|
+| **怎么做** (How) | 一步步把东西做出来的流程 | 按什么**顺序**做 |
+| **是什么** (What) | 某东西由什么组成 / 有哪些种类 | 用**哪些料** |
+| **为什么** (Why) | 背后的道理、标准、平台规则 | 该**留什么、砍什么** |
+
+## 「是什么」按结构分三种
+- **子集**:像菜单,几个**互不隶属**的项,**归其一 or 挑着用**(例:7 种叙事结构挑一种、构图六法按场景挑)。
+  - 每个项后面那句 **👉 什么时候用** 就是「**选择线索**」——告诉你哪种情况该挑它。没有它,就只能背、不会选。
+- **多维关系**:像配方,几个部件**都要、合起来才完整、无先后**(例:人物 = 生理+社会+心理)。
+- **序列**:几个部件**都要、且有前后位置**(例:故事五部分、黄金三段式)。只是位置顺序——后段若**消费**前段产出、换序就崩,那就成 how 工序了。
+
+## 「为什么」是什么
+- **一段「阐述」**:把原帖讲这条原理的内容**忠实整合**成一段——这条原理**是什么 + 为什么成立**。
+- 解构阶段只**还原原理本身**,不加工"该怎么用"(那是下游应用的事)。`;
+
+const STEPS=[
+  {key:"read",label:"读懂帖子",desc:"把图、视频读成文字",
+   why:"创作知识常在图里、不在正文;这一步只忠实转写、不判断,避免一步干两件事。",
+   src:["/app/legacy-decode/prompt-read/extract.txt","/app/legacy-decode/prompt-read/extract_video.txt"]},
+  {key:"gate",label:"判断是否是创作知识",desc:"判这帖是不是『图文/视频创作』知识:两次判断+分歧裁决,不是就整帖跳过",
+   why:"靠模型语义理解判、不靠关键词(换措辞就绕过);两视角(一个判'是创作'、一个专挑'是制作/越界'的茬)+ 边界倾向排除,把『用工具做视频/游戏设计』挡在门外,省下后面整条拆解。",
+   src:["/app/legacy-decode/prompt-read/gate_admit.txt","/app/legacy-decode/prompt-read/gate_refute.txt","/app/legacy-decode/prompt-read/gate_tiebreak.txt"]},
+  {key:"frame",label:"拆出知识",desc:"从文字里拆出一条条知识,理清每条是 怎么做 / 是什么 / 为什么",
+   why:"先判类型再拆——三类成形不同,默认 how 会把纯 what 硬掰成假 how;how 先吸进步骤里的 what/why,吸不进的才独立成一条。",
+   src:["/app/legacy-decode/prompt-skill/phase1-frame.md"]},
+  {key:"howgate",label:"校验how的严谨性",desc:"每条『怎么做』再验一次:步骤真有先后依赖,还是离散知识被硬串成的假工序?两次判断+裁决,判假就拆回 是什么 / 为什么",
+   why:"模型有『教程=步骤』的先验,爱把几块离散知识(如 前提/人物/冲突)硬串成假工序。这步逐条核验:后步是否真消费前步产出、有没有『定义式拆解』(后步产出其实是前步里已点名的成分);假的当场拆成 what/why,真链原样保留。",
+   src:["/app/legacy-decode/prompt-read/gate_how_admit.txt","/app/legacy-decode/prompt-read/gate_how_refute.txt","/app/legacy-decode/prompt-read/gate_how_tiebreak.txt"]},
+  {key:"scope",label:"给知识归类",desc:"标好 讲什么 / 起什么作用 / 哪个创作环节 → 标签收成规范名词 → 和已有分类库对上号",
+   why:"这 5 类标签最容易串味,单独写厚;标签先名词化(动宾→名词)再做向量定位,既规范又能挂上分类库。",
+   src:["/app/legacy-decode/prompt-skill/phase2-scope.md","/app/legacy-decode/prompt-read/normalize_scope.txt"]},
+  {key:"store",label:"存进知识库",desc:"整理成统一格式存起来,供以后调用",
+   why:"纯拼接 + 校验的确定性活,程序自动做——没有提示词,让 AI 来干只会帮倒忙。",
+   src:null}
+];
+const STEPMAP={}; STEPS.forEach(s=>STEPMAP[s.key]=s);
+
+// 极简 Markdown 渲染(自带、无外部依赖):标题/表格/代码/引用/列表/加粗/行内码/链接
+function mdToHtml(src){
+  var escc=function(t){return t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");};
+  var inline=function(t){
+    t=escc(t);
+    t=t.replace(/`([^`]+)`/g,'<code>$1</code>');
+    t=t.replace(/\*\*([^*]+)\*\*/g,'<strong>$1</strong>');
+    t=t.replace(/\[([^\]]+)\]\(([^)]+)\)/g,'<a href="$2" target="_blank">$1</a>');
+    return t;
+  };
+  var L=(src||"").split("\n"), out=[], i=0;
+  var isStruct=function(s){return /^```/.test(s)||/^\s*#{1,6}\s/.test(s)||/^\s*>\s?/.test(s)||/^\s*[-*]\s+/.test(s)||/^\s*\d+\.\s+/.test(s)||/^\s*([-*_])(\s*\1){2,}\s*$/.test(s)||/^\s*\|/.test(s)||/^\s*<\/?[^<>]+>/.test(s);};
+  while(i<L.length){
+    var ln=L[i];
+    if(/^```/.test(ln)){ var b=[]; i++; while(i<L.length&&!/^```/.test(L[i])){b.push(L[i]);i++;} i++; out.push("<pre><code>"+escc(b.join("\n"))+"</code></pre>"); continue; }
+    if(/^\s*\|/.test(ln)&&i+1<L.length&&/^\s*\|?[\s:|-]*-[\s:|-]*\|?\s*$/.test(L[i+1])){
+      var head=ln, rows=[]; i+=2;
+      while(i<L.length&&/^\s*\|/.test(L[i])&&L[i].trim()!==""){rows.push(L[i]);i++;}
+      var cells=function(r){r=r.trim().replace(/^\|/,"").replace(/\|$/,"");return r.split("|").map(function(c){return c.trim();});};
+      var th=cells(head).map(function(c){return "<th>"+inline(c)+"</th>";}).join("");
+      var tb=rows.map(function(r){return "<tr>"+cells(r).map(function(c){return "<td>"+inline(c)+"</td>";}).join("")+"</tr>";}).join("");
+      out.push("<table><thead><tr>"+th+"</tr></thead><tbody>"+tb+"</tbody></table>"); continue;
+    }
+    if(/^\s*([-*_])(\s*\1){2,}\s*$/.test(ln)){ out.push("<hr/>"); i++; continue; }
+    var tag=ln.match(/^\s*<(\/?)([^<>\/][^<>]*)>\s*(.*)$/);  // 行首伪标签(如 <工作要点> / <example> 描述)→ 当小节标题
+    if(tag){ if(tag[1]){i++;continue;} var nm=tag[2], rest=tag[3].trim(), ex=/^example$/i.test(nm);
+      out.push('<div class="ptag'+(ex?' ptag-ex':'')+'">'+inline(ex?'示例':nm)+(rest?'<span class="ptag-sub">'+inline(rest)+'</span>':'')+"</div>"); i++; continue; }
+    var h=ln.match(/^\s*(#{1,6})\s+(.*)$/);
+    if(h){ var lv=Math.min(h[1].length+2,6); out.push("<h"+lv+">"+inline(h[2])+"</h"+lv+">"); i++; continue; }
+    if(/^\s*>\s?/.test(ln)){ var q=[]; while(i<L.length&&/^\s*>\s?/.test(L[i])){q.push(inline(L[i].replace(/^\s*>\s?/,"")));i++;} out.push("<blockquote>"+q.join("<br/>")+"</blockquote>"); continue; }
+    if(/^\s*[-*]\s+/.test(ln)){ var ul=[]; while(i<L.length&&/^\s*[-*]\s+/.test(L[i])){ul.push("<li>"+inline(L[i].replace(/^\s*[-*]\s+/,""))+"</li>");i++;} out.push("<ul>"+ul.join("")+"</ul>"); continue; }
+    if(/^\s*\d+\.\s+/.test(ln)){ var ol=[]; while(i<L.length&&/^\s*\d+\.\s+/.test(L[i])){ol.push("<li>"+inline(L[i].replace(/^\s*\d+\.\s+/,""))+"</li>");i++;} out.push("<ol>"+ol.join("")+"</ol>"); continue; }
+    if(ln.trim()===""){ i++; continue; }
+    var p=[]; while(i<L.length&&L[i].trim()!==""&&!isStruct(L[i])){p.push(inline(L[i]));i++;} out.push("<p>"+p.join("<br/>")+"</p>");
+  }
+  return out.join("\n");
+}
+
+function Ribbon({onOpen}){
+  return <div className="ribbon">
+    <div className="rcap">这套系统怎么「从帖子拆解知识」——点任一步看它的提示词</div>
+    <div className="rsteps">{STEPS.map((s,i)=><React.Fragment key={s.key}>
+      {i>0&&<span className="rarrow">→</span>}
+      <div className={"rstep"+(s.src?"":" auto")} onClick={()=>onOpen(s.key)}>
+        <div className="rtop"><span className="rn">{i+1}</span><span className="rlab">{s.label}</span></div>
+        <div className="rdesc">{s.desc}</div>
+        <div className="rbtn">{s.src?"📄 看提示词":"⚙️ 程序自动"}</div>
+      </div></React.Fragment>)}</div>
+  </div>;
+}
+
+function ScopeChip({x,onScope,showType}){
+  return <span className={"sv s-"+x.scope_type} onClick={()=>onScope(x)}>{showType&&<span className="k">{SC_CN[x.scope_type]||x.scope_type}</span>}{x.value}<span className={"mk "+(x.link==="复用"?"mk-reuse":"mk-new")}>{x.link==="复用"?"复":"新"}</span></span>;
+}
+function KScopes({list,onScope}){
+  if(!list||!list.length) return null;
+  return <div className="kscopes"><span className="lab">作用域(5 棵树):</span>
+    {list.map((x,i)=><ScopeChip key={i} x={{...x}} onScope={onScope} showType={true}/>)}</div>;
+}
+
+function HowTable({k,onScope,onPrompt,onSource,onCstage}){
+  const steps=k.steps||[];
+  const scOf=(s,t)=>(s.作用域||[]).filter(x=>x.scope_type===t);
+  return <div className="twrap"><table className="proc">
+    <thead>
+      <tr><th className="c-idx" rowSpan="2">#</th>
+        <th className="g-frame" colSpan="5">② 拆框架</th>
+        <th className="g-scope" colSpan="5">③ 作用域</th></tr>
+      <tr><th className="c-intent">输入</th><th className="c-cstage cstage-h" title="看 5 个写死的创作阶段" onClick={()=>onCstage&&onCstage()}>创作<br/>阶段 ▸</th><th className="c-act">动作<br/>(模型推导)</th><th className="c-dir">方法</th><th className="c-out">产出</th>
+        {SCOPES.map(([kk,cn])=><th key={kk} className={"c-scope s-"+kk}>{cn}</th>)}</tr>
+    </thead>
+    <tbody>{steps.map((s,i)=><tr className="step" key={i}>
+      <td className="idx">{i+1}</td>
+      <td className="intent"><span className="in-txt">{s.input}</span>{s.出处&&s.出处.length>0&&<span className="srcbtn" title={"看原文出处 "+s.出处.join(" ")} onClick={()=>onSource(s.出处)}>🔍</span>}</td>
+      <td className="cstage">{s.创作阶段&&<span className="cstage-chip">{s.创作阶段}</span>}</td>
+      <td className="act">{s.动作&&<span className="act-chip">{s.动作}</span>}</td>
+      <td className="dir"><span className="dir-txt">{s.directive}</span></td>
+      <td className="out"><span className="out-txt">{s.output}</span></td>
+      {SCOPES.map(([kk])=><td key={kk} className={"scope s-"+kk}>{scOf(s,kk).map((x,j)=><ScopeChip key={j} x={x} onScope={onScope}/>)}</td>)}
+    </tr>)}</tbody>
+  </table></div>;
+}
+function WhatCard({k,onScope,onGloss}){
+  return <div>
+    {k.概要&&<div className="def">
+      {k.kind&&<span className={"kindb kind-"+k.kind}>{k.kind}</span>}
+      {k.维度拆分规则&&<span className="dimrule" title="维度拆分规则(仅子集)">按「{k.维度拆分规则}」拆</span>}
+      概要:{k.概要}</div>}
+    {(k.body||[]).length>0&&<table className="elem"><tbody>{k.body.map((it,i)=><tr key={i}>
+      <td className="el">{it.item_name}</td><td>{it.item_desc}</td></tr>)}</tbody></table>}
+    <KScopes list={k.作用域} onScope={onScope}/>
+  </div>;
+}
+function WhyCard({k,onScope}){
+  return <div>
+    {k.阐述&&<div className="why-exp">{k.阐述}</div>}
+    <KScopes list={k.作用域} onScope={onScope}/>
+  </div>;
+}
+
+function KnowledgeCard({k,idx,onScope,onPrompt,onJson,onSource,payload,how_titles,onGloss,onCstage}){
+  const par=k.parent;
+  return <div className="kcard" id={"k-"+k.id}>
+    <div className="khead">
+      <span className="kno">第{idx+1}颗知识</span>
+      <span className={"ktype ty-"+k.type}>{TYPECN[k.type]}</span>
+      <span className="ktitle">{k.title}</span>
+      {k.出处&&k.出处.length>0&&<span className="kref" title={"看原文出处 "+k.出处.join(" ")} onClick={()=>onSource(k.出处)}>🔍 出处 {k.出处.join(" ")}</span>}
+      {par&&<span className="kref" onClick={()=>{var e=document.getElementById("k-"+par.how_id);if(e)e.scrollIntoView({behavior:"smooth",block:"center"});}}>↑ 出自「{how_titles[par.how_id]||par.how_id}」第{par.step}步</span>}
+      {(k.业务阶段||[]).map((b,i)=><span key={i} className="kbiz">业务阶段:{b}</span>)}
+      <span className="kacts">{payload&&<button className="lbtn" onClick={()=>onJson(payload)}>⚙️ 入库 payload</button>}</span>
+    </div>
+    <div className="kbody">
+      {k.type==="how"&&<HowTable k={k} onScope={onScope} onPrompt={onPrompt} onSource={onSource} onCstage={onCstage}/>}
+      {k.type==="what"&&<WhatCard k={k} onScope={onScope} onGloss={onGloss}/>}
+      {k.type==="why"&&<WhyCard k={k} onScope={onScope}/>}
+    </div>
+  </div>;
+}
+
+function App(){
+  const [items,setItems]=useState([]);
+  const [sel,setSel]=useState(0);
+  const [scope,setScope]=useState(null);
+  const [runs,setRuns]=useState([]);     // web/app/legacy-decode/legacy-decode/runs/index.json 清单(搜索批次)
+  const [run,setRun]=useState(null);     // 选中的 run slug;null=默认样本 frameworks.json
+  const [pm,setPm]=useState(null);
+  const [json,setJson]=useState(null);
+  const [copied,setCopied]=useState(false);
+  const [zoom,setZoom]=useState(null);
+  const [src,setSrc]=useState(null);
+  const [hl,setHl]=useState(false);
+  const [gloss,setGloss]=useState(false);
+  const [cstage,setCstage]=useState(false);
+  useEffect(()=>{j("/app/legacy-decode/legacy-decode/runs/index.json").then(r=>setRuns(Array.isArray(r)?r:[])).catch(()=>setRuns([]));},[]);
+  useEffect(()=>{
+    const fw=run?("/app/legacy-decode/runs/"+run+".json"):"/app/legacy-decode/frameworks.json";
+    const pls=run?("/app/legacy-decode/runs/"+run+".payloads.json"):"/app/legacy-decode/payloads.json";
+    Promise.all([j(fw),j(pls).catch(()=>[])]).then(([f,pl])=>{
+      setSel(0);setScope(null);
+      setItems((f.posts||[]).map(p=>({...p,payloads:(pl||[]).filter(x=>(x.source||{}).id===(p.source_id||("xhs_"+p.post_id)))})));});},[run]);
+  useEffect(()=>{document.body.classList.toggle("hl",hl);},[hl]);
+  function openPrompt(key){
+    const st=STEPMAP[key]; if(!st) return;
+    if(!st.src){ setPm({label:st.label,why:st.why,text:"(这一步是程序自动完成的,没有提示词。)"}); return; }
+    setPm({label:st.label,why:st.why,text:"加载中…"});
+    const multi=st.src.length>1;
+    Promise.all(st.src.map(u=>fetch(u,{cache:"no-store"}).then(r=>r.ok?r.text():"(未找到 "+u+")").catch(()=>"(加载失败 "+u+")")
+      .then(t=>multi?("## 〔"+u.split("/").pop()+"〕\n\n"+t):t)))
+      .then(txts=>setPm({label:st.label,why:st.why,text:txts.join("\n\n")}));
+  }
+  if(!items.length) return <div className="empty">加载中…</div>;
+  const it=items[sel];
+  const ks=it.knowledges||[];
+  const how_titles={}; ks.forEach(k=>{if(k.type==="how")how_titles[k.id]=k.title;});
+  const payloadOf=k=>(it.payloads||[]).find(p=>p.title===k.title);
+  const media=it.media||{}; const imgs=media.images||[]; const videoUrl=media.video_url;
+  const cardsById={}; (it.cards||[]).forEach(c=>cardsById[c.index]=c);
+  const openSource=list=>{var cs=(list||[]).map(s=>{var m=String(s).match(/\d+/);return m?cardsById[parseInt(m[0])]:null;}).filter(Boolean);if(cs.length)setSrc({cards:cs});};
+  const fmtT=s=>{s=Math.floor(s||0);return Math.floor(s/60)+":"+String(s%60).padStart(2,"0");};
+  return <div className="app">
+    <header className="top">
+      <h1>创作知识的解构</h1>
+      <div className="picker"><span className="lab">批次:</span>
+        <select className="runsel" value={run||""} onChange={e=>setRun(e.target.value||null)}>
+          <option value="">样本(frameworks)</option>
+          {runs.map((r,i)=><option key={i} value={r.slug}>{(r.queries||[]).join("+")||r.slug}({r.count}帖)</option>)}
+          {runs.length===0 && <option value="" disabled>(暂无搜索批次——跑一次 query 后出现)</option>}
+        </select>
+      </div>
+      <div className="picker"><span className="lab">帖子:</span>
+        {items.map((x,i)=><div key={i} className={"pill"+(sel===i?" on":"")} onClick={()=>{setSel(i);setScope(null);}}>{x.title.slice(0,16)}<span className="n">{(x.knowledges||[]).length}颗</span></div>)}
+      </div>
+    </header>
+    <div className="scroll">
+      <Ribbon onOpen={openPrompt}/>
+      <details className="src" open><summary>原帖:{it.title}(这一帖的原料)· {it.platform}{videoUrl?" · 视频":(imgs.length?` · ${imgs.length} 图`:"")}</summary>
+        <div className="srcbody"><a href={it.url} target="_blank" rel="noreferrer">{it.url}</a>
+          {videoUrl
+            ? <div style={{marginTop:8}}><video src={videoUrl} controls style={{maxWidth:"380px",maxHeight:"320px",borderRadius:"6px",border:"1px solid #e2e8f0"}}/></div>
+            : <div className="srcimgs">{imgs.map((u,i)=><img key={i} src={u} title={u} onClick={()=>setZoom(u)} onError={e=>{var ph="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='80' height='80'><rect width='80' height='80' fill='%23f1f5f9' stroke='%23cbd5e1' stroke-dasharray='4'/></svg>"; if(e.target.src.slice(0,4)!=='data')e.target.src=ph;}}/>)}</div>}
+        </div>
+      </details>
+      <div className="barhint" style={{display:"flex",gap:8,alignItems:"center"}}>
+        <span>这一帖拆出 <b>{ks.length}</b> 颗知识(how 工序表 / what 知识卡 / why 论点卡);组件颗标「出自某 how 第 N 步」可点跳。</span>
+        <button className="lbtn glossbtn" onClick={()=>setGloss(true)} style={{marginLeft:"auto"}}>❓ 名词说明</button>
+        <button className={"lbtn"+(hl?" on":"")} onClick={()=>setHl(!hl)}>高亮「新值」</button>
+      </div>
+      {ks.length===0 && <div className="kcard"><div className="kbody" style={{padding:"20px 16px",color:"#9ca3af",fontSize:"13px"}}>🚫 这帖<b style={{color:"#6b7280"}}>没有可提取的创作知识</b>(纯作品 / 展示 / 无关)——① 读懂时 <code>is_empty=true</code>,后面拆颗/归类/入库已自动跳过。</div></div>}
+      {ks.map((k,i)=><KnowledgeCard key={i} k={k} idx={i} onScope={setScope} onPrompt={openPrompt} onJson={setJson} onSource={openSource} payload={payloadOf(k)} how_titles={how_titles} onGloss={()=>setGloss(true)} onCstage={()=>setCstage(true)}/>)}
+    </div>
+    {scope&&<div><div className="ov" onClick={()=>setScope(null)}></div>
+      <div className="drawer"><h2>作用域定位详情<span className="x" onClick={()=>setScope(null)}>×</span></h2>
+        <div className="dc">
+          <div className="row"><b>提取候选值</b>:{scope.candidate||scope.value}</div>
+          <div className="row"><b>归属树</b>:<span className={"sv s-"+scope.scope_type} style={{cursor:"default"}}>{SC_CN[scope.scope_type]||scope.scope_type}</span>(在这棵树里找最近邻)</div>
+          <div className="row"><b>判定</b>:<span className={"verdict "+(scope.link==="复用"?"v-reuse":"v-new")}>{scope.link==="复用"?"复用现有节点":"新建(树里没有)"}</span> = 最近邻 {scope.score}</div>
+          <div className="row"><b>最终入库值</b>:{scope.value}</div>
+          <h3 style={{margin:"12px 0 6px",fontSize:12.5,color:"#475569"}}>分类树最近邻 top-{(scope.top||[]).length} · 【{SC_CN[scope.scope_type]||scope.scope_type}】树(火山余弦)</h3>
+          {(scope.top||[]).map((h,i)=><div className="nn" key={i}><span className="sc">{h.score}</span><span className="nm">{h.name}</span><div className="pth">【{SC_CN[scope.scope_type]||scope.scope_type}】 {h.path}</div></div>)}
+          {(!scope.top||!scope.top.length)&&<div style={{color:"#9ca3af"}}>无最近邻</div>}
+        </div></div></div>}
+    {pm&&<div className="modal" onClick={()=>setPm(null)}><div className="mbox" onClick={e=>e.stopPropagation()}>
+      <h2>📄 {pm.label} · 这一步的提示词<span className="x" onClick={()=>setPm(null)}>×</span></h2>
+      <div className="body">
+        <div className="pmwhy"><b>为什么这么做:</b>{pm.why}</div>
+        {pm.text==="加载中…"?<pre>{pm.text}</pre>:<div className="md" dangerouslySetInnerHTML={{__html:mdToHtml(pm.text)}}/>}</div></div></div>}
+    {json&&<div className="modal" onClick={()=>{setJson(null);setCopied(false);}}><div className="mbox" onClick={e=>e.stopPropagation()}>
+      <h2>⚙️ ingest payload(给机器看)
+        <button className="lbtn" style={{marginLeft:"auto",marginRight:8}} onClick={()=>copyText(JSON.stringify(json,null,2)).then(()=>{setCopied(true);setTimeout(()=>setCopied(false),1500);}).catch(()=>{})}>{copied?"✓ 已复制":"📋 复制 JSON"}</button>
+        <span className="x" style={{marginLeft:0}} onClick={()=>{setJson(null);setCopied(false);}}>×</span></h2>
+      <div className="body"><pre>{JSON.stringify(json,null,2)}</pre></div></div></div>}
+    {src&&<div className="modal" onClick={()=>setSrc(null)}><div className="mbox" onClick={e=>e.stopPropagation()}>
+      <h2>🔍 原文出处(① 读到的卡片)<span className="x" onClick={()=>setSrc(null)}>×</span></h2>
+      <div className="body">{src.cards.map((c,i)=><div className="srccard" key={i}>
+        <div className="ci">卡片{c.index}{c.start!=null?(" · "+fmtT(c.start)+"–"+fmtT(c.end)):""}</div>
+        {c.image_url&&<img src={c.image_url} onClick={()=>setZoom(c.image_url)} onError={e=>e.target.style.display='none'}/>}
+        {c.video_url&&<video src={c.video_url+(c.start!=null?("#t="+Math.floor(c.start)+","+Math.floor(c.end)):"")} controls/>}
+        {c.content?<div className="srcread">① 在这张卡读到的:{c.content}</div>:<div style={{color:"#9ca3af",fontSize:"12px",marginTop:5}}>(这张卡没读到要点)</div>}
+      </div>)}</div></div></div>}
+    {cstage&&<div className="modal" onClick={()=>setCstage(false)}><div className="mbox" onClick={e=>e.stopPropagation()}>
+      <h2>📐 创作阶段 · 写死的 5 个<span className="x" onClick={()=>setCstage(false)}>×</span></h2>
+      <div className="body"><div className="md" dangerouslySetInnerHTML={{__html:mdToHtml(CSTAGE_DOC)}}/></div></div></div>}
+    {gloss&&<div className="modal" onClick={()=>setGloss(false)}><div className="mbox" onClick={e=>e.stopPropagation()}>
+      <h2>❓ 名词说明 · 用大白话讲清楚<span className="x" onClick={()=>setGloss(false)}>×</span></h2>
+      <div className="body"><div className="md" dangerouslySetInnerHTML={{__html:mdToHtml(GLOSSARY)}}/></div></div></div>}
+    {zoom&&<div className="lb" onClick={()=>setZoom(null)}><img src={zoom}/></div>}
+  </div>;
+}
+ReactDOM.createRoot(document.getElementById("root")).render(<App/>);
+</script>
+<script>
+(function(){var src=document.getElementById("app-src").textContent;
+ var out=Babel.transform(src,{presets:[["react",{runtime:"classic"}]]}).code;(0,eval)(out);})();
+</script>
+</body>
+</html>

+ 473 - 0
app/frontend/public/legacy-decode/payloads.json

@@ -0,0 +1,473 @@
+[
+ {
+  "source": {
+   "id": "xhs_699308fa0000000016009697",
+   "source_type": "post",
+   "title": "真正能爆的选题,往往是你写完后感觉羞耻的",
+   "author": "方圆的增长飞轮",
+   "source_metadata": {
+    "platform": "xiaohongshu",
+    "url": "https://www.xiaohongshu.com/explore/699308fa0000000016009697"
+   }
+  },
+  "title": "爆款选题双招法",
+  "content": "目标:产出一个能引发情绪共鸣的爆款选题\n步骤1\n  输入:选定目标赛道\n  方法:提取该赛道中被广泛默认、反复复述的‘圣经句’(即正确共识),如『能力强的人一定会被看见』;必须是大众信奉但未经质疑的断言。例:『…能力强的人一定会被看见…』\n  产出:〈赛道圣经句〉\n步骤2\n  输入:← s1 的〈赛道圣经句〉\n  方法:针对该句,追问:什么情况下严格按这句话做,反而导致结果恶化?即寻找其失效的现实场景(共识崩塌点)。例:『职场中能力强却长期被埋没、汇报不力反被提拔』\n  产出:〈共识失灵场景清单〉\n步骤3\n  输入:← s1 的〈赛道圣经句〉\n  方法:前往同赛道热门竞品评论区,筛选含『但是……』『其实……』『没人敢说……』等转折/压抑表达的评论——这些是用户‘懂但没说出口’的真实痛点,已通过市场反馈验证。例:『标题很干货,但是看完还是不会写』\n  产出:〈竞品评论区沉默痛点集〉\n步骤4\n  输入:← s2 的〈共识失灵场景清单〉, ← s3 的〈竞品评论区沉默痛点集〉\n  方法:将二者交叉比对,选取同时满足‘共识崩塌’+‘用户已有压抑共鸣’的交集点,将其转化为具体选题表述,确保带有羞耻感或冒犯感(非攻击性,而是撕裂正确表象)。例:『别再信“努力就有回报”,这届打工人正在用离职投票』\n  产出:一个能引发情绪共鸣的爆款选题",
+  "dim_creations": [
+   "创作"
+  ],
+  "dim_attributes": [
+   "how"
+  ],
+  "scopes": [
+   {
+    "scope_type": "substance",
+    "value": "赛道圣经句"
+   },
+   {
+    "scope_type": "substance",
+    "value": "正确共识"
+   },
+   {
+    "scope_type": "substance",
+    "value": "大众信奉断言"
+   },
+   {
+    "scope_type": "form",
+    "value": "提取法"
+   },
+   {
+    "scope_type": "effect",
+    "value": "共识"
+   },
+   {
+    "scope_type": "intent",
+    "value": "识别共识起点"
+   },
+   {
+    "scope_type": "substance",
+    "value": "共识失灵场景"
+   },
+   {
+    "scope_type": "substance",
+    "value": "现实失效条件"
+   },
+   {
+    "scope_type": "substance",
+    "value": "共识崩塌点"
+   },
+   {
+    "scope_type": "form",
+    "value": "反事实追问"
+   },
+   {
+    "scope_type": "effect",
+    "value": "共识解构"
+   },
+   {
+    "scope_type": "effect",
+    "value": "结构性矛盾暴露"
+   },
+   {
+    "scope_type": "intent",
+    "value": "挖掘认知裂缝"
+   },
+   {
+    "scope_type": "substance",
+    "value": "竞品评论区沉默痛点"
+   },
+   {
+    "scope_type": "substance",
+    "value": "用户未言明真实痛点"
+   },
+   {
+    "scope_type": "substance",
+    "value": "市场验证型压抑表达"
+   },
+   {
+    "scope_type": "form",
+    "value": "评论区语义"
+   },
+   {
+    "scope_type": "form",
+    "value": "转折词筛选"
+   },
+   {
+    "scope_type": "effect",
+    "value": "真实痛点捕获"
+   },
+   {
+    "scope_type": "effect",
+    "value": "情感共鸣"
+   },
+   {
+    "scope_type": "intent",
+    "value": "锚定已验证情绪触点"
+   },
+   {
+    "scope_type": "substance",
+    "value": "共识崩塌"
+   },
+   {
+    "scope_type": "substance",
+    "value": "用户压抑交集点"
+   },
+   {
+    "scope_type": "substance",
+    "value": "羞耻感选题"
+   },
+   {
+    "scope_type": "substance",
+    "value": "冒犯感选题"
+   },
+   {
+    "scope_type": "substance",
+    "value": "情绪共鸣型爆款选题"
+   },
+   {
+    "scope_type": "form",
+    "value": "交叉比对法"
+   },
+   {
+    "scope_type": "form",
+    "value": "交集转化"
+   },
+   {
+    "scope_type": "effect",
+    "value": "情绪信号强化"
+   },
+   {
+    "scope_type": "effect",
+    "value": "选题冒犯性校准"
+   },
+   {
+    "scope_type": "effect",
+    "value": "羞耻感注入"
+   },
+   {
+    "scope_type": "intent",
+    "value": "生成高共鸣选题"
+   }
+  ],
+  "custom_ext": [
+   {
+    "key": "业务阶段",
+    "type": "str",
+    "value": "选题"
+   },
+   {
+    "key": "创作阶段",
+    "type": "str",
+    "value": "定向"
+   },
+   {
+    "key": "创作阶段",
+    "type": "str",
+    "value": "构思"
+   },
+   {
+    "key": "创作阶段",
+    "type": "str",
+    "value": "结构"
+   },
+   {
+    "key": "动作",
+    "type": "str",
+    "value": "提取共识句"
+   },
+   {
+    "key": "动作",
+    "type": "str",
+    "value": "逆向推演失效场景"
+   },
+   {
+    "key": "动作",
+    "type": "str",
+    "value": "挖掘评论区未言明反馈"
+   },
+   {
+    "key": "动作",
+    "type": "str",
+    "value": "交叉验证并具象化选题"
+   }
+  ]
+ },
+ {
+  "source": {
+   "id": "xhs_699308fa0000000016009697",
+   "source_type": "post",
+   "title": "真正能爆的选题,往往是你写完后感觉羞耻的",
+   "author": "方圆的增长飞轮",
+   "source_metadata": {
+    "platform": "xiaohongshu",
+    "url": "https://www.xiaohongshu.com/explore/699308fa0000000016009697"
+   }
+  },
+  "title": "好选题的情绪信号",
+  "content": "{\"name\": \"好选题的情绪信号\", \"kind\": \"子集\", \"维度拆分规则\": \"情绪触发类型\", \"body\": [{\"item_name\": \"羞耻感\", \"item_desc\": \"写完后内心犹豫、不好意思、想删掉——因为它触碰了真实但被社交礼仪层层包裹的痛点;是好选题的防伪标签。例:『…写完后感觉羞耻的,因为太正确的选题缺乏情绪共鸣…』\", \"作用域\": []}, {\"item_name\": \"冒犯感\", \"item_desc\": \"不是脏话式冒犯,而是对大众信奉的‘正确共识’进行温和撕裂,从而触动公共痛点;能引发强烈共鸣。例:『…真正的爆款选题带有冒犯感,不是脏话式的冒犯,而是对正确共识的挑战…』\", \"作用域\": []}]}",
+  "dim_creations": [
+   "创作"
+  ],
+  "dim_attributes": [
+   "what"
+  ],
+  "scopes": [
+   {
+    "scope_type": "substance",
+    "value": "羞耻感"
+   },
+   {
+    "scope_type": "substance",
+    "value": "冒犯感"
+   },
+   {
+    "scope_type": "substance",
+    "value": "情绪信号"
+   },
+   {
+    "scope_type": "substance",
+    "value": "社交礼仪包裹痛点"
+   },
+   {
+    "scope_type": "substance",
+    "value": "公共痛点"
+   },
+   {
+    "scope_type": "substance",
+    "value": "正确共识挑战"
+   },
+   {
+    "scope_type": "form",
+    "value": "情绪防伪标签法"
+   },
+   {
+    "scope_type": "effect",
+    "value": "选题真伪甄别"
+   },
+   {
+    "scope_type": "effect",
+    "value": "情绪共鸣触发"
+   },
+   {
+    "scope_type": "intent",
+    "value": "识别高潜力选题"
+   }
+  ],
+  "custom_ext": [
+   {
+    "key": "概要",
+    "type": "str",
+    "value": "羞耻感和冒犯感是识别高潜力选题的关键情绪信号。"
+   }
+  ]
+ },
+ {
+  "source": {
+   "id": "xhs_699308fa0000000016009697",
+   "source_type": "post",
+   "title": "真正能爆的选题,往往是你写完后感觉羞耻的",
+   "author": "方圆的增长飞轮",
+   "source_metadata": {
+    "platform": "xiaohongshu",
+    "url": "https://www.xiaohongshu.com/explore/699308fa0000000016009697"
+   }
+  },
+  "title": "赛道圣经句",
+  "content": "{\"name\": \"赛道圣经句\", \"kind\": \"子集\", \"维度拆分规则\": \"共识性质\", \"body\": [{\"item_name\": \"职场类圣经句\", \"item_desc\": \"『能力强的人一定会被看见』\", \"作用域\": []}]}",
+  "dim_creations": [
+   "创作"
+  ],
+  "dim_attributes": [
+   "what"
+  ],
+  "scopes": [
+   {
+    "scope_type": "substance",
+    "value": "赛道圣经句"
+   },
+   {
+    "scope_type": "substance",
+    "value": "正确共识性断言"
+   },
+   {
+    "scope_type": "substance",
+    "value": "广泛默认断言"
+   },
+   {
+    "scope_type": "substance",
+    "value": "反复复述共识"
+   },
+   {
+    "scope_type": "substance",
+    "value": "共识撕裂起点"
+   },
+   {
+    "scope_type": "substance",
+    "value": "职场类圣经句"
+   },
+   {
+    "scope_type": "substance",
+    "value": "能力强的人一定会被看见"
+   },
+   {
+    "scope_type": "form",
+    "value": "共识类型"
+   },
+   {
+    "scope_type": "effect",
+    "value": "共识锚定"
+   },
+   {
+    "scope_type": "intent",
+    "value": "界定共识基线"
+   }
+  ],
+  "custom_ext": [
+   {
+    "key": "概要",
+    "type": "str",
+    "value": "赛道内被广泛默认、反复复述的正确共识性断言,是共识撕裂的起点。"
+   },
+   {
+    "key": "出自",
+    "type": "str",
+    "value": "爆款选题双招法 第1步"
+   }
+  ]
+ },
+ {
+  "source": {
+   "id": "xhs_699308fa0000000016009697",
+   "source_type": "post",
+   "title": "真正能爆的选题,往往是你写完后感觉羞耻的",
+   "author": "方圆的增长飞轮",
+   "source_metadata": {
+    "platform": "xiaohongshu",
+    "url": "https://www.xiaohongshu.com/explore/699308fa0000000016009697"
+   }
+  },
+  "title": "羞耻感作为选题信号的原理",
+  "content": "{\"name\": \"羞耻感作为选题信号的原理\", \"desc\": \"羞耻感是好选题的防伪标签,因为它意味着内容触碰了真实存在但被社交礼仪、群体沉默或自我审查层层包裹的痛点;这种包裹使痛点难以被公开讨论,一旦被精准表达,就会引发强烈情绪共鸣。而没有情绪触发的内容不可能爆红,安全的选题等于无感——写完后内心没有波澜、觉得没问题,大概率是无效选题;反之,写完后有点犹豫或不好意思,则可能是好选题。\"}",
+  "dim_creations": [
+   "创作"
+  ],
+  "dim_attributes": [
+   "why"
+  ],
+  "scopes": [
+   {
+    "scope_type": "substance",
+    "value": "羞耻感"
+   },
+   {
+    "scope_type": "substance",
+    "value": "社交礼仪包裹痛点"
+   },
+   {
+    "scope_type": "substance",
+    "value": "群体沉默"
+   },
+   {
+    "scope_type": "substance",
+    "value": "自我审查"
+   },
+   {
+    "scope_type": "substance",
+    "value": "情绪共鸣触发机制"
+   },
+   {
+    "scope_type": "substance",
+    "value": "理性认知缺口"
+   },
+   {
+    "scope_type": "substance",
+    "value": "感性情绪开关"
+   },
+   {
+    "scope_type": "effect",
+    "value": "痛点精准表达"
+   },
+   {
+    "scope_type": "effect",
+    "value": "情绪共振密度构建"
+   },
+   {
+    "scope_type": "effect",
+    "value": "选题无效性排除"
+   },
+   {
+    "scope_type": "intent",
+    "value": "解释羞耻感的选题价值"
+   }
+  ],
+  "custom_ext": []
+ },
+ {
+  "source": {
+   "id": "xhs_699308fa0000000016009697",
+   "source_type": "post",
+   "title": "真正能爆的选题,往往是你写完后感觉羞耻的",
+   "author": "方圆的增长飞轮",
+   "source_metadata": {
+    "platform": "xiaohongshu",
+    "url": "https://www.xiaohongshu.com/explore/699308fa0000000016009697"
+   }
+  },
+  "title": "交叉验证提升选题共鸣效力的原理",
+  "content": "{\"name\": \"交叉验证提升选题共鸣效力的原理\", \"desc\": \"共识失灵场景代表结构性矛盾,竞品评论区沉默痛点代表已被市场验证的个体压抑体验;二者的交集既具备现实根基又自带情感共振密度,因此转化出的选题能同时击中理性认知缺口与感性情绪开关,形成不可替代的共鸣效力。\"}",
+  "dim_creations": [
+   "创作"
+  ],
+  "dim_attributes": [
+   "why"
+  ],
+  "scopes": [
+   {
+    "scope_type": "substance",
+    "value": "共识失灵场景"
+   },
+   {
+    "scope_type": "substance",
+    "value": "竞品评论区沉默痛点"
+   },
+   {
+    "scope_type": "substance",
+    "value": "结构性矛盾"
+   },
+   {
+    "scope_type": "substance",
+    "value": "个体压抑体验"
+   },
+   {
+    "scope_type": "substance",
+    "value": "理性认知缺口"
+   },
+   {
+    "scope_type": "substance",
+    "value": "感性情绪开关"
+   },
+   {
+    "scope_type": "effect",
+    "value": "交叉"
+   },
+   {
+    "scope_type": "effect",
+    "value": "共鸣效力叠加"
+   },
+   {
+    "scope_type": "effect",
+    "value": "不可替代性"
+   },
+   {
+    "scope_type": "intent",
+    "value": "阐明交叉验证原理"
+   }
+  ],
+  "custom_ext": [
+   {
+    "key": "出自",
+    "type": "str",
+    "value": "爆款选题双招法 第4步"
+   }
+  ]
+ }
+]

+ 55 - 0
app/frontend/public/legacy-decode/prompt-read/extract.txt

@@ -0,0 +1,55 @@
+你在从一篇小红书帖子(标题、正文、图片、视频)里提取「创作知识」:能指导别人"如何创作内容"的方法、原理、认知或清单。本步只忠实提取,不判断好坏,不拆分归类。
+
+<什么算创作知识>
+能迁移、能复用、能教别人"怎么创作图文/视频内容"的方法、原理、清单。**判断要同时过两条轴,缺一不算:**
+
+【轴A·产出物是不是「内容」】这条知识帮你创作出来的成品,是不是 图文 / 视频 / 脚本 / 剧本 / 小说 这类**内容**?题材不限(美食/游戏/健身/穿搭…都行),卡的是产出物:
+- 算:产出"关于某题材的**内容**"——美食视频拍法、游戏实况/解说脚本、健身图文写法、剧本/小说写法。
+- 不算:产出"那个题材**本身**"——一道菜的做法、一个**游戏的玩法/关卡设计**、一个产品、一套运营/选品策略(这是做题材本身,不是做关于它的内容)。
+
+【轴B·是「创作」不是「制作」】它教的是"怎么构思/选题/写/结构/呈现"(创作),还是"用哪个软件/AI、点哪个按钮把成品产出来"(制作/工具操作)?
+- 算(创作):选题/构思方法、结构或排版公式、要素清单、为什么某种开头/呈现更抓人、镜头/构图/配色的设计判断。
+- 不算(制作):打开某 App/小程序 → 输入/粘贴 → 点生成/扩写 → 设参数 → 导出/保存 这类工具操作步骤;纯器材/剪辑软件/调色/导出操作。
+- **特别强调(最常被误判)**:「**用某 AI/App 帮你生成内容成品**」的操作教程——例:『打开豆包/某AI → 输入需求 → 让它生成文案/图/视频 → 选一个满意的用』——这是**让工具替你做(制作/工具使用),不是教你自己怎么创作**,即便产出是视频/文案也**不算**。除非它真的在教"怎么把创作需求拆成可复用的判断/方法"(而不仅是"让 AI 生成再挑一个")。**整帖只是这种"用 AI 几步做出视频/文案"的流程 → 轴B 不过 → 判 is_empty。**
+
+【两轴 AND】两条都过才算;任一不过 → 不算。
+另外不算(作品本身):一段具体文案、一张图的 AI 出图提示词、一个具体选题标题、一份具体食谱用量、纯展示内容(风景/产品/生活)。
+作品里有时夹带可迁移的**创作**方法,有就提、没有就如实标空。
+</什么算创作知识>
+
+<工作要点>
+- 知识常在图片/视频里,正文常常只是话题串(如 "#短剧编剧# #写作#")。为什么强调:只读正文会系统性漏掉真正的知识,所以必须看图、看视频。
+- 以原始素材为准,忠实转述,不编造、不补全、不替作者总结它没说的结论;有的尽量提全。
+- **按卡片归因**:每张图/帧旁都标了【卡片N】。除了 text(综合所有卡片把创作知识讲清楚,主产物),还要填 cards——每张**有知识**的卡片一条 {{"index": N, "content": "这张卡上的知识要点"}},N 就是【卡片N】里的号;某张卡没有知识就不列它。为什么:后续要据此把每条知识溯源到具体卡片。
+- **is_empty(整条流程的总闸)**:判 `true` 后,后面的拆颗 / 归类 / 入库**全部不走**。两种情况标 `true`:
+  ① **纯作品/纯展示/纯无关**——通篇看完确实没有任何可迁移的创作方法/原理/清单。
+  ② **整帖不在范围内(越界要果断判 true,别放行)**——整帖产出物不是图文/视频内容(如游戏玩法/关卡设计、产品/运营/选品、做菜本身),**或**整帖是制作/工具操作(如"用某 AI/App 几步做出一段视频"的打开→点按钮→导出流程)。这类即便看着像"教程/步骤",也按轴A/轴B 判定为越界。
+  只要有一点点"怎么**创作内容**"的可迁移方法就 `false`;**范围内但拿不准有没有知识 → `false`**(交后面再筛);**但"在不在范围内"要果断**——明确越界(游戏设计/纯工具操作)就标 `true`,别用"拿不准"把越界帖放进来。标 `true` 时 `text` 留空字符串、`cards` 留空数组。
+</工作要点>
+
+<示例>
+(下面两例只示意「输出格式」和「忠实/留空」的尺度,**别把示例里的题材/内容当成要找的东西**——每帖都从它自己的真实内容抽。)
+<example>  知识在图里、正文为空(多张卡片)
+正文:"#短剧编剧# #写作#";【卡片1】图:前提 = 作者立场+人物+冲突+结论;【卡片2】图:人物三维度——生理/社会/心理。
+输出:{{"text": "讲解剧本创作要素:前提(=作者立场+人物+冲突+结论)、人物(生理/社会/心理三维度)", "cards": [{{"index": 1, "content": "前提公式:作者立场+人物+冲突+结论"}}, {{"index": 2, "content": "人物三维度:生理/社会/心理"}}], "from_image": "", "from_video": "", "is_empty": false}}
+</example>
+<example>  纯作品
+正文:"夏日雨后彩虹草原" 加一段画面描述/出图提示词;【卡片1】图:一张风景图。
+输出:{{"text": "", "cards": [], "from_image": "", "from_video": "", "is_empty": true}}
+</example>
+</示例>
+
+<输入>
+帖子标题:{title}
+话题:{topics}
+正文(可能为空或只是话题串,不要只看它):
+{body}
+(图片与视频已作为多模态输入一并给你,请查看)
+</输入>
+
+<输出>
+只输出一个 JSON 对象:
+{{"text": "把创作知识完整忠实讲清楚;没有就空字符串",
+  "cards": [{{"index": 卡片号, "content": "这张卡上的知识要点"}}],
+  "from_image": "", "from_video": "", "is_empty": false}}
+</输出>

+ 23 - 0
app/frontend/public/legacy-decode/prompt-read/extract_video.txt

@@ -0,0 +1,23 @@
+你在从一条短视频里提炼「创作知识」——能指导别人怎么做内容的方法、原理、清单。
+
+<什么算创作知识>
+能迁移、能复用、能教别人"怎么做内容"的东西(选题法、爆款结构、起号逻辑、脚本/文案/镜头技巧、为什么某种做法有效)。不算的:一条具体作品本身、纯展示内容。
+</什么算创作知识>
+
+<工作要点>
+- 视频是口播 + 画面 + 字幕,请**同时听口播、看画面与字幕**——口播里往往是核心知识,别只看画面。
+- 以视频实际内容为准,忠实提炼,原文没有的不要编造、不要拔高。
+- **按视频时间顺序分段**,每段给时间戳和这段讲到的创作知识;一段对应一个相对完整的知识点/小主题。
+- 每段标 What/Why/How(这段讲的是"是什么/有哪些"、"为什么有效"、"怎么做"),有哪个填哪个,没有的填 null。
+</工作要点>
+
+<输出>
+只输出一个 JSON 对象:
+{{"video_title": "视频在讲什么的简短标题",
+  "overall": "全片在教什么,一两句话",
+  "segments": [
+    {{"start": "MM:SS", "end": "MM:SS", "title": "这段小标题",
+      "knowledge_types": ["what 和/或 why 和/或 how"],
+      "what": "或 null", "why": "或 null", "how": "或 null"}}
+  ]}}
+</输出>

+ 13 - 0
app/frontend/public/legacy-decode/prompt-read/gate_admit.txt

@@ -0,0 +1,13 @@
+你在判断:一篇帖子「读懂后的内容」,是不是【图文/视频内容创作】的可迁移知识。用户消息就是这帖读懂后的内容。
+
+两条轴**都过**,才算"创作知识"(in_scope=true):
+- 轴A·产出物是内容:它教你创作出来的成品,是 图文 / 视频 / 脚本 / 剧本 / 小说 这类【内容】(题材不限:美食/游戏/健身都行)。
+- 轴B·是创作不是制作:它教"怎么构思/选题/写/结构/呈现"(创作),不是"用某 App/AI、打开→输入→生成→导出 把成品做出来"(制作/工具操作)。
+
+**题材不限,只看产出物 + 层面**——同样涉及游戏/电商也可能是创作:
+- ✅ 算:『如何创作**游戏实况/解说视频**』『如何构思**电商带货视频**的 idea』『如何构思**小说**结构』——产出是视频/小说**内容**、教的是创作。
+- ❌ 不算:『如何**设计游戏玩法/关卡**』『如何**做电商选品/运营**』——产出是游戏/生意**本身**,不是"关于它的内容"。
+一句话:**做题材本身→不算;做"关于题材的内容"→算。**
+
+先用一句话复述"这帖到底在教什么",再对照两轴判定。
+输出 JSON:{"复述":"<一句话>","轴A":true/false,"轴B":true/false,"in_scope":true/false,"category":"创作/制作/越界","理由":"<为什么>"}

+ 7 - 0
app/frontend/public/legacy-decode/prompt-read/gate_how_admit.txt

@@ -0,0 +1,7 @@
+你在判断:下面这颗「how 工序」是不是【真流水线】——后一步必须消费前一步的**具体产出**,缺了前步、后步就做不了,打乱顺序就跑不通。
+
+用户消息是这颗 how 的 purpose + 各步(input/方法/产出),可能附带「代码信号」。
+逐对相邻步骤检查:**后步是否真用到前步产出的那个具体物**(不是"话题相关",是"没有前步那个产出就无法进行")。
+只要存在"步骤各自独立、可换序、或只是并列地讲'X 是什么/分几类'",就不是真流水线。
+
+输出 JSON:{"复述":"<这颗在教什么,一句话>","逐步依赖":"<s2 用了 s1 的什么…逐对说,说不出就写'无'>","is_real_how":true/false,"理由":"..."}

+ 13 - 0
app/frontend/public/legacy-decode/prompt-read/gate_how_refute.txt

@@ -0,0 +1,13 @@
+你在审查(带着怀疑核验,但只认事实、命中才算):下面这颗「how 工序」是不是【假 how】——其实是几块离散构成/原理,被硬串成了步骤。
+
+逐条对照下面判据,命中任一 → is_fake=true:
+- 步骤的产出彼此近义/重复(都产出"同一类东西");
+- 打乱步骤顺序,成品仍成立(无强制先后);
+- 某步的"输入"其实是工序总输入、而非前一步的产出(步骤各自起头、互不喂给);
+- 这些"步骤"各自是"X 是什么 / 分几类"(如 前提 / 人物 / 冲突 这种离散构成),互为定义但**无"产出→输入"传递**;
+- 【定义式拆解】某后步的产出,是更早某步的"方法/产出"里**已经点名的成分**——例:s1 方法写「前提 = 作者立场 + 人物 + 冲突 + 结论」,而 s2 产出"人物"、s3 产出"冲突",人物/冲突在 s1 就已点名 → 这是把前面的复合产出**拆开逐个展开**,不是"加工出新东西",是并列。
+
+【必做核验】逐个后步:拿它产出的核心词,去前面每一步的"方法/产出"里搜;在更早步骤里已被点名,就记一处"定义式拆解"命中。**注意区分:是"前步已点名的成分被展开"才算,不是单纯出现同一个普通词(如"剧本/故事")。**
+
+用户消息含该 how 的 purpose + 各步,可能附「代码信号」。如实核验:命中哪条就指出哪条;**一条都不命中,就如实判 is_fake=false——不要为了挑刺硬凑理由**。
+输出 JSON:{"复述":"...","假链证据":"...","is_fake":true/false,"若假how建议拆成":"<几颗 what/why,如:前提构成(what)/人物维度(what)/冲突类型(what)/势均力敌原理(why)>"}

+ 8 - 0
app/frontend/public/legacy-decode/prompt-read/gate_how_tiebreak.txt

@@ -0,0 +1,8 @@
+两个判断者对"这颗 how 是不是真流水线"产生分歧,你来裁决。用户消息是该 how 的 purpose + 各步(可能附「代码信号」)。
+
+标准:
+- 真流水线 = 后步消费前步的**具体产出**、打乱顺序就跑不通(如 腌制→下锅→收汁)。
+- 假 how = 离散构成/原理被硬串成步骤(如"前提/人物/冲突"各自是"是什么"、互不传递)。
+
+**重要:拿不准、或像"几块各自是什么"硬串的 → 判 is_real_how=false(边界倾向"假how")。**
+输出 JSON:{"复述":"...","is_real_how":true/false,"理由":"..."}

+ 11 - 0
app/frontend/public/legacy-decode/prompt-read/gate_refute.txt

@@ -0,0 +1,11 @@
+你在审查(带着怀疑核验,但只认事实、命中才算):一篇帖子「读懂后的内容」,是不是其实【不该进创作知识库】。用户消息就是这帖读懂后的内容。
+
+属于以下任一 → out_of_scope=true(该排除):
+- 制作/工具操作:核心是"用某 App/AI/软件,打开→输入/粘贴→生成/扩写→设参数→导出/保存"把成品产出来。**哪怕它教你"怎么给 AI 下指令 / 设身份 / 给字数要求",只要本质是让工具替你产出,就算制作。**
+- 越界题材本身:教的是"做那个东西本身"——游戏玩法/关卡设计、产品开发、电商/运营/选品、行业分析等(不是"做关于它的内容")。
+
+⚠️ **别把题材当越界(最容易误伤)**:题材是游戏/电商/任何都没关系——『如何创作**游戏视频** / 构思**电商带货视频** idea / 构思**小说**结构』是**创作**(产出是视频/小说内容),**不要排除**;只有"做**游戏玩法** / 做**电商选品运营**本身"(产出是游戏/生意、不是关于它的内容)才排除。判据就一句:**做题材本身→排除;做"关于题材的内容"→收。**
+
+逐条对照上面的越界判据**如实核验**:确实命中就判 out_of_scope=true;一条都不命中,就如实判 out_of_scope=false——不要硬凑越界理由。
+先用一句话复述"这帖在教什么",再判。
+输出 JSON:{"复述":"<一句话>","out_of_scope":true/false,"category":"创作/制作/越界","理由":"<越界点;或为何确实没有>"}

+ 11 - 0
app/frontend/public/legacy-decode/prompt-read/gate_tiebreak.txt

@@ -0,0 +1,11 @@
+两个判断者对"这帖是否属于【图文/视频内容创作知识】"产生了分歧,你来裁决。用户消息就是这帖读懂后的内容。
+
+标准(两轴**都过**才算创作 in_scope=true):
+- 轴A:产出物是 图文 / 视频 / 脚本 / 剧本 / 小说 这类内容;
+- 轴B:教创作(构思/选题/写/结构/呈现),不是"用工具产出成品"、也不是"做题材本身"(游戏/产品/运营/选品/行业分析)。
+
+**题材不限,看产出物+层面、不看题材词**:『创作游戏视频 / 构思电商带货视频 idea / 构思小说结构』= 创作(收);『设计游戏玩法 / 做电商选品运营』= 越界(排除)。
+
+**重要:拿不准、模棱两可、半创作半制作 → 一律判 in_scope=false(边界倾向排除)。**
+先用一句话复述"这帖在教什么",再裁决。
+输出 JSON:{"复述":"<一句话>","in_scope":true/false,"category":"创作/制作/越界","理由":"<为什么>"}

+ 8 - 0
app/frontend/public/legacy-decode/prompt-read/normalize_scope.txt

@@ -0,0 +1,8 @@
+你在把一批「作用域标签值」规范成【纯名词】。用户消息是一个 JSON 字符串数组。
+
+规则:
+- 若值是"动宾/带动词"(如 寻找共识裂缝、爆发力核验、推导选题落点、完播率提升、现实阻碍提取),去掉动词、保留【名词核心】:共识裂缝、爆发力、选题落点、完播率、现实阻碍。
+- 若值本就是名词——**包括"氛围营造、行动引导、情感表达、推进节奏、形象塑造、概括叙述"这类规范的"名词+动词语素"复合名词——【原样不动】**。
+- 不要合并、不要新增、不要删项、不要解释。每个输入值都必须在输出里有对应(哪怕原样返回)。
+
+输出 JSON:{"映射": {"<原值>":"<规范名词>", "...":"..."}}

+ 196 - 0
app/frontend/public/legacy-decode/prompt-skill/phase1-frame.md

@@ -0,0 +1,196 @@
+# ② 判颗 + 类型闸 + 三 lane 成形 + 轻标签
+
+输入:①读懂后的文字内容。
+干三件事:**判这帖有几颗、各是什么类型**(how/what/why)→ **按类型把每颗成形** → **顺手打轻标签**。
+**不碰作用域**(留给 ③)。产物:`framework.json` 的 `knowledges[]`(一帖多颗)。
+
+> 核心:**颗是单位,一帖 = N 颗**(可混类型)。what/why 既能独立成颗,也能作为某 how 的「组件颗」单列。
+
+---
+
+## A. 拆颗顺序 —— 类型中立:先切单元,逐元按「驱动哪个决策」判类型
+
+**三类是对等的**(what/how/why 各驱动一个不同决策),**不预设谁是主角、不先找 how**。
+
+```
+1. 切单元:把帖里能独立检索复用的知识,切成一个个「单元」(先不贴类型)。
+2. 逐元判类型——问这个单元「驱动哪个创作决策」(用官方定义):
+   · 影响【元素选择】(是什么 / 由什么构成 / 有哪些可选)        → What
+   · 影响【脉络与结构】(怎么一步步把某输入做成成品)            → How
+   · 影响【取舍判断】(背后的原理 / 标准 / 平台逻辑)            → Why
+3. How 凭「序列为真」上位(A2节 两道闸):只有「后步吃前步 + 走到成品」才算 How;
+   并列招式/选项清单 → 其实是 What;单讲道理/取舍 → Why。别因为「看着像步骤」就判 How。
+4. 组件链接(分类之后才做,不是抽取入口):某 What/Why 若【恰好】是某 How 某步的
+   产出(what)或判断依据(why) → 标 role=组件、parent={how_id,step}(既单列成颗、又连回 how);
+   其余 What/Why 是 role=主、parent=null。
+```
+
+> 每个单元都是**独立一颗**;组件只是"分类后顺手连了一条到 how 的链接",**不改变它是独立知识**这件事。三类谁多谁少都正常——一帖可能全 What、也可能 how+what+why 混。
+
+**判 step(某动作压进 how 当一步,不单拎)**:①产出半成品 ②被同帖另一块当输入 ③拿走则成品残缺。
+**判组件颗(连回 how 的那条链接该不该建)**:见 C节 判据。
+
+### A2. how 资格闸 —— 两道硬闸,任一过不了就别当 how
+
+把一组动作封成 how 之前,必须同时过这两闸;否则它不是 how。
+
+**闸① 有序性(步骤之间真有「产出→输入」传递吗?)**
+> 后一步是否**消费前一步的具体产出**、换了顺序就跑不通?
+> - 是 → 真有序,可成 how。**且每个后步的 `input` 必须实指它消费的前步产出物原话**(写"← s1 的〈赛道圣经句清单〉",**禁止空泛的"←s1产出"**)——指不出具体消费物 = 不依赖。
+> - **否 → 不是工序**:一组并列招式/途径 → 一颗 **What 清单**;几块"各自是什么"的离散构成 → **各拆一颗 What**(原理拆 Why)。
+> 识别信号:①相邻 step 的 output 近义/重复;②打乱顺序成品仍成立;③多个 step 的 input 其实都是工序总输入、彼此不喂给;④这些"步骤"各自是"X 是什么/分几类";⑤【定义式拆解】后步产出是前步"方法/产出"里已点名的成分(前提=…人物…冲突…,后步逐个产出"人物""冲突")→ 是把复合体拆开展开、不是加工出新东西。
+> **反驳自检(封 how 前必做)**:逐对说出"s2 用了 s1 产出的什么具体物";再查"s2 的产出是不是 s1 里已点名的成分"——说不出消费物、或产出只是前步成分的展开,就拆成 What,别硬编链。
+> ⚠️ 离散构成例(**应拆 What/Why,不是 how**):「故事 = 前提 + 人物 + 冲突」——前提/人物/冲突各自是"是什么/分几类"、互为定义但**无产出→输入传递**(拟定前提并不消费"切入点")→ 拆成「前提构成」「人物维度」「冲突类型」几颗 What(+「冲突靠势均力敌升级」这类原理拆 Why),别硬串成 step1→2→3。
+
+**闸② 走到交付物(最后一步的 output = purpose 承诺的成品吗?)**
+> purpose 用什么名词收尾("一篇成稿"/"一个选题"/"一条脚本"),**最后一步的 output 就必须是那个东西**。
+> - 是 → 工序完整。
+> - **否(步骤只产出"原料/半成品/草图/一堆分析",没有把它们收口成成品的那一步)→ 半截 how**。两条出路选一:**(a) 补上收尾步**(整合/筛选/定稿那一步,原帖若真有就补);**(b) 把 purpose 降到与实际 output 对齐**(别用"…法/…矩阵/…框架"把半成品吹成成品)。purpose 的抽象层不能比 steps 高一截、中间断链。
+
+**铁律**:没工序**别硬造假 how**;一颗 = 一个完整东西,不拆碎,也不把半截工序包装成完整方法论。
+
+> 🌰 跨题材示例(只示意判法,**别套用这里的题材/词**):
+> - 假 how(应改 What 清单):「找选题灵感的 3 个途径:①翻同行评论区 ②看搜索下拉词 ③问目标读者」——三者并列、可换序、做一个就行 → 是一颗 What(途径清单),不是 step1→2→3。
+> - 真 how:「腌制 → 下锅 → 收汁」——收汁吃下锅的产出,换序就崩,最后一步出成品 → 合格 how。
+> - 半截 how(应补收尾或降 purpose):purpose 写「写出一篇成稿」,但步骤只到「列大纲、攒素材」就停了 → 缺"把大纲素材写成稿"的收尾步;要么补上,要么把 purpose 降为「成稿前的备料法」。
+
+---
+
+## B. 三类成形模板(三条对等 lane)
+
+> **核心原则:每类知识都要落在它的「决策落点」上**——这是这条知识对下游 AI 的真正价值。
+> - **How**(影响脉络/结构)→ 落点 = **输入→方法→产出 的链**(每步吃什么、吐什么)。
+> - **What**(影响元素选择)→ 落点 = **可选元素 + 选用判断**(子集型把每个选项"何时/为何选它"并入其 item_desc)。
+> - **Why**(解释为什么)→ 落点 = **把原理本身(是什么+为什么)忠实整合说清**;"怎么用/取舍"是下游应用的事,解构不做。
+> 描述部分尽管自由,但**决策落点必须落到**——只描述不落点 = 半成品知识。
+
+### How(工序)— role 主(必须先过 A2节 两道闸)
+`purpose`(把某输入一路做成成品;**它的收尾名词 = 最后一步 output**,见闸②)+ 有序 `steps`(**后步消费前步 output**,见闸①),每步是一次**变换 输入→方法→产出**:
+- `input` 输入(这步**吃什么**:首步=工序总输入;后步**必须实指前步产出物原话**,如 `← s1 的〈赛道圣经句清单〉`,**禁空泛"←s1产出"**——指不出就说明不依赖前步,见 A2节 闸①)
+- `directive` 方法(怎么做,含判断标准;**原帖示例必须原文保留** `例:『…』`;不编原文没有的例子)
+- `output` 产出(这步**吐什么**;会成为下一步的 `input`)
+- `出处`(图N / 视频时间)
+
+> **为什么用 输入→方法→产出 而不是"目的"**:旧的"目的"和产出重复("找X"≈产出"X"),是冗余。改成显式的 input 让"后步吃前步"(闸①)变成结构可验证,也让 AI 真能把状态一步步串下去。整条工序的总目标只在颗级 `purpose` 说一次,不在每步重复。
+
+> **每颗都带 `出处`(溯源用)**:How 颗的 `出处` 在每个 step 上(这步来自哪些卡);What/Why 颗在颗级给 `出处`(这颗来自哪些卡,如 ["图3","卡片2"])。出处填卡片号(图N=第N张图,卡片N=视频第N段),让前端能点回原图/原视频段。
+
+### What(是什么)— role 主 或 组件
+`概要`(**唯一必填**,一句话这是什么,做锚点)+ `kind`(**必填**:恰好取 `子集` / `多维关系` / `序列` 之一,**勿写变体**如"多维度关系")+ `维度拆分规则`(**仅子集填**:这组选项的**单一划分轴**短词,如「冲突范围」;**套不出单一轴就填 `类型枚举`**;多维关系/序列填 null)+ `body`:**1..N 个扁平条目**,每条 `{item_name, item_desc, 作用域:[]}`(无小节、无形式标)。无 steps。+ 颗级 `出处`。
+
+**先判这颗 What 是哪种(决定 item_desc 要不要带"何时选"):**
+按"部件之间什么关系"分三种(两步判:①部件是**可挑着用的选项/清单(挑一个或多个都行)**?→ `子集`;②否则**多个组成部分/维度并陈、不是挑出来的**——有"从头到尾的时间/线性先后"(换序就读不通)?有→`序列`;没有(只是并列的组成/侧面/大小层级)→`多维关系`):
+- **`子集`型**(**并列·挑着用·可多挑**):「X 有 A/B/C 几种/几个」,**各自独立、不合成一个整体**,按需**挑一个或多个**(如 7种叙事结构、冲突四类型、构图六法、标题九技巧)。落点 = **元素选择**——**每条 `item_desc` 必须把原帖给的「何时/为何选它」一并写进去**(没有"何时选",AI 只能背不能选 = 这颗废了一半)。
+  - **填 `维度拆分规则`**:先试**单一轴**——套进"**按【X】分,每个选项都是 X 上的一个取值**":
+    - 套得进 → 填那**一个短词**,命名"按什么分"的**轴**、**不是分出来的结果/效果**,且**禁用"与/、/及其"拼两个**。✅ 冲突三层面→`冲突范围`(内心/个人/社会);拍摄构图→`构图的几何布局`(**不是**"画面视觉效果");Vlog五公式→`想引发的观众反应`(**不是**"内容驱动目的")。
+    - **套不进**(选项是各按不同东西命名的大杂烩、找不到统一轴)→ 老实填 **`类型枚举`**,**别硬拼假轴**。❌ 7种叙事结构(非线性按时间序、多线按线数、嵌套按套层…无统一轴)、9种标题技巧(句式/心理/内容混杂)→ 都填 `类型枚举`,别写"叙事组织逻辑与时间线""心理触发机制/切入视角"这种拼凑。
+- **`多维关系`型**(**几块并列的组成部分/维度/层级,彼此无时间先后**):一个对象由**几块并列的组成**、或从**几个不同维度/侧面**刻画,**之间没有"从头到尾"的时序**——三种形态都算:① **正交侧面**(人物=生理/社会/心理);② **构成要素**(前提=立场+人物+冲突+结论、场景四要素);③ **大小层级/包含**(故事结构=节拍⊂场景⊂序列⊂幕,**只是粒度不同、不是时间先后**)。⚠️部件由本帖内容决定、不固定;**不要求凑齐**(给几块写几块)。与子集的区别:**子集是同类选项、从中挑**(7种叙事结构都是"一种结构");**多维关系是几块并列、不是挑**。**每条 body 条目 = 一块**:item_name=部件/维度名,item_desc=展开内容(子值并入 item_desc,不另起一层)。落点 = 各部件及其内容。
+- **`序列`型**(**沿作品从头到尾的时间/线性先后**):「X 由 A→B→C **按发生时间、或在作品里从头到尾的位置**排成,**换序就读不通**」(如 故事五部分 激励事件→…→结局、黄金三段式 开头→中间→结尾)。⚠️**只认这种"从头走到尾"的线性先后**;**"大的套小的"包含/层级(节拍⊂场景⊂幕)不是序列**——那是粒度不同的并列组成,归 `多维关系`。后段**不消费**前段产出——若后段吃前段产出、换序就崩,那是 **how 工序**不是 what。落点 = 完备性+顺序,**body 按序排列**,`item_desc` 只写"是什么"。
+
+每条 body 条目 `{item_name, item_desc, 作用域:[]}`:
+- `item_name`:要点名(如 静态冲突 / 激励事件)。
+- `item_desc`:忠实保留原帖对该点的描述,几句留几句。**子集型**还要把原帖给的「何时/为何选它」并入这段(严格抽取——原帖没说就只写是什么,别编)。
+- `作用域`:**一律留空 `[]`**(item 级作用域当前不用,③ 只填颗级)。
+- ⚠️ **保留原文、不转译不脑补(What 的命根)**:`概要 / item_desc`**尽量照搬原帖原话**——能引原文就引,少改写、少换词;**原帖给了几句就留几句,别压成一句**(这是知识本体,删了就废)。**严禁补原帖没有的内容**:原帖写"生理(性别、年龄、外表)"就只写这些,不许擅自加"遗传";原帖只给公式"作者立场+人物+冲突+结论"就照写,不许替作者给每个词编定义。**宁可保留原帖的口语/不完美措辞,也不要 AI 润色后的"漂亮转译"。**
+- 若某点有**子结构**(如"三幕式"含一幕/二幕/三幕),把**每个子点的原文描述都带进 `item_desc`**(可分行)。例:三幕式 item_desc 应含"一幕交代背景人设、二幕是主体冲突升级、三幕高潮爆发并解决",而不是只写"分一二三幕"。
+- **别套模板**:条目数由本帖内容决定。
+> 组件 what:对应某 how 的某一步(那步的产出物),但本身是独立一颗、可单独复用。不对应任何步 → 就是单独的一条(role=主)。
+> ⚠️ 子集型即使原帖只列了选项没说何时用 → `item_desc` 只写是什么(别编"何时选"),但仍要标 `kind:子集` 并给 `维度拆分规则`。
+
+### Why(为什么)— role 主 或 组件
+`阐述`(**唯一必填**,一段连贯文字:这条原理**是什么 + 为什么成立/起作用**)。无 steps、无小节、无形式标。+ 颗级 `出处`。
+- **忠实整合(命根)**:把原帖讲这条原理的几张卡,缝成一段**读得通的话**。
+  - ✅ 允许(为通顺):串接、调顺序、加连接词、删重复。
+  - ❌ 禁止(守忠实):改实质、补原帖没有的观点、润色成"漂亮转译"、把描述改成祈使("应/必须/严禁")。
+- **只说"是什么+为什么",不延伸"怎么用"**:原帖即便给了创作建议,也按原话留在阐述里、不单独加工成取舍/操作指令——"怎么用"是下游的事。一句话:**AI 只做缝,不做编,不教怎么用。**
+> 组件 why:对应某 how 的某一步(那步的依据/原理),但本身是独立一颗、可单独复用。不对应任何步 → 就是单独的一条(role=主)。
+> ⚠️ 阐述里**只还原原理本身**(是什么+为什么),原帖即使顺带给了"该怎么做"的建议,也别把它单独拎出来加工成指令——按原话融在阐述里即可。
+
+---
+
+## C. 组件链接判据(分类之后才问)
+
+每颗 What/Why 都已是独立一颗(A节)。**定死:只有两态**——要么对应某 how 的某一步(组件),要么单独的一条(主)。没有第三种。
+
+> **这颗 What/Why 对应某 how 的某一步吗?**(what = 那步的产出物;why = 那步的依据/原理)
+> - **是 → 标 `role=组件, parent={how_id,step}`**(仍是独立一颗,只多一条到 how 的链接)。
+> - **否 → `role=主, parent=null`**(就是单独的一条)。
+> - **反向提醒**:如果某"指令"只是某步一次性的话、脱离那步就不成立、无复用价值 → 它**不该单独成颗**,留在 step 的 directive 里即可。
+> - **N 选 1 并列清单**:一组「X 种结构 / X 种手法 / X 个要素」整体可复用 → 它就是一颗 **What(子集型)**,不是 how 的步骤。
+
+> ⚠️ 本文示例(含下方模板里的词)都只是示意结构,**值一律从本帖内容抽,别套用示例里的任何具体词**。
+
+---
+
+## D. 创作 vs 制作(剔除写进 `dropped`)
+剔:纯工艺执行(器材/打光/剪辑软件/调色/导出)、具体素材、太空泛。
+边界看「设计决策 vs 工艺执行」:景别/构图/字幕/结构=设计决策→保留为 step;操作设备软件那层→剔。
+
+**整颗级 drop(兜底——①若已判越界整帖 is_empty 就不会到这;这里拦"混在 in-scope 里的越界颗")。按两轴判,任一不过即 drop:**
+1. **轴A 不过·产出物不是内容**:这颗教你做出来的是"题材本身"而非"关于它的内容"——游戏玩法/关卡设计、产品开发、电商/运营/选品、行业分析等 → drop(同样讲游戏:做游戏=drop,做游戏视频=收)。
+2. **轴B 不过·是制作不是创作**:一整颗全是「打开某 App/小程序 → 粘贴/点按钮 → 设参数 → 生成/导出」的工具操作路径,没有可迁移的创作决策 → drop。判据:把平台名一换这套就失效 = 不可迁移 = 制作不是创作。
+> ⚠️ **别靠硬标业务阶段蒙混过关**:业务阶段(灵感/选题/脚本)是给 in-scope 颗用的;一颗越界(游戏/工具操作)却被硬塞个"脚本/选题"来过关 = 错。**贴不上三值本身就是越界信号**——该 drop,不是改标签。
+
+---
+
+## E. 轻标签(顺手打,按类型分流)
+
+| 标签 | how | what | why | 取值 |
+|---|:--:|:--:|:--:|---|
+| 知识类型 | ✓ | ✓ | ✓ | how/what/why(已在 type 字段) |
+| 业务阶段(颗级多值,**必填≥1**) | ✓ | ✓ | ✓ | 灵感/选题/脚本 |
+| 创作阶段(**每步1个**) | ✓ | ✗ | ✗ | 定向/构思/结构/成文/打磨 |
+| 动作(**每步1个**,开放) | ✓ | ✗ | ✗ | 具体手法,帖子语言 |
+
+> 创作阶段/动作只有 how 有(要有步骤)。what/why 只给业务阶段。
+> **业务阶段每颗至少 1 个、不许空**:按"这条知识用在内容创作的哪个环节"判——找方向/找题材前的认知=灵感;定具体选题/角度=选题;写脚本/正文/结构=脚本(可多选)。**拿不准就选最贴近的,但只能在这三个里选**;三个都贴不上 → 见 D节,这颗多半不是内容创作知识,回头看是否该 drop(而不是硬塞一个或留空)。
+> 含义对齐:灵感/选题/脚本是**内容创作的业务环节**,不是泛义的"阶段";别把游戏设计/产品改造这类硬塞进"脚本"。
+
+---
+
+## framework.json 模板(②产出,作用域留空待③)
+
+```json
+{
+  "source": {"id":"xhs_<id>","source_type":"post","title":"<原帖标题>","author":"<作者>",
+             "source_metadata":{"platform":"<小红书/抖音>","url":"<…>","date":"<…>"}},
+  "knowledges": [
+    {
+      "id": "k1", "type": "how", "role": "主", "parent": null,
+      "title": "<框架名,从本帖抽>", "purpose": "<一句话目标>", "业务阶段": ["<灵感/选题/脚本,可多选>"],
+      "steps": [
+        {"id":"s1","input":"<这步吃什么:首步=工序总输入;后步实指前步产出物原话,如 ← s1 的〈赛道圣经句清单〉>","directive":"<方法,含判断标准,原帖示例用 例:『…』 原文保留>","output":"<这步吐什么,会成下一步 input>",
+         "出处":["<图N/视频时间>"],"创作阶段":"<定向/构思/结构/成文/打磨>","动作":"<这步的具体手法,从内容抽>","作用域":[]}
+      ],
+      "dropped": ["<剔除项 — 理由>"]
+    },
+    {
+      "id": "k2", "type": "what", "role": "组件", "parent": {"how_id":"k1","step":2},
+      "title": "<某 how 步骤产出的、可独立复用的清单/构成名>", "业务阶段": ["<…>"],
+      "出处": ["<这颗来自哪些卡片,如 图3 / 卡片2>"],
+      "概要": "<一句话这是什么(必填)>", "kind": "<子集 / 多维关系 / 序列(必填)>",
+      "维度拆分规则": "<仅子集:单一划分轴短词(命名轴、不是结果),如 冲突范围;无单一轴填 类型枚举;多维关系/序列填 null>",
+      "body": [
+        {"item_name":"<要点名>","item_desc":"<忠实保留原帖描述,几句留几句;有子结构带各子点描述;子集型把『何时/为何选它』并入>","作用域":[]},
+        {"item_name":"<另一条>","item_desc":"<…>","作用域":[]}
+      ],
+      "作用域": []
+    },
+    {
+      "id": "k3", "type": "why", "role": "主", "parent": null,
+      "title": "<原理名>", "业务阶段": ["<…>"], "出处": ["<这颗来自哪些卡片>"],
+      "阐述": "<一段:这条原理是什么+为什么成立。忠实整合原帖几张卡原话——可缝接,不可改实质/补/润色/转祈使>",
+      "作用域": []
+    }
+  ]
+}
+```
+
+## 过关条件 → 进 ③
+- 颗数合理(how 主颗 + 组件颗 + orphan,可混);每颗有 type/role/parent。
+- **每颗 how 都过了 A2节 两道闸**:步骤真有序(后步吃前步)+ 最后一步 output = purpose 收尾名词。并列招式已改 What;半截工序已补收尾或已降 purpose。
+- **决策落点都落到了**:how 每步有 `input`(首步=工序输入,后步指向前步产出);what `kind` 已填、子集型 `维度拆分规则` 已填且每条 `item_desc` 含「何时/为何选」(原帖没说才只写是什么);why `阐述` 已忠实整合(无改实质/补/润色/转祈使)。
+- how 颗:每步 input/directive/output/出处 + 创作阶段 + 动作;what 颗:概要 + kind + 维度拆分规则(子集) + body 条目(item_name/item_desc);why 颗:title + 阐述(忠实整合"是什么+为什么")。
+- 组件颗有 parent cross-ref;**每颗业务阶段非空(≥1,∈灵感/选题/脚本)**;贴不上三值的非内容创作颗已 drop。
+- 纯软件操作流程 / 非内容创作题材已整颗 drop(D节)。
+- 所有颗的 `作用域` 留空(含 how 的每步),③ 来填。

+ 145 - 0
app/frontend/public/legacy-decode/prompt-skill/phase2-scope.md

@@ -0,0 +1,145 @@
+# ③ 作用域(重)
+
+本步**只干一件事**:给 ②产出的每颗知识标 5 类作用域里相关的几类,每类**平铺标出所有相关的具体值**,并把每个值**定位**到 5 棵分类树。
+不碰框架结构、不碰其它标签(那些 ② 已做)。
+
+> ⚠️ **本文里出现的所有具体词(食材搭配、制造悬念、治愈感…)都只是「示例」**,用来帮你认清每一类管什么。
+> **真正的值必须从当前这篇帖子的内容里抽,严禁照搬示例里的任何词。**
+> 作用域的「值」是**开放**的(定位不上就新建),固定的只有 5 个**类别**。
+
+**按类型分粒度**:
+- **How 颗**:**逐步**标——每个 step 一组作用域(写回 `step.作用域`)。
+- **What / Why 颗**:**颗级**标——整颗一组作用域(写回 `knowledge.作用域`);读 What 的 `概要` + `body`各条目(item_name/item_desc)、Why 的 `阐述`(整段)来判。
+
+> 这是全流程最容易"串味"的一刀(5 类边界模糊),所以单独、写厚。判不准就标空 `[]`,不硬塞。
+
+## 核心原则:平铺多值 + 摊正交(贯穿 5 类)
+
+- 每类不是"给一个值",而是标出这颗在这类里**真正涉及的所有值**,**全部对等、不选主次、不限数量**——一颗真有 3 个实质就标 3 个,只有 1 个就 1 个。
+- 标多值前先脑内把它们**摊成几路不同视角(facet)**:同一视角下的值必须是**同一上位语义类型**(讲人物的归人物、讲题材的归题材);若发现是近义或子面(人物 / 人物性格 / 人物动机)→ **收敛回一个**,别堆。
+- "视角"只是**脑内组织、不输出成字段**;输出仍是多条 `{scope_type, value}`,定位由代码事后做。
+- 意图除外:意图讲终极目的,**自然收敛到很少**(多为 1 个),不强求多值。
+
+---
+
+## 1. 五类列定义(认清各管什么;所有示例**勿照搬**)
+
+> **`substance` 实质 —— 这颗讲的实质信息("呈现了什么")**
+> 题材 / 对象 / 实体 / 概念 / 行为 / 关系。
+> - **平铺多值、摊正交**:一颗真覆盖几个实质就标几个,不选主次、不限数量;同一视角下的值同一上位语义类型,近义/子面收敛回一个。
+> - **边界**:≠形式(那是"怎么呈现");≠作用(那是创作效果,如"节奏控制");≠感受。✅「增肌动作」「冲突设置」=实质;❌「步骤分解」是形式。
+> - **格式**:名词短语,砍前置动作动词(定位/揭示/制造… → 认知裂缝/人物刻画/悬念),原子化,专有名可略长。
+
+> **`form` 形式 —— 剥离题材后、可迁移到别的题材的"怎么呈现/组织/表达"(覆盖视觉/文字/音频三模态)**
+> 形式只改变**接收体验**(同一实质换种形式 → 理解/情绪/节奏/传播都变),不改变"讲什么"。平铺多值、摊正交。
+> - **核心判据·可迁移性**:自检「**把题材换掉,这个"形式"还成立、还能照搬到别的题材吗?**」成立 → 是形式(三幕结构、悬念开头、九宫格排版);只在这个题材里成立 → 那是实质。
+> - **偏结构/手法层(关键分工)**:创作知识的形式重在**结构与手法**(叙事结构 / 悬念 / 对比 / 钩子 / 句式);**具体表层呈现(配色 / 景别 / 字体 / 运镜)只在原帖把它当"原则/方法"教时才标,否则不追**——那是下游"形式元素"逐帧拆样片的活,我们不抢。
+>   - 例:帖子讲「短视频前3秒要用悬念钩子」→ 标 `悬念钩子`(结构手法 ✅);帖子只是某画面恰好用了高饱和配色、并没教"要用高饱和" → **不标**(只是样片表层,不是这条知识的形式)。
+> - **三模态别漏**:视觉(构图/排版/字体动效)、文字(修辞/句式/叙事手法)、音频(语气/配乐)。
+> - **实质剥离**:剥掉它承载的题材。❌`剧本三幕结构`→✅`三幕结构`;❌`美食九宫格`→✅`九宫格排版`。
+> - **边界**(用判据划清):↔**实质** = 题材绑定 vs 题材无关(可迁移性就是分界线);↔**作用** = 手法本身 vs 它达成的功能("悬念开头"是形式,"勾注意力/制造悬念"是作用)。
+> - **格式**:名词/形容词短语(三幕结构、口语化、排比句式、慢节奏),原子化、砍前置动作动词。
+
+> **`feeling` 感受 —— 这颗内容勾起观众的情绪体验("看的人感到什么")**
+> - **平铺多值、摊正交**:一颗能同时勾多种感受(好奇 + 羞耻),都对等标上。
+> - **要具体到"这颗真正勾的那种"**:别用可套万物的宽泛情绪(紧张/震撼/感动),能更准就更准(面对两难抉择那种 →「两难煎熬感」,比「紧迫感」贴)。定位分偏低(<0.75)只说明树里还没有,正常新建。
+> - **边界**:感受=**观众实际感到的**,≠意图(创作者想要的)、≠作用(段内功能)。✅「治愈感」「羞耻感」=感受;❌「促进收藏」是意图。
+> - **格式**:情绪名词/形容词,砍前置动作动词(营造治愈感 → 治愈感)。
+
+> **`effect` 作用 —— 这颗帮创作者在内容里干成的活 / 创作效果(动名词)**
+> - **"手段层"**:段落 / 手法在内容里**起的功能**(创作元动词名词化——展示/强化/铺垫/对比/收束 → 强化、铺垫、对比、悬念设置、节奏控制)。
+> - **平铺多值、摊正交**:一颗常同时起几种作用(制造悬念 + 节奏控制),都对等标。
+> - **边界(最易串)**:作用=**创作效果/段内干的活(手段)**,≠意图(最终目的)、≠实质(讲的对象)、≠形式(结构形态)。✅「冲突」「看点」「节奏控制」=作用;❌「完播」是意图、「三幕结构」是形式。
+> - **格式**:**动名词**——名词+动作语素后缀(营造/设置/引导/控制)保留、是对的;只砍前置裸动词(「制造悬念」→「悬念」或「悬念设置」)。
+
+> **`intent` 意图 —— 创作者做这颗最终图什么(创作目的·必须动词)**
+> - 对齐意图树(仅 46 节点、讲终极目的),**自然收敛到很少**(多为 1 个,偶 2 个);真有多个目的(科普 + 引流)才标多。
+> - **层级对齐(别跳层)**:值贴**这颗本身的层级**——具体工具/手法颗标它自己那层(某叙事工具 →「勾住注意力/驱动情节」),别跳到整条内容的运营终极目标(涨粉/完播/下单),那是更大颗的意图,贴小颗上就串味。
+> - **边界**:意图=**创作者最终目的**,≠作用(手段/段内效果)、≠感受(观众情绪)。✅「科普」「引流」「种草」=意图;❌「制造悬念」是作用。
+> - **格式**:**动词**(科普/教学/引流/呼吁/种草/批判),别写成名词(流量/完播率/人设 → 引流/提升完播/立人设)。
+
+**一颗/一步不必 5 类都给**——只给真正涉及的;判不准的类标空 `[]`。
+
+---
+
+## 2. 互斥边界(最容易错;反例跨题材,看的是"归类逻辑"不是词本身)
+
+判每个值前,先过这几条边界,确认它没站错列:
+
+- **实质 ↔ 形式**:实质=讲什么(内容对象);形式=怎么呈现(结构/手法)。✅「增肌动作」=实质;「步骤分解」=形式。
+- **实质 ↔ 作用**:实质=讲的对象本身;作用=帮创作者做成的**创作效果**(动名词)。✅「通勤穿搭」=实质;「节奏控制」=作用。
+- **作用 ↔ 意图**:作用=创作动作/效果(**手段层**);意图=**最终**想要的结果(目的层)。✅「看点」=作用;「完播」=意图。
+- **感受 ↔ 意图**:感受=**观众**的情绪体验;意图=**创作者**的目的。✅「治愈感」=感受;「促进收藏」=意图。
+- **形式 ↔ 作用**:形式=呈现的**结构形态**;作用=帮创作者达成的**创作效果**。✅「对比清单」=形式;「节奏控制」=作用。
+- **层级对齐(意图别跳层)** / **自洽(值别和这颗自相矛盾)**:一颗讲「打破/反某结构」的知识,`substance` 不能标那个"被打破的结构"本身;先想清这颗到底在讲什么,再起词。
+
+---
+
+## 3. 值的格式与多值约束
+
+1. **词性按类**:实质/形式/感受 = 名词/形容词短语;**作用 = 动名词**(营造/设置/引导后缀保留,只砍前置裸动词);**意图 = 动词**。多为 2-4 字、上限约 6 字(专有名可略长,别写成长句否则定位不上)。
+2. **原子化(拆到"独立有意义的概念"为止,平铺多值)**:
+   - **含连接词(和/与/、/,)必拆**(代码也会兜底拆)。例:`主使人物与对立人物`→`主使人物`+`对立人物`;`社会共识与个体真实矛盾`→`社会共识`+`个体真实`。
+   - **把捆在一起的几个独立概念拆开,但拆到"概念"为止、别再往下碎**。例:`爆款选题逻辑`→`爆款`+`选题逻辑`("选题逻辑"是个完整方法概念,**别再削成`选题`、也别丢掉`逻辑`**);`短视频创意策略`→`短视频`+`创意策略`。
+   - **底线·空壳词不单独成值**:`逻辑 / 信号 / 模型 / 策略 / 方式`这类单独拎出来是放之四海的空壳,**不单独成一个值**;但它们和题材组成的完整概念(`选题逻辑`、`爆款信号`)**是合法原子**——别为了去壳反而把概念拆没了。
+   - **张力/对照若本身就是要表达的实质**:用**单个不含连接词的词**命名(如 `虚实对照`、`知行落差`),别写成"虚拟与现实"这种连接式(会被拆开、丢掉那层关系)。
+3. **平铺多值、摊正交**(见核心原则):同一类的多个值必须是不同视角、同一视角内同一上位语义类型;近义/子面收敛回一个。
+4. **不跨类重复**:一个值只进它该进的那列。
+5. **去重**:同一组同一类不重复同义值。
+6. 用**本帖语境里的具体词**,不要泛词("内容/主题/信息"),更不要照搬本文示例词。
+
+---
+
+## 4. 判别顺序(每个候选值按序过一遍)
+
+1. **范畴检查**:它是"讲什么/怎么呈现/勾情绪/起功能/图什么"哪一类?(对照 第1节+第2节,站错列就移列或剔除)
+2. **原子检查**:复合?→ 拆。整句?→ 精简成短词。
+3. **正交检查**:同一类已有的值里,它是不是某个值的近义/子面?是 → 收敛,别堆。
+4. **泛词检查**:放之四海皆准的框架词、或本文示例词?→ 剔或换成本帖具体词。
+5. 通过 → 进定位(第5节)。
+
+---
+
+## 5. 执行三阶段
+
+### 阶段一 · 提候选值(平铺多值)
+逐组读这颗(how 读 `input/directive/output`;what 读 概要+body各条目;why 读 阐述整段)的真实内容,按 第1节-第4节 标相关的几类,**每类把这颗真正涉及的值全部平铺列出**(先脑内摊正交、收敛近义),意图通常 1 个。
+
+### 阶段二 · 定位对齐(调工具)
+对每个候选值跑:
+```bash
+python 创作知识提取-skill/tools/scope-link.py "<候选值>" --type <substance/form/feeling/effect/intent> --top-k 5
+```
+按返回的 top-1 余弦分判定:
+- **≥ 0.90**:复用返回的 `name`(value 写树原名),记 `link: "复用"`、`score`。
+- **0.75–0.90**:看 top-K 有没有**真同义**的——有就复用其 name,没有就用自己的候选值(新值)。
+- **< 0.75**:保留候选值为**新值**,记 `link: "新建"`、`score`(顺手丰富树)。
+
+> 定位是代码(火山 embedding 最近邻),你只负责"起词"和"看分判定复用/新建";**树上没有不是问题,新建即可**。
+
+### 阶段三 · 验证(自检)
+- 每个值都过了 第2节 边界、第3节 原子+正交、第4节 泛词?**有没有照搬本文示例词?**
+- 同一类的多个值是不是真不同视角(没堆近义)?同一组没有跨类重复值?
+- 判不准 / 模糊两可的类 → 标空 `[]`,别猜。
+
+---
+
+## 6. 输出格式(写回 `作用域`;下面是中性示例,值要换成本帖真实值)
+
+```json
+"作用域": [
+  {"scope_type":"substance","value":"<实质值1>","link":"复用","score":0.93},
+  {"scope_type":"substance","value":"<实质值2,另一视角>","link":"新建","score":0.61},
+  {"scope_type":"form","value":"<形式值1>","link":"复用","score":0.91},
+  {"scope_type":"form","value":"<形式值2,另一模态>","link":"新建","score":0.58},
+  {"scope_type":"effect","value":"<作用值>","link":"新建","score":0.66},
+  {"scope_type":"intent","value":"<意图值,通常1个>","link":"新建","score":0.55}
+]
+```
+- **同一类可出现多条**(平铺多值);`value`=定位后最终值(复用=树原名,新建=候选词)。
+- `link`:`复用` / `新建`(前端 drawer 用)。`score`:top-1 余弦分(留痕)。
+
+## 过关条件 → 进 ⑤组装
+- 每颗/每步 `作用域` 已填(相关类带值、无关类不出现/标空);**该多值的类已平铺、未硬压成单值**。
+- 每个值都定位过、有 link+score。
+- 边界没串味、值原子、同类多值无近义堆叠、无泛词、**没照搬示例词**。

+ 1 - 0
app/frontend/public/legacy-decode/runs/index.json

@@ -0,0 +1 @@
+[]

+ 6 - 0
app/frontend/src/App.jsx

@@ -1,6 +1,7 @@
 import React, { useEffect, useState } from 'react'
 import CreationDemo from './pages/CreationDemo.jsx'
 import CreationQueryDetail from './pages/CreationQueryDetail.jsx'
+import LegacyDecodeDemo from './pages/LegacyDecodeDemo.jsx'
 
 function parseRoute() {
   const hash = window.location.hash || '#/'
@@ -8,6 +9,9 @@ function parseRoute() {
     const [, runId, queryId] = hash.match(/^#\/query\/([^/]+)\/([^/]+)/) || []
     return { name: 'query', runId: decodeURIComponent(runId || ''), queryId: decodeURIComponent(queryId || '') }
   }
+  if (hash === '#/decode-demo') {
+    return { name: 'decode-demo' }
+  }
   return { name: 'demo' }
 }
 
@@ -22,6 +26,8 @@ export default function App() {
     <div className="wrap">
       {route.name === 'query' ? (
         <CreationQueryDetail runId={route.runId} queryId={route.queryId} />
+      ) : route.name === 'decode-demo' ? (
+        <LegacyDecodeDemo />
       ) : (
         <CreationDemo />
       )}

+ 1 - 0
app/frontend/src/pages/CreationDemo.jsx

@@ -74,6 +74,7 @@ export default function CreationDemo() {
       <div className="sub">
         {batch.batch?.name || 'Query Batch'} · {queries.length} 条 query
         {summary && <span> · 候选 {summary.candidate_count} · 命中 {summary.creation_hit_count}</span>}
+        <a className="inline-link" href="#/decode-demo">查看 decode 单例</a>
       </div>
 
       <div className="cdemo single">

+ 20 - 0
app/frontend/src/pages/LegacyDecodeDemo.jsx

@@ -0,0 +1,20 @@
+import React from 'react'
+
+export default function LegacyDecodeDemo() {
+  return (
+    <div className="legacy-shell">
+      <div className="legacy-top">
+        <a className="back" href="#/">返回采集工作台</a>
+        <div>
+          <h1>Decode 知识详情单例</h1>
+          <div className="sub">沿用旧详情页 UI,展示 1 条已 decode 帖子的知识颗、How/What/Why 卡片和 payload draft。</div>
+        </div>
+      </div>
+      <iframe
+        className="legacy-frame"
+        title="Decode 知识详情单例"
+        src={`${import.meta.env.BASE_URL}legacy-decode/index.html`}
+      />
+    </div>
+  )
+}

+ 20 - 0
app/frontend/src/styles.css

@@ -22,6 +22,7 @@ a:hover { text-decoration: underline; }
 .wrap { max-width: 1180px; margin: 0 auto; padding: 22px 18px 60px; }
 h1 { font-size: 22px; margin: 0 0 2px; letter-spacing: .5px; }
 .sub { color: var(--muted); font-size: 12.5px; margin-bottom: 18px; }
+.inline-link { margin-left: 10px; font-weight: 600; }
 
 /* 创作Demo:家族选择器左右两栏竖排,按尾缀分组 */
 .famcols { display: flex; gap: 16px; align-items: flex-start; margin-bottom: 16px; }
@@ -231,6 +232,25 @@ td.q { font-weight: 600; }
 /* query 详情页(点进该 query 的多个视频) */
 .detail-top { margin-bottom: 8px; display: flex; align-items: center; justify-content: space-between; gap: 12px; }
 .back { font-size: 13px; }
+.legacy-shell {
+  width: min(1400px, calc(100vw - 32px));
+  margin: 0 auto;
+}
+.legacy-top {
+  display: flex;
+  align-items: flex-start;
+  gap: 14px;
+  margin-bottom: 12px;
+}
+.legacy-top h1 { margin: 0 0 2px; }
+.legacy-frame {
+  width: 100%;
+  height: calc(100vh - 120px);
+  min-height: 680px;
+  border: 1px solid var(--line);
+  border-radius: 10px;
+  background: #f5f5f7;
+}
 .dq { font-size: 18px; margin: 10px 0 2px; }
 .grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 12px; }
 .result-band + .result-band { margin-top: 16px; }

Vissa filer visades inte eftersom för många filer har ändrats