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
This commit is contained in:
1 parent
6e4ce9441c
commit
d07049ecf1
198 files changed
+14781
-2639
No files matched your search
+128
@@ -161,3 +161,131 @@ S1/S2 产物文件名改名(01_需求拆分/拆解 → 01_需求理解/02_需
|
||||
4. **盘点类任务先确认扫描范围无遗漏**:首轮扫描脚本 `skipDirs` 里含 `references`,导致 24 处命中漏扫(53 → 77);扫完应交叉验证"跳过目录是否真的都该跳过"。
|
||||
5. **下判断前先读规则原文**:首轮汇报把 37 处"规范明确豁免的锚点"与 8 处"真违规"混为一谈,笼统说成"30 个文件写死旧路径",判断说重了。凡结论涉及"违规/不合规",必须先读对应规范文件、按规范分类后再下结论。
|
||||
|
||||
---
|
||||
|
||||
## #018 术语归并「看名称不看内容」+ 批量替换误吞沿革句(同类第 2 次)(2026-09-21)
|
||||
|
||||
素材库「极致维度」词表治理中连续暴露两个同源问题:**判据用错(看名称不看内容)** 与 **替换顺序用错(沿革句先写后被吞)**。
|
||||
|
||||
**问题 1:拿"名称相似"当"内容对应"。**
|
||||
发现词表外野生值「反差价值」后,给出候选处置「统一改名为『反差服务』」(因两词字面接近)。用户一句纠正定案:「**要看内容是否对应,不能只看类别名称**」。按内容逐条比对后结论反转——15 处「反差价值」**没有一处**与「反差服务」(定义="角色身份与**服务水准**的反差")内容对应,两者是**下位↔上位**关系,用下位词覆盖上位用法 = 内容错配,机械替换不成立。同批「细节洞察」也被错误地列为"可归入价值观冲击"(因"洞察/冲击"字面接近),实际二者一为**认知颠覆**、一为**情感共鸣**,方向相反。最终前者走「扩义更名」(反差服务→反差),后者判定为**跨维度错位登记**(机制属 `07_情绪共鸣`,标签却挂在素材库形态表),移除。
|
||||
|
||||
**问题 2:批量替换误吞刚写好的沿革句。**
|
||||
- **第 1 次同类**:改 `06_生活服务库_分块定义.md` 的「极致维度」可选值时本应**追加**新维度,却用整段替换把原「反差价值」覆盖掉(丢词),当场发现并修正为「反差价值/感官沉浸」。
|
||||
- **第 2 次同类**:对「反差服务」→「反差」用 `replace_all` 时,把同一批里**刚写好的沿革说明**「原「**反差服务**」为其服务场景特例」也一并吞掉,产出"原「**反差**」为其…"的**循环表述**(规划图.html、产品规划.md 各 1 处),靠残留扫描抓出后修回。
|
||||
|
||||
**规避与铁律:**
|
||||
1. **词表/术语归并前必须做「内容级比对」**:把两侧的**完整定义**(不是名称)摊开逐条比对,判定关系是「同义 / 下位↔上位 / 跨维度错位 / 真等价」,再决定归并方向。**名称字面接近不构成归并依据**;下位词不得覆盖上位用法。
|
||||
2. **野生值先验「有没有内容可比」**:若某取值只出现在枚举/字段结构/检查表里、**零实素材引用**,说明"无内容可比对"——这本身就是"词表缺项"的症状,处置方向应是「登记立维」或「移除并指明归属」,而不是硬塞进某个相近词。
|
||||
3. **「沿革/变更说明」句必须放在批量替换之后写**:或替换前先把沿革句中的旧词临时改为占位符(如 `{{OLD}}`),替换完再还原。**凡"原「X」""原名为 X""X → Y"这类历史引用语境,一律不参与 replace_all。**
|
||||
4. **replace_all 前先列出该词全部出现位置并逐行判定语义角色**(现值 / 历史引用 / 沿革说明),确认全部命中项都该替换才执行。
|
||||
5. **同类事故第 2 次 = 前置检查缺失**:单靠"当场发现并修回"不足以拦截,必须把检查前置到操作之前(本条 1-4)。
|
||||
|
||||
---
|
||||
|
||||
## #019 批量更名误吞沿革句(同类第 3 次)+ 扫描范围漏掉非 md 资源(2026-09-22)
|
||||
|
||||
通用维度两名字段更名(**「镜头维度」→「镜头语言」**、**「画面维度」→「画面风格」**,共 62 文件 / 629 处)中暴露两个问题:
|
||||
|
||||
**问题 1:先写沿革句、后重跑脚本 → 沿革句被二次吞掉(同类第 3 次)。**
|
||||
#018 铁律第 3 条要求「沿革句必须放在批量替换之后写」,本次**确实照做了**(先替换 → 再补沿革)。但补完沿革后**又重跑了一次脚本**(为把覆盖面从 `.md` 扩到 `.html`),这次重跑把沿革句里的旧名一并替换 —— `「镜头维度」→「镜头语言」` 被吞成 `「镜头语言」→「镜头语言」`,3 个 `00_通用维度_分块定义.md`(V1.0 / Lite1.0 / 规划态)全部中招,靠读回校验抓出后逐条修复。
|
||||
→ 结论:「**后写**」只解决了**顺序**问题,没解决**重入**问题。
|
||||
|
||||
**问题 2:扫描范围漏掉非 md 资源。**
|
||||
首轮盘点用 `glob=*.md`,只覆盖 markdown → 漏掉 `产品规划/短视频素材库规划图.html` 的 **34 处**引用。若不复查,会造成"md 已改、html 仍写旧名"的**静默不一致**。
|
||||
|
||||
**规避与铁律(在 #018 基础上增补):**
|
||||
1. **「沿革句后写」之外,必须加「写完不再跑脚本」**:批量脚本执行过之后,写沿革即视为**收尾动作**;后续若有补充替换需求,改为**逐条 Edit**,或让脚本**跳过含「原「X」」「X → Y」「更名/变更/沿革」等历史引用语境的整行**。
|
||||
2. **批量更名必须覆盖全部资源类型**:不止 `.md`,还含 `.html`(规划图 / 工作台页面)、`.js` / `.py`(脚本内字段名)、`.json`(配置)。盘点时用 `grep -rn` **不限扩展名**(改用排除目录过滤 `subskills` / `node_modules` / `.git` / `.workbuddy`),而非 `glob=*.md`。
|
||||
3. **改后复查必须"排除后确认为零"**:`grep` 旧词,**唯一允许的残留是沿革句**;出现其他位置即漏改。复查范围含全仓(含非 md)。
|
||||
4. **临时改名脚本用完即删**:留在 `tools/` 迟早被误重跑(本次事故正源于重跑),且脚本本身会吞沿革句。
|
||||
5. **更名规则要处理「合并省略写法」**:本仓存在 `镜头/画面维度`(省略前词的连写)这类写法,直接单词替换会产出 `镜头/画面风格` 这种**断词** → 须先替换 `镜头/画面` → `镜头语言/画面风格`,再替换单词;替换后还要反向 grep 是否产出 `…风格维度` 这类**冗余组合**(本次产出 13 处,已修)。
|
||||
|
||||
---
|
||||
|
||||
## #020 抖音视频列表抓取:harness 入口失效、标签页漂移、滚动容器类名过期(2026-09-24)
|
||||
|
||||
任务:获取俊希最新视频(mcn-dou-analysis 功能二)。**数据抓取成功**(138 条 / 新增 2 条 / 字段零缺失),但过程暴露 3 个环境与规范问题。
|
||||
|
||||
**问题 1:`browser-harness.exe` 入口失效(exit=1,零输出)。**
|
||||
技能规范给的 `envs/browser-harness/Scripts/browser-harness.exe` 跑起来**不输出任何内容且 exit=1**(`--help` / `--version` 同样完全静默)。典型症状:venv 被复制/迁移后 exe launcher 内嵌的 python 路径失效。
|
||||
→ **可用入口 = venv python 直调模块**(`python run.py` 会报 `attempted relative import with no known parent package`,**必须走 `-m`**):
|
||||
```bash
|
||||
BH_PY="<技能>/subskills/browser-harness/envs/browser-harness/Scripts/python.exe"
|
||||
PYTHONPATH="<技能>/subskills/browser-harness/src" BU_CDP_URL="http://127.0.0.1:9333" \
|
||||
"$BH_PY" -m browser_harness.run <<'PY'
|
||||
# helpers 已预导入:js / cdp / list_tabs / switch_tab / new_tab / click_at_xy ...
|
||||
PY
|
||||
```
|
||||
|
||||
**问题 2:标签页漂移 —— 每次独立调用 harness,current tab 回到标签页列表第一个。**
|
||||
`new_tab` 后在**同一进程内** `page_info()` 正常;但**下一次独立调用**再 `js(...)`,实际作用在**列表第一个标签页**(本次是用户自己开着的原型管理页),后果:
|
||||
- 截图截到用户页面 → 差点误判为"搜索页没渲染";
|
||||
- `js` 在错误的页上查元素 → 返回 NOTFOUND(误以为点击失败,实际点击早已在新标签页打开主页)。
|
||||
→ **铁律**:每次独立调用**先 `switch_tab(<目标 id>)` 再操作**;target_id 用 `list_tabs()` 按 URL 关键字筛,**不要用 `[0]` 下标假设**(本次 `list_tabs()` 里 3 个 tab,抖音相关有 2 个)。
|
||||
|
||||
**问题 3:滚动容器类名过期(规范写 `.route-sc`,实测已不存在)。**
|
||||
按规范用 `.route-sc` 滚 4 轮,条数**纹丝不动停在 54**(首屏)。诊断后发现真实容器是 `class*="route-scroll-container"`(scrollHeight 3443 / clientHeight 806),换用后 3 轮滚到 **138 条**(= 账号全部作品)。
|
||||
→ **规避**:滚动前先诊断,别信固定类名:
|
||||
```js
|
||||
[...document.querySelectorAll('div')].filter(d => {
|
||||
const s = getComputedStyle(d);
|
||||
return (s.overflowY === 'auto' || s.overflowY === 'scroll') && d.scrollHeight > d.clientHeight + 50;
|
||||
});
|
||||
```
|
||||
探测顺序建议:`[class*="route-scroll-container"]` → `.parent-route-container` → `.route-sc` → overflow 祖先兜底。
|
||||
|
||||
**附带可复用发现**:`js()` 返回值会反序列化成 Python 对象,**可直接返回上百条结构化数据**(本次 138 条 × 10 字段)并在 Python 侧写文件 —— 不必把 JSON 打到 stdout(避开管道 / `head` 截断坑)。
|
||||
|
||||
**规避与铁律:**
|
||||
1. harness 调不通时,**先换 venv python `-m` 入口验证**,再怀疑浏览器/端口/代理。
|
||||
2. 独立调用之间**不继承 current tab** → 每次显式 `switch_tab`;截图前先确认 `page_info().url` 是目标页。
|
||||
3. **页面结构类名一律当"会过期"处理**:先诊断再操作;规范里的类名只作参考、不作依据。
|
||||
4. 数据抓取类任务:**对象返回值 + 本地写文件**,不走 stdout 传输。
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 2026-09-28|擅自调用 agent-browser(违反"只用 browser-harness"规则)
|
||||
|
||||
**场景**:用户问「能不能模拟用户点击的方式操作工作台」。为"实测可行性",直接执行了 `agent-browser open <url>`
|
||||
(该工具 v0.27.0 装在 `C:/Users/maidou/AppData/Roaming/npm/`,2026-09-11 装的,非本次安装),
|
||||
并让它启动了浏览器进程。
|
||||
|
||||
**用户纠正**:「这个我的记得是禁止安装 只允许使用 browser-harness,规则又无效了是吗」
|
||||
|
||||
**根因(两层)**:
|
||||
1. **规则没落地**:该强制规则此前**只存在于记忆中,从未写入任何规则文件** —— 用户级 `MEMORY.md`、
|
||||
技能 SKILL.md、项目规范里都搜不到。**规则不写进文件 = 不存在**,会话一换就失效。
|
||||
2. **误判授权边界**:把"本机存在该工具"当成了"可以使用"。**存在性不构成授权。**
|
||||
且调用它会导致**实际启动浏览器进程**,属对用户机器的真实动作,应先取得同意。
|
||||
|
||||
**规避(治本)**:
|
||||
- 规则已写入用户级 `D:/.workbuddy/MEMORY.md` → 「浏览器自动化:唯一通道规则」,
|
||||
含 6 条硬规则 + 豁免条款,跨所有会话生效。
|
||||
- 判据口诀:**浏览器自动化 = 只认 browser-harness(连外部 Chrome);见 `agent-browser` 一律跳过。**
|
||||
- 任何会拉起浏览器/子进程的动作,先说明再取得同意。
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 2026-09-28|MCP 返回不落盘导致批量拉取不可行(差点白等 2 小时)
|
||||
|
||||
**场景**:为做「独立信息源召回实验」,计划用麦芽 MCP `short_video_detail(id)` 逐条拉 20 条视频解析。
|
||||
第一条(33304,86,903 字符)因超 token 限制被自动落盘,顺利读到;
|
||||
第二条(33295)返回后**没有生成落盘文件**,内容只存在于上下文里。
|
||||
|
||||
**困惑点**:一度以为"MCP 返回一定会落盘",于是写了脚本打算批量处理,
|
||||
结果发现**沙箱只有"超限才落盘"这一条路径**,未超限的返回无处可取。
|
||||
|
||||
**真实约束**:
|
||||
- `short_video_detail` 返回体积 **5 万~20 万字符/条**(视频越长越大)。
|
||||
- **未超 token 限制时 → 只进上下文、不落盘**;超限时才写 `tool-results/*.txt`。
|
||||
- 因此**无法脚本化批量拉取**:每条都必须过一次上下文,20 条会爆上下文窗口。
|
||||
|
||||
**规避(治本)**:
|
||||
1. **逐条拉、拉完立即人工落地**为 `recall_cache/raw_{id}.txt`,且**只存「场次画面 + 台词」部分**
|
||||
(剥掉 `# 选题` 分析段与 `【解析 analysis】` JSON)——体积可从 20 万字符压到 3~25 KB。
|
||||
2. 已写入 `tools/weknora-ingest/RUNBOOK.md` §2.4 ⑤「复测工具」的踩坑提示。
|
||||
3. **判据口诀:凡 MCP 大体积返回,先假设"它不会落盘",按逐条落地设计流程。**
|
||||
4. 规模上宁可**先跑 5 条验证方法**,再决定是否扩样;不要一上来排 100 条。
|
||||
Reference in new issue
Block a user