Преглед на файлове

作用域回扣全局改名「作用域定位」+ 弹窗标注归属树

- 术语统一:我方 scope-link 概念「回扣」→「定位」(代码注释/提示词/前端/文档/skill),
  保留英文标识符(scope_link/ScopeLinker/scope-link.py);下游 Pattern/Case「回扣」是不同概念,不动
- 前端 drawer:标题「作用域定位详情」;新增「归属树:<树>」行;top-3 每行 path 前标【<树>】;
  小标题标【<树>】树(树名取 scope.scope_type,回扣本就约束在该树内)
- 同步意图豁免那批(phase2 意图必动词/作用动名词/软长度、decompose nounify 跳过意图、What/why 等)

subagent 交叉验证通过:drawer 三处树标注齐全、我方"回扣"清零无叠词、下游保留、py 编译过。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
SamLee преди 4 седмици
родител
ревизия
1ee19985e6

+ 2 - 2
.claude/agents/framework-auditor.md

@@ -13,8 +13,8 @@ model: sonnet
 3. **作用域分流**:phase2-scope 是否 how 逐步 / what·why 颗级。
 4. **schema 落地**:`web/frameworks.json` 是否 `posts[].knowledges[]`(不是单 `framework`);每颗有 type/role/parent;至少出现「how 主颗 + what 组件颗(带 parent)」+ 某帖有 orphan 主颗(what/why)。统计:几帖、共几颗、类型分布、组件颗数。
 5. **payload 按类型分拼**:`web/payloads.json` 每颗一条;how 颗 custom_ext 有创作阶段/动作,what/why 颗**只有业务阶段**(+组件颗有「出自」);dim_attributes 与 type 一致。跑 `python3 创作知识提取-skill/tools/lint-payload.py web/payloads.json`,须 0 ERROR。
-6. **前端三渲染**:`web/index.html` 是否按 knowledges[] 渲染、how→工序表/what→要素表/why→论点卡、组件颗 cross-ref 可跳、回扣 drawer + 提示词溯源。grep 关键组件(HowTable/WhatCard/WhyCard/kref)。
+6. **前端三渲染**:`web/index.html` 是否按 knowledges[] 渲染、how→工序表/what→要素表/why→论点卡、组件颗 cross-ref 可跳、定位 drawer + 提示词溯源。grep 关键组件(HowTable/WhatCard/WhyCard/kref)。
 7. **无 how-only 残留**:grep 确认没有"只认 post.framework 单颗"的旧逻辑残留在 web/index.html 或 decompose。
-8. **decompose 引擎**:`scripts/decompose.py` 是否把 phase 文档当 prompt 喂 LLM(不另写提示词)、① extractor 读图 → ② 判颗 → ③ 作用域回扣 → ⑤ 组装。
+8. **decompose 引擎**:`scripts/decompose.py` 是否把 phase 文档当 prompt 喂 LLM(不另写提示词)、① extractor 读图 → ② 判颗 → ③ 作用域定位 → ⑤ 组装。
 
 最后给「残留清单」:任何没落实/半落实/与规约不符的点(没有就写「无」)。

+ 1 - 1
creation_knowledge/__init__.py

@@ -3,7 +3,7 @@
 提供:多平台取数(integrations.crawler)、媒体落盘(media)、多模态读取
 (integrations.extractor / video_extract / video_frames)、PG 连接(integrations.db)、
 LLM 客户端(integrations.llm)、火山 embedding(embedding)、web 静态服务(api)。
