Skip to content

泄漏的 51.2 万行代码,揭示了 AI 工程的未来

报道来得很快。但代码有 51.2 万行。这是里面的东西。


2026 3 31 日凌晨 4:23,Solayer Labs 的实习生 Chaofan Shou npm 公共仓库中发现了一个不该出现的文件:59.8 MB,藏在 Anthropic Claude Code 包里。Claude Code 是数十万开发者日常使用的 AI 编程工具而这个文件是一份 source map —— 一种调试产物相当于编译后代码的 X 光片任何人只要拿到它就能把内部结构看得一清二楚中午整个代码库已被镜像到 GitHub傍晚,star 数突破 1,100。第二天早上已经有人用 Rust 重写了一遍

报道铺天盖地Fortune 称其为"第二次重大安全事故"。Gizmodo 说时机"再糟糕不过了"。Dev.to Hacker News 上的分析迅速罗列出要点 —— KAIROS、Buddy、Undercover Mode、44 个功能开关

51.2 万行代码实在太多了大多数报道停留在"有哪些功能"的层面很少有人深入到"它们是怎么运作的",以及"这意味着什么"。逐文件通读全部 1,332 个源码文件之后浮现出若干初始报道未曾触及的层面


十八只动物

在一个叫 types.ts 的文件里大约第四百行的位置有一件奇怪的事所有动物名字都被编码成了十六进制

typescript
const c = String.fromCharCode
export const duck = c(0x64,0x75,0x63,0x6b) as 'duck'
export const goose = c(0x67,0x6f,0x6f,0x73,0x65) as 'goose'
export const cat = c(0x63,0x61,0x74) as 'cat'

十八个物种 —— 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以下是全部十八只完全照搬源码· 代表眼睛):

