MH 通用皮肤引擎三坑:横屏硬编码、字幕预切碎、分镜指令泄漏(2026-11-12/13)

适用:~/kf-video/_mh-sketch(MotionHarness 渲染支路 + skin_engine 数据驱动皮肤),psych 日更线 11-12 起默认 renderer=mh/blueprint。 三坑全部有实拍证据,均属"骨架归代码、语义归数据"边界没划清代价。

坑1:harness 壳竖屏硬编码(横屏首案,11-12)

_mh-sketch 脚手架的 harness/index.html 与 mh_step5.py 生成的 mh.json 均写死 1080×1920。做横屏委托单(1920×1080)时必须改壳 + theme 坐标体系;skin_engine.js 内部所有 top/width 数值也是按竖屏排的,横屏要么重写 scene.js 定制稿(委托三做法,369 行定制),要么给 theme 加坐标缩放参数。

坑2:皮肤字幕必须预切碎(11-12)

skin_engine 字幕层按 beats.json 的 word 粒度整段渲染,单行 42px、宽 940px,一条 60+ 字旁白直接溢出/压满屏。字幕切分必须在 beats 生成前完成(每段 ≤22 字、就近标点),不要指望渲染端自适应换行——hf/主线的 cap() 顶穿病(11-10 实锤)在 mh 线原样复发。

坑3:通用引擎把"分镜指令"当成品文案上屏(11-13,psych E10 机审 FAIL 实锤)

  • 现象:E10 成片 90s/170s 探针帧上,屏幕中部文本卡逐条显示 砖墙垒到一半留缺口、『20种砖·8种外购』小条、右栏浮出『30年队列·健康老化+46%』、底部作业条『大豆坚果15~25克/天』——这些是给动画师看的道具/分镜备注(content.json → visuals.props),不是给观众看的解说文案。
  • 根因链:mh_step5.py 的 psych 分支把 visuals.props 按加号切分后原样填进 list 卡 items,而通用 skin_engine 忠实地把这些文字排上屏。几何审计(mh_geom_audit)只查越界不查语义,VLM 抽帧才抓得出来。
  • 正确姿势:props 是内部脚本;上屏文案必须另给。修法是 step5 预留的正源 content.mh.json(优先级:content.mh.json > psych 形 content.json > hltb 形 script.json)——写观众口吻的成品短句,每卡 ≤18 字。
  • 验收增补:抽帧机审窄问题清单从此加一项——“画面是否出现’入场/小条/徽章/浮出/大字卡’等制作指令类词汇”。此项 VLM 一问即中,成本≈0。

连带立法沉淀

  1. 通用皮肤引擎的数据输入 = “观众可见文案”,任何内部制作备注字段(props/cue/备注)禁止直通上屏通道;数据映射层负责翻译,翻译缺失时报错而不是原样透传。
  2. 机审抽帧不能只按 25%/50%/85% 三点均匀采——信息密集列表卡场景要点名补采(本轮 frame1/frame2 恰好采在未入场文字卡上险些漏放,90s/170s 探针帧才暴露真缺陷)。疑点必须另抽更晚/更密探针帧实证(与 11-09 S06 假阴性同型)。
  3. 返工产物不删除:残品 mv 进 qc_fail/ 留证,新版走新 OUTVER(mh_assemble 的"产物不覆盖铁律")。