🔎 kb9 尾帧取证 · r023/r024

直接回答「实际渲染用的尾帧是什么」+ 超门定量归因 · 0923 晨
一句话回答:渲染实际提交给引擎的尾帧锚 = 源片 81.291s 帧(r023,不是窗尾 81.392s); 渲染自身末帧(上图第3格)停在切近前的 wide 构图——甲虫低头持番茄、螳螂在画内、小孩未入画,与锚帧(甲虫推近抬头张嘴+小孩入画)的 MAD=49.6,超门 20。 即:锚给对了位置,但渲染终点没走到锚;另揪出两个上游坑:①源片 30fps vs 管线 FPS=24 常量(r023 网格重抽因此少抽 2.4 源帧且为 no-op)②kb7 tail 指标和提交锚同点位,tail 21.9 一直是「渲染 vs 自己的锚」而非 vs 真窗尾(口径缺陷,夸大了 tail 达标率)。

r023_p1

窗 77.1663 → 81.4333s (4.267s) · grid 102f → floor4 100f
⚠ 尾帧门 endpoint_last_mad_max=20:渲染尾帧 vs 锚 49.63 / vs GT真尾 52.57 —— 双双超门,你看到的「尾帧不对」在仪器上成立
证据条(左→右):渲染末3帧 n97 · n98 · n99(尾帧) | ④提交锚 cond_last | ⑤GT真窗尾
测量对MAD门语义
渲染首帧 vs cond_first3.528首锚锁定 = 正常 ✓
渲染尾帧 vs 提交锚 cond_last49.6320终点不达锚 = 你看到的病
渲染尾帧 vs GT 真窗尾52.5720同上(真值口径)
GT 真窗尾 vs 提交锚42.44—锚本身与真窗尾的差(源片动作)
尾帧时间轴映射(r023):源片 30fps,管线 FPS=24 常量 → 窗尾提取点 end−1/24=81.3916s,网格重抽点 start+99/24=81.2913s, GT 真尾 end−1/30=81.3980s。渲染 100 帧 = 4.167s,映射回源 = start+99/24 ≈ 81.29s —— 渲染尾帧对应的是源片 81.29s 的动作瞬间(切近前),不是窗尾 81.40s。
归因:窗尾锚提取点与网格重抽点差 100ms/2.4源帧,但产物字节一致 → 网格重抽 no-op(上游坑实锤)。窗内无物理切镜;80.5s 起源片进入持续大动作段(甲虫推近+抬头张嘴+小孩入画)。渲染尾部停在切近前:wide 构图、甲虫低头持番茄、螳螂画内、小孩未入画,落后真窗尾约一个故事 beat。
尾帧问题定性(辅助意见,可跳过):

r024_p1

窗 81.4333 → 83.9333s (2.5s) · grid 60f → floor4 60f
⚠ 尾帧门 endpoint_last_mad_max=20:渲染尾帧 vs 锚 30.31 / vs GT真尾 30.47 —— 双双超门,你看到的「尾帧不对」在仪器上成立
证据条(左→右):渲染末3帧 n97 · n98 · n99(尾帧) | ④提交锚 cond_last | ⑤GT真窗尾
测量对MAD门语义
渲染首帧 vs cond_first3.198首锚锁定 = 正常 ✓
渲染尾帧 vs 提交锚 cond_last30.3120终点不达锚 = 你看到的病
渲染尾帧 vs GT 真窗尾30.4720同上(真值口径)
GT 真窗尾 vs 提交锚24.26—锚本身与真窗尾的差(源片动作)
尾帧时间轴映射(r023):源片 30fps,管线 FPS=24 常量 → 窗尾提取点 end−1/24=83.8916s,网格重抽点 start+99/24=83.8916s, GT 真尾 end−1/30=83.8980s。渲染 100 帧 = 4.167s,映射回源 = start+99/24 ≈ 81.29s —— 渲染尾帧对应的是源片 81.29s 的动作瞬间(切近前),不是窗尾 81.40s。
归因:锚时间点零偏差(floor4 未裁帧)。渲染尾帧与锚/GT尾 MAD 30.3/30.5,仍超门 20:渲染终点动作幅度不足(转头张嘴 beat 未走完),属于『渲染目标长度内动作不达锚』谱系,与 kb5 r039a 定谳的 H3 运动边界同族。
尾帧问题定性(辅助意见,可跳过):
全部 MAD 为降采样灰度均值绝对差(渲染帧 vs 源帧,统一 672×384);渲染/源规格 h264·1344×768·faststart;证据条原图可点击全屏。kb9 已固化 commit c9b266b(scripts/dialogue_protocol.py,与生产协议逐字节对账 True)。