前两天,我刚把 AlgoMooc 网站里面训练营的一个学习区重做完。
会员每天进来做训练题,做完看文字题解和参考代码;做错的题,系统隔两天、隔七天再安排重练。
这次是整个重构,从数据表到页面都动了。
负责实现的 AI 前后做了五轮自审。这五轮不是同一件事来回看:文案和合同条款一轮,支付和安全一轮,付费用户的页面体验一轮,回归和构建一轮,最后还有一轮专门模拟攻击。
每一轮都挑出一些问题,修掉,再审。到第五轮,所有检查项全部标成 PASS。
测试也跑得很齐:单元测试 26 条全过,集成测试 11 条全过,HTTP 端到端 75 条全过。加起来 112 条自动化测试,全绿。
另外还有 32 张桌面页面截图,逐张验收过,没有报错,没有排版溢出。构建也过了。

112条自动化测试全绿,32张页面截图另算浏览器验收材料
按理说,这活儿可以收工了。
我还是没敢收工,又开了一个独立的 Codex 会话,把项目从头交给它再审一遍。
结论回来,只有一个词:FAIL。
后面跟着 7 个确认的 P1,再加 2 个风险项。翻成人话就是:这些问题不处理,我不敢让它上线。
![]()
五轮自审全部PASS,Codex独立外审返回FAIL,7个确认P1加2个风险项
先说清楚背景:这些都发生在上线之前。项目还在本地分支里,没合并、没部署,没有任何真实用户受影响。
其中最严重的一条很直接:已经有权益的买家,题解打不开。
买家身份进去了,题解还锁着
Codex 报的第一大条是:付费用户打不开题解。这里的付费用户,指的是模拟 V3 买家的测试身份,专门用来验收买家视角。
我们原来确实测过访问权限,11 种身份都跑过,结果全绿。
可这次沿着真实页面重新走:切到模拟买家的测试身份,从学习区进入当天的一道 K 类训练题,再点开题解。
![]()
用模拟V3买家的付费测试身份进入K类训练题
锁着。文字题解锁着,几种语言的参考代码也锁着,页面还在提示购买。
![]()
付费测试身份打开题目页,文字题解和参考代码仍然锁着
原因说出来很朴素。网站原来判断"这人付没付费"的逻辑,认的是老会员的记号。这批新买家的权限记在另一个新位置,旧逻辑压根不认识那个位置。
系统明明已经把它认作 V3 买家,也发了对应权限,到了题目页,这套老判断却不认。
修完以后,付费测试身份能正常看到文字题解和参考代码了。视频和直播没有顺手放开,因为一期本来就不开放这两样。
免费身份也重新试过,还是锁着。该开的开了,该锁的没松,这才算修对。
![]()
修复前题解和参考代码锁着,修复后解锁,视频直播按一期计划保持锁定
真正让我在意的是: 最该能用的功能,从头到尾居然没人真正点开过。
五轮自审、112 条测试、32 张截图,把合同、接口、权限和页面外观都查了不少,偏偏没有把"V3 买家进入 K 题后,能不能真正展开题解"这条路径走到底。
记录里也写得很清楚:这是内部五轮漏掉的真实场景。
![]()
测试、截图和自审都从题解这扇门前路过,没有人推开它一条永远不会输的测试
Codex 还翻出来一个更难堪的东西。
一条集成测试的断言里,挂着一个 && false。
学过一点编程的都知道,任何条件后面跟上 && false,整个条件就是假的。外面再套一层取反,结果永远为真。
![]()
断言里挂着&& false,条件恒假取反恒真,检查永远通过
也就是说,只要跑到这里,它就会通过。原本要检查的是"只做对过、从没错过的题,不能进入重练队列",这句断言却等于没写。
而重练队列恰好是这个学习区很重要的一块:做错的题,隔两天、隔七天再回来一次。偏偏守在这里的检查失效了。
它一直是绿的。可这一处绿,没有意义。
它从不报错,还一直替项目举着一块绿色的牌子,这比直接失败更麻烦。
至于 && false为什么会出现在这里,现有记录给不了答案,我也不打算替它编一个。
修的办法倒不复杂:真的去找一道只有 AC、从来没失败过的题,然后明确断言,这道题不能出现在重练队列里。改完以后,这条测试才第一次有了"挂掉"的可能。
目前确认的恒真断言只有这一处。它不能证明整套测试都没用,但足够提醒我:绿,只能说明那些真正写对的断言通过了。
以后收工前,多走一步
回头看,五轮自审不算白做,每一轮确实修掉了一批真问题。
前五轮审查,基本都围着已有的检查项和实现思路在转。没写进清单的路径,就容易一起漏掉。
至少从这次结果看,Codex 没被前面那串 PASS 带着走。它抓住的是一个很直接的问题:买家既然已经有权益,进题目页以后到底能不能看到题解?
记录里写得很明确:这 7 个 P1 都是内部五轮漏掉的真实场景,前面的审查根本没走到。
![]()
独立会话用付费测试身份从入口走到题目页,亲手打开题解和参考代码
能在本地处理的问题修完以后,26、11、75 又重新跑了一遍,还是全绿。
同样的绿,这一次我信得多一些。因为最关键的那条买家路径,真的走通了。
所以以后就算测试全部变绿,我也会再开一个独立会话,再拿模拟 V3 买家的测试身份,从入口一直走到题目页,把题解和参考代码真的点开。
能看见,也能用,这活儿才算完。