45 KiB
45 KiB
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 改「账号日榜/周榜 · 视频热榜 · 点赞榜」
- 后端 dsh-data.js:RANK_SUB/RANK_FILE_RE 加
- 实测(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-deletePOST({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):
- vkCollect 内容结构板块全量化:拆解表「内容结构」(段落板块|维度|内容)作为独立
kind:'struct'整卡(板块≤7、行全保留、值折行≤3+省略号);无内容结构表时回退板块式框架表 →kind:'blocks'速览;mods装配顺序:内容定位→可复用爆款内容→内容结构→风格与传播→台词金句 - 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 规范"禁止贴靠"统一落实 - 色板白底定稿:
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 形成"主卡"质感
- vkCollect 内容结构板块全量化:拆解表「内容结构」(段落板块|维度|内容)作为独立
- 数据形态主目标确认: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 与空态两处)
- app.js executeTask 加
- ★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 即此)
- MCP 配置两级:用户级
- 修复:
- 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 复验"差异=特化集" → 引用目标存在性验证