Files
mcn-short-video/.workbuddy/memory/2026-09-10.md
T
maogeigei d07049ecf1 chore(repo): 归集 09-14~09-29 工作产出(技能/知识库/工作台/报告)并收敛临时产物
- skill: 素材库分块定义(00~11)、05_极致事件知识库 4 篇、08_对话风格总纲、mcn-video-prompt 提示词质量门禁与外部语料检索流程

- workbench: mcn-work-shop 新增 cli-backend.js(本地 CLI 接入)、工作台视觉交互规范;移除旧 UI 规范

- docs: 根目录极致事件/素材卡/审计方案报告与热门短视频清单入库

- memory: 补 09-14~09-29 日志与自动化任务记忆

- chore: .gitignore 排除 tools/、.tmp-chrome-*/、_k_test.cjs
2026-09-29 18:56:24 +08:00

156 lines
26 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-10
## 打开工作台 + 仓库路径迁移发现
- 启动 MCN工作台:`D:\AI技能\mcn-short-video\project\短视频脚本创作\V1.0\mcn-work-shop\server.js 8900` → http://127.0.0.1:8900 返回 200,正常。
- **★仓库本地路径已变更**:`D:\AgentSkill\mcn-video-script` → `D:\AI技能\mcn-short-video`(`D:\AgentSkill` 已不存在)。
- **技能软链失效并已修复**:`C:\Users\maidou\.workbuddy\skills\短视频工作台` 原 junction → 失效旧路径 `D:\AgentSkill\mcn-video-script\project\短视频脚本创作\V1.0`(文件系统残留、目标不存在)。
- 修法:node `fs.unlinkSync` 删旧链 → PowerShell `New-Item -ItemType Junction -Path <link> -Target "D:\AI技能\mcn-short-video\project\短视频脚本创作\V1.0"`。
- 验证:isSymbolicLink=true、children=7、SKILL.md 存在。
- **待办(未执行,等用户确认)**:仓库内 30+ 文件仍写死 `D:\AgentSkill\...` 旧路径(含 V1.0/SKILL.md、references-add/路径配置.md、V1.0/references/规则/路径引用规范.md、Lite1.0、各 subskills、mcn-work-shop/server.js、browser-harness venv 配置等),需做全量路径迁移(注意豁免三类:禁止性规则示例行、变更记录历史行、references-add/路径配置.md)。
## 路径治本:环境判定锚点重构为「仓库特征判定」+ 全树写死路径清理
- **先分类再动手**:全树扫描命中 77 处 `AgentSkill`,分三类——A 环境判定锚点 37 处(规范明确豁免)、B 真实读写路径 8 处(真违规)、C 历史/审计文本 8 处(豁免)。用户确认方案后执行。
- **新判据(v2 · 两步)**:① 技能路径含 `.dsh` 路径段 → dsh 部署环境;② 不含 `.dsh` → `git -C {技能目录} rev-parse --show-toplevel` 返回仓库根 = 开发机,失败 = 用户环境(无 git 兜底向上找 `.git`)。**必须 `.dsh` 先判**(`~/.dsh` 自身是 git 仓库)。产出根目录三环境结果不变。
- **实测验证**:从软链 `C:\Users\maidou\.workbuddy\skills\短视频工作台` 执行 `git rev-parse --show-toplevel` → `D:/AI技能/mcn-short-video`,正确识别开发机。
- **改动 21 文件**:规范层(`references/规则/路径引用规范.md` + 4 份 subskills 副本 + 4 份 `路径配置.md` + README);判定节(dou-analysis / mcn-video-prompt 的 SKILL.md 与 references(-add));MCP 规范 2 份;Lite1.0(SKILL.md + 路径配置 + README)。
- **B 类修复**:`server.js` 新增 `BROWSER_LOCK_FILE = path.join(ROOT,'.browser-lock')` / `SESSION_CWD = ROOT`;`SESSION_CWD_PATTERN` 由 `'%mcn-workshop%'` 放宽为 `'%mcn-work%'`(兼容历史+新建会话);2 个 `.cjs` prompt 内 DB 路径改用既有 `DB` 常量;`V1.0/SKILL.md` 运行时 `cwds` 改 `<工作台目录>`。
- **★Lite1.0 结构事实**:`Lite1.0/` 下**无 `subskills/`**(实测),未内置 mcn-dou-analysis。原 SKILL.md 依赖段落既写死 `D:\AgentSkill\mcn-dou-analysis` 又未同步 09-02 结构变更 → 改为「未内置 + 需用请改用 V1.0,或先同步进 subskills 后按相对路径调用」。
- **BROWSER_LOCK 契约同步**:dou-analysis `references/浏览器搜索抖音账号操作规范.md` 5.6 节 8 处盘符硬编码 → 相对 `.browser-lock`(会话 cwd 即工作台目录)。
- **残留核对**:`AgentSkill` 仅剩 13 处,全为豁免三类;`mcn-video-script` 1 处、`MCNVideo AI` 3 处均属历史文本。当前规则行零残留。
- **验证**:3 个 JS `--check` 通过;工作台重启后 8900 单实例监听、HTTP 200。
- **沉淀**:V1.0 SKILL.md frontmatter(updated_at 09-10 + last_change)、`references-add/变更日志.md`、`失误与规避记录.md #017`。
- **★B 类违规的实锤后果(取证)**:`D:\AI技能\mcn-workshop\` 下发现 3 个 **0 字节**垃圾文件,文件名是**被剥掉反斜杠的完整路径**:
- `AgentSkillmcn-video-scriptproject短视频脚本创作V1.0mcn-work-shopmcn-plugin.db`(09-01 16:24)← 对应 `build-create-prompts.cjs` / `submit-review-tasks.cjs` prompt 里写死的 DB 绝对路径
- `AgentSkillmcn-workshopmcn-plugin.db`(09-01 18:31)← 对应旧 `cwd` + `mcn-plugin.db`
- `mcn-plugin.db`(09-01 12:26)
真实 DB 为 `mcn-work-shop/mcn-plugin.db`(4.2 MB,09-07 16:29)。→ 证明写死路径曾导致 AI 会话**落库写偏**(0 字节文件),与失误记录 #015「0 字节误建文件」同类。**未删除,待用户确认**。
- **未处理/待确认**:① `D:\AI技能\mcn-workshop\` 3 个 0 字节垃圾文件是否清理(该目录还有 `outputs/` 09-01~09-04 产物,勿整体删);② `D:\AgentSkill` 整目录已不存在,用户级 MEMORY.md 里 `ThirdPartySkills` / `AgentPlatform` 两个仓库的本地路径也一并失效(maxdepth 3 未搜到迁移后位置)。
## dsh 部署环境废弃:三环境 → 两环境(判定简化为一步)
- **触发**:用户纠正「第一步 技能路径含 .dsh 路径段 ② dsh 部署环境 —— 没有这个环境了」。实测:`~/.dsh/skills/` 不存在、`~/.dsh/mcn-plugin.db` 不存在、`~/.dsh` 仅剩 profiles/、`D:\dshworkspace` 整个目录不存在。
- **判据 v3(一步)**:删 `.dsh` 路径段判定步骤,仅保留 `git -C {技能目录} rev-parse --show-toplevel` = 仓库根=开发机 / 失败=用户环境(无 git 兜底向上找 .git)。三环境 → 两环境。产出结果不变(两环境本就同构桌面 MCNSkill项目/)。
- **改动范围(20+ 文件,续 v2)**:
- 判定层:4 份 路径配置.md(V1.0/Lite1.0 + dou-analysis + video-prompt)
- SKILL 层:V1.0/Lite1.0/dou-analysis/video-prompt/data-insight 的 SKILL.md
- 标准库:5 份 路径引用规范.md(三种机器→两种机器)+ 创作流程规范 + 11_脚本检查和诊断 + 4_账号设定解析和确认 + MCP_工具调用规范 + 自动化任务清理规范
- 数据源层:fetch_week_ranks.py(删 .dsh 分支代码)、dsh-data.js(删 isDshDeploy 分支)、data-pages.js、douyin-{rise-ranking,weekly-surge,content-surge,daily-hot}/SKILL.md、抖音数据规则.md
- 账号分析层:账号数据分析方法 + feature/01,03,04,06 + 铁律避坑规则/账号信息获取执行避坑 + 浏览器搜索抖音账号操作规范(159/175)
- README:references-add/README + dou-analysis/video-prompt 的 references(-add)/README
- **清理「dsh 原库」过时描述**:dou-analysis SKILL.md 52 行 + 铁律避坑 32/34 行 + feature/01 16 行 + dsh-data.js 13 行注释(dsh 原库已下线,工作台 DB 唯一读写副本)。
- **残留核对**:全树扫描 .dsh/dshworkspace/dsh 部署/dsh 环境/dsh_MCNProject/②dsh/③用户环境 —— 当前有效规则零残留,剩余全为豁免(变更记录历史行 +「09-10 起 dsh 环境已废弃」说明 + 路径引用规范用户级路径示例 {主目录}/.dsh/...)。
- **验证**:dsh-data.js `--check` OK;fetch_week_ranks.py `py_compile` OK;工作台重启 HTTP 200。
- **沉淀**:变更日志新增 09-10 dsh 废弃条目;V1.0 SKILL.md frontmatter last_change 更新。
- **踩坑**:并行 Edit 同一文件(浏览器搜索抖音账号操作规范.md 159/175 行)发生写竞态,175 行修改丢失 → 串行补做。教训同 #016「同文件多处修改必须串行」。
## 工作台配置收敛:端口/DB/目录单源化(config.json + load-config.js)
- **触发**:用户问「这些设定能否用配置,所有文件和脚本都引用,避免有调整时到处修改」。确认:只收敛代码层 + config.json 放 mcn-work-shop 内。
- **新增**:`mcn-work-shop/config.json`(port/dbName/outputRoot/businessDataDir/extraRoots)+ `mcn-work-shop/load-config.js`(读取唯一入口 + 默认值唯一来源)。
- **改动**:
- `server.js`:`CFG = loadConfig()`;`PORT_BASE = argv[2] || CFG.port`(argv 仍优先);`DEFAULT_ROOT` 用 `CFG.outputRoot`;DB 用 `CFG.dbName`;`saveConfig` 合并写盘保留其它字段;错误提示 dbName 动态化。
- `dsh-data.js`:删本地 loadCfg,`DSH_DB` / 榜单目录改 CFG。
- 4 个辅助 .cjs(build-create-prompts / submit-review-tasks / poll-create-tasks / poll-review-tasks):DB / API 端口 / prompt 内 dbName 字面量 → CFG 动态。
- `public/data-pages.js`:新增 `const BASE = location.origin`,SKILL_HINT_VIDEO_PARSE / SKILL_HINT_ANALYZE / saveHintOf 里 3 处 `http://localhost:8900` 改 BASE(前端读不到 server 端 config.json,用 location.origin 让回调端口自动跟随当前访问地址)。
- `start.bat`:端口用 `for /f` + load-config 读 config.json,不再写死 8900。
- **★踩坑(重要)**:`load-config.cjs` 用 `.cjs` 扩展名时 `require('./load-config')` 无扩展名解析 MODULE_NOT_FOUND(Node 不把 .cjs 当无扩展 require 目标)→ 改名 `load-config.js`(无 package.json,默认 CommonJS)即自动生效。**node --check 只查语法不执行 require,此坑运行时才暴露**。
- **验证**:8 文件 `--check` 全通过;`loadConfig()` 正确读回全字段;工作台重启 HTTP 200(端口/产出根均从 config 读)。
- **沉淀**:变更日志新增配置收敛条目;V1.0 SKILL.md frontmatter last_change 更新。
## 配置收敛后功能验证 + start.bat 修复
- **实测功能正常**:重启后逐个探测依赖 config 的接口——`/api/roots` 返回 `defaultRoot=C:\Users\maidou\Desktop\MCNSkill项目`(CFG.outputRoot 生效)、`/api/dsh/stats`(accounts 7 / analyses 12 / rewrites 27 / reviews 11,CFG.dbName 生效)、`/api/dsh/accounts`、`/api/dsh/rewrites`、`/api/dsh/ranking`(250 条榜单,CFG.businessDataDir 生效)全部 200 且数据正确。前端 index.html 引用 5 个静态资源(echarts/app.js/help-guide.js/data-pages.js/style.css)**5/5 可用**;`/data-pages.js` 200、含 `const BASE = location.origin`、无 `localhost:8900` 残留。**★静态资源是根映射 `/data-pages.js`,不是 `/public/data-pages.js`(后者 404,曾误判为故障)**。
- **★start.bat 既有 bug(非本次引入,顺手修复)**:写死的 managed node 路径 `...\versions\22.22.2\node.exe` **已不存在**(实际 `22.22.2-3`)→ 原逻辑静默回退系统 node。改为 `for /d` 遍历 `%USERPROFILE%\.workbuddy\binaries\node\versions\*` 自动探测,版本升级免改脚本。
- **★bat 内嵌 JS 的坑**:`for /f ... in (`node -e "console.log(require('./load-config')...)"`)` 被 cmd 解析截断报错(引号/括号/单引号嵌套)→ 端口读到的是**兜底值而非真实值**(表面 8900 看着对,实则没读 config)。改为独立脚本 `get-port.js`(`console.log(require('./load-config').loadConfig().port)`),bat 只执行简单命令 `"%NODE_EXE%" get-port.js`。
- **实证方法**:临时把 config.json port 改 8905 → start.bat 输出 `PORT=8905`(证明真读 config,非兜底)→ 改回 8900。区分技巧:测试脚本里把兜底值写成 `FALLBACK8900`,输出 8900 才说明是真读。
- **踩坑(工具层)**:用 node `-e` 生成 .bat 时,路径里的 `\n`(如 `\binaries\node`)**被 JS 当换行转义**,生成坏 bat 报「命令语法不正确」。生成 bat 要用 Write 工具写后,再用 node 把 LF 统一转 CRLF(`t.replace(/\r?\n/g,'\r\n')`)——cmd 对 LF 换行解析异常。
## 工作台 UI 规范文档梳理
- **产出**:`mcn-work-shop/docs/工作台UI规范.md`(新建)。全部从 style.css(824 行)/app.js/data-pages.js/index.html **提取现状基线**,非凭空制定。
- **结构**:技术基线 → 设计语言 → 设计 token → 布局框架 → 页面路由(8 个) → 组件规范(12 类) → 关键交互约定 → 已知坑(9 条) → 迭代流程 → 文件索引。
- **★关键事实(后续 UI 迭代直接查文档,此处留索引)**:
- 色彩:10 个 `:root` 变量(bg/panel/border/text/dim/primary/primary-soft/accent/danger/shadow)+ 扩展色(表头 #f6f8fa、链接 #4a90e2、主色 hover #2a5fd0、文件类型色 md紫/json红/xlsx绿/txt灰)
- 圆角阶梯 6/8/10/12/14px;z-index:顶栏 10 / 弹窗遮罩 100 / Toast 200(表头 sticky 为 1)
- **滚动铁律**:`html,body{overflow:hidden}` + `main#view{height:calc(100vh - 55px)}`——**55px 是实测值**(padding20+行高34+边框1),写 54px 底部溢出 1px 触发第二层滚动条
- **榜单表格必须 `table-layout:fixed`**:auto 布局下 100% 表格富余空间按比例摊薄,**min-width 压不住**
- **榜单三 tab 行高必须统一**:表格 td 固定 42px(功能列 btn-sm 撑高,其他 tab 本仅 34.7px)、首页预览行 min-height 40px,否则切换整表跳动
- **两套同名 `.tabs/.tab` 并存**:顶栏胶囊式(L38-45,active 蓝底白字)vs 数据页下划线式(L520-523,active 蓝字+蓝下划线,**后者覆盖前者**)→ 新增页须确认拿到哪套
- `.modal-mask[hidden]` 必须显式 `display:none`(`.modal-mask` 是 flex,会覆盖 HTML hidden 属性→弹窗关不掉)
- 数值列:右对齐 + `font-variant-numeric: tabular-nums`(不加会导致翻页时数字左右跳)
- 图标:`.ic{vertical-align:-0.18em}`(去掉会与文字基线错开);`svgIcon()` Lucide 24×24 stroke2 + `ICON_COLORS` 功能色映射
- 字段对齐用 **grid 列轨道共享**(R44/R45:每行独立 flex 会被内容长短顶偏;超宽字段如「账号定位」要移出共享网格,否则把轨道撑成等宽 232.5px 大片留白)
- 静态资源**根映射** `/data-pages.js`(`/public/xxx` 一律 404,曾误判为故障)
## 榜单更新「周不全」问题诊断(未修复,待用户确认)
- **用户现象**:点「更新榜单」后,周榜数据期不全(相关周缺)。
- **★真相:本次更新本身是成功的**——会话 `624d7a3e`(标题「更新榜单数据」,cwd=mcn-work-shop)实际执行 8 次 API、落盘 8 个 JSON:视频热榜/点赞榜各 08-31(2 次,`fetch_week_ranks.py --board both`)、账号日榜 09-08(1 次,`fetch_rank.py --period day`)、账号周榜 5 赛道各 08-31(5 次)。无缓存跳过、无失败。
- **根因(设计缺口,非执行失败)**:`SKILL_HINT_RANKING` 的语义是**只抓「最新一期」+ 幂等跳过已存在**,**没有任何回溯补齐缺失期次的逻辑** → 历史缺口永远补不上。
- **实测期次现状(`/api/dsh/ranking` 返回的 dates)**:
| board | 日期列表 | 说明 |
|---|---|---|
| week 账号周榜 | 08-31/08-24/08-17/08-10 | 4 周完整(历史累积) |
| hot 视频热榜 | 08-31/08-24 | **缺 08-10、08-17**(09-03 才上线该榜) |
| likes 点赞榜 | 08-31/08-24 | **缺 08-10、08-17** |
| day 账号日榜 | 09-08/09-02 | **缺 09-03~09-07 共 5 天**(期间没点更新) |
→ 用户切 tab 时看到 week 有 4 周而 hot/likes 只有 2 周,即"没有所有相关周"。
- **脚本能力是够的(没用上)**:`fetch_week_ranks.py` 有 `--date`(周标号周一)与 `--force`;`fetch_rank.py` 有 `--date`(目标日期)。完全可指定历史期次补齐,但 prompt 里没要求。
- **补齐成本估算**:hot 2 周 + likes 2 周 + day 5 天 = **9 次红狐 API**(按次计费,需用户确认)。
- **附带发现(非 bug,设计如此,易被误认为数据少)**:`dsh-data.js` 的 `RANK_KEEP=[生活记录,生活vlog,小剧场,亲子,美食,旅行]`,`board!=='week'`(即 day/hot/likes)在**条目层**做白名单过滤→文件 50 条被筛成:hot 28、likes 24、**day 仅 10**。日榜只剩 10 条最反直觉。修改口径需动 `dsh-data.js:490-495`。
- **★★最终结论(红狐官方规则,账号周榜无问题)**:用户追问「为什么没有 9 月 7 号周榜」。实测 `fetch_rank.py --period week --date 2026-09-07` → **API 报错 code=3203**,红狐返回原文:
> 查询结果为空…常见原因:①日期未到更新时间——**日榜每日 20:00 后可查昨日、周榜每周一 20:00 后可查上周**、月榜每月 1 号后可查上月;②周榜应传该周周一…
→ **账号周榜(week)最新可用期就是上一周**,09-07 周要等 **09-14(下周一)20:00** 后才出榜。所以 09-10 时最新一期为 08-31 是**正确的**,此前会话「本周未走完」的解释**结论正确**(措辞可更精确为"红狐周榜周一 20:00 后才出上周完整榜")。
- **热榜/点赞榜是另一套 API,口径不同(可滚动)**:`fetch_week_ranks.py --date 2026-09-07` 实测**能返回完整 50 条**(dateStart=09-07/dateEnd=09-13,首条发布 09-07 22:59)。因其为作品榜滚动聚合,未结束的周也有数据;但这是**本周至今的滚动值**,明天再取会变。
- **默认统一取上一周是刻意对齐(非 bug)**:四个榜若 hot/likes 取本周、week 取上周,会出现**同期不同期号**(热榜 09-07 / 账号榜 08-31)造成困惑。故 `last_full_week()` 与 `_get_smart_offset()=1` 统一回退一期,是与账号榜(受 API 硬限制)对齐的结果。
- **结论:功能本身没问题**,是红狐数据规则所致。若用户坚持要热榜"本周滚动值",需接受与账号榜不同期,可单独加(用 `--date <本周一>`)。
- 用 `fetch_week_ranks.py --board hot --date 2026-09-07`(输出到临时目录 `D:/tmp/ranktest-0907`)→ **成功返回完整 50 条**(72.3KB,dateStart=2026-09-07 / dateEnd=2026-09-13,首条发布时间 2026-09-07 22:59:51)。
- 即**红狐 API 对「进行中的本周」照样返回完整 50 条**,不是"没出榜"。
- 真正原因:**脚本默认策略主动回退一期**——`fetch_week_ranks.py` 的 `last_full_week()`(本周一 −7 天)与 `fetch_rank.py` 的 `_get_date_range(offset=1)`(注释明写"默认 1(上一期)")。两者都支持抓本周:`fetch_week_ranks.py --date <本周一>`;`fetch_rank.py` 关键词映射里 `("本周", 0, ...)` 即 offset=0,或 `--date 2026-09-07`。
- **待用户决策**:是否把默认口径从「上一完整周」改为「本周」。注意本周数据是**滚动的**(每天都在变,今天抓的 09-07 周榜明天会更新),原设计选上一完整周可能是为归档稳定性。可选:①本周优先(新,滚动)②保留上周为归档 + 额外抓本周标「进行中」③保持现状由用户手动 `--date` 补。
- **赛道筛选正常**(用户已确认不是问题):`RANK_KEEP` 白名单过滤符合设计,勿动。
## 榜单期号显示改为区间(已实施)
- **诉求**:用户理解 08-31 已是最新周后,要求**改展示方式**——期号 `2026-08-31` 易被误读成"仅 8/31 单日",实际覆盖 08-31~09-06。
- **改动**:
- `dsh-data.js`:新增 `collectRanges(board, files)`(读落盘文件的 `dateStart/dateEnd`,按 date 去重取首个文件)→ `rankingMeta` 与 `getRanking` 均返回 `ranges: {date:{start,end}}`(empty 也补 `ranges:{}`)。**不前端推算周日**,用文件真实区间更准(日榜 start=end)。
- `app.js`:新增全局 `fmtRankPeriod(date, ranges)`(定义在 `fmtSize` 后,data-pages.js 可直接用——同全局脚本作用域);`_rankPreview` 加 `ranges`,首页预览日期标签改用它。
- `data-pages.js`:`mkState` 加 `ranges`、`loadMeta` 存 `s.ranges`、榜单页 toolbar 日期改 `fmtRankPeriod` 并加 `rank-period` 类。
- `style.css`:`.rank-date-label` min-width 62→**104px**(容纳"08-31 ~ 09-06",防切期抖动);新增 `.rank-period{min-width:104px;text-align:center;display:inline-block;white-space:nowrap}`。
- **显示结果**:周榜「08-31 ~ 09-06」、日榜「09-08」(单日不显区间)、缺 ranges 时兜底原期号。
- **格式微调(同日)**:用户偏好斜杠 → `mm` 增加 `.replace(/-/g,'/')`,最终显示**「08/31 ~ 09/06」/ 日榜「09/08」**。app.js、style.css 版本号 → `20260910b`。
## 复盘诊断页两个问题定位(未修,待确认)
- **问题①:叙事逻辑 60 分标黄,但问题清单全绿**(真 bug,且连带一个)。
- **根因=落库字段契约不匹配**:`submit-review-tasks.cjs` 的 prompt 只写 `issues_json=问题清单 JSON`,**未规定 schema** → 模型自由发挥。
- 实测 `script_review.id=13`(total=60,用户所看)原始 issue:
`{"sev":"high","dim":"叙事逻辑","loc":"场8…","issue":"时间线矛盾…","fix":"改成…","step":"S7…"}`
- 前端 `data-pages.js:2046/2108/2201` 读的是 `{severity:'高'/'中', issue, suggestion}`:
- `sev` vs `severity` → 读不到 → **兜底绿色**(故全绿)
- `"high"` vs `'高'` → 取值语言也不同
- `fix` vs `suggestion` → **修改建议同样读不到、没显示**(连带 bug,用户尚未提及)
- 数据佐证:6 条记录里 id=13/11/9/8 的 severity 全空,仅 id=12("低")、id=10("中"2/"低"6) 有中文值 → **模型输出不稳定**,schema 必须固化。
- 评分条颜色是另一套:`diagScoreColor = v>=75?'#3a9e6d':v>=60?'#d99a2b':'#d9534f'`(60→黄),与 severity 无关,故出现"60分黄+问题全绿"的矛盾观感。
- **问题②:分镜提示词没有生成按钮**(非 bug,设计限制)。
- 该脚本 `rewrite_log.id=38` 的 **video_id=null(原创选题)**。
- `data-pages.js:2290-2295`:`vid>0` 才渲染「生成分镜」按钮;否则显示"该脚本为原创选题(无关联视频),暂不支持分镜提示词"。
- 后端 `dsh-data.js:302` 查询 `storyboard_log WHERE video_id=?` —— **只按 video_id**,原创选题查不到。
- 若要支持:`storyboard_log` 本身有 `rewrite_id` 字段,需改后端查询支持 rewriteId + 前端入口放开 + 生成 prompt 改落 rewrite_id。
- **修复方向(待用户定)**:①在 `submit-review-tasks.cjs`(及复盘弹窗 prompt)固化 issues_json schema(建议沿用技能规范中文「高/中/低」+ 字段名 severity/issue/suggestion/dim/loc/step);②前端加字段容错(同时兼容 sev/fix/英文值),让已有脏数据也能正确显色与显示建议。
### ★已按上述方案实施并推送(commit 0165144)
- **问题①前端兼容**(`data-pages.js`,`diagScoreColor` 之后):新增 `normIssue()`(pick 优先级 severity>sev>level>严重度;正则映射 高/high/h/p0/严重→高、中/mid/medium/m/p1→中、其余→低;issue/desc/text、suggestion/fix/suggest、dim/dimension、loc/position 多字段兜底)+ `issueLevelColor()` + `issueRowHtml()`(渲染 严重度[色]+[维度]+问题+→建议)。三处 `issues.map(...)`(原 2046/2108/2201)统一替换为 `issues.map(issueRowHtml)`。`.issue-row` 加 `flex-wrap: wrap` 防长文本挤压。
- **问题①prompt 固化**:`submit-review-tasks.cjs` 的 `issues_json` 项改为带完整示例与禁用说明(禁止英文取值、禁止 sev/level 字段名);`data-pages.js` 新增模块级常量 `REVIEW_ISSUE_RULE`,拼进**两组** fireReview prompt(2012/2014 与 2191/2193,共 4 处,已用 replace_all)。
- **问题②原创选题分镜**:`dsh-data.js listStoryboards(videoId, rewriteId)` —— rewriteId>0 且 videoId 不>0 时按 `rewrite_id` 查;`server.js` 改为 `listStoryboards(qInt('videoId',0), qInt('rewriteId',0))`;前端新增 `sbQueryOf/fetchSb`,`storyboards` 改 `let`,`patchSide` 中 vid<=0 时按 `c.id` 重查(切版本正确);生成入口去掉 `vid>0` 限制;`fireGenSb` 补落库指令(video_id / rewrite_id / script_text / status='done',表在会话 cwd 下 mcn-plugin.db)。
- **验证**:4 文件 `--check` 通过;归一化 6 组用例全对(`{sev:'high'}`→高/红、`{severity:'中'}`→中/黄、空→低兜底);重启 HTTP 200;`/api/dsh/storyboards?rewriteId=38` 返回 0 条(原创选题暂无分镜,接口已通)。版本号 → style.css `20260910c`、data-pages.js `20260910d`。
- **同步**:commit `0165144`(58 文件 +895/−263),push 到 origin/main(`a69f930..0165144`)。未跟踪且未纳入:`flova_chat_raw.txt`、`flova短剧创作界面分析_20260907.md`、`mcn-work-shop/.workbuddy/`、`tools/`(非本次改动或运行产物)。
- **验证**:3 文件 `--check` 通过;四榜 API 均返回 ranges(week 4 期/hot·likes 2 期/day 2 期,区间正确);版本号 bump style.css+app.js→`20260910a`、data-pages.js→`20260910c`;重启 HTTP 200。
## 清理「dsh 已废弃」类废话(用户指出)
- **触发**:用户指出 `SKILL_HINT_RANKING` 里「09-10 起 dsh 环境已废弃,无 dsh 分支)」属于废话——环境都没了,prompt/规则里再讲"何时废弃、曾有几个环境"对当前执行毫无价值。
- **★分类处置原则(可复用)**:
1. **prompt / 规则正文里的历史叙述 → 全删**(模型与执行者只需要"现在怎么做")
2. **代码注释里描述变更动作**(如"09-10 去掉 dsh 分支:…")→ 删,只留定稿日期
3. **"无 dsh 分支"这类陈述不存在的东西** → 删(陈述一个不存在的事物=噪音)
4. **文末「变更记录」历史区 / 变更日志.md → 保留**(append-only 归档,是正常文档元数据,不是噪音)
5. **禁止性护栏**(如"不要再按 .dsh 路径段做分支判断")→ **精简保留**:去掉日期与"已下線"经过叙述,只留"禁止做什么"
- **改动 16 个文件约 18 处**:data-pages.js(prompt)、dsh-data.js(注释)、3 份 路径配置.md(V1.0/Lite1.0/video-prompt,删变更公告+"无 dsh 分支"+护栏精简)、V1.0+Lite1.0 的 references-add/README.md、mcn-video-prompt 的 SKILL.md + references/README.md + references-add/README.md、mcn-dou-analysis SKILL.md + references-add/README.md(2)、douyin-weekly-surge SKILL.md、MCP_工具调用规范.md、mcn-data-insight SKILL.md、创作流程规范.md。
- **验证**:dsh-data.js / data-pages.js `--check` 通过;版本号 bump 至 `?v=20260910b`;工作台重启后接口全 200(榜单日期新增 2026-08-31 一期,读取正常);`/data-pages.js` 字符数 145080→145053(正好少 27 = 删掉那句)。
- **注意**:data-pages.js 里剩余 44 处 `dsh` 全是 `/api/dsh/*` 接口路径与代码标识符(工作台 API 命名空间,与"dsh 部署环境"无关),**不可动**。