-分类树 dump/embed/回扣 见 scripts/。知识提取本身由外部 skill 完成。
+分类树 dump/embed/定位 见 scripts/。知识提取本身由外部 skill 完成。
 """
 
 __version__ = "0.1.0"

+ 15 - 13
scripts/decompose.py

@@ -3,7 +3,7 @@
 编排全流程,把 skill 的 phase 文档当 prompt 喂给 LLM(skill 是唯一真源):
   ① 读懂:图文帖→extractor 读图;视频帖→video_extract 下载 mp4+原生整段提炼(base64→Gemini)
   ②  判颗+类型闸+三lane成形+轻标签:system = phase1-frame.md
-  ③  作用域:system = phase2-scope.md → 候选 → scope_link 回扣(火山)
+  ③  作用域:system = phase2-scope.md → 候选 → scope_link 定位(火山)
   ⑤  组装:代码 → 每颗一个 ingest payload(按类型分拼)
 ① 判 is_empty=true(无可提取知识)→ 短路,跳过 ②③⑤。
 数据源:fixture(已有 5 帖)或实时 crawler 取数(新帖)。须在云端跑。用法:PYTHONPATH=. python scripts/decompose.py
@@ -142,7 +142,7 @@ def creation_gate(read: str) -> tuple[bool, str]:
     return v_tie, f"admit={v_admit}/refute={v_refute} 分歧→裁决={v_tie}"
 
 
-# ---------- ③ 作用域候选 + 回扣 ----------
+# ---------- ③ 作用域候选 + 定位 ----------
 def _slim(knowledges: list[dict]) -> list[dict]:
     slim = []
     for k in knowledges:
@@ -181,18 +181,20 @@ def strip_verb_tail(v: str) -> str:
 
 
 def nounify_scopes(scopes: list) -> list:
-    """作用域值名词化:③ 一次批量 LLM 名词化(语义,不误砍"氛围营造")→ ① 窄表兜底。在回扣前做。"""
-    vals = sorted({it["value"] for sc in scopes for it in (sc.get("items") or []) if it.get("value")})
-    if not vals:
-        return scopes
-    try:
-        mp = chat_json(NORMALIZE, json.dumps(vals, ensure_ascii=False), timeout=90).get("映射") or {}
-    except Exception:
-        mp = {}
+    """作用域值名词化(仅 实质/形式/感受/作用):③ 批量 LLM 名词化 → ① 窄表兜底。在定位前做。
+    意图豁免:意图值就该是动词(对齐意图树),不名词化、不剥动词。"""
+    vals = sorted({it["value"] for sc in scopes for it in (sc.get("items") or [])
+                   if it.get("value") and it.get("scope_type") != "intent"})
+    mp = {}
+    if vals:
+        try:
+            mp = chat_json(NORMALIZE, json.dumps(vals, ensure_ascii=False), timeout=90).get("映射") or {}
+        except Exception:
+            mp = {}
     for sc in scopes:
         for it in sc.get("items") or []:
             v = it.get("value")
-            if not v:
+            if not v or it.get("scope_type") == "intent":   # 意图原样保留(动词)
                 continue
             it["value"] = strip_verb_tail(mp.get(v) or v)   # ③ 映射优先,再 ① 兜底
     return scopes
@@ -337,8 +339,8 @@ def main() -> None:
             if k.get("role") == "组件" and (k.get("parent") or {}).get("how_id") not in how_ids:  # 守卫:组件 parent 必指向同帖 how
                 k["role"] = "主"; k["parent"] = None
         print(f"  ② {len(knowledges)} 颗:" + ", ".join(f"{k.get('type')}/{k.get('role')}" for k in knowledges))
-        apply_scopes(knowledges, nounify_scopes(scope_candidates(knowledges)), linker)  # ③名词化+①兜底 → 回扣
-        print("  ③⑤ 作用域回扣 + 组装")
+        apply_scopes(knowledges, nounify_scopes(scope_candidates(knowledges)), linker)  # ③名词化+①兜底 → 定位
+        print("  ③⑤ 作用域定位 + 组装")
         posts_out.append({**meta, "knowledges": knowledges})
         payloads += [build_payload(post, k, how_titles) for k in knowledges]
     suffix = os.environ.get("OUT", "")  # OUT=_v2 → 写 frameworks_v2.json,不覆盖原版

+ 1 - 1
scripts/dump_trees.py

@@ -2,7 +2,7 @@
 
 产物(scope_trees/):
   - trees.json        整个分类树,按 source_type 分组(含已退役节点,live 标记)
-  - trees_index.json  仅 live 节点(scope-link 回扣目标),与 trees_embeddings.npy 行对齐
+  - trees_index.json  仅 live 节点(scope-link 定位目标),与 trees_embeddings.npy 行对齐
 
 须在能连 RDS 的环境跑(云端)。用法:python scripts/dump_trees.py [env_file]
 """

+ 1 - 1
scripts/scope_link.py

@@ -1,4 +1,4 @@
-"""作用域回扣(scope-link):候选值 → 本地树 embedding 余弦最近邻 → top-K。
+"""作用域定位(scope-link):候选值 → 本地树 embedding 余弦最近邻 → top-K。
 
 对得上(高分)→ 复用现有节点原名,ingest 时按名挂靠;对不上 → 保留为新建值(丰富树)。
 本地内存 + numpy 暴力最近邻,无需向量数据库。

