Files
mcn-short-video/.workbuddy/memory/2026-09-01.md
T
maogeigei a519948e6b 修复视频列表表头假记录+时长显示:export_video_map 过滤非数字 aweme_id;fmtDuration 兼容 mm:ss 文本
- 根因1:export_video_map.py 未过滤表头行(aweme_id='视频ID' 非空被当数据导入)
- 根因2:fmtDuration 只认秒数,Number('01:31')=NaN→全部显示 '-';库存/接口为 mm:ss 文本
- 修复:aweme_id 纯数字校验过滤表头;fmtDuration 双兼容(数字秒+mm:ss/hh:mm:ss);清理库内表头假记录
- 验证:导出 136 条无异常,库 total=136/表头0/无时长0,接口 duration 正常显示
2026-09-01 10:20:44 +08:00

53 lines
9.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 2026-09-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 方式启动长驻服务,普通 `&` + 重定向会在命令返回后被清理
## 09-01 分析产物入库闭环:工作台入库接口 + 选题读视频解析(根因→修复→验证)
- **根因链(用户连续追问查实)**:①账号分析技能产出只落盘文件(视频分析/),流程无入库步骤;②入库机制只在 dsh 插件(扫描「视频对标」目录+解析任务导入),技能与插件两套流程从未接通;③开发机无 dsh 接口 3080/3081;④库中俊希 persona/account_analysis/video_analysis/video_source 全 0 → 选题接口 /api/ai/topics 唯一真实输入=hot_accounts.content(账号定位文本 1517 字),「基于视频」是假象
- **方案(用户批准+方向纠正:入库必须实现在工作台,dsh 插件仅参考,直写工作台库副本)**:server.js 新增 `POST /api/import/account`(扫描账号产出目录直写 mcn-plugin.db:视频分析/*/analysis.json→account_video_analysis、content.json→account_video_source、账号设定.md→account_persona、账号数据分析.md→account_analysis、短视频表格.xlsx→account_videos upsert 补列表)+ 新增 scripts/export_video_map.py(python 读 xlsx 13列出 JSON 权威映射);/api/ai/topics 增加读最新 3 条视频解析 JOIN account_videos 拼入 prompt【该账号最近视频解析】
- **aweme_id 匹配 bug 两轮**:①首版包含匹配太宽松→多条互配覆盖(同 aweme_id 5删1);②精确/包含仍 4/6 失败——**根因=xlsx 标题带全角标点「!」「”」(过生日vlog!/“爸王餐”vlog!)而文件夹名无标点,normTitle split('#') 后双向 includes 失败**。修复:normTitle 删全角半角标点+下划线转空格+空格归一+trim;入库前清 `aweme_id IS NULL AND video_id IS NULL` 脏数据。修复后 6/6 命中(含 7649305562131270921 等)
- **验证闭环**:入库返回 xlsx_rows=137/video_analysis=6/video_source=6/videos=137/persona=1(去重);JOIN 俊希 analysis 6 条+source 6 条、null 脏数据 0;选题接口 query 已含 3 条真实视频解析(过生日 33916 字等),端到端 Dify 返回 3 选题全部基于解析内容基因(嘴甜夸赞/播音腔/家庭结构符号)
- **技能文档同步**:mcn-dou-analysis SKILL.md 功能五「可选写库」补充工作台入库方式 + 注意事项第 6 条记录标题匹配红线(全角标点坑)
- 服务 PID 27548→KKQ7LW(8900,修复后重启);git 待提交
## 09-01 10:16 视频列表表头记录 + 时长显示修复(用户发现:视频ID记录/无时长)
- **问题**:俊希视频列表出现「视频ID」假记录(aweme_id=视频ID/视频标题/视频时长);部分视频显示无时长
- **根因 1(表头假记录)**:export_video_map.py 未过滤表头行——aweme_id='视频ID' 非空且 title 有值,被当数据行输出入库(id 652);xlsx 137 行=表头1+数据136
- **根因 2(无时长)**:**数据其实全有时长**(库 136 条全有值、xlsx 无空无零),是前端 fmtDuration 把 duration 当秒数 `Number('01:31')`=NaN→显示 '-',而库存/接口返回的是 mm:ss 文本(13:48 等)
- **修复(治本)**:①export_video_map.py 增加 aweme_id 纯数字校验(`str(aweme_id).isdigit()`)过滤表头/非数据行;②data-pages.js fmtDuration 重写:兼容纯数字秒(648→10分48秒)与 mm:ss/hh:mm:ss 文本(01:31→1分31秒、13:48→13分48秒);③清理库内表头假记录(DELETE aweme_id='视频ID'/空/null,1条)
- **验证**:导出 136 条无非数字;重跑入库 xlsx_rows=136(表头不再计入)、videos_upserted=0;库 total=136/表头0/无时长0;/api/dsh/account-videos 返回 total=136、duration='13:48' 等 mm:ss → fmtDuration 正确显示
- 待提交 git;页面待重开验证