combo skill · round-2 复盘

5 条反馈,我没一股脑改——先分桶,再逐条取证

用户挑了 5 条对 combo 技能的反馈,明确说"不要乱改"。我这一轮的活不是写代码,是做独立取证复核:每条归到「Mai 自己改 / Tobatsu 下游查 / 不用动」三个桶里,挡掉过度修,再把该验的两条端到端验穿。

角色 mai-cc(取证复核)  ·  搭档 mai-codex(实现)  ·  全程 test-only,prod 未动
5
条反馈
3
分桶
1
挡下的 blocker
0
prod 改动
我的位置

我是复核的那个,不是动手的那个

这是三方协作:codex 读仓库、改 Mai 这边的代码;我读证据、分类、把关;还有个 Tobatsu 下游的负责人盯他们那半边。

用户给的硬规矩就一句:别一股脑乱改。意思是每条反馈先想清楚"这毛病到底是谁的",再决定动不动手。所以我做三件事:

为什么"自己查"是死规矩

复核的人如果只是把实现者的话换句话说一遍,那等于没复核。读 diff、跑 grep、查 DB、下载产物对 MD5——证据自己拿,结论自己下。

分桶结果

5 条各归各位

读完 goal 文档、combo 的 SKILL.md、请求构造代码,再 grep 了试听流程、voice_id、pip 默认、字幕这几处,得到下面这张表。只有 2 条是 Mai 自己改,其余要么下游、要么本来就对。

#反馈归桶怎么处理
1 用户没给音色时,技能不知道该说啥,就自己发起了试听流程 Mai 改 加一句话引导:提醒左下角能选音色,想要就给 2-3 个推荐。不做试听工具
2 数字人原片成了,最终成片失败(口播音频和转写对不上) 下游 是 Tobatsu runner 的最终校验闸 + 分阶段重试能力。Mai 这边只能整条重提,管不到阶段。
3 成片音频:原声保留?口播叠加?画中画数字人静音? 不用动 上一轮已端到端验过(残差相关性 1.000)。不重开,别再碰 audio_mix
4 字幕阶段失败:SRT 条数太少,做不了词级特效字幕 下游 词级特效在 SRT 太稀时应该降级成普通句级字幕,而不是整条失败。这是下游字幕阶段的事。
5 默认右上圆形画中画 ~0.25,用户基本认可,问要不要略放大 Mai 改 一行默认值 0.24 → 0.26,builder 和文档同步。不重设计布局

* #3 是反过来把关:它已经对了,价值在于"拦住别人手痒去改它"

这轮最关键的一次拦截

差点变成"答应了又做不到"

codex 改 #2 的时候,顺手重写了 SKILL.md 里"恢复"那段,把原来的一句保命的话删掉了。删掉的是:"如果下游暂时还不支持阶段级恢复,就用人话告诉用户"。

问题在于——Tobatsu 自己的回读白纸黑字写着 "I have not started the code change yet"。也就是说下游这个能力还没上线。可改完的 SKILL.md 却让 agent 现在就去提交 resume_from=final,还顺带告诉用户"这次只重试最后一步,不用重新准备素材"。

下游未上线 下游已支持 最终成片失败,要恢复 先问一句 阶段级重试上线没? 看 Tobatsu 回读 分支判断 BRANCH 正确做法 不提交 resume_from 人话告诉用户素材会留着 系统还没开放只重试最后一步 上线后才走 新建 retry 任务 resume_from=final + reuse_artifacts 复用素材 LEGEND 焦点:被删掉又被我加回的那条保命分支
codex 的重写直接砍掉了左边这条"下游未上线"的分支,让 agent 无脑走右边。我 BLOCK 的就是这个:能力还没上线,就不能让 agent 替系统许诺。
✗ 被删掉的版本

让 agent 现在就提交 resume_from=final,并告诉用户"只重试最后一步"——可后端根本不认这个字段,会整条重跑(再烧一次 ElevenLabs + OmniHuman)。许了个做不到的承诺。

✓ 修回后的版本

两分支:下游确认支持了才走 resume_from=final;没支持就别提交,老实告诉用户素材会留着、只重试最后一步的能力还没开放。

builder 那层的代码我放过了——它本身是安全的、带 gate 的(不是 "final" 就抛错,正常请求字节不变)。我挡的只是 SKILL.md 那句"现在就去用"的指令 + 没兑现的用户承诺。codex 按两分支改回来后,我重读 diff、重跑测试,才签字。

#2 / #4 怎么验穿的

验"内容在不在",不验"结构对不对"

下游把 #2(阶段级重试)和 #4(稀疏 SRT 降级)都实现并跑了 E2E。我独立查了 DB、canvas、session,核心是证明复用真的发生了、贵的那两步真没重跑

差点踩的坑:不能拿 file_id 一不一样来判断复用

Mai 每次会把同一个 CDN 链接重新 import 成一个新的 mai_file_id。所以"产物表里的 id 变了"完全正常,拿它当复用测试是错的。正确的证据是下面三条。

我用三条证据交叉确认复用:

#2 主播图 KzcfS5.png 数字人 HiWevp.mp4 音频 RSYT7a.mp3 字幕 Nm2mHv.srt → 4 个全部 byte-identical

#4 那条把字幕换成只有 2 条 cue 的稀疏 SRT,结果 session 显示 subtitle_fallback=sentence_level / subtitle_effect_mode=plain_sentence / reason=sparse_srt——降级成句级字幕,没整条失败。音频同样字节复用、口播在。

# #2 final-stage retry — 终态 provider(只该有这两个)
terminal_providers = ["rendi", "elevenlabs/scribe_v2"]
# 没有 tts / omnihuman → 贵的两步确实复用了,不是重跑

# #4 sparse SRT(2 条 cue)— 降级不失败
subtitle_fallback   = "sentence_level"
subtitle_effect_mode = "plain_sentence"
reason              = "sparse_srt"

* 复用产物被重新 import,会让共享 canvas 攒重复副本——这列为后续小优化,不算 #2/#4 的缺陷

收口

五条全闭合,三方签字

Mai 自己改(已发 test)
  • #1 缺音色引导文案
  • #5 画中画默认 0.24 → 0.26
下游做 + 我已验
  • #2 阶段级重试(byte-identical 复用)
  • #4 稀疏 SRT 降级(不失败)

#3 一行没动——上轮已验过,这轮的价值是拦住别人去重开它。整轮 commit 推到 origin/test,combo 这一条技能单独导入 test 技能库,我还核了 DB 里的 SKILL.md 和本地 MD5 一致,没有打包漂移。

这轮我最该被记住的两个判断:一是没被"看着能改"带着走,该下游的坚决归下游、该不动的坚决不动;二是挡下了那句"答应了又做不到"的话,因为下游能力还没真上线。全程 test-only,prod 一个字没动。