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写脚本会话链路完整跑通
This commit is contained in:
maogeigei committed 2026-09-01 00:36:02 +08:00
1 parent e906e6616a
commit b2e472bf27
12 files changed
+265 -49

No files matched your search

+46
View File
@@ -471,3 +471,49 @@
- **三层化沉淀**:治本=浏览器规范.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 不重跑),可留作证据或删除
+36
View File
@@ -0,0 +1,36 @@
# 2026-09-01 工作日志
## 调度链路修复后:重派 6 条俊希视频解析任务(00:02-00:08)
- **背景**:08-31 深夜确认调度根因=automations scheduledAt 必须未来时间才补算 next_run_at;金丝雀任务(337935e0)已验证成功执行并开出会话 f4232ef1
- **重派**(用户选「重派6条视频解析任务」):6 条 once 任务,scheduledAt 依次 00:03:07~00:08:09(未来时间错开 1 分钟),cwds=D:\AgentSkill\mcn-workshop(会话归 mcn-workshop 空间)
| detailId | 任务名 | scheduledAt | nextRunAt 补算 |
|---|---|---|---|
| 33022 | 俊希-解析视频-33022 | 00:03:07 | ✅ 1788192187000 |
| 33021 | 俊希-解析视频-33021 | 00:04:08 | ✅ 1788192248000 |
| 29596 | 俊希-解析视频-29596 | 00:05:08 | ✅ 1788192308000 |
| 15729 | 俊希-解析视频-15729 | 00:06:09 | ✅ 1788192369000 |
| 21514 | 俊希-解析视频-21514 | 00:07:09 | ✅ 1788192429000 |
| 20164 | 俊希-解析视频-20164 | 00:08:09 | ✅ 1788192489000 |
- **关键验证点**:6 条全部返回 nextRunAt(此前卡住的 6 条即这批 detailId 全无 nextRunAt)→ 预期调度器逐条拾取、mcn-workshop 空间陆续出现 6 个后台自动化会话(1 任务=1 会话)
- **prompt 自包含**:明确 mcn-dou-analysis 技能路径 + 功能五解析 + MCP short_video_detail/upload_douyin_video + content.json 边界规则 + 落盘 `桌面\MCNSkill项目\俊希\视频分析\{标题}_标签1_标签2\` + 完成后回解析摘要
- 待追加:6 条任务执行结果(automation_runs ACCEPTED / 会话创建 / 解析产出落盘)
## 调度器秒级准点实证 + 并行改期教训 + 工作台 next_run_at 修复(00:03-00:07)
- **33022 准点执行实证(调度器从未停摆)**:create 时补算 nextRunAt=00:03:07 → 调度器准点拾取 → automation_runs ACCEPTED(00:03:17)→ 会话 442280f0「解析俊希账号指定视频」completed。**后台会话 5→6**。即 create 时设 +60s 未来时间 → 秒级准点执行
- **改期教训(我的失误)**:为并行把 6 条 update 到 00:04:50(距 update 时刻仅 ~17s 余量)→ 客户端判定太近**清空 next_run_at** → 5 条卡死(33022 因已在 00:03:07 执行不受影响)。**规则:automation_update 的 scheduledAt 必须留足够未来余量(实测 +60s 稳、+17s 失败),update 往返有几秒延迟,越近越险**。已用 +60s(00:07:06)恢复 5 条,nextRunAt=1788192426000 全部补算成功
- **工作台 server.js 根因修复(08-31 P2 判断有误需纠正)**:实测证明**客户端调度器按 next_run_at 扫描**(33022 有 nextRunAt 才执行;工作台直写 SQLite 的 next_run_at=null 全卡死)。之前 P2「去掉 next_run_at 列(执行器用 scheduled_at/created_at)」是**错误判断**。修复:`/api/run` ①scheduled_at=now+5s(带秒,未来)②**恢复 next_run_at 列 = Date.now()+5000**(17 列)→ 工作台按钮触发后 +5s 调度器拾取,满足用户「10 秒内执行」诉求
- **「10 秒内」机制边界**:Agent 侧 automation_update 受客户端补算阈值限制(余量不足不补算),无法稳定 10s 内;工作台直写 next_run_at=now+5s 可稳定 10s 内执行。用户诉求正确落点=工作台按钮链路
- 服务当前未运行(8899 无响应);server.js 已改+语法通过,下次启动生效
## 09-01 00:10 关键验证:并行执行实测通过 + 立即执行参数结论
- **5 任务并行实测(00:07:06 触发)**:调度器 00:07:32.7 全部拾取(拾取延迟 ~27s = 客户端扫描周期);3 个立即 IN_PROGRESS 各建会话(29596/33021/15729 working),2 个 QUEUED 排队(21514 pos1/20164 pos2)→ **客户端后台自动化并发上限≈3**,超出排队(queuedPosition 标记);1任务=1会话 1:1 并行成立
- **automation_runs 状态机**:QUEUED(排队,有queuedPosition)→IN_PROGRESS(建会话,meta含conversationId/sessionId)→ACCEPTED(完成,meta含resultState/resultEvidence);表列=thread_id/automation_id/status/read_at/thread_title/source_cwd/runs_json/result_success/metadata_json
- **立即执行参数:不存在**。已查 argv.json(仅IDE渲染参数)/settings.json(仅插件/sandbox/claw)/无 workbuddy CLI;客户端无并发数/扫描周期配置项 → 无法通过参数控制立即执行
- **工作台按钮已是最快路径**:server.js /api/run 写 scheduledAt=now+5s + next_run_at=now+5000(17列),点击后 5s 进入调度器视野 + 扫描周期(≤30s) → 实际开始 5~35s
- 服务已重启(00:10:08, PID 23820),server.js 修复代码确认在位(369-375行)
## 09-01 00:25 并发方案A(浏览器锁)落地 + 端口迁移 8899→8900
- **方案A 落地**:server.js /api/run 对浏览器类任务(正则匹配 账号信息|视频列表|保存并分析|采集|导入账号|网页采集|浏览器)自动注入【浏览器锁约束】——锁文件 `D:/AgentSkill/mcn-workshop/.browser-lock`,操作前查锁→10s重试×18次(3分钟)→死锁保护(超10分钟可抢占)→完成后删锁;规范文档新增 5.6 并发互斥节(含 bash 拿锁/释放示例)
- **8899 被小米占用(新坑)**:`MiPCAudio.exe`(小米 PC 管家音频共享服务)系统级占用 0.0.0.0:8899 且杀后自动复活(taskkill 无效)→ server.js 绑定 127.0.0.1:8899 不生效、curl/内置浏览器全 000
- **修复**:server.js 支持 `node server.js [端口]` 传参(PORT_BASE=argv[2]||8899),改用 8900 启动,HTTP 200 验证通过,内置浏览器已打开
- **bash `&` 后台进程会被会话回收**:必须用 run_in_background=true 方式启动长驻服务,普通 `&` + 重定向会在命令返回后被清理
+15 -20
View File
@@ -1,26 +1,23 @@
# MCNVideo AI 项目长期记忆
## 环境判定两步模型 + 三技能统一产出结构(08-26 定稿)
- **两步判定**:第一步查本机 `D:\AgentSkill` 是否存在——**无=③用户环境**;有→第二步看技能路径——**在 `D:\AgentSkill\` 下=①开发机(源技能)**、**含 `.dsh`=②dsh 部署环境**(如 `C:\Users\maidou\.dsh\skills\`)。单一 `.dsh` 锚点会把用户环境误判为开发机(P0 已修复)
- **产出落盘**:①③同构=**桌面 `MCNSkill项目/{账号名}/`**(账号层直挂,无技能文件夹层);②dsh=**`D:\dshworkspace\` 主工作区优先**
- **三技能结构**:①③ 三技能共用一个账号文件夹(账号分析产出 `{账号名}账号设定.md`/`账号数据分析.md`/`短视频表格.xlsx`/`视频分析\{标题}_标签1_标签2\` 直挂;脚本=`脚本{编号}\`;分镜=`提示词{编号}\` 继承上游编号)。② dsh 分目录:`创作任务\{账号名}\`(脚本/分镜平级)与 `解析任务\{达人昵称}\` 分开
- **废弃**:`DSHSkill项目\` 根、`MCNSkill项目/脚本创作/`、`/分镜提示词/` 技能层、旧 dsh 根 `MCNSkillCase/`
- 现状:dsh 解析任务已符合定稿;桌面 `MCNSkill项目/账号分析/{小咪橘座,旧梦留声机,王微斯}` 用户选"现有先不动";账号分析/脚本创作技能配置尚未同步两步判定(待办)
- **两步判定**:①本机无 `D:\AgentSkill`=③用户环境;有→②技能路径在 `D:\AgentSkill\` 下=①开发机(源技能)、含 `.dsh`=②dsh 部署环境。单一 `.dsh` 锚点会把用户环境误判为开发机(P0 已修复)
- **产出落盘**:①③同构=桌面 `MCNSkill项目/{账号名}/`(账号层直挂);②dsh=`D:\dshworkspace\` 优先。三技能共用账号文件夹(分析产出直挂;脚本=`脚本{编号}\`;分镜=`提示词{编号}\` 继承上游编号)。废弃:`DSHSkill项目\`、`MCNSkill项目/脚本创作/`、`/分镜提示词/` 技能层、旧 dsh 根 `MCNSkillCase/`
- 产出路径唯一权威=`references-add/路径配置.md`(运行时优先于 SKILL.md);用户自定义路径 > 默认路径
## 核心技能
- **短视频脚本创作** `project/短视频脚本创作/{V1.0,Lite1.0}/`:11步流程+知识库12分类(66文件);V1.0 含 MCP/Dify 接口,Lite1.0 去全部接口、模型自带 WebSearch。**同步策略(08-26 用户定)**:只改 V1.0 源技能+dsh 副本两处;Lite1.0 默认不动
- **MCN工作台(08-27,仅 V1.0)** `project/短视频脚本创作/V1.0/mcn-work-shop/`(server.js+public/,零依赖 Node,端口8899自动避让);触发「打开工作台」→ 启动服务+内置浏览器打开。hash 路由:首页+📈账号周榜/👥热门账号/账号详情/视频详情/AI写脚本/AI写作复盘(读自有 mcn-plugin.db 副本+dshworkspace 榜单 JSON)+📁产出浏览(桌面 MCNSkill项目/ 账号层直挂)+❓帮助页。**首页顶部数据预览条(08-31,参考 dsh-plugin-mcn 首页 stats 移植)**:`/api/dsh/stats` 5 项=热门账号(accounts)/视频解析(analyses)/AI写脚本(rewrites)/AI写作复盘(reviews type='ai')/AI写作评分(writingScore=最新20条AI复盘平均分),条带=7%品牌蓝底+数值26px粗体+右分隔线(样式在 style.css .home-stats);**AI 任务触发(08-27 定版;归 mcn-workshop 空间)**:数据页按钮→`confirmRun()` 确认弹窗→`executeTask()` `POST /api/run` 写 `~/.workbuddy/workbuddy.db` automations(once+now,cwds=`D:\AgentSkill\mcn-workshop`)→WorkBuddy 自动执行创建会话→左侧会话栏 mcn-workshop 空间可见;轮询 `GET /api/run/status?id=`(读 automations/automation_runs/automation_runtime_state:running=IN_PROGRESS/running、done=DONE/COMPLETED/SUCCESS、error=ERROR/CANCELLED;5s 间隔 30min 上限)→done/error 恢复按钮(.btn-busy「执行中…」);**用户明确不同步 dsh/Lite**(刻意 divergence);AI脚本选题(08-28):关注账号「创作」→「AI脚本」`confirmAiScript` 选题 textarea→`POST /api/ai/topics`(查库带账号摘要→S5 方法论 prompt→Dify chat-messages recall 即时返回约50s);Dify key 内置 `scripts/MCN_CYLG_API.py` 的 `DEFAULT_CYLG_KEY`(env `DIFY_MCN_CYLG_KEY` 优先;key=app-0vRaxPhvVOqzFQIa5eFzFdjD),`DIFY_URL` 默认 mydify.youmanvideo.com/v1、model 默认 gemini、curl 中文被 CDN 拦推荐 Python、search 易超时用 recall;**AI脚本诊断(08-31 用户指定技能)**=#/reviews 复盘页(原「AI写作复盘」改名),复盘/对比按钮的 AI 任务 prompt 明确「按 mcn-script-review(脚本复盘)技能执行」(评分式复盘 + AI脚本vs源脚本对比分析三段式);帮助页「诊断 & 评分」组 desc 同步标注技能来源并补对比问法
- **抖音账号分析 mcn-dou-analysis(主版本 08-27)**:源=`project/短视频脚本创作/V1.0/subskill/mcn-dou-analysis/`;dsh 副本=`C:\Users\maidou\.dsh\skills\mcn-dou-analysis\`;旧路径 `project/短视频账号分析/case_1/` 已废弃。**六大功能(08-31 加 F6)**:F1账号信息/F2视频列表(13列Excel)/F3提炼账号设定(人设卡12段)/F4分析视频数据(逐条→汇总两段式)/F5解析视频(单视频MCP)/**F6生成账号设定卡片**(SVG 长图 680×~1716,模板=旧梦留声机样例)。红线:达人账号表15列(仅用户要求增改)、TOP6筛选(点赞+分享降序,权威参数在SKILL.md)、≥60条停止滚动、29赛道枚举、源技能只读单向同步、技能边界(脚本必须切脚本创作技能)、浏览器9223调试实例+标签页复用。**账号数据来源红线(08-31 强化,防"又走到MCP"复犯)**:账号表任何字段(**含身份标识 sec_uid/抖音号/抖音地址**)禁止从数据库回填——工作台库 `mcn-plugin.db` 的 `hot_accounts` 表 = MCP 内部账号库(list_hot_accounts/hot_account_detail)**本地副本,读其数据=违反红线**;dsh 原库只读参考;库仅用于流程状态参考;登记只占位 账号ID+昵称,身份标识**留空待浏览器抓取回填**;MCP 工具调用严格限定 TC-05 视频解析环节(前置检查只确认可用性,登记阶段不调 MCP)。避坑案例见 `references/铁律避坑规则/账号信息获取执行避坑.md`**F6 卡片配色分两系(08-31 定型)**:**深色系(深色长图风,深沉/浓郁调性,如旧梦留声机)**=深棕红渐变底 #2B0F0A→#1A0805 + 浅米卡 #FAEEDA + 深色字 + 珊瑚红强调;**浅色系(浅色甜宠风,明快/甜美/治愈调性,如王微斯·定稿玫瑰金)**=玫瑰金渐变底 #D6A3A9→#9A5563 + 白卡 #FFFFFF + 粉边 #E8C9DC + 深粉字 #7B2D5E + 粉强调 #C0457F→#E876A9;背景上直接书写的文字随背景深浅提亮(玫瑰金底:模块标题 #FDE8EC/注释 #EAC6CE/版权 #DDBCC4);更浅可回退浅粉紫 #F8EDF6→#F1E0EE;底色决定色系,**同一账号必须固定色系**,跨账号可不同;禁跨系混用。模块名统一为「叙事结构」「内容标签」「**内容基因·TOPn(n=实际解析条数,几个视频就是TOP几,如王微斯4条→TOP4;不足6条按实际条数,非固定6)**」。**F6 触发场景处理(07情况表+三问判定链)在 06 文档。**MCP 安装检测触发时机(08-31 定稿):**账号分析保持「执行工作流前(视频解析前)检测」原状**(不随创作技能扩);**创作技能 V1.0 = 首次触发必做动作**——会话首次交互(问功能/发起任务无论问什么)先检查 `myai-mcp-production` 可用性(查可用工具列表或读 `~/.workbuddy/mcp.json`),未安装轻量提醒(可跳过不打断创作);规则落点=SKILL.md MCP 依赖章节安装引导行 + MCP 规范 3 节触发时机/检测方法 + 帮助文档 MCP 服务说明。**browser-harness 依赖检测(08-31 加)**:功能一/二(浏览器抓取)执行前必检——检测可执行文件(Windows `~/.local/bin/browser-harness.exe` / macOS/Linux `~/.local/bin/browser-harness`)或命令探测(Windows `where` / macOS `command -v`)→ 未装提醒(可跳过,换三方API/MCP兜底)→ 同意则 `uv tool install --python 3.12 --upgrade --force browser-harness` → `browser-harness doctor` 验三要素(工具/daemon/Chrome);技能体 `~/.dsh/skills/browser-harness/` 随 dsh_MCNProject 分发。规则落点=SKILL.md 红线行「browser-harness 依赖」+ 浏览器规范 5.0(检测/安装)。**环境检查系统分流(08-31 用户要求)**:browser-harness 代理清理(Win PowerShell Remove-Item / mac unset)、Chrome 启动(Win `chrome.exe` / mac `/Applications/Google Chrome.app/...`)、端口探测(Win Invoke-WebRequest / mac curl)、MCP mcp.json 路径(Win `%USERPROFILE%\.workbuddy\mcp.json` / mac `~/.workbuddy/mcp.json`)、npm 缓存权限检查仅 macOS 高发(Windows 跳过)。**功能三→功能六自动联动(08-31 固化)**:功能三产出 `{账号名}账号设定.md` 后**自动生成设定卡**(无需用户开口,删除 06 文件即禁用自动);**设定 md ↔ 卡片 SVG 双向联动维护**——改设定→卡片同步(内容级重生成/单点改 SVG)、改卡片→设定同步、术语改名→两边一起改(历史案例:内容路线→叙事结构、核心气质→内容标签),交付前 grep 校验关键术语两文件一致;规则固化于 SKILL.md(功能三 Step7/功能六自动触发)+ 03 文档 Step7 + 06 文档触发场景/双向联动维护
- **短视频分镜脚本** `project/短视频提示词生成/`(08-27 去 V1.0 层):4功能 F1反推图片/F2反推视频/F3生成图片/F4生成分镜;三层引用架构 参考skills→references/→references-add/(运行时优先;开发机不启用 references-add/,dsh/用户环境启用);知识库15维度(01-12用户+13音效+14构图+15风格);F4输出=主题+导演阐述+代码块(>5s时间戳分段/≤5s单段);提示词模板类型分档(A剧情/B单人Vlog/C旁白知识/D产品展示/E纯氛围)+4层×5类型适配表;公式只留时间预算表等内部环节,提示词正文只写时长结论;seedance25 时间测算体系(语速6公式+动作14+运镜7+帧级换算+超调6级);dsh 副本无独有内容需回流(唯一独有项 `name: storyboard-prompt` 环境保留)
- **MCN工作台(08-27,仅 V1.0)** `project/短视频脚本创作/V1.0/mcn-work-shop/`(server.js+public/,零依赖 Node,端口8899自动避让);触发「打开工作台」→ 启动服务+内置浏览器打开。hash 路由:首页+📈账号周榜/👥热门账号/账号详情/视频详情/AI写脚本/AI写作复盘+📁产出浏览+❓帮助页。**首页数据预览条(08-31,参考 dsh-plugin-mcn)**:`/api/dsh/stats` 5 项=热门账号/视频解析/AI写脚本/AI写作复盘/AI写作评分(最新20条AI复盘平均分),7%品牌蓝底+数值26px粗体+右分隔线。**AI 任务触发(08-27 定版;归 mcn-workshop 空间)**:按钮→`confirmRun()`→`executeTask()` `POST /api/run` 写 `~/.workbuddy/workbuddy.db` automations(once+now,cwds=`D:\AgentSkill\mcn-workshop`)→客户端调度器建会话→左侧会话栏可见;轮询 `GET /api/run/status?id=`(running/done/error;PENDING_REVIEW→review「待确认」08-31 加)。**★09-01 调度机制完整结论(详见工作台 `自动化任务调度机制.md`,实测定稿)**:①调度器按 `next_run_at` 扫描,工作台直写必须显式写 next_run_at(08-31 P2 去列判断错误,已纠正为 +5s 显式写);②scheduled_at 必须未来且留足余量(+60s 稳、+17s 失败——update 有往返延迟);③客户端后台自动化并发上限≈3,超出 QUEUED 排队(meta.queuedPosition);④立即执行参数不存在(argv/settings 均无,无 CLI),工作台 +5s 已是最快路径(实际开始 5~35s);⑤runs 状态机 QUEUED→IN_PROGRESS→ACCEPTED(meta 含 conversationId/sessionId/resultState);⑥改 server.js 必须重启服务才生效(taskkill /PID 后重启)**。**用户明确不同步 dsh/Lite**(刻意 divergence)。AI脚本选题(08-28):`/api/ai/topics`(S5方法论→Dify recall 即时返回约50s);Dify key 内置 `scripts/MCN_CYLG_API.py` 的 `DEFAULT_CYLG_KEY`(env `DIFY_MCN_CYLG_KEY` 优先),`DIFY_URL` 默认 mydify.youmanvideo.com/v1、model 默认 gemini、curl 中文被 CDN 拦推荐 Python、search 易超时用 recall。**AI脚本诊断(08-31)**=#/reviews 复盘页,复盘/对比按钮 prompt 明确「按 mcn-script-review(脚本复盘)技能执行」(评分式复盘+AI脚本vs源脚本对比三段式)
- **抖音账号分析 mcn-dou-analysis(主版本 08-27)**:源=`project/短视频脚本创作/V1.0/subskill/mcn-dou-analysis/`;dsh 副本=`C:\Users\maidou\.dsh\skills\mcn-dou-analysis/`。**六大功能(08-31 加 F6)**:F1账号信息/F2视频列表(13列Excel)/F3提炼账号设定(人设卡12段)/F4分析视频数据/F5解析视频(单视频MCP)/F6生成账号设定卡片(SVG 长图 680×~1716,模板=旧梦留声机样例)。红线:达人账号表15列、TOP6筛选(点赞+分享降序,SKILL.md 权威)、≥60条停止、29赛道枚举、源技能只读单向同步、技能边界(脚本必须切脚本创作技能)、浏览器9223调试实例+标签页复用。**账号数据来源红线(08-31)**:账号表任何字段(含身份标识 sec_uid/抖音号/地址)禁止从数据库回填——工作台库 `hot_accounts` 表=MCP 内部账号库本地副本,读其数据=违反红线;登记只占位 账号ID+昵称,身份标识留空待浏览器回填;MCP 调用严格限定 TC-05。**F6 卡片配色两系(08-31)**:深色系(深沉浓郁调性,如旧梦留声机)=深棕红渐变 #2B0F0A→#1A0805+浅米卡 #FAEEDA+珊瑚红强调;浅色系(明快甜美治愈,如王微斯·玫瑰金定稿)=玫瑰金 #D6A3A9→#9A5563+白卡+粉边 #E8C9DC+深粉字 #7B2D5E+粉强调 #C0457F→#E876A9;背景文字随背景深浅提亮。**调性优先于赛道标签**:明快/欢乐/爽文/暖心→浅色系,深沉/催泪/怀旧/悲情→深色系;「治愈」双义必须回读情绪锚点(俊希=明快欢乐治愈爽文→浅色系暖橙 #F5D0A4→#DE9A5E,非深焦糖)。模块名统一「叙事结构」「内容标签」「内容基因·TOPn(n=实际解析条数,非固定6)」。**F3→F6 自动联动(08-31)**:功能三产出设定后自动生成卡片(删 06 文件即禁用);设定 md↔卡片 SVG 双向联动维护(改一边另一边同步、术语改名两边一起改,交付前 grep 校验)。**MCP 检测触发时机(08-31)**:账号分析保持「执行工作流前检测」原状;创作技能 V1.0=首次触发必做动作(会话首次交互先查 `myai-mcp-production`,未装轻量提醒可跳过)。**browser-harness 依赖(08-31)**:功能一/二执行前必检(Win `where`/mac `command -v` 或可执行文件存在性),未装提醒+`uv tool install --python 3.12 --upgrade --force browser-harness`+doctor 验三要素
- **短视频分镜脚本** `project/短视频提示词生成/`(08-27 去 V1.0 层):4功能 F1反推图片/F2反推视频/F3生成图片/F4生成分镜;三层引用架构 references→references-add/(运行时优先;开发机不启用);知识库15维度;F4输出=主题+导演阐述+代码块(>5s时间戳分段/≤5s单段);模板分档 A剧情/B单人Vlog/C旁白知识/D产品展示/E纯氛围 +4层×5类型适配表;seedance25 时间测算体系;dsh 副本无独有内容需回流
## 创作技能关键规则(权威源:SKILL.md 关键规则 + references/创作流程规范.md)
## 创作技能关键规则(权威源:SKILL.md + references/创作流程规范.md)
1. 三态创作:⚡自动(默认)=静默执行+只落最终交付物;🤝共创=+每确认门询问;🛠️开发=+每步全落盘。7确认门不可合并;角色边界(分析不做创作)
2. 内容总监兜底所有质量检查点;文件 `scripts/{视频标题}/XX_阶段名.md`
3. 人设卡片 `{账号名}人设卡片.md` 账号层共用(dsh=`D:\dshworkspace\创作任务\{账号名}/`,①③=桌面 `MCNSkill项目/{账号名}/`);模板=账号设定(定位6字段+内容怎么做5章节)+达人设定6章节+账号类型三分类+广告植入偏好(可选);**内容规则=账号级"如果…则…"事前约束,非事后验收清单**
3. 人设卡片 `{账号名}人设卡片.md` 账号层共用;内容规则=账号级"如果…则…"事前约束,非事后验收清单
4. 产物链铁律(P0):`05_故事选题`→`06_短视频框架`→`07_短视频大纲` 顺序产出禁跳步;「产出与传递」永不省略
5. 硬编码禁止(P0):标准库禁账号名角色名;产出目录全允许
6. references-add 增量优先(冲突以 references-add 为准,references/ 加⚠️);路径配置以 `references-add/路径配置.md` 为权威
6. references-add 增量优先(冲突以 references-add 为准);路径配置以 `references-add/路径配置.md` 为权威
7. 三层分离:S6情绪规划→S7结构搭建→S9情绪演绎;S6情绪设计卡集中完成,S7只引用;S9分行切镜;闪回≤2次/条;花字/字幕每场≤2条
8. 叙事驱动4类:事件/对白/旁白/混合;剧情类禁旁白驱动;S6必须明确选择
9. 情感铺垫分级:强=剧情类(四功能位+蓄力释放+七问自检);中=Vlog/探店;弱=知识/美妆/吃播/三农/户外
@@ -29,26 +26,24 @@
12. 分镜只能从S9生成,可选步骤🔶,默认流程结束于S9
13. 知识库09_脚本诊断=三件套(AI检查+人工检查+自动清单八类32项);12_爆款拆解=反推复刻方法论;知识库总数65个
14. 技能边界(08-26 固化三副本):分析技能止步于五类账号分析侧交付物;凡生成/改写脚本必须切换脚本创作技能走S1-S11(含S11数字账取证/开场钩子铁律/编导终审验收),禁止会话内直接手写脚本。开场钩子=绝对时长3-7秒硬上限10秒,不看占比;数值校验必须取证列链、禁心算
15. 交付物输出边界(08-26 固化三副本):**验收口径=执行约束,不是输出内容**——铁律/时长占比/数字账取证禁在S9/S10交付物正文展开自证(禁秒级节拍分段/生成链路块/映射表/S11诊断记录);交付物只含输出模板定义字段;固化于 `创作流程规范.md`「交付物输出边界」+`9_生成短视频脚本.md`输出模板「输出边界」块
15. 交付物输出边界(08-26 固化三副本):**验收口径=执行约束,不是输出内容**——铁律/时长占比/数字账取证禁在S9/S10交付物正文展开自证;交付物只含输出模板定义字段
## 其他项目
- **AI创作平台toc** `project/AI创作平台toc/case_1/`:ToC 个人创作者,输入→分析→脚本3版本→对话修改
- **内容创作产品规划** `project/内容创作产品规划/`:短剧知识库五层分类×三层标签×12维度;短视频知识库V2.0 三级分类(27赛道S01-S27×8叙事形态F01-F08)+13维度+极致事件双重类型
- **ljg-skills** `.workbuddy/skills/ljg-skills/`:ljg-is/think/rank/structure + ljg-mcn(6种共鸣类型+具象场景+细微情绪=强共鸣,禁下钻神经科学)
- **AI创作平台toc** `project/AI创作平台toc/case_1/`;**内容创作产品规划** `project/内容创作产品规划/`(短剧知识库五层分类×三层标签×12维度;短视频知识库V2.0 三级分类27赛道×8叙事形态+13维度);**ljg-skills** `.workbuddy/skills/ljg-skills/`
## 分析方法论
- **跨技能借鉴/同步判断**:两步独立判断——①数据流验证(信息从哪来→落到哪→下游谁读,断点=缺口)②字段形态决策(直接搬/改造/承接);禁止用②覆盖①;先画数据流再定形态
- **跨技能借鉴/同步判断**:两步独立判断——①数据流验证(信息从哪来→落到哪→下游谁读,断点=缺口)②字段形态决策(直接搬/改造/承接);禁止用②覆盖①
- **信息链路缺口识别**:Step 有方法论≠Step 能承接账号级信息;通用方法论管"怎么做",账号级信息管"怎么做才像它",不可互替
## 工作方式约定
- **改完必重开页面(08-28 用户强调)**:MCN工作台等网页改动完成后,最后一步必须用 present_files 重新打开对应页面(带 hash 定位,如 `http://localhost:8899/#/rewrites`);内置浏览器无 CDP 调试端口无法模拟 F5,重开页面是唯一刷新方式
- **改完必重开页面(08-28)**:MCN工作台等网页改动完成后,最后一步必须用 present_files 重新打开对应页面(带 hash 定位);内置浏览器无 CDP 调试端口无法模拟 F5,重开页面是唯一刷新方式
- **逐条修复**:审计修复必须读一条→改一条→验证一条→再进下一条,禁止批量读取
- **技能版本标签(08-26)**:frontmatter 存 `updated_at`+`last_change`+`deployment`;源=`source`+`created_at`+`updated_at`,副本=`dsh`+`updated_at`+`deployed_at`;副本 deployed_at<源updated_at=滞后
- **.dsh 单向只读(08-22 强约束)**:`.dsh` 副本只能「读取→回流源技能」,禁止反向写回(除非用户明确授权);允许1处环境差异
- **dsh 差异方向判定(08-26)**:以「08-22 回流后 V1.0=.dsh 完全一致」为基准线+当日日志字面描述判定,不靠内容新旧直觉
- **生成网页必参考设计技能(08-27 强约束)**:先读 `.workbuddy/skills/` 下 taste-skill(Anti-Slop,适用于 landing/作品集,不适用 dashboard)与 impeccable(完整界面设计/评审工程,dashboard/product UI 主参考其 Operate 模式)再动手
- **git(08-31)**:半天 push 一次(不要改一点就推);push 前先 fetch 确认无分叉;Windows 下 PowerShell Stop-Process 关后台 node;全局代理 socks5 会破坏 git 连接需清空
- **生成网页必参考设计技能(08-27 强约束)**:先读 `.workbuddy/skills/` 下 taste-skill 与 impeccable 再动手
## 历史事件(摘要)
- 06-25 营销号风格清理;07-17 大炮创作方法136文件;07-20 知识库重组;07-29 短剧知识库V5.0;07-30 短视频知识库V2.0
- 08-11→12 素材库扁平化(8类型+四维标签)+去硬编码(30处)+产物链铁律;08-12 人设卡片V2.1;08-16 知识库赛道8→27;08-17 三态创作模式定稿;08-20 分镜标准库落库+seedance25提炼;08-21 Lite1.0 新增;08-22 .dsh 单向只读确立;08-25 仓库更名 mcn-video-script
- 08-26 路径重构+环境判定两步模型+三技能统一产出结构定稿;08-27 mcn-dou-analysis 定主版本、短视频提示词生成去 V1.0 层、工作台新增;08-28 S9 格式修正(A格式独立动作叙述去括号)+ 工作台改写弹窗 UI 迭代
- 08-26 路径重构+环境判定两步模型+三技能统一产出结构定稿;08-27 mcn-dou-analysis 定主版本、短视频提示词生成去 V1.0 层、工作台新增;08-28 S9 格式修正+工作台改写弹窗 UI 迭代;08-31 工作台数据预览条/改名/AI脚本诊断技能关联/俊希全流程TC-01~11/调度器根因确认(scheduledAt须未来时间)
@@ -0,0 +1,6 @@
# 自动化执行记录:AI会话创建链路验证
## 2026-08-31
- 任务:验证自动化调度链路是否恢复(要求直接回复指定文本)
- 结果:成功执行,已按要求回复「AI会话创建成功,自动化调度链路已恢复」
- 备注:本自动化用于验证 AI 任务触发 → 会话创建 → 自动执行的完整链路
@@ -227,18 +227,18 @@
| 环节 | 用例 | 结果(✅/❌/⚠️) | 备注 |
|-----|------|----------------|------|
| 账号表登记 | TC-01 | | |
| 获取账号信息 | TC-02 | | |
| 获取视频列表 | TC-03 | | |
| 筛选 TOP | TC-04 | | n=___ |
| MCP 解析 | TC-05 | | |
| 保存解析 | TC-06 | | |
| 人设卡 12 段 | TC-07 | | |
| 设定卡自动生成 | TC-08 | | |
| AI 选题 | TC-09 | ✅ | **界面模拟点击已实测 PASS**(cdp-test-junxi.mjs 安全模式:定位/弹窗/选题 3 方向);真实触发任务需 --confirm |
| AI 写脚本 | TC-10 | | 脚本1/ |
| 收尾验证 | TC-11 | | |
| **整体结论** | | | 通过/不通过 |
| 账号表登记 | TC-01 | ✅ | 俊希 70014 已登记,15 列结构不变,已有行未受影响(09-01 复核) |
| 获取账号信息 | TC-02 | ✅ | 15 列补齐:JJX0827/sec_uid/地址/粉丝281.9w/获赞3658.9w/作品136/IP广西,更新时间 2026-08-31 18:05(浏览器实时抓取) |
| 获取视频列表 | TC-03 | ✅ | `短视频表格.xlsx` 13 列 136 行(≥60) |
| 筛选 TOP | TC-04 | ✅ | top6.json 6 条(n=6,最近三个月+≤15min+点赞+分享降序) |
| MCP 解析 | TC-05 | ✅ | 6 条全部 ACCEPTED(33021/29596/15729/21514/20164/33022),09-01 凌晨调度器拾取并行执行 |
| 保存解析 | TC-06 | ✅ | 6/6 目录各含 content.json+analysis.json,JSON 全部可读(verify 通过) |
| 人设卡 12 段 | TC-07 | ✅ | `俊希账号设定.md` 12 段齐全,内容基因板块数=6(TOP6) |
| 设定卡自动生成 | TC-08 | ✅ | `俊希账号设定卡.svg` 生成;grep 一致性通过(叙事结构/内容标签/内容基因·TOP6 两文件一致) |
| AI 选题 | TC-09 | ✅ | **界面模拟点击实测 PASS**(cdp-test-junxi.mjs --port 8900):定位/弹窗/选题 3 方向全 PASS(穷鬼大餐/手绘拼音菜单/菜场散心) |
| AI 写脚本 | TC-10 | ✅ | 09-01 实测:--confirm 触发 → automations 写入(+5s 调度)→ 调度器拾取 → 会话 cd064941 完成 → `脚本01/09_脚本正文.md` + 创作回顾 HTML。S9 质量门禁:6 场 420s 数字账一致、5 字段画面标注、人物标注统一、开场钩子 3-7s 达标 |
| 收尾验证 | TC-11 | ✅ | 全链路产物 12 项齐全;账号表仅按需增改 3 行;调度机制修复(next_run_at+并发锁)验证通过 |
| **整体结论** | | **✅ 通过** | 09-01 全链路复测:修复后调度链路完整跑通(含并行解析 6 条 + 创作会话) |
---
+3 -3
View File
@@ -8,8 +8,8 @@ description: >
触发场景:写脚本、创作短视频、生成脚本、拆解对标视频、分析爆款视频、
诊断脚本质量、设计账号人设、选题策划、生成分镜、广告植入设计、生成创作回顾。
version: "1.0"
updated_at: "2026-08-31"
last_change: "MCP安装引导升级为首次触发检查(必做动作):会话首次交互(问功能/发起任务无论问什么)先检测 myai-mcp-production 可用性(可用工具列表或 mcp.json),未装轻量提醒可跳过;环境检查系统分流:mcp.json 路径 Win %USERPROFILE%\\.workbuddy\\mcp.json / mac ~/.workbuddy/mcp.json;同步 MCP_工具调用规范.md 检测方法/部署预检(npm缓存权限仅macOS高发,Win跳过)+ 帮助文档 MCP服务说明"
updated_at: "2026-09-01"
last_change: "工作台AI任务触发改为 scheduled_at=now+5s+显式写next_run_at(09-01调度机制实测定稿,替代08-31 scheduled_at=now旧认知);新增 自动化任务调度机制.md(根因/硬规则/状态机/并发上限≈3/排查命令);同步MCP安装引导(08-31)"
deployment: "source"
agent_created: true
---
@@ -70,7 +70,7 @@ agent_created: true
- **🧪 AI写作复盘(#/reviews)**:评分维度列表 + 复盘详情(评分条/问题清单/报告)
- **📁 产出浏览(#/files)**:默认读桌面 `MCNSkill项目/`,支持 ⚙️ 设置添加其他项目地址;md/json 在线预览
4. **数据边界**:数据库读工作台自有副本 `mcn-work-shop/mcn-plugin.db`(由 dsh 库复制而来,与 dsh 原库 `~/.dsh/mcn-plugin.db` 完全隔离,两边各访问各的互不影响);周榜读 `D:\dshworkspace\抖音榜单\*.json` 文件
5. **AI 任务触发(Automation 方案)**:各数据页「导入/创作/解析/改写/提炼/复盘」按钮点击后 → 工作台后端 `POST /api/run` → 向 `~/.workbuddy/workbuddy.db` 的 `automations` 表写入一条**一次性任务**(`schedule_type='once'`、`scheduled_at=now`、`cwds=["D:\\AgentSkill\\mcn-workshop"]`)→ WorkBuddy 运行时自动消费执行(创建 AI 会话)→ **会话归入 `mcn-workshop` 空间分组**(左侧会话栏按 cwd 分组,可在该分组查看任务执行过程与结果)。参考 dsh 插件 `dsh-plugin-mcn` 的 `/mcn/api/creative` 模式(固定会话 followup 触发);前端 5 秒防连点
5. **AI 任务触发(Automation 方案)**:各数据页「导入/创作/解析/改写/提炼/复盘」按钮点击后 → 工作台后端 `POST /api/run` → 向 `~/.workbuddy/workbuddy.db` 的 `automations` 表写入一条**一次性任务**(`schedule_type='once'`、**`scheduled_at=now+5s`(带秒)且显式写 `next_run_at=now+5000`**、`cwds=["D:\\AgentSkill\\mcn-workshop"]`)→ WorkBuddy 客户端调度器按 `next_run_at` 扫描拾取(周期≤30s)→ 创建 AI 会话执行 → **会话归入 `mcn-workshop` 空间分组**(左侧会话栏按 cwd 分组,可在该分组查看任务执行过程与结果)。参考 dsh 插件 `dsh-plugin-mcn` 的 `/mcn/api/creative` 模式(固定会话 followup 触发);前端 5 秒防连点。**调度机制/状态机/并发上限/排查命令详见同目录 `自动化任务调度机制.md`(09-01 实测定稿,勿再按旧认知 `scheduled_at=now` 直写——会因 next_run_at 为空而卡死)**
6. 本功能仅 V1.0 源技能环境提供,**不同步 dsh/Lite 副本**
7. **改完必重开页面(硬性约定)**:对工作台任何页面/代码改动完成后,**最后一步必须用 present_files 重新打开对应页面**(带 hash 直接定位,如 `http://localhost:8899/#/accounts`),让用户在 WorkBuddy 内置浏览器立即看到最新效果。原因:内置浏览器无 CDP 调试端口(9222/9224 等均无响应),无法模拟 F5;重开页面是唯一可靠刷新方式。此约定对工作台所有 UI 改动强制生效
@@ -2,16 +2,19 @@
// 覆盖测试用例 TC-09 的界面交互环节(真实模拟用户点击,非仅文字步骤)
//
// 前置:
// 1. 工作台服务运行中(node server.js,端口 8899)
// 1. 工作台服务运行中(node server.js,端口 8899 默认;若 8899 被小米占用则用 8900)
// 2. 浏览器 9223 调试实例已启动(browser-harness 调试实例)
// 3. 账号列表(hot_accounts)含「俊希」
// 用法:
// node cdp-test-junxi.mjs # 只验证到「选题生成」,不触发创作任务(安全模式)
// node cdp-test-junxi.mjs --confirm # 选题生成后继续点「确认执行」,真实触发创作任务
// node cdp-test-junxi.mjs --port 8900 # 指定工作台端口(默认 8899)
// 说明:脚本在 9223 实例新开标签页操作,不干扰用户已打开的页面;结束后自动关闭新开标签页。
const argPort = process.argv.indexOf('--port');
const PORT = argPort > -1 && process.argv[argPort + 1] ? process.argv[argPort + 1] : '8899';
const CONFIRM = process.argv.includes('--confirm');
const BASE = 'http://localhost:8899';
const BASE = 'http://localhost:' + PORT;
// 1) 连接 9223 调试实例
const list = await fetch('http://localhost:9223/json').then((r) => r.json());
@@ -30,10 +33,10 @@ await send('Page.enable'); await send('Runtime.enable');
// 2) 新开标签页打开账号列表(不干扰现有页面)
const { targetId } = await send('Target.createTarget', { url: BASE + '/#/accounts' });
await sleep(2500);
let targetPage = list2 => list2.find((t) => t.type === 'page' && t.url.includes('localhost:8899') && t.id === targetId);
let targetPage = list2 => list2.find((t) => t.type === 'page' && t.url.includes('localhost:' + PORT) && t.id === targetId);
let pages = await fetch('http://localhost:9223/json').then((r) => r.json());
let tp = targetPage(pages);
if (!tp) { console.log('ERR: 新开标签页未找到 8899 页面'); process.exit(1); }
if (!tp) { console.log('ERR: 新开标签页未找到 ' + PORT + ' 页面'); process.exit(1); }
// 切换 WS 到新页面
const ws2 = new WebSocket(tp.webSocketDebuggerUrl);
let id2 = 0; const pending2 = new Map();
@@ -1,5 +1,5 @@
// MCN工作台 - 本地 Web 服务(零依赖 Node 实现)
// 启动: node server.js → http://localhost:8899
// 启动: node server.js [端口] → http://localhost:8899(默认;可传参指定端口,如 node server.js 8900)
// 功能: 技能导航 + 产出内容浏览(默认读桌面 MCNSkill项目)+ dsh 数据功能页(账号/视频/脚本/复盘/周榜,只读)
'use strict';
@@ -10,7 +10,9 @@ const os = require('os');
const { URL } = require('url');
const dsh = require('./dsh-data');
const PORT_BASE = 8899;
// 09-01 端口改为可传参(默认8899):本机 8899 可能被小米 PC 管家 MiPCAudio.exe 系统服务占用(0.0.0.0 监听且自动复活),
// 此时 127.0.0.1:8899 绑定不生效 → 用 `node server.js 8900` 显式换端口
const PORT_BASE = parseInt(process.argv[2], 10) || 8899;
const ROOT = __dirname;
const PUBLIC_DIR = path.join(ROOT, 'public');
const CONFIG_FILE = path.join(ROOT, 'config.json');
@@ -361,19 +363,35 @@ const server = http.createServer((req, res) => {
try {
const { prompt, name } = JSON.parse(body || '{}');
if (!prompt || typeof prompt !== 'string' || !prompt.trim()) return sendErr(400, 'prompt 不能为空');
// 09-01 并发方案A:浏览器类任务(账号信息/视频列表/采集/导入)自动注入浏览器锁约束——
// 多个 AI 会话任务并行共享同一 9223 Chrome 实例,必须互斥使用,否则标签页互相导航抢占
const BROWSER_HINT = /账号信息|视频列表|保存并分析|采集|导入账号|网页采集|浏览器/;
const BROWSER_LOCK = 'D:\\\\AgentSkill\\\\mcn-workshop\\\\.browser-lock';
let finalPrompt = prompt.trim();
if (BROWSER_HINT.test(finalPrompt)) {
finalPrompt += `
【浏览器锁约束(必须遵守)】本任务需要操作浏览器(browser-harness / 9223 Chrome)。多个 AI 会话任务可能并行,浏览器是共享单实例,必须互斥使用:
1. 执行任何浏览器操作前,先检查锁文件:${BROWSER_LOCK} 是否存在(bash: ls)
2. 锁存在 → 等待 10 秒后重试,最多重试 18 次(约 3 分钟);若锁文件修改时间已超过 10 分钟视为死锁,可删除后抢占
3. 拿到锁(bash: echo <任务名+时间戳> > ${BROWSER_LOCK})→ 才可操作浏览器
4. 浏览器操作全部完成后(无论成功失败)必须删除锁文件(bash: rm -f ${BROWSER_LOCK})
5. 若确认本任务实际不需要浏览器(如数据已齐),忽略本条约束,直接跳过`;
}
const { DatabaseSync } = require('node:sqlite');
const db = new DatabaseSync(process.env.WORKBUDDY_DB || path.join(os.homedir(), '.workbuddy', 'workbuddy.db'));
const now = Date.now();
const id = 'automation-' + now;
const cwd = 'D:\\AgentSkill\\mcn-workshop'; // 工作台触发的会话归入 mcn-workshop 空间分组
const d = new Date();
const d = new Date(Date.now() + 5 * 1000); // 未来 5 秒(08-31 根因:客户端只对未来 scheduledAt 补算 next_run_at;写 now=过去时间→不补算→调度器扫不到→卡死)
const pad = (n) => String(n).padStart(2, '0');
const scheduledAt = `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(d.getHours())}:${pad(d.getMinutes())}`;
const scheduledAt = `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;
const nextRunAt = Date.now() + 5 * 1000; // 08-31 实测:客户端调度器按 next_run_at 扫描;缺此列=null=永不拾取(工作台任务卡死根因)
const uidRow = db.prepare("SELECT user_id FROM sessions WHERE user_id IS NOT NULL AND user_id <> '' ORDER BY created_at DESC LIMIT 1").get();
const ownerUserId = uidRow ? uidRow.user_id : '';
db.prepare(`INSERT INTO automations (id,name,prompt,status,schedule_type,scheduled_at,rrule,cwds,created_at,updated_at,skills_json,connector_ids_json,model_id,permission_mode,owner_user_id,owner_status)
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`)
.run(id, name || '工作台任务', prompt.trim(), 'ACTIVE', 'once', scheduledAt, '', JSON.stringify([cwd]), now, now, '[]', '[]', 'deepseek-v4-flash', 'fullAccess', ownerUserId, 'confirmed');
db.prepare(`INSERT INTO automations (id,name,prompt,status,schedule_type,scheduled_at,next_run_at,rrule,cwds,created_at,updated_at,skills_json,connector_ids_json,model_id,permission_mode,owner_user_id,owner_status)
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`)
.run(id, name || '工作台任务', finalPrompt, 'ACTIVE', 'once', scheduledAt, nextRunAt, '', JSON.stringify([cwd]), now, now, '[]', '[]', 'deepseek-v4-flash', 'fullAccess', ownerUserId, 'confirmed');
db.close();
log('已提交 AI 任务: ' + id + (name ? ' (' + name + ')' : ''));
return sendJSON(200, { ok: true, id, message: '任务已提交,请在左侧会话栏查看执行' });
@@ -0,0 +1,74 @@
# 自动化任务调度机制(09-01 定稿,实测验证)
> 本文档固化 08-31~09-01 多次调试理清的客户端自动化调度机制,是工作台 `/api/run` 链路唯一权威说明。
> 结论均来自本机实测(automations / automation_runs / sessions 三表 + 调度器实际行为),非推测。
## 一、完整链路
```
工作台按钮 → POST /api/run → 直写 ~/.workbuddy/workbuddy.db automations 表
→ 客户端调度器按 next_run_at 扫描(周期 ≈30s)
→ 命中 → automation_runs 写 QUEUED → 建会话(sessions 表, is_background_automation=1)
→ IN_PROGRESS(meta 含 conversationId/sessionId)→ 执行 → ACCEPTED(含 resultState/resultEvidence)
```
1 任务 = 1 会话,一一对应。
## 二、根因(必须牢记)
| 现象 | 根因 |
|---|---|
| 工作台任务全卡死、永不执行 | **调度器按 `next_run_at` 列扫描**。工作台直写 SQLite 时若缺/空该列 → 永不拾取(08-31 P2「去掉 next_run_at 用 scheduled_at」是错误判断,09-01 已纠正) |
| `scheduled_at` 写过去时间 → 卡死 | 客户端只对**未来** scheduledAt 自动补算 next_run_at;过去/太近时间 → 不补算 → 扫不到 |
| 误以为「调度器停摆」 | 调度器从未停摆(33022 秒级准点执行过);停摆假象 = next_run_at 没填 |
## 三、硬规则(实测阈值)
1. **scheduled_at 必须未来**,且留足余量:**+60s 稳、+17s 失败**(update 往返有几秒延迟,越近越险)
2. **next_run_at 必须显式写入**(工作台链路):`Date.now() + 5000`(+5s 即可,因为这是直写、无补算依赖)
3. **立即执行参数不存在**:argv.json(仅 IDE 渲染)、settings.json(仅插件/sandbox/claw)、无 workbuddy CLI,客户端无并发数/扫描周期配置项 → 无法通过参数控制
4. 实际开始时间 = 写库时刻 + 5s(next_run_at)+ 扫描周期(≤30s)≈ **5~35s**(工作台按钮链路已是最快路径)
## 四、并发与排队(09-01 实测)
- **客户端后台自动化并发上限 ≈ 3**:同秒触发 5 任务 → 3 个立即并行(各建会话)、2 个排队
- 排队标记:automation_runs.metadata_json 含 `queuedPosition`(1、2、…)
- 并行是任务层面天然支持的,无需任何配置;超出 3 个自动排队
## 五、automation_runs 状态机
```
QUEUED(排队, meta.queuedPosition)
→ IN_PROGRESS(建会话, meta.conversationId/sessionId)
→ ACCEPTED(完成, meta.resultState=delivered|side_effect_only|partial_delivered, resultEvidence=assistant_output|external_action|local_file_mutation|none)
```
另有 PENDING_REVIEW(待人工确认,工作台轮询时显示「待确认」)。
表结构:`thread_id / automation_id / status / read_at / thread_title / source_cwd / runs_json / result_success / metadata_json / created_at / updated_at`
## 六、排查命令(Windows / Git Bash)
```bash
cd "C:/Users/maidou/.workbuddy"
"D:/miniconda3/python.exe" -c "
import sqlite3
db = sqlite3.connect('workbuddy.db'); db.row_factory = sqlite3.Row
for r in db.execute(\"SELECT id,name,scheduled_at,next_run_at,last_run_at,status FROM automations WHERE deleted_at IS NULL ORDER BY created_at DESC LIMIT 10\"):
print(dict(r))
print('---runs---')
for r in db.execute(\"SELECT automation_id,status,metadata_json FROM automation_runs ORDER BY created_at DESC LIMIT 10\"):
print(dict(r))
"
```
判定要点:
- 任务有 `next_run_at` 且 < now → 应已被拾取(看 automation_runs)
- `last_run_at` 仍 None + runs 无记录 → next_run_at 没补算(scheduled_at 太近/过去)
- runs 有 QUEUED → 在排队(并发 >3);有 IN_PROGRESS → 正在跑(看 sessions working)
- 会话:`SELECT id,title,status,created_at FROM sessions WHERE is_background_automation=1`
## 七、服务维护
- 启动:`node server.js`(零依赖,端口 8899 自动避让)
- 改 server.js 后必须重启才生效(Windows:`taskkill /PID <pid> /F` 后重启)
- 后台运行:`node server.js > /tmp/mcn-workshop.log 2>&1 &`
@@ -122,14 +122,18 @@
> **关键定义**:本节「底色」一律指**整卡背景色**(深色渐变底或浅色渐变底)。卡片块、文字、标签、强调色等**内部元素不随账号风格变**,统一按所选色系的「配色规范」表执行:**深色系(深色长图风)**= 浅米卡片 + 深色文字 + 珊瑚红强调;**浅色系(浅色甜宠风)**= 白卡 + 粉边 + 深粉文字 + 粉强调。同一账号系列卡片必须固定同一色系,保证系列视觉语言一致。
### ① 判定账号风格(读设定「色彩体系」+ 赛道/类型)
以账号设定.md 的「视听风格/色彩体系」模块真实色值为第一依据(主色/强调色),赛道与账号类型辅助判定,归入下表风格。
### ① 判定账号风格(调性 + 色值 + 赛道,三层判定)
1. **第一依据 = 账号实际内容调性**(读设定 md 的「账号核心定位」情绪锚点 + 「情绪结构」五段 + 「视听风格」氛围):**决定底色走深色系还是浅色系**。情绪锚点含「明快/欢乐/爽文/解压/暖心/积极治愈/宠/甜」→ 浅色系;含「深沉/催泪/怀旧/忧郁/厚重/故事感/悲情」→ 深色系。
2. **第二依据 = 视听风格/色彩体系真实色值**(主色/强调色),作为具体底色取色的色相来源。
3. **第三依据 = 赛道/类型**,仅作初筛归入下表风格,**不作为色系终判**。
> ⚠️ **赛道标签有歧义时必须二次判定(反例:俊希)**:「温情/亲子/治愈」中的「治愈」是**双义**标签——深沉催泪型治愈走深色系,明快欢乐型治愈走浅色系。凡赛道含「治愈/亲子/温情」等暧昧词,**必须回读情绪锚点判定明快 vs 深沉**,禁止机械套下表默认色。俊希=「满级小孩哥给妈妈做饭」明快欢乐治愈爽文 → 浅色系(暖橙 `#F5D0A4→#DE9A5E`),非下表深焦糖深色。
### ② 风格 → 背景色映射(示例,可扩展)
| 账号风格(色彩体系/赛道特征) | 背景底色(深色渐变) |
|----------------------------|--------------------|
| 暖怀旧/旧时光(剧情·怀旧,如旧梦留声机) | 深棕红 `#2B0F0A→#1A0805` |
| 温情/亲子/治愈(亲子Vlog) | 深焦糖 `#2B1A10→#1A0F08` |
| 温情/亲子/治愈(亲子Vlog) | 调性分叉:**深沉催泪型 → 深焦糖 `#2B1A10→#1A0F08`**;**明快欢乐型(如俊希)→ 浅色系**(暖橙 `#F5D0A4→#DE9A5E`,提亮降饱和) |
| 科技/数码/冷淡(数码科技/商业) | 深灰蓝 `#0E1626→#080D16` |
| 清新/田园/三农(三农/户外) | 深墨绿 `#0F1F18→#08130E` |
| 潮流/都市/时尚(潮流风尚/颜值) | 深紫黑 `#17101F→#0C0810` |
@@ -141,6 +145,7 @@
**浅色系推导(明快/甜美/治愈调性)**:取账号色彩体系主色 → 提亮+降饱和至中浅明度(约 65-90% 亮度,如王微斯:主粉 → 玫瑰金 `#D6A3A9→#9A5563`)→ 得浅色系渐变底;正文文字用主色加深版(`#7B2D5E` 档)。**背景上直接书写的文字(模块标题/装饰线/注释/版权)随背景深浅提亮保可读**:背景越深文字越亮(如玫瑰金底上模块标题 `#FDE8EC`、装饰线/注释 `#EAC6CE`、斜体/版权 `#DDBCC4`)。
### ③ 强规则
- **调性优先于赛道标签**:色系二选(深/浅)以账号实际内容调性(情绪锚点)为最终判据,赛道标签只作初筛;赛道含「治愈/温情/亲子」等暧昧词时必须二次判定,禁止机械套默认色
- **禁止**默认沿用模板深棕红底;同一账号每次生成的卡背景色保持一致(系列一致性 = 同账号一致,非跨账号一致)
- **底色决定色系**:选深色系则内部元素按「配色规范·深色系」执行,选浅色系则按「配色规范·浅色系」执行;同一色系内部元素色一律固定,不随账号再改
- 模块「色彩体系」色块:必须用设定文件中账号的真实色值(模板 5 色块仅示例)
@@ -256,6 +256,38 @@ PY
4. **用完不关闭**:任务完成后保留标签页(留给后续任务复用),下次任务直接导航到目标地址即可
5. **多任务串行**:多个刷新/导入任务共用同一 9223 Chrome 实例,前一个任务的抖音标签页直接导航复用,无需重新打开
### 5.6 并发互斥(浏览器锁,09-01 新增,多 AI 会话并行时强制)
**背景**:工作台多个 AI 会话任务可并行(客户端并发上限≈3),但浏览器是**共享单实例**(9223 Chrome)。两个任务同时操作会互相导航标签页、丢失对方数据,因此**浏览器操作必须互斥(一次只有一个任务在用浏览器)**。非浏览器操作(解析/提炼/复盘/写脚本,走 MCP/文件)不受影响,可全并行。
**锁规则(每个需要浏览器的任务必须遵守)**:
1. **锁文件**:`D:\AgentSkill\mcn-workshop\.browser-lock`(工作台 `/api/run` 对浏览器类任务已自动注入本约束到 prompt,AI 会话执行时遵守即可)
2. **操作前**:检查锁文件是否存在(`ls`)→ 存在则等 10 秒重试(最多 18 次 ≈ 3 分钟)
3. **死锁保护**:锁文件修改时间超过 10 分钟 → 视为死锁,可删除后抢占
4. **拿锁**:`echo "<任务名> <时间戳>" > D:\AgentSkill\mcn-workshop\.browser-lock` → 才操作浏览器
5. **释放**:浏览器操作全部完成后(无论成败)`rm -f D:\AgentSkill\mcn-workshop\.browser-lock`
6. **串行协调**:多个任务抢锁 = 先到先用;拿到锁的任务完成后释放,下一个任务继续;标签页复用规则(5.5)仅在自己持有锁期间适用
```bash
# 拿锁(互斥,带重试)
for i in $(seq 1 18); do
if [ ! -f "D:/AgentSkill/mcn-workshop/.browser-lock" ]; then
echo "$(date '+%H:%M:%S') ${任务名}" > "D:/AgentSkill/mcn-workshop/.browser-lock"
break
fi
# 死锁保护:锁超过 10 分钟强制抢占
if [ -f "D:/AgentSkill/mcn-workshop/.browser-lock" ] && [ $(($(date +%s) - $(stat -c %Y "D:/AgentSkill/mcn-workshop/.browser-lock" 2>/dev/null || echo 0))) -gt 600 ]; then
rm -f "D:/AgentSkill/mcn-workshop/.browser-lock"
continue
fi
sleep 10
done
# ... 浏览器操作 ...
# 释放锁(无论成败)
rm -f "D:/AgentSkill/mcn-workshop/.browser-lock"
```
```bash
# 检查已打开标签页
"$BH" <<'PY'
@@ -24,6 +24,7 @@
|---|---------|------|---------|---------|
| 6 | 本地接口(`/mcn/api/...`)调用规范未沉淀,每次现查 | 无统一接口调用规范文件 | 新建 `references/接口调用/本地接口调用规范.md`,记录接口基地址判定(`$env:DSH_WEB_URL` → 3080/3081 兜底)、接口清单、请求构造方式(Python 直连优先) | 已沉淀为本规则 |
| 7 | 生成人设卡前未先判定账号类型就套模板 | 账号类型判定是模板选择前置 | 严格执行 5.0 判定:从筛选出的 TOP 视频 analysis「人设」字段提取主角名称 → 全部不同=群像型 / 同一主角=固定主角+轮换搭档 / 全固定=单一达人型 | 已沉淀为人设卡生成方法 5.0 |
| 8 | 生成设定卡时机械套赛道标签配色,把「明快欢乐型亲子(俊希)」误配成「深焦糖深色系」 | 「温情/亲子/治愈」赛道标签**双义**(深沉催泪型 vs 明快欢乐型),未做调性二次判定就套下表默认深色 | 色系二选以账号实际内容调性(情绪锚点:明快/欢乐/爽文/暖心 → 浅色系;深沉/催泪/怀旧/悲情 → 深色系)为最终判据,赛道标签只作初筛;赛道含「治愈/亲子/温情」等暧昧词时**必须回读情绪锚点判定明快 vs 深沉** | 已沉淀为 06_生成账号设定卡片.md「调性优先于赛道标签」规则 |
---