从泄露源码看 Claude Code:它怎样把记忆和任务拧成一台机器
这是我的第 241 篇原创文章

Claude Code 这次外泄来自 npm 包误带 sourcemap,露出来的是 Claude Code 的 CLI / agent 层 TypeScript 工程,规模在 50 多万行,不是模型权重,也没有客户数据或密钥跟着出来。
先看记忆。很多人一提 agent 记忆,就想到向量库,Claude Code 不是这一路。官方现在把它拆成两套东西:CLAUDE.md 和 auto memory。前者是人写的规矩,后者是 Claude 自己攒的经验;更要紧的是,两者都只是上下文,不是硬配置。官方文档明说,CLAUDE.md 是在 system prompt 之后以 user message 的形式送进去的。这种安排等于承认模型是要在多股语义里权衡的东西。把规矩放在上下文里是工程上的清醒。
真正值得研究的是 auto memory 的入口设计。每个项目一个 memory 目录,里面是一个 MEMORY.md 入口索引,加若干主题文件。启动时只吃 MEMORY.md 的前 200 行或 25KB,后面的不算;主题文件也不在开场就全塞进来,是需要时再读。这个设计像旧式书房,门口先挂一张总目,抽屉里再放细账。它反对“什么都装进上下文”,因为那样很快就会爆炸。它要的是:先知道哪里有,再决定要不要翻。换句话说,Claude Code 的长期记忆不是数据库式的全量召回,更像索引驱动的按需查阅。好处是便宜、可审计、可手改,坏处是它要求记忆本身保持克制,不能臃肿。MEMORY.md 要保持短,详细内容挪到 topic files 里,/memory 命令还能直接打开这些 markdown 给人看。
但只有存,没有收拾,记忆很快就会不可用。泄露快照里最值钱的,是 Dream 这套整理工。公开镜像中的 consolidationPrompt.ts 写道:先看现有 memory 目录和 MEMORY.md,再看最近日志与已经漂移的旧记忆,必要时才去窄搜 transcript;然后把值得留的并入主题文件,把“昨天”“上周”改成绝对日期,把已经被今天事实推翻的旧判断删掉;最后再修一遍索引,确保 MEMORY.md 不超过 200 行,也别变成内容垃圾桶。这里面最有意思的是它承认记忆要反复勘误。很多 agent 的记忆死在只增不删,Claude Code 倒像个抄档案的人,隔一阵就把旧纸翻出来,改红字,划废句,另立新条。
再往里看,还有一层常被忽略的短时记忆。Claude Code 不把“我现在做到哪一步了”散在对话里任它飘,是单独拿 TodoWrite 这把锤子去钉。system workflow 里写道,复杂任务、多任务、三步以上的活,都该先立 todo,而且同一时刻最好只有一个 in_progress;TodoWrite 的工具定义也把这种习惯写成了硬要求。社区逆向进一步指出,这个工具会在 ~/.claude/todos/ 下写 JSON,system reminder end prompt 再把最新 todo 动态装回对话。也就是说,Claude Code 的工作记忆是“我还欠着什么”。欠账单比闲聊摘要更像干活的人脑子。
compact 则补上了会话续命这一块。社区拆出来的 compact prompt 很长,很细,要求把用户意图、看过哪些文件、改了什么、错过什么、还有什么待办,都按固定结构重写一遍。这个摘要不是给用户读的,是给下一段会话接班用的。就是老老实实写交接单。官方文档也说得很明白:/compact 之后,CLAUDE.md 会从磁盘重新注入,所以规矩不靠摘要传宗接代,摘要只负责把眼前这摊活接下去。于是四样东西就分开了:CLAUDE.md 管恒常规则,Todo 管眼前进度,compact 管会话续航,auto memory 管中长期经验。它们不挤在一个口袋里,彼此少打架。
后来的官方文档又把这套记忆法推到了 subagent。子代理也可以有自己的 memory 目录,照样只把 MEMORY.md 的前 200 行或 25KB 装进启动上下文,照样让读写工具去维护。这就说明一件事:Claude Code 的记忆不是给“主脑”单独装一个海马体,是把记忆做成一种工程接口。谁来当代理,不重要;重要的是谁都得按同样的目录结构、索引约束和整理习惯来记。接口的好处是可复用、可审计、可手修。
再说任务驱动。Claude Code 真正厉害的,不是“自动”,是把自动拆成了几道稳定的工序。社区逆向显示,启动会先做 quota 检查,topic detection 用 Haiku 3.5 判定是不是换题,过往对话总结也用 Haiku 3.5;真正的核心 agent workflow 和 compact,才交给 Sonnet 4。便宜模型守门、归类、做摘要,贵模型干主活。它不把所有决定押在一个大模型的一口气上,是把整条链子拆成不同成本等级的工位。今天很多 agent 产品像一头蛮牛,Claude Code 更像一条流水线。
关于 Task 工具。泄露出来的工具定义:Task 用来启动一个新 agent 处理复杂、多步、相对独立的事;能并发就并发;每个 agent 调用都是 stateless,只回一条最终报告;主代理如果想让子代理干得准,就得在 prompt 里把任务、边界、预期返回讲细。换句话说,Claude Code 的 subagent 不是办公室里可以来回商量的同事,是一次性外包单。派出去,干完,交件,断线。社区逆向还有个判断我觉得说到了根上:subagent 的价值,是隔离“脏上下文”。找代码、跑搜索、读错文件,这些试错会制造大量对最终答案无用的噪音;让子代理把噪音吃掉,主上下文只保留结论,等于把 context 当内存做了垃圾回收。很多人把 multi-agent 当热闹,Claude Code 把它当卫生。
这套任务驱动还有个不显山露水的地方:计划不是附属品,是执行入口。system workflow 明确要求频繁使用 TodoWrite,复杂任务要先拆、边做边改、做完立刻改状态,不许攒着一起改;Task 的工具定义又要求子代理最好并行,但每次调用都得说清是写代码还是做研究。两边合起来看,Claude Code 的任务观很像老派工头:先列活,再派工,再回报码。这里头没有太多“涌现”的浪漫,只有计划、委派、核对、收口。正因为这样,它才能把一个语言模型从聊天室里拽出来,变成一个勉强像样的工作面。
所以,从这次源码外泄里真正能学到的,不是某个神秘 prompt,也不是几个没上线的彩蛋,是能用的 agent,靠的不是会说,而是会管。记忆系统的本质不是“永远记住”,是把规则、进度、摘要、经验分层放置,再持续修剪;任务系统的本质也不是“自主”,是把复杂工作拆成可计划、可外包、可压缩、可回收的片段。Anthropic 现在公开的 Agent SDK 文档已经直说,SDK 提供的正是驱动 Claude Code 的同一套 tools、agent loop 和 context management。Claude Code 不是一个会写代码的聊天框,它越来越像一个轻量操作系统。