Files
mcn-short-video/.workbuddy/memory/2026-09-04.md
T

250 lines
49 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-04 工作日志
## browser-harness 环境修复(00:00-00:20)
- **背景**:用户问为什么找不到 browser-harness → 排查发现三处副本 + 一处损坏残留互相误导
- **排查结论(全部位置)**:①源技能 `V1.0/subskills/browser-harness/`(真源,git 管理)= C 盘 `短视频工作台` 软链同份;②`AppData/Roaming/uv/tools/browser-harness` = **损坏残留**(site-packages 仅 2 文件空壳、uv tool list 报 malformed,误导源头);③`.dsh/skills/browser-harness` = dsh 部署副本(8-25 完整 repo,保留不动);④源技能内 `envs/browser-harness` = **残缺环境**(无 pyvenv.cfg、无 python.exe,browser-harness.exe 跑报 ModuleNotFoundError)
- **用户决策**:删 #2 uv 残留 + 修复 #4(真源保留);dsh 副本 #3 保留
- **#4 修复过程(关键坑)**:①venv 残缺真因=editable pth 指向 8 月更名前旧路径 `D:\AgentSkill\MCNDouAnalysis\...\src`(已不存在)→ 先试改 pth 仍失败(venv 无 pyvenv.cfg 时 site-packages 根本不在 sys.path);②重建 venv 用 `python -m venv <中文长路径>` 传参编码损坏→目录没建出来但 exit 0(**必须 cd 进目标目录用相对路径建**);③新 venv + 从 .bak 搬依赖(PIL/anyio/cdp_use/fetch_use/httpx/websockets/setuptools83/wheel 等 30 项)+ `pip install -e . --no-deps --no-build-isolation`(PEP660 editable 写 finder 文件为 UTF-8 无中文编码坑)→ **browser-harness.exe --version = 0.1.8 复活** ✓
- **正确调用方式(沉淀)**:`<技能目录>/subskills/browser-harness/envs/browser-harness/Scripts/browser-harness.exe`(技能自带 venv,不依赖 PATH/uv tool);envs/ 已被 gitignore(重建不影响 git)
## 主 SKILL.md 子技能索引登记(00:20-00:30)
- **诉求**:subskills 下技能全部写入主技能 SKILL.md,用相对路径
- **落码(V1.0/SKILL.md)**:①新增「## 子技能索引(subskills/,09-04 登记)」表格(6 子技能:browser-harness/lieflat-charts/mcn-data-insight/mcn-dou-analysis/mcn-script-review/mcn-video-prompt,列=目录名/技能名/功能触发/相对路径 `subskills/<目录>/SKILL.md`);②文件目录树补 subskills/ + mcn-work-shop + references-add 行(原树缺这些);③frontmatter updated_at→2026-09-04、last_change 前缀新增 09-04 条目
- **commit**:570ef84(memory 临时文件归因,承接 09-03 日志)+ 0810446(SKILL.md 子技能索引)——按 2h 节奏未 push
- **二次修正(809778a,continue 推进)**:①mcn-dou-analysis「外部技能依赖」段废弃旧「D:\AgentSkill 两步判定」——查证独立仓库 `D:\AgentSkill\mcn-dou-analysis`/`MCNDouAnalysis` 均已不存在(死路径),改 subskills/ + dsh 平级 `~/.dsh/skills/mcn-dou-analysis/` 双描述;②browser-harness 段可执行文件改技能自带 venv 相对路径(uv 工具安装描述废弃,与 00:00 环境修复配套);③lieflat-charts 路径改相对;全文件旧绝对路径引用零残留(grep 验证)
- **dsh 副本 SKILL.md 不同步结论**:dsh short-video-script(324 行,deployment:dsh)是刻意特化版——无 subskills/无外部技能依赖段/无工作台章节,子技能平级部署 `~/.dsh/skills/`;子技能索引照搬会产生无效路径 → 按刻意 divergence 策略不同步(09-04 判定,待用户确认)
- **遗留提示**:SKILL.md「外部技能依赖:账号解析」段仍写旧绝对路径 `D:\AgentSkill\mcn-dou-analysis`(实际已在 subskills/ 下),是否改相对路径待用户确认;dsh 副本 SKILL.md 是否同步待确认
## 全量路径引用审计收尾(09:20)
- **最终残留验证(源技能 V1.0)**:①`maidou` 命中仅剩 4 份 `references/规则/路径引用规范.md` 的禁止性**规则示例行**(描述什么是被禁止的,合法豁免);②`MCNVideo AI` 锚点零残留;③废弃目录名(MCNSkillCase/DSHSkill项目/MCNSkill输出)仅剩 3 份 `references-add/路径配置.md`(含 mcn-dou-analysis/mcn-video-prompt 副本)的 **变更记录历史行**(`2026-08-26:…` 描述废弃演变,合法豁免)——当前规则行零残留
- **豁免清单固化**:规则示例行(路径引用规范.md 中「禁止…」描述本身)、变更记录/历史行、references-add/路径配置.md 运行时权威文件 = 三类允许保留废弃名/用户名的位置
- **commit**:`docs: 全量相对路径规范化(移除 maidou/废弃盘符/应用子技能锚点)`
## 首页品牌名回退:MCN热点雷达 → 短视频工作台(09:55)
- 用户诉求:首页名称改回「短视频工作台」(08 月曾品牌化为 MCN热点雷达)
- **改动 6 文件 8 处全量替换**(grep 零残留验证):`index.html` `<title>`、`app.js` 面包屑 crumb-home ×2 + 头注释、`data-pages.js`/`style.css`/`dsh-data.js` 头注释、`server.js` 头注释 + 启动日志;首页无独立大字标题,品牌名只在此两处 UI 呈现
- **缓存版本统一 bump** `?v=20260904a`(style/app/data-pages 三文件引用);brand 区曾误加 brand-name 文字会与 crumb-home 重复显示→已撤销
- **服务重启生效**:杀 8900 旧进程(34076)→ 重启(24836),curl 验证 `<title>短视频工作台</title>` + crumb-home 文本正确
## AI脚本弹窗版本条重构:新在右 旧在左(R55)
- 用户反馈:「AI脚本 弹窗内容下面的版本切换 不好理解,默认选中的是 最新版 还是 最老的版本」→ 答复=默认最新(rewrite_log ORDER BY id DESC,索引0=最新,verIdx=0);AskUserQuestion 确认「方向词+最新标记」;追加要求「新的放在右边 旧的放在左边」
- **实施(data-pages.js openScriptModal)**:①`rewrites = rewrites.slice().reverse()` 展示层 旧→新(副本翻转,最左=最初版、最右=最新版);②verIdx 默认=length-1(最新/最右),指定 rewriteId 时 findIndex 定位(找不到回最新);③storyboards 同法 reverse(末位=最新分镜);④sbIdx 语义改 -1=未选 → sideContent 自动钳制到该 AI 版本最新分镜(length-1),切版本按钮里 sbIdx=0 改 -1(vprev/vnext 绑定代码本身零改动——数组翻转后方向自动正确);⑤verCtrl 模板:`{label} {idx+1}/{len} · {fmtTime(created_time)} [最新徽标]` + 按钮方向词「← 较旧 / 较新 →」(idx+1=旧到新第几版,末位标最新)
- **样式**:style.css 新增 `.rw-ver-new`(primary 实底圆角徽标),count 区时间用 .dim
- **版本号**:style.css/data-pages.js bump `?v=20260904b→c`;服务重启(后台 task);node --check 语法通过
- **待实测**:浏览器授权后验证——默认打开=最新在最右带徽标、←较旧左移、较旧侧 disabled 边界、分镜列同样式同方向
## R55 版本条重构浏览器实测通过(11:40,9223 实例)
- **环境修复**(铺垫):用户 Chrome 默认 profile 9222 调试端点不响应(DevToolsActivePort 残留但 socket 无监听 + 启动独立 daemon 失败)→ 改用项目既有惯例:启动 9223 专用调试 Chrome `chrome.exe --remote-debugging-port=9223 --user-data-dir=C:/Users/maidou/.workbuddy/tmp/bh-chrome-9223`(固定 profile 已 09-02 授权过,直接返回 Browser JSON 零弹窗),`BU_CDP_URL=http://127.0.0.1:9223` 定向连接 → harness 不再反复弹授权(弹窗根因=连无授权实例,现连已授权 profile)
- **AI 脚本版(video 190 = 3 版)实测**:初始 3/3 · 08-24 17:45 最新 + 较新→disabled;← 较旧→2/3 (17:29) 双向可用;再← →1/3 (08-22 16:44) ← disabled;较新→ 回到 2/3 ✓
- **分镜版(video 189 = 1 AI + 2 分镜)实测**:初始 分镜 2/2 · 08-22 14:39 最新 + 较新→disabled;← 较旧→分镜 1/2 (08-21 23:06) ← disabled ✓ — 切回 2/2 正常
- **最新徽标 CSS**:bg=primary rgb(47,111,237) 蓝实底,color=#fff,fontWeight=600,fontSize=12px,borderRadius=9px,pad 0 7px,marginLeft 6px
- **方向词+时间+徽标+边界 disabled+切版本分镜自动定位最新** 全部通过
- **遗留**:9223 调试 Chrome 实例已启动常驻(按项目红线「不主动关闭」保留,后续 task 可复用)
## R56 教程完整链维度「不适用即隐藏」(11:50,实测通过)
- 用户诉求:脚本诊断报告中,当前脚本不需要「教程完整链」分析时就不展示该维度(剧情类脚本不评教程维度,现显示灰色 — 占位行)
- **数据事实**:script_review.dims_json 中模型对不适用脚本把「教程完整链」置 **null**(12 条复盘全部 null;其余维度有值)
- **落码(data-pages.js)**:新增 `diagDimHas(dims,k)`(值是否为有限数字)+ `diagVisibleDims(dims)` = 教程完整链有值→完整 11 维列表 / null 或缺失→过滤掉该维度;其余维度无值仍显示 — 灰条(不超范围改动)
- **3 处渲染统一替换**:①弹窗右侧诊断面板 diagHtml scoreBar;②完整报告弹窗 reportFullReview scoreBar(compare 双列 aiD/srcD 各自独立判断);③脚本诊断页 openReviewDetail scoreBar(删本地 DIMS_ALL 副本改引用顶层 helper)
- **实测(9223)**:video 190(剧情类复盘)弹窗诊断面板与「查看完整复盘报告」均为 10 行维度(创意看点…其他),无教程完整链;反例(教程类有值 88)逻辑显式返回 11 项
- **版本号**:data-pages.js bump ?v=20260904c→d
## R57 热点数据页新增「账号日榜」(12:10,实测通过)
- 用户诉求:热点数据榜单加「账号日榜」,放「账号周榜」右边;获取用**不传赛道**方式(全品类 1 次调用),只显示需要的赛道数据
- **事实**:douyin-top-account fetch_rank.py --period day 不传 category → API type=全部 全品类 TOP50 单次调用(to_normalized_json 条目带真实赛道 category + comprehensiveScore 等与周榜同构)
- **落码**:
- 后端 dsh-data.js:RANK_SUB/RANK_FILE_RE 加 `day: '账号日榜' / ^抖音账号日榜_(\d{4}-\d{2}-\d{2})\.json$`;DEF_KEY week||day → comprehensiveScore(账号榜维度,防 day 误落作品榜 key);白名单过滤分支 board!=='week' 自动覆盖 day(RANK_KEEP 5 赛道+生活记录并集)
- ranking 页 data-pages.js:RANK_TABS 插 ['day','账号日榜','每日更新,回溯 7 天'](周榜右);st.day;COLS 抽 acctCol(empty) 工厂 week/day 共用(day empty 提示含「更新榜单可抓取,不传赛道全品类」);表格 rank-video 分支加 day(账号榜非窄列);更新按钮/确认弹窗文案四榜 8 次 API;SKILL_HINT_RANKING 加日榜抓取指令(账号日榜/抖音账号日榜_{日期}.json)
- 首页预览 app.js:tab 行加 day(title 每日更新回溯7天)、_PREVIEW_COLS 抽 prevAcctCol week/day 共用、空态榜名映射加 day、热点数据卡 desc 改「账号日榜/周榜 · 视频热榜 · 点赞榜」
- **实测(9223 + fake 文件验证后删除)**:后端 board=day → dates/categories(5 赛道 RANK_KEEP 序)/10 条过滤非白名单剩 8;ranking 页 tab 顺序=周榜|日榜|热榜|点赞榜、10 列表头同 week、赛道下拉 5 项、筛小剧场 2 行;首页预览 day 正常。fake 文件已删(真实抓取等「更新榜单」任务,1 次全品类 API)
- **版本号**:app.js/data-pages.js bump ?v=20260904e;服务重启(dsh-data.js 模块变更)
## R58 AI脚本弹窗删除按钮(15:20,全路径实测通过)
- 用户诉求:AI脚本弹窗 AI脚本内容区域左下角增加浅红删除按钮,确认后删除当前脚本(含相关诊断和分镜提示词数据)
- **后端(dsh-data.js)**:`deleteScript(rewriteId)` 级联清理——rewrite_log 删除 → script_review(rewrite_id)+ storyboard_log(rewrite_id);该视频无剩余脚本 → 再清 source 复盘与游离分镜;独立 DatabaseSync 写连接(与只读 getDb 隔离),finally w.close();**必须加 module.exports 导出**(漏=server.js 报 dsh.deleteScript is not a function,R58 踩过一次)
- **server.js**:`/api/dsh/script-delete` POST({id})路由
- **前端(data-pages.js)**:`.btn-del` 浅红按钮(style.css:#fdf0ef/#f0c9c6/#d9534f + hover 深红)+ `fireDel` 确认弹窗(级联提示文案);多版本 → splice + renderModal() 就地重建(剩余版本、定位相邻版);单版本 isLast → router() 整页重建;verCtrlInner 拆分复用 aiSecHtml 单版本 foot
- **★openCustomScriptView 移除(关键改造)**:自定义选题「查看」(data-cview)原绑 openCustomScriptView(09-02 简单只读弹窗:无删除/无诊断/无版本条);openScriptModal rewriteId 分支本已支持自定义单条(custom-script API + 回退全量表定位),改绑 `openScriptModal({rewriteId})` 后统一弹窗(删除按钮+诊断面板齐备),死代码 openCustomScriptView 整体删除(grep 确认仅绑定处 1 引用)
- **实测(9223,fake 全清)**:①多版本(video 190 4 版)删第 4/4 → 弹窗重建 3/3 内容切 rw25 ✅;②单版本视频脚本 isLast → router 刷新 ✅;③自定义选题 id38(video_id 空)查看弹窗含删除按钮 → 确认删除 → 弹窗关+行消失,DB 复查 rewrite/review/storyboard 三级全 0 ✅
- **版本号**:data-pages.js bump ?v=20260904e→f(静态 js 实时读盘未重启)
- **遗留**:R55-R58 改动未 commit(待 git 提交);帮助文档一行两卡 + 模拟操作指引点击无效果仍待修
## R59 视频关键信息卡迭代收尾(15:30,全路径实测通过)
- **用户诉求递进**(多轮反馈):①"在视频详情页拆解tab右侧加视频关键信息卡片"(已有实现)→ ②"加上可复用爆款内容" → ③"现在这个太难看了,参考账号设定卡的卡片" → ④"每一个卡片的内容都顶着卡片上边" → ⑤"内容结构板块也要加进去" → ⑥"视频解析的卡片用白色背景就行"(白底定稿,去除账号设定卡式渐变大底)
- **三处代码改动(public/data-pages.js)**:
1. **vkCollect 内容结构板块全量化**:拆解表「内容结构」(段落板块|维度|内容)作为独立 `kind:'struct'` 整卡(板块≤7、行全保留、值折行≤3+省略号);无内容结构表时回退板块式框架表 → `kind:'blocks'` 速览;`mods` 装配顺序:内容定位→可复用爆款内容→**内容结构**→风格与传播→台词金句
2. **renderVideoKeySvg 布局重写(统一"文字顶游标"排版)**:`vPadLR=16, vPadT=15, vPadB=14, insetTop=size*0.9`;kv 卡 label 22 行盒/正文 17、struct 卡板块头 23(左侧 boxTag 竖条 4×14 rx2 + 文字 x+13)、blocks 卡 padT=13 padLR=12;卡内首行 gap=vPadT+insetTop≈26(之前 ≈12 贴顶)—— F6 规范"禁止贴靠"统一落实
3. **色板白底定稿**:`bgA=bgB=#FFFFFF`(两 stop 纯白);deep 暖米 accent(#FBF3E7 box / #C13B2F boxTag / #7B2D1B boxTitle / 渐变标题 #8C2F1E→#C05A32);light 粉白 accent(#FDF1F5 box / #D84A8A boxTag / #A13D6B boxTitle / 渐变 #B03E76→#E0579A);模块标题色 secTitle=accent 深色(白底上不再用浅色字);header 框同色 tint 形成"主卡"质感
- **数据形态主目标确认**:13 维 MCP 拆解(赛道/账号核心定位/内容核心/可复用的爆款内容体系/…/内容结构/框架/事件/梗元素)—— v93/v190 实测标准形态;v205 类 F4 形态(无 tag 行无内容结构)不在本卡范围(keyCardHtml='' → 自动 fallback 拆解全文 md)
- **版本号**:data-pages.js bump `?v=20260904i→j`,index.html 同步
- **回归脚本 cdp-verify-r59.mjs**(根目录):9223 真实渲染 → 审计模块齐全/卡内首行 gap≥20/不越出 viewBox/bgGrad stops #FFFFFF → v93(vbH 1719 4 模块 4 板块 5 卡 gap 26 全绿)+ v190(vbH 1766 同构)→ `=== PASS ===`
- **产物**:`tmp/r59_v93_card.svg` + `tmp/r59_v190_card.svg`(白底定稿版完整 SVG 源);旧 `tmp/v190_keycard.svg`/`v93_keycard.svg` 渐变版已清
- **环境复用**:9223 专用 Chrome profile `C:/Users/maidou/.workbuddy/chrome-9223-profile`(已 9-02 授权过);会话间被回收时需 `run_in_background` 重启 chrome 进程(bash `&` 会随沙箱会话结束被杀)
- **R55-R58 同步清理**:cdp-verify-r59.mjs 与既有 cdp-verify-r28 等同级保留为回归;commit/push 待办
## R60 视频详情工具并入 tab 行(16:00,实测通过)
- 用户诉求:「视频脚本/视频拆解」的刷新+卡文切换放到与 tab 同一行,内容上面不用空一行
- **落码(data-pages.js renderVideoDetail)**:① `vkSwitch(active)` 提为函数 + 新增 `tabTools` 变量按当前 tab 与数据状态输出(script 有内容=刷新;deconstruct 有内容=有卡?[卡/文切换+刷新]:[刷新];空态='');② tabs 行模板 = `${tabBtns}<span class="tab-spacer"></span><div class="tab-tools">${tabTools}</div>`(spacer flex:1 推右);③ deconPanel/script body 删掉原 vd-tools 首行,内容直接跟 tab 行
- **CSS(style.css)**:`.tabs` 补 `align-items:center`;新增 `.tab-spacer{flex:1}` `.tab-tools{inline-flex;gap:8;margin-right:8}`;两处 `.vd-tools` 死规则删除(grep 零引用)
- **实测(9223)**:script tab 行右=刷新、next=md-body;deconstruct tab 行右=卡/文切换(激活态正确)+刷新、next=vd-wrap;空态 v58 行无 tools 且空态中央保留解析按钮 —— vd-tools 独立行零残留
- **坑**:CDP Page.navigate 到**相同 URL**(含相同 hash)不触发真正重载(旧 DOM 保留)→ 判断资源是否更新须查 `script[src*=data-pages].src` 版本或 Page.reload ignoreCache
- **版本号**:style.css ?v=e→f、data-pages.js ?v=j→k(index.html)
- **commit**:c47bbd1 已 push(07fbcd4..c47bbd1)
## R61 视频关键信息卡去粉红 · 米色系定稿(16:30,实测通过)
- 用户诉求:「视频卡片中内容板块的背景色参考旧梦留声机账号内容板块的背景,不要用粉红的」
- **取证**:旧梦留声机账号设定卡 = `桌面\MCNSkill项目\旧梦留声机\旧梦留声机账号设定卡.svg`(F6 deep 系)内容板块 fill **#FAEEDA** 米色 / 描边 #EDCBA4 / 板块标题 #7B2D1B / 正文 #6F5B4A / accent #C13B2F / 渐变标题 #8C2F1E→#C05A32;而视频卡 light 分支 box #FDF1F5(粉白)即用户不满的"粉红"
- **落码(data-pages.js renderVideoKeySvg)**:① P 双色板(deep/light)合并为**单一米色色板**(上列值,bg 仍纯白);② 标题渐变 id 固定 `vkT`(删 `${deep?'D':'L'}` 两处拼接);③ 删除 vkPalette 函数(深浅情绪调性判定失引用,grep 零残留;粉红 hex 全文件零残留——保留仅注释描述行)
- **实测(9223)**:v93/v190 内容板块 fill 均为 #FAEEDA + 竖条 #C13B2F + 白底 + 渐变 #8C2F1E→#C05A32(dp ?v=l 已加载);cdp-verify-r59.mjs 回归 PASS(模块/板块/gap26/不越界)
- **版本号**:data-pages.js ?v=k→l(index.html)
- **commit**:ddcdb3a 已 push(c47bbd1..ddcdb3a)
## R62 帮助页修复:一行 2 卡 + 模拟操作指引失效(16:50,实测通过)
- 用户诉求:「帮助功能 一行只显示 2 个卡片;现在点击操作指引没有效果」(对应 09-04 遗留项)
- **① 指引点击无效根因(help-guide.js buildOverlay)**:函数开头 `cleanupGuide()` 会把模块级 `guide` 置 null,随后 `guide.mask = mask` 抛 `TypeError: Cannot set properties of null` → 气泡/遮罩 DOM 已建但 display 永远 none——**功能从出生即坏**(与遗留记录一致)。修复=去掉 buildOverlay 内冗余 cleanupGuide(旧引导清理由调用方 startGuide 入口 `if (guide) cleanupGuide()` 负责)+ 注释警示
- **② 网格列数(style.css)**:`.help-grid` 原 `auto-fill minmax(320px,1fr)` → 全屏变 3 列;改 **`repeat(2, minmax(0,1fr))` 固定 2 列** + `@media(max-width:820px)` 窄屏 1 列
- **实测(9223,宽视口 1280)**:网格 `509px 509px` 固定 2 列(第 3 卡换行);点「首页·模拟操作指引」→ 气泡 block/遮罩 block 标题「数据总览条 1/4」;下一步→2/4→3/4 榜单速览(高亮 outline 3px + hint 点击提示)→ **真实点击 hot tab 自动推进 4/4** → 完成清除遮罩
- **版本号**:style.css ?v=f→g、help-guide.js ?v=b→c(index.html)
- **commit**:736b1cc 已 push(ddcdb3a..736b1cc)
## R62 帮助页修复:一行 2 卡 + 模拟操作指引失效(16:50,实测通过)
- 用户诉求:「帮助功能 一行只显示 2 个卡片;现在点击操作指引没有效果」(对应 09-04 遗留项)
- **① 指引点击无效根因(help-guide.js buildOverlay)**:函数开头 `cleanupGuide()` 会把模块级 `guide` 置 null,随后 `guide.mask = mask` 抛 `TypeError: Cannot set properties of null` → 气泡/遮罩 DOM 已建但 display 永远 none——**功能从出生即坏**(与遗留记录一致)。修复=去掉 buildOverlay 内冗余 cleanupGuide(旧引导清理由调用方 startGuide 入口 `if (guide) cleanupGuide()` 负责)+ 注释警示
- **② 网格列数(style.css)**:`.help-grid` 原 `auto-fill minmax(320px,1fr)` → 全屏变 3 列;改 **`repeat(2, minmax(0,1fr))` 固定 2 列** + `@media(max-width:820px)` 窄屏 1 列
- **实测(9223,宽视口 1280)**:网格 `509px 509px` 固定 2 列(第 3 卡换行);点「首页·模拟操作指引」→ 气泡 block/遮罩 block 标题「数据总览条 1/4」;下一步→2/4→3/4 榜单速览(高亮 outline 3px + hint 点击提示)→ **真实点击 hot tab 自动推进 4/4** → 完成清除遮罩
- **版本号**:style.css ?v=f→g、help-guide.js ?v=b→c(index.html)
- **commit**:736b1cc 已 push(ddcdb3a..736b1cc)
## R63 帮助页移除「三种创作模式」板块(17:00,实测通过)
- 用户诉求:帮助文档去掉「三种创作模式(对 AI 说一声即切换)」板块
- **落码**:① help-guide.js renderHelp 删除 `.modes` 区块模板 + 删除 MODES 常量(无引用);② app.js 旧版 fallback renderHelp(help-guide 缺失时兜底)同步删除同板块;③ style.css `.modes/.mode-table/.mode-name/.mode-hint` 死规则清理(grep 零残留)
- **实测(9223)**:help 页 `.modes` 无、无「三种创作模式」h3、7 卡网格为页尾区块
- **版本号**:app.js ?v=e→f、help-guide.js ?v=c→d、style.css ?v=g→h(index.html)
- **commit**:b805b77 已 push(736b1cc..b805b77)
- 用户诉求:获取账号日榜数据(工作台 ranking 页展示用)
- **抓取**:douyin-top-account fetch_rank.py(redfox 全品类 TOP50);09-04 11:44 < 17:30 → offset=2 → 数据期 2026-09-02(FAQ/update_rules 定:未到更新时间取前2天)
- **落盘**:桌面 `MCNSkill项目/三方数据/红狐数据/抖音榜单/账号日榜/抖音账号日榜_2026-09-02.json`(50 条,新建「账号日榜」子目录,首抓)
- **API 验证**:`/api/dsh/ranking?board=day` → dates=[2026-09-02]、白名单过滤后 13 条(小剧场/生活vlog/美食…)、默认 comprehensiveScore 降序、inDb 命中正常;RANK_SUB.day=账号日榜 + 前端 day tab 已就绪,零代码改动
- 服务端 API 路径注意:`/api/dsh/meta`(非 status);`board=day` 过滤逻辑走 RANK_KEEP 条目层白名单(与 week 文件名赛道过滤不同)
## R64 系列 UI 微调(15:30-16:00,data-pages.js ?v=l→o,三次小改)
- **R64.1 视频关键信息卡**:renderVideoKeySvg 首板块排版起点 `headY0+headH+22 → +34`(「内容定位」标题/卡与头部大标题框间距加大,框底→首卡顶 52→64)
- **R64.2 账号列表**:#accUpdate「更新」按钮去文字只留 globe ICON(title 保留)——用户口中「刷新按钮」
- **R64.3 AI 脚本弹窗**:delScriptBtnHtml(data-del-script)去「删除」文字只留 trash ICON
- **验证脚本**:cdp-verify-r64.mjs(headGap=64/标题 dt=34/原断言保持)+ cdp-verify-r64-acc.mjs + cdp-verify-r64-del.mjs,均 PASS
- **★CDP 踩坑(固化)**:① 米色整宽卡 filter 会误纳入头部标题框(w=520,#FAEEDA)→ 内容卡过滤须 w>550 排除;② SPA hash 路由 Page.navigate 同 URL 不同 hash 不重载文档→ 旧 JS 残留,须 `?t=${Date.now()}#/...` 强制整页加载 + Network.setCacheDisabled + waitFor script.src 版本号三重保险
## R65 视频解析执行中状态跨刷新(16:00-16:30,app.js ?v=f→g、data-pages.js ?v=o→p)
- **用户反馈**:① 视频脚本「刷新」点确认后按钮变「执行中」,但刷新页面就丢,回到「刷新」可点——任务实际未完成;② 拖累会话任务因「找不到 MCP」执行不了,已手动停止
- **根因**:executeTask 的「执行中」按钮态纯前端内存变量 + DOM innerHTML 替换,刷新后变量死 + DOM 重建 → 状态消失。SESSION 失败是宿主 MCP 在新任务会话里未挂载,非代码可控
- **解决**:
- app.js executeTask 加 `opts.onSubmit(taskId)` 提交后回调 + `opts.onFinish(s)` 终态回调(done/error/notfound/review/超时 s=null);用 `finish()` 统一提前调用,保证 `refreshCurrentPage()` 之前清记录,避免渲染读到陈旧「执行中」
- data-pages.js confirmVideoParse 传 onSubmit→localStorage.setItem `wk_video_task_<videoId>`{taskId,ts};onFinish→删除
- renderVideoDetail 加 `watchStarted` 状态 + `readVideoTaskRec(videoId)`(35 分钟陈旧清理)+ `watchVideoParseTask` 恢复轮询(终态清理+toast+reload)
- parseBtn 分支:rec 存在时输出 `btn-busy disabled` + refresh 旋转 +「执行中」+ 详细 title(覆盖 tab-tools 与空态两处)
- **★onFinish 时序坑**:done 分支必须 finish(s) 先于 refreshCurrentPage;否则 load() 同步执行时 localStorage 还在 → 渲染执行中 → 卡死。用 `let ended` 守卫只调一次(超时兜底 `if(!ended) finish(null)`)
- **验证(CDP)**:cdp-verify-r65.mjs——注入伪造 rec → 按钮「执行中」disabled → watch 轮询 notfound → 清理 + 按钮恢复「刷新」可点 → PASS
- **问题 2 说明**:MCP 在主会话已登录飞书,但任务新会话里 MCP 工具未挂载(宿主会话 MCP 授权范围),工作台侧可做=错误信息暴露(已实现 error/review toast),根因需用户在工作台顶栏 connectors 处保持 MCP 连接稳定或重新授权
## R66 「找不到 MCP」根因定位与修复(16:10-16:40,server.js + app.js ?v=g→h + data-pages.js ?v=p→q)
- **用户追问**:MCP 不是全局可访问吗,为何每个任务都找不到 MCP?→ 纠正此前误判(非安装/授权问题)
- **事实链**:
- MCP 配置两级:用户级 `~/.workbuddy/mcp.json`(全局,全部任务/文件夹生效)+ 可选项目级 `.workbuddy/mcp.json`——**不需要每工作空间装**
- 宿主代码(app.asar 反查)register(sessionId, connectorIds):**connectorIds 空数组 = 不注入任何用户连接器**;configId 形态 = `connector:<name>` / `custom-mcp:<name>` / 裸名
- 工作台建任务(server.js INSERT automations)**connector_ids_json 写死 '[]'** → 70 个历史 automation 全空 → 后台任务会话零连接器 → 解析任务「找不到 MCP」(用户手动停的 automation-1788508535855 即此)
- **修复**:
- server.js:createOnceAutomation 增第 4 参 connectorIdsArr;/api/run 解析 body.connectorIds(正则放行 configId 形态)→ 写入 connector_ids_json(榜单更新类保持 [])
- app.js executeTask body 带 connectorIds: opts.connectorIds
- data-pages.js confirmVideoParse 挂 `connectorIds:['custom-mcp:myai-mcp-production']`(F5 解析依赖 myai MCP upload_douyin_video/short_video_detail)
- 重启 8900(Stop-Process 29436 + run_in_background node server.js 8900)
- **验证**:探针任务 POST /api/run + connectorIds → 落库 `["custom-mcp:myai-mcp-production"]` ✅ → 轮询 queued→running→**done 无 error** ✅(此前同型任务 error);最终模型答复请在左侧会话栏「MCP注入探针」会话查看(宿主会话消息不落本地文件,outbox 空)
- **可复用认知**:凡工作台任务依赖 MCP(未来保存账号/提炼若需 hot_account/浏览器外 myai 接口)→ 提交时同法挂 connectorIds;configId 前缀规则 custom-mcp:(用户自定义 mcp.json server)connector:(市场连接器)
## R67 全量排查「需 MCP 功能是否都挂 connector」(16:20-16:50,app.js ?v=h→i、data-pages.js ?v=q→r)
- **排查法**:前端 prompt 显式 MCP 引用 + mcn-dou-analysis 技能 references/feature 各功能 MCP 依赖分级(硬依赖/兜底)
- **依赖判定**:F5 解析视频=硬依赖 myai;F3 提炼设定 Step4 缺存量解析会现场 MCP 解析=依赖;F4 数据分析需补齐无解析视频=依赖;F1 账号信息=浏览器优先、MCP list_hot_accounts 仅兜底;短视频工作台主技能创作=未解析视频分支需先 MCP 解析;脚本复盘/分镜/榜单更新=纯脚本不依赖
- **修复**:app.js 定义 `MYAI_CONNECTORS=['custom-mcp:myai-mcp-production']`;8 个业务入口统一挂 connectorIds:confirmSaveAccount(保存)、openImportAccounts(添加)、账号自定义 AI创作(505)、账号详情对标创作(1103)、提炼设定(1115)、数据分析(1127)、解析/刷新(1540)、rewrites 参考选题创作(1719);复盘/分镜/榜单保持不挂
- **验证**:cdp-verify-r67.mjs 冒烟 PASS(常量可达/函数在/零 JS 错误)+ 语法全过
- **★Edit 工具多行中文片段匹配失败教训**:node 校验 indexOf 发现文件实际是 `});` 而 Read 显示 `}));`——Read 渲染与真实字符可能不一致,多行替换失败时改用 node 脚本(写 .cjs 防 ESM require 报错)精确替换
## R68 系列 UI 微调(16:25-16:35,style.css ?v=h→i、data-pages.js ?v=r→s)
- R68a:账号信息(.account-grid)与视频信息(.video-grid)属性内容宽度 140→180px(各 7/8 字段,4 列网格 4×180=720 无溢出);CDP r68 PASS
- R68b:视频关键信息卡 板块标题→内容卡顶间距 y+=30→22(标题与卡更靠近,视觉 gap≈20px);cdp-verify-r68b PASS(标题→卡 22、卡内首行 26≥20、白底/内容结构保持)
## R69 刷新功能=强制重新获取覆盖(16:40-17:05,data-pages.js ?v=s→t)
- 背景:用户要求「所有刷新功能要明确告诉AI是重新获取数据进行覆盖」——此前刷新 prompt 与新建共用(无覆盖语义),曾发生 AI 判断"是否需更新"→用截断结果覆盖旧完整版的质量事故
- 三处修复:
① 视频详情「刷新」confirmVideoParse:新增 VIDEO_REFRESH_OVERRIDE 常量(isRefresh 时拼入 prompt),含 4 条硬指令:禁判断需否更新/禁复用旧结果→重新走完整解析、content/analysis 整体覆盖写入、防截断兜底(截断/缺失先重试严禁覆盖旧完整版)、POST /api/import/account 覆盖入库
② 账号列表「更新关注账号」updateFollowedAccounts:prompt 尾追加【覆盖刷新模式(09-04 R69)】——不要因库中已有记录判断"数据较新/无需更新"而跳过,必须重新抓取整体覆盖
③ 榜单「更新榜单」(冷却窗口 force):rankPrompt = SKILL_HINT_RANKING + force 时追加【覆盖刷新模式】忽略幂等铁律重新调用 API 覆盖写入同名文件(否则 force 被幂等拦成空跑);非 force 保持幂等
- 验证:cdp-verify-r69.mjs 5 项 PASS(fetch 拦截捕获真实提交 prompt 断言 + 伪造响应不真建任务;注意拦截器需先 localStorage 清 wk_video_task_ 残留、弹窗后 router() 整页重建需重试点击、prompt 捕获勿截断 400 字符);用后整页重载清理 fetch 覆盖防 mock 残留
- **★R69 事故定性纠正(17:10 用户反馈)**:此前把 16:21 刷新任务(detailId=28274)新版 analysis 定性为"截断→恢复旧版 26164"是误判。真相:MCP 工具返回的"截断"仅是**显示层截断**,任务 AI 当时已识别并绕行(~/.myai-mcp/credentials.json token 直连后端 hot/detail/28274)取到完整 JSON 再落盘;新版 12 维度 27792B 是平台最新解析的正常**精简版**(旧 26164=8-26 过时结构)。恢复旧版动作多余。当前库 id=114 与产出 analysis.json 完全一致(JSON.stringify 相等)、12 键齐/无乱码/无截断标记——无需修复。**教训:MCP 工具长 JSON 返回可能被显示层截断,落盘前应直连后端/分片取全量;刷新任务用新解析覆盖旧版是正确的,勿因"看起来短/维度少"误判为截断去恢复旧版**
## R70 AI写脚本「自定义选题创作」→「原创选题创作」(17:00-17:15,data-pages.js ?v=t→u、help-guide ?v=d→e、server/dsh-data 注释同步)
- 用户要求:AI写脚本页 自定义选题 → 原创选题创作;空态句「暂无自定义选题脚本——可从账号列表「AI创作」弹窗创作,任务完成自动入库后显示在这里」句末加箭头跳转账号列表
- 改动:tab 显示名/note/空态文案/弹窗 diag 提示/script-save AI 汇报名(data-pages.js 10+ 处显示与注释)、help-guide 引导、style.css/server.js/dsh-data.js 注释同步;空态句末加 `<a class="link" href="#/accounts">→ 去账号列表</a>`(td.empty 内嵌 link)
- **内部标识保留**:data-tab="custom"、API /api/dsh/custom-scripts/custom-script/script-save、state.custom、customScripts 徽标键均不改(改名只动显示层,避免破坏路由/查询/写库)
- 验证:cdp-verify-r70.mjs 3 项 PASS(tab 名/空态+箭头 href/点击跳转 #/accounts);node --check 全过
## R71 「平凡的胡德禄」账号设定卡生成(17:15-17:35,桌面 MCNSkill项目/平凡的胡德禄/)
- 用户要求:生成 平凡的胡德禄 账号设定卡。账号 id=1628 剧情赛道·AI萌宠拟人喜剧·71W粉,37 条视频(2026-05-24~08-17),最新三个月窗口 TOP6 仅 2 条已解析(id=25/27 劫匪/铜锣),4 条缺解析(牛排/螺蛳粉/你属什么/汽水)
- 关键发现:库 account_persona id=2(2026-08-18 生成,7593 字,11/12 段命名命中——第12段以「人设底线」替代标准「设定分析说明」,但语义完整)已存在有效人设卡,**桌面产出目录与全盘均无任何胡德禄产出残留**。按已有数据处理规则:库 persona 有该账号 → 复用优先 + 询问覆盖 or 微调,不静默重跑
- **判定分叉点(首次用 AskUserQuestion 走决策表)**:
- 选 A「最新窗口全链路重做」= 复用已解析 2 条 + MCP 补解析 4 条 + 重写人设卡
- 选 B「复用旧版快速转存」= 直接转存 08-18 版 md + 生成 SVG
- 用户选 B(快速转存)
- 落盘:md 复用 tmp/hdl-persona-full.md 内容(=库 content_json 原文 17350B)复制到 `C:/Users/maidou/Desktop/MCNSkill项目/平凡的胡德禄/平凡的胡德禄账号设定.md`
- **配色判定(关键治本沉淀)**:调性=萌宠拟人喜剧/AI搞笑/糖水明亮 → 浅色系(明快欢乐/甜美);主视觉色=橘猫虎斑+古风庭院暖黄+高饱和糖水 → 推导「暖杏蜜橘」新色系(既非俊希的青柠黄绿底、也非王微斯的玫瑰金),参照俊希卡"浅色系自定义色系"先例:白卡+暖橙边 #ECC494 + 深棕字 #8A4B23 配套,bg #FCE8CC→#F2BC82(暖杏→蜜橘糖水)
- SVG 10 个模块(680×1720):顶部标题区/装饰线/叙事结构·五步爆笑闭环/内容标签(2×3 chips)/内容基因·TOP4(2×2 285 宽卡,王微斯式)/色彩体系·糖水古风庭院(5色块 庭院暖黄/糖水高饱和/橘猫虎斑/闪电红/闪电蓝,均为 md 视听风格语义色)/角色类型库(固定双主角285×2 + 3配角186×3 共5卡)/四段式人宠互怼情绪结构(开场钩子/设套埋梗/制裁核爆最高/彩蛋收口)/红线清单(2×3 共6条)/版权
- 自检渲染:9223 调试 Chrome 截图(tmp/hdl_card_check.png,devPx 680×1720)—— 布局整齐无重叠/越界,10 模块清晰,色系贴合橘猫古风调性
- 术语一致性:关键术语 md↔svg 双向命中(毒舌管家4/4、土味情话18/6、谐音梗12/2、相爱相杀5/2、小主人26/5、臭猫18/3、双标6/3、收破烂5/2、劫匪8/1)
- **★功能六浅色系色板扩列**:现有 4 系(深棕红旧梦 / 玫瑰金王微斯 / 暖橙俊希 / 青柠黄绿俊希-备)→ 新增第 5 系「**暖杏蜜橘**」#FCE8CC→#F2BC82(适用:橘猫萌宠+古风糖水调性,明快欢乐搞笑型,配套白卡暖橙边+深棕字);06 文档可在后续配色表追加作为「萌宠拟人喜剧/橘色系明快」档位备选
- **★读取矛盾教训(重要)**:check-hdl2.cjs 用 `length(COALESCE(content_json, ''))` 别名但 SELECT 列表未包含 content_json 字段 → Node 端 `p.content_json` 为 undefined → 看似"空"。库内容实际完整(7593 字符)。修复:查询时**必须**显式 SELECT content_json 列或用 `SELECT *`。`length(COALESCE(...))` 在 JS 端是 SQL 算的长度,与 JS 取出结果无关
- 库 account_persona 重复跳过(按 server.js `/api/import/account` 规则)—— 内容已对齐,不重复导入
- **「原创选题→自创选题」二次改名指令待确认**:本轮用户未再提此改名,前次执行中本代理误回滚到「原创选题」状态;如用户希望改名为「自创选题」需再补做正向替换(影响 data-pages.js 注 22/43 + tab + note + 空态 + 弹窗 + script-save + help-guide + style.css + server.js + dsh-data.js 注释;内部 custom-* 标识保留)
- 临时脚本:tmp/check-hdl{1,2,3,4,5}.cjs、shot-hdl.cjs、hdl-persona-full.md、hdl_card_check.png(截图可作参考,脚本可清)
## R72 技能树 SKILL.md 体量体检 + 优化方案(17:25-17:35,纯检查未改文件)
- 体检结论:架构健康(references 拆分好),但 2 个严重超标 + 2 个临界:
- 🔴 mcn-video-prompt 679行/78.5KB(max 单行 3488 字符 F1 人物专项):F1 细则 134 行几乎全内嵌正文(Step-Check/人物专项/类型适配/双版本/金标锚点),references 21 词库闲置;F2-F4 已走引用 references 的正确形态 → 优化重点是 F1
- 🔴 nuwa-skill-main 694行/39.5KB:执行流程 477 行内嵌(Phase 0A-0B 全量),references 少
- 🟠 主技能 413行/35.9KB:frontmatter last_change 单行 953 字符(变更史全塞元数据)+ 11 步流程 186 行与 references/创作流程 11 文件双重维护(每步 10-26 行概要+指针,概要多为 Gate/三环等 P0 硬约束)
- 🟠 mcn-dou-analysis 186行/31.3KB avg 行宽 80(表格全塞单行 max 733)
- 🟢 健康:mcn-data-insight(索引型)/mcn-script-review/browser-harness 本体/douyin-* 孙技能
- ⚪ 参考库 seedance2.0(728行/46.6KB)/script-writing-studio(262行/20.5KB) 非主链路不计
- ★新发现重复注册:browser-harness 的 src/browser_harness/SKILL.md 与 skills/browser-harness/SKILL.md 是 14B `../../SKILL.md` 软链占位 → 宿主注册出 3 个 browser-harness 变体
- 参照标准:舒适 ≤300行/20KB/行宽≤60;警戒 300-450/20-35KB;超标 >450行或>35KB 或行宽>80;mcn-video-prompt 每次触发烧 ~2万+ tokens
- 方案已输出(未执行):保功能三铁律=触发条件留 SKILL.md/P0 红线留精简版或强路由"先读"指针/长而按需才查的细则下沉;用户要求"保证现有功能和效果的优化方案",先出方案待确认执行范围
## R73 mcn-video-prompt F1 细则下沉 + 骨架化(11:44 执行完成)
- 用户确认优化方案后,附加要求:「以前专门加入 skill 的关键引用和描述要区分出来,不然 agent 执行时每次都忘」→ 定 A/B 分层:A 层(🔑 导航行/Gate 确认句/🚫 红线/P0 铁律)绝不压缩不下沉;B 层(细则正文/类型适配表/超长单行)下沉+原位留 🔴 必读指针
- **执行(mcn-video-prompt)**:SKILL.md 行 72-160 F1 完整细则 → 下沉至新建 `references/功能/F1_图片反推细则.md`(108 行,frontmatter agent_created);SKILL.md F1 节保留 流程0-6 + Step-Check 表 + 导航行 + 第 73 行 🔴 必读指针;净减 680→596 行、78.5→46.7KB
- **路径引用修正(关键坑)**:下沉后细则文件位于 `references/功能/` 下,内部 `references/知识库/...` 反引号引用按「md 相对自身解析」规范改为 `../知识库/...`(3 处:01_主体描述/02_动作行为/15_视觉风格),词库文件全部存在验证 ✓;md 断链校验 0
- 超长行复查:F1 细则内 3488 字符单行保留在细则文件(B 层内可长);SKILL.md 剩余 max 单行 404=路径配置 ⛔ 权威规则行(A 层不压)
## R74 主技能 SKILL.md 精简 + 阅读分层(11:50 执行完成)
- **三处压缩**:①frontmatter last_change 954→201 字符(明细迁新建 `references-add/变更日志.md`,归档 09-04/09-03/09-02 三条 + R73/R74 条);②11 步 ASCII 流程图 25 行→行式 Gate 链 5 行(S1→[G0]→…→[G6],保留层标注/🔶 可选/Gate);③技能概述后新增「📖 本文件阅读分层(R74)」块:🚫红线P0=每次必读 / 🔑关键引用导航行=执行到该步必开引用文件 / 无标记正文=扫描即可
- **验证**:414→401 行、35.9KB→34.3KB(降入警戒线内);frontmatter 完整;11 条步骤导航行+11 个创作流程引用+Gate 0 全部在场;md 断链 0;剩余超长行(573/431)=工作台 P0 铁律正文不压
- **软链 md5 全一致** ✓:SKILL.md/变更日志/F1 细则 4 文件源↔注册技能同 md5(junction 正常)
- **未动**:nuwa-skill-main(694行 下一步候选)、browser-harness 3 变体注册问题(14B 软链占位,宿主注册重复,需单独决策)
## R73/R74 全面复查(17:50-18:10,发现并修复 1 遗漏 + 确认 dsh 待同步项)
- **复查方法**:git diff 对比压缩前后(非人工比对),程序化指纹核验内容零丢失 + 全量引用扫描 + 软链 md5 + 跨副本对比
- **R73 内容完整性**:被删 88 行 → 下沉文件 23/23 小节块指纹全命中,零丢失;反向验证下沉文件与 SKILL.md 骨架**无重复内容**(防"既下沉又保留"双份加载)✓;diff -88/+4 证明骨架行(流程0-6/Step-Check/导航行)全保留
- **R74 内容完整性**:diff 仅 3 处预期改动(last_change 压缩/流程图 25→5 行/阅读分层 +5 行);原 last_change 10 个关键短语抽查变更日志**全部归档覆盖** ✓
- **引用有效性**:43 处真实路径引用(md 链接 26 + 反引号路径 17)全部有效;6 条"疑似断链"人工判定=叙述性文字误报(变更日志 4 条=技能根视角描述、F1 细则 2 条=第16行引用约定示例 `../知识库/…` 省略号)——真实引用零断链 ✓
- **★发现遗漏并修复**:mcn-video-prompt frontmatter 未更新(updated_at 仍 08-31、last_change 无 R73 记录,违反技能维护规范)→ 已补:updated_at→09-04、last_change 前置 R73 摘要(08-31 历史保留于同字段内),修复后软链 md5 一致 ✓
- **dsh 副本同步现状(待用户授权)**:dsh `storyboard-prompt` = mcn-video-prompt 部署副本,仍 679 行旧版、缺 references/功能/F1_图片反推细则.md(R73 未推);跨副本对比证实 **dsh 非全量镜像**:dou-analysis 源/dsh 189 同/9 差/dsh 独有 14 文件、storyboard-prompt 119 同/20 差 → dsh 副本有自身增量与特化,同步需按惯例「确认→对比→用户授权」,本复查不擅动 .dsh
## R75 方案A占位清理 + dsh 同步 R73(17:49-18:00,用户授权执行)
- **#109 方案A 占位删除(完成)**:删 browser-harness 源技能 2 个 14B 占位 `skills/browser-harness/SKILL.md` + `src/browser_harness/SKILL.md`(内容 `../../SKILL.md`,Claude Code 分发重定向入口,宿主递归扫描误注册成坏变体);注册侧 junction 同步消失、顶层 SKILL.md 保留;主技能 SKILL.md 外部依赖 browser-harness 段补「⚠️ 占位清理(09-04):重拷上游整包必须排除这 2 个文件」维护提示(防复发);last_change 追加记录(259 字符)
- **宿主注册机制结论(可复用)**:宿主**无限深度递归扫描 SKILL.md**(任意嵌套目录含 SKILL.md 即注册,命名空间=父路径段拼接)→ 技能树内所有 SKILL.md 必须都是"有效技能"或不存在;无效占位/重定向文件会导致坏变体注册(browser-harness 3 变体根因)
- **#110 dsh storyboard-prompt 同步 R73(完成)**:先三方比对——dsh(679行) vs 源HEAD(680行) 仅 **4 处 dsh 特化**(frontmatter name=storyboard-prompt/deployment=dsh+deployed_at=2026-08-31、产出路径段兜底 `DSHSkill项目/` 正文+目录树注释),证实 dsh 为 R73 前同步态非全量镜像 → **同步法=以源工作区文件为底覆盖 + 重放 4 处特化**(禁整包覆盖,会吞特化);F1 细则 md5 与源一致、dsh 侧 3 词库引用目标存在、备份 .bak-r73 清理
- **★dsh 同步可复用方法**:源↔dsh 有特化差异时禁止直接 cp 覆盖——先 diff 三方(dsh/源HEAD/源工作区)确认特化清单 → cp 源工作区 → 逐条重放特化 → diff 复验"差异=特化集" → 引用目标存在性验证
## R76 视频解析入库 aweme_id 匹配修复(18:32-18:50,用户报"解析了看不到")
- **现象**:平凡的胡德禄《小主人...臭猫昏迷》(aweme 7674245412476081913, video id=58) 解析任务成功(detailId=33367, content+analysis 齐备落盘)但工作台视频详情页 3 tab 全空
- **排查链**:宿主 automations 找到任务 automation-1788516378186(18:06-18:31, result_success=1, runs_json 完整)→ 工作台库 source id=116 已入库但 **aweme_id=null** → 前端 dsh-data.js 取数 `WHERE video_id=? OR (aweme_id IS NOT NULL AND aweme_id=?)`(要求 NOT NULL)→ 查不到
- **根因(双规范化不对称)**:server.js importAccountIntoDb 的 matchAweme 用 normTitle(folder) 匹配 account_videos.video_title——但①文件夹命名规则「标题去特殊符号」把词间空格也吞了("小主人: 终于"→"小主人终于"),normTitle 只删标点保留空格("小主人 终于")→ 两侧永不相等;②全角问号「?」不在 normTitle 删标点集合(title 尾部残留 ? 干扰)→ 精确/包含匹配双失效 → aweme_id=null 脏入库(09-01 曾修标点缺全角问题,但空格不对称与 ? 漏删残留至今)
- **修复(server.js,治本)**:新增 `normKey = normTitle(s).replace(/\s+/g,'')`(无空格紧凑形态),xlsxByNorm/dbByNorm 键与 matchAweme 比较统一用 normKey;normTitle 标点集合补全角「?」。语法过 + 本地模拟唯一候选命中 7674245412476081913 ✓
- **重跑验证**:重启 8900(k9DZfI)→ POST /api/import/account(import 开头自动清 aweme_id/video_id 双 null 脏记录)→ source 命中 aweme_id、content 4787B + analysis 29887B(S1-S40 全 40 场次)、脏记录 0、前端查询语句模拟命中 ✓
- **教训沉淀**:凡"产物落盘成功但页面查不到"→ 先查库中记录关联键(aweme_id/video_id)是否为 null;文件夹名与库标题匹配必须同构规范化(无空格紧凑 + 全角标点全集),两侧规则各改一处即失效
## R77 import 告警 + prompt 自查 + 全功能落库排查(18:39-19:00,用户确认实施)
- **#111 import unmatched 告警(server.js)**:importAccountIntoDb 视频分析循环重构——awemeId 命中后反查 account_videos.id 一并填 video_id(双键关联,前端 video_id/aweme_id 皆可命中,历史 video_id 多为 null 仅靠 aweme_id 兜底);**awemeId 匹配不到 → 记 stats.unmatched + unmatched_folders 并跳过插入**(不再制造双 null 脏记录、避免"入库假成功",补 xlsx/视频列表后重跑即恢复);stats 初始化加 unmatched:0/unmatched_folders:[];路由直接返回 res 自动带出
- **#112 解析 prompt 自查(data-pages.js SKILL_HINT_VIDEO_PARSE ⑤步)**:入库后强制自查——检查返回体 unmatched/unmatched_folders 含本次视频文件夹 → 明确汇报「入库关联失败」禁止报成功;再查询库中该视频确能查到 source 记录方为成功。该常量为唯一解析入口(解析/刷新共用,行 1549 组装)覆盖全入口;技能侧 F5 文档无入库步骤(入库只在工作台 prompt 层)无需同步
- **#113 全功能落库排查结论(库内健康)**:双 null 脏记录 source/analysis=0;analysis 12/12 有 aweme_id(选题 JOIN 正常);rewrite_log 26/26 全关联;account_videos 626/626 有 aweme;孤儿 source 0。dry-run 31 个产出文件夹 21 匹配;10 个 unmatched 全属**历史遗留且已入库无害**——王微斯 4 个(早期 folder 标题截断'关于我想你这件事'=标题首句+标签,非完整标题规则,但对应视频 source/analysis 09-03 早已入库);小咪橘座 6 个(账号未登记 hot_accounts→无映射源,且 folder 名带'人'字标题错乱,账号级缺失非匹配缺陷)
- **验证**:服务重启(s4hdzW);平凡胡德禄重跑 import → video_source=1 unmatched=0 ✓(#111 生效);data-pages.js bump ?v=20260904u→v
- **待办**:本批改动未 commit(R76+R77 与 R64-R70 已 push 过、R76/R77 新改动待提交)