Files
mcn-short-video/.workbuddy/memory/2026-09-10.md
T
maogeigei 0165144292 09-10 工作台:配置收敛、复盘字段契约修复、原创选题分镜支持、榜单期号区间显示
配置收敛:
- 端口/DB名/产出根/榜单目录单源化到 mcn-work-shop/config.json,代码层统一经 load-config.js 读取
- 新增 get-port.js 供 start.bat 读端口(bat 内嵌 node -e 会被 cmd 截断,读到的是兜底值)
- start.bat 修复失效的 managed node 路径(原写死 22.22.2 已不存在),改为遍历 versions 自动探测

复盘诊断页(真 bug 修复):
- 问题清单严重度全部显示成绿色 + 修改建议不显示:模型输出 {sev:'high',fix} 与前端读取 {severity:'高',suggestion} 字段名与取值均不匹配
- 前端新增 normIssue 归一化,兼容 sev/severity/level 与中英取值,并回补所属维度显示
- 在 submit-review-tasks 与诊断/复盘 prompt 中固化 issues_json 字段契约,从源头防 schema 漂移

分镜提示词:
- 原创选题(video_id 为空)原本无生成入口(分镜按 video_id 查询)
- listStoryboards 支持按 rewrite_id 查询,前端放开入口、切版本重查,并补落库指令(此前入库靠模型自由发挥)

榜单展示:
- 期号改为显示区间「08/31 ~ 09/06」,避免被误读为单日(期号=该周周一)
- 后端新增 collectRanges,从落盘文件读真实 dateStart/dateEnd 随 API 返回(日榜 start=end 不显区间)

其他:
- 清理 dsh 环境废弃后的历史叙述类废话(16 文件约 18 处),文末变更记录区保留
- 新增 docs/工作台UI规范.md(设计 token / 布局 / 8 页面路由 / 12 类组件 / 9 条已知坑)
2026-09-10 18:28:42 +08:00

149 lines
24 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/英文值),让已有脏数据也能正确显色与显示建议。
- **验证**: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 部署环境"无关),**不可动**。