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

49 KiB
Raw Blame History

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 新改动待提交)