@optima-chat/optima-agent 0.9.45 → 0.9.47

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -8,8 +8,8 @@ description: "基于 IPD 方法论的产品研究全生命周期工具。在 ~/k
8
8
  ## 启动 SOP
9
9
 
10
10
  1. 检查 `~/kb/product-research/` 是否存在
11
- - 不存在 → 使用 kb-skills 的 initializing-kb 流程创建,**KB 名称必须是 `product-research`**,不要复用其他已有 KB。AGENTS.md 内容从 `template/kb/AGENTS.md` 复制。
12
- - **必须询问用户填写 `wiki/entities/seller-profile.md` 的关键字段**(至少:主营市场、目标价位、最低毛利率、最低净利率、单品启动预算)。这些信息直接影响 SPAN 评分和 FAN 判断,缺失会导致分析不准确。用户可以简短回答,agent 帮填入。
11
+ - 不存在 → 使用 kb-skills 的 initializing-kb 流程创建,**KB 名称必须是 `product-research`**,不要复用其他已有 KB。用 `cp` 命令将 `template/kb/` 下的模板文件复制到 KB 对应位置(AGENTS.md、wiki/entities/seller-profile.md、wiki/overview/roadmap.md、wiki/overview/cbb.md)。
12
+ - **必须询问用户填写 `wiki/entities/seller-profile.md` 的关键字段**(至少:主营市场、目标价位、最低毛利率、最低净利率、单品启动预算)。**严格使用用户回答的数值,不要自行调整。**
13
13
  2. 检查 `wiki/entities/seller-profile.md` 是否已填写关键字段
14
14
  - 未填写 → 必须询问(不能跳过关键字段:最低毛利率、最低净利率、单品启动预算)
15
15
  3. 读取 `~/kb/product-research/wiki/entities/seller-profile.md` + `~/kb/product-research/index.md` + `~/kb/product-research/wiki/overview/roadmap.md` + `~/kb/product-research/wiki/overview/cbb.md`
@@ -116,19 +116,21 @@
116
116
 
117
117
  **Ingest 完成后执行检查。10 项全部通过才能进入分析阶段。任何一项未通过 → 补齐后重新检查。**
118
118
 
119
+ **检查方法:必须用 `ls` 或 `Glob` 实际验证文件是否存在,不要凭记忆或推测判断。**
120
+
119
121
  ```
120
- 数据完整性检查清单:
121
-
122
- □ 搜索覆盖度:wiki/sources/ 中搜索结果覆盖 ≥ 30 个不重复 ASIN
123
- □ 子品类聚类:wiki/overview/market-{slug}.md 中有 ≥ 5 个子品类?
124
- 精确搜索量:有 sp-keywords-mine 来源页?
125
- 品牌集中度:有 sp-brands 来源页?
126
- 卖家国籍:有 sp-seller-countries 来源页?
127
- 卖家类型:有 sp-seller-types 来源页?
128
- 供应端成本:有 supplier-search 来源页(≥ 3 家供应商)?
129
- 趋势信号:有至少 2 个社交平台来源页?
130
- 缓存完整:~/.scout/cache/{project}/ 文件数命令执行数?
131
- □ Ingest 完整:所有缓存文件已 ingest(raw/ + wiki/sources/ 对应存在)?
122
+ 数据完整性检查清单(每项必须用命令验证):
123
+
124
+ □ 搜索覆盖度:ls wiki/sources/*search* 确认有3 组搜索来源页,合计覆盖 ≥ 30 个不重复 ASIN
125
+ □ 子品类聚类:cat wiki/overview/market-{slug}.md 确认有 ≥ 5 个子品类行
126
+ 精确搜索量:ls wiki/sources/*sp-keywords-mine* 确认来源页存在
127
+ 品牌集中度:ls wiki/sources/*sp-brands* 确认来源页存在
128
+ 卖家国籍:ls wiki/sources/*sp-seller-countries* 确认来源页存在
129
+ 卖家类型:ls wiki/sources/*sp-seller-types* 确认来源页存在
130
+ 供应端成本:ls wiki/sources/*supplier-search* 确认来源页存在,且包含 3 家供应商
131
+ 趋势信号:ls wiki/sources/*tiktok* wiki/sources/*reddit* wiki/sources/*twitter* wiki/sources/*instagram* 确认 ≥ 2 个平台
132
+ 缓存完整:ls ~/.scout/cache/{project}/ | wc -l 确认文件数 采集命令数
133
+ □ Ingest 完整:对比 ls raw/ ls wiki/sources/ 确认一一对应
132
134
  ```
