63 个测试全绿,我说修好了,一刷新 bug 还在
签字页给我看别人家的质检报告,这字没法签。
2026-08-29 我在终审台撞见两个 bug,查到底,根因都不在代码逻辑:报告贴错人、产出没登记、服务没重启,全是流程上的窟窿。
那天上午,我打开 IPMS 终审台,准备给「团队#15」的稿子签字。
IPMS 是我自研的内容生产管理系统,FastAPI 后端加 Vue 前端。终审台是稿子发布前我签字验收的地方,我签了,稿子才往外发。「团队#15」是上一篇考核表派单产出的稿子,这里不展开。
来终审台之前,这篇的产线测试已经全绿,我本来是走个流程。
页面上两处不对劲。
质检报告栏里躺着的,是另一篇文章的判卷,《91 分的文章,CSDN 不认》那篇的。标题 Top5 一栏,空的。
我以为是前端串了行,刷新几下,没变。两个真 bug。
一行 glob,把别人家的判卷端了上来
我自己看不出门道,把现象丢给军师。军师是我数字员工团队的总架构师,一个 AI,管出主意、定规矩、盯执行,不碰业务代码。
它两分钟定位到 review.py 里的 _find_qc_report,负责给终审台找质检报告的函数。匹配模式长这样:
QC_REPORT_PATTERNS = ("质监报告*.md", "质监*.md", "zhijian*.md", "品控*.md", "*qc_report*.md")
glob 就是按文件名通配符批量捞文件,"质监*.md"捞所有"质监"开头的 md。
这个函数扫两个目录:篇目专属的 fabu 目录,和母稿所在目录。坑在第二个。所有母稿都住同一个公共目录 notes/AI工作/blog/,glob 按文件名排序,取第一个命中。一篇稿自己没有报告,就把别人的端上来了。
blog/ 里恰好躺着《91 分》那篇的"质监报告_2026-08-26-直出与产线文风AB.md",于是团队#15 拿到了它。
五个匹配模式,没有一条管"这报告是谁的"。
修法是军师定的口径:公共目录里,报告文件名必须含本篇母稿的 slug,也就是去掉日期前缀的那截文件名主干;匹配不上,返回 null。它原话:宁可缺报,不许错报。
Top5 不是没产,是没人登记
第二个 bug 更冤。
我翻产线的 run 目录,yinliu_meta.md 里明明躺着完整的 5 条标题备选,推荐稿评分 90 分。东西产了,系统看不见。
断在登记这一步。落库钩子 hook_chugao.py 只登记了母稿,没登记 meta。按老设计,title_top5 这件产出要等"组包"阶段才登记,可终审台在"母稿成"阶段就要看,自然什么都看不到。
修法:钩子落库时,从母稿 front matter(md 文件开头那几行元数据)里解析 run id,样例长这样:
run: yinliu_lite_kaohe_20260828_235455
顺着 run id 找到 run 目录的 meta,复用组包同一套解析口径提前登记,和组包那次正式登记互不冲突,重复跑也不会重复记账。
动数据库之前先备份,备份文件名 ip.db.bak-top5-20260829-081548。改完对团队#15 实跑补登,五条标题上来了。
测试从 56 个加到 63 个,pytest 全绿。
我以为这事完了。
测试全绿,服务跑的还是旧代码
军师验收完,跟我汇报:修好了。
我点开终审台刷新,回它:张冠李戴还在。
第一反应是修复逻辑有漏。我把改动逐行又看了一遍,代码没问题;测试重跑,63 个还是全绿。查到后来发现,是后端服务压根没重启:uvicorn 启动时没带 --reload 参数,进程 PID 12244 还跑着改之前的旧代码。--reload 是让代码改动自动生效的开关,没开,新代码就只躺在硬盘上。
重启,直连真实库验证:团队#15 的质检报告正确返回"无报告",这篇确实没有自己的判卷文件,缺报如实显示;Top5 五条正常。这才算修完。
63 个测试全绿给我的踏实感,是假的。测试只证明代码对了,证明不了线上跑的是这份代码。
这锅我和军师一人一半:它验收没连真实环境,我看着全绿就信了。后来我跟人说起这事就一句,修完代码 bug 还在,真正的 bug 在我这。
三个盲区,我记成了一张纸
两个 bug 加一个假修复,账算完,全是代码管不着的地方。我整理成一张自检清单,存进了团队规则文件,你的项目有类似结构可以直接拿去用:
| 盲区 | 这次的实况 | 核对方法 |
|---|---|---|
| 贴错归属:公共目录扫描没校验"东西是谁的" | 团队#15 拿到《91 分》的判卷 | 文件名匹配里带归属标识(比如 slug),匹配不上宁可返回空 |
| 漏登记:产出和系统可见之间隔着登记链路 | meta 产了 5 条标题,终审台看不到 | 排障先分清没生产、没登记、没展示,三种情况修法完全不同 |
| 未重启:测试过的是代码,线上跑的是进程 | 63 个测试全绿,旧进程 PID 12244 还在跑 | 修复收口必须重启加真实环境验证,看页面,不看 pytest |
这三条的共同点,是 pytest 一条都测不出来,只能靠流程兜底。
顺带记一笔分工。报 bug 那天我跟军师说的原话是:"改 bug 让代理去干,分析问题,军师你自己来。"落地也是这样:军师定位根因、定修复口径、写验收标准;两个 coder 子代理先后接单,一个管报告归属校验,一个管 Top5 落库链路;军师复核代码、跑测试、直连真实库验证,收口。它没写一行业务代码,但每个修复口径都是它定的。
FAQ
Q1:没有 AI 团队,这套清单对我有用吗?
有用,这三件事跟 AI 没关系。公共目录扫描加归属校验、产出后确认登记链路、改完重启并连真实环境验证,任何项目都用得上,核对一遍花不了多少时间。
Q2:缺报和错报,为什么宁可缺报?
错报是拿着错误信息做决策,我差点拿着别人 91 分的判卷给新稿签字。缺报只是页面上显示"无报告",信息缺失但不误导,补一份就行。
Q3:为什么不让服务自动重载?
可以,开发期给 uvicorn 带上 --reload 就行。我自己更稳的做法是把"重启加真实环境验证"写进验收标准,谁验收谁亲手做一遍,不靠记忆。
Q4:IPMS 开源吗?
目前是我自用的系统,没开源。修法的思路这篇都写透了,够你照着改自己的系统,后续踩坑会持续更新。
我是野生码农,AI 实战派。自研知识库、数字员工、软考备考、量化交易四个系统,全程公开复盘。
本文所有内容均为本人 AI 实战的过程和结果,经 AI 整理后发布,无任何瞎编虚构内容。
这篇来自《AI实战踩坑》系列,下一篇继续拆产线上踩的坑;每个月月底前后有一期月报,真实数据全公开。
关注我,看真的。
野生码农AI实战 · 全网同名
