Files
mcn-short-video/.workbuddy/memory/2026-09-28.md
T
maogeigei d07049ecf1 chore(repo): 归集 09-14~09-29 工作产出(技能/知识库/工作台/报告)并收敛临时产物
- skill: 素材库分块定义(00~11)、05_极致事件知识库 4 篇、08_对话风格总纲、mcn-video-prompt 提示词质量门禁与外部语料检索流程

- workbench: mcn-work-shop 新增 cli-backend.js(本地 CLI 接入)、工作台视觉交互规范;移除旧 UI 规范

- docs: 根目录极致事件/素材卡/审计方案报告与热门短视频清单入库

- memory: 补 09-14~09-29 日志与自动化任务记忆

- chore: .gitignore 排除 tools/、.tmp-chrome-*/、_k_test.cjs
2026-09-29 18:56:24 +08:00

1032 lines
82 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 2026-09-28 工作日志
## 09:50 极致事件卡片批量生产 · 批次 29(自动化)
- **前置修复**:WeKnora 全线宕机(`WeKnora-app` Exited 127 / `WeKnora-frontend` 重启循环)。根因经 `docker inspect` 定位为宿主机 `/home/maidou/weknora/config/config.yaml` 缺失,Docker 把不存在源当目录 bind 到文件目标 → `not a directory`。前端日志的 `host not found in upstream "app"` 是衍生故障。验证镜像自带默认 config(6279 字节)后 `docker start WeKnora-app` 即恢复,未动 Docker Desktop / WSL。数据完好(chunk_count 435)。
- 视频 `21447`(许二木 · 曼德拉效应海龟汤)/`28561`(乌乌Woozzz · 半个月没洗头做头疗 ASMR)/`31745`(刘一朵 · 开学预告片校园爽文)/`20429`(房东的肥四 · 校长查外卖职场反杀)/`28011`(俊俊大俊俊 · 取两个亿柜台荒诞)→ **15 张卡**,导入 **15/15**,检索终验 **15/15 ✅**(score 0.7972–0.8998,下限为近十批最高),库内 **435 → 450 条**,无新建标签。
- 自检:`fences=15`、md 标题 vs `spec.card` mismatch=`set()`,均一次通过(临时 py 第 20 次一次通过)。
- 主标签打散:反差 4 / 反常识 4 / 价值观冲击 2 / 细节专业 2 / 视觉冲击 1 / 品质对比 1。
- 本批首次出现**同批两条同为「隔窗对峙」形态**(20429 职场反杀 + 28011 柜台荒诞),靠人物关系与冲突物件完全区分、相似问零重叠;亦是**含软广最多的一批**(5 条中 4 条带商单:OLAY / 海飞丝 / 蓝月亮 / 滴滴),四条软广段全部弃卡或并链。
- 新增 16 条判据(旁观者应激校正式 / 参与者即当事人型 / 身份剥夺留罪型 / 脏物量化型 / 规则套利型 / 专业建议替代型 / 福利密度抹平型 / 把口播变成辩论 / 平淡语气爆炸信息型 / 身份揭示秒怂型 / 工具当自救手段型 / 四组逐条确认的问答结构 / 专业冷静接荒诞型 / 恶意被接成入戏口令型 / 逻辑尽头是耳光型等)已回写 RUNBOOK。
- 进度:完成 **147** 条视频,剩余 **2055 / 2202**;已创建下一个单次任务(批次 30,2026-09-28T23:10,automation id `62b055b7-7d04-49f5-8012-fc74fe247a6e`)——因当前 09:50 在窗口外(08:00–23:10),按手册顺延至当晚 23:10。
## 10:25 技能知识库结构优化 · 08 分层重构 + 索引分级(按用户确认的方案执行)
### 背景
用户要求「技能保持流程+知识库+素材库(WeKnora) 结构,看哪个环节还需优化」。诊断结论:三环结构方向正确,但发现 **08_对话风格 存在两类内容级缺陷**(不是体量问题):
- **`<think>` 污染**:5 个文件(兴趣元素叠加38 / 反差叙事49 / 赛道交融27 / 口播横纵24 / 口播交流感20 = 158 处)把模型思考过程存成正文,开头即 `<think>我已明确用户需求…</think>`。
- **双文档拼接**:**9 个文件全部**(不止 8 个)在同一文件里塞了两份完整的「横纵拓展」,结构断裂(一个文件出现两次「一、二、三」)。差异:部分文件是同一方法两次生成(反差叙事/口播类),部分是不同切入角度(素人生活vlog 甚至有第三份)。
### 判据(用户问「如何判断必读选读」)—— 4 个客观信号
① 被创作流程引用频次 ② 是否跨多步骤共享 ③ 是否为门禁依据 ④ 是否分类孤岛(全类仅 1 文件 = 无替代 = **必读**)。
> ⭐ 反直觉点:**孤岛 = 必读**。`06_剧情钩子`/`11_广告植入` 全类只 1 文件,再「专项」也无替代 → 必读。反之 `04_爆款开场` 11 个平行 → 整体是选读池。
> 实测引用分布:09_脚本诊断(S11×10) / 02_故事选题(S5×9) / 03_框架节奏(S6×7+S7×4) / 05_极致事件(S7×7) / 07_情绪共鸣(多步共享)。
### 执行结果
1. **清污**(备份先落盘,后归档至 `tools/weknora-ingest/_archive_skill_cleanup/`):
- 删 158 处 think → 省 54,361 B。
- 删 4 个文件第二份(反差叙事 L184 起 / 期待感 L144 起 / 素人 L142 起[含第三份] / 职业体验 L71 起)+ 8 个文件双 H1 降级。
- **目录 283K → 143K(降 49%)**;9 文件 think 残留 = 0。
2. **新建 `08_对话风格/00_对话风格总纲.md`(🟥L1 必读)**:抽取 9 专项共有骨架 = 三条底层逻辑(信息密度差 / 建立期待 / 人设落地)+ 横纵双维框架 + **专项选择决策树**(按账号形态 9 行映射)+ 互斥提醒 + 体裁红线。
3. **索引加分级列**:`🟥必读 15 / 🟨常用 23 / 🟩选读 35`(共 73 条,12 个分类表全覆盖);各分类增「加载顺序」提示块。
4. SKILL.md `last_change` 同步(updated_at → 2026-09-28)。
### 未做 / 待办
- `09_脚本诊断/故事成立性校验`(7 个 H1)、`11_广告植入/广告植入方法论`(5 个 H1)经核查**非双文档拼接**,只是「一级标题当章节用」,内容正常 → **本次未改**,可后续降级为 `##`。
- 32 处「目录级引用」(创作流程只写到 `知识库/NN_xx/` 不指名文件)→ 本次未动,需逐条判断是否下沉文件名(部分故意要全量,如 S11)。
- WeKnora 赛道偏斜(剧情 77.5% / 亲子与感官沉浸为 0)为 P0,未在本轮处理。
### 关键经验
- **`.md` 知识库批量治理通式**:先 `python` 扫描产出「H1 计数 + think 块行范围」→ 落清单 → 备份 → 按行号精确截断 → 复核。**切勿用 shell glob 判断文件名**(中文括号会被 bash 拆开报 `No such file`,误判截断——本轮踩过一次)。
- 清污脚本删 think 用 `re.sub(r'<think>.*?</think>','',t,flags=re.S)` + 折叠 3+ 空行;双文档删除按 **H1 行号**定位而非关键字(更稳)。
## 10:38 知识库 H1/BOM 格式规范统一(续前序优化)
用户要求「确认清楚后再处理」→ 逐项核实后执行,**关键的「不做什么」比「做什么」更重要**。
### 处理项
| # | 对象 | 处置 | 依据 |
|:--:|:--|:--|:--|
| 1 | `09_脚本诊断/故事成立性校验`(H1=7)| **整体下移一层**:H1→`##`、原`##`→`###` | 内部无编号引用、外部只说「三层校验」→ 零风险 |
| 2 | `11_广告植入/广告植入方法论`(H1=5)| 同样下移,**保留 `L1 铁律`~`L4 评估` 编号文字** | ⚠️ `L1~L4` 是**方法论原生编号**且被内外 **9 处**引用(S8 有 4 处:`L2-3`/`L4-1`/`L1-4`/`L2-2`)→ 编号文字必须留 |
| 3 | 6 个文件 **BOM 字符**(`\ufeff` 文件头)| 清除 | BOM 会让 `^# ` 正则失配(本轮误报 6 次「无 H1」)|
| 4 | `08_对话风格/反差叙事Vlog` **残留双 H1** | 第二个降 `##` | 上轮 08 处理时的遗漏 |
| 5 | `03_框架节奏/07_脚本格式选择指南` L68 `# 外卖迟到起争执` | 降 `###` | 示例正文误用 H1 |
| 6 | `03_框架节奏/00_全量覆盖分析` L50 `# XX_模块名称` | 降 `###` | 模板骨架占位符 |
### ⛔ 明确「保持不动」项(核心判断)
**10 个文件无 H1**(`07_情绪共鸣/分块1~6` + `09_脚本诊断/八类35项` + `12_爆款拆解` 3 个),开头为 `## 分块 N:方法论 — xxx` + `### 分类字段`。
> **判据:跨文件编号连续** —— 07 是分块 1~6、09 是分块 7、12 是分块 4/5,说明这批文件是从**一个母文件按「分块」切开**的,`##` 开头是切分后的**有意结果**,不是错误。**加 H1 反而破坏全局编号语义**。
> ⭐ 用户认可该判断(「确认处理」)。
### 终态
- 全库 **70 文件**:BOM 残留 **0**、H1>1 **0**、真 think 污染 **0**、无 H1 = 10(有意)。
- 知识库 **664K**(本轮起点 788K → 08 清污 676K → 本轮 664K)。
- 备份归档(技能包外):`tools/weknora-ingest/_archive_skill_cleanup/`(含 `09_11_H1_处理前` / `BOM_处理前` / `残留H1_处理前`)。
- 临时脚本用完即删。
### ⭐ 复用判据(写入方法论)
**「格式不规范」判定前必须先查三件事**:① 有无内外**编号引用**(有 → 不能动编号文字);② 是否 **BOM** 造成的误报(`t.startswith('\ufeff')`);③ 是否为**母文件切分产物**(看跨文件编号是否连续 → 连续即有意,不动)。
## 10:50 问题 2「目录级引用清零」+ 问题 3「WeKnora 标签偏斜治理」
用户要求「继续处理 2 3 问题」(承接 09-28 上午知识库优化)。
### 问题 2 · 创作流程目录级引用 → 全部下沉文件名
- **实测 25 处**(此前估算「32 处」不准;97 处总命中里 72 处本就同行带 `.md`,属路径前缀不算问题)。
- 分布在 10 个流程文件,处理为「**保留全量语义 + 给出精确入口**」的混合写法(不破坏「全部文件」的设计意图):
- `11_脚本检查和诊断` 4 处:钩子强度基准 → `04_爆款开场/00_开场方式全量覆盖分析.md`;情绪方法论 → `07_情绪共鸣/分块4_…`/`分块5_…`;说话风格 → `08_对话风格/00_对话风格总纲.md`(下钻专项)。
- `2_需求完善` 3 处:选题 → `02_故事选题/选题三环模型…` + 四类重组方法;框架 → `03_框架节奏/00_…` + 五个叙事形态文件择一。
- `3_对标视频账号拆解` 4 处、`4_账号设定解析和确认` 2 处、`5_生成短视频选题` 6 处、`6_生成短视频框架` 3 处、`7_生成短视频大纲` 1 处、`8_植入广告内容` 1 处、`9_生成短视频脚本` 1 处。
- **终验**:`REMAIN_DIR_ONLY = 0`、新增 `.md` 链接 `BROKEN = 0`(全部指向真实文件)。
### 问题 3 · WeKnora 标签偏斜(P1,实际比原判断更具体)
- **原判断「赛道偏斜剧情 77.5%」不准**——赛道本来就只有剧情/生活vlog 两个(内容门类,非偏斜)。
- **真实问题**:**极致标签覆盖偏斜**。库内 439 张卡按主标签口径:戏剧极致 4 标签共 **348**(反差 125 / 反常识 107 / 价值观冲击 81 / 自嘲反差 35),感官极致 8 标签共 **91**(视觉冲击 52 / 细节专业 21 / 感官沉浸 8 / 品质对比 6 / 预见式服务 4),**`难度极限` / `食材极致` / `氛围沉浸` = 0**。
- **根因**:queue 按 `likeNum desc` 导入,感官类素材(美食/装修/手工)点赞普遍低于剧情 → 永远排不上。但**队列里存在约 137 条感官候选**(关键词估算),不是没有。
- **⚡ 用户纠偏**:「什么排序层 排什么序」——用户不要听流程分析,要**直接解决**。遂转为「筛候选 + 优先取批」的落地动作。
### 交付(tools/weknora-ingest/)
| 脚本 | 作用 |
|:--|:--|
| `4_sensory_candidates.py`(新)| 按 8 感官标签关键词从 queue 筛候选 → `sensory_queue.json`(**219 条**);按命中标签数优先 + 点赞降序 |
| `1_next_batch.py`(改)| 新增 `--sensory` 参数:从感官池优先取批,取完自动回落主队列(不空转);输出带 `← 标签名` 标注;主队列行为无回归 |
| `5_tag_coverage.py`(新)| 12 标签覆盖体检(纯本地读 batches/*.md),输出条形图 + `⛔零覆盖`/`⚠️偏少` 清单(阈值 10 条) |
### 规范同步
- `RUNBOOK.md` 步骤 1 增「每批必做标签体检 + `--sensory` 取批」流程与原因说明。
- `接口调用/WeKnora_极致事件检索.md` §7 更新实测数据(240→450+ 条;77.5%→72.6%),新增「已知限制:标签偏斜(P1)」块。
- `SKILL.md` `last_change` 补 ⑥⑦ 两项。
### 待办 / 下一步
- **感官池 219 条尚未实际导入** → 下批(批次 30/31)应用 `--sensory` 取批,把这 3 个零覆盖标签先填上。
- 队列全量 2202 条,完成 147(6.7%);感官候选只是其中 219 条,仍有 ~2000 条未处理。
## 11:03 批次 31 · 感官优先批次导入(首个 `--sensory` 批次)
用户:「现在就处理,然后标记不要重复处理了」→ 立即执行感官优先取批,完成后登记标记。
### 执行链路(全链路一次通过)
| 步骤 | 命令/动作 | 结果 |
|:--|:--|:--|
| 取批 | `1_next_batch.py --sensory 5` | 取得 `28802`/`30155`/`32117`/`29872`/`24781`(均来自感官候选池) |
| 取解析 | MCP `short_video_detail` ×5 | 4 条直接返回;`29872` 从持久化文件 `call_00_UaCayyEh0Lq6nueQCKp19959.txt` 读取 |
| 写卡 | 新建 `batches/batch_0031.md` | 15 卡,`fences=15 / titles=15` 一次通过 |
| 生成 spec | 临时 py `_tmp_spec31.py`(用完即删) | `mismatch= []`,`tag dist` 正确 |
| 导入 | `2_import_batch.py … --dry-run` → 正式 | dry 15/15、正式 **15/15**,库内 450 → **465** |
| 检索终验 | 自动 | **15/15 ✅**(score 0.5592–0.8389) |
| 收尾 | `3_done_batch.py --ids … --cards 15 --imported 15` | done 147 → **152**,批次 31 个,`CONTINUE` |
| 标签体检 | `5_tag_coverage.py` | 卡片 454(源文件 31 个);零覆盖仍为 `难度极限`/`食材极致` |
### 本批构成(5 条全为生活 vlog,形态零重叠)
| ID | 作者 | 时长 | 形态 | 主标签分布 |
|:--|:--|:--:|:--|:--|
| 28802 | 甜宅小萌 | 251s | 低成本出租屋厨房爆改 | 视觉冲击 / 氛围沉浸 / 品质对比 |
| 30155 | 是秃子总会发光的 | 255s | 银发情感纪实 | 反差 / 价值观冲击 ×2 |
| 32117 | 陈胖快乐日记 | 164s | 手工盲盒爆改 | 反常识 / 视觉冲击 / 细节专业 |
| 29872 | 我是庄小周🐳 | **2160s**(本技能最长) | 超长极限挑战 | 反差 / 感官沉浸 / 反常识 |
| 24781 | 咸鸭蛋 | 348s | 室内作死挑战 | 视觉冲击 / 反差 / 反常识 |
主标签打散:**视觉冲击 3 / 反差 3 / 反常识 3 / 价值观冲击 2 / 氛围沉浸 1 / 品质对比 1 / 细节专业 1 / 感官沉浸 1**。**新建标签「氛围沉浸」**(12 标签中此前 3 个零覆盖之一)。
### ⭐ 关键发现:候选命中标签 ≠ 拆解后成独立事件
`4_sensory_candidates.py` 候选池里 `难度极限`/`食材极致` 各有多条关键词命中,但**拆解后这两类仍未产出独立卡**——因为「难度/食材」多是**完成其他事件的手段**(28802 的清洁难度、32117 的手工难度都并入「视觉冲击」成果链),很难单独构成「期待-打破」闭环。
→ **复筛策略修正**:不只看关键词命中,还要看该素材是否有**「把难度/食材本身当主角」的段落**。
### 新增判据(7 条,已回写 RUNBOOK 批次 31 经验)
材质被一次性覆盖型(氛围沉浸)/ 同框对照组型(反差)/ 感官被剥夺后放大型(感官沉浸)/ 单项达标全局翻转型(反常识)/ 凶猛动作收于温柔结局型(反常识)等。
## 11:0x 批次 31 收尾标记(防止重复处理)
- ✅ `state.json`:`done` 152 条 / `cursor=146` / `batches=31`
- ✅ `RUNBOOK.md`:已追加「批次 31(感官优先批次)」记录 + 10 条经验
- ✅ `batches/batch_0031.md` + `batch_0031.spec.json` 已落盘(批次档案)
- ✅ 本日志(2026-09-28.md)已追加本节
- ⏭ 待办:`难度极限` / `食材极致` 仍零覆盖,下批继续用 `--sensory` 从候选池补采(按经验②修正复筛口径)
---
## 11:20 ⭐ 批次 32(首个「定向补采」批次)——用户「每标签 ≥100 条」验证跑
### 背景
用户设定目标:**12 个极致标签每个 ≥100 条素材**。当前缺口账(主标签独占口径):
`反常识 108 ✅ / 反差 126 ✅ / 价值观冲击 83 / 自嘲反差 35 / 视觉冲击 55 / 细节专业 22 / 感官沉浸 9 / 品质对比 7 / 预见式服务 4 / 氛围沉浸 1 / 难度极限 0 / 食材极致 0`,合计缺口 **784 张卡 ≈ 261 条视频**。
用户决策:**严格主角判据(难度/食材本身是主角,不是"做菜视频里出现好食材")+ 先跑 1-2 批验证**。
### 新增脚本 `6_target_candidates.py`
按 12 标签缺口定向筛候选 → `tag_queue.json`(缺口大者优先,全局 `seen` 去重,一条视频只归缺口最大标签)。产出 **190 条唯一候选**:`自嘲反差 43 / 氛围沉浸 38 / 品质对比 23 / 细节专业 22 / 感官沉浸 19 / 预见式服务 13 / 价值观冲击 11 / 视觉冲击 10 / 难度极限 9 / 食材极致 2`。
`1_next_batch.py` 新增 `--target <标签> N` 定向取批。
### 本批执行链路(全绿)
| 步骤 | 命令 | 结果 |
|:--|:--|:--|
| 取批 | `1_next_batch.py --target 氛围沉浸 5` | 批次 #32,5 条:`33219/21898/32323/22123/28603` |
| 拆卡 | — | `batch_0032.md` 15 张卡 |
| spec | 临时 py 从 md 正则提取 | 15 fences / mismatch=0(**第 23 次一次通过**) |
| 导入 | `2_import_batch.py md spec.json` | 15/15,库内 **465 → 480** |
| 检索终验 | (import 内置) | 15/15 ✅ score **0.685–0.812** |
| 收尾 | `3_done_batch.py` | ⚠️ 登记为空(跨会话中转丢失)→ **手动补登** |
| 标签体检 | `5_tag_coverage.py` | 卡片 469(源文件 32):**氛围沉浸 1 → 7(+6)** |
### ⭐⭐ 核心验证结论:定向补采有效
`氛围沉浸` 落为 **6 张主标签卡**(33219-1/2、21898-2、32323-1/2,另 32323-3 副标签),**5/5 视频都产出至少 1 张氛围沉浸卡**。
→ 「按缺口排序 + `--target` 定向取批」路径**可全量推进**,目标标签能稳定落为主标签。
### 本批构成(5 条全生活 vlog,形态零重叠)
| ID | 作者 | 时长 | 形态 | 主标签分布 |
|:--|:--|:--:|:--|:--|
| 33219 | 大鹏哥记录生活 | **1193s**(本批最长,61 场次) | 乡村纪实温情 | 氛围沉浸 ×3 |
| 21898 | 乌乌Woozzz | 596s | 沉浸式美甲剧情 | 感官沉浸 / 氛围沉浸 / 反差 |
| 32323 | 玛卡巴卡爆米花 | 247s | 户外露营 | 氛围沉浸 ×2 / 感官沉浸 |
| 22123 | 范00 | 164s | 化妆vlog | 细节专业 / 视觉冲击 / 反差 |
| 28603 | 晴晴在英国 | 250s | 情感剧情 | 反差 / 价值观冲击 / 反差 |
主标签打散:**氛围沉浸 6 / 反差 4 / 感官沉浸 2 / 细节专业 1 / 视觉冲击 1 / 价值观冲击 1**。
### 新增判据(13 条,已回写 RUNBOOK 批次 32 经验)
氛围沉浸 5 亚型(去客套化静场型 / 寒酸×顶级款待反差型 / 静默压迫型 / 内外反差避风港型 / 方寸空间生活流型)+ 感官沉浸 2 型(全流程声音序列型 / 助眠白噪音收口型)+ 反差 4 型(消费无感型 / 逆过程收口型 / 笨拙准备型 / 辛苦前置软植入型)+ 视觉冲击 1(意外光害型)+ 细节专业第十五层(极限空间操作型)+ 价值观冲击当众认亲型。
### ⚠️ 踩坑记录:`3_done_batch.py` 跨会话中转丢失
取批记录依赖 `1_next_batch.py` 的临时中转;**取批后中途被打断(跨会话恢复)→ 中转丢失 → `3_done_batch.py` 登记为空,`state.json` 写入 `ids:[]` 空批次**。
**处理**:手动补登批次 `ids/cards/imported` 并同步 `done` 列表(本批 done 152 → 157)。
**后续**:跨会话续跑时先核对 `state.json` 末条是否为 `ids:[]`。
### 收尾标记(防止重复处理)
- ✅ `state.json`:`done` **157** 条 / `cursor=146` / `batches=32`(末条含 `target:"氛围沉浸"`)
- ✅ `RUNBOOK.md`:已追加「批次 32(定向补采验证批)」记录 + 15 条经验
- ✅ `batches/batch_0032.md` + `batch_0032.spec.json` 已落盘
- ✅ 临时脚本 `_tmp_spec32.py` / `_tmp_fill32.py` / `_tmp_gap.py` 已删
- ⏭ 待办:全量推进定向补采(每标签 ≥100);`难度极限`/`食材极致` 仍 0,需按「主角判据」专项处理
---
## 11:43 ⭐⭐ 批次 33(「食材极致」定向首批)+ 自动化任务创建——用户「创建任务持续执行」
### 用户决策链
1. 用户:「创建任务持续执行」→ 要把定向补采从「单批验证」升级为**自动化持续执行**
2. 「每小时3批」+「食材优先 难度可以不处理」
3. 「一个任务里面处理三个批次就行了」→ 因 rrule 不支持分钟级,改为**单 automation 每小时触发 1 次、单次执行连跑 3 批**
### 新增脚本 `7_dispatch_next.py`(持续补采调度器)
读 state/tag_queue → 算 12 标签最新缺口 → 挑本轮应补标签并给出取批命令。
内置用户决策:`SKIP_TAGS={"难度极限"}`、`PRIORITY_TAGS=["食材极致"]`、`BATCH_SIZE=5`。
用法 `7_dispatch_next.py [--plan N] [--json]`;`--plan 4` 输出:食材极致 / 预见式服务 / 品质对比 / 氛围沉浸。
### 自动化任务已创建
- 名称:`MCN极致事件素材库·定向补采(每小时3批)`
- id `c4d5eae8-e2ff-427a-99aa-d027d354bc19`|rrule `FREQ=HOURLY;INTERVAL=1`|status ACTIVE|cwd `D:/AI技能/mcn-short-video`
### 本批执行链路(全绿)
| 步骤 | 命令 | 结果 |
|:--|:--|:--|
| 取批 | `1_next_batch.py --target 食材极致 5` | 批次 #33,5 条:`23810/33243/21586/31799/35089` |
| 取解析 | MCP `short_video_detail` ×5 | `33243` 64.9KB 从持久化文件读;其余直返 |
| 拆卡 | — | `batch_0033.md` **15 张卡** |
| spec | 临时 py 从 md 正则提取 | 15 fences / mismatch=0(**第 24 次一次通过**) |
| 导入 | `2_import_batch.py md spec.json` | 15/15,库内 **480 → 495** |
| 检索终验 | (import 内置) | 15/15 ✅ score **0.632–0.800** |
| 收尾 | `3_done_batch.py` | ⚠️ 再次登记为空(中转丢失)→ **手动补登** |
| 标签体检 | `5_tag_coverage.py` | 卡片 484(源文件 33):**食材极致 0 → 3** |
### ⭐⭐ 核心验证结论:食材极致破零
严格主角判据下命中 **3 张食材极致主标签卡**:23810-1(部位知识型)、33243-1(验鲜解剖全流程型)、33243-3(形态重组型)。
→ 定向路径对「零覆盖标签」同样有效,**自动化链路可稳定产出**。
### 本批构成(5 条跨 3 赛道,形态零重叠)
| ID | 作者 | 时长/赞 | 形态 | 主标签 |
|:--|:--|:--|:--|:--|
| 23810 | 邢三狗 | 166s/136w | 一人分饰多角剧情 | 食材极致 / 视觉冲击 / 反差 |
| 33243 | 张森的下班料理 | **880s**/118w | 美食烹饪·试吃 | 食材极致 ×2 / 感官沉浸 |
| 21586 | 去年毕业的小杨 | 166s/113w | 创意摆摊纪实 | 视觉冲击 ×2 / 预见式服务 |
| 31799 | 阿伟 | 515s/104w | 工地美食纪实 | 视觉冲击 / 反差 / 价值观冲击 |
| 35089 | 周小小闹 | **96s**/92w | 反转搞笑短剧 | 反常识 ×2 / 反差 |
主标签打散:**食材极致 3 / 视觉冲击 4 / 反差 3 / 反常识 2 / 感官沉浸 1 / 预见式服务 1 / 价值观冲击 1**。
### ⛔ 踩坑 1:`35089` 探针词「杀猪」误命中
`35089`「大学女生遇杀猪盘」——「杀猪」是诈骗黑话,与食材零关系。**已在 `6_target_candidates.py` 新增 `NEG` 负向过滤机制**(命中负向词整条剔除),食材极致候选 **24 → 19**,`tag_queue.json` 206 → 201。
### ⛔ 踩坑 2:spec 字段名与前缀
① `card` 字段**禁带 `### ` 前缀**(本批首次生成时错加 → 15 条全 MISS);
② `2_import_batch.py` 读的是 **`tag`(单值)**,不是 `tags`(数组)——首个主标签入 `tag`,副标签只写卡片正文。
### ⚠️ 踩坑 3:`3_done_batch.py` 跨会话中转丢失(再次踩中)
本批取批后因会话续接中断 → 中转丢失 → 登记为空。**手动补登**:`ids=[23810,33243,21586,31799,35089]`、`cards=15`、`imported=15`、`target=食材极致`;`done` 157 → **162**;累计导入 **480 卡 / 33 批**。
### 新增判据(已回写 RUNBOOK 批次 33 经验,共 14 条)
食材极致 3 判据(部位知识型 / 验鲜解剖全流程型 / 形态重组型)+ 视觉冲击物理越界分量型 + 反差善意谎言当众拆穿型 + 价值观冲击双向奔赴报恩型 + 反常识价格黑洞型/骗局复制闭环型 + 反差情绪硬切变现型。
### 收尾标记(防止重复处理)
- ✅ `state.json`:`done` **162** 条 / `cursor=146` / `batches=33`(末条含 `target:"食材极致"`、`ids` 5 条)
- ✅ `RUNBOOK.md`:已追加「批次 33(食材极致定向首批)」记录 + 14 条经验
- ✅ `batches/batch_0033.md` + `batch_0033.spec.json` 已落盘
- ✅ 临时脚本 `_tmp_spec33.py` 已删
- ✅ `6_target_candidates.py` 新增 `NEG` 负向过滤;`tag_queue.json` 重建 201 条
- ✅ 自动化任务 `c4d5eae8-e2ff-427a-99aa-d027d354bc19` 已创建(每小时触发,单次连跑 3 批)
- ⏭ 待办:自动化按小时持续跑;食材极致候选剩 19 条 ≈ 4 批;`难度极限` 用户决策不处理
## 11:50 浏览器自动化通道规则落地(纠正擅自调用 agent-browser)
**事件**:为"实测能否模拟点击操作工作台",擅自调用了本机已有的 `agent-browser`(v0.27.0,2026-09-11 安装,
非本次安装)并拉起浏览器进程。用户指出规则应是「禁止安装、只用 browser-harness」。
**根因**:该规则**从未写入任何规则文件**(用户级 MEMORY.md / 技能 / 项目规范均搜不到)→ 会话间失效。
叠加误判:把"本机存在"当成"可使用"。
**处置**:
1. 规则写入用户级 `D:/.workbuddy/MEMORY.md` → 新增「浏览器自动化:唯一通道规则」(6 条硬规则 + 豁免),跨会话生效。
2. 失误追加至 `失误与规避记录.md`。
3. `agent-browser close` 已关闭其浏览器会话,无残留专属 Chrome 进程。
**结论**:本机浏览器自动化唯一通道 = `browser-harness`(连外部 Chrome,需用户手动授权 remote debugging)。
WorkBuddy 内置浏览器面板不可控(18488 端口无 CDP 端点),仅供人眼查看。
## 12:00 批次 34 + 35 连续跑完(响应「为什么不立即执行」)
**背景**:用户要求「立即跑满 3 批」补齐一次触发=3 批的验证(批次 33/34/35)。
### 批次 34(食材极致第 2 轮)
- 取批 `--target 食材极致 5` → `26751`(整只乳猪明火烤) / `27857`(活体花椒蟹+帝王蟹解剖) / `33066`(波龙砸小龙虾) / `28261`(预判分餐+虎口夺食) / `25150`(雪花金冠啤酒软广)
- 15 卡 → 导入 15/15 → 检索 15/15 ✅(0.657–0.835)→ 库内 495 → **510**,`食材极致` 3 → 7
### 批次 35(预见式服务)
- 取批 `--target 预见式服务 5` → `28372`(服务员不能坐着) / `24673`(幸存者偏差) / `28013`(挤笑服务) / `20533`(Ktv疯波 385s) / `30714`(不同剧里的店员)
- **16 卡** → 导入 16/16 → 检索 16/16 ✅(0.716–0.848)→ 库内 510 → **526**
- 覆盖变化:`预见式服务 6 → 9`(+3) / `反差 137 → 145`(+8) / `价值观冲击 85 → 88` / `反常识 113 → 114` / `自嘲反差 36 → 37`
### ⛔ 本批重大踩坑(治本记录)
**坑 1:`事件标签` 行的主标签必须写 12 维闭集标签,不能写自造事件名。**
- 批次 35 首版把 `事件标签` 写成 `` `当众打脸(主)` + `科班降维打击` `` —— **自造事件名当主标签** → `5_tag_coverage.py` 正则按闭集匹配失效、覆盖数字纹丝不动。
- 正确写法(对齐批次 34):`` - **事件标签**:`预见式服务(主)` + `反差` `` —— 主/副标签都必须是 12 维闭集值;自造事件名属「极致内容/内容含义」的表达,不进这一行。
- 判据:写完后立刻用 `5_tag_coverage.py` 复检,**数字必须动**,不动就是标签没写对。
**坑 2:卡片正文必须包在 ```` ```text ```` 围栏内**,否则 `2_import_batch.py` 报「卡片 0 张」。
- 首版 35 的 md 卡片只有 `### 标题` + 字段列表、没包围栏 → 解析出 0 张。规范格式:每卡独占一个 ` ```text ` 围栏,内部 `### 名称` + `> 所属库:横切未定` + `# ── 内容层 N ──` + `- **字段**:值`。
**坑 3(新发现,务必记牢):删 FAQ 条目的正确端点**
- ❌ `DELETE /faq/entries/{id}` → **404 page not found**
- ❌ `POST /knowledge-bases/{KB}/faq/entries/delete` → 404
- ✅ **`DELETE /knowledge-bases/{KB}/faq/entries`**,body `{"ids": [int64, ...]}` → `{"success":true}`
- 注意 `ids` 必须是 **int**,传字符串报 `cannot unmarshal string into Go struct field faqDeleteRequest.ids of type int64`。
### 其他
- `3_done_batch.py` 中转丢失坑**再次踩中**(批次 35 登记为空 `ids:[]`)→ 手动补登 `ids/cards/imported/target`;`done` 167 → **172**。
- 临时脚本 `_gen_spec35.py` 已删。
- 累计:**35 批 / 172 条视频 / 526 卡**入库。
## 12:00 agent-browser 彻底卸载(用户选 B 方案)
**决策**:用户选 B —— 彻底删除 agent-browser(73MB),而非仅用规则约束。
**关键更正**:卸载前核实发现**此前判断有误** ——
- 曾据 `C:/Users/maidou/.agent-browser/dsh3.version` = 0.27.0 推断「dsh = agent-browser 提供」,**错**。
- 真实入口:`dsh` → `node_modules\@deepseek-ai\dsh\lib\bin.js`(独立包);
`agent-browser` → `node_modules\agent-browser`(另一独立包,package.json 的 bin 只有 `agent-browser`)。
- **二者完全无关**。`.agent-browser\` 目录里是 **dsh 自己的**运行时数据(不可删)。
→ 教训:**靠文件名/版本号巧合推断依赖关系不可靠,必须读真实入口脚本与 package.json。**
**执行**:
1. 备份入口脚本 ×3 + 重装说明 → 桌面 `agent-browser-备份-20260928/`
2. Node 递归删除:包目录(73MB)+ `agent-browser{,.cmd,.ps1}`
3. 验证:命令消失 ✓、包目录消失 ✓、**dsh 命令与包完好** ✓
4. 剩余全局包:`@deepseek-ai` / `npm` / `pnpm`
5. 规则文件同步更新(标注已卸载 + dsh 无关警告)
## 12:10 doubao-seed-2-1-pro 卡片润色可行性验证(成功)
**问题**:能否用 doubao-seed-2-1-pro 润色提炼素材卡片?
**结论**:✅ 可行,且已验证「只润极致相关内容、闭集标签零损伤」。
### 关键事实(新增)
- **doubao-seed-2-1-pro 是 WorkBuddy 企业可选模型**,无需自配 key/endpoint——直接通过 `Agent` 工具的 `model: "doubao-seed-2-1-pro"` 参数调用即可(本机无 ARK/VOLC 凭据,也无需)。
- 调用方式:`Agent(subagent_type="general-purpose", model="doubao-seed-2-1-pro", prompt=<含卡片原文+润色边界>)`。
### 已验证的润色协议(两次试跑均通过)
- **可润 6 字段**:`极致内容` / `内容含义` / `极致触点` / `创作手法` / `镜头语言` / `画面风格`
- **逐字锁定 4 字段(程序化核验)**:`事件标签`(12 维闭集)/ `极致类型` / `复用场景` / `适用场景` —— 实测逐字一致 ✅
- **结构约束全部守住**:`内容含义` 的 `[期待A]—被「X」打破→[结果B]`、`创作手法` 开头的 `铺垫量级 …(>10s/≤3s)`、`极致触点` 的 `用户心理 = …;共鸣 = …` 双段
- **事实零损伤**:数字(3万/三万零)、专名(人头马/牛头人)全部保留
- **无元规则词外露**
### 润色实际收益(样本观感)
- 去冗余明显:`极致内容` 156→135 字(短卡),`创作手法` 55→44 字
- 语言更「上手」:如「像替所有人出了一口气」→「像替所有人扇了那一下」;「礼貌在现实里常常只是压着怒火的遮羞布」→「嘴上再客气,怒火也早压在手上了」
- 长卡(20533-3)改动更克制,主要是去重复词与紧节奏
### 未落地(待用户决定)
- 本轮**只做验证,未接进流水线、未回炉任何已入库卡片**。
- 若要落机制,有两个口子:① 流水线加一道(批次 36+ 新卡先润后导);② 历史 526 卡批量回炉(需删条目重导)。
## 12:30 素材卡回炉链路建设(用户决策 A2+B2:全字段润色 + 历史 526 卡回炉)
**背景**:用户选定润色落地方式 = A2(全字段润色,含极致内容)+ B2(历史 526 卡回炉)。
本段先按要求「**先跑样本验证链路 → 再全量**」,已完成样本验证。
### 1. 数据现况核对(重要修正)
| 项 | 值 | 说明 |
|:--|:--|:--|
| 库内真实条数 | **526** | 一次拉全验证 unique=526 ✅ |
| 本地 md 批次文件 | 34 个 | **缺 `batch_0030.md`**(库内卡片健在,`out/import_batch_0030.txt` 也不存在) |
| state 累加 cards | 511 | 不可靠:批次 29 记 0、批次 30 缺记录 |
| 单条结构 | `id`/`standard_question`/`similar_questions`/`negative_questions`/`answers[0]` | 卡片全文在 `answers[0]` |
### 2. ⛔ 新踩坑:FAQ 列表分页抖动(已写 RUNBOOK 红线 11)
`page_size=100` 时页边界条目**被返回两次**:两次全量拉取都得到 `n=526 / unique=519`,
且重复 id 会飘(一遍 464/465,另一遍 469/470)——**是排序不稳定,不是库内真重复**。
**解法**:先 `page_size=1` 拿 total,再 `page_size={total}` **一次拉全** → unique==total。
另:`total` 在 `data.total` 里(不在顶层,红线 12)。
### 3. ⭐⭐ 核心发现:提示词「约束强度」决定成败
同批 16 卡、同模型,只改约束:
| 指标 | 严约束(堆禁止) | 宽约束(明确目标+只保3类信息) |
|:--|--:|--:|
| 字段改动率 | **1%** | **46%** |
| 卡片改动率 | 6% | **100%** |
| 总字数 | +0.0% | **−3.4%** |
| 丢角色台词 | 0 | **0** ✅ |
| 丢数字 | 0 | **0** ✅ |
**规律**:堆禁令 → 模型退化成复读机(几乎不动);只说「大胆重写 + 只保动作/物品/数字/台词原话 + 目标压缩 10-25% + 已精炼则原样返回」 → 有效压缩且无损。
**分字段**:改动集中在描述性字段(极致内容/内容含义/极致触点),结构性字段(创作手法/镜头语言/画面风格)几乎不动。
### 4. 信息保真审计口径(含误报澄清)
脚本按「引号内内容 + 数字」抽取比对时,报「丢台词 5 处」**全是误报** ——
引号里除角色台词还有**描述性短语**(如「看硬汉秒变小丑」→「硬汉秒变小丑」只删虚词)。
**真判据**:角色台词(对白原话)零丢失 + 数字零丢失 + 可拍动作/物品全在。实测台词总数 113→114。
### 5. 新建脚本(tools/weknora-ingest/)
| 脚本 | 职责 |
|:--|:--|
| `8_backup_all.py` | 全量备份(回滚底座)→ `out/backup_all_YYYYMMDD_HHMM.json` |
| `9_polish_plan.py` | 按 id 稳定分组 → `out/polish_tasks/batch_XXXX.json`(33 批) |
| `10_polish_batch.py` | `payload <n>` 生成载荷 / `apply <n>` 三重校验+重建卡片 |
| `11_diff_report.py` | 量化对比 + 信息保真审计 |
**字段契约**:可润色 6(极致内容/内容含义/极致触点/创作手法/镜头语言/画面风格);**锁定 4**(事件标签/极致类型/复用场景/适用场景)。
**三重校验**:① 字段集合一致 ② 骨架完整(内容含义三段式 / 创作手法铺垫量级)③ 行数不变(只换值不破坏结构)。任一失败 → 该卡退回原文。
### 6. 备份底座
`out/backup_all_20260928_1215.json`(**526 条完整原样,2.0MB**)—— 回炉可随时回滚。
### 7. 状态
- ✅ 样本链路验证通过(16 接受 / 0 退回)
- ⏸ **全量 33 批回炉尚未执行**(等待用户确认约束强度与执行节奏)
- 交付:`out/polish_validation_report.md`(验证报告)
## 12:40 卡片回炉 v2(吸引力优先)批次 2-6 跑完
- 决策:用户选 A2+B2 → 最新口径「1=A(宽约束,重点看内容是否更短视频化/更有吸引力)2=A(分批跑,每5批停一次)」。
- 完成:批 2/3/4/5/6 共 **80 卡**,三重校验 **80 接受 / 0 退回**(批4有2张原样返回,属预期)。
- ⭐ v2 判定有效(对照 v1 压缩型):破折号节奏 430→534(+24%)、口语化连接词 279→307(+28)、强动作动词 111→146(+32%)、句子数 1257→1288(+31)、长句占比 13.1%→12.2%、总字数 +0.9%(不再压缩)。
- 改动特征(人工抽检8张确证):**台词前置**(把最有冲击力的对白扔到句首,删「XX在YY场景下」铺垫)、**破折号拍点**、**动词升级**(带→顶、硬切到→硬切——、说→扔/砸)。台词零丢失、数字零丢失。
- 升级:支持批号参数 + 跨批汇总(原来硬编码批1)。
- 报告:。
- 状态:已停在用户要求的「每5批停一次」节点,等放行批 7-11。
## 12:50 自动化补采 · 连续 3 批(36/37/38)跑完
**任务**:自动化 `c4d5eae8-e2ff-427a-99aa-d027d354bc19`(每小时 3 批),把 12 个极致标签补至每标签 ≥100 条主标签卡。
| 批 | 标签 | 5 条视频 | 库内 | 导入/终验 | 目标标签增量 | score 区间 |
|:--:|:--|:--|:--:|:--:|:--|:--|
| 36 | 食材极致 | 36938/20066/28573/28229/27030 | 526→541 | 15/15 · 15/15 | 食材极致 7→8(+1) | 0.79–0.89 |
| 37 | 品质对比 | 23085/23276/32132/17881/27116 | 541→556 | 15/15 · 15/15 | 品质对比 7→10(+3) | 0.79–0.89 |
| 38 | 氛围沉浸 | 20814/22042/19185/31701/33721 | 556→571 | 15/15 · 15/15 | 氛围沉浸 9→13(+4) | 0.819–0.904 |
**批次后体检**(卡片总数 560 / 源文件 38 个):反差 162 / 反常识 117 / 价值观冲击 90 / 视觉冲击 66 / 自嘲反差 41 / 细节专业 27 / 感官沉浸 15 / **氛围沉浸 13** / 预见式服务 11 / 品质对比 10 / 食材极致 8 / **难度极限 0**(用户决策不处理)。
**本次踩坑(第 3 次连发)**:`3_done_batch.py` 中转丢失 → 三批全部 `已登记:[]`。**判定规则确定:不同一次 shell 会话内完成「取批 → 收尾」→ 中转必丢**。三批均手动补登 `state.json`(done 172→177→182→187)。**自动化连跑场景下,收尾后必须无条件核对 `state.json` 末条 `ids`,不依赖中转。**
**关键结论**:
1. ⭐ `食材极致` **定向候选池已耗尽(剩余 0)**,须重建(`6_target_candidates.py`)。
2. ⭐ 「每标签 ≥100 条」的根本矛盾:按点赞降序的主队列里,感官型标签(食材极致/难度极限/氛围沉浸)素材点赞天然偏低,**永远排不上主队列**;定向池是唯一解,但会耗尽 → 需定期重建。
3. ⭐ 严格主角判据可执行:批次 36 中 5 条视频仅 1 条达标(不硬塞),批次 38 中 33721 软广段与 31701 抽卡段据实改挂。
4. 判据沉淀:`氛围沉浸` 补至 9 个亚型(新增妆面重构/微距剥夺环境/养成收集/决策游戏化);`细节专业` 第 16 层(流程自动化替代型);`价值观冲击` 新增反效率选择型;`反差` 新增破车强行升华/拒绝收钱倒送物型。
**新增文件**:`batches/batch_0036.md`、`batch_0036.spec.json`、`batch_0037.md`、`batch_0037.spec.json`、`batch_0038.md`、`batch_0038.spec.json`(RUNBOOK.md 已追加批 36/37/38 三条记录)。
## 14:30 自动化补采 · 连续 3 批(40/41/42)跑完 — 累计 42 批 / 库内 631 条
**任务**:自动化 `c4d5eae8-e2ff-427a-99aa-d027d354bc19`(每小时 3 批),本轮实际连跑 6 批(39 品质对比 / 40 预见式服务 / 41 氛围沉浸 / 42 感官沉浸),全部走 `--target` 定向补采。
| 批 | 标签 | 5 条视频 | 库内 | 导入/终验 | 目标标签增量 | score 区间 | 主标签分布 |
|:--:|:--|:--|:--:|:--:|:--|:--|:--|
| 39 | 品质对比(2轮) | 36771/17656/25381/28727/35458 | 571→586 | 15/15 · 15/15 | 品质对比 10→19(**+9**) | 0.82–0.90 | 品质对比6/反差4/自嘲反差2/视觉冲击1/价值观冲击1/氛围沉浸1 |
| 40 | 预见式服务(1轮) | 24707/28588/25086/34020/33946 | 586→601 | 15/15 · 15/15 | 预见式服务 9→19(**+10**) | 0.83–0.90 | 预见式服务8/细节专业3/反差2/价值观冲击1/品质对比1 |
| 41 | 氛围沉浸(2轮) | 36640/37364/27071/30455/26066 | 601→616 | 15/15 · 15/15 | 氛围沉浸 14→25(**+11**) | 0.834–0.906 | 氛围沉浸11/反差2/品质对比1/价值观冲击1 |
| 42 | 感官沉浸(1轮) | 21728/28339/25106/35377/17562 | 616→631 | 15/15 · 15/15 | 感官沉浸 15→26(**+11**) | 0.839–0.905 | 感官沉浸11/细节专业2/品质对比1/自嘲反差1 |
⭐ **定向批连跑 4 批、4 个标签全部 +9 以上**(+9/+10/+11/+11)——「`7_dispatch_next.py` 算缺口 → `--target` 定向取批」链路在连跑场景下稳定可复现。
**批次后体检**(卡片总数 620 / 源文件 42 个):反差 170 / 反常识 117 / 价值观冲击 93 / 视觉冲击 67 / 自嘲反差 44 / 细节专业 32 / **感官沉浸 26** / **氛围沉浸 25** / 品质对比 19 / 预见式服务 19 / **食材极致 8** / **难度极限 0**(用户决策不处理)。
✅ **中转丢失坑本轮 4 批全部未复发**(批次 39–42 输出均为 `已登记:[…] | 跳过:无`)——反证批次 36–38 的 `已登记:[]` 纯由跨会话中断导致。**结论:只要「取批 → 收尾」在同一次 shell 会话内完成并显式传 `--ids`,中转不丢。**
**关键结论**:
1. ⛔ **候选池告警**:`食材极致`(候选 0)、`预见式服务`(候选 3)定向池即将/已耗尽 → 下轮须先跑 `6_target_candidates.py` 重建候选池。
2. ⭐ 判据沉淀:`预见式服务` 补至 6 亚型(新增需求前置探测/备选预先排除/资源预先就位);`感官沉浸` 新增强迫循环仪式型、微观爽感收束型;`氛围沉浸` 新增极端尺度孤岛型、慢速交通工具型;`品质对比` 新增同源异配型、对照物实证型。
3. 弃卡纪律持续生效:不硬塞目标标签,据实改挂副标签。
**新增文件**:`batches/batch_0039.md`、`batch_0039.spec.json`、`batch_0040.md`、`batch_0040.spec.json`、`batch_0041.md`、`batch_0041.spec.json`、`batch_0042.md`、`batch_0042.spec.json`(RUNBOOK.md 已追加批 39–42 合并记录)。
---
## 16:30|素材卡召回能力实测(独立信息源实验,5 条样本)
**背景**:用户要求测「关键词怎么找、入库怎么拼、召回时怎么拼」。前两轮因查询源与卡片同源(语义泄漏)作废,本轮改用**视频原始画面/台词**做独立查询源。
**方法**:`state.json` 的 `batches[].ids` = 205 个 video_id;建立 `video_id → 该视频 3 张卡` 映射(`_exp_map.py`,覆盖 195 视频 / 585 卡)。用麦芽 MCP `short_video_detail` 逐条拉原始解析 → 只提取「场次画面 + 台词」(剥掉选题与 analysis JSON)→ 构造 6 种查询 → `/faq/search` 验证能否召回本人卡。
**踩坑**:MCP 返回体积 5万~20万字符/条,**未超限则不落盘**(只进上下文)→ 20 条会爆上下文。改为「分开获取」:每条拉完立即手工写成 `_exp_cache/raw_<id>.txt`(只存画面/台词部分)。本轮实际拉 5 条(33304/33295/26220/24868/24520)。
**结论 A(查询源怎么拼)**:
| 策略 | R@1 | 均分 |
|:--|:--|:--|
| V1 全量原文 / V5 截断800字 | 5/5 | **0.7187** |
| V2 画面+场次 / V3 仅画面 | 5/5 | 0.709 |
| V4 仅台词 | **3/5** | 0.6641 |
| V6 仅场次标记 | 2/4 | 0.6184 |
→ **画面信息 > 台词信息**;800 字截断即够;场次标记本身无效须与画面句合并。
**结论 B(检索时怎么拼)**:
| 问法 | R@1 | 第1-2名间隔 |
|:--|:--|:--|
| 纯口语需求 | 0.6986 | 0.0545(易误召) |
| +结构词 | 0.7169 | **0.1468** |
| +画面词 | 0.7135 | **0.1605** |
| +检索后缀句式 | 0.7326 | 0.1526 |
→ 纯口语可用但间隔小;**加结构词/画面词间隔拉大 3 倍**;关键词堆叠无效须成句。
**结论 C(入库问法存在两类分叉)**:
- 戏剧类(反差/反常识…):抽象结构问法「有没有「X」…用来…?」→ 召回 0.60-0.72
- 感官类(感官沉浸/食材/难度):具体事件描述+固定后缀「{事件} —— 这条素材里的极致事件具体是怎么呈现的?」→ 召回 **0.76-0.85**(补测 4 条:0.8124/0.7648/0.8168/0.8509,间隔 0.22-0.25)
- ⚠️ 两类问法定位不同,是否统一待决策。
**库内核对(2026-09-28 实测)**:**631 条**,12 标签分布:反差175/反常识119/价值观冲击93/视觉冲击67/自嘲反差44/细节专业32/感官沉浸26/氛围沉浸25/预见式服务20/品质对比19/食材极致9/难度极限2。
→ 修正记忆:`难度极限`/`食材极致` **非 0**(记忆有误);`{video_id}-{序号}|` 前缀仅 75 条(集中在感官类批次)。
**产物**:`素材卡召回能力实测报告_V1.0_20260928.md`(根目录)+ `_exp_cache/`(含 map.json、5 条 raw、result4.json)。
**待办**:结论是否写入 RUNBOOK(待确认)|入库问法是否统一|感官类扩测(共62条仅测4)|清理 `_exp_*.py` 与 `_exp_cache/`。
## 14:50 调度对齐:补采任务切「暂存模式」+ 口径升级 v2(防返工)
**背景**:回炉(526 条 / 33 批 / 删旧重导)与定向补采(每小时 3 批 / 15 卡批)写**同一个 KB**,用户指示「先把现有计划任务按方案调整,避免返工」。
**决策(用户选 A+ 双改)**:
- 补采任务临时切 **暂存模式**:只产 md/spec/meta → `batches/pending_import/`,**禁跑 2_import_batch.py / 3_done_batch.py,禁改 state.json**。
- 补采卡片写作口径**同步升级 v2「吸引力优先」**(台词前置 / 强化动词 / 口语化破折号 / 抽象落地 / 保留钩子)→ 新卡天生新口径。
- 回炉完成后统一入库:新增脚本 `13_import_pending.py --dry | --run | --sync`。
**执行动作**:
- `automation_update(update, id=c4d5eae8-e2ff-427a-99aa-d027d354bc19)`:name 加后缀「暂存模式」,prompt 重写(暂存模式说明段 + v2 口径段 + 第5步改为暂存自检 + 第6步只读体检 + 汇报口径改暂存文件路径)。
- 新建 `batches/pending_import/` 目录 + `13_import_pending.py`(discover/precheck/import_one/register_state,导入幂等、按批号补登 state)。
- RUNBOOK §2.5 补「回炉窗口期 · 补采暂存模式」小节(三类冲突 + 窗口期规则)。
**关键安全结论**:回炉删除按 `polish_plan.json` 冻结的 526 id 执行 → **新采卡不会被误删**;唯一真风险是「回炉期间重跑 9_polish_plan.py 会让计划漂移」,已在 RUNBOOK 写明禁止。
**回炉节奏**:用户选「分批跑,每 5 批停一次复核」(延续现状,批 1-6 已完成 96 卡)。
---
## 15:05|实验结论落地 RUNBOOK + 工具正式化
**写入运行手册**(`tools/weknora-ingest/RUNBOOK.md`):
- 新增 **§2.4 检索与召回最佳实践**(结论 A/B/C + 库内核对 + 复测工具说明),插入位置 = 红线区之后、§2.5 之前。
- 红线区新增 **13**(`vector_threshold=0.0` 被当未设置 → 返回 0 条,低阈值请写 0.1)、**14**(`/faq/search` 查询 <40 字报 HTTP 400,需最短长度保护)。
- 步骤 6 修正:「similar_questions 是唯一召回杠杆」→ 补「检索侧同样有杠杆(画面描述+结构词,区分度 ×3)」。
- 步骤 7 补交叉引用(终验查询拼法见 §2.4 结论 B)。
**工具正式化**(`_exp_*` → `13_recall_*`,作废轮产物已删):
| 脚本 | 作用 |
|:--|:--|
| `13_recall_map.py` | state.json + spec.json → `video_id→卡片` 映射(195 视频/585 卡) |
| `13_recall_parse.py` | 从落盘原文只提「场次画面+台词」 |
| `13_recall_bench.py` | 6 策略 × 样本跑 /faq/search,`--dry` 只打印 |
| `13_recall_summary.py` | 汇总 R@1/R@3/均分 |
缓存目录 `recall_cache/`(map.json + 5 条 raw + recall_result.json)。
**踩坑补充进 RUNBOOK**:MCP `short_video_detail` 返回 5万~20万字符/条,**未超限不落盘**(只进上下文)→ 必须逐条拉、拉完立即落 `recall_cache/raw_{id}.txt`。
**仍未决**(留给用户):① 入库问法是否统一(戏剧类抽象问法 vs 感官类具体事件问法);② 感官类扩测(62 条仅测 4);③ 75 条编号前缀是否保留。
---
## 17:10|任务1-3 全量完成:5 形态定论 + 感官类 100% + 编号前缀评估
**背景**:承接 15:05 的三项未决,用户给出「1、各类别不相同吧 2、继续测试 3、先评估」。
### 任务 1「各类别不相同吧」—— 结论 C 被推翻并深化
用户判断正确:原「戏剧类 vs 感官类」**两类分叉**表述过粗。新建 `14_form_audit.py` 精确统计全库 631 条:
| 形态 | 条数 | 占比 |
|:--|--:|--:|
| F3 需求壳句 `有没有「…」?` | 318 | 50.4% |
| F4 白描事件陈述(无问壳) | 202 | 32.0% |
| F1 编号+呈现后缀 | 75 | 11.9% |
| F2 事件+复用后缀 | 30 | 4.8% |
| F5 结论判据式 | 6 | 1.0% |
**关键发现**:形态与标签**不一一对应**(`视觉冲击` 67 条含 4 种形态);真实决定因素 = **批次模板时代**(F1=后期补采批次,F3/F4=早期批次)。→ 75 条编号前缀**只出现在 F1 型**(原猜"集中在感官类"被推翻)。
### 任务 2「继续测试」—— 感官类全量扩测
`15_sensory_recall.py` 对 6 个感官标签全量 101 卡测 3 种查询形态:
| 查询 | n | R@1 | 均分 |
|:--|--:|:--:|--:|
| 仅事件名 | 97 | **97** | 0.7739 |
| +意图句 | 97 | **97** | 0.7727 |
| +结构词 | 97 | **97** | 0.7809 |
→ **R@1 = 100%,且加词无增益** —— 与戏剧类(补词后间隔 ×2.7)**结论相反**。原因:F1 型问法本身即完整事件描述,查询信息量已饱和。
→ 4 条无效查询卡(`找一条低成本做出硬菜的极致美食事件素材` 型,无「」事件名)已剔除,属**入库模板缺陷非检索问题**。
**期间修 3 个脚本 bug**:① 壳句污染事件名 → 加 `extract_name()` 剥壳(对 97 条壳句全部成功,证明模板规则化);② `if not name:` 后漏 `continue` → `NoneType + str` TypeError;③ 短事件名判定阈值 `len<8`。
### 任务 3「先评估」—— 75 条编号前缀
**结论:建议保留,不必清理。** 五判据:
1. 纯语义查询(不含编号)仍 R@1 命中带前缀卡(0.7471)→ **未稀释语义**
2. 单搜纯编号 `25106`/`21728` → **返回空** → **无同源污染**
3. 带前缀均分 0.7984 vs 不带 0.7650 → **无负作用**(差值来自批次)
4. 编号在 sq 与 answers 双写 → 冗余但不影响召回
5. ⚠️ **唯一实际影响 = 展示层**:列表前缀占前 6 字符
→ 建议「**保留入库 + UI 展示时前端剥离**」,而非删库(删库丧失溯源,且需 75 次 DELETE+重导,有召回波动风险)。
### 落盘
- RUNBOOK §2.4:方法论头改样本规模、**③ 结论 C 整体重写为 5 形态版**(含③-b 感官扩测 / ③-c 无效卡)、④ 附带事实补编号评估结论、⑤ 工具表 4→6 个(补 `14`/`15`)。
- `素材卡召回能力实测报告_V1.0_20260928.md`:第四节整体重写、五节更新、六节待办勾选、**新增第八节编号前缀专项评估**、七节总结重写。
---
## 自动化补采(每小时3批)· 第 7 轮 · 2026-09-28 15:3x · 【暂存模式】(3 批未入库)
> 处于全量卡片回炉窗口期,本 3 批**只产 pending_import,未入库**;禁跑 `2_import_batch.py` / `3_done_batch.py`、禁改 `state.json`。
| 批次 | 取批标签 | ids | 出卡 | 主标签分布 | 状态 |
|:--:|:--|:--|:--:|:--|:--|
| 43 | 反差 | 30189 / 23275 / 28562 / 35299 / 30376 | 15 | 反差 4 / 品质对比 3 / 细节专业 3 / 价值观冲击 3 / 自嘲反差 1 / 视觉冲击 1 | 暂存待导入 |
| 44 | 氛围沉浸 | 25166 / 27090 / 29927 / 29652 / 30240 | 15 | 氛围沉浸 4 / 反差 5 / 价值观冲击 2 / 细节专业 1 / 视觉冲击 1 / 自嘲反差 1 / 反常识 1 | 暂存待导入 |
| 45 | 感官沉浸 | 30466 / 25040 / 28345 / 37148 / 28743 | 15 | 感官沉浸 7 / 氛围沉浸 2 / 反差 2 / 视觉冲击 1 / 品质对比 1 / 反常识 1 / 细节专业 1 | 暂存待导入 |
**产出**:`tools/weknora-ingest/batches/pending_import/batch_004{3,4,5}.{md,spec.json,meta.json}`,合计 **45 张卡**。三批 mismatch 全为 0。
**预期目标标签增量**:反差 +4(已达标仍增)、氛围沉浸 +4、**感官沉浸 +7**(本轮最大增量)。
**关键结论**:
1. ⭐ 临时 py「md `###` 逐条比对 spec.card」连续 **27 批一次通过**,写法稳定。
2. ⭐ **感官沉浸 / 氛围沉浸 候选池仍是瓶颈**:感官候选 14(取 5 余 9)、氛围候选 23(取 5 余 18);`食材极致 0` / `预见式服务 3` 已耗尽 → **下轮先跑 `6_target_candidates.py` 重建候选池**。
3. ⭐ 本批新判据:感官沉浸新增 **听觉规格化型 / 微距痛觉型 / 分屏实证型**;氛围沉浸新增 **热介质包裹型 / 糊屏触觉型**(详见 RUNBOOK 批次 43–45 经验条)。
4. ⛔ **回炉完成后统一走 `13_import_pending.py --dry|--run|--sync` 导入**;`9_polish_plan.py` 已禁跑(会让 526 id 计划漂移)。
5. 库内读数未变:仍 **631 条 / 42 批**(`5_tag_coverage.py` 只读 `batches/`,不含 pending_import)。
---
## 补充:批 43–45 v3 双任务补做 + 校验器三处修复(2026-09-28 晚)
**背景**:批 43/44/45 是旧口径(薄壳句 std)产的暂存批,回炉窗口期内补做 v3 双任务(卡片吸引力优先 + 问法增厚)。
**结果**:批 43 → 15/0,问法 **+19 字**;批 44 → 15/0,**+11 字**;批 45 → 15/0,**+59 字**。sim/neg 条数不一致均 0,锁定字段改动 0,**实际编造 0 处**。
**⭐ 批 45 暴露并修掉 `10_polish_batch.py` 三个校验器缺陷(治本,影响全部后续批次)**:
1. **std 前缀校验过严**:批 45 原文 std **无前缀**,载荷示例提示了前缀写法 → 模型学样加前缀 → 原逻辑直接退回 15 张。**改为 autofix「原文无前缀则自动剥离」**(不再退回),前缀状态一律以原文为准。`validate()` 返回值扩为 **5 元组**(新增 `autofix` 列表),两处调用点同步更新。
2. **编造粗筛引号字符类不全**:原文弯引号 `“”` vs 问法直引号 `""` → 正则只匹配直引号 → **11 张系统性误报**。改为同时匹配 `" ' 「 『 “ ”`。
3. **编造粗筛对「引语节选」误报**:模型略缩引语(删语气助词「哈/呢/啊」与逗号)→ 严格子串失败 → 再误报 5 张。改为**归一化比对**(剥引号 + 去标点空白 + 去语气助词 `_norm`)。
- 收敛:**11 → 5 → 1 张**,末 1 张经人工核实仍是误报(问法省略了引语中间一句)。**残留局限**:中间省略型节选 + 形容词类编造,机器仍判不了 → 须人工抽检。
- **PROMPT_polish_v3.md 同步**:标准问前缀指引改为显式「**原文无前缀的绝对不要加**」(此前示例写得像必须加,是误加诱因)。
**批 45 数据**:`30466`/`25040`/`28345`/`37148`/`28743` → 15 卡,`std 34.8 → 93.8 字`(+59),std 从薄壳句增厚为完整事件描述。
**已清理**:`out/_pb43/44/45.txt`、`out/_p1~p16.txt`、`out/_batch7_orig.txt`、`out/_raw15.txt`、`out/_p14.err/_p16.err`、`out/_pb43_rewrite.json`、`out/_pb44.err`、`_fix_json.py`、`_round3_stat.py`、`_exp_parse.py`、`_gen_spec34.py`(保留 `out/2_import.txt`)。
---
## 17:40|技能 WeKnora 调用方式优化(基于召回实测)
**起因**:用户「短视频脚本创作技能 调用 weknora 知识库的方式需要优化,参考素材库召回测试看看有什么好的方案」。
### 实测发现的真问题(3 处,其中 2 处是长期静默失效)
1. ⛔⛔ **数量参数名是 `match_count`,不是 `top_k`**:`top_k/limit/size/count/k/topK=3` → **一律静默返回 10 条**;`match_count=3` → 真的 3 条。**技能文档写对了,但项目所有 Python 脚本写错**(`13_recall_bench.py`/`15_sensory_recall.py`/`16_question_fair.py`/`15_question_experiment.py`)→ 上下文成本是设计值 3.3 倍。**已修 2 个活跃脚本**。
2. ⛔ **`vector_threshold` 省略 ≠ 0.5**:省略时正常业务 query **直接返回 0 条**。「必须显式传」这条规范是对的,补了依据。
3. ⚠️ **问法定位偏差**:原「镜像式五要素问法」(`找一条 {落差对象} {打破方式} {锚点} 的 {段落功能} 型事件素材`)与库内 82.4% 的 F3/F4 型卡片**语域不同构**。
### 优化方案(已落地)
- **问法主体改为「情境化事件陈述」**:`{谁} 在 {什么处境} 下 {做了什么具体动作},结果 {发生了什么}` —— 与卡片正文(描述画面里发生了什么)语域同构。
- 原「结构词/画面词加成」降为**补充写法**(仅明确结构诉求时追加)。
- **新增认知修正**:分数与间隔**不可判优**(top1~top10 首尾仅差 0.047,第1-2名间隔常 0.00~0.03)→ 必须**人工复筛落差结构同构性**;阈值只做事后过滤(0.1~0.5 命中数相同,≥0.65 才截断),**不能提升质量**。
- 数据勘误:库存 450+→**631**;赛道 77.5%→**72.6%**;感官向 12 标签**均已补齐**(难度极限/食材极致 0→2/9)。
### 改动文件(技能侧)
`references/接口调用/WeKnora_极致事件检索.md`(§二参数表 / §三问法整体重写 / §六 / §七新增 7.1 机制实测 + 7.2 限制)、`references/创作流程/7_生成短视频大纲.md`(调用要点 5 条)、`references/索引_知识素材库.md`、`SKILL.md`、`references-add/变更日志.md`(追加 09-28 条)。
### 验证
新问法实测 `match_count=3` 生效;「服务预见」案例精准命中同语义簇 3 卡(提前备茶/提前送咖啡/提前备方案)。
### 待用户决策(未动)
F3/F4 型占 82.4%(早期批次),**是否批量回炉改造成 F1 型模板**——改造后查询无需补词即 100% 召回,但需走 §2.5 回炉链路且有召回波动风险。
### ⚠️ 引擎侧遗留
`.dsh` 只读副本、`Lite1.0` 需按流程评估是否同步(**未动,待用户授权**)。
---
## 18:00|⚠️ 问法改写有效性验证 —— 结论推翻,已如实修正
**用户要求**:「先确定改动是否有效」。做了双法验证,**结果不支持「问法改写更优」**。
### 验证 1 · 需求法(`18_question_validate.py`)—— ❌ 方法本身有缺陷
用 5 个编导真实节点,新旧问法各取 top3:
| 节点 | 旧命中 | 新命中 |
|:--|--:|--:|
| 顾客刁难后反杀 | 0 | 0 |
| 服务预见 | 1 | 1 |
| 品质被质疑验货 | 0 | 0 |
| 开场身份反差 | 0 | 0 |
| 食材难度极限 | 0 | 1 |
| **合计** | **1** | **2** |
→ **3/5 节点两法都 0 命中**。说明此法测的是「**库内有没有这个素材**」,混杂了变量,**不能用来验证问法**。
### 验证 2 · 反查法(`18b_question_validate_r.py`)—— ✅ 唯一能隔离变量的方法
取库内**确实存在**的 35 卡(12 标签各 3 条)→ 两种问法表达同一事件 → 看能否召回自身:
| | 旧问法 | 新问法 |
|:--|--:|--:|
| R@1 | **34/35(97.1%)** | **35/35(100%)** |
| R@3 | 35/35 | 35/35 |
→ **差异在噪声范围内**。事件信息足够时,两种写法都能召回。
### 📌 修正后的定性(已写入技能文档)
| 改动 | 有效性 | 证据 |
|:--|:--|:--|
| ✅ **参数纠正**(`match_count` / 显式阈值) | **确定有效** | 同 query 返回体积 **32122→10087 字符,省 69%**;省略阈值→0 条 |
| ⚠️ **问法改写** | **收益有限** | 反查法 97.1% vs 100%,噪声级。价值 = **信息量保障**(防空心 query),**不是提升召回率** |
⛔ **已明令禁止宣称**「新问法把召回率从 97% 提到 100%」——那是噪声,且反查法自然上限本就 100%。
### 🔴 最关键的发现
**真实瓶颈 = 素材覆盖,不是检索技术**。需求法暴露 3/5 真实节点零命中 → **问法再优化也召不回不存在的素材**。
### 方法论沉淀(已写入 RUNBOOK §2.4 ⑤-b)
- ⛔ 不用「凭空需求」测检索优化(混杂「库内有无素材」变量 → 得错误结论)
- ✅ 必须用「反查法」(拿库内确有条目反查),才能隔离单一变量
### 落盘
- `WeKnora_极致事件检索.md`:§三 补「勿高估问法收益」警示框、示例对照改为「写法A vs 写法B」、§7.1 重构为 **A 确定性收益(参数)/ B 噪声级差异(问法)/ C 认知修正** 三级、§7.2 补「真实瓶颈=素材覆盖」。
- `7_生成短视频大纲.md`:问法要点补实测边界。
- `RUNBOOK.md` §2.4 ⑤ 工具表 6→8 个(补 `18_`/`18b_`)+ 新增 **⑤-b 问法改写有效性验证结论**。
- `变更日志.md`:初版条目已合并入「已验证」条目,避免重复。
- `SKILL.md` frontmatter `last_change` 重写为已验证版。
### 暂存批 47(氛围沉浸 · v3 双任务)已收尾
- 取批 `1_next_batch.py --target 氛围沉浸 5`(候选池 23)→ ids `20611/20385/35345/34032/28468`。
- 15 张卡(主标签:氛围沉浸 13 / 反差 1 / 品质对比 1),产物 `batches/pending_import/batch_0047.{md,spec.json,meta.json}`,**未入库**(回炉窗口期)。
- v3 校验回路:`build-pending 47` → doubao-seed-2-1-pro 喂 `PROMPT_polish_v3.md`+载荷 → 存 `out/polish_result/pending_0047.json` → `apply-pending 47` = **接受 15/退回 0,问法平均 +25 字**(源 std 50–55 字,薄壳句,增厚空间充足)。编造粗筛告警 0。人抽 3 卡(20611-1 / 35345-3 / 28468-3)通过:锁定字段不动、台词原话保留、数字零丢失。
- ⭐ 与批 46(源问法已 133–210 字 → 平均 −1 字)构成 v3 增厚效果正反向对照:**增厚只对薄壳句源问法有正向空间**。
- 已追加 RUNBOOK 批次 47 记录。下一步:批 48(感官沉浸,候选池 14)。
---
## 18:30|🔴 端到端实测:工作台 AI 创作里素材召回**根本没被调用**(S7 被合法跳过)
**起因**:用户「就是用工作台脚本生成的过程,看调用素材召回的效果」。→ 从工作台真实跑一遍创作,追踪执行记录。
### 方法(新建 `tools/weknora-ingest/20_trace_recall.py`)
- ⭐ **会话记录存储位置(本次摸清)**:`<WORKBUDDY_CONFIG_DIR>/projects/<cwd转义名>/<sessionId>.jsonl`,
即 `D:/.workbuddy/projects/d-AI技能-mcn-short-video-project-短视频脚本创作-V1.0-mcn-work-shop/*.jsonl`。
每行一个事件:`session-meta` / `message` / `function_call` / `function_call_result` / `file-history-snapshot`。
⚠️ 消息正文**不在** `workbuddy.db`(该库只有 sessions/automations 元数据)→ 必须读 JSONL。
- 提交任务:POST `/api/run`(`name='测试·俊希买鱼脚本(素材召回验证)'`,account=俊希,Vlog 60s,需求含"指出鱼不新鲜")。
### ⭐ 结果:**S1-S11 全跑完,`hybrid_search` 调用 0 次**
```
工具调用次数:Bash 19 / Read 13 / TaskUpdate 7 / TaskCreate 4 / Write 2 / Edit 2 / Skill 1 / present_files 1
[!] 未发现任何素材召回(hybrid_search)调用
```
- 模型**读了** `7_生成短视频大纲.md`(S7 规范,第 55 行),也朗读了"S6 框架 → 大纲"(第 80 行),
**然后第 87 行直接 Write 脚本正文** —— 中间零检索。
- 产物 `Desktop/MCNSkillProjects/俊希/脚本06/09_脚本正文.md`:脚本质量本身 OK(人设/五字段/口播自然),
但**全程无任何素材库注入**,完全从零推断。
### 🔴 根因:规范给了一个几乎必然成立的「跳过条件」
`7_生成短视频大纲.md` §节点状态表:
```
| 已能写出具体桥段 | **跳过检索**(不调用) | ← 模型读到这条,判断"我能写" → 合法跳过
| 写不出桥段 | 按下述契约检索 |
```
- **任何能写脚本的模型,看到具体需求都会认为"我能写出来"** → S7 永不被触发。
- 这不是模型偷懒,而是**规范设计的漏洞**:跳过条件是自评的、开放的,无外部可验证判据。
### 对照:MCP 通道本身完全正常
本机实测 `mcp__weknora__hybrid_search(kb_id='MCN极致事件素材库', match_count=3, vector_threshold=0.5)`
→ **精确返回 3 条**,参数名与阈值均正确生效。→ **问题不在检索能力,在"根本没发起检索"**。
### 结论(本轮定论)
⭐⭐ **在优化检索参数/问法之前,先要解决"检索压根不被调用"** —— 这是比 §2.4 所有结论更上游的问题。
- 已确认有效:参数(match_count/阈值)
- 收益有限:问法改写
- **从未生效:S7 本身**(本次新发现,优先级最高)
### 待决策
把「跳过检索」条件从**自评**改为**外部判据**,候选方向:
① 删除跳过条款(默认必检,但会增上下文成本);② 改为"涉及具体桥段且需细节填充时必须检索";
③ 改为按节点数强制下限(如 L2 节点 ≥1 次);④ 保留跳过但要求**在产出中标注"未检索"**以便审计。
### 落盘
- 新建 `tools/weknora-ingest/20_trace_recall.py`(可复用:`--all` 扫全部会话汇总召回调用)。
- 本条记忆。
### ⚠️ 遗留
- 验证用测试任务 `automation-1790585785553`(会话 `be7cb9a4`)+ 产出 `脚本06` 未清理。
- 工作台仍**没有**「素材召回测试」页面(用户已澄清:要的是"创作过程里看召回效果",非独立页面)。
## 17:2x|✅ 纯 UI 路径复现确认:S7 素材召回 4 会话累计 0 次(证据升级)
### 为什么再验一次
上一轮是**命令行** `POST /api/run` 触发。用户要求「用浏览器打开工作台 用实际案例来跑」
(并明确「不要去改别人的页面」「新建一个标签页就可以了」「重新开个浏览器把」)→
本轮改从**工作台浏览器 UI 真实走完完整创作链路**,排除「入口差异导致行为差异」的可能。
### 浏览器环境(本轮定版配方)
独立 Chrome 实例(**绝不动用户自己的 Chrome**):
```
chrome --remote-debugging-port=9444 --user-data-dir="D:/AI技能/mcn-short-video/.tmp-chrome-wb" \
--no-proxy-server --proxy-bypass-list="*" --new-window "http://127.0.0.1:8900/"
```
- 必须 `run_in_background: true`(`nohup &` 起的实例会被沙箱回收)。
- 必须 `--no-proxy-server`:用户 Chrome 走全局 Privoxy,`127.0.0.1:8900` 会被转发 → `500 Internal Privoxy Error`。
- browser-harness 调用前缀:`env -u HTTP_PROXY -u HTTPS_PROXY -u ALL_PROXY -u http_proxy -u https_proxy -u all_proxy -u NO_PROXY BU_CDP_URL=http://127.0.0.1:9444`
(helper 函数名 = `goto_url()` / `js()` / `capture_screenshot()`,**不是** `nav()` / `eval_js()` / `shot()`)
### UI 链路(8 步全跑通)
账号列表 → 俊希行「AI创作」→ 填需求「俊希菜市场指出鱼不新鲜」→ 发送 → AI 引导对话 →
选「剧情」→ 需求聊至 **8/8 已填** → 点 `#reqCreate` → **确认框** → 点 `button[data-ok]` → 落库。
⚠️ **两段式提交坑(本轮新发现)**:`#reqCreate` 只弹确认框(`data-pages.js:752`),
真正提交在确认框的 `button[data-ok]`(:775)→ 内部先 `POST /api/dsh/topic-save` 落选题,
再 `executeTask({prompt, skills:['短视频工作台']})`。**只点第一段 → 弹窗关不掉、任务不落库**。
### 结果
- 落库任务 `automation-1790587091698`(「创作指令」,17:18:11,skills=`["短视频工作台"]`)
- 执行完成(`ACCEPTED`),会话 `21e7492c`(976KB / 118 行)
```
工具调用:Bash 23 / Read 10 / TaskUpdate 6 / TaskCreate 4 / Skill 1 / Grep 1 / Write 1 / present_files 1
[!] 未发现任何素材召回(hybrid_search)调用
```
**⭐ 决定性证据 —— 模型自述原话(JSONL L90)**:
> "Now writing the S9 script (**中间步骤 S1-S8 已在上下文按序完成,自动模式后台静默**)"
→ **S1-S8 全部「脑内完成」,零工具落地**。不是「S7 单独被跳过」,是**整段中间步骤被跳过**。
### 全量汇总(`20_trace_recall.py --all`)
```
共 4 个会话;其中 0 个会话调用了素材召回;累计召回 0 次
21e7492c 工具 47 | 召回 0 | weknora提及 2 ← 本轮 UI 路径
be7cb9a4 工具 49 | 召回 0 | weknora提及 3 ← 上轮命令行路径
87936943 工具 69 | 召回 0 | weknora提及 0
c522f13d 工具 26 | 召回 0 | weknora提及 0
```
→ **191 次工具调用,0 次素材召回**;命令行与 UI **行为一致**,排除入口差异。
→ 「weknora提及」= 模型**读到**了 weknora 规范文本,但**未转化为调用**。
### 新增待决策:工作台侧也要改(E 方案)
`SKILL_HINT_CREATE` / `buildCreatePrompt()`(`data-pages.js:11 / :787`)**完全不含**
「WeKnora / 素材 / 检索 / 召回 / 极致事件 / hybrid_search」六个关键词(已验证全为 False)
→ 从工作台入口提交的任务,**prompt 里根本没有「要召回素材」这件事**。
→ 建议组合:**A(技能侧删自评跳过条款)+ E(工作台 prompt 显式点名 S7 素材召回)**。
→ 四个候选(A 删除跳过 / B 收紧为必检 / C 节点数下限 / D 保留但标注未检索)**单独都不够**。
### 落盘
- RUNBOOK §2.6 新增小节 **⑤ 纯 UI 路径复现**(含 8 步表 + 决定性证据 + 全量汇总 + 两段式提交坑),
原「待决策」改为 ⑥ 并补 E 方案。
- 产物:桌面 `MCNSkill项目/俊希/脚本07/09_脚本正文.md`(7359B,《30块!小学生踮脚指认隔夜鱼,把鱼摊老板说到哑巴口无言》),
已入库 `rewrite_log id=39`,关联 `topic_log id=1` 回填 `rewrite_id=39 / status=done`。
→ **脚本质量本身正常,但全程无素材库注入痕迹**(全从零推断)。
### ⚠️ 遗留(累加)
- 验证产物:`脚本06`(16:58)+ `脚本07`(17:20)+ 任务 `automation-1790585785553` / `automation-1790587091698` 未清理。
- Chrome 9444 实例 + `.tmp-chrome-wb/` 用户数据目录未清理。
## 17:35|⚠️ 口径纠偏(用户澄清):素材召回是「按需被取」,不是「流程必检」
### 用户原话
> 「之前确定的是流程不召回素材,是知识库根据需要去召回」
### 纠偏内容
我上一轮的结论「必须改(删除跳过条款 → 默认必检)」**方向错了**。
正确口径:**架构 = 流程不主动召回素材,知识库按需被取** —— 这是**设计意图,不该动**。
→ **重新判定**:`hybrid_search` 调用 0 次 **≠ 一定是 bug**。判据只有两条:
| 路径 | 判定 |
|:--|:--|
| 模型**真能写出桥段** → 跳过检索 | ✅ 符合设计,无需改 |
| 模型**写不出桥段**却仍不检索 | ❌ 才是 bug |
### 补验:这轮「跳过」到底合不合法(落地质量反证)
读 `脚本07/09_脚本正文.md`(90s 剧情),三个 L1 节点实际落地:
| L1 节点 | 实际桥段 | 含机制样本特征? |
|:--|:--|:--|
| 钩子型 0-8s | 小学生踮脚扒鱼缸、按鱼背验货 | ❌ 通用动作 |
| 留人型 26-46s | 看鳃→看眼→看尾,三指数 | ❌ 通用常识(网上随处可查) |
| 转粉型 62-80s | 老板服软送葱、"做人要实在" | ❌ 通用收口 |
**→ 三个 L1 全部停在"通用桥段",无一条有库内极致事件卡的"期待→打破"闭环强度。**
⚠️ **但这个反证本身也有漏洞**:这些桥段**语义上确实"能写出来"**
→ 模型判"跳过"在**规则字面下并不违规**。核心矛盾浮出:
> **规则只要求"写得出",不要求"写得够狠"** → 只要写出"不难看"的桥段就满足跳过条件。
> **落点从"要不要检索"变成"极致标准由谁把关"。**
### 修正后的待决策(不改架构)
真正要解的问题 = **"按需"的判据太软 → 模型永远判"不用查"(触发率 ≈ 0)**。
| # | 方向 | 推荐度 |
|:--:|:--|:--|
| **C1** ⭐ | **把自评改成外部可验证判据**:`已能写出**且**属"通用可替代"→跳过` / `写不出 **或** 属"账号专属·专业手法"→必须检索` | **首选** |
| C2 | 触发条件改为「不确定时先检」(默认翻转) | 可叠加 |
| C3 | 产出标注"素材来源:检索 N 条 / 未启用" | 仅可观测 |
| C4 | 工作台 `SKILL_HINT_CREATE` 补一句"按 S7 契约按需调用素材检索" | 辅助 |
| ~~A/B~~ | ~~删除跳过条款 / 改为必检~~ | ⛔ **作废** |
⭐ C1 的关键:**"通用 vs 专属"是外部可验证的**(看一眼桥段是否依赖本账号独有资源),
而 **"我能不能写出来"模型恒答"能"**。
### 落盘
- RUNBOOK §2.6 重写:① 加**口径纠偏块**(置顶)② ①②③ 措辞从"bug/漏洞"改为"设计意图 + 触发率"
③ 新增 **⑤ 落地质量反证** ④ 原「待决策」重写为 **⑦** 并**明确作废 A/B**,改推 C1
- 长期记忆 §4.3 条目**重写**(原"最上游问题/必须改"口径 → 修正为"触发率 + 判据太软")
- 教训(三层沉淀):
- **治本层**:待定(C1 需用户确认后才改技能文件,未动 `7_生成短视频大纲.md`)
- **失误层**:待补 `失误与规避记录.md` —— 「**数到 0 次调用就直接判定为 bug、跳过了"设计意图核对"这一步**」
- **记忆层**:本条 + MEMORY.md 修正
### 未做(等用户决策)
- `7_生成短视频大纲.md` 判据改写(C1)—— **未动**,等确认
- `.dsh` / `Lite1.0` 同步 —— 未动
## 17:40|⭐ 用户补充关键口径:素材库有**两个作用位**(补全全局理解)
### 用户原话
> 「素材库在流程中应该有两个作用,① 给事件填充素材 ② 给事件润色素材」
### 核实结果:两个作用位都**有规范**,但是**同一条链的上下游**
| # | 作用位 | 规范位置 |
|:--:|:--|:--|
| ① | 给事件**填空**(写不出桥段 → 取机制样本) | `7_生成短视频大纲.md` §极致触点素材检索(布位定完 → 事件展开前;按需触发) |
| ② | 给台词**润色**(治「台词概括化」→ 取原话/微反应/意外) | `9_生成短视频脚本.md` **L12**(输入:`{material_cards}`)+ **L101-113**(§3.1「台词毛边三档参考」) |
### ⭐ 关键发现:② 是 ① 的下游,**断链**
```
S7 作用位① 检索触发率 ≈ 0
↓ 输出 {material_cards}
S9 作用位② 输入恒为空 → 三档永远拿不到样本 → 退化为"凭感觉写台词"
```
- S9 L12 原文:`步骤7输出(可选):**素材注入 {material_cards}** —— S7「极致触点素材检索」复筛保留的卡片…`
→ **②的输入明确写着"来源:S7 检索",而 S7 从不检索**。
- ⚠️ 另一处细节:L12 标了「**(可选)**」→ 即使 ① 修好,若"可选"不改,②仍可能被跳过。
**这是独立于 ① 的第二处待决策点**。
### 落地印证(本轮 `脚本07` 台词三档对照)
| S9 实际台词 | 毛边三档应有 | 症状 |
|:--|:--|:--|
| 「小同学,早上六点刚从码头拉回来的,条条活蹦乱跳」 | **原话**(含语气词/方言/口误/半截话) | 书面·完整·无毛边 |
| 「脸上的笑僵了半下」 | **微反应**(具体身体部位+幅度) | 心理描写式 |
| 「我妈没舍得倒,自己吃了」 | **意外**(计划外打断) | 顺拐推进 |
→ 台词全部**整洁·书面·顺拐** = "无素材样本可参考"典型症状,与 ① 未触发**互相印证**。
### 待决策补全(新增作用位②选项)
| # | 方向 | 推荐 |
|:--:|:--|:--|
| **D1** ⭐ | **先把①修好,②自动恢复**(不改 S9 任何文字) | **首选**(改动最小、链路最顺) |
| D2 | 把 S9 L12 的「(可选)」改为**必需** | 仅在用户认为润色"必须有"时才做 |
| D3 | 三档加自检项(台词含 ≥N 处毛边) | 仅可观测 |
⚠️ **D1/D2 需用户取舍**:架构说"按需",D2 把润色定"必需",两者语义张力 →
**润色是"有素材就用、没有就算"(可选)还是"必须想办法要有"(必需)?**
### 落盘
- RUNBOOK §2.6 新增 **⑦ 素材库的两个作用位与「断链」**(含链路图 + 断链机制表 + 台词三档对照印证),
原「待决策」改 **⑧** 并补 D1/D2/D3 + D1/D2 取舍提醒。
- 长期记忆 §4.3 条目补入「两个作用位」段。
### 全链路质检(用户指令:检查自动任务与补跑批次的过程与结果)
- **结论:过程正确、结果符合预期**。
- 回炉:**批 1–30 全部完成,各 16 接受 / 0 退回**(480 卡);暂存批 43–47 回炉完成(各 15/0)。
累计 std 改写 **476 张**、净增字 **15130**。批 21 std 0 改动属正常(原文已够好,仅增厚 sim)。
- 自动任务(补采暂存):batch **43–48**,全 `mode=pending_import`,只写 `pending_import/`、
**未改 state.json**(mtime 停在 14:25,产物 15:31–17:02)→ 暂存模式合规 ✅。
- ⚠️ **发现 P1:批 43 与批 46 取材 ids 完全相同**(30189/23275/28562/35299/30376)。
**非复制**——同一批视频被拆两遍、各出 15 张不同桥段卡,且两批标签体系不一致
→ 入库后重复度偏高。根因 = 46 生成时 43 的 meta 未落地,暂存防重未生效。
建议入库前桥段级去重。
- ⭐ **编造告警 90 条 → 真实编造 0 处**(机器复筛 100% 可回溯本卡原文/问法)。
根因确认 = **第⑤类误报**(std 摘要短语进引号),已在 `10_polish_batch.py` docstring 116–118 行登记,
docstring 点名例子与批 19 实际告警一致。告警自批 17 起台阶上升 = v3 增厚副作用,非质量下降。
- ⚠️ 批 30 模型返回为 `polish` 嵌套结构,与脚本期望的 9 键平铺不符 → 本轮手工扁平化通过。
**建议 apply 内加自动扁平化兜底**(防后续批次再踩)。
- 其他:补采卡 sim/neg 条数不统一(2/2、3/2、3/3、6/2 混杂)→ 建议补采侧补条数规范。
- 产物:`out/audit_report_20260928.html`、`out/_audit_batches.json`。
---
## 2026-09-28 18:5x · 自动化补采批次 48–49(暂存模式 · 未入库)
- **批 48 收尾**(感官沉浸定向批,ids `17785,21927,28533,26795,26974`):发现 apply-pending 未完成 → 补跑 build+apply,**接受 15/退回 0 | 问法平均 +27 字**,md/spec 已回写。
- **批 49**(品质对比定向批,ids `23859,19397,20571,33216,22306`):15 卡,主标签 **15/15 落品质对比**。
- 产物:`batches/pending_import/batch_0049.{md,spec.json,meta.json}`(**暂存待导入**);ids 落 `B49_IDS.txt`。
- v3 回路:**接受 15/退回 0 | 问法改写 15 张 | 问法平均 +45 字**(3 批最大增幅)。
- 人抽 3 卡 std + 2 卡 sim 逐句溯源 → 编造 0 处;数字零丢失。
- ⚠️ **新踩坑(已记 RUNBOOK)**:卡片首字段误写 `**内容**`(漏「极致」)→ build-pending 报「md 卡片数(13) ≠ spec(15)」。
排查口诀:差值=2 且非围栏问题时,先 `grep '^- \*\*内容\*\*:'` 定位漏字段。
- 候选池:品质对比 13→余 8;氛围沉浸 23;感官沉浸 9;食材极致 0(须重建);预见式服务 3(须重建)。
- RUNBOOK.md 已追加批次 48、49 记录(标「暂存模式·未入库·v3」)。
---
## 2026-09-28 19:0x · 自动化补采批次 50–51(暂存模式 · 未入库)
- **批 50**(氛围沉浸定向批,ids `28420,26873,22171,30635,33641`):15 卡,主标签 **15/15 落氛围沉浸**。
- 产物:`batches/pending_import/batch_0050.{md,spec.json,meta.json}`(**暂存待导入**)。
- v3 回路:**接受 15/退回 0 | 问法平均 +4 字**(源 std 已 95–160 字,增厚空间有限)。
- 读 `out/polish_result/pending_0050.applied.json` 存证(跨会话中断后补跑,已闭环)。
- **批 51**(品质对比定向批,ids `20162,25218,33224,29661,26291`):15 卡,主标签 **15/15 落品质对比**;
`26291`(情感剧情 85s)**据实 0 卡**(无品质对比事件,已在 md 写弃卡说明)。
- 产物:`batches/pending_import/batch_0051.{md,spec.json,meta.json}`(**暂存待导入**);ids 落 `B51_IDS.txt`。
- v3 回路:**接受 15/退回 0 | 问法改写 14 张 | 问法平均 +45 字**(与批 49 并列最大增幅)。
- 编造粗筛告警 1 张 → **人抽检判定误报**:std 开头「」包的是「查询意图描述」而非台词引语,非真编造。
- ⚠️ **新踩坑(已记 RUNBOOK 批 51 经验)**:
1. 卡片首字段误写 `**内容性质**`(应为 `**极致内容**`)→ spec 生成报 `AssertionError: (15, 14)`;改回后通过(同类坑再现批 49)。
2. 「编造粗筛」告警新形态 = **std 意图描述段被当引语**(长度 >30 字且为事件整体概括 → 判误报)。
- 增厚梯度累计:批 46(−1)/47(+25)/49(+45)/50(+4)/51(+45)→ **源 std 中等厚度时稳定约 +45**。
- 候选池:品质对比 13→余 8;氛围沉浸 23;感官沉浸 14;细节专业 22;自嘲反差 43;视觉冲击 10;价值观冲击 11。
⛔ **食材极致 0、预见式服务 3 已耗尽 → 须先跑 `6_target_candidates.py` 重建候选池。**
- RUNBOOK.md 已追加批次 50、51 记录(标「暂存模式·未入库·v3」)。
---
## 2026-09-28 22:0x · 自动化补采批次 52 / 54 / 55(暂存模式 · 未入库 · v3)
⚠️ **本窗口仅完成 1 批(批 55)**,未达「连跑 3 批」目标 —— 详见文末「未完成说明」。
- **批 55**(氛围沉浸定向批,ids `36396,23225,20318,26470,28310`):15 卡。
- 标签分布:氛围沉浸 **12(主)** / 反差 1 / 视觉冲击 1 / 价值观冲击 1。
- 产物:`batches/pending_import/batch_0055.{md,spec.json,meta.json}`(**暂存待导入**);ids 落 `B55_IDS.txt`。
- 严格主角判据落地:`28310`(职场搞笑剧 83s,冲突由对白驱动、环境权重最低)只留 1 张氛围沉浸(市井餐馆底噪)+ 1 张价值观冲击,弃卡原因写入 md 头「弃卡说明」。
- v3 回路:**接受 15/退回 0**;std 均长 178.3 字(min 154/max 199),sim 恒 3、neg 恒 2,mismatch 0。
- 人工抽查 3 张(**1 / 11 / 13**):具象动作、物品、数字、台词全部可在卡片 6 字段溯源 → **无编造**。
- ⚠️ **重要口径修正(新增,已记 RUNBOOK §2.5)**:
`23225-3` 触发器「编造粗筛」告警 1 张 —— 引语「先去把猫安顿好」在卡片 6 字段无出处。
人工判定为 **v3.1 边界内的摘要式短语**(把「摸黑去小屋添粮换水」压成口语标签),非事实编造。
**同时发现该卡 `neg`(热粥/餐桌/草坪)在原文同样无出处** → 这是**负例应有的「不像」属性**。
∴ **修正口诀:`fiction_check` 对 `neg` 字段的告警默认忽略(负例本就写原文没有的画面);只有 `std`/`sim` 的告警需人工核。**
- ⚠️ **增厚退化现象确认**:「问法平均 +0 字」。原因是本批按 v3 口径**直写**,模型无新信息可搬 → 退化为「不缩水」校验。**这不是失败**;要验证增厚能力须拿 v2 旧口径批做基线(批 47/49/51 的 +25/+45/+45 即此类基线)。
- 候选池:氛围沉浸 23 → **余 18**;感官沉浸 14;细节专业 22;自嘲反差 43;视觉冲击 10;价值观冲击 11。
⛔ **食材极致 0、预见式服务 3 仍未重建 → 下一批第一件事是跑 `6_target_candidates.py`。**
- RUNBOOK.md 已追加批次 54、55 记录与「暂存批执行记录」表(标「暂存模式·未入库·v3」)。
### 未完成说明(诚实记录)
- 本次任务要求连跑 3 批(批 55/56/57),**实际只闭环 1 批(批 55)**。
- 批 56、57 均未开始:未取批、未拉解析、未产卡。
- 未发生任何入库写入、未改 `state.json`、未跑 `2_import_batch.py` / `3_done_batch.py`(暂存模式红线全程守住)。
- 剩余工作(下轮直接接续):批 56 建议目标 `感官沉浸`(候选 14),批 57 建议 `细节专业`(候选 22);
若要先补 `食材极致`,须先重建候选池。