方法论与洞察

2026-08-26 《擦干净》剧本口径审计与补图承接位 · 复盘 v1

项目:66_擦干净 B 站互动悬疑短片(v45 审片反馈版) 上一阶段:2026-08-24_擦干净_从素材到动态化制片_全链路复盘_v1 本次范围:剧本同步飞书 → 照剧本审全部资产 → 写补图 prompt → 引擎侧承接位 本次没有出图、没有重渲成片,产出全是文档与代码


事实记录(不可修改区)

事实
起点用户要把完整剧本同步一份飞书文档给朋友看
会话内飞书能力。工具清单里只有钉钉 dws 系列,.mcp.json 无 Lark server,机器上无 feishu/lark CLI
转机用户提示「查知识库」→ 命中 07_skill存档/feishu-doc-publish/SKILL.md → CLI 在 E:\pb-arena\tools\feishu-doc-sync\sync.mjs
发布结果成功。anyone_readable + external_access: open,用户账号 full_access
引擎体检asset_check.cjs70/70 全部命中,0 缺失
剧本口径审计同一批资产,按剧本审出 4 条 P0(露脸三连零素材 / S26 卧室闪现无素材无代码 / 双结局零画面素材 / 第二幕线条画物件当前为零)
补图 prompt8 条 MJ v8.2(下半脸特写 ×3、双结局 ×4、线条勾边卧室 ×1)
sref 悬案融合底图 v2 是否挂 --sref 悬置多日;本次依据 sref纯净性原则 裁决为不挂
引擎改动新增 SceneInsert 机制 + 结局铺图分支 + SoundEventdur/trimBefore + asset_check 剥注释
改后复验tsc --noEmit 干净 / 资源 70/70 / 总长 5338f = 2:57.93 / S37 = 5158f,四项与改前逐一致
机制真机验证临时把一张现成图接进 S17 的 insert,渲第 2140 帧(窗口内)与第 2100 帧(窗口外)各一张,两条路径都符合预期,验完回滚

一、这次真正的发现:两套口径,两个结论

asset_check.cjs 报 70/70 全绿,同一批资产按剧本审出 4 条 P0。两个结论都是对的,因为它们验的根本不是同一件事。

体检器的检查项是这样来的:正则扫 videoConfig.tsasset / video 字段、扫 Scene.tsx 里字面量的 staticFile('...')、扫 audioLayers.tsfile。 也就是说——它的清单是从实现里抽出来的

于是它能查出”引用了但文件不在”(损坏),永远查不出”剧本要求但从没被引用”(缺失)。 露脸三连、S26 卧室闪现、双结局画面,这三样从来没进过 videoConfig, 在体检器的视野里根本不存在这些条目,跑一万次也是 70/70。

已抽成独立一句话律:绿勾只覆盖它自己那张清单_v1

同一条律在本次咬了第二口

审计做完之后,我为了验证新写的切入机制,渲了一张 S17 的对照帧。 肉眼看到:S17_运动会_MJ_v1.png 里少年是清晰正脸,而剧本 S17 分帧表 0-0.8s 要求”逆光剪影、脸全黑”, 项目红线 6 写着”林涛全程不露全脸”;另外剧本写的是”廉价蓝色运动服”,图里是白 T 恤。

这条我的审计文档也没查出来——因为我的清单同样是从文本层(videoConfig + prompt 清单)抽的, 查得出”S29 的 asset 是妈妈背影,错配”,查不出”这张图本身违规”。 要查后者,清单得来自剧本,工具得是眼睛。自动化产出双重验收_机器验参数人眼验内容_v1 同源。


二、知识库这次是当工具用的,不是当资料看的

两处直接改变了产出:

1. 飞书链路:会话内零飞书能力,是知识库里那篇 skill 存档把链路补齐的—— CLI 位置、凭证查找顺序、owner_open_id 为什么不可省、手机号/邮箱两条路早已证伪。 没有它,我给出的方案会停在”你自己把 md 拖进飞书导入”。

2. sref 悬案:融合底图 v2 该不该挂 --sref,卡在”锚点待填”多日。 sref纯净性原则 那篇的案例母本恰好就是本项目(妈妈背影当 sref 跑年轻女孩,风格被整个放弃)。 照那条推:融合底图的主体是写实纪录照片,只有一件小物件是线条画, 挂”纯线条+大留白”的咖啡杯锚点等于制造同一个矛盾。结论:不挂,锚点表作废。

