现象
出口处没有任何自动检查。ActionTaskExecutor._run_character_action 把帧上传完就组 payload 返回,update_result 无条件置 COMPLETED——一段把角色分裂成两个人的 walk、一段凭空多出一把剑的 attack、一段脚被画面底边裁掉的 idle,与一段干净的产物在任务状态里长得完全一样。
唯一挡在前面的是 _require_size(尺寸不对就抛),它只看画布,不看画布里是什么。
为什么本地像素指标不够
ports.ActionQuality 那三个数(motion_scale / dead_frames / loop_seam)零成本、恒可得,但它们量的是帧与帧之间的关系:动没动、有没有死帧、闭不闭环。它们回答不了"这一帧画面里有什么"——像素统计分不出"两个角色"和"一个角色 + 一件道具",也分不出"这个姿势属不属于 attack"。
#311 提的 subject_blobs()(alpha 连通块计数)是同一层的免费近似,能覆盖四问里的第一问,但同样有那个歧义:挥出去的手臂被抠断、角色手持长条物,都会被数成第二块。
所以这里要的是另一种仪器,不是同一种仪器做得更好。
提案:判官只判"可数四问"
一次付费的看图问答,问四个有唯一答案的问题:
| 读数 |
问题 |
期望 |
subject_count |
画面里有几个角色主体 |
1 |
foreign_objects |
母版里没有、生成帧里却出现的物体 |
空 |
action_matches |
这一帧的姿态属不属于所要求的动作类别 |
true |
clipped |
角色有没有被画面边缘裁到 |
false |
为什么不判"好不好看"
出参里刻意没有 score 字段,这是本提案最重要的一条,理由有两层:
一,主观评分的噪声能盖过真实差异。 同模型同输入的"整体质量 1-10"重复问,分数会漂;而我们要用它来比较的两次改动,效果差异往往比这个漂移还小。测出来的排名是采样噪声的排名,不是质量的排名。
二,出参里一旦有个分数,迟早有人拿它卡阈值。 那时卡掉的是噪声——而误杀掉的是用户已经付过钱的产物,退不回来。漏放一个坏产物,用户可以重试;误杀一个好产物,用户损失是实的。这两种错误的代价不对称,所以判据必须是"有唯一答案、人眼复核一遍就能确认对错"的那种,不能是分数。
"好看"由输入端(母版规格 + 提示词骨架)保证,不由出口这道闸保证。
三条设计红线
review() 返回 GateDecision | None,None = 没判。 没判与"判了没问题"必须是两个可分辨的返回值——只有后者能支持"这批产物是干净的"这句话,而它们在一个布尔里长得一样。
- 判官故障永不拦截。 判读读不出结论时记
error 并放行:因为我们自己的仪器坏了而扣住用户已付费的产物,是最糟的失败方式。同理,provider 读不出四个读数时必须抛错、不得兜底成"通过",否则"判官坏了"和"产物没问题"在下游长得一样。
- 先 shadow 再谈拦截。
QUALITY_GATE_ENABLED / QUALITY_GATE_ENFORCE 两个开关分开,都默认 false。阈值要拿 shadow 数据定,顺序反过来就是拍脑袋定判据。
成本
只判一帧(取中间那帧——首帧最接近母版,正是"动作对不对"最看不出来的一帧),即每交付一个动作多一次调用。闸口默认关,开它是一次明确的花钱决定。
与在飞工作的关系
#311(成色落库):互补,不重叠。那边落的是引擎本地算出来的 ActionQuality,这边落的是判官读数;两份数据源与代价都不同,payload 里分别用 quality 和 judge 两个键,不共用。
#278 第 1 条(质检 + 坏帧自动重生成):本 issue 是它的前置,不是它。自愈要的是"据此重生成"那一步,而定"哪些帧该重生成"需要先有判据和基线数据;本 issue 只做到"判读 + 记账"。
#7(E1 统一评判):那份实验矩阵里的 VLM-Judge 一支,取其中"可数问答"的部分落地,不取多信号加权打分的部分——理由见上面"为什么不判好不好看"。
验收
- 控制样本先验仪器:合成图(白底 + N 个不相接的黑块)喂进去,单主体读 1、双主体读 ≥2;并单独断言合成图本身数得出差别,否则那两条就是同一个断言跑了两遍。
- 桩必须真的去数提交上来的图,不能是写死的一条回答——写死的桩发现不了请求形状错、base64 错、参考图顺序错。
- 断言
JudgeVerdict 的字段名里没有 score / rating / grade。
- 闸口关时一次调用都不发,且
result 里没有判官读数(不是"读数说没问题")。
- 判官抛错时任务照常 COMPLETED,读数里带
error。
现象
出口处没有任何自动检查。
ActionTaskExecutor._run_character_action把帧上传完就组 payload 返回,update_result无条件置 COMPLETED——一段把角色分裂成两个人的 walk、一段凭空多出一把剑的 attack、一段脚被画面底边裁掉的 idle,与一段干净的产物在任务状态里长得完全一样。唯一挡在前面的是
_require_size(尺寸不对就抛),它只看画布,不看画布里是什么。为什么本地像素指标不够
ports.ActionQuality那三个数(motion_scale/dead_frames/loop_seam)零成本、恒可得,但它们量的是帧与帧之间的关系:动没动、有没有死帧、闭不闭环。它们回答不了"这一帧画面里有什么"——像素统计分不出"两个角色"和"一个角色 + 一件道具",也分不出"这个姿势属不属于 attack"。#311提的subject_blobs()(alpha 连通块计数)是同一层的免费近似,能覆盖四问里的第一问,但同样有那个歧义:挥出去的手臂被抠断、角色手持长条物,都会被数成第二块。所以这里要的是另一种仪器,不是同一种仪器做得更好。
提案:判官只判"可数四问"
一次付费的看图问答,问四个有唯一答案的问题:
subject_countforeign_objectsaction_matchesclipped为什么不判"好不好看"
出参里刻意没有 score 字段,这是本提案最重要的一条,理由有两层:
一,主观评分的噪声能盖过真实差异。 同模型同输入的"整体质量 1-10"重复问,分数会漂;而我们要用它来比较的两次改动,效果差异往往比这个漂移还小。测出来的排名是采样噪声的排名,不是质量的排名。
二,出参里一旦有个分数,迟早有人拿它卡阈值。 那时卡掉的是噪声——而误杀掉的是用户已经付过钱的产物,退不回来。漏放一个坏产物,用户可以重试;误杀一个好产物,用户损失是实的。这两种错误的代价不对称,所以判据必须是"有唯一答案、人眼复核一遍就能确认对错"的那种,不能是分数。
"好看"由输入端(母版规格 + 提示词骨架)保证,不由出口这道闸保证。
三条设计红线
review()返回GateDecision | None,None= 没判。 没判与"判了没问题"必须是两个可分辨的返回值——只有后者能支持"这批产物是干净的"这句话,而它们在一个布尔里长得一样。error并放行:因为我们自己的仪器坏了而扣住用户已付费的产物,是最糟的失败方式。同理,provider 读不出四个读数时必须抛错、不得兜底成"通过",否则"判官坏了"和"产物没问题"在下游长得一样。QUALITY_GATE_ENABLED/QUALITY_GATE_ENFORCE两个开关分开,都默认 false。阈值要拿 shadow 数据定,顺序反过来就是拍脑袋定判据。成本
只判一帧(取中间那帧——首帧最接近母版,正是"动作对不对"最看不出来的一帧),即每交付一个动作多一次调用。闸口默认关,开它是一次明确的花钱决定。
与在飞工作的关系
#311(成色落库):互补,不重叠。那边落的是引擎本地算出来的ActionQuality,这边落的是判官读数;两份数据源与代价都不同,payload 里分别用quality和judge两个键,不共用。#278第 1 条(质检 + 坏帧自动重生成):本 issue 是它的前置,不是它。自愈要的是"据此重生成"那一步,而定"哪些帧该重生成"需要先有判据和基线数据;本 issue 只做到"判读 + 记账"。#7(E1 统一评判):那份实验矩阵里的 VLM-Judge 一支,取其中"可数问答"的部分落地,不取多信号加权打分的部分——理由见上面"为什么不判好不好看"。验收
JudgeVerdict的字段名里没有score/rating/grade。result里没有判官读数(不是"读数说没问题")。error。