+ 5 - 4
web/index.html

@@ -221,7 +221,7 @@ const STEPS=[
    why:"先判类型再拆——三类成形不同,默认 how 会把纯 what 硬掰成假 how;how 先吸进步骤里的 what/why,吸不进的才独立成一条。",
    src:["/prompt-skill/phase1-frame.md"]},
   {key:"scope",label:"给知识归类",desc:"标好 讲什么 / 起什么作用 / 哪个创作环节 → 标签收成规范名词 → 和已有分类库对上号",
-   why:"这 5 类标签最容易串味,单独写厚;标签先名词化(动宾→名词)再做向量回扣,既规范又能挂上分类库。",
+   why:"这 5 类标签最容易串味,单独写厚;标签先名词化(动宾→名词)再做向量定位,既规范又能挂上分类库。",
    src:["/prompt-skill/phase2-scope.md","/prompt-read/normalize_scope.txt"]},
   {key:"store",label:"存进知识库",desc:"整理成统一格式存起来,供以后调用",
    why:"纯拼接 + 校验的确定性活,程序自动做——没有提示词,让 AI 来干只会帮倒忙。",
@@ -413,13 +413,14 @@ function App(){
       {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="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}(火山余弦)</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">{h.path}</div></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()}>

+ 5 - 5
创作知识拆解框架.md

@@ -86,14 +86,14 @@
 | 业务阶段(灵感/选题/脚本,颗级多值) | ✓ | ✓ | ✓ | `custom_ext` | 我们 |
 | 创作阶段(定向/构思/结构/成文/打磨,**逐步**) | ✓ | ✗ | ✗ | `custom_ext` | 我们 |
 | 动作(开放手法,**逐步**,从内容提炼) | ✓ | ✗ | ✗ | `custom_ext` | 我们 |
-| 作用域(实质/形式/感受/作用/意图,**带值·回扣**) | ✓ 逐步 | ✓ 颗级 | ✓ 颗级 | `scopes` | 我们(回扣树) |
+| 作用域(实质/形式/感受/作用/意图,**带值·定位**) | ✓ 逐步 | ✓ 颗级 | ✓ 颗级 | `scopes` | 我们(定位树) |
 | 创作 / 制作 | 写死 `创作` | 写死 | 写死 | `dim_creations`(恒 `["创作"]`) | 项目共识 |
 
 > `创作阶段 / 动作` 是步骤级,只有 How 有;`作用域 / 业务阶段` 三类都有(What/Why 在颗级给)。
 
 ---
 
-## 七、作用域 5 棵树 + 回扣
+## 七、作用域 5 棵树 + 定位
 
 | scope_type | 中文 | 管什么 | 例 |
 |---|---|---|---|
@@ -104,7 +104,7 @@
 | intent | 意图 | 创作者图什么(最终目的) | 引爆传播 |
 
 - **互斥边界**(最易串味):实质=对象 / 作用=干的功能("赛道共识"实质,"撕裂共识"作用);作用=手段 / 意图=最终目的("制造悬念"作用,"引爆传播"意图);感受=观众情绪 / 意图=作者目的。
-- **带值 + 回扣**:每个值用火山 embedding 找分类树最近邻——≥~0.90 复用树原名,否则保留新值(顺手丰富树)。回扣是代码(最近邻),模型只负责"起词"。
+- **带值 + 定位**:每个值用火山 embedding 找分类树最近邻——≥~0.90 复用树原名,否则保留新值(顺手丰富树)。定位是代码(最近邻),模型只负责"起词"。
 - 粒度:How 逐步给;What / Why 颗级给。
 
 ---
@@ -116,7 +116,7 @@
 | **① 读懂** | 图 / 视频 → 文字(忠实,不判断) | 视觉 LLM(基建 extractor) |
 | **②a 判颗 + 找 how 骨架** | 几颗、各颗类型;how 抽骨架并识别内部 what/why 组件;orphan what/why;无 how 则纯 what/why(**第三节那道闸**) | 判断 LLM |
 | **②b 按类型成形 + 轻标签** | How→目标+步骤(+逐步 创作阶段/动作);What→界定+主体小节;Why→主张+支撑小节(小节形态自由,0..N);颗级业务阶段;组件颗标 cross-ref | 判断 LLM |
-| **③ 作用域** | 5 类带值 + 互斥边界 + 回扣(How 逐步 / What·Why 颗级) | 判断 LLM + 回扣工具(代码) |
+| **③ 作用域** | 5 类带值 + 互斥边界 + 定位(How 逐步 / What·Why 颗级) | 判断 LLM + 定位工具(代码) |
 | **⑤ 组装 + lint** | 拼 payload(content 按类型不同、scopes 并集),校验 | 纯代码 |
 
 ---
@@ -138,7 +138,7 @@
 - 选一帖 → 列出**它的全部 N 颗**(可混类型)。
 - 每颗按类型渲染:**How → 工序表**;**What → 构成卡**(界定 + 自由小节,每节 小标题 + 形式标 + 内容/条目);**Why → 论点卡**(主张 + 自由小节)。
 - **组件颗** cross-ref 到所属 how(标"出自 <how> 第 N 步",可互相跳转);**orphan 颗**独立列出。
-- 每颗都带:**作用域回扣 drawer**(候选 → 最近邻 top-K → 复用/新建)、**提示词溯源**(区块/表头点开产出它的那道工序的提示词)。
+- 每颗都带:**作用域定位 drawer**(候选 → 最近邻 top-K → 复用/新建)、**提示词溯源**(区块/表头点开产出它的那道工序的提示词)。
 
 ---
 

+ 5 - 5
创作知识提取-skill/README.md

@@ -26,8 +26,8 @@
 - **颗是单位,一帖 = N 颗**(可混 how/what/why),共 `knowledges[]`,每颗 → 一个 ingest payload。
 - **三类对等 lane**:How(目标+不可跳步 steps)、What(界定+构成)、Why(主张+依据+影响)。**先判类型闸,再按类型成形**——别默认 how、别硬造假 how。
 - **what/why 既可独立成颗,也可作 how 的「组件颗」**:how 步骤里嵌的 what/why(如某步产出"叙事弧线五要素")既显示在步骤里,又**单列成一颗**(role=组件,parent 指回那个 how 的第 N 步);how 没覆盖的独立 what/why 也单列(role=主)。判据:脱离 how 还能独立检索复用吗?
-- **5 个标注维度**:知识类型(how/what/why)、业务阶段(灵感/选题/脚本,颗级)、创作阶段(定向/构思/结构/成文/打磨,**仅how逐步**)、动作(开放·**仅how逐步**)、作用域(5 棵树带值·**回扣**·how逐步/what·why颗级)。
-- **作用域回扣**:值要对到 5 棵分类树的真实节点——对得上复用原名、对不上才新建。用 `tools/scope-link.py`(火山 embedding 最近邻,基建已落地)。
+- **5 个标注维度**:知识类型(how/what/why)、业务阶段(灵感/选题/脚本,颗级)、创作阶段(定向/构思/结构/成文/打磨,**仅how逐步**)、动作(开放·**仅how逐步**)、作用域(5 棵树带值·**定位**·how逐步/what·why颗级)。
+- **作用域定位**:值要对到 5 棵分类树的真实节点——对得上复用原名、对不上才新建。用 `tools/scope-link.py`(火山 embedding 最近邻,基建已落地)。
 
 ## 目录里有什么
 
@@ -37,7 +37,7 @@
 |---|---|---|---|
 | ① 读懂 | (基建 extractor,不在本目录) | 图/视频 → 文字 | 视觉 LLM |
 | ② 拆框架+轻标签 | [extraction/phase1-frame.md](extraction/phase1-frame.md) | 判几颗+筛创作/制作+目的/怎么做/产出 + 知识类型/业务阶段/创作阶段/动作 | 判断 LLM |
-| ③ 作用域 | [extraction/phase2-scope.md](extraction/phase2-scope.md) | per-step 5 类带值(互斥边界+反例+回扣),**重** | 判断 LLM + 回扣工具 |
+| ③ 作用域 | [extraction/phase2-scope.md](extraction/phase2-scope.md) | per-step 5 类带值(互斥边界+反例+定位),**重** | 判断 LLM + 定位工具 |
 | ⑤ 组装 | [extraction/phase3-assemble.md](extraction/phase3-assemble.md) | 拼 payload + lint,**纯代码** | 代码 |
 
 ### 契约 / 词表 / 样例 / 工具
@@ -46,7 +46,7 @@
 |---|---|
 | [format/ingest-payload.schema.json](format/ingest-payload.schema.json) | 给机器看的字段清单(最终裁判) |
 | [taxonomy/知识类型.json](taxonomy/知识类型.json) · [业务阶段.json](taxonomy/业务阶段.json) · [创作阶段.json](taxonomy/创作阶段.json) | 受控词表(每条带分类说明+边界) |
-| [taxonomy/作用域.md](taxonomy/作用域.md) | 5 棵树**不放静态词表**——实时回扣 DB(说明在这) |
+| [taxonomy/作用域.md](taxonomy/作用域.md) | 5 棵树**不放静态词表**——实时定位 DB(说明在这) |
 | [examples/金标样例.md](examples/金标样例.md) | 创作帖 → 完整 payload 的 few-shot(How / What / Why 各一) |
 | [tools/tools.md](tools/tools.md) | scope-link / lint-payload / ingest-post 接口手册 |
 
@@ -57,7 +57,7 @@
 ```
 ① 读懂(视觉)          图/视频 → 文字
 ② 拆框架+轻标签       判几颗→剔制作→目的/怎么做/产出 + 知识类型/业务阶段/创作阶段/动作   → framework.json(作用域留空)
-③ 作用域(重)          per-step 5 类带值 + 互斥边界 + 回扣(复用原名/新建)              → framework.json(就地补作用域)
+③ 作用域(重)          per-step 5 类带值 + 互斥边界 + 定位(复用原名/新建)              → framework.json(就地补作用域)
 ⑤ 组装(代码)          拼 content+维度,scopes=各步并集 → lint                          → payload.json
 ```
 

+ 1 - 1
创作知识提取-skill/examples/金标样例.md

@@ -114,4 +114,4 @@
 }
 ```
 
-> What/Why 只保留「业务阶段」,**没有**创作阶段/动作(没步骤)。其余字段(source/dim_creations/scopes 带值回扣)与 How 一致。
+> What/Why 只保留「业务阶段」,**没有**创作阶段/动作(没步骤)。其余字段(source/dim_creations/scopes 带值定位)与 How 一致。

+ 18 - 16
创作知识提取-skill/extraction/phase2-scope.md

@@ -1,11 +1,11 @@
 # ③ 作用域(重)
 
-本步**只干一件事**:给 ②产出的每颗知识标 5 类作用域里相关的几类,每类给一个**具体值**,并把值**回扣**到 5 棵分类树。
+本步**只干一件事**:给 ②产出的每颗知识标 5 类作用域里相关的几类,每类给一个**具体值**,并把值**定位**到 5 棵分类树。
 不碰框架结构、不碰其它标签(那些 ② 已做)。
 
 > ⚠️ **本文里出现的所有具体词(食材搭配、制造悬念、治愈感…)都只是「示例」**,用来帮你认清每一类管什么。
 > **真正的值必须从当前这篇帖子的内容里抽,严禁照搬示例里的任何词。**
-> 作用域的「值」是**开放**的(回扣不上就新建),固定的只有 5 个**类别**。
+> 作用域的「值」是**开放**的(定位不上就新建),固定的只有 5 个**类别**。
 
 **按类型分粒度**:
 - **How 颗**:**逐步**标——每个 step 一组作用域(写回 `step.作用域`)。
@@ -22,13 +22,15 @@
 | `substance` | 实质 | **讲什么**——题材 / 对象 / 内容实质 | 食材搭配(做菜)、通勤穿搭(穿搭)、增肌动作(健身)、选题方向(自媒体) |
 | `form` | 形式 | **怎么呈现**——结构 / 体裁 / 表现手法 | 三段式结构、对比清单、分步结构、九宫格排版 |
 | `feeling` | 感受 | **勾什么情绪**——读者/观众的情感反应 | 治愈感、紧张感、信任感、惊喜 |
-| `effect` | 作用 | **对创作起什么用**——这条知识帮创作者达成的创作效果(名词) | 情节组织、节奏控制、冲突、看点、选题切入、逻辑自洽 |
-| `intent` | 意图 | **创作者图什么**——最终目的 | 涨粉、完播、转化、人设、引流 |
+| `effect` | 作用 | **对创作起什么用**——这条知识帮创作者达成的创作效果(名词) | 情节组织、节奏控制、冲突、看点、选题切入、逻辑自洽 |
+| `intent` | 意图 | **创作者要做什么**——动作/目的(**必须动词**)| 科普、教学、分享、引流、种草、呼吁、批判 |
 
-> ⚠️ **值一律起「名词」,不起「动宾」**——所有 5 类(尤其 作用 / 意图)写成"它属于哪一类"的名词,**不要**写成"在干嘛"的动宾。**动词无论在开头还是结尾都不行**,砍掉动词只留名词核心:
-> ❌ 动词**开头**:定位认知裂缝 / 建立观众预期 / 揭示人物性格 / 制造悬念 → ✅ 认知裂缝 / 观众预期 / 人物刻画 / 悬念
-> ❌ 动词**结尾**:完播率提升 / 爆款打造 / 叙事逻辑构建 / 创作方向确定 / 逻辑验证 → ✅ 完播率 / 爆款 / 叙事逻辑 / 创作方向 / 逻辑自洽
-> 自检:值里若含 定位/建立/揭示/制造/寻找/确立 或 提升/打造/构建/确定/验证/优化 等动词 → 删掉它。粒度对齐分类树叶子(多为 2-6 字具体名词,如 氛围营造 / 推进节奏 / 友情 / 科普)。
+> ⚠️ **词性按类区分(关键)**:
+> - **实质 / 形式 / 感受 / 作用 = 名词**。砍掉「前置动作动词」(定位/建立/揭示/制造/寻找/推导…):
+>   ❌ 定位认知裂缝 / 揭示人物性格 / 制造悬念 → ✅ 认知裂缝 / 人物刻画 / 悬念
+>   ⚠️「作用」是**动名词**:名词+动作语素后缀(氛围营造 / 悬念设置 / 转化引导)是对的、**保留**;只砍前置动作动词。
+> - **意图 = 必须是动词**(创作者"要做什么"),对齐意图树:科普 / 教学 / 分享 / 引流 / 呼吁 / 种草 / 批判。
+>   ❌ 别把意图写成名词:流量 / 完播率 / 人设 → ✅ 引流 / 提升完播 / 立人设。
 
 **一步不必 5 类都给**——只给这步真正涉及的。多数步 2-3 类。
 
@@ -42,7 +44,7 @@
   - ✅ 「增肌动作」=实质(对象);「步骤分解」=形式(呈现方式)
   - ❌ 把"步骤分解"塞进实质(它是怎么排,不是讲什么)
 
-- **实质 ↔ 作用**:实质=讲的对象本身;作用=这条知识帮创作者做成的**创作效果**(名词)。
+- **实质 ↔ 作用**:实质=讲的对象本身;作用=这条知识帮创作者做成的**创作效果**(名词)。
   - ✅ 「通勤穿搭」=实质;「节奏控制」=作用
   - ❌ 把"节奏控制"当实质(它是创作效果不是题材)
 
@@ -64,12 +66,12 @@
 
 ## 3. 值的格式约束(原子化)
 
-1. **名词/名词短语**,尽量 ≤6 字(专有名/约定俗成可略长)。**禁动宾**(见 §1 ⚠️):动词在开头或结尾一律名词化,砍掉动词留名词核心(揭示人物性格→人物刻画;完播率提升→完播率)
+1. **实质/形式/感受/作用 用名词/名词短语**,对齐分类树粒度:多为 2-4 字、上限约 6 字(软约束,专有名可略长;别为凑字数砍语义,也别写成长句否则定位不上)。砍前置动作动词,但「作用」动名词后缀(营造/引导/设置)保留。**意图除外——意图用动词**(科普/引流/呼吁),通常 2-4 字
 2. **原子**:不许用"和/与/、/,"拼接多义。复合就拆成多个值(同一类可多值)。
 3. **不跨类重复**:一个值只进它该进的那一列;别在实质和作用都塞同一个词。
 4. **去重**:同一步同一类不重复同义值。
 5. 用**本帖语境里的具体词**,不要泛词("内容"、"主题"、"信息"这种放之四海皆准的不要),更不要照搬本文示例里的词。
-6. **感受要具体到"这颗真正勾的那种感受"**:别用可套万物的宽泛情绪词("紧张/紧迫/震撼"这类)——能更准就更准(如观众面对两难抉择那种 → "两难煎熬感",比"紧迫感"贴)。回扣分偏低(<0.75)只说明树里还没有,正常新建即可,但前提是这个词本身已经够具体。
+6. **感受要具体到"这颗真正勾的那种感受"**:别用可套万物的宽泛情绪词("紧张/紧迫/震撼"这类)——能更准就更准(如观众面对两难抉择那种 → "两难煎熬感",比"紧迫感"贴)。定位分偏低(<0.75)只说明树里还没有,正常新建即可,但前提是这个词本身已经够具体。
 
 ---
 
@@ -78,7 +80,7 @@
 1. **范畴检查**:它到底是"讲什么/怎么呈现/勾情绪/起功能/图什么"哪一类?(对照 §1+§2,站错列就移列或剔除)
 2. **原子检查**:是不是复合?是则拆。是不是整句?是则精简成短词。
 3. **泛词检查**:是不是放之四海皆准的框架词、或本文示例里的词?是则剔或换成本帖具体词。
-4. 通过 → 进回扣(§5)。
+4. 通过 → 进定位(§5)。
 
 ---
 
@@ -87,7 +89,7 @@
 ### 阶段一 · 提候选值
 逐步读这颗(how 读 `input/directive/output`;what/why 读其 界定+主体 / 主张+支撑 各小节)的真实内容,按 §1-§4 标相关的几类,每类一个**从本帖抽的**候选具体值。
 
-### 阶段二 · 回扣对齐(调工具)
+### 阶段二 · 定位对齐(调工具)
 对每个候选值跑:
 ```bash
 python 创作知识提取-skill/tools/scope-link.py "<候选值>" --type <substance/form/feeling/effect/intent> --top-k 5
@@ -97,7 +99,7 @@ python 创作知识提取-skill/tools/scope-link.py "<候选值>" --type <substa
 - **0.75–0.90**:看 top-K 有没有**真同义**的——有就复用其 name,没有就用自己的候选值(新值)。
 - **< 0.75**:保留候选值为**新值**,记 `link: "新建"`、`score`(顺手丰富树)。
 
-> 回扣是代码(火山 embedding 最近邻),你只负责"起词"和"看分判定复用/新建"。
+> 定位是代码(火山 embedding 最近邻),你只负责"起词"和"看分判定复用/新建"。
 
 ### 阶段三 · 验证(自检)
 - 每个值都过了 §2 边界、§3 原子、§4 泛词?**有没有不小心照搬了本文示例里的词?**
@@ -115,11 +117,11 @@ python 创作知识提取-skill/tools/scope-link.py "<候选值>" --type <substa
   {"scope_type":"intent","value":"<作者图什么,例:促进收藏>","link":"新建","score":0.55}
 ]
 ```
-- `value`:回扣后的最终值(复用=树原名,新建=候选词)。**示例里的"食材搭配"等只是示意,必须替换成本帖真实值。**
+- `value`:定位后的最终值(复用=树原名,新建=候选词)。**示例里的"食材搭配"等只是示意,必须替换成本帖真实值。**
 - `link`:`复用` / `新建`(前端 drawer 用)。
 - `score`:top-1 余弦分(留痕)。
 
 ## 过关条件 → 进 ⑤组装
 - 每颗/每步 `作用域` 已填(相关类带值、无关类不出现/标空)。
-- 每个值都回扣过、有 link+score。
+- 每个值都定位过、有 link+score。
 - 边界没串味、值原子、无泛词、**没照搬示例词**。

+ 1 - 1
创作知识提取-skill/extraction/phase3-assemble.md

@@ -33,4 +33,4 @@ python 创作知识提取-skill/tools/lint-payload.py outputs/<帖>/payload.json
 
 ## 3. 备注
 - `作用域` 里的 `link/score/top` **不进 payload**(只供前端 drawer 溯源);payload 只要 scope_type+value。
-- 组装与回扣都是确定性代码(`scripts/decompose.py` 的 ⑤ 段 + `tools/`),模型不参与这步。
+- 组装与定位都是确定性代码(`scripts/decompose.py` 的 ⑤ 段 + `tools/`),模型不参与这步。

+ 1 - 1
创作知识提取-skill/format/ingest-payload.schema.json

@@ -61,7 +61,7 @@
             "type": "string",
             "enum": ["substance", "form", "feeling", "effect", "intent"]
           },
-          "value": { "type": "string", "minLength": 1, "$comment": "带值;回扣到 5 棵树现有节点,对得上复用原名" }
+          "value": { "type": "string", "minLength": 1, "$comment": "带值;定位到 5 棵树现有节点,对得上复用原名" }
         }
       },
       "minItems": 1,

+ 4 - 4
创作知识提取-skill/taxonomy/作用域.md

@@ -1,6 +1,6 @@
-# 作用域(5 棵树)—— 不放静态词表,实时回扣
+# 作用域(5 棵树)—— 不放静态词表,实时定位
 
-作用域是 5 棵分类树(不是固定 enum),节点上千且**不断生长**,所以这里**不放静态 JSON**——Phase2 实时回扣到 DB 里的真实节点。
+作用域是 5 棵分类树(不是固定 enum),节点上千且**不断生长**,所以这里**不放静态 JSON**——Phase2 实时定位到 DB 里的真实节点。
 
 | scope_type | 中文 | 判别(带值时各给一个具体词) |
 |---|---|---|
@@ -10,9 +10,9 @@
 | `effect` | 作用 | 起**什么表达功能**(在内容里干什么活),如 `撕裂共识`、`吸引点击` |
 | `intent` | 意图 | 创作者**图什么**(最终目的),如 `引爆传播`、`提升打开率` |
 
-## 回扣(scope-link)怎么用
+## 定位(scope-link)怎么用
 
-值要**回扣到 5 棵树的现有节点**——对得上就复用原名(避免同义词污染树),对不上才保留为新值(顺带丰富树)。基建已落地:
+值要**定位到 5 棵树的现有节点**——对得上就复用原名(避免同义词污染树),对不上才保留为新值(顺带丰富树)。基建已落地:
 
 ```bash
 # 候选值 + 树名 → 火山 embedding 余弦最近邻 top-K