由此扩出一条可迁移判据,已回填 sref纯净性原则决定挂不挂 sref,看的是画面主体的媒介,不是画面里有没有那个风格的元素。


三、方法论沉淀

1. 镜内切入优于拆镜 ⚠️首次

剧本有四处”一镜之内切一下再切回来”(S17 / S20 / S29 的下半脸特写、S26 的 0.3s 卧室闪现)。 直觉方案是把 S17 拆成 S17a/S17b/S17c,但那会改 starts,进而改 S37 互动点的帧号—— 而 5158f = 2:52 是要填进 B 站互动配置的、已经对外承诺过的数。

改成在本镜 durationInFrames 内部做一次硬切,时间轴一帧没动。 已抽成 镜内切入优于拆镜_保住下游帧锚_v1

2. 承接位要能”素材不在也照常渲” ⭐⭐

SceneInsertasset/video 都为空时整段忽略,画面与 v45 逐像素同路径。 这条是沿用本项目 S10 puton 占位器的既有做法(见 图片占位到视频替换的工作流_v1), 但这次多做了一步:用一张现成素材临时接上去真渲一帧,验证”接管路径”本身能跑

编译通过只证明类型对。窗口内那帧渲出来,才知道图铺满了、screenText 字卡按预期收掉了。 验完回滚,成本约两次 still 渲染。

3. 从策划文档取词:取正文的描写,不取附录的概括 ⚠️首次

剧本附录把 S17 概括成”笑(克制不住)“,我第一版 prompt 照着写成 a wide unguarded grin, corners pulled back hard——大笑。 回头核剧本正文,写的是”嘴角先动,笑容蔓延,牙齿微露(羞涩)”。

“克制不住”指的是笑容压不住地蔓延,不是笑得开。两者的区别决定这张图成不成立: 大笑会把 S17 / S20 / S29 的三级情绪梯度直接压平,而那三级正是剧本自称的”全片最重要视觉等式”。

同一份文档里,附录是给人记的,正文是给相机拍的。取词取正文。 ⚠️ 单例,未二次验证,暂不立律。

4. 长骨架锁的是取景,不是脸

露脸三连要”构图严格统一”,写法用了 骨架篇幅即权重_v1 的长骨架路线(90 词共用骨架、三张只换末句)。 但那篇明确写着”❌ 不适用于人物锁脸”——所以骨架锁的是取景(裁切线、机位、下颌可见), 下巴形状与唇形在三张之间仍可能漂。

退路写进了清单:E1 定稿后当 sref 跑 E2/E3。这是 sref纯净性原则 允许的用法—— 同主体、同取景、只换光线和嘴部,不存在”妈妈背影跑少女”那种主体错配。


四、判断与事实的分界

性质
70/70 与 4 条 P0 并存事实,两条命令的输出
结局码率 0.49 / 1.27 vs 主线 5.30 Mbps事实v45_probe 数据
”结局画面信息量差一个数量级”推断,由码率倒推,未逐帧核对
”双结局是本片作为互动视频最要命的一条”判断,基于”互动视频的兑现点在分支”这一前提
S17 底图违反红线 6事实(渲染帧目视)+ 判断(是否需要重出由主创定)
融合底图不该挂 sref推论,由 sref纯净性原则 推出,本次未做 A/B 实证

最后一条要特别留一句:结论是推出来的,不是跑出来的。 出图时若发现不挂 sref 的物件线条风格与素材库脱节,这条推论就要回来改。


五、下次改进

  1. 审计要分两轮:先按实现口径跑体检(快、免费),再按意图口径人工过一遍剧本。 两轮的清单来源必须不同,否则第二轮是第一轮的复读。
  2. 文档与代码的默认值会漂feishu-doc-publish 的 SKILL 与 CLI README 都写着 “默认组织内可阅读”,而 sync.mjs 的实际默认早已是 anyone_readable。 本次已回填修正。照文档描述做决策前,先看一眼代码里的默认值。
  3. 占位机制交付时附一次真机验证,别只交”类型通过”。
  4. 剧本 v1 与成片 v45 的时长/文案差异已列成对账表,但剧本正文没有回改。 下次定版后应决定:是回改剧本,还是永久保留”剧本=设计值 / 成片=实测值”两套数。

关联文档

类型/IP视觉主题/复盘主题/互动短片工具/Remotion