乐于分享
好东西不私藏

Claude Code 源码泄露后续:对普通用户的启发总结

Claude Code 源码泄露后续:对普通用户的启发总结

51 万行源码泄露,让整个行业第一次看到了顶级 AI 编程工具的内部架构。我并没有研究源码,但我研究和分析汇总了别人研究的结果🤫,这些行业大佬都说站在巨人肩膀上,那我就有幸站在那些站在巨人肩膀上的巨人肩膀上,哈哈,文章有点长,陆陆续续和龙虾搞了两天,今天上午才让他推送的草稿,我读了几遍觉得还是值得仔细看的。我发现它对普通人使用 Claude Code 有非常直接的启发——不是什么高深的技术细节,而是实实在在的使用思路。总结如下:

可以”放着跑”,别傻等

Claude Code 的重试系统设计得极其工程化:最多 10 次重试、带指数退避、遇到 401/403 自动刷新 OAuth token、Opus 连续 3 次 529 错误自动切到 Sonnet、流式输出 90 秒无响应自动切换非流式、持久模式下支持无限重试最大退避 5 分钟。

这不是一个”你问我答”的聊天工具,它被设计成可以无人值守运行的 Agent 系统。

配置好权限和 CLAUDE.md 之后,可以让它在后台跑。API 抖动、限流、短暂故障,它会自己处理,不需要你盯着。比如你要做一个大规模代码重构,设置好之后可以让它跑着,去做别的事,过一会回来拿结果。

当然,这不是说丢给它一个任务就不管了。它仍然需要你设定清晰的边界和规则,规则设得不清楚,它跑得越久偏差越大。

CLAUDE.md 是活的,每轮都在读

Claude Code 不是只在会话开始时读一次 CLAUDE.md,而是每一轮都会重新读取,所以在任务执行过程中你的更改他也是能立即感知到,所以这直接带来一个好处,就是你可以在任务执行过程中去间接修改这个文件干预任务,比如你补充一个要求或者内容背景。你有 4 万字符的空间可以用,源码里叫”prompt budget”。

