三周前撞过一次 Fable 5 的误判——写 WebRTC P2P 传输需求,被它的网络安全分类器当场踢给 Opus 4.8(详见《Fable 5 把我写 WebRTC 的需求当成了网络攻击》)。今天在 ~/Codes/api 跑一个常规任务——审计代码、修复问题、最后写篇博客总结——同一个账号,同一个 fallback 机制,又中了一次。这次不一样的地方在于:触发点不是我打的字,是模型自己在写博客草稿时生成的一段内容,被它自己的安全层标记了。顺手把这次的排查过程和背后的时间线记一下。
排查过程
会话记录都在 ~/.claude/projects/-Users-lishuyu-Codes-api/ 下,每个会话一个 .jsonl 文件。先用 jq 扫全部会话,找 model_refusal_fallback 这个 system 事件:
for f in *.jsonl; do jq -c 'select(.type=="system" and .subtype=="model_refusal_fallback")' "$f"done命中两条,一条是三周前那次 WebRTC,另一条是今天 2026-07-02T10:47:00Z(北京时间 18:47),落在会话 fd8ac9ab-5886-433a-85b6-02ab167a979e.jsonl 里,工作目录 /Users/lishuyu/Codes/api。这个会话的起点是我在另一个窗口发的任务:「Do a full audit review simplify and refactor and fixes and docs updates and also at last write a blog」——先审计修复,最后写博客收尾。
往前翻这条会话的时间线:18:46:44 模型说了句「风格参考就位。写正文。」,说明它已经读完风格参考、准备开始写博客正文;紧接着 18:47:00,下一条消息的内容直接变成:
{"type":"fallback","from":{"model":"claude-fable-5"},"to":{"model":"claude-opus-4-8"}}同一时间戳还有一条 system 消息,trigger 字段写的是 "refusal":
This model’s safeguards flagged this message. This sometimes happens with safe, normal conversations. Switched to Opus 4.8.
跟三周前那次几乎一样的措辞。但这次多看了一眼这条记录里的两个字段:apiRefusalCategory 和 apiRefusalExplanation,都是 null——连触发的是哪一类都没告诉你。再往下看,还带了一个 retractedMessageUuids 数组,两个 uuid。我在整个会话文件里搜这两个 uuid,一条记录都搜不到——被标记的那段生成内容,连同它本身,被整个从 transcript 里抹掉了。三周前那次触发点是我自己打的一行字,好歹留了痕迹;这次触发点是模型自己写的东西,事后连一个字都翻不出来。想知道博客草稿里到底哪句话把分类器点着了,做不到,证据被销毁了。
根因
这不是同一套分类器在老问题上又犯了一次,是一套刚换的新分类器上线不到一天就出的岔子。把时间线拼起来:
- 6 月 9 日:Fable 5 / Mythos 5 发布,带着第一版网络安全分类器。
- 6 月 11 日:我撞上 WebRTC 那次误判——旧分类器。
- 6 月 12 日:亚马逊的研究员上报了一个绕过分类器的手法,其中一例甚至让模型吐出了漏洞利用的演示代码。美国商务部以出口管制为由,要求下架 Fable 5 和 Mythos 5,Anthropic 干脆全球下线,一停就是 19 天(详见《「连Haiku都会」》)。
- 7 月 1 日:出口管制解除,Fable 5 重新上线(详见《美国解除出口管制》)。同一天,Anthropic 发了篇《Redeploying Claude Fable 5》,宣布换上了一套新分类器,专门堵亚马逊发现的那个绕过手法,官方数据是「blocks the specific technique in over 99% of cases」。
- 7 月 2 日,不到 24 小时后:我这次撞上的就是这套新分类器。
关键在于 Anthropic 自己在那篇 7 月 1 日的公告里,紧跟着上面那句 99% 之后,写了这样一句:
The new classifier also comes at the cost of flagging benign requests more often during routine coding and debugging tasks.
翻译过来:这套新分类器为了堵死漏洞利用绕过,代价是在日常编码、调试这类任务上会更频繁地误伤正常请求。这不是我的猜测或者旁证,是官方公告原文自己写的 trade-off。我这次撞上的,不多不少,正好是公告里明说的那类场景——/blog skill 跑到一半,在总结一次代码审计的过程中生成内容,被新分类器当场拦下。从新分类器上线到我撞上,中间隔了不到一天。
顺带查了一下 Anthropic 官方帮助中心另一篇文章(support.claude.com/en/articles/15363606),列出了触发 fallback 的四类:offensive cybersecurity(漏洞利用/攻击工具)、biology/chemistry(生化实验方法)、distillation attacks(提取模型内部思维摘要)、frontier LLM development(分布式训练、ML 加速器设计)。三周前那篇 WebRTC 误判文章里引用的 system card 说的是「三个区」(网络安全、生物化学、模型蒸馏),这里多出一个独立的「frontier LLM development」类目——具体是不是这次新分类器上线时新增的分类粒度,我没有官方变更记录能确认,这里只如实记录看到的现状,不做因果推断。
这篇帮助中心文章里还提到一个 Cyber Verification Program,说是给「有正当防御用途」的账号做验证白名单,验证通过后这类内容不会被拦。但我翻了 Anthropic 自己 7 月 1 日的公告原文,里面完全没提这个项目的名字,提到的是另一个东西——一个新开的 HackerOne 项目,收安全研究员提交的 jailbreak 手法用于内部评估。这是两件不同的事:一个(如果存在)是给日常审计工作做验证豁免,另一个是收集攻击样本做防御迭代。我没能在 Anthropic 的官方新闻页面上找到 Cyber Verification Program 的独立公告,只在帮助中心文章里看到这个名字,这里存疑,不确定这套流程目前的实际可申请状态。
解决方案
个人开发者这种规模,大概率够不着 Cyber Verification Program 的门槛(就算它真的可申请)——这类验证机制通常是面向企业安全团队、乙方渗透测试机构设计的,不是给自己审计自己仓库的独立开发者开的。现实的办法只有一个:涉及安全审计、漏洞描述、渗透测试相关措辞的任务,跑之前手动 /model 切到 Opus 或 Sonnet,跳过 Fable 5 这层过滤,跑完再切回来。Fable 5 留给不涉及这几个关键词区的日常任务——写 CRUD、聊天、随笔,这些从三周前到现在都没触发过。
经验总结
三周前那次误判还能算「新模型刚上线,分类器没调好」的解释空间;这次是官方在公告里明确写了「新分类器会更频繁误伤日常编码调试」之后,不到一天,日常编码调试真的被误伤了——不是巧合,是公告承诺(或者说警告)的第一手验证。
更值得记一笔的是触发对象的变化。三周前拦的是我自己发的一行请求文本;这次拦的是模型自己在完成任务过程中生成的内容——写审计总结这种完全防御性质的工作,输出过程本身也会被自己的安全层审查。而且触发之后,被判定有问题的那段内容会被整个从会话记录里撤走,不留痕迹,apiRefusalCategory 字段也是空的。你能确认「发生了 fallback」,但没法确认「因为哪句话」——这条排查链到这一步就断了,只能靠时间线和外部公告拼出大概率的解释,拼不出那一句话本身。
生产力工具里塞进一个不透明的自我审查层,代价不只是多等几秒钟换模型——是调试这一层机制本身的时候,连基本的可观测性都没有。