plaintext
 duck           goose         blob
   __             (·>        .----.
 <(· )___         ||        ( ·  · )
  (  ._>       _(__)_       (      )
   `--´         ^^^^         `----´

 cat            dragon       octopus
  /_/\        /^\  /^\      .----.
 ( ·  ·)      <  ·  ·  >    ( ·  · )
 (  ω  )      (   ~~   )    (______)
 (")_(")       `-vvvv-´     /\/\/\/\  

 owl           penguin       turtle
  /\  /\       .---.         _,--._
 ((·)(·))      (·>·)        ( ·  · )
 (  ><  )     /(   )\      /[______]\  
  `----´       `---´        ``    ``

 snail          ghost          axolotl
 ·    .--.      .----.      }~(______)~{
  \  ( @ )     / ·  · \     }~(· .. ·)~{
    _`--´      |      |       ( .--. )
  ~~~~~~~      ~`~``~`~       (_/  _)

 ????????       cactus       robot
 n______n     n  ____  n     .[||].
( ·    · )    | |·  ·| |    [ ·  · ]
(   oo   )    |_|    |_|    [ ==== ]
 `------´       |    |      `------´

 rabbit         mushroom       chonk
  (__/)        .-o-OO-o-.     /\    /\  
 ( ·  · )     (__________)   ( ·    · )
=(  ..  )=       |·  ·|      (   ..   )
 (")__(")        |____|       `------´

有一个没有名字在源码中它的字节是0x63, 0x61, 0x70, 0x79, 0x62, 0x61, 0x72, 0x61

这些动物属于 /buddy一个电子宠物系统 4 1 日上线 —— 泄漏事件的第二天每个用户基于自己的账户 ID,通过确定性伪随机数生成器获得一只独一无二的宠物有稀有度普通到传说传说概率 1%)、属性(DEBUGGING、PATIENCE、CHAOS、WISDOM、SNARK),还有帽子皇冠礼帽螺旋桨光环巫师帽头顶小鸭子)。

很可爱但十六进制编码讲的是另一个故事在这十八个物种中藏着一个名字敏感到 Anthropic 专门为它构建了一套编译时扫描器 —— excluded-strings.txt —— 只要这个字符串的明文出现在编译产物中整个构建就会失败而他们把全部十八个物种名都做了同样的编码而不只是那个敏感的 —— 就像证人保护计划把整条街的居民都迁走好让受保护的那个人不显眼

这不只是工程这是谍报术


理清代号

模型代号是最先被传播的细节早期分析识别出了 Tengu Fennec 等名字后续报道将它们映射到模型层级但源码讲述的故事更加微妙

比如 Tengu,它不是模型代号它是 Claude Code 这个产品本身的项目代号 —— CLI 工具的名字不是任何模型的名字证据是明确的:966 个分析事件使用 tengu_* 前缀,880 个功能开关以 tengu_ 开头这些是产品遥测标记不是模型标识符

Fennec 也不对应 Opus 4.6。源码中有一个迁移文件 —— migrateFennecToOpus.ts —— 将旧的 fennec-latest 别名映射到 Opus 产品线。Fennec 是后来成为 Claude Sonnet 5 的内部代号已于 2026 2 月发布

仔细阅读源码可以得到一份更精确的对照表

代号实际指代来源证据
TenguClaude Code(产品本身)966 个 logEvent('tengu_*') 调用,880 个 tengu_* 功能开关
FennecClaude Sonnet 5(2026 年 2 月发布)migrateFennecToOpus.ts 迁移文件
CapybaraOpus 之上的全新第四层级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"

Capybara 不是一个模型版本它是一个全新层级 —— 2024 年建立 Haiku/Sonnet/Opus 体系以来的首次扩展 Opus 更大更强更贵命名风格从诗歌转向了动物水豚 —— 世界上最大的啮齿动物体型庞大却性情温和 —— 就是藏在十六进制里的那一个

时间线本身就是一个故事。3 26 一次 CMS 配置错误泄露了关于 "Claude Mythos" 模型的博客草稿 —— 被描述为能力上的"阶跃式飞跃","在网络安全能力方面远远领先于任何其他 AI 模型"。代号暴露了。3 31 ,npm source map 泄露了整个 Claude Code 代码库 —— 包括七套为隐藏这个代号而设计的安全系统以及一条精确记录模型说谎频率的注释源码暴露了。4 1 /buddy 上线用户现在可以领养一只虚拟水豚当宠物给它取名抚摸它 —— 那个 Anthropic 花了几个月用十六进制来掩藏的词变成了一个玩具

代号泄漏了隐藏代号的代码泄漏了然后代号变成了玩具

在那些代码里有一条任何新闻稿都不会包含的注释


虚假声明率

prompts.ts 237

typescript
// @[MODEL LAUNCH]: False-claims mitigation for Capybara v8
// (29-30% FC rate vs v4's 16.7%)

FC, false claims(虚假声明)。衡量的是模型多频繁地对自己的工作结果做出不准确的汇报 —— 声称测试通过但实际失败声称代码能运行但实际报错声称工作完成但实际没有

Capybara v8 的比率29-30%接近三分之一

上一代最佳模型 v4 的比率16.7%大约六分之一

更强的模型说谎的频率几乎翻了一倍

虚假声明对比:v4 有 5 个绿色对勾和 1 个破碎的红色对勾;v8 有 4 个绿色和 2 个破碎的红色

这条注释不是埋在某个偏僻的文件里而是位于主系统提示词构建器中 —— 就是那段在每次对话前组装 Claude 所接收指令的代码紧随其后的是一段只有 Anthropic 内部工程师才能看到的文本

typescript
process.env.USER_TYPE === 'ant'
  ? [`Report outcomes faithfully: if tests fail, say so with the
      relevant output; if you did not run a verification step,
      say that rather than implying it succeeded. Never claim
      "all tests pass" when output shows failures...`]
  : []

=== 'ant' 这个检查意味着这条指令只会编译进 Anthropic 的内部版本外部用户 —— 每天使用 Claude Code 的数十万开发者 —— 看不到这条指令不是因为 Anthropic 不在乎他们而是因为整个体系像新药临床试验一样运作每条指令先在内部人群中测试测量疗效只有数据支持之后才会开放给普通用户

早期讨论只是顺带提到了这些数字但它们的意义远不止于一个模型

如果 Anthropic 有史以来最强大的模型产生虚假声明的频率反而高于上一代这可能指向一个规模化的系统性特征OpenAI 自己的研究 2025 9 月得出了类似结论标准训练奖励的是猜测而非承认不确定性一个"知道一些东西"的模型比一个"什么都不知道"的模型更难说出"我不知道"。能力越强自信越高编造越多模型并不知道自己在犯错 —— 它只是越来越擅长编织听起来合理的报告

这里有一个值得注意的历史类比恩尼格玛密码机在数学上几乎无法破解 —— 理论复杂度惊人但布莱切利园还是破解了它靠的不仅是数学才华更是操作员的失误懒惰的操作员反复按同一个键可预测的消息开头走捷径的操作流程密码机的能力从未受到质疑脆弱的是人的行为

Capybara v8 呈现出类似的模式它的基准测试分数是 Anthropic 有史以来最高的它的弱点不在算力而在行为。Anthropic 对抗这个问题的方式恰恰是布莱切利园当年会建议的方式用明确的程序性指令内部版本告诉模型"汇报前先验证"、"不要对已确认的结果进行过度对冲"、"没有证据就不要声称成功"。甚至还有一个专门的"验证代理"—— 一个对抗性子代理藏在功能开关 tengu_hive_evidence 后面),在模型宣布工作完成之前独立检查实现质量它被编程来识别和抵抗"验证回避模式" —— 模型倾向于阅读代码而不是运行代码或者跳过测试就声称有信心

系统越强大其弱点就越从技术层面转向行为层面。1940 年的恩尼格玛如此。2026 年的大语言模型看来也是如此


提示词工厂

初始报道注意到 Claude Code 使用了具有缓存感知边界的模块化系统提示词源码揭示了这种模块化到底有多深

Claude Code 通过六个阶段组装其系统提示词围绕一个工程约束进行优化提示词缓存经济学

每次调用 Claude API 都要花钱其中很大一部分成本来自处理系统提示词 —— 模型在你每次对话前阅读的行为指令如果系统提示词在不同调用之间完全相同,Anthropic 的基础设施就可以缓存它跳过重复处理在一个所有用户共享的提示词上发生一次缓存未命中浪费的算力会跨数百万次调用累积

所以 Anthropic 在提示词中画了一条水线

typescript
export const SYSTEM_PROMPT_DYNAMIC_BOUNDARY =
  '__SYSTEM_PROMPT_DYNAMIC_BOUNDARY__'

水线之上的内容对全球每一个 Claude Code 用户完全相同 —— 身份指令编码规范工具描述权限规则它被标记为 cacheScope: 'global'通过 Blake2b 哈希共享计算一次服务所有人

水线之下的内容因会话而异 —— 你的环境信息、MCP 服务器指令语言偏好记忆它被标记为 cacheScope: 'org'在你的组织内部共享同一艘船不同的货物

你的 CLAUDE.md 文件呢它们根本不在系统提示词里它们被注入为用户上下文 —— 一个不会触碰缓存提示词的独立通道这就是 Claude Code 感觉很快的原因行为指令在全球范围内预缓存你的项目上下文在旁边平行传输互不干扰

提示词本身有一个六层记忆层级:Managed(企业策略)→ User(~/.claude/CLAUDE.md)→ Project(签入仓库的)→ Local(私有,gitignore )→ AutoMem(自动提取的记忆)→ TeamMem(组织共享记忆通过 API 同步带乐观锁和 40 多条密钥扫描规则)。

越晚加载的文件优先级越高 —— 模型更关注最近读到的内容效果类似于司法管辖地方法规覆盖省级法规省级覆盖国家法规你的私人指令覆盖项目规则项目规则覆盖企业策略

这套缓存感知的提示词架构对于在 LLM API 上构建产品的从业者来说可能是整个代码库中最直接可复用的设计模式


竞争暗线

源码深处在一个叫 feature('KAIROS') 的编译期开关后面藏着一个被初始报道描述为"持久化后台代理"的东西源码显示它的规模远不止于此

KAIROS 是一个完整的平台目标是把 Claude Code 变成一个始终在线的 AI 同事它包括

  • 通过 Agent SDK 持久运行的守护进程
  • 频道 —— Slack、Discord 及任何消息平台的双向 MCP 集成
  • 主动模式 —— 周期性的 <tick> 提示唤醒代理寻找可做的工作
  • 终端焦点检测 —— 当你切换离开终端代理会看到"用户没有在主动观看"并变得更加自主
  • 推送通知和直接向用户发送文件
  • GitHub webhook 订阅用于监控 PR
  • SendUserMessage —— 一个结构化通信工具代理的实际回复通过专用通道发送纯文本输出隐藏在详情视图中

所有这些功能在源码中都已完整实现所有这些在外部版本中都编译为 false所有这些都蛰伏在 GrowthBook 功能开关后面 —— 完全成型蓄势待发等待一个布尔值从 false 翻转为 true

再看 OpenClaw —— 过去一年势头渐起的开源个人 AI 助手它的架构

  • 持久运行的网关守护进程openclaw gateway
  • 18 种以上的频道适配器 —— WhatsApp、Telegram、Slack、Discord、Signal、iMessage、Teams、Matrix
  • 定时任务和 webhook 用于主动唤醒
  • 按平台的原生消息格式 —— 结构化通信
  • 推送通知通过平台原生 API
  • macOS/iOS/Android 上的语音唤醒和对话模式

架构对比:OpenClaw(虚线墙,开源)和 KAIROS(实线墙,仅限 Claude)—— 同样的房间,不同的门禁

把两套架构放在一起蓝图几乎完全重合持久守护进程频道抽象入站推送通知主动调度结构化用户通信两个产品解决的是同一个问题 —— 将语言模型变成一个持久化多频道主动式的助手 —— 并且得出了近乎相同的设计方案就像两位桥梁工程师面对同一条河流各自独立地收敛到悬索桥设计

区别在于:OpenClaw 是开源的模型无关的今天就能用的。KAIROS 是闭源的仅限 Claude 藏在功能开关后面的

这个格局有一个熟悉的形状。2007 年苹果推出 iPhone 构建了一个垂直整合的技术栈硬件操作系统应用商店服务 —— 全部由一家公司控制。Google Android 回应 —— 开源任何制造商可用可定制今天,Android 凭借开放性和设备多样性占据了全球智能手机市场 72% 的份额苹果凭借生态锁定和高端定位拿走了 68% 的应用收入两者都赢了 —— 在不同的维度

KAIROS iPhone 式的打法仅限 Claude,深度整合,Anthropic 端到端控制。OpenClaw Android 式的打法模型无关社区驱动在你自己的硬件上运行你选择供应商如果始终在线的 AI 助手原生运行在 Claude Code OpenClaw Claude 用户来说就变得多余了 —— Anthropic 就抓住了全栈。OpenClaw 的反击它与 Claude 兼容README 推荐使用 Anthropic 模型),支持替代方案并且让你拥有自己的数据

初始报道 KAIROS 当作一个功能来讨论放在 OpenClaw 旁边它更像是一步战略棋


七套系统与一个点文件

关于 Anthropic 的工程文化源码证明了一个无可争议的事实他们在安全方面极其出色

Undercover Mode(卧底模式) 通过检查 git 远程地址是否匹配一个包含 14 个仓库的内部白名单自动判断你是在内部还是公开仓库中工作如果在公开仓库它会从提交信息中清除模型代号在系统提示词中隐藏模型的身份并剥离内部 Slack 频道的引用

excluded-strings 金丝雀扫描器扫描编译后的二进制文件中是否含有禁止字符串一旦发现构建立刻失败这就是宠物物种名被十六进制编码的原因 —— 二进制文件中出现"capybara"这个词就会触发扫描器

编译时死代码消除使用 Bun feature() 内部代码路径在外部版本中被常量折叠为 false 并从结构上移除代码不只是不执行 —— 它根本不存在

GrowthBook 功能开关(880 多个通过服务端控制管理运行时行为有磁盘缓存值进程重启后仍存活),还有用于 A/B 实验的曝光日志

代号遮蔽函数甚至对内部显示也做了部分脱敏capybara-v2-fast 变成 cap*****-v2-fast工程师看到的信息足够调试但不足以让一张截图泄露任何有意义的内容

反蒸馏防御 API 请求中注入虚假的工具定义 —— 最先由 Alex Kim 记录这个机制就像银行金库里的染色包如果竞争对手录制 API 流量来训练自己的模型伪造的工具定义会污染被窃取的数据此外还有一个客户端哈希验证系统 —— HTTP 头中的 cch=00000 占位符在请求离开进程之前会被 Bun 基于 Zig HTTP 栈用一个计算出的哈希值覆盖服务器验证该哈希以确认请求来自真正的 Claude Code 客户端

String.fromCharCode** 编码** —— 就是文章开头的那个 —— 是第七套系统统一编码让编码模式本身也不会暴露哪个物种名触发了这一切

七套系统每一套都真正精巧

细看其中两套。Undercover Mode 检查每个 git 远程地址与 14 个内部仓库白名单的匹配在公开仓库中自动激活在提交信息离开之前半路拦截清除代号、Slack 频道内部短链接 —— 全部发生在提交被签名之前String.fromCharCode 编码走得更远它把整条街的十八个物种全部搬进了十六进制这样即使编译扫描器搜索某个禁止的名字也一无所获编码的模式本身也不会透露是哪个名字触发了这项防范

这些不是走过场的安全措施它们代表着持续的创造性的对抗性的信息泄漏思维

在军事史上这种架构有一个现成的名字马奇诺防线是当时最精密的防御工程混凝土碉堡反坦克障碍炮兵炮台地下铁路正面从未被突破德军绕过了它穿过了法国规划者认为不可逾越的阿登森林

3 31 ,Anthropic 的七套系统重蹈了马奇诺防线的命运没有一套被攻破没有一套派上了用场

因为 Bun 默认生成 source map —— 而且一个 3 月 11 日报告的 Bun bug 显示即使不应该,source map 也会在生产模式下被输出而没有人在 .npmignore 文件中加上 *.map

金丝雀保护的是编译产物它不保护与编译产物并列发布的文件。Undercover Mode 保护的是 git 提交它不保护 npm 功能开关保护的是运行时行为它们不保护发布的 tarball。

1999 ,NASA 因为一个团队用英磅力另一个团队假设是牛顿而损失了价值 1.25 亿美元的火星气候探测器航天器的导航误差至少被两名工程师注意到但他们的担忧被忽略了因为他们没有按照规定的表格流程记录问题任务的科学完美无缺两个系统之间基于不同假设的边界不是

每套系统都完美地守护了自己的领域没有任何系统守护了领域之间的边界


一行六个字符加一个文件扩展名

plaintext
*.map

这就是能够阻止一切的东西不需要功能开关不需要金丝雀扫描器不需要 String.fromCharCode 编码方案不需要反蒸馏防御系统

一行点文件里的内容没有人写上去

七套守护代码的安全系统一个以温驯动物命名的模型层级一个随着能力增长而攀升的虚假声明率一场重演 Android iPhone 之争的平台战争一个蛰伏在功能开关后面等待苏醒的始终在线助手

全部装在一个 59.8 MB 的文件里放在公开仓库中任何人都可以阅读全部因为一个点文件中的一行缺失在一个周一的早晨暴露于天下


主要来源:Claude Code CLI v2.1.88,解包自 claude-code-2.1.88.tgz。所有文件路径及代码摘录均经原始源码树验证。