133
135
 
134
136
  **输出格式**:
@@ -70,29 +70,38 @@ It is just hoarding goods
70
70
 
71
71
  写脚本时的判断:
72
72
 
73
- **保留率目标 60%**:成片字数 / 原片字数(从 proposal 顶部统计或粗算)≥ 0.6。开拍 app 实证参考值 ~65%。低于 50% 必然意味着删多了内容(详见 [P0 spec](https://github.com/Optima-Chat/video-edit-skill-spec/blob/main/docs/spec/P0-content-preservation.md))。
73
+ **你的唯一任务:识别 NG 重拍 + 完全无意义填充语,删掉。其它一律保留。**
74
74
 
75
- **三类句子默认保留**(只在明确 NG 重拍时才删):
76
- 1. **钩子条件句**:`如果你...`、`还在...的同学们`、`没有...的`、`想...不知道...的`
77
- 2. **背景/限定前缀**:`在 X 做`、`做了 N 年的`、`我们...的`(交代说话人/卖点的铺垫)
78
- 3. **重申/落地句**:核心卖点的二次出现,**判别启发**(关键,区分"重申要留" vs "NG 要删"):
79
- - 换了角度? 地理 → 产品形态 → 操作步骤 / 实例 → 概念 → 是 → **留**
80
- - 加了新信息? 新数字 / 新案例 / 新时间 → 是 → **留**
81
- - 完全等价、只是措辞不同?(如"我做这个挺久了" / "做了三四年了")→ 否 → **算 NG 重拍,删一遍**
75
+ > ⚠️ 这条规则 2026-05-08 重写过(之前是"保留率 ≥ 60% + 三类必留 + 两类才删"):
76
+ >
77
+ > 实证显示百分比硬规则不工作 LLM 心算字数飘 + 用户感觉"删多了"的真实原因是误删了非 NG 的内容句。改成**只删两类,边界明确**,不再设字数门槛。**卡顿/停顿由工具阈值控制**(下方 smart-cut 已放宽),不是 prompt 层判断。
82
78
 
83
- **两类才删**:
84
- 1. **完全填充语**:`嗯`/`啊`/`呃`/`这个`/`那个`/`然后`,且单独成句、上下文无意义
85
- 2. **明确 NG 重拍**:同一句话出现 take A 和 take B(措辞可能不同但信息等价),选信息更全的留
79
+ **只删两类**(明确边界 + 反例):
86
80
 
87
- **注**:上述"必留三类"中的任一句,若 `smart-cut` / `review` `HARD: repeated-content`,**优先信任 review 的判断**(它是字面重复检测,能发现你判断不到的语义级重复)。处理:从被标重复的两句里删信息密度较低的那句,再跑 review 验证;如果删完后保留率 < 50%,**回头从"两类才删"里加回内容**(钩子/背景前缀),不是再硬塞重申句。
81
+ 1. **NG 重拍** = whisper 转写中**前后字面相同的字串**(2+ 字)出现两次。通常因为主播照稿子念时卡顿,然后从前面几个字重念。
82
+ - ✅ 删:转写得 `我们在我们在做跨境电商` → 删一份 `我们在`(留 `我们在做跨境电商`)
83
+ - ✅ 删:转写得 `批量打爆批量打爆你的店铺` → 删一份 `批量打爆`
84
+ - ✅ 删:转写得 `如果你想如果你想做店铺` → 删一份 `如果你想`
85
+ - **判定标准:字面相同字串 ≥ 2 字**(不是同义,是字面一致)
86
+ - 工具(`smart-cut HARD repeated-content`)会自动检测 4+ 字字面重复并阻断,你也可以预先在 cut_proposal 里看相邻 phrase 文本扫一眼
88
87
 
89
- **通用约束**:
90
- - **中文必须用原文措辞**——不要润色或改写,否则匹配不上
91
- - **每行 10 个汉字**——超过会显示挤、可能溢出视频边界
92
- - **`**关键词**` 标记 1-2 个**:挑能传达这句"重点信息"的实词(名词/动词),不要标助词、口头禅;短语里没明显重点就 0 个标记
93
- - **英文翻译要地道、口语化**——给海外用户看的,不是直译。短句即可,可省略主语。
88
+ **以下不算 NG,默认保留**:
89
+ - **同义不同字**(如 `我做这个挺久了` / `做了三四年了`)— 字面不重复,留两个 OR 选措辞流畅那个,**不强制删**
90
+ - **同事实换措辞强调**(如 `日发四万单` + 后段 `我们日均出货四万`)— 字面不重复,留措辞好的就行,不强制删
91
+ - **同概念不同角度**(如 `海外货盘` + `一件代发`)— 信息有增量,**两个都留**
92
+ - 关键启发:**LLM 不可靠地判断"同义",但可靠地判断"字面相同"。所以 NG 严格收窄到字面级**
93
+
94
+ 2. **完全无意义填充语**:`嗯`/`啊`/`呃` 单字**独立成短语**(不嵌在句中)。嵌在句中作为停顿语气词的**不删**。
94
95
 
95
- **写完前自检**:sum(所有保留行字数) ≥ 原片字数 × 0.6,不达标重新审视删除决策——绝大多数情况问题在于"两类才删"的判断把内容句也按填充语丢了,回头加回钩子/重申/引导句。
96
+ **其它一律保留**:钩子条件句、背景前缀、重申/铺垫、引导词、CTA、即使你觉得"不那么核心"的句子。**不确定就留**。
97
+
98
+ **卡顿/短停顿/词尾喘气由 smart-cut 工具自动处理**(silencedetect + RMS 软停顿 + 残留验证三层),**不是你的工作**。短停顿(< 0.30s)是自然语流,工具会保留;长停顿才删。
99
+
100
+ **通用约束**(写法层):
101
+ - **中文必须用原文措辞**——不要润色或改写,否则匹配不上
102
+ - **每行 ≤ 10 个汉字**——超过会显示挤、可能溢出视频边界
103
+ - **`**关键词**` 标记 1-2 个**:挑能传达这句"重点信息"的实词(名词/动词),不要标助词、口头禅;短语里没明显重点就 0 个标记
104
+ - **英文翻译要地道、口语化**——给海外用户看的,不是直译。短句即可,可省略主语。
96
105
 
97
106
  **写完后必做的自查(保存前)**:把 final_script 当成一段**连续口播稿**通读一遍——不是一行行检查,是**整体读**。问自己:
98
107
 
@@ -163,26 +172,27 @@ video-edit smart-cut <video>
163
172
 
164
173
  ## 写脚本的心法
165
174
 
166
- **先算账**:读完 proposal 后记下原片字数 N(精度 ±10% 够用)。**目标成片字数 M ≥ 0.6 × N**。
175
+ proposal 时**逐 phrase 判断**(简化决策树):
167
176
 
168
- proposal 时**逐 phrase 判断**:
169
- 1. 这句是 [钩子条件 / 背景前缀 / 重申落地] 之一吗?是 → **必留**(不要凭"听起来不那么核心"就删)
170
- 2. 这句是孤立填充语?(`嗯`/`啊`/`这个` 单成句无意义)→ 跳过
171
- 3. 这句是明确 NG 重拍的较差版?(同一意思 take A 和 take B 选其一)→ 跳过较差那遍
172
- 4. 不属于上述任一类 → **默认留**(不确定就留,不要默认删)
177
+ 1. 这句是 NG 重拍?(口误/吞字后当场重说同一句)→ 删较差那遍
178
+ 2. 这句是孤立 `嗯/啊/呃` 单字独立短语?→ 跳过
179
+ 3. 其它(包括钩子/背景/重申/引导/听起来"不太核心"的句子)→ **保留**
173
180
 
174
- 最后校验 sum(所有保留行字数) ≥ M。不达标 → 优先回退第 2、3 步的"跳过"决策,把误删的内容句加回来。
181
+ 不算字数,不设比例。**疑则留**。
175
182
 
176
- **关键纪律 1**:脚本里的字**必须**来自原始转写——直接复制 proposal 里的 phrase 文本最稳。
177
- 你想怎么润色都不行(系统按字符匹配,改了字就匹不上)。
183
+ **关键纪律 1**:脚本里的字**必须**来自原始转写——直接复制 proposal 里的 phrase 文本最稳。
184
+ 你想怎么润色都不行(系统按字符匹配,改了字就匹不上)。
178
185
 
179
- **关键纪律 2**:**追求"内容连贯且信息密度高",宁可保守**。
186
+ **关键纪律 2**:**只识别 NG,卡顿交给工具**。你不要在 prompt 层做"内容是不是太长" / "保留率够不够"的判断 — 那是工具阈值的事,smart-cut 会自动删卡顿/短停顿/喘气。
180
187
 
181
- > ⚠️ 这条纪律 2026-05-07 反转过(之前是"宁可激进"):
188
+ > ⚠️ 这条纪律 2026-05-08 重写过(经历两次反转):
189
+ > - 2026-05-07 之前:"宁可激进删,删多了用户能加回来"
190
+ > - 2026-05-07:反转为"宁可保守 + 60% 保留率",理由是开拍对比发现我们删多了内容(钩子/重申被删)
191
+ > - 2026-05-08:再次重写为"只识别 NG,其它全留",理由是 60% 硬规则 LLM 心算飘 + 工具阈值同步放宽,prompt 层不需要数字约束
182
192
  >
183
- > 实证([2026-05-07 开拍对比 finding](https://github.com/Optima-Chat/video-edit-skill-spec/blob/main/docs/findings/2026-05-07-kaipai-comparison.md))显示我们成片每对都比开拍短 4.7-5.2s,丢失的都是钩子/重申/引导句。技术指标(残留卡顿/画面跳变)我们已全面超过开拍,但用户体感"卡顿"反而是我们这边的胜场——因为**真正的"卡顿感"是删了一句话后前后两句接不上的语义断裂**。
193
+ > 现在的模型:**agent 只判断 NG;静音/卡顿由 smart-cut 工具阈值控制**(`DELETE_SILENCE_MIN=0.30s`/`RESIDUAL_PAUSE_MAX=0.50s`)。两层职责不再交叉。
184
194
  >
185
- > 所以删多了**比**留多了更伤体验。详见 [P0 spec](https://github.com/Optima-Chat/video-edit-skill-spec/blob/main/docs/spec/P0-content-preservation.md) 和 [ADR](https://github.com/Optima-Chat/video-edit-skill-spec/blob/main/docs/decisions/2026-05-07-stop-pause-tightening.md)。
195
+ > 详见 [P0 spec](https://github.com/Optima-Chat/video-edit-skill-spec/blob/main/docs/spec/P0-content-preservation.md) 和 [ADR](https://github.com/Optima-Chat/video-edit-skill-spec/blob/main/docs/decisions/2026-05-07-stop-pause-tightening.md)。
186
196
 
187
197
  ## 交付怎么说
188
198
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@optima-chat/optima-agent",
3
- "version": "0.9.45",
3
+ "version": "0.9.47",
4
4
  "description": "基于 Claude Agent SDK 的电商运营 AI 助手",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",