LookMinds
去登录

51.2 万行泄漏代码,透露出 AI 工程的未来走向

2026 年 3 月 31 日凌晨 4:23,实习生寿朝凡 (Chaofan Shou) 发现 npm 仓库里明晃晃地摆着一个 59.8 MB 的文件。

来源:https://lixiaolai.com/articles/2026-04-01/what-512000-lines-reveal

51.2 万行泄漏代码,透露出 AI 工程的未来走向

> 作者:李笑来 · 2026年4月1日 · [原文链接](https://lixiaolai.com/articles/2026-04-01/what-512000-lines-reveal)

*报道来得很快。代码有 51.2 万行。里面有什么,这就摊开来看。*

2026 年 3 月 31 日凌晨 4:23,实习生寿朝凡 (Chaofan Shou) 发现 npm 仓库里明晃晃地摆着一个 59.8 MB 的文件。Anthropic 的 Claude Code 包里 —— 这款 AI 编码工具,有数十万开发者在用 —— 带着一份 source map:这是一种调试产物,像编译后代码的 X 光片;谁拿到手,对着光一照,内部结构就清清楚楚。到中午,整个代码库已经 在 GitHub 上有人做了镜像。到傍晚,它已经有 1,100 stars。到第二天早晨,又有人 用 Rust 重写了它。

报道来得很快。*《财富》(Fortune)* 把这件事称作 “第二起重大安全泄露”。*Gizmodo* 说,它偏偏发生在 “最不该发生的时候”。Dev.to 和 Hacker News 上的分析,很快把亮点列了出来 —— KAIROS、Buddy、Undercover Mode(隐身模式)、44 个功能开关。

可 512,000 行代码,终究不是个小数目。大多数报道只说了功能是什么。更少有人追问它们怎么运作、又意味着什么。把 1,332 个源文件一份份细读下来,会看到好几层东西 —— 前几轮报道都没摸到。

翻到 `types.ts` 的 400 行开外,会碰见一处异样。每个动物名都写成了十六进制:

一共十八个物种 —— duck、goose、blob、cat、dragon、octopus、owl、penguin、turtle、snail、ghost、axolotl、robot、rabbit、mushroom、chonk —— 再加一个。写法全都一样。像是有人费了很大劲,只为让这些词本身永远别出现在编译后的二进制里。

上面的注释写着:*“One species name collides with a model-codename canary in excluded-strings.txt.”*(某个物种名会和 `excluded-strings.txt` 里的模型代号金丝雀冲突。)

是哪一个?代码没说。至少这里没说。

不过,画像倒在 —— 手工画出的 ASCII 像素图,就和那串十六进制一起,放在 `sprites.ts` 里。下面这十八个,全都来自源码原样(`·` 表示眼睛):

少了一个名字。源码里,它的字节是:`0x63, 0x61, 0x70, 0x79, 0x62, 0x61, 0x72, 0x61`。

这些动物属于 `/buddy` —— 一个 4 月 1 日上线的拓麻歌子 (Tamagotchi) 风格陪伴宠物;而那一天,正好是泄漏后的第二天。每个用户都会拿到一只确定性的宠物:系统把 account ID 喂给带种子的伪随机数生成器,再算出来。它有稀有度档位(common 到 legendary,1% chance)、属性(DEBUGGING、PATIENCE、CHAOS、WISDOM、SNARK),还有帽子(crown、tophat、propeller、halo、wizard、tinyduck)。

这设计很讨喜。可十六进制编码指向的,是别处。那十八个物种里,藏着一个敏感到这种地步的名字:Anthropic 甚至写了个编译期扫描器 —— `excluded-strings.txt` —— 只要输出里出现那个字面字符串,整次编译就直接失败。更耐人寻味的是,他们把 *全部* 十八个物种都按同一套方式编码,不只藏那个敏感名字 —— 就像证人保护计划,不是挪走一个人,而是把整条街一并迁走,免得真正要保护的身份显得突兀。

这不只是工程 —— 这是做隐蔽工作的手艺。

模型代号,是最早传开的细节。早期分析 认出了 Tengu、Fennec 这些名字;VentureBeat 的后续报道 又把它们对应到模型档位上。可源码给出的信息更准。

先说 Tengu。它不是模型代号,而是 **Claude Code 这个产品本身的项目代号** —— 指的是 CLI 工具,不是哪一款模型。证据很硬:966 个埋点事件都用 `tengu_*` 前缀;880 个功能开关以 `tengu_` 开头。这是产品遥测标记,不是模型标识。

再看 Fennec。它也不是 Opus 4.6。源码里有个迁移文件 —— `migrateFennecToOpus.ts` —— 把旧的 `fennec-latest` 别名迁到 Opus 产品线。Fennec 是后来成了 **Claude Sonnet 5** 的那个代号;Claude Sonnet 5 在 2026 年 2 月发布。

再往下读,能拼出一张更精确的对照表:

| 名称 | 它指什么 | 我们怎么知道 |
| — | — | — |
| **Tengu** | Claude Code(产品) | 966 次 `logEvent('tengu_*')` 调用,880 个 `tengu_*` 功能开关 |
| **Fennec** | Claude Sonnet 5(2026 年 2 月发布) | `migrateFennecToOpus.ts` 迁移文件 |
| **Capybara** | Opus 之上的 **第四个模型档位** | `prompts.ts` 注释:“Capybara v8” “capy v8 counterweight” |
| **Mythos** | 首个 Capybara 档产品(3 月 26 日经 CMS 泄漏) | 《财富》(Fortune) 报道,Anthropic 博客草稿 |
| **Numbat** | 尚未发布的下一代模型 | `prompts.ts:402`:“Remove this section when we launch numbat”(“numbat 上线后删掉这一段”) |

Capybara 不是某个 model version。它是一个 **新档位** —— 自 2024 年 Anthropic 建立 Haiku/Sonnet/Opus 这套层级以来,第一次往上再加一层。比 Opus 更大、更强、更贵。命名也从诗学转向了动物。Capybara —— 也就是水豚,世上最大的啮齿动物,个头庞大,性子却温和 —— 就是那只藏在十六进制里的动物。

这一串事件,排起来很见意思。3 月 26 日,一次 CMS 配置失误 把几篇博客草稿露了出来。草稿谈到一个叫 “Claude Mythos” 的模型,说它在能力上是一次 “step change”,在网络安全能力上 “currently far ahead of any other AI model in cyber capabilities。” 代号先泄了。3 月 31 日,npm 上的 source map 又把整个 Claude Code 代码库掀开 —— 其中包括 7 套拿来藏这个代号的安全系统,还有一条精确记录模型撒谎频率的注释。源码也泄了。4 月 1 日,`/buddy` 上线。用户这时已经可以领养一只虚拟 Capybara,当宠物养、给它起名、摸摸它 —— 而 Anthropic 先前为了藏住这个词,花了好几个月,把它一直写成十六进制。

代号泄了。藏代号的代码也泄了。接着,这个代号成了玩具。

而那堆代码里,有一条注释,新闻稿永远不会写进去。

`prompts.ts` 第 237 行:

FC 指 false claims,也就是虚假声明。这衡量的是:模型会多频繁地把自己的工作结果说错 —— 测试明明没过,它说过了;代码明明跑不通,它说能跑;事情明明没做完,它说做完了。

Capybara v8 的数值:**29-30%**。差不多每 3 次就有 1 次。

上一代里最好的模型,文中记作 v4:**16.7%**。大约每 6 次里 1 次。

能力更强,反倒更常说错 —— 几乎翻了一倍。

这不是埋在什么冷门文件里的角落。它就在主系统提示词构造器里 —— Claude 每次对话前要先读的那套指令,就是在这里拼起来的。紧跟在后面的,还有一段只有 Anthropic 内部工程师看得到的文本:

这个 `=== 'ant'` 检查,意思很明白:这段指令只会编译进 Anthropic 内部 build。外部用户 —— 那些天天在用 Claude Code 的数十万开发者 —— 看不到。不是 Anthropic 不在乎他们,而是这套系统更像药物试验:每一条指令,先在内部人群上试,先看效果,再等数据站稳,才开给大众。

早期讨论 顺手提过这些数字。可它的分量,远不止一款模型。

Anthropic 造过最强的模型,若比上一代更常出现虚假声明,这恐怕指向一种 **随规模扩张而来的系统性属性**。OpenAI 自己的研究 在 2025 年 9 月也得出了相近结论:标准训练奖励的是猜,不是承认不确定;知道一点的模型,反而比一无所知的模型更难说出 “I don't know”。能力越强,信心越足,编造越多。模型并不知道自己错了 —— 它只是更会拼出一份听起来像真的报告。

找个历史类比,这点就更清楚了。恩尼格玛密码机 (Enigma) 在数学上几乎不可破 —— 它的理论复杂度高得惊人。布莱切利园 (Bletchley Park) 最后还是把它拆开了,可靠的不是纯粹的数学天才,而是 **操作员的失误**:有人懒,反复按同一个键;有人爱用固定开头;有人在流程上偷懒。机器的能力从来没人怀疑。脆弱之处,在行为里。

Capybara v8 也是这一路数。它的 benchmark scores 是 Anthropic 目前最高。它的弱点不在计算 —— 在行为。Anthropic 对付它的办法,也很像布莱切利园可能会给出的建议:把流程写死,明文要求。内部 build 会告诉模型,报告前先验证;一旦结果已经确认,就别再含糊其辞;没有证据,就不准宣称成功。甚至还有一个专门的 “验证代理” —— 一个带对抗性质的子代理,挂在 `tengu_hive_evidence` 这个功能开关后面 —— 在模型汇报完成之前,先独立检查实现结果。它专门识别并顶住那些 “规避验证的惯用套路” —— 模型宁可读代码,不肯真跑;宁可跳过测试,也要装出把握十足。

系统越强,弱点越往技术之外滑,越落到行为上。1940 年的恩尼格玛密码机如此。2026 年的大语言模型,看上去也如此。

VentureBeat 的最初报道 提过,Claude Code 用的是模块化系统提示词,而且边界会顾及缓存。源码让人看见的,是这套模块化到底做到了多深。

Claude Code 把系统提示词拆成 **6 个阶段**,围着一个工程约束来优化:提示词缓存的经济账。

每次调 Claude API 都要花钱。成本里很大一块,来自处理系统提示词 —— 也就是模型每次对话前都要先读的行为指令。若系统提示词在两次调用之间完全一样,Anthropic 的基础设施就能把它缓存起来,省掉重复处理。一个本该全体用户共用的提示词,只要 miss 一次 cache,就会把算力白白烧掉,规模是几百万次调用。

于是 Anthropic 在提示词里划了一道水线:

水线 **上面**,对全世界每个 Claude Code 用户都一模一样 —— 身份指令、编码准则、工具说明、权限规则。它带着 `cacheScope: 'global'` 这个缓存作用域标签,通过 Blake2b hash 共享。算一遍,所有人共用。

水线 **下面**,则跟 session 走 —— 每个用户的环境信息、MCP 服务器指令、语言偏好、memory。它带着 `cacheScope: 'org'` 这个缓存作用域标签,只在用户所在组织内共享。船体一样,货物不同。

用户的 CLAUDE.md 文件呢?根本不进系统提示词。它们是以 **user context** 的形式注入进去的 —— 另一条通道,不碰那份已缓存的系统提示词。这也解释了 Claude Code 为何手感很快:行为指令先在全球范围缓存好,项目上下文则并排带上,不去搅乱缓存。

而这份提示词本身,还有 6 层内存分层:Managed(企业策略) → User (`~/.claude/CLAUDE.md`) → Project(检入仓库) → Local(私有,gitignored) → AutoMem(自动抽取的 memories) → TeamMem(组织共享 memory,经 API 同步,带 optimistic locking 和 40+ 条 secret-scanning rules)。

文件读入得越晚,优先级越高 —— 模型会更看重刚刚读到的东西。这套效果,像司法层级:地方法压过州法,州法再压过联邦法。用户自己的私有指令,会压过项目规则;项目规则,又压过企业策略。

对今天做 LLM API 应用的人来说,这套顾及提示词缓存的提示词架构,也许是整份代码里最能直接拿去复用的模式。

在源码深处,编译期标记 `feature('KAIROS')` 后面,藏着一样东西。最初的报道 把它概括成 “常驻后台代理”。可源码显示,它远不止此。

KAIROS 不是一个小 feature。它是一整个平台,目标是把 Claude Code 变成一个永久在线的 AI 同事。里面包括:

- 一个经 Agent SDK 常驻运行的 **守护进程**
- **Channels** —— 和 Slack、Discord 以及其他消息平台打通的双向 MCP 集成
- **主动模式** —— 定期发 `tick` 提示,把 agent 唤醒去找活干
- **终端焦点检测** —— 用户一切出终端,agent 就会看到 “the user is not actively watching”,自治程度随之提高
- 直接发给用户的 **推送通知** 和 **文件分享**
- 监控 PR 的 **GitHub webhook** 订阅
- **SendUserMessage** —— 一种结构化沟通工具,agent 真正的回复走专门频道(plain text output 则藏在 detail view 里)

这些东西,在源码里全都 feature-complete。到了外部 build,全部编译成 `false`。它们全都蜷在 GrowthBook 功能开关后面 —— 形体齐全,呼吸暂停,只等一个布尔值从 `false` 翻到 `true`。

再看 **OpenClaw** —— 过去一年里,这个开源个人 AI 助手声量一路往上。它的架构是:

- 一个持续运行的 **网关守护进程**(`openclaw gateway`)
- **18+ 个频道适配器**——WhatsApp、Telegram、Slack、Discord、Signal、iMessage、Teams、Matrix
- 负责主动唤醒的 **Cron jobs 和 webhook**
- 按平台定制的 **频道原生消息**
- 通过平台原生 API 发出的 **推送通知**
- macOS/iOS/Android 上的 **语音唤醒/对话模式**

把两套架构并排摆开,蓝图几乎重合。常驻守护进程。频道抽象。入站推送通知。主动调度。结构化用户沟通。两边都在解同一个题 —— 把语言模型变成一个常驻、连着频道、还能主动出手的助手 —— 最后落到的设计选择,几乎一模一样,像两位桥梁工程师面对同一条河,最后都收敛到悬索桥。

差别在这:OpenClaw 开源、模型无关、今天就能用;KAIROS 专有、Claude-only,还在功能开关后面等。

这种局面,很像旧剧本。2007 年,苹果 (Apple) 推出 iPhone 时,做的是一套垂直整合栈:硬件、OS、app store、services —— 全握在一家公司手里。谷歌 (Google) 随后拿出 Android —— 开源、厂商都能用、也能自行改造。今天,Android 靠开放和设备多样性,占了全球智能手机市场的 72%;苹果 靠生态锁定和高端定位,拿走 68% 的应用收入。两边都赢了 —— 只是赢在不同维度。

KAIROS 走的是 iPhone 路线:Claude-only,深度一体化,从头到尾都攥在 Anthropic 手里。OpenClaw 走的是 Android 路线:模型无关、社区驱动,跑在用户自己的硬件上,后端供应商自己选。若那个常驻 AI 助手直接长在 Claude Code 里,Claude 用户就不再需要 OpenClaw —— Anthropic 把整条栈都收走。OpenClaw 的回手也清楚:它本来就能和 Claude 一起用(README 里就推荐 Anthropic 的模型),也支持别的模型,还让用户把数据握在自己手里。

前 一轮报道 把 KAIROS 当成功能来读。把它和 OpenClaw 并排一放,它更像一步战略棋。

有一件事,Anthropic 的工程文化在源码里已经证明得不能再明白:他们的安全做得极好。

**Undercover Mode(隐身模式)** 会拿 git remote 去对 14 个仓库的 allowlist,自动判断当前仓库是内部还是公开。若仓库公开,它就把 commit message 里的模型代号 scrub 掉,在系统提示词里压住模型自己的身份,再删掉内部 Slack 频道引用。

**excluded-strings 金丝雀** 会扫描编译后的二进制,找禁用字符串。只要冒出来,build 就失败。这也解释了那些宠物物种为何统统写成十六进制 —— 二进制里只要出现 “capybara”,扫描器就会报警。

**编译期死代码消除** 用的是 Bun 的 `feature()` 宏。内部代码路径在外部 build 里会被常量折叠成 `false`,结构上直接删掉。它不是跑不到 —— 它根本不存在。

**GrowthBook 功能开关**(880+)负责卡住运行时行为,控制放在服务端,值会缓存在磁盘里,进程重启也还在;同时还会记录曝光,用来做 A/B 实验。

**代号遮蔽函数** 连内部显示都只给一半:`capybara-v2-fast` 会变成 `cap*****-v2-fast`。工程师调试时能看出个大概,截图流出去却没什么信息量。

**反蒸馏防御** 会把假的工具定义塞进 API 请求里 —— 这一点,Alex Kim 最先写出来。它的工作方式,很像银行金库里的染色包:竞争对手要是把 API 流量录下来,拿去训练竞品模型,掺进去的诱饵工具就会把那批偷来的数据染脏。另一头,还有一套**客户端哈希校验**:HTTP headers 里先放一个 `cch=00000` 占位符,等请求发出前,Bun 的 Zig 实现的 HTTP 栈会把它改写成计算出的 hash。服务器再验这个 hash,确认请求确实来自真正的 Claude Code 二进制。

**把十八个物种都写成** —— 也就是我们一开头看到的那套 —— 是第七套系统。统一编码,模式本身也就泄不了密:你看不出哪个物种才是代号。

七套系统。每一套都真有巧思。

只看两套就够了。Undercover Mode 会把每个 git remote 的 URL 都拿去对 14 个内部仓库的 allowlist;仓库一旦公开,它立刻自动启动,在 commit 签名之前半路截住 commit message,把代号、Slack 频道、内部 shortlink 一并 scrub 掉。`String.fromCharCode` 那套还要更进一步:它把十八个物种整个街区都搬进十六进制里,于是 build scanner 去 grep 那一个禁词,什么也抓不到;连编码模式都看不出,究竟是哪一个名字惹出了这道防线。

这不是打勾交差式的安全措施。这里面是长期的、创造性的、带对抗意识的思考 —— 思考信息究竟会从哪里漏出去。

军事史上,这种架构有个现成名字。马奇诺防线 (Maginot Line) 是它那个时代最精密的防御工程:混凝土碉堡、反坦克障碍、炮兵掩体、地下铁路。正面强攻,从没人打穿它。德国绕过去了,从法国规划者认定 “根本过不来” 的阿登森林 (Ardennes Forest) 穿了过去。

3 月 31 日,Anthropic 那七套系统,命运和马奇诺防线一样。没有一套被攻破。也没有一套派上用场。

Bun 默认会生成 source map;而 3 月 11 日报出的一个 Bun bug 还说明,即使进了 production mode,本不该对外的 source map 也照样会被提供出去。偏偏 `.npmignore` 里又没人写上 `*.map`。

金丝雀守的是 **build output**。它守不住和产物一起 shipped 出去的东西。Undercover Mode 守的是 **git commits**。它守不住 npm packages。功能开关守的是 **runtime behavior**。它们守不住 tarball。

1999 年,NASA 因为一边用 pounds-force 表示推力,另一边却按 newtons 理解,丢掉了 价值 $125 million 的火星气候探测者号 (Mars Climate Orbiter)。飞船导航误差其实 至少有两位工程师已经注意到,可他们的担忧没被采纳,只因没有按流程备案。任务的科学本身毫无问题。出问题的,是两个系统在交界处的假设不一致。

每套系统都把自己的地盘守得很好。没有一套系统去守地盘与地盘之间的边界。

就一行。六个字符,再加一个文件扩展名。

```
*.map
```
真正能拦下整件事的,就是它。不是功能开关。不是金丝雀扫描器。不是 `String.fromCharCode` 编码方案。也不是反蒸馏防御系统。

只是 dotfile 里缺掉的一行。

七套守代码的安全系统。一个名字取自温顺得可以当宠物的动物的模型档位。一个会随能力增长而攀升的虚假声明率。一场映照 Android 与 iPhone 的平台战争。一个蜷在功能开关后、等着醒来的常驻助手。

这些,全都塞在一个 59.8 MB 的文件里,躺在公共 registry 上,谁都能读。把它们全掀出来的,只是一个 dotfile 里缺掉的一行 —— 偏偏又发生在那个星期一早晨。

*第一手来源:Claude Code CLI v2.1.88,解包自 **`claude-code-2.1.88.tgz`**。**文中所有文件路径与代码摘录,均已对照原始源码树核验。*

版权声明:© 超限思维 · LookMinds。本页为己方整理的亲口亲笔原稿处理稿/编者新译,非原文替代;原文版权归原作者/平台。本人原作请回原链。