这周,我们一篇文章上线时,“Verboo Code”前面粘错了词,直到三种语言全部发布后才有人发现。另外三篇文章里,中文草稿用了半角逗号,而不是全角逗号。修复方法一直都有,只是靠有人盯着屏幕仔细看。我们把这个流程换成了一个脚本,用已经发生过的真实错误做测试,测试过程中还在脚本本身里发现了一个漏洞。
这周博客漏掉了什么错误?
2026年9月21日到23日之间,至少发生了四次,问题总是同一对:中文草稿里多余的半角标点,或者“Verboo Code”前面的葡萄牙语冠词性别错误(这个品牌在葡萄牙语里永远是阴性,“a Verboo Code”)。其中一次直到发布后才被发现。
| 日期 | 文章 | 错误 | 发现时间 |
|---|---|---|---|
| 9月21日 | /rewind | 中文草稿里的半角逗号 | 发布前,视觉检查时发现 |
| 9月22日 | Kimi K3 vs Claude Fable 5 | 中文草稿里的半角逗号和冒号 | 发布前,用现场写的脚本发现 |
| 9月23日 | Codex CLI 的 /resume | “Verboo Code”前的葡萄牙语性别错误 | 三种语言全部发布后才发现,用取消发布再重新发布修复 |
| 9月23日 | Codex,432 Workspace routing 错误 | 中文草稿里的半角逗号 | 发布前,视觉检查时发现 |
为什么视觉检查靠不住?
因为这种错误太小,眼睛不可能每次都注意到。两百个中文字符中间的一个半角逗号,占的宽度和全角逗号几乎一样,没有人会一个标点一个标点地量。性别错误更糟:错误的形式在葡萄牙语语法上完全正确,只是对这个品牌来说是错的,所以没有任何地方会跳出来提醒你。
9月23日那次错误,经过了写作的人、生成翻译的人、发布前检查的人,三道关都过了,还是上线了。它只在发布之后的一次检查里才浮现出来,而那时文本已经在线上了。
我们写的这个脚本是怎么工作的?
四项检查,每一项都建立在一个正则表达式上,在第一次发布前就跑一遍草稿的HTML,而不是只在发布后跑:
python3 checar_padrao.py draft.html pt
python3 checar_padrao.py draft.html zh
其中性别检查是葡萄牙语专属的,因为英文和中文在这里都没有语法性别的问题:
GENERO = re.compile(
_B_INI + r"(o|do|no|ao|dos|nos|aos)\s+Verboo\s+Code" + _B_FIM,
re.IGNORECASE,
)
另外三项检查用的是同一套边界逻辑:一项抓文本任何位置的两种破折号(Unicode字符U+2014和U+2013);另一项抓贴着中文字符(范围U+4E00到U+9FFF)的半角逗号、冒号或分号;最后一项抓Verboo Code已经不再提供的那个优惠的名字。找到问题就返回退出码1,所以可以当作发布前的一道关卡,不用靠人记得去看屏幕。
脚本自己掉进的陷阱
第一版里,性别检查和旧优惠检查用的都是Python默认的单词边界\b。用一句真实的中文句子测试,一个葡萄牙语单词紧贴在一个汉字后面,中间没有空格,脚本什么都没找到。原因是:Python的\b把中文汉字当成单词字符处理,所以汉字和后面的字母之间根本没有边界。这项检查恰好在标点问题最常见的语言里失灵了。
修复方法是把\b换成一个只把拉丁字母或数字算作单词一部分的自定义边界:
_B_INI = r"(?<![A-Za-zÀ-ÿ0-9_])"
_B_FIM = r"(?![A-Za-zÀ-ÿ0-9_])"
修好之后,同样的测试就能抓到贴着汉字的那个单词,连同旁边的半角标点一起。
脚本真的能抓到已经发生过的错误吗?
我们用两个真实案例的重现版本,加一段干净的文本做对照,测试了一遍:
| 输入 | 结果 |
|---|---|
| 重现9月23日性别错误的句子 | 失败:找到了“Verboo Code”前的错误形式 |
| 一句贴着汉字的半角逗号和冒号的中文句子 | 失败:两处都找到了 |
| “Verboo Code保存会话。标点正常,完全没问题。” | 正常:什么都没找到 |
把这个脚本跑一遍这篇文章自己的三个草稿,pt、en和zh,结果什么都没找到。这说得通:为了解释错误而不重复错误,这段文字用描述代替了原句的完整重现,所以没有留下任何东西让检查误认成新的错误。测试表格里用描述而不是原句,也是同一个原因。
写这个脚本、测试它、在检查本身里发现一个漏洞并修好,这些事一个上午就做完了,因为没有一次尝试的成本很高。用Verboo Code,套餐内的token是无限的,所以第五次尝试和第一次花的钱一样多。



