diff --git a/.workbuddy/memory/2026-09-04.md b/.workbuddy/memory/2026-09-04.md
index 07b0728..e5de954 100644
--- a/.workbuddy/memory/2026-09-04.md
+++ b/.workbuddy/memory/2026-09-04.md
@@ -81,3 +81,154 @@
- **产物**:`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}
${tabTools}
`(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_`{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:` / `custom-mcp:` / 裸名
+ - 工作台建任务(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 注释同步;空态句末加 `→ 去账号列表`(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 复验"差异=特化集" → 引用目标存在性验证