P09 写作层只生产原料——帧描述与转场设计;mode 是 gen_iframes 从原料里确定性推导出来的结果。 决策权分布在四处:LLM 写什么(创作判断),代码判什么(工程判断),中间没有任何人显式地说「这个镜头用 chained」。
derive_frame_chain() · gen_iframes.py:79 / 三值: paired | chained | single_ref
谁真正做了决定,谁只是提供了原料。四个工位,两种颜色:琥珀 = LLM 创作判断,青 = 确定性代码。
左边是 P09 真实产出的字段——随便改。右边是 gen_iframes 的确定性反应:规则芯片按求值顺序点亮,接缝实时重焊。这就是全部决策逻辑,JS 逐行复刻 derive_frame_chain,没有隐藏状态。
缺失时 P09 后处理会派生薄描述打标;此处模拟彻底缺失 → single_ref
仅当 hard_cut 时做子串匹配:13 词 = 承接 顺接 接续 继续 接着 紧接着 紧接 顺势 顺着 延续 接上 跟上 惯性
continuous 但前帧缺失 → 并行回退,退化为 paired 重新生成
手写渲染路径先落了独立首帧 → 幂等设计使它静默收敛 paired。2026-08-17 起有审计
全部来自 gen_iframes.py 的常量与 p09_shot_breakdown.py 的 instruction——没有任何一处是"LLM 觉得"。
运镜连续,胶片物理上没断
连续性转场
硬切但动作承接(2026-08-17 扩表 4 → 13 词)
命中以下任一 → independent → paired
| MODE | 触发条件 | first_frame 来源 | last_frame 来源 | 渲染路径 |
|---|---|---|---|---|
| chained | frame_chain = continuous 且前镜 last_frame 在盘 | shutil.copy2(prev.last_frame) 像素级复用,拼接零跳变 | dreamina 生成 | H3 i2va |
| paired | 有帧描述,且不满足 chained 条件(independent,或 continuous 但前帧缺失的并行回退) | dreamina i2i:scene_ref + TR1 + storyboard_crop(cap 3) | dreamina i2i:scene_ref + TR1 ——不参考首帧(#0:参考即坍缩) | H3 i2va |
| single_ref | 缺 start 或 end 帧描述(P09 兜底派生后理论值为 0) | — | — | H3 ref2va + [FRAME-0 ANCHOR] prompt 锚定 |
决策链的可靠性不是设计出来的,是跑出来的——包括它曾经静默失败的地方。
td 里有 4 条 camera-continuous 设计(match_cut / pan / dolly×2),shot_id 对齐、前帧在盘——但 4 处首帧与尾帧 md5 全不同:帧由手写渲染路径生成,meta 缺失,幂等设计使其静默收敛 paired。0 chained 是漂移,不是设计。
判定链当时正常工作(9 chained)。13 条 continuous 链中 8 条像素一致、1 条 drift(S4_2)、4 条前帧缺失不可比。5 个 single_ref 是 P09 派生兜底加入前的漏写。