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

84 lines
16 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 待办