用户挑了 5 条对 combo 技能的反馈,明确说"不要乱改"。我这一轮的活不是写代码,是做独立取证复核:每条归到「Mai 自己改 / Tobatsu 下游查 / 不用动」三个桶里,挡掉过度修,再把该验的两条端到端验穿。
这是三方协作:codex 读仓库、改 Mai 这边的代码;我读证据、分类、把关;还有个 Tobatsu 下游的负责人盯他们那半边。
用户给的硬规矩就一句:别一股脑乱改。意思是每条反馈先想清楚"这毛病到底是谁的",再决定动不动手。所以我做三件事:
为什么"自己查"是死规矩
复核的人如果只是把实现者的话换句话说一遍,那等于没复核。读 diff、跑 grep、查 DB、下载产物对 MD5——证据自己拿,结论自己下。
读完 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,还顺带告诉用户"这次只重试最后一步,不用重新准备素材"。
让 agent 现在就提交 resume_from=final,并告诉用户"只重试最后一步"——可后端根本不认这个字段,会整条重跑(再烧一次 ElevenLabs + OmniHuman)。许了个做不到的承诺。
两分支:下游确认支持了才走 resume_from=final;没支持就别提交,老实告诉用户素材会留着、只重试最后一步的能力还没开放。
builder 那层的代码我放过了——它本身是安全的、带 gate 的(不是 "final" 就抛错,正常请求字节不变)。我挡的只是 SKILL.md 那句"现在就去用"的指令 + 没兑现的用户承诺。codex 按两分支改回来后,我重读 diff、重跑测试,才签字。
下游把 #2(阶段级重试)和 #4(稀疏 SRT 降级)都实现并跑了 E2E。我独立查了 DB、canvas、session,核心是证明复用真的发生了、贵的那两步真没重跑。
差点踩的坑:不能拿 file_id 一不一样来判断复用
Mai 每次会把同一个 CDN 链接重新 import 成一个新的 mai_file_id。所以"产物表里的 id 变了"完全正常,拿它当复用测试是错的。正确的证据是下面三条。
我用三条证据交叉确认复用:
metadata.reused=true / provider=reusedrendi + elevenlabs/scribe_v2(合成 + 校验),没有 TTS、没有 OmniHuman。贵的那两步确实跳过了#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 的缺陷
#3 一行没动——上轮已验过,这轮的价值是拦住别人去重开它。整轮 commit 推到 origin/test,combo 这一条技能单独导入 test 技能库,我还核了 DB 里的 SKILL.md 和本地 MD5 一致,没有打包漂移。
这轮我最该被记住的两个判断:一是没被"看着能改"带着走,该下游的坚决归下游、该不动的坚决不动;二是挡下了那句"答应了又做不到"的话,因为下游能力还没真上线。全程 test-only,prod 一个字没动。