+ 2 - 2
创作知识提取-skill/tools/scope-link.py

@@ -1,5 +1,5 @@
 #!/usr/bin/env python3
-"""作用域回扣 CLI —— 候选值 → 5 棵树本地向量缓存余弦最近邻 top-K。
+"""作用域定位 CLI —— 候选值 → 5 棵树本地向量缓存余弦最近邻 top-K。
 
 复用基建:scripts.scope_link.ScopeLinker(+ creation_knowledge.embedding + scope_trees/)。
 从仓库根目录跑(自动 chdir);需 .env 里的 ARK_* 与本地 scope_trees/(先跑 dump_trees+embed_trees)。
@@ -28,7 +28,7 @@ _TYPE_MAP = {
 
 
 def main() -> None:
-    ap = argparse.ArgumentParser(description="作用域回扣 top-K")
+    ap = argparse.ArgumentParser(description="作用域定位 top-K")
     ap.add_argument("candidate", help="候选作用域值,如 撕裂共识")
     ap.add_argument("--type", default=None, help="substance/form/feeling/effect/intent 或中文;不传=跨树")
     ap.add_argument("--top-k", type=int, default=5)

+ 1 - 1
创作知识提取-skill/tools/tools.md

@@ -2,7 +2,7 @@
 
 三个脚本,会用就行,**不用读源码**。都从仓库根目录跑(脚本内部会处理路径)。
 
-## scope-link.py —— 作用域回扣(Phase2 用)
+## scope-link.py —— 作用域定位(Phase2 用)
 
 候选作用域值 → 5 棵树本地向量缓存余弦最近邻 top-K。判「复用现有节点原名 or 保留新值」。
 

+ 1 - 1
数据接口与来源/embedding接口.md

@@ -1,6 +1,6 @@
 # Embedding(文本向量化)接口 · 实测
 
-> 实测可用:**2026-06-17**。用途:「作用域回扣」(scope-link)——把 5 棵分类树节点 + 提取出的候选作用域值向量化,做余弦最近邻对齐(对得上复用现有节点原名、对不上新建)。
+> 实测可用:**2026-06-17**。用途:「作用域定位」(scope-link)——把 5 棵分类树节点 + 提取出的候选作用域值向量化,做余弦最近邻对齐(对得上复用现有节点原名、对不上新建)。
 
 ## 服务
 - 提供方:**火山方舟(Volcengine Ark)**