CLAUDE.md 有层级结构:~/.claude/CLAUDE.md 是全局的,./CLAUDE.md 是项目级的,.claude/rules/*.md 是模块化的,CLAUDE.local.md 是私有笔记(被 git 忽略)。

我的建议是,把 CLAUDE.md 当成经验库而不是说明书。每次 Claude Code 犯了错,你纠正它,然后把经验写进去:架构决策、文件约定、踩过的坑、绝对不要这样做的规则。每一条规则,都会在后续的每一轮对话里生效。一个持续维护的 CLAUDE.md,用得越久越值钱。

有意思的是,创始人 Boris 的 CLAUDE.md 只有约 100 行。超过 200 行就该拆分了,不然规则太多每条被注意到的概率越低。

子 Agent 并行,成本几乎为零

Claude Code fork 子 Agent 时,会创建一个与父上下文完全一致的副本,而 API 会对这个上下文做缓存。所以同时启动 5 个 Agent,成本和顺序执行 1 个差不多。

当你有多个可以并行的任务时,不要串行执行。让它并行:一个做安全审计,一个重构认证模块,一个写测试,一个更新文档,一个修 bug。用 /batch 命令甚至可以自动把大任务分发到几十个 Agent 里同时执行。

不过要注意,并行只适合可以分解的独立任务。如果任务之间有依赖关系,先做哪个后做哪个有讲究,就不适合并行硬拆。

你每点一次”允许”,都是在承认配置失败

源码里有完整的权限配置体系。在 ~/.claude/settings.json 里可以用 glob 模式定义哪些操作默认允许:bypass 完全不做权限检查(危险但极快),allowEdits 自动允许工作目录内的文件编辑,auto 每个操作由 LLM 分类器判断(最平衡)。

源码里有一句话说得很好:每当 Claude Code 弹出”是否允许这个操作”而你点了”是”,这不是一个功能,这是配置失败。

如果你每天都在点”允许”,说明你的权限配置有问题。一次性配置好:允许所有 npm 和 git 命令,允许在工作目录下编辑和写入文件。配置好了之后,Claude Code 应该在你设定好的边界内自主运行。

上下文是你的责任,要主动管理

源码里有 5 种上下文压缩策略:microcompact 基于时间清理旧的工具结果,context collapse 对一段对话进行摘要压缩,session memory 提取关键上下文到文件,full compact 对整个历史进行总结,PTL truncation 丢弃最早的一组消息。还有一个关键细节:大型工具输出会被存储到磁盘,模型只会看到一个 8KB 的预览。

我的经验是,主动用 /compact,不要等系统自动压缩。手动触发时,你可以把在意的上下文一起保留下来。系统自动压缩可能会把你重要的上下文一起”误杀”。把 /compact 当成游戏里的”手动存档点”:保留关键内容,清掉噪音,然后继续推进。

默认窗口是 20 万 tokens,可以用 [1m] 模型后缀扩展到 100 万。在跨多文件的大规模重构中,这个技巧很有用。

另外,当你粘贴一个超大文件问问题时,Claude Code 可能只看到了其中一小部分。输入要尽量聚焦,描述越聚焦,它能处理得越准确。

会话要从第一天开始积累

每一段对话都以 JSONL 格式保存到 ~/.claude/projects/{hash}/{sessionId}.jsonl。支持 –continue 继续上一次会话,–resume 指定恢复某个历史会话,–fork-session 从过去的对话分叉一个新分支。

长会话会积累”session memory”:任务描述、文件列表、工作流状态、错误和经验的结构化信息。这就是为什么继续一个会话比重新开一个更有价值。

用 –continue,一直用,让上下文持续积累。一个持续运行的会话,积累的是你和 Claude Code 在这个项目上的共同历史。它记得你踩过哪些坑,记得你用过什么方案,记得项目的发展轨迹。这些是新会话完全无法替代的。

不要开太多并行的会话。分散在太多 session 里,session memory 就无法有效积累。每个项目保持一个持续运行的会话,比同时开五六个零散的会话价值大得多。

Hook 系统才是真正的扩展 API

源码里有超过 25 个生命周期事件可以被 Hook:PreToolUse、PostToolUse、UserPromptSubmit、SessionStart、SessionEnd 等等。支持 5 种 Hook 类型:command 执行 shell 命令,prompt 通过 LLM 注入上下文,agent 运行完整 agent 校验流程,HTTP 调用 webhook,function 执行 JavaScript 函数。

你可以用它构建真正的自动化工作流:每次写文件前自动跑 lint,每次修改后自动执行测试,任务完成后自动发 Slack 通知,代码发布前自动校验安全规范。

最有意思的是 UserPromptSubmit Hook:你可以在每一条消息发送时自动注入 additionalContext——比如最近的 git diff、当前测试结果、项目状态——不需要手动复制粘贴。

有副作用的操作(跑数据库迁移、部署、发邮件)建议加 disable-model-invocation: true,防止 Agent 在不合适的时机自动触发。

随时打断,没有代价

整个执行链路是基于 async generator 的流式架构。按下 Escape 可以干净地中断当前响应,同时不会丢失已有上下文。被中断的输出被干净丢弃,没有任何惩罚。

不要傻等一个你知道走偏的回答。立刻打断,重新引导。Claude Code 被设计成交互式的,不是为”提交任务等结果”设计的。像结对编程一样:如果你的搭档开始写错方向,你会直接说”等等,换个思路”,保持这个节奏。

打断是干净的,但频繁打断也不好。每次打断都意味着上下文需要重新对齐。如果你发现自己经常需要打断 Claude Code,说明初始的指令不够清楚,先想清楚再问。

它还藏了一个宠物系统

源码里还泄露了一个彩蛋功能:Buddy 宠物模式。本来是计划在愚人节(4月1日)上线的惊喜,结果源码提前一天泄露,这个彩蛋也随之曝光。

输入 /buddy 就能孵化一只专属于你的 ASCII 小宠物,它会蹲在终端输入框旁边,偶尔冒出来发表几句评论。要抚摸它让屏幕上飘过爱心,用 /buddy pet。想看它完整的状态卡(物种图鉴、稀有度等级、五维属性),用 /buddy card。嫌它话多可以用 /buddy mute 或直接说”好友静音”让它安静下来,想恢复就 /buddy unmute。不需要了就 /buddy off 关掉。

系统设计得相当完整。18 种宠物:鸭子、鹅、蘑菇、猫、龙、章鱼、猫头鹰、企鹅、乌龟、蜗牛、幽灵、蝾螈、卡皮巴拉、仙人掌、机器人、兔子、团子等等。5 个稀有度等级:common(60%)、uncommon(25%)、rare(10%)、epic(4%)、legendary(1%)。5 个属性:DEBUGGING(调试能力)、PATIENCE(耐心值)、CHAOS(混乱值)、WISDOM(智慧值)、SNARK(毒舌值),每只宠物有一个峰值属性和一个短板属性。还有 1% 概率的闪光(Shiny)外观,独立于稀有度。

最有趣的是它的生成机制——你的宠物不是随机抽的,而是由用户 ID 通过确定性算法生成,同一个用户永远孵出同一只宠物。宠物的”骨架”(外观)由 ID 决定,不可更改;”灵魂”(名字和性格)由 AI 在首次孵化时生成,持久存储在本地配置里。所以如果你嫌自己的宠物是普通的白色仙人掌,还真有办法重刷——改用户 ID 就能改宠物。有人真的写脚本暴力枚举了几千万个 ID,就为了刷一只传说闪光卡皮巴拉。

这些看起来像拓麻歌子(Tamagotchi)的设计,可能是 Anthropic 团队在高压工作下的一点小趣味。他们是真的在用做游戏的心态做开发者工具。

描述问题越具体越好

Claude Code 搜索代码用的是 grep 和 ripgrep,不是向量数据库,不是语义检索。它的调度系统是设计成精准匹配的。

当你需要找”这个函数在哪里被调用”,用具体的函数名,比用自然语言描述”找一下那个处理用户登录的代码”要准确得多。同样,描述问题时越具体越聚焦越好。不是”帮我优化一下这个模块”,而是”帮我把这个函数的循环复杂度从 15 降到 8 以下,使用策略模式重构”。

Claude Code 不是通用语义推理引擎。它的工具调用是精确匹配的,给的信息越精确,匹配度越高。当然这不意味着 AI 推理能力不重要——在需要推理的地方,它很强。但当你需要它执行具体操作时,精准描述永远比模糊描述效果好。

它的保守不是任性

Claude Code 背后同时跑着两个 AI:一个负责执行任务,另一个是独立的权限分类器。四层流水线:历史规则查一遍,低风险直接过,只读操作白名单直通,剩下的调用温度为零的 Claude Sonnet 分类判断。熔断机制是连续 3 次被拒或累计 20 次被拒后自动降级成手动确认模式。

当你发现 Claude Code 开始频繁问你确认的时候,不要烦躁。这不是因为它变笨了,而是在某些边界操作上触发了保护机制。停下来想想:是不是之前的指令触发了某些安全边界?是不是有某些文件操作不在预期范围内?理解它的边界,比强行突破更有效率。

源码里有一段 Undercover Mode 的设计:当检测到内部员工操作公开 GitHub 仓库时,会自动抹除 AI 生成痕迹,要求模型隐藏身份。这个模式没有关闭开关。

这件事暴露的是一个根本性的问题:AI 公司有没有权利让自己的 AI 在公开场合扮演人类?开源社区的本质是人类的协作,如果其中混入了隐藏身份的 AI,整个社区的信任基础就会被动摇。

护城河不在代码里

源码泄露之后,所有人都在问:Claude Code 的护城河还在吗?

我的答案是:代码只是护城河的结果,不是护城河本身。

Claude Code 的代码你看到了,你知道了它是怎么设计的。但你知道它为什么这样设计吗?你知道它在设计过程中否定了多少个其他方案吗?你知道它上线之后踩过多少坑、做过多少次调整吗?

这些东西不会写在代码里。它们写在团队的决策过程里,写在组织的学习曲线里,写在无数次”这样做不行”和”这样改就好了”的积累里。

图纸可以复制,能力不能。

两个 AI 同时跑,这才是重点

Claude Code 背后同时跑着两个 AI。一个负责执行任务,另一个是独立的权限分类器,专门负责安全决策。每一条指令都要过四层流水线。

这个设计背后的思想是什么?它把”AI 的自主性”和”人类的控制权”之间的张力,用工程手段显式地管理起来了。

绝大多数团队在设计 AI 产品的时候,想的是”怎么让 AI 更强”。但真正重要的问题是”怎么让 AI 在失控的时候还能被拽回来”。这两个问题的答案完全不一样。做第一个的是功能,做第二个的是基础设施。

不记代码,只记人

Claude Code 的记忆系统有一个特别反直觉的设计决策:不记代码。

代码相关的事实实时读取,不存入记忆。因为代码会变,记住了反而可能污染后续的判断。但人的偏好和习惯相对稳定,值得持久化。

知道 AI 不该做什么,比知道 AI 能做什么更重要。Claude Code 的”不记代码”原则,本质上是一种自我克制。这种克制比任何高级功能都更难做到。

少林寺藏经阁开了,然后呢

51 万行代码,让所有人第一次如此清晰地看到:顶级 AI 产品的工程实践是什么样子的。

但问题来了:看完之后,你能做什么?

真正的武林高手,不是背熟了秘籍的人,是把秘籍里的道理融会贯通、然后走出自己路的人。少林寺的藏经阁开了,七十二绝技随便抄。但能不能练成高手,还得看你自己了!