Files
mcn-short-video/.workbuddy/memory/2026-08-31.md
T
maogeigei b2e472bf27 09-01 调度机制修复落地+并发方案A+全链路复测通过
- 调度根因修复:工作台/api/run 显式写 next_run_at=now+5s(17列),scheduledAt=now+5s 带秒
- 新增 自动化任务调度机制.md(根因/硬规则/状态机/并发上限≈3/排查命令)
- 并发方案A(浏览器锁):/api/run 对浏览器类任务自动注入锁约束;浏览器搜索抖音账号操作规范.md 新增5.6并发互斥
- 端口 8899→8900 可传参(8899被小米MiPCAudio.exe系统服务占用且杀后复活)
- cdp-test-junxi.mjs 支持 --port 参数
- SKILL.md 工作台段落同步修正(旧认知 scheduled_at=now 已废弃)
- 俊希全流程 TC-01~11 复测全通过(验收表更新):并行解析6条+AI写脚本会话链路完整跑通
2026-09-01 00:36:02 +08:00

88 KiB
Raw Blame History

2026-08-31 工作日志

工作台首页顶部「数据预览」条带(09:34-09:50)

  • 用户需求:「工作台首页顶部增加数据预览 参考插件MCN工作台首页顶部的数据预览」→ 参考源确认 = D:\dshworkspace\plugin_package\dsh-plugin-mcn(本机源码唯一含 mcnNav_stats 的实现,非线上 agentos)
  • 参考实现(dsh-plugin-mcn client.js + index.js):首页 home 视图顶部 stats 条带(浅蓝底 rgba(65,118,230,.07)、圆角 12、padding 22px 0),5 项 statItem(flex:1 竖排 value 28px 粗体品牌蓝 + label 13px 次级色、item 右侧细边框分隔、末项无边框);数据 GET /mcn/api/stats(后端 60s 缓存):accounts=hot_accounts del_flag=0 / analyses=account_video_analysis 计数 / rewrites=rewrite_log done+script_text 非空 / reviews=script_review type='ai'+done / writingScore=最新 20 条 AI 复盘 total 平均(1 位小数)
  • 移植改动:①dsh-data.js getStats() 修正对齐参考——reviews 补 type='ai' 限定、writingScore 由「计数」改为「最新 20 条 AI 复盘平均分」(无数据返回 null);②app.js renderHome .home 顶部(data-cards 前)加 #homeStats 条带占位 + 新增 loadHomeStats()(挂载 fetch /api/dsh/stats 一次,5 项 label 与 dsh 一致,失败显示「数据不可用」)+ router home 分支与 _reload 调用;③style.css 新增 .home-stats/.home-stat-item/.home-stat-value/.home-stat-label(工作台品牌色 --primary #2f6fed 对应 dsh 的 #4176e6,背景 rgba(47,111,237,.07))
  • 验证(CDP #/ 强制刷新):5 项渲染值 热门账号7/视频解析12/AI写脚本17/AI写作复盘1/AI写作评分86.5 与接口一致 ✅;样式 computed 全符合(bg .07 蓝、圆角 12、值 26px 700 品牌蓝、item 右分隔线、末项无)✅
  • ⚠️ 坑:CDP Page.navigate 到仅 hash 不同的 URL(#/ranking→#/)不触发文档重载,CSS/JS 仍是旧版(表现为新增样式全部 computed 为默认值)→ 必须补 Page.reload({ignoreCache:true});服务端 dsh-data.js 改动需重启 node 服务(进程级 require 缓存)
  • 验证脚本保留 cdp-verify-homestats.mjs(结构+值+computed 样式测量,可复用)

首页账号周榜预览表:5 数值列加宽 + 功能列「分析」→「关注」(09:42-09:55)

  • 用户澄清:要加宽的是工作台首页的账号周榜预览表(非 #/ranking 功能页——上轮 08-28 加的是功能页,本轮补首页预览表)
  • 改 style.css(.rank-row grid):grid-template-columns: 34px 84px minmax(80px,1fr) 52px repeat(4,58px) 72px → ... 88px repeat(4,84px) 72px(综合得分 52→88、4 个数值列 58→84)
  • 改 app.js(loadRankingPreview 行模板):非 inDb 账号操作按钮「分析」→「关注」(title「分析该账号并加入账号列表」→「关注该账号并加入账号列表」;行为不变仍 confirmSaveAccount 保存并分析);inDb 账号保持「查看」
  • 验证(CDP #/ 强制刷新实测):5 列宽 score=88 / 4×rk-num=84 ≥80 ✅;按钮「关注」+ title 正确 ✅;10 行数据正常、首页 stats 条带与快捷卡片不受影响 ✅
  • ⚠️ 验证脚本坑:flex/grid 行内同类元素取列宽用 :nth-child(n)(按子元素序号),不能用 :nth-of-type(按元素标签类型 span 计数会错位);rk-num 是行内第 5-8 个子元素
  • 验证脚本保留 cdp-verify-rankpreview.mjs

账号周榜全部页面数值列「窄 + 右对齐」(09:50-10:05)

  • 用户需求:「账号周榜 全部页面 这些列宽度可以窄一些 右对齐:综合得分/粉丝/新增粉丝/新增点赞/新增评论/新增分享」
  • 功能页 #/ranking:①data-pages.js WIDE 集合补 followers(6 列)、数值列 td 加 num 类(综合得分 num score-cell);②style.css 根因排查——width:100% auto 布局下列需求总和(≈994px) < 容器(1440px),富余空间按比例摊薄拉宽每列,min-width 只是下限压不住拉伸(实测 110px 是摊薄结果,thMin 已 90px 却无效)→ 解法:周榜表单独 table-layout: fixed + 数值列 width:90px 硬约束(fixed 下 width 生效、min-width 忽略),排名 40/赛道 90/功能 85 固定,账号列吃剩余;table 加专属类 table-rank(避免影响账号列表等其他 .table 页面);td.num 缩 13px + tabular-nums + padding 8px
  • 首页预览表:.rank-row grid 列宽 88/84 → 76/76(grid 本来就是硬约束,仅缩窄;右对齐原本就有)
  • 验证(CDP 实测):功能页 6 列全部 90px + th/td 右对齐 ✅;首页 5 列 76px 右对齐 ✅;行数据/账号列自适应正常
  • ⚠️ 两个坑:①.table th { text-align:left } 特异性(0,1,1) 压过 .th-wide(0,1,0),需写 .table th.th-wide;②auto 布局富余空间摊薄是「列宽压不住」的真根因,fixed + width 才是硬约束
  • 验证脚本保留 cdp-verify-ranknarrow.mjs(功能页+首页双测)

「AI写作复盘」→「AI脚本诊断」改名 + 首页周榜列表上底色(09:56-10:08)

  • 用户需求:①「AI写作复盘」包括功能入口和数据预览名称都改为「AI脚本诊断」;②账号周榜列表内容区域上底色(原来透明与页面背景 #f5f6f8 同色很奇怪)
  • 改名 7 处全量替换(app.js 6 + data-pages.js 1):首页快捷卡片 title('flask')、数据预览条带 label(占位 HTML + loadHomeStats 两处)、CRUMB_TITLES、router titles、reviews 页 page-title、代码注释;index.html 无「复盘」字样;「AI写作评分」按用户范围保持不改;页面内部功能描述(复盘报告等)保持
  • 底色:.rank-preview-list 补 background: var(--panel); box-shadow: var(--shadow);(白色面板 + 阴影,与快捷卡片一致;功能页 .table-wrap 本就有 panel 白底)
  • 验证(CDP 实测):数据预览 label 与快捷卡片均为「AI脚本诊断」✅;全页无「AI写作复盘」残留 ✅;周榜列表背景 rgb(255,255,255) ✅;#/reviews 标题「AI脚本诊断」✅
  • 验证脚本保留 cdp-verify-rename.mjs

周榜功能列按钮统一白底带边框(09:58-10:10)

  • 用户需求:「账号周榜 功能列的按钮都改为 白底带边框」
  • 改 style.css .btn-import(功能页「分析」+ 首页「关注」共用):灰底 #f0f2f5 → 白底 #fff + 边框 #d0d4da,hover 变主色边框+主色字;.btn-view(查看)本就是白底+主色边框未动
  • 验证(CDP 实测):功能页「分析」白底 rgb(255,255,255)+边框 #d0d4da ✅;首页「关注」同 ✅
  • 验证脚本保留 cdp-verify-btnwhite.mjs

首页周榜预览改 tab 切换 + 新增 3 个空榜(10:02-10:15)

  • 用户需求:「首页账号周榜 改为 tab切换,新增 作品热榜、点赞日榜、涨粉日榜,功能先空着」
  • 改 app.js renderHome:<h3>账号周榜</h3> → .rank-tabs 4 个 .rank-tab(账号周榜 week 默认 active + 作品热榜 hot + 点赞日榜 likes + 涨粉日榜 fans),工具条保留(id=rankTools);内容区新增隐藏的 #rankPlaceholder 占位块
  • 改 app.js router home 分支:.rank-tab 点击切换 active;week → 显示 #rankTools+#rankPreviewList、隐藏占位;其余 → 隐藏工具条和列表、占位显示「『XX』建设中,敬请期待」
  • 改 style.css:.rank-tabs/.rank-tab/.rank-tab.active/.rank-placeholder(胶囊 tab:白底边框,active 主色蓝底白字;占位:虚线框+白底居中灰字)
  • 验证(CDP 实测):4 tab 初始状态 ✅;逐个点击 3 新榜 → 工具条/列表隐藏 + 占位文案正确 ✅;点回账号周榜恢复列表+筛选 ✅
  • 验证脚本保留 cdp-verify-ranktabs.mjs

首页周榜 tab 选中样式:深蓝胶囊 → 浅底色 + 下划线(10:16-10:25)

  • 用户反馈:「tab 能不能不要用 深蓝色选中,这是哪来参考的样式,太抢眼了,就用下划线效果 浅底色就行」
  • 首版 .rank-tab.active 沿用顶部主导航 .tab 的深蓝胶囊样式(白字+深蓝底 #2f6fed),用户嫌抢眼
  • 改 style.css:.rank-tabs 补 border-bottom:1px solid var(--border)(tab 栏底部分隔线,浅色方案基础);.rank-tab 透明背景 + border:none + border-bottom:2px solid transparent(下划线占位防切换抖动)+ 次级色文字;.rank-tab.active = background:var(--primary-soft)(#eaf1fe 浅蓝底)+ border-bottom:2px solid var(--primary)(主色下划线)+ 主色 600 字重;hover 同浅底主色
  • 验证(CDP 强制刷新实测):active computed bg=rgb(234,241,254) / color=rgb(47,111,237) / border=2px solid rgb(47,111,237) / weight=600 ✅;非 active 3 个 tab 全透明背景 + 透明下划线占位 + 次级色文字 ✅;4 tab 切换/回切 active 样式均正确 ✅
  • ⚠️ 验证脚本坑:querySelector 传入元素对象(不是选择器字符串)会报 '[object HTMLButtonElement]' is not a valid selector
  • 验证脚本保留 cdp-verify-tabstyle.mjs

首页周榜 tab 改名(10:10-10:15)

  • 用户需求:「把点赞日榜 和 涨粉日榜 去掉日,作品热榜 改为 视频热榜」
  • 改 app.js renderHome:tab 按钮文本 作品热榜→视频热榜、点赞日榜→点赞榜、涨粉日榜→涨粉榜(仅文案,data-rank-tab 值 hot/likes/fans 不变)
  • router 切换按 data-rank-tab 匹配 + 占位文案动态取 t.textContent,故只改按钮文本、占位自动跟随
  • 验证(CDP 强制刷新实测):4 tab 名称 账号周榜/视频热榜/点赞榜/涨粉榜 ✅;逐一点击占位文案「视频热榜/点赞榜/涨粉榜」建设中 ✅;回切账号周榜恢复列表 ✅

账号列表「导入」→「添加」+ 弹窗精简(10:13-10:22)

  • 用户需求:「账号列表中 导入功能名称 改为添加,点击按钮弹窗 名称改为 添加账号数据,输入项去掉 方式二和抖音号输入」
  • 改 data-pages.js:accImport 按钮「导入」→「添加」,title「添加账号数据(抖音账号信息 / 账号地址)」
  • 改 app.js openImportAccounts:弹窗标题「添加账号数据」;删除方式二整块(本地文件夹路径输入 + data-imp-dir)与抖音号输入(data-imp-did);说明文字去「方式一:」前缀(只剩一种方式);提交按钮「提交导入」→「提交添加」;提交逻辑清理——去掉 dir/did 分支,校验改「请填写账号名称或账号地址」,prompt 只含名称/地址,executeTask label '导入指令'→'添加指令'
  • 改 style.css:注释「导入账号弹窗:方式一账号信息 / 方式二本地文件夹」→「添加账号弹窗:账号信息(名称/地址)」
  • 保留:账号详情页 infoGrid「抖音号」展示字段(非输入项)、帮助页「导入账号」自然语言用法(用户未要求)
  • 验证(CDP #/accounts 强制刷新实测):按钮「添加」+ title ✅;弹窗标题/2 个输入项(账号名称+账号地址可选)/提交添加/无方式二·文件夹·抖音号 ✅
  • ⚠️ 验证坑:document.querySelector('.modal') 取到的是页面加载时自动弹出的「项目文件地址」设置弹窗(index.html 既有行为,非本次引入)→ 需取最后一个 .modal-mask 才是新开的弹窗

添加按钮图标:download → user-plus(10:15-10:18)

  • 用户需求:「按钮前面 图标也要改」——「添加」按钮前是下载图标(导入语义残留),需换贴合「添加账号」的图标
  • 改 app.js:ICON_PATHS 新增 'user-plus'(Lucide 标准:人像 + 右下加号);弹窗标题图标 svgIcon('download', 18) → svgIcon('user-plus', 18)
  • 改 data-pages.js:accImport 按钮图标 svgIcon('download', 15, 'currentColor') → svgIcon('user-plus', 15, 'currentColor')
  • 验证(CDP 实测):按钮/弹窗标题图标均为 user-plus、无 download 残留 ✅
  • ⚠️ 验证坑:查弹窗图标前必须先 click 打开(否则取到的是页面自动弹出的设置弹窗,无 h3)

AI写脚本页操作列按钮:「AI改写」→「AI写脚本」+ 样式统一(10:19-10:22)

  • 用户需求:「AI写脚本 列表页 操作列改名功能,按钮样式参考 账号列表中功能列按钮样式」
  • 背景:账号列表(#/accounts)操作列按钮本就是「AI写脚本」(btn btn-sm 白底灰边框 → confirmAiScript);AI写脚本页(#/rewrites)操作列却是「AI改写」(btn btn-sm btn-view 主色边框 → confirmRun 改写),两处语义不一致
  • 改 data-pages.js renderRewrites 行模板:<button class="btn btn-sm btn-view" data-rewrite=...>AI改写</button> → <button class="btn btn-sm" data-rewrite=...>AI写脚本</button>(文案统一 + 去掉 btn-view 改白底灰边框,与账号列表操作列一致)
  • 验证(CDP #/rewrites 强制刷新实测):按钮文本「AI写脚本」✅、class=btn btn-sm 无 btn-view ✅、白底 rgb(255,255,255)+灰边框 #e3e6ea+灰字 ✅(20 行全部生效)
  • 未改:视频详情页(298 行)与账号详情页的「AI改写」按钮(用户仅指定 AI写脚本列表页)、弹窗标题「改写脚本」

旧梦留声机账号设定卡(SVG 信息图,10:23-10:30)

  • 用户需求:参考《权游》影视需求 Skill 信息图,用「旧梦留声机」账号设定生成同款设定卡
  • 数据源:C:\Users\maidou\Desktop\MCNSkill项目\旧梦留声机\旧梦留声机账号设定.md(群像账号:六内容基因/六段式情绪核弹/角色类型库6类/红线6条/色彩体系/内容路线六步闭环)
  • 产出:旧梦留声机账号设定卡.svg(同目录,680×990 竖版信息图,show_widget 同步内联渲染)
  • 结构映射(对齐权游 12 模块):标题+类型+情绪锚点 → 内容路线6步流程条 → 核心气质8chips → 六大内容基因6卡 → 色彩体系5色卡(泛黄旧时光/冷灰乡土/暖黄回忆/冷白危机/明亮都市)→ 角色类型库6卡(含记忆符号)→ 六段式情绪核弹结构(柱状曲线+时长占比)→ 红线清单6条
  • 视觉语言:暖黄旧时光色系(c-amber #FAEEDA/#854F0B/#633806 主 + c-coral #FAECE7/#993C1D/#712B13 点缀),核爆段 coral 600 高亮;账号美学对齐(非权游深色)
  • 用户可继续要求:其他账号同款卡 / 调整模块 / 导出 PNG

旧梦留声机设定卡·情绪图条形加高(10:34-10:36)

  • 用户需求:「情绪图能否整体高度再高一些,各阶段情绪起伏明显」
  • 改 桌面\MCNSkill项目\旧梦留声机\旧梦留声机账号设定卡.svg 六段式情绪核弹结构:7 条条形底边统一对齐 y=812(原 804),高度放大——谷底「绝境施压」14→16、峰顶「核爆段」38→56,峰谷高差 24→40px;全部条顶 y 上移,注释行 y 822→836(与下方红线清单标题 y852 无重叠)
  • 验证:条形文字垂直居中仍贴合条形内;峰谷对比明显

旧梦留声机设定卡·长图版配色升级(10:35-10:40)

  • 用户需求:「长图版 标题颜色,卡片背景和文字颜色 都更好看」
  • 重写 旧梦留声机账号设定卡.svg 配色体系(布局坐标不变):
    • 标题:主标题改渐变 #8C2F1E→#C05A32 + weight 700;分隔线琥珀金 #E0953C;副标题 #B4642F;标语 #8C2F1E
    • 模块:标题统一 #5E2A1E 600 + 竖条珊瑚红 #C13B2F;卡片双色系交替——暖奶油 #FFF3E2+边框 #EDCBA4(路线/基因/色彩)与浅珊瑚奶油 #FDEBE2+边框 #E8B7A2(气质/角色/红线)
    • 文字:卡片标题 #7B2D1B/#8C3B2B,正文暖灰 #6F5B4A(替代原 #5F5E5A 纯灰);情绪图核爆 #D6403A+白字600,琥珀系统一 #F0B25C/#F7D9A8;红线×号 #C13B2F 600
    • 整图加暖米底 #FDF8F0(原透明)

旧梦留声机设定卡·情绪图条形高度翻倍(10:37-10:42)

  • 用户需求:「情绪部分 高度继续增加 一倍」
  • 改 旧梦留声机账号设定卡.svg:7 条条形高度全部 ×2(38→76/16→32/32→64/56→112/42→84/26→52/36→72),底边统一对齐 y=880(原 812);因条形变高,注释行 836→904、红线清单整体下移(标题 852→932,卡片行 872/910/948→952/990/1028),viewBox 高度 990→1080
  • 验证:高度×2 正确、底边全对齐 880、文字仍居中(核爆 768+56=824)

旧梦留声机设定卡·基因卡/角色卡排版升级(10:39-10:45)

  • 用户需求:六大内容基因与角色类型库卡片文字排版按「GENE 01 标题 内容」「角色中文 英文 内容」样式
  • 六大内容基因卡:标题行拆为「GENE 0X」珊瑚红 #C13B2F 10px 600 小标签(x=61/259/457)+ 标题 12px 600 #7B2D1B(x=118/316/514),内容两行不变
  • 角色类型库卡:标题行拆为「中文名」12px 600 #8C3B2B(x=61/259/457)+ 英文名 9px #B0715A 右对齐(text-anchor=end,x=223/421/619),内容行不变;英文名=Elder Guardian/Repaying Child/Suffering Mother/Great-Love Prototype/Guiding Benefactor/Stubborn Dreamer
  • 验证:SVG 结构完整(1 svg/8 g/53 rect/97 text)、6 GENE + 6 英文名就位、全部标题末字尾 ≤ 卡右缘-8 无溢出

旧梦留声机设定卡·按参考长图版整体重写(10:44-10:55)

  • 用户反馈:「排版还是不一样呢,仔细看看之前生成 长图版」+ 提供参考图 桌面\旧梦留声机_账号设定卡_长图版.png
  • 重写 旧梦留声机账号设定卡.svg(完全推翻前几版,viewBox 680×1560):
    • 背景:深棕红渐变 #2B0F0A→#1A0805(原暖米底)
    • 顶部大框:浅米色 520×170 圆角 14,框内"旧梦留声机 · 账号 / 设定卡"两行 26px 渐变大标题 + 琥珀金分隔线 + 副标题 + 标语
    • 装饰线:居中 — channels requirement board 2026 —
    • 模块标题:▍+ 浅米色 14px 加粗
    • 六大内容基因卡(186×130,原 72):GENE 0X 标签 letter-spacing 1 + 大标题 14px 700 + 3 行描述(含新增金句"让他撑下去"/"脏一点泪点多一点"等)
    • 角色类型库卡(186×130,原 48):PROTOTYPE 标签 + 中文名 14px 700 + 英文代号大写斜体 E. ELDER / R. REPayer / M. SUFFERING / A. ARCHETYPE / G. GUIDE / D. DREAMER + 2 行描述
    • 红线清单:深色 #3D1810 卡 + 边框 + 红×号
    • 底部版权:数据来源 + content requirement board

旧梦留声机设定卡·修复红线清单与情绪图高度(10:47-10:52)

  • 用户反馈:红线清单内容少了(重写长图版时只保留 2 条)、情绪部分高度又变矮了(重写时条形缩水)
  • 修复 旧梦留声机账号设定卡.svg:
    • 红线清单 2 条 → 补全 6 条(消费苦难/伪造真实素材/美化悲剧/角色没名字/强行好结局/植入打断情绪,2 列×3 行,卡 y=1538/1576/1614)
    • 情绪图条形恢复到翻倍高度:56→76/26→32/44→64/76→112/54→84/34→52/46→72,底边对齐 y=1452(核爆段 y=1340 与标题基线 1336 差 4px 不重叠)
    • viewBox 1560→1700,底部版权下移至 1672/1684
  • 验证:7 条底边全对齐 1452、红线 6 条、无重叠

旧梦留声机设定卡·去 PROTOTYPE + 情绪小字(10:48-10:53)

  • 用户反馈:① 角色类型库不需要加 PROTOTYPE 这个英文 ② 参考图情绪部分下面有一行小字
  • 修改 旧梦留声机账号设定卡.svg:
    • 去掉 6 张角色卡的 PROTOTYPE 标签(珊瑚红小标签)→ 角色卡排版简化为「中文名 + 英文代号 + 3 行描述金句」(描述从 2 行扩到 3 行,新增金句"沉默里把全家扛在肩上"/"朴素到极致是最贵的善良"/"指路的手势比讲理更动人"等)
    • 情绪图下方加一行小字 y=1506:情绪节奏总览:压抑蓄力 → 核爆释放 → 破壁落地,每 10-30 秒完成一次情绪反转(11px 斜体浅米色 #D9BFA3,居中)
  • 验证:PROTOTYPE 残留 0,6 中文名+6英文代号完整,小字行已嵌入

旧梦留声机设定卡·标题换行+内容路线颜色(10:49-10:53)

  • 用户反馈:①「旧梦留声机 · 账号 / 设定卡」换行不好看 → 改「旧梦留声机」+「账号设定卡」两行(26px 渐变标题,不带点号)② 内容路线参考图不是深色 → 卡片由 #3D1810 深色改 #FAEEDA 浅米色 + 边框 #EDCBA4 + 文字 #7B2D1B(与参考图/基因卡同色系)
  • 验证:标题两行、内容路线 6 卡填充/边框统一浅米色

旧梦留声机设定卡·标题大小层级(10:51-10:54)

  • 用户反馈:「账号设定卡 这几个字明显该小一些」
  • 改 旧梦留声机账号设定卡.svg 顶部标题:「旧梦留声机」28px 700 渐变 +「账号设定卡」16px 600 #8C2F1E letter-spacing 2(副标题级,缩小 12px),形成大小主次

旧梦留声机设定卡·垂直居中+间距修复(10:52-10:56)

  • 用户反馈:① 内容路线卡片中文字没有垂直居中 ② 红线清单和情绪下面的文字靠在一起了
  • 改 旧梦留声机账号设定卡.svg:
    • 内容路线 6 个文字 y 326→321(=卡片中心 296+25,垂直居中)
    • 红线清单整体下移:标题 1522→1538、红线卡 1554/1592/1630、版权 1688/1700;情绪小字(y1506)与红线标题间距 16→32px;viewBox 1700→1716
  • 验证:6 文字全部居中、间距 32px、红线 3 行 1554/1592/1630、viewBox 1716

旧梦留声机设定卡·色彩体系卡片加高(10:53-10:58)

  • 用户反馈:「色彩体系 卡片 参考图中也高一些」
  • 改 旧梦留声机账号设定卡.svg:色彩卡高度 50→80(y=882 h=80,标签文字 954→984);角色类型库整体下移 10px(标题 1000→1010,卡 1018→1028/1162→1172,内部文字同步 +10)
  • ⚠️ 坑:手动 Edit 改第一张卡 y 后又用脚本整块 +10,导致第一张卡双重偏移(1038),已单独修正回 1028
  • 验证:色卡 h80、角色卡 y 统一 1028/1172、色卡底 962 vs 角色库标题 1010 间距 48、角色库底 1302 vs 情绪标题 1336 间距 34

账号分析技能新增「功能六:生成账号设定卡片」(10:55-11:05)

  • 用户需求:把生成账号设定卡片总结成一个功能(方式/要求/格式/注意事项),放入账号分析技能
  • 新增 references/feature/06_生成账号设定卡片.md(源+dsh 副本同步):输入=功能三产出 {达人昵称}账号设定.md;产出={达人昵称}账号设定卡.svg(680×~1700 深色长图);四步方式(读设定→12段模块映射→SVG手绘→验证交付);配色规范表(深棕红渐变背景/浅米色卡片/GENE 0X 标签/角色英文代号/核爆红);注意事项含「批量移动坐标防双重偏移」等 7 条避坑
  • 改 SKILL.md:功能总览 五大→六大功能 + 功能六行;新增「八、功能六」章节;部署禁用说明补功能六(无连带文件);章节编号 七/八/九 连续
  • 验证:源技能与 dsh 副本 06 文件与 SKILL.md diff 一致 ✓

账号分析技能功能六·补充模板样例与适配规则(10:58-11:08)

  • 用户追问:下次生成别的账号设定卡片也要达到相同效果 → 除流程规范外补充三块
  • ① 模板样例入技能(自包含):references/样例/模板_旧梦留声机账号设定卡.svg(最佳成品)+ 参考_旧梦留声机_账号设定卡_长图版.png(渲染效果);功能六「方式」新增 ①.5 步——动手前必读模板,复用版式骨架/样式常量,内容全替换;模板迭代=改模板→同步生成旧梦留声机卡确认→再用于新账号
  • ② 模块裁剪适配规则(新章节):按设定实际内容裁剪/增补——无流程删内容路线、无角色库删角色库、基因按条数定列数(2/3列 卡宽=600px/列数-间距)、情绪按实际段数(4-7段)、色彩用真实色值、红线条数不限;每个保留模块须 grep 验证能找到原文
  • ③ 配色适配规则(新章节):背景/卡片默认深色长图风保系列一致;色彩体系色块用账号真实色值;强调色跟随账号主色(暖→珊瑚红/琥珀,冷→冷蓝/冰青);冲突时以看得清/有层次/账号辨识度最高准则
  • 同步:源技能 06 文件+SKILL.md+样例目录 → dsh 副本全部 diff 一致

MCN工作台 账号详情 persona tab 卡片/文字切换(11:00-11:35,三轮迭代)

  • 用户需求:账号详情「账号设定」tab 改为可切换「卡片版/文字版」,默认显示卡片,无卡片显示文字
  • 后端新增 2 接口(server.js):
    • /api/dsh/account-card?name= → 在 allowedRoots() 各根目录下查找 {账号名}账号设定卡.svg(规范路径 {root}/{name}/{name}账号设定卡.svg → 根下直挂 → 账号目录内扫描含「账号设定卡」的 svg,防目录名/账号名不一致)
    • /api/file?path= → 内联文件输出(无 attachment 头,Content-Type 按 mimeOf),供 <img> 渲染 SVG
    • 新增 findAccountCard(name) 工具函数(安全清理 [\\/:*?"<>|] 非法字符防路径穿越)
  • 前端 persona tab 改造(data-pages.js renderAccountDetail):
    • 状态:viewMode='card'(卡片版默认)+ personaCard={path|null}
    • loadPersona() 改 Promise.all([account-persona, account-card]) 并行加载
    • panel 三态渲染:无设定→空态按钮(不变)/ 无卡片→直接文字版 persona-text / 有卡片→右上角图标切换组 .persona-wrap > .persona-vs-icons + .card-view + .persona-text
    • 切换事件:直接 DOM 切换 .card-view/.persona-text 的 vs-hidden 类(不重渲染,保留滚动位置);按钮选择器 [data-vs] 兼容图标按钮
  • 样式三轮迭代(style.css):
    1. 整行 segmented control「卡片版|文字版」+ 蓝底激活态(.view-switch 块)
    2. 改为右上角图标按钮组:.persona-wrap { position:relative } + .persona-vs-icons { position:absolute; top:0; right:0; z-index:2; display:inline-flex },图标 film(卡片)+ file-text(文字),激活态蓝底白字
    3. 卡片图片 max-width: 540px → width:100% 自适应内容区域(去 max-width,依赖父 page max-width 封顶)
  • 多视口验证(CDP Emulation 900/1024/1280/1920/2560):
    • imgW = wrapW,小视口 811→中视口 1191→大视口封顶 1382
    • 所有视口 docScrollW < viewport,无横向滚动
    • 用例 1629 旧梦留声机(有卡):默认卡片版、切文字版、切回卡片版 全过
    • 用例 1627 王微斯(无卡):直接文字版无切换控件
  • 服务重启:旧 23976 任务被停(cNHaFK),新启后台任务 QMmTlH(127.0.0.1:8899);服务 Cache-Control: no-store,改完仍需 Page.reload({ignoreCache:true}) 强制刷新
  • 验证脚本保留 cdp-verify-personacard.mjs(多视口自检+三态断言+截图,可复用)

功能六配色适配升级:底色跟随账号风格(11:17-11:22)

  • 用户反馈:「不同风格账号卡片要用对应底色,不是全部都是一个颜色」
  • 改 06 文件「配色适配」章节(原「默认沿用深色长图风」→ 强规则「禁止一律模板深棕红底」):
    • 三步判定:①读设定色彩体系真实色值+赛道判风格 ②风格→底色映射表(7 类:暖怀旧→深棕红/浅米、温情亲子→深焦糖/奶油米、科技冷淡→深灰蓝/冷白、清新三农→深墨绿/米白、潮流都市→深紫黑/浅灰白、活力运动→深海军/冷白、甜美少女→深莓紫/浅粉白) ③强调色=账号主强调色
    • 底色推导公式(未覆盖风格):主色压暗 15-25% + 降饱和 → 深色渐变底;卡片色取高对比浅色;系列一致性=同账号一致非跨账号一致
  • 改 ①.5 读模板样例:「配色体系为基准」→「版式骨架/字号/卡片尺寸/间距为基准,配色不沿用模板」
  • 改 SKILL.md 八功能六配色适配要点:底色跟随账号风格,禁止一律模板深棕红底 + 风格映射摘要
  • 源技能 → dsh 副本同步,06 文件与 SKILL.md diff 全一致

功能六新增「触发场景处理」章节(11:20-11:24)

  • 用户问「如果用户要求生成账号设定卡片,应该如何处理 分几种情况」→ 输出 7 情况分类 + 三问判定链,用户认可后固化
  • 06 文件新增「触发场景处理」章节(输入/产出之后、方式之前):三问判定链(①有无设定→无则功能三或全链路 ②卡片是否已存在→有则询问覆盖/微调 ③模块是否完整→缺则裁剪适配)+ 7 情况表(有设定无卡/有设定有卡/无设定在库/无设定不在库/设定缺模块/参考样式/调整已有卡)+ 环境路径
  • SKILL.md 八功能六补「触发判定」行(指向 06 触发场景处理)
  • 源技能 → dsh 副本同步,06 文件与 SKILL.md diff 全一致

功能六「内容基因 TOP6 全量」术语澄清(11:25-11:28)

  • 用户问「账号设定中 TOP6 全量验证 是想说根据TOP6视频分析得出的吗」→ 确认混淆点:模块映射表第 4 行原写「内容基因(TOP6 全量)」,易误读为「TOP6 个基因」
  • 改 06 文件模块映射表第 4 行:「内容基因(TOP6 全量)」→「内容基因(设定中全部条目,全量呈现)」+ 新增术语澄清块(第 77 行):本表「内容基因全量」= 设定文件中内容基因条目全部上卡、不裁剪(旧梦留声机恰 6 条,非指 TOP6 视频);内容基因条目由功能三基于 TOP6 视频(筛选权威参数见 SKILL.md「视频筛选标准」)解析提炼得出——TOP6 视频是分析依据(输入),内容基因是结论呈现(输出),两个「6」层级不同,勿混淆
  • 源技能 → dsh 副本同步,grep 确认两处第 77 行内容一致,且全文仅此一处含 TOP6 字样

功能六「六大内容基因·TOP6」表述简化(11:29-11:31)

  • 用户反馈:「简化为 六大内容基因·TOP6 就行了 后续生成卡片也这样描述就行」
  • 改 06 文件:模块映射表第 4 行「内容基因(设定中全部条目,全量呈现)」→「内容基因(功能三基于 TOP6 视频提炼的结论)→ 六大内容基因·TOP6」;术语澄清块精简为一行注(保留核心:TOP6 视频=分析依据输入、内容基因=结论输出、卡片全量呈现不裁剪)+ 明确「后续生成卡片统一以『六大内容基因·TOP6』描述该模块」
  • 源技能 → dsh 副本 cp 同步,diff 一致

功能六「内容基因·TOP6」定名 + 旧梦产出同步修改(11:31-11:33)

  • 用户两连纠正:「简化为 六大内容基因·TOP6」→ 随即「应该改为 内容基因·TOP6」(去掉「六大」)
  • 06 文件(源+dsh):模块映射表第 4 行信息图模块「六大内容基因·TOP6」→「内容基因·TOP6」;术语注末句同步改「后续生成卡片统一以『内容基因·TOP6』描述该模块」
  • 旧梦留声机产出同步(桌面 MCNSkill项目/旧梦留声机/):
    • 旧梦留声机账号设定.md:小标题「六个内容基因标记(TOP6 全量验证)」→「内容基因·TOP6」;九差异化壁垒表「六个内容基因是频道级复用资产」→「内容基因·TOP6 是频道级复用资产」
    • 旧梦留声机账号设定卡.svg:模块标题「▍六大内容基因(TOP6 全量验证)」→「▍内容基因·TOP6」;desc 与代码注释同步改
  • grep 验证三目录(源/dsh/桌面)无「六大内容基因/六个内容基因/TOP6 全量」残留

「核心气质」→「内容标签」改名(11:32-11:34)

  • 用户反馈:「核心气质 应该 改为 内容标签」
  • 06 文件(源+dsh):模块映射表第 3 行「核心气质/人设标签 | 核心气质(chips)」→「内容标签/核心标签 | 内容标签(chips)」
  • 模板样例 SVG(源+dsh):desc/注释/模块标题 3 处「核心气质」→「内容标签」;顺带补上一轮遗漏——desc 里「六大内容基因」→「内容基因·TOP6」、注释+模块标题「▍六大内容基因(TOP6 全量验证)」→「▍内容基因·TOP6」
  • 06 文件裁剪适配表(源+dsh):「保留『六大内容基因』」→「保留『内容基因·TOP6』」(上一轮漏改)
  • 桌面产出(旧梦留声机):卡片 SVG 3 处「核心气质」→「内容标签」(sed)
  • 验证:源/dsh 两文件 diff 全一致;三目录 grep「核心气质|六大内容基因|六个内容基因」零残留

「内容路线」→「叙事结构」全链路改名(11:34-11:37)

  • 用户反馈:「内容路线 改为 叙事结构」——本次术语同时是设定字段名(设定 md 第 16 行)与卡片模块名,按命名一致性全链路统一
  • 源技能 sed 批量替换 4 文件(06 文件 4 处:模块映射表第 2 行/触发场景第 5 行/裁剪适配 96/97 行;人设卡生成方法.md 3 处:模板维度定义+校验清单 2 处;模板样例 SVG 3 处:desc/注释/标题;SKILL.md 1 处:功能六「无流程删叙事结构」)→ cp 同步 dsh 副本,diff 4 文件全一致
  • 桌面产出:设定 md 第 16 行字段「内容路线」→「叙事结构」;卡片 SVG desc/注释/标题 3 处同步
  • 不动:.bak 备份、视频分析/*/analysis.json 历史解析原始数据(保持数据准确性);dsh tmp/backfill_track_ztq.py 历史回填脚本(其他账号数据文本)
  • 验证:功能文档三处 grep「内容路线」零残留

生成王微斯账号设定卡(11:45-11:52,功能六首个新账号实例)

  • 用户需求:「生成 王微斯的 账号设定卡」;触发场景=有设定无卡→全流程生成(桌面 MCNSkill项目/王微斯/王微斯账号设定.md,08-13)
  • 产出 王微斯账号设定卡.svg(680×1716,深色长图,同模板版式骨架)
  • 配色适配(不沿用模板深棕红):甜宠情感/乙女向→风格映射「甜美少女→深莓紫/浅粉白」→ 背景 #2A0F2E→#18071C 渐变、卡片 #FDF0F6 浅粉白+边框 #F0C9DD、强调玫红 #E0437F/#D84A8C、chips 深莓 #3D1030
  • 模块裁剪适配(王微斯 vs 旧梦差异):①内容基因 4 条→2×2 卡(卡宽 285=582-12/2,非模板 3 列)②情绪 四段式→4 条形(开场76/推拉100/破防128玫红高亮/收口88,底边全对齐 1452)③角色类型库=女主横卡(582×100)+男主 4 卡 2×2(无英文代号省略斜体行)④叙事结构 5 步→5 卡 104 宽⑤删色彩体系模块(设定无色彩体系段,不硬塞)⑥内容标签 12 chips 两行
  • 验证:svg/g 配对(1/1,15/15)、4 条形底边 1452 全对齐、模块间距≥30px、最长文字行(红线19字)不超卡右缘 ✓

配色适配·底色=背景色 修正(11:49-11:53)

  • 用户澄清:「我说的是改底色就是背景色,不是改里面的元素的颜色」——之前我把映射表写成「背景色/卡片色/强调色」3 列并改了王微斯卡片元素色,理解偏了
  • 修正 06 文档配色适配章节(源+dsh):①明确「底色=整卡背景色」,卡片/文字/标签/强调色等内部元素颜色不随账号变,统一按下方「配色规范」表(浅米卡+深色字+珊瑚红强调);②映射表去「卡片色」「强调色」列,只留「背景底色」;③强规则加「只换背景色:内部元素一律按配色规范表」;④配色规范表标题「旧梦留声机定版」→「模板统一色,所有账号通用;仅背景色随账号风格换」
  • 改 SKILL.md(源+dsh)功能六配色要点:明确「底色=整卡背景色,只换背景色,内部元素保持模板统一色」
  • 修正王微斯卡元素色(sed 批量):卡片 #FDF0F6→#FAEEDA、边框 #F0C9DD→#EDCBA4、标题 #7B2D5E→#7B2D1B、正文 #6F4A5E→#6F5B4A、GENE #D84A8C→#C13B2F、chips #3D1030→#3D1810+边框 #A8879B→#A88770、标题渐变 #C0457F→#8C2F1E / #E876A9→#C05A32、副题 #8C3B6B→#8C3B2B、情绪条 #F7D9E8→#F7D9A8 / #F2C0DA→#F0B25C / #E0437F→#D6403A / #C22F6A→#A92825、红线 #E0437F→#D6403A、版权 #8A5E7A→#7A5645;仅保留背景渐变 #241020→#12070F(深莓紫,甜美/甜宠风格映射)
  • 验证:svg/g 1/1+15/15、模板色使用 96 处、粉色系残留 0;CDP 截图渲染确认背景深莓紫+元素全模板色(系列感一致)
  • 脚本保留 cdp-shot-wangweisi.mjs(本地 SVG 截图自检)

深莓紫背景调亮(11:52-11:54)

  • 用户反馈:「背景色 我看还是黑色呢」——原映射色 #241020→#12070F 压太暗,紫调不可辨,视觉近黑
  • 调亮:王微斯卡 bgGrad #241020→#12070F → #3A1E42→#22102A(顶部 R58/G30/B66 紫调明显、亮度≈旧梦深棕红 2 倍;底部深紫 #22102A,仍保深色底)
  • 06 文档映射表(源+dsh)甜美/少女/二次元行同步更新色值
  • 经验固化:深色渐变底顶部色需保紫/蓝/绿等色相可辨(亮度≈50/255),过暗则视觉归黑;旧梦深棕红 #2B0F0A 亮度 23 但因红棕调暖尚可辨,冷色调更易显黑需提亮

工作台账号设定内容区左右 +20px 间隔(11:42-11:44)

  • 用户反馈:「账号设定卡 左右可以在间隔20PX」→ 澄清:不是改 SVG,是工作台账号详情「账号设定」tab 内容区距页面左右再增 20px 间隔
  • 改 style.css .persona-wrap: position: relative → position: relative; padding: 0 20px;(卡片版 .card-view 与文字版 .persona-text 同在 persona-wrap 内,左右各内缩 20px;绝对定位的 .persona-vs-icons 切换图标不受 padding 影响仍贴右上角)
  • 验证(CDP #/account/1629 强制刷新 + 点 persona tab):computed padding-left/right=20px;卡片 imgW 1122.7 vs detail-body 1172.7,内缩合计 50px(左 detail-body 10 + persona 20,右 persona 20);文字版 inset 同 50 ✓
  • 静态 CSS 改动无需重启服务(HTTP 200);验证脚本保留 cdp-verify-personapad.mjs

王微斯账号设定卡重写为浅色甜宠风(11:54-11:55)

  • 用户反馈:「这个账号的调性 应该是没那么深的颜色」——深莓紫 #3A1E42→#22102A 仍偏暗,账号整体偏甜宠少女应走明快调性
  • 重写 桌面\MCNSkill项目\王微斯\王微斯账号设定卡.svg 为浅色甜宠风(布局坐标 680×1716 不变,全量换色):
    • 背景:#3A1E42→#22102A 深莓紫 → #F8EDF6→#F1E0EE 浅粉紫渐变
    • 顶部标题框:白 #FFFFFF + 粉边 #E8C9DC,主标题渐变 #C0457F→#E876A9(粉),副标题/标语/模块标题 #7B2D5E(深粉)
    • 五步推拉 / 内容标签 / 基因卡 / 角色库:内部元素全部从「模板统一色 + 粉调」改回「白卡 + 粉边 + 粉 chips」体系(chips #F7E8F2/#D8A9C8、GENE 标签 #E0437F、正文 #6F4A5E)
    • 四段式情绪:浅粉/中粉/破防段 #E0437F 高亮(白字 700)/浅粉,注释 #B98AA6、小字 #A98A9C
    • 红线清单:浅粉条 #F7E8F2 + 粉×号 #E0437F、文字深粉
  • 06 文档新增「浅色系配色规范」(源+dsh 同步):
    • 配色适配章节重写:底色分两系(深色系=深沉浓郁调性,浅色系=明快/甜美/治愈调性),内部元素跟随所选色系,不再「只换背景色」→ 改为「底色决定色系」
    • 关键定义:浅色系 = 白卡 + 粉边 + 深粉文字 + 粉强调
    • 风格映射表「甜美/少女/二次元」行:深莓紫(调性深沉时)|浅色甜宠风 #F8EDF6→#F1E0EE(调性明快时,如王微斯)
    • 新增浅色系推导公式:主色 → 提亮 90%+ 亮度 + 大幅降饱和 → 浅色渐变底;正文用主色加深版(#7B2D5E 档)
    • 配色规范表拆为两套并列:「深色系(深色长图风,如旧梦留声机)」+「浅色系(浅色甜宠风,如王微斯)」(含背景/标题框/主标题渐变/副标题/模块标题/卡片背景×2类/卡片标题/正文/GENE/英文代号/情绪图破防/琥珀段/小字/红线×号 14 行色值)
    • 强规则第 2 条「只换背景色」→「底色决定色系」
  • 验证:源/dsh 06 文档 diff 全一致;CDP 截图(shot-wangweisi-card.png)渲染确认浅粉紫底+白卡+深粉字+破防段粉红高亮,整体调性明快甜宠 ✓
  • 经验固化:配色分两系而非单系——深色系适合剧情/怀旧/深沉调性,浅色系适合甜宠/少女/治愈/明快调性;同一账号必须固定色系,跨账号可不同;未来生成新账号卡片时按风格落系,色值从对应色系表查,禁跨系混用
  • 脚本升级:cdp-shot-wangweisi.mjs 页面匹配 decodeURIComponent(t.url).includes('王微斯')(9223 URL 百分号编码坑)+ 补 Page.reload({ignoreCache:true})(同 URL navigate 不重载)

王微斯卡片·玫瑰金背景试版(12:01-12:03)

  • 用户需求:「这个保留 再试试 偏粉的深一点的玫瑰金色」——保留当前浅色甜宠风版式与内部元素,仅换背景为偏粉深玫瑰金渐变
  • 改 桌面\MCNSkill项目\王微斯\王微斯账号设定卡.svg:
    • 渐变:#F8EDF6→#F1E0EE 浅粉紫 → #D6A3A9→#9A5563(顶部偏粉玫瑰金 → 底部深玫瑰金)
    • 背景上直接书写的元素提亮(背景变深需保可读):6 处模块标题 #7B2D5E→#FDE8EC(浅粉白)、装饰线+4 处情绪百分比小字 #B98AA6→#EAC6CE、斜体行+版权 2 行 #A98A9C→#DDBCC4
    • 不动:白卡 #FFFFFF×15、粉 chips #F7E8F2×20、卡片内深粉文字/粉强调等全部内部元素(遵守「改底色=改背景色」原则)
  • 备份:原浅粉紫版 → 王微斯账号设定卡_浅粉紫底.bak.svg(同目录,可回退)
  • 验证(CDP 断言+截图 shot-wangweisi-rosegold.png):bg0=#D6A3A9 / bg1=#9A5563 / 6 标题 #FDE8EC / 装饰线 #EAC6CE / 版权 #DDBCC4 / 白卡 15 / 粉 chips 20 全保留 ✓
  • 验证脚本保留 cdp-verify-rosegold.mjs(断言渐变 stop + 背景上文字 + 内部元素计数,可复用)

王微斯卡片·定稿玫瑰金底(12:03-12:05)

  • 用户反馈:「感觉那个(玫瑰金)更适合 这个账号调性」→ 玫瑰金底定稿,当前 王微斯账号设定卡.svg(#D6A3A9→#9A5563)为最终版;浅粉紫备份 _浅粉紫底.bak.svg 保留可回退
  • 06 文档固化(源+dsh 同步,diff 一致):
    • 映射表甜美行:深莓紫(深沉时)|玫瑰金 #D6A3A9→#9A5563(明快时,如王微斯·定稿)
    • 浅色系推导改「提亮+降饱和至中浅明度(约 65-90% 亮度)」+ 新增「背景上直接书写的文字随背景深浅提亮保可读」(玫瑰金底:模块标题 #FDE8EC/装饰线注释 #EAC6CE/斜体版权 #DDBCC4)
    • 浅色系表更新:背景=玫瑰金(更浅可回退浅粉紫)、模块标题=#FDE8EC、情绪小字=#EAC6CE;表后加注释(背景越浅越近深粉字、越深越近浅粉白)
  • SKILL.md 功能六配色段更新(源+dsh diff 一致):「只换背景色」→「底色决定色系」两系完整表述 + 玫瑰金映射 + 浅色系推导 + 背景文字提亮
  • MEMORY.md:浅色系定稿色值更新为玫瑰金
  • 经验固化:用户试色闭环=「先试浅→再试深一点有色相→选定稿」,配色迭代时备份每个候选版(.bak.svg)防回退;色系表以账号定稿为准反哺文档,避免文档停留在试色中间态

王微斯卡片·叙事结构箭头位置修复(12:07-12:08)

  • 用户反馈:「叙事结构 卡片之间的箭头 都偏到 卡片里面了」
  • 根因:卡片缝隙仅 15px,但箭头 line 只画了 2px(如 x1=153 x2=155),marker 宽 6px(refX=8 → 尾部在 x2-4.8),箭头主体伸进左侧卡片约 3px
  • 修复:4 条箭头线拉长占满缝隙——154→166 / 273→285 / 392→404 / 511→523(各 12px;卡右缘+1 起、卡左缘-2 止),箭头整体居中于两卡之间,尾部不碰卡1、尖部离卡2 左缘 2px
  • 验证(CDP 断言):4 线 x1/x2 全对、线长≥11px(arrowsInGap=true)、背景/标题/白卡15/粉chips20 不受影响 ✓
  • 经验固化:卡片间箭头/连线必须按缝隙宽度画线(缝隙宽-3~4px 的线长),marker 宽度决定最小线长(线长须 ≥ marker 渲染宽 + 1px,否则箭头伸进相邻元素);同款五步卡布局(104 宽×5 + 15px 缝隙)复用时直接套用此坐标

固化:功能三自动联动生成设定卡 + 双向联动维护(12:12-12:15)

  • 用户需求:「给用户获取账号设定时 自动生成设定卡片,固化到skill中,修改时两边一起修改」——①功能三产出设定后自动生成卡片(无需用户开口)②设定 md 与卡片 SVG 双向联动同步修改,全部固化到技能
  • SKILL.md(源+dsh):功能总览表功能六「功能三之后可选」→「功能三自动联动(默认)」;部署禁用说明补「删除功能六文件则不再自动生成(存量可手动)」;功能三核心流程加 Step 7(自动联动);功能六章节加「自动触发(默认)」+「双向联动维护」
  • 03_提炼账号设定.md(源+dsh):新增 Step 7:自动生成账号设定卡片(联动)——默认自动触发(跳过条件:功能六文件删除/用户明确只要设定)+ 双向联动维护 3 条规则(改设定→卡片同步、改卡片→设定同步、术语改名→两边一起改)+ grep 一致性校验
  • 06_生成账号设定卡片.md(源+dsh):使用场景改「默认由功能三自动联动触发」;触发场景处理加「默认自动触发」说明;情况 1 注「自动流程已覆盖」;环境路径后新增「双向联动维护」章节(含历史改名案例:内容路线→叙事结构、核心气质→内容标签、六大内容基因→内容基因·TOP6)
  • 验证:3 文件源=dsh diff 全一致;MEMORY.md 联动规则已固化
  • 经验固化:功能联动类需求固化落点=SKILL.md(总览/章节)+ 上游功能文档(自动触发的源头)+ 下游功能文档(触发判定与维护规则);「修改时两边一起修改」的准确载体=设定 md ↔ 卡片 SVG 两个产出文件(非源技能/dsh,那是既有同步策略)

mcn-video-prompt 提示词输出结构 4层→6层重排(用户定稿,14:29)

  • 新结构:①主体列表 → ②画面质感(视觉风格+摄影质感参数,视觉基调前置)→ ③色调光影(光源+主光方向+亮暗区+色调/色温)→ ④主体设定(人物/场景/构图)→ ⑤镜头叙事 → ⑥负面提示词;原「②设定」层拆为画面质感/色调光影/主体设定三层,视觉基调前置(模型对提示词开头权重最高)
  • 修改文件 3 个(逐条改+验证):
    • subskill/mcn-video-prompt/references/制作流程/分镜提示词制作流程.md(权威出处,9 处):3.2/3.2.2 标题、改造原则、3.2.1 思考清单层号映射、3.2.2 输出格式块整体重排、6层×5类型适配表(列扩为⑦列)、Step5 校验②结构完整性、总流程 3 处引用、对比表技术参数行
    • subskill/mcn-video-prompt/SKILL.md(8 处):F4 提示词内部结构、F2/F4 详细方法论引用×2、剧本分析前置段、工作流 Step3、提示词模板节×2、自检⑧结构完整性;frontmatter updated_at=2026-08-31+last_change
    • subskill/mcn-video-prompt/references/制作流程/长视频分段制作流程.md(4 处):一致性锁定表(②设定-视觉风格→②画面质感等)、简单段/复杂段输出模板重排为 6 层
  • 验证:全局 grep 旧层号零残留("4层"仅剩 last_change 变更描述+L189 F2"4层退化策略"无关概念);6层落位 SKILL.md×8/分镜提示词制作流程×7/长视频分段×3
  • 注:dsh 副本(storyboard-prompt)未同步,按 .dsh 单向只读约定待用户授权

关闭工作台服务 + 项目同步仓库(15:01-15:05)

  • 用户需求:「关闭工作台服务,项目同步到仓库 已本地文件为准」(中断后重发「同步项目到 仓库」)
  • 关停服务:8899 工作台 node 服务双 PID(20604/29924)用 PowerShell Stop-Process -Id -Force 终止(Git Bash taskkill //PID 参数转义报错不可用);残留 LISTENING PID 33216 查证为系统无关进程 MiPCAudio.exe,保留不动
  • .gitignore 追加:**/mcn-work-shop/server.log、**/mcn-work-shop/shot-*.png、tmp/、.workbuddy/tmp/、generated-images/(运行日志/自检截图/临时目录不入库;cdp-*.mjs 验证脚本保留入库)
  • git 同步:git fetch 无分叉(HEAD=origin/main=ab97842)→ git add -A(35 项)→ commit 268ce29 → git push origin main 成功(ab97842..268ce29),推送后工作区干净
  • 经验固化:Windows 下关停后台 node 服务用 PowerShell Stop-Process;推送前先 fetch 确认无分叉,避免非 fast-forward

mcn-video-prompt「④主体设定」→「④设定」改名(15:35)

  • 用户指令:「把主体设定 改为设定」——6 层结构第④层去「主体」前缀(6 层现为:①主体列表→②画面质感→③色调光影→④设定→⑤镜头叙事→⑥负面提示词)
  • 20 处全量替换(replace_all 精确串「主体设定」→「设定」,不触碰「主体」「人物设定」等词):
    • SKILL.md 6 处(F4 L275/模板节 L410/自检⑧ L483/F2·F4 方法论引用 L205/L292 + frontmatter last_change 重写)
    • 分镜提示词制作流程.md 10 处(3.2 改造原则/3.2.1 思考清单 4 行/3.2.2 输出格式块/6层×5类型适配表表头/Step5 校验/示例D/对比表)
    • 长视频分段制作流程.md 4 处(一致性锁定表/简单段·复杂段模板)
  • frontmatter last_change 更新:「④主体设定→④设定 改名(20处全量替换)…站位归⑤镜头叙事(画面坐标)、构图归④设定-构图(08-31 边界确认)」
  • 验证:grep「主体设定」全目录仅剩 last_change 历史描述 1 处(有意保留);「④设定」落位 18 处(SKILL.md 4 行+制作流程 10+长视频 4);L142「③人物设定」为思考清单字段名正确保留;L205/L292 无④前缀引用同步为「设定」
  • 待办:dsh 副本(storyboard-prompt)未同步,按 .dsh 单向只读约定待用户授权;站位/构图边界固化到文档未做(用户仅确认改名,固化待确认)

mcn-video-prompt 6层+改名 同步到 dsh 副本(15:37)

  • 用户授权:「同步到 dsh 对应技能」→ 同步 C:\Users\maidou\.dsh\skills\storyboard-prompt\
  • 同步前确认:dsh 副本停在 4层结构旧版(L42/L87/L129/L165 等 4层+②设定),需连同 14:29 的 4→6 层重排一起同步;三个文件差异全部为 4→6 层+改名,无独有内容需保护
  • 同步方式:cp 源 3 文件覆盖副本(SKILL.md/分镜提示词制作流程.md/长视频分段制作流程.md)→ 恢复 dsh SKILL.md frontmatter 专有字段(name: storyboard-prompt / deployment: dsh / deployed_at: "2026-08-31";updated_at/last_change 采用源最新值)
  • 验证:制作流程 2 文件 diff=0;SKILL.md 仅剩 frontmatter 4 对预期环境差异;副本「主体设定/4层结构」零残留(仅 last_change 历史描述);6层落位 SKILL.md×8/制作流程×7/长视频×3、④设定落位 4/10/4 与源完全一致 ✓
  • 经验固化:diff 全文件不匹配(1,414c1,408)时先查换行符(本次均 LF,系普通 diff 对整体替换块的误读),用 diff --strip-trailing-cr 得到真实差异量;dsh 副本因停在旧结构版本,同步=cp 覆盖+恢复 dsh frontmatter,比逐行改更可靠

mcn-video-prompt 站位/构图边界固化(15:40)

  • 用户确认「需要」→ 把站位/构图边界(前序已确认)固化进技能文档,源+dsh 同步
  • 固化内容:构图=画面布局归④设定-构图(景别+前中后景层次+构图法则+视觉重心/留白,词库14_构图布局);站位=画面坐标归⑤镜头叙事(如"男主位于画面右侧、四分之三侧朝镜头",逐镜头变化随镜头写,词库03_场景描述·演员调度三要素);一句话=「④设定写静态属性(整段框架级),⑤镜头写动态调度(逐镜头)」
  • 固化 3 处(源+dsh 各 3 处):
    • 分镜提示词制作流程.md 3.2.2 输出格式块(④设定与⑤镜头之间加边界注释行 L181)
    • 分镜提示词制作流程.md 6层×5类型适配表后(L218 边界写入位置注记)
    • SKILL.md F4 提示词内部结构(L275 6层定义末尾补「站位/构图边界」句)
  • frontmatter last_change 两边同步更新(补「站位/构图边界固化(08-31)…注记入 3.2.2 输出格式块+适配表+SKILL.md F4 结构定义」)
  • 验证:制作流程 diff=0;SKILL.md 仅剩 frontmatter 4 对预期环境差异;边界落位源+dsh 各 3 处一致 ✓

内容基因·TOPn 动态规则 + 王微斯修正 TOP6→TOP4(16:05-16:12)

  • 用户规则:「内容基因·TOPn 的 n = 实际解析视频数(几个视频就是 TOP 几),不是固定 6;看设定中内容基因有几个板块即可判定」(王微斯设定「四个内容基因标记」→ 4 条 → TOP4,此前误写 TOP6)
  • 王微斯产出修正 3 文件:王微斯账号设定卡.svg 3 处(desc/模块标题/底部版权 TOP6→TOP4);王微斯账号设定.md 与 _参考.md 各 5 处(头部「解析视频:最近三个月TOP6」→TOP4、人设底线「基于6条视频…已通过6条视频验证…基于6条视频的归纳」→4条、梗元素「当前6条视频」→4条);备份 _浅粉紫底.bak.svg 与 账号数据分析.md(排名描述 TOP1/2 等)不在本次范围不动
  • 技能固化(源+dsh diff 一致):SKILL.md 视频筛选标准行补「实际满足条件视频不足 6 条时按实际条数取(TOPn 的 n=实际解析条数),产出文件 TOPn 按实际条数写」;06 文档 5 处 TOP6→TOPn(双向联动历史案例/一致性校验/模块映射表/注/裁剪适配表);03 文档 grep 校验 TOP6→TOPn
  • 验证:源=dsh 三文件 diff 全空;王微斯产出零「TOP6/6条视频」残留(排除 bak/数据分析排名描述);技能文件零「内容基因·TOP6」残留;卡片 TOP4 3 处 ✓
  • 经验固化:TOPn 是动态值非固定 6——筛选上限 6 与产出显示值(实际解析条数)分离;判定口径=设定 md「内容基因」板块数(与视频解析条数一致)

MCP 检测触发时机补「首次提问/功能介绍」(16:14-16:20)

  • 用户反馈:安装到用户环境时,询问技能有什么功能、生成相关内容后,没有检查用户是否安装 MCP 服务,也没有提示需要安装
  • 根因:mcn-dou-analysis 的 MCP 检测触发时机只有「执行工作流前(视频解析前)」(MCP_工具调用规范.md 3 节),首次提问/功能介绍场景不触发;创作技能 V1.0 源+dsh 已有「用户首次提问(无论问什么)即检测」无此缺口
  • 修复(源+dsh diff 一致):MCP_工具调用规范.md 3 节触发时机扩为「① 首次提问/功能介绍时 + ② 执行工作流前」,新增触发点行=回答功能介绍后检测 myai-mcp-production 可用性 → 未安装主动提示「功能五(视频解析)依赖 MCN MCP 服务,当前未安装」+ 询问是否自动配置;SKILL.md MCP 章节安装引导行同步补「首次提问/功能介绍时 + 执行工作流前」
  • 验证:源=dsh 两文件 diff 全空;创作技能 short-video-script 副本 L63/L29/L33 与源一致(已有首次提问检测)✓
  • 经验固化:部署类技能(含 MCP 依赖)的检测触发时机要覆盖首次接触场景(问功能/初次使用),不能只挂在执行工作流前;用户环境部署后用户第一件事就是问功能,此时不提醒 → 后续用到才发现没装 MCP

方向修正:MCP 首次检测只改创作技能,账号分析回滚(16:20-16:28)

  • 用户纠正:问题在脚本创作——规则写了「首次提问自动检测」但用户环境实测没提醒;账号分析应保持之前状态(加到那里没用)
  • 账号分析回滚(源+dsh,SKILL.md 安装引导行 + MCP 规范 3 节触发时机恢复原文本「执行工作流前(视频解析前)检测」)→ diff 验证源=dsh 一致 ✓
  • 创作技能根因:SKILL.md「MCP 依赖(摘要)·安装引导」只有描述性声明(「用户首次提问时自动检测」),不是强制开场动作——模型触发技能读 SKILL.md 时只当背景信息,不会主动执行检测;且「检测」具体方法未明确
  • 创作技能修复(源+dsh=short-video-script,内容 diff 一致;SKILL.md 差异仅 frontmatter 环境标签/工作台章节/dsh 独有 script-review 行等预期项):
    • SKILL.md 安装引导行升级为必做动作:「首次触发检查」——会话首次交互(问功能/功能介绍/发起任何任务,无论问什么)先检查 myai-mcp-production 可用性(查当前会话可用工具列表含 auth_status/upload_douyin_video 等,或读 ~/.workbuddy/mcp.json 含该服务配置,任一即可)→ 未安装 → 按 MCP 规范 3 节首次提问轻量提醒(可跳过不打断创作)
    • MCP_工具调用规范.md 3 节:触发时机补「首次提问」定义(=本技能会话首次交互,由 SKILL.md 安装引导作为必做动作驱动)+ 检测方法明确化(①②任一判定)
    • 帮助文档.md:MCP 授权步骤前补「MCP 服务说明」——首次使用会检测并提示安装(可跳过)
  • 经验固化(重要):技能规则「写了」≠「会执行」——描述性声明必须升级为动作指令(明确"你(模型)现在就要做、怎么做、什么时机做")才可执行;SKILL.md 是每次触发必读,references 是按需读,强制动作要挂 SKILL.md 主路径,references 只放细节

browser-harness 环境检查与安装 + 系统分流(16:30-16:50)

  • 用户要求:browser harness 的环境检查和安装也应该一并处理;随后补充:检查环境和安装依赖要区分 Windows 和 Mac 系统
  • browser-harness 检测(mcn-dou-analysis,源+dsh diff 一致):
    • SKILL.md 关键规则表新增「browser-harness 依赖(红线)」行:功能一/二(浏览器抓取)执行前必检——检测方法(任一即可)① 可执行文件存在性(Win ~/.local/bin/browser-harness.exe / macOS ~/.local/bin/browser-harness)② 命令探测(Win where / macOS command -v)→ 未装提醒(可跳过,换三方API/MCP兜底,但浏览器抓取无法执行)→ 同意则 uv tool install --python 3.12 --upgrade --force browser-harness → browser-harness doctor 验三要素(工具/daemon/Chrome)
    • 浏览器搜索抖音账号操作规范.md 第五节新增 5.0「环境检查与安装(每次浏览器任务前必做)」:检测方法表 + 安装引导 + 安装后验证;技能体 ~/.dsh/skills/browser-harness/ 随 dsh_MCNProject 分发(换机器自带)
  • 系统分流(Windows/macOS)落点(源+dsh 全部同步):
    • 浏览器规范:环境说明(可执行文件路径分系统)、5.0 命令探测补 where、5.1 代理清理分(Win PowerShell Remove-Item / mac bash unset)、连接方式 B 定向分($env:BU_CDP_URL / export)、方式 C Chrome 启动分(chrome.exe / /Applications/Google Chrome.app/Contents/MacOS/Google Chrome)、5.2 端口探测分(Invoke-WebRequest / curl)
    • MCP 检测(创作技能 V1.0 + short-video-script 副本):SKILL.md 安装引导行 + MCP 规范 3 节步骤1 的 mcp.json 路径分系统(Win %USERPROFILE%\.workbuddy\mcp.json / mac ~/.workbuddy/mcp.json);部署预检 npm 缓存权限检查标注「macOS 高发坑,Windows 跳过」(find -user root 仅 mac/Linux)
  • 验证:mcn-dou-analysis SKILL.md/浏览器规范 源=dsh 一致;short-video-script MCP 规范 源=dsh diff 全空;SKILL.md 差异仅预期环境差异(源独有工作台/外部技能依赖章节 + frontmatter deployment 标签 + dsh 独有 script-review 行),安装引导行源 L83=dsh L63 完全一致
  • 经验固化:环境检查/安装依赖类命令必须按系统给双命令(Win PowerShell / mac bash),路径用 ~(mac)/ %USERPROFILE%(Win)双写法;macOS 高发坑(npm root 缓存、代理劫持 CDP)与 Windows 差异(无 root 文件问题、where 代替 command -v)要显式标注
  • 版本标签同步(16:55):short-video-script 源+dsh 的 frontmatter 更新 updated_at/last_change=「MCP首次触发检查+系统分流」、dsh 另更新 deployed_at=2026-08-31;mcn-dou-analysis 无版本标签体系(08-27 定主版本时未引入,保持源=dsh 一致不动)
  • 远程仓库名确认(17:00):用户问「mcnskills 仓库已改为 mcn-video-script 确认下」——实测远程 mcnskills.git 仍存在可达、mcn-video-script.git 不存在(Cannot find repository);改名仅本地目录(MCNVideo AI→mcn-short-video→mcn-video-script),远程一直叫 mcnskills.git;如需统一需在服务器端 gitea/gitlab 改名

工作台 AI脚本诊断 → mcn-script-review 技能关联(17:05)

  • 用户要求:工作台的AI脚本诊断 应该用 mcn-script-review 技能,记录下
  • 背景:工作台 #/reviews 页已从「AI写作复盘」改名为「AI脚本诊断」(cdp-verify-rename.mjs 验证过);页内「复盘」按钮 confirmRun 的 prompt 原先只写「请对这条 AI 脚本做复盘评分(三种模式)」,未指定技能
  • 改动(功能层 + 技能侧 + 记忆):
    • data-pages.js #/reviews 复盘确认弹窗 desc/prompt:补「按 mcn-script-review(脚本复盘)技能执行」
    • app.js 帮助页 FUNC_GROUPS「诊断 & 评分」组:desc 改为「按 mcn-script-review(脚本复盘)技能评分式复盘 + 对比分析」+ 新增「对比 AI脚本 和 原视频脚本」问法(对应对比分析三段式)
    • mcn-script-review SKILL.md「与相关技能的关系」表:新增「MCN工作台(mcn-work-shop)」行——AI脚本诊断页复盘入口的 AI 任务 prompt 明确指定按本技能执行
    • MEMORY.md 工作台条目补 AI脚本诊断关联
  • 说明:mcn-script-review = 评分式质量复盘(6+4维、叙事逻辑2倍权重、逻辑硬伤预检)+ AI脚本vs源脚本对比分析(三段式)+ 创作过程复盘;判定标准只读引用 short-video-script 知识库 09_脚本诊断

俊希全流程测试用例编写(17:10)

  • 用户要求:编写测试用例,用账号「俊希」测试「获取账号数据(有就刷新)→ 提取账号设定 → AI参考最新视频选题 → 写脚本」完整流程
  • 前置调研结论:达人账号表仅 2 行(小咪橘座 70010/旧梦留声机 70013),俊希不在表 → 首次登记 70014;MCNSkill项目/俊希/ 仅含 提示词01/(分镜产出),无账号分析产出 → 全新执行场景
  • 用例落盘:.workbuddy/test-cases/2026-08-31_俊希全流程.md(TC-20260831-01),覆盖 TC-01 账号表登记 → TC-02 获取账号信息(含「有就刷新」分支:更新时间近1个月提示用户判断)→ TC-03 获取视频(≥60条/13列Excel)→ TC-04 筛选TOP(select-top6,n≤6按实际)→ TC-05 MCP解析(upload→3-5min→detail,补充规则)→ TC-06 json_tool 保存 → TC-07 人设卡12段 → TC-08 设定卡自动生成(grep一致性)→ TC-09 工作台AI选题(/api/ai/topics→3选题)→ TC-10 AI写脚本(S1-S11,automations触发)→ TC-11 收尾验证(git提交);含数据校验标准表 + 8 项异常分支预案 + 验收汇总表
  • 用例引用的权威参数:视频筛选标准(TOP6上限/不足按实际,SKILL.md L43)、视频获取数量(≥60条停止,L44)、browser-harness 红线(L49)、路径配置(references/路径配置.md:开发机→桌面 MCNSkill项目/俊希/ 直挂)

俊希用例补充:界面模拟点击 + 数据检查判定(17:20-17:30)

  • 用户两点补充:①测试用例需要模拟点击界面进行测试;②执行前要判断项目文件夹和数据库中是否已有数据、是否需要清除
  • 数据检查实测结论(写进用例「二·补」章节):桌面 MCNSkill项目/俊希/ 仅提示词01(分镜)→ 无需清除;达人账号表无俊希 → 首次登记 70014;工作台 mcn-plugin.db 有俊希历史数据(hot_accounts id=3 含 content 设定文本/278.7万粉/JJX0827、account_videos 108 条、rewrite_log 3 条 2026-08-19 海鲜大餐主题,source_dir=D:\dshworkspace\账号解析\俊希/抖音账号分析\俊希 均为旧路径残留目录已不存在);关键:account_persona 无俊希(5 行全为 1627-1630 测试占位)→ 工作台 confirmAiScript 的 hasPersona=false → 弹窗走「先进行账号设定分析」分支 → 首次场景成立,数据库无需清除;dsh 原库同样有俊希(.dsh 只读红线绝不写);清除操作仅限工作台自有副本且需先备份
  • 模拟点击脚本:mcn-work-shop/cdp-test-junxi.mjs(新写,CDP 连接 9223 → Target.createTarget 新开标签页打开 #/accounts 不干扰用户页面 → Runtime.evaluate 模拟点击 → 轮询弹窗/AI选题 → 自动关标签页);node cdp-test-junxi.mjs(安全模式,验证到选题生成)--confirm(继续触发创作任务)
  • 实测通过(17:25):Step1 定位俊希按钮 PASS / Step2 AI写脚本弹窗结构 PASS(文案「先进行账号设定分析」符合首次场景)/ Step3-4 AI 选题 PASS(返回 3 方向:突击妈妈公司送便当·职场探班 / 替妈妈筹备闺蜜聚会·社交危机公关 / 打工人妈妈病号特权日·角色互换)
  • ⚠️ 坑:index.html 有 hidden 的 #settingsModal(项目文件地址设置弹窗),其 .modal 子元素仍在 DOM → document.querySelector('.modal') 会误命中(desc 显示「默认读取桌面 MCNSkill项目。」)→ 必须限定 .modal-mask:not([hidden]) 且含 #aiTopicGen;且 confirmAiScript 先 await persona 接口再建弹窗,点击后需轮询等待弹窗(500ms×24),不能固定 sleep
  • 两条「AI写脚本」入口差异(用例 TC-09 记录):#/accounts 每行 [data-create] → confirmAiScript(AI 结合人设生成选题=主链路);#/rewrites 每行 [data-rewrite] → confirmRun 基于单视频改写(次链路)
  • git 推送策略(17:27 用户明确):「不要改一点就推送,半天推送一次就行」→ 已写入用户级 MEMORY.md;本地可随时 commit,push 攒到半天一次

俊希用例补充:数据检查 + 界面模拟点击(17:30)

  • 用户补充要求:①测试用例需要模拟点击界面进行测试;②执行前要判断项目文件夹和数据库是否已有数据、是否需要清除
  • 数据检查实测结论(写入用例「二·补」章节):桌面 MCNSkill项目/俊希/ 仅提示词01(分镜产出)→ 无需清除;达人账号表无俊希 → 首次登记 70014;工作台 mcn-plugin.db 俊希有历史数据——hot_accounts id=3(完整账号信息+content 设定文本,source_dir=D:\dshworkspace\账号解析\俊希 旧路径已不存在)、account_videos 108 条(抖音账号分析\俊希 旧路径)、rewrite_log 3 条(2026-08-19 海鲜大餐主题);关键判定:account_persona 表无俊希(仅 1627-1630 测试占位)→ confirmAiScript 的 hasPersona=false → 弹窗走「先进行账号设定分析」分支,首次场景成立,无需清除数据库;dsh 原库(~/.dsh/mcn-plugin.db)同数据但只读红线不写
  • 界面模拟点击脚本:mcn-work-shop/cdp-test-junxi.mjs(新写,CDP 模式同 cdp-verify-*:连 9223 → Target.createTarget 新开标签页 → Runtime.evaluate 模拟点击 → 自动关标签页;--confirm 参数才真实触发创作任务);覆盖 #/accounts 定位俊希 [data-create='俊希'] → 点击 → 轮询弹窗 → 点 #aiTopicGen → 轮询选题(100s 上限)→ 读 3 选题
  • 实测通过(安全模式):Step1 定位 PASS / Step2 弹窗结构 PASS(文案=「先进行账号设定分析,再生成完整脚本」首次分支)/ Step3-4 AI 选题 PASS(3 选题:突击妈妈公司送便当/替妈妈筹备周末闺蜜聚会/打工人妈妈病号特权日,贴合亲子Vlog人设)
  • ⚠️ 坑:.modal 选择器会被 index.html 隐藏的 #settingsModal(hidden 但 .modal 子元素在 DOM)干扰 → 判据须 [...document.querySelectorAll('.modal-mask')].find(x => !x.hidden && x.querySelector('#aiTopicGen'))
  • 两条 AI写脚本入口差异(写入用例 TC-09):#/accounts 每行「AI写脚本」(data-create→confirmAiScript)=自定义选题/AI结合人设生成选题(主链路,对应「AI参考最新视频选题」);#/rewrites 每行(data-rewrite→confirmRun)=基于视频《Y》改写全新 S9 脚本不复刻(次链路)

俊希用例收尾:验收表标注 + 提交(17:32)

  • 用例文档验收汇总表 TC-09 行标注「✅ 界面模拟点击已实测 PASS(安全模式)」,真实触发任务需 --confirm
  • 提交链:86ca4ca(初版用例)→ f320eb4(数据判定+脚本)→ 30fff47(日志)→ ffbdc87(验收表标注);已 push origin main,HEAD=ffbdc87 与远程一致

AI会话任务链路审计 + P1/P2 修复(17:35-17:50)

  • 用户要求:①先检查所有功能调用 AI 会话任务的代码是否正确;②P1 P2 需要修复;③核对「AI 任务执行时对应按钮是否处于处理中状态」的状态代码
  • 审计结论(链路整体正确):后端 3 接口(/api/run POST 写 automations、/api/run/status GET 轮询、/api/ai/topics AI选题)+ 前端 executeTask/confirmRun/confirmSaveAccount/confirmAiScript 4 函数 + 7 个调用点(账号列表 AI写脚本/周榜分析/首页关注/账号详情改写+提炼/改写页/分镜生成/复盘评分)逐字段核对;automations 写入与既有任务一致(model=deepseek-v4-flash、permission_mode=fullAccess、owner_status=confirmed、once+now、cwds=D:/AgentSkill/mcn-workshop)
  • P1 修复(假等待):实测「导入指令」任务 status=PENDING_REVIEW、result_success=0、thread_title=Automation prompt interrupted: user_cancel(被中断/待确认)→ server.js /api/run/status 将 PENDING_REVIEW 从 pending 拆为独立 review 状态;app.js executeTask 新增 finished 标志 + review 分支(toast「⏸ 任务待确认,请到左侧会话栏确认执行」+ 停止轮询)+ 30min 超时提示「⏳ 任务仍在执行,请到左侧会话栏查看进度」
  • P2 修复两处:①server.js /api/run INSERT 去掉 next_run_at 列(原写 Date.now() 毫秒,与既有任务全 None 不符,执行器用 scheduled_at/created_at),17 列→16 列;②data-pages.js 删除 firePrompt 死代码(L49-65,无调用者,executeTask 已取代)
  • 按钮处理中状态核对(正确):executeTask 内 btn.disabled=true + innerHTML='执行中…' + classList.add('btn-busy');失败/完成/超时/review 均 restore(disabled=false + 原 innerHTML + 移除 btn-busy)→ 无遗漏
  • 验证通过(17:47):新服务启动(node PID 34480,HTTP 200);/api/run/status?id=automation-1787881991955 返回 state:"review"(修复前映射 pending)→ P1 生效;三文件语法检查通过
  • git:本地 commit 本轮修复(按新策略暂不 push,攒到半天统一推)

失误沉淀:账号数据来源红线强化(17:51-18:00)

  • 失误复现:俊希全流程测试 TC-01 登记时,直接读工作台库 mcn-plugin.db 的 hot_accounts 表(id=3)拿 sec_uid/抖音号/地址填达人账号表,用户指出「为什么又走到MCP去了 之前不是说过这个问题吗」——同类问题非首次
  • 为什么总出问题(根因四连):①就近取数惯性(库读取成本低、模型默认走捷径);②规则覆盖缝隙(SKILL.md L50 红线管"抓取流程",Step 1.0 只说"存文本格式"未规定身份标识来源,登记占位阶段钻空子);③同源性未识别(hot_accounts 表 = MCP 内部账号库 list_hot_accounts/hot_account_detail 的本地副本,绕道读 db 拿同一份数据,形式上没碰 MCP 实际同源违规);④前置检查 P4 在 TC-01 阶段就调 MCP auth_status,加剧观感
  • 三层化沉淀:
    • 治本:SKILL.md L50「账号信息数据源(红线)」强化——禁止从任何数据库读取账号字段回填账号表(含身份标识);hot_accounts 表=内部账号库本地副本、读其数据=违反红线;登记只占位 账号ID+昵称,身份标识留空待浏览器回填;feature/01 Step 1.0 同步强化;MCP 工具调用严格限定 TC-05 视频解析
    • 失误:新建 references/铁律避坑规则/账号信息获取执行避坑.md(功能一避坑,含数据来源红线速查表)
    • 记忆:本日志 + MEMORY.md mcn-dou-analysis 条目
  • 数据纠正:达人账号表俊希行已清空 C/D/E(抖音号/抖音ID/地址,库来源),只留 70014+昵称占位,待 TC-02 浏览器抓取回填
  • dsh 副本(C:/Users/maidou/.dsh/skills/mcn-dou-analysis/)同步:源技能已改,副本待用户授权后同步(.dsh 单向只读红线)

失误纠正:视频发布时间提取方法退化 + 主页访问方式(18:35-19:00)

  • 用户批评两连:「为什么打开了两个视频再看」「整一些不纯在的地址去访问,是怕别人不知道你在抓数据吗」——①TC-04 逐条 goto_url /video/{id} 抓发布时间(15 次跳转=爬虫特征);②直接构造 /user/{sec_uid} 地址访问主页(缺 brjmRxiM9i 后缀,访问异常)
  • 根因:08-26 旧梦留声机已验证的 defaultDataList 方法(一次拿全含 createTime)没有固化到技能文件,本次凭记忆退化;浏览器规范文档 4d 只写了「逐卡片 awemeInfo」没写 defaultDataList
  • 纠正(实测通过):主页滚动(.route-sc,136 条链接)→ Fiber defaultDataList(136/136 含 createTime + stats 驼峰 diggCount 等)→ 卡片 awemeInfo 补 duration(毫秒)→ 按 awemeId 合并 → 13 列 Excel(发布时间 100%)→ select-top6 正常出 6 条(旧表发布时间全空导致 select-top6 返回 0 条,根因同源)
  • 主页访问正确方式:搜索页 /search/{账号ID}?type=user → 定位卡片(innerText 匹配抖音号+粉丝数)→ CDP Input.dispatchMouseEvent 模拟点击进入(可能新开标签页 target=_blank)→ 复用该标签页
  • 三层化沉淀:治本=浏览器规范.md「提取方法优先级」+「访问账号主页」两节 + SKILL.md 浏览器操作规范红线⑤⑥ + 部署禁用说明登记;失误=新建 铁律避坑规则/视频列表获取执行避坑.md(坑1 逐条开视频页/坑2 构造直达地址 + 校验速查表);记忆=本日志
  • 产出:俊希/videos_full.json(136 条全量含 createTime/duration/stats)+ 短视频表格.xlsx 重生成(发布时间 100%)+ top6.json(标准工具出 6 条,2026-06-09~08-15)
  • 浏览器清理:关闭搜索页/redfox 标签页,仅留俊希主页标签页供后续复用

远程仓库改名 mcn-short-video + 推送(19:57-20:00)

  • 用户指令「提交到仓库 以本地为准」;前置已把 remote 从 mcnskills.git 改为 mcn-short-video.git(用户澄清「不该文件夹名,只改 git 地址」)
  • 实测:远程 mcn-short-video.git 已存在且可达(fetch/push 成功,SSH 222 连通),历史与本地连续(共同祖先 6cbdb70=原 mcnskills 的 origin/main)→ 即 mcnskills 仓库在服务器端已改名为 mcn-short-video(修正 17:00 旧结论:当时 mcn-video-script.git 不存在、mcnskills.git 存在;现 mcn-short-video.git 存在且历史一致)
  • 提交 ccdd79e(账号分析技能红线强化 + 2 避坑规则 + 记忆文件,7 文件 +131/-6)→ git push origin main 成功(6cbdb70..ccdd79e),本地=远程=ccdd79e
  • 用户级 MEMORY.md Git 清单已同步:远程地址 mcnskills.git→mcn-short-video.git,本地路径修正为 mcn-video-script
  • 经验:push 前先 fetch 确认无分叉(本次 fast-forward 领先 2 提交,无需 force);SSH 需授权模式访问 ~/.ssh(读 Port 222 配置 + 办公室 deploy key);本地代理先清空再连远程

mcn-dou-analysis 沉淀同步到 dsh 副本(20:08-20:13)

  • 用户确认「需要」→ 把本次沉淀同步到 dsh 副本 C:/Users/maidou/.dsh/skills/mcn-dou-analysis/
  • 同步 6 文件(cp 源→dsh,diff 验证全空一致):SKILL.md(红线⑤⑥ + 账号信息数据源红线 + 部署禁用登记)、01_获取账号信息.md(数据来源红线 + 路径中性化)、02_获取视频.md(路径中性化 L15)、浏览器搜索抖音账号操作规范.md(defaultDataList 方法固化 + 访问主页搜索路径)、视频列表获取执行避坑.md + 账号信息获取执行避坑.md(新增)
  • 关键发现:① mcn-dou-analysis 源与 dsh frontmatter 完全一致(无 deployment/deployed_at 环境字段,08-27 定主版本时未引入),故 cp 覆盖无需恢复环境字段(区别于 storyboard-prompt);② 达人账号表路径统一为中性「达人账号表.xlsx」——源已把绝对路径 D:\dshworkspace\达人账号表.xlsx 改中性(配合路径配置.md 三环境两步判定:开发机→桌面 MCNSkill项目、dsh→D:\dshworkspace),dsh 的 01/02 文件残留旧绝对路径一并清掉;两个环境的账号表是不同文件(桌面 6036B 含俊希 08-31 / D:\dshworkspace 5737B 旧版)
  • 验证:6 文件 diff 全空;知识库/账号设定/ 13 文件源=dsh 一致(此前 find+for 按空格拆分误报「缺失」,实为文件名含空格)
  • dsh 仓库(dsh_MCNProject)未 commit,按节奏待用户决定

俊希测试 TC-07/08 + AI 会话任务链路实测(21:52-22:00)

  • TC-07 人设卡:产出 俊希/俊希账号设定.md(12 段完整人设卡)。判定=单一达人型(俊希+妈妈固定,爸爸/小姨客串);粉丝281.9w/获赞3658.9w/作品136/广西;5 内容基因 + 8 条内容规则 + 6 条红线 + 广告植入偏好独立小节(金典/海尔/学而思/COLMO,妈妈口播)
  • TC-08 设定卡 SVG:俊希/俊希账号设定卡.svg(viewBox 0 0 680 1520)。俊希=温情/亲子/治愈 → 深焦糖深色系 #2B1A10→#1A0F08(非旧梦深棕红/非王微斯玫瑰金);模块=叙事结构(5步)/内容标签(6chip)/内容基因·TOP6(5条)/角色类型库(3角色)/情绪结构(5段)/红线清单(6条);内部元素沿用深色系固定规范
  • 术语双向对齐:设定md 补 ### 内容基因·TOP6 子标题 + section三「类型库/达人设定」→「角色类型库」(对齐旧梦定稿);「核心标签」字段↔SVG「内容标签」模块=固有映射(与旧梦一致,非改名)
  • AI 会话任务链路实测(回应用户「为什么没看到创建AI会话任务」两次追问):根因定论——TC-01~07 全走「本地文件+MCP直调」,只有 TC-10 AI写脚本走 /api/run 才创建会话。工作台服务曾挂(8899 有 0.0.0.0 残留监听但 127.0.0.1 无响应),重启后 POST /api/run 实测成功:automations 表 4→5 条,新增 automation-1788184599640「俊希-AI写脚本(TC-10实测)」(status=ACTIVE/schedule_type=once/scheduled_at=21:56/cwds=D:\AgentSkill\mcn-workshop/model=deepseek-v4-flash);/api/run/status 返回 queued(宿主尚未调度 automation_runs,会话将在左侧会话栏 mcn-workshop 空间出现)
  • 待办:TC-09 AI选题(/api/ai/topics 同步接口,不建会话)、TC-10 脚本实际生成(后台会话)、TC-11 收尾+git

视频列表「AI写脚本」链路澄清 + 俊希设定卡配色纠正(22:05-22:55)

  • 视频列表未解析视频的 AI写脚本:同样走 confirmRun→executeTask→POST /api/run 创建会话(data-pages.js:443 每行不分状态都渲染「AI写脚本」按钮,prompt 只带「达人名+视频标题」不带 analysis)。实测未解析视频 511(白昼小熊)触发成功,automations 6 条。工作台视频列表共 56 条/47 条未解析;「未解析」=dsh 库 account_video_source/analysis 表无记录,不阻塞触发。关键坑:视频改写 prompt 不注入解析内容,已解析/未解析在 prompt 层面无差异,纯靠标题脑补
  • 俊希设定卡配色纠正(用户质疑"背景色对吗",确属我误判):俊希=明快/欢乐/治愈爽文调性(满级小孩哥宠妈),非深沉浓郁。之前机械套「温情/亲子/治愈→深焦糖深色系」是错的(那条对应深沉催泪型亲子)。按 06 文档两系判定(明快/治愈→浅色系)应走浅色系暖橙:bg #F5D0A4→#DE9A5E,内部元素暖橙系(白卡+#F0CBA0边+#8A4B23深棕字+#E07A3F/#E85A2A橙红强调),情绪核爆段橙红#E85A2A。已重写 SVG(深色残留=0,结构配对完整)
  • 教训:06 文档配色表「温情/亲子/治愈→深焦糖」只覆盖"深沉催泪"亲子;"明快欢乐"亲子美食账号无现成浅色模板,需按浅色系推导(主色暖橙→提亮降饱和)而非照表硬套。判定先看"明快/深沉"两系大前提,再看表格细分

俊希配色定稿 + 调度器根因深查(23:00-23:15)

  • 配色定稿:浅绿偏太阳黄背景 #EDF1C0→#D8E28A + 暖橙内部卡片不变(用户先提「背景浅绿偏一点太阳黄」=小孩嫩绿清新+太阳黄阳光暖意,后澄清「卡片保持之前颜色」=只换背景、内部卡片保持暖橙)。一绿一橙呼应「满级小孩哥给妈妈做饭」属性
  • 三层沉淀「调性优先于赛道标签」(用户"没有对应配色标准就结合账号属性内容调性思考"):①治本=06文档①节改三层判定(调性决定色系二选→色值取色相→赛道仅初筛)+配色表亲子治愈加调性分叉+③强规则加「调性优先」;②失误=账号设定执行避坑.md第8条(俊希深焦糖误判);③记忆=MEMORY.md F6条目。核心=「治愈」双义标签必须回读情绪锚点判定明快vs深沉
  • AI会话调度器根因(深查,回应用户核心困惑):实测两条任务(俊希/白昼小熊)已入 automations 表(status=ACTIVE),但 automation_runtime_state 与 automation_runs 零记录=宿主从未拾取。字段与 08-27 成功任务逐项一致(once/scheduled_at/rrule/cwds格式/permission_mode/model_id 全同)排除格式问题。根因=宿主调度器不活跃:automation_runs 最新记录停在 08-28 09:53(导入指令 last_error=user_cancel),此后零调度。「写表成功 ≠ 创建会话」,中间还差宿主调度器拾取这一步;调度器属 WorkBuddy 客户端侧,非工作台代码可控

「1任务=1会话」机制确认 + 停摆实锤验证(23:20-23:30)

  • 「1 automation = 1 会话」= WorkBuddy 原生 1:1 映射(确认):automation_runtime_state 的 running_conversation_id → sessions 表 UUID,4 条历史任务各对应 4 个 is_background_automation=1、status=completed 的会话。链路=写automation→宿主调度器拾取→建session(后台自动化)→执行completed。多账号并行 = 写 N 条 automation = N 个后台会话并发(无需改代码)
  • 停摆实锤(用户"你就同时解析俊希最新6条视频 我看怎么停摆"):同时派发 6 条「解析视频」任务(detailId=33022/33021/29596/15729/21514/20164),全部 POST /api/run 返回 ok:true,automations 6→12 条;但 6 条全部 last_run_at=null、automation_runtime_state 无记录、automation_runs 无记录、后台会话数仍 4。automation_runs 最新仍停在 08-28 09:53:39 未动=值班员(调度器)没上班
  • 隐患(待处理):累积 8 条卡住任务(之前俊希/白昼小熊 2 条 + 本次 6 条),一旦客户端调度器恢复会突然复活、同时开出 8 个会话执行(可能重复解析/重复写脚本)。恢复前建议清理或预期这 8 条会并发执行
  • 澄清「之前会话怎么建的」(用户"是不是搞错了"质疑,23:31 全字段对比):成功任务 vs 卡住任务逐字段一致(once/ACTIVE/scheduled_at字符串格式/permission_mode=fullAccess/owner_status=confirmed 全同),唯一差异 last_run_at(成功有值、卡住 null)。时间线铁证:工作台链路测试 08-27 19:15:40写入→19:16:40被调度(60秒);导入指令 08-28 09:53:11→09:54:05(54秒)。即之前的 4 条会话全是调度器所建、1 分钟内拾取,机制从未坏过;调度器最后一次活动 08-28 09:54:05 后停摆。表述教训:之前反复说「只能写纸条建不了会话」易让用户误以为「会话功能本来就建不出」,应明确「会话能建、建过4次、1分钟建好;现在建不出纯粹是调度器停摆」
  • POC 记录核对(用户提供 8-27 wb-trigger-poc,23:34):用户还原当时 POC=C:\Users\Administrator\WorkBuddy\2026-08-17-21-42-42\wb-trigger-poc\(index.html+server.js端口8088+insert_automation.py直写automations表;两链路=①/api/run execFile调CLI同步不进任务栏、②/api/trigger insert_automation.py异步进任务栏),关键字段 schedule_type=once/scheduled_at=now/model_id=deepseek-v4-flash/permission_mode=fullAccess/owner_user_id绑定用户。核对结论:①POC文件当前机器找不到(Administrator路径不存在,全盘搜无 insert_automation.py,属另一台机器);②当前工作台 server.js /api/run 已100%复刻POC——INSERT字段(once/scheduledAt=now/model_id='deepseek-v4-flash'/fullAccess/owner_user_id动态查sessions)与POC一字不差;③数据库实查成功vs卡住任务 model_id 全=deepseek-v4-flash、owner_user_id 全=9bb574cb-...701f,字段零差异。最终定论:写法对、字段对、与POC一致,问题不在代码/字段;POC原文「客户端调度器检测到后即执行」=印证根因是「调度器检测活跃性」(08-27/28检测→执行,08-31未检测→卡住),非工作台可修,需客户端侧恢复
  • 「清空+重建」实测(用户"你不能清空和重启automations吗",23:39,最终闭环):改用官方 automation_update 工具(Agent 侧唯一合法入口,规则禁直写 SQLite 动 automations)。①list 能看到全部9条任务(8卡住+导入指令)。②delete 8条僵尸任务全 success——实为软删除(deleted_at 打时间戳,行仍在但标记删除,调度器不会再拾取)。③create 新建1条验证任务成功——id 用 UUID 格式(337935e0-...,非工作台的 automation-<时间戳>),且 model_id=deepseek-v4-pro(取当前会话模型,非工作台硬编码的 deepseek-v4-flash)。④等65秒后复查:官方任务 last_run_at 仍 null、automation_runs 无新记录。最终铁证闭环:工作台直写SQLite→卡住、官方automation_update创建→同样卡住,两条路都卡=根因确凿是调度器(客户端后台轮询服务)停摆,与「怎么建任务」无关;表(箱子)能写能删,但「捞纸条开会话」的调度循环 08-28 09:54 后未再运行,只能靠重启 WorkBuddy 客户端叫醒。留1条 UUID「验证任务」作金丝雀(调度器一恢复即触发回复「AI会话创建成功」)
  • 重启无效(用户"已经重启了",23:44,金丝雀验证):用户重启 WorkBuddy 客户端后,进程确认存活(WorkBuddy.exe 12 个进程,Electron 多进程架构正常),但金丝雀任务等 3 分钟(23:47 查)仍 last_run_at=null、automation_runs 无新记录、后台自动化会话数仍 4。重启未恢复调度器——说明调度机制非「重启即恢复」那么简单,问题更深层(可能:登录态过期/客户端自动化开关被关/调度依赖云端服务/需在客户端自动化面板手动触发)。金丝雀任务保留作探针;下一步需用户在客户端侧确认自动化任务列表状态或手动触发

★调度链路根因确认 + 金丝雀验证成功(23:58-23:59,最终闭环)

  • 最终根因(与另一 WorkBuddy 实例行为差异定位,用户提供对方完整参数后确认):automation_update(官方工具)create/update 只对未来 scheduledAt 补算 next_run_at(毫秒时间戳),过去时间不补算 → 调度器按 next_run_at 扫描找不到 → 任务永远卡住。对方实例 scheduled_at=now 时客户端会补算 nextRunAt 并执行;此实例不会 → 客户端版本差异。工作台 /api/run 直写 SQLite 同理:scheduled_at=now(已过时刻)→ next_run_at NULL → 调度器扫不到
  • 修复验证(金丝雀 337935e0-0dc0-47ef-9d6c-eeb6f83bea4f):scheduledAt 从过去时间 23:39 改为未来时间 23:58:00 → update 返回 nextRunAt: 1788191880000(客户端自动补算)→ 23:58:25 automation_runs 新增该任务 status=ACCEPTED → automation_runtime_state 出现 running_conversation_id → 后台自动化会话 4→5,新增「验证自动化调度链路」会话(f4232ef1,is_background_automation=1)→ 执行后 next_run_at 置空
  • 结论:调度器没停摆,是 next_run_at 补算条件(未来时间)问题;凡创建/更新任务,scheduledAt 必须设为未来时间(now+),客户端才补算 next_run_at、调度器才扫得到
  • 遗留:8 条已软删除僵尸任务(deleted_at 标记,调度器不拾取)无需处理;金丝雀任务已执行完成(once 不重跑),可留作证据或删除