从 Claude Code 源码,我看到了做好 AI 产品 Harness 工程的五个关键
Anthropic 的 Claude Code 意外泄露了 50 万行 TypeScript 源码。社区第一反应是去看模型权重——没有。但真正值得看的,是那层包裹模型的”身体”。
Harness 工程,就是这层”身体”的设计科学:怎么让模型在有边界的环境里稳定工作,怎么让多个 Agent 协同,怎么管理记忆,怎么算好成本账。
从 Claude Code 源码里,我看到了五个核心维度。
一、Agent Loop:模型不是答问题,是在跑一个程序
Claude Code 不是聊天机器人,也不是传统的工作流引擎。它本质上是一个自驱动的任务执行程序——你告诉它目标,它自己在循环里探索、执行、检验。
这个循环的结构,值得所有做 AI 产品的人认真拆解。
它的 TAOR 循环是这样跑的:
-
Think:模型分析当前状态,理解任务目标,决定下一步行动 -
Act:调用工具(读文件、写代码、执行 Shell 命令、搜索网络) -
Observe:收集行动结果,更新状态 -
Repeat:循环直到任务完成或触达边界
这不是简单的”多轮对话”。在 Claude Code 里,模型每次循环都有明确的目标感——它不是在等你喂信息,而是在主动构建对项目的理解。
一个值得注意的细节:Claude Code 的知识结构是基于文件系统的,不是 RAG。它直接理解项目目录结构,理解文件之间的依赖关系,理解你的代码在做什么。这让它对复杂代码库的把握,远超向量检索的那种”语义近似”匹配。
Claude Code 的源码也说明了,真正难的是 Harness——给任何支持工具调用的 LLM 提供文件系统访问、shell、分层记忆和声明式扩展能力,所有的这些都要在一个由可组合权限约束的有界自主循环里运行。(Agent的下一阶段是 Harness)
这套循环设计的关键哲学是:Orchestrator 越笨,架构越稳。
Claude Code 的编排层(Orchestrator)被刻意设计成相对简单的决策单元,复杂的推理能力下沉到子 Agent 里。这和”做一个超级 Agent 管所有事”的思路正好相反。简单编排层意味着单点故障少,整体系统更容易预测和调试。
这给做 AI 产品的人一个重要提醒:你的产品定位是第几代? 第一代是 Chatbot,第二代是 Workflow,第三代才是 Autonomous Agent。每一代的工程复杂度差一个数量级,别把第二代当第三代卖。
二、Agent 协同(一):Sub Agent 机制——通过子 Agent 扩展上下文
Claude Code 的第二个核心能力,是多 Agent 协作的第一层:Sub Agent。
当一个任务太复杂,主 Agent 会把重型探索工作分包给独立的子 Agent。每个子 Agent 有自己的 TAOR 循环和 Context 预算,任务完成后只返回摘要——不污染主 Agent 的上下文。
这套协同机制的核心逻辑是:隔离、独立、汇总。
Claude Code 内置了三种预设子 Agent,各有分工:
-
Explore:用 Haiku 模型(速度快、成本低),只有只读工具,专门做代码库探索 -
Plan:继承主 Agent 模型,只有只读工具,专门做规划前的信息收集 -
General-purpose:继承主 Agent 模型,配备全套工具,处理复杂多步骤操作
子 Agent 支持前台和后台两种执行模式。前台模式阻塞主对话,权限请求透传给用户;后台模式在用户继续工作的同时并发运行,权限在启动前预先收集,遇到未批准的权限请求时工具调用直接失败,Agent 继续运行。
这种”外包-汇总”模式,是 Claude Code 能跑得动复杂代码库的关键工程决策。不是让一个模型更聪明,而是让多个模型各司其职。
三、Agent 协同(二):Agent Team——通过共享任务清单实现真正的多角色协作
如果说 Sub Agent 是”一个人把活分包出去”,那 Agent Team 就是”一群人各有角色,一起干一件大事”。
Claude Code 的 Agent Team 机制,不再是主从关系,而是完全独立的 Claude Code 实例,通过共享文件系统协调任务。这和 Sub Agent 的核心区别在于:Sub Agent 是主 Agent 的延伸,共享主 Agent 的 Context;Agent Team 里的每个实例都是独立的,有自己的完整上下文。
Agent Team 的协调机制有四层:
第一,Shared Task List(共享任务清单)。 这是 Agent Team 的核心。所有 Agent 都能看到同一份任务清单,每个任务有明确的状态(未认领、执行中、已完成)。当前任务完成后,Agent 自主认领下一个未分配的任务——不需要中央调度,不需要主 Agent 分配,靠的是任务清单的可见性和 Agent 的自主判断。
第二,Message(通信机制)。 Agent Team 支持两种通信方式:单播(Unicast)发给特定 Teammate,广播(Broadcast)发给所有 Teammate。广播的代价随团队规模线性增长——这是显性的成本提醒,防止无限扩张团队规模。
第三,Automatic Idle Notification(空闲通知)。 Teammate 完成任务并停止时,会自动通知 Lead(主导 Agent)。Lead 不需要主动轮询,任务状态变化通过通知机制传递。
第四,质量门控 Hooks。 这是 Agent Team 能维持输出质量的关键:
-
TeammateIdle Hook:Teammate 即将进入空闲时触发。如果 Lead 认为还有工作没做完,返回 exit code 2,Teammate 收到反馈后继续工作。 -
TaskCompleted Hook:任务即将被标记完成时触发。如果 Lead 检查后发现问题,返回 exit code 2,可以阻止任务完成,要求 Teammate 先修复。
Agent Team 的本质是一套分布式任务管理系统——Shared Task List 解决了”谁来干”的问题,Hooks 解决了”质量谁来把关”的问题。角色定义清楚了,任务边界清晰了,Agent 协作就不再是”一堆 Agent 在对话”,而是一群独立 Agent 在一个有秩序的系统里各司其职。
对于做 AI 产品的人,这意味着:你的多 Agent 产品,不只是让 Agent 对话,是设计一套任务分发的秩序。
四、记忆机制:不止是记住,是会”做梦”
Claude Code 的记忆系统,是它区别于普通 Agent 的核心能力之一。
基础层:结构化上下文管理。 Claude Code 会持续追踪项目的当前状态——哪些文件被修改了,哪些决策做过了,当前任务的进度在哪里。它不是靠一次 Prompt 塞进去的,而是持续维护一个动态的项目状态图。(Anthropic 是怎么做长程任务的)
Claude Code 的记忆系统分为六层,在每次会话启动时按层加载:
-
Managed Policy:组织级统一规范 -
Project CLAUDE.md:当前项目的特定指令和上下文 -
User Preferences:用户偏好和习惯 -
Auto-Memory:Agent 从历史交互中学到的用户模式 -
Session:当前会话的临时信息 -
Sub-Agent Memory:各子 Agent 独立维护的专项记忆
进阶层:Dream Mode(做梦模式)。 当 Agent 处于空闲状态,它会在后台主动回顾最近的工作,尝试发现潜在的问题或优化点。这不是被动的”记住你说的话”,是主动的自我审视。
更关键的是,这套系统具有主动自我编辑能力——它不仅会记录,还会重写、去重、剪除互相矛盾的信息。过期且无效的记忆被视为”负债”,而非资产。
对于做 AI 产品的人,这意味着:记忆设计不是加一个 vector store 那么简单,而是要思考不同时间尺度上的信息保留策略。
五、成本工程:Context 不是越大越好,是越干净越好
这是 Claude Code 源码里最务实的设计哲学,也是大多数 AI 产品最容易忽视的点。
Agent 开发者普遍有一个误区:Context Window 越大越好。 Claude Code 的实践恰恰相反——Context 不是资源,是负债。越大越贵的上下文,不是越多信息,是越多噪音。
Claude Code 的成本工程有三个核心手段:
第一,Auto-Compaction(自动压缩)。 当 Context 使用量到 50% 时,用 LLM 自动生成摘要,替换掉原始的多轮对话记录。不是截断历史,是压缩提炼——保留关键决策,丢弃冗余过程。
第二,子 Agent 隔离。 重型探索任务外包给子 Agent,主 Agent 只收摘要。这不只是架构设计,也是成本设计——每个 Agent 都在自己的预算里跑,不会互相把对方的 Context 撑爆。
第三,Prompt Cache 优化。 Claude Code 的工程师踩过一个坑:14 种情况会让 Prompt 缓存失效。源码里有一个函数叫 DANGEROUS_uncachedSystemPromptSection()——光看这个名字,就知道这里出过多少次生产事故。
Context 管理的本质是财务问题。 每个 token 都是钱。省出来的 Context,都是利润。
其他能力亮点:容易被忽视的工程细节
除了五大核心,Claude Code 源码里还有几个值得关注的工程细节:
账户追踪与封禁机制。 Claude Code 的 API 请求里包含了追踪标识符,Anthropic 可以基于它识别出哪些请求来自第三方克隆客户端,从而采取封禁措施。这背后的逻辑是:API 不只验证”你在调用我”,还验证”你是用我的客户端在调用我”。对于做 AI 产品的人,这意味着 LLM 公司的护城河已经从模型能力延伸到了运行时环境的每一个环节。
Claude Code 的源码泄露是一次意外。但它让外界看清了:一个成熟的 Agent 产品,真正的工程复杂度不在模型,在 Harness。
模型会越来越强。但谁能把 Harness 工程做好,谁才能把模型能力真正落地成产品。
做好 Harness 工程,核心是回答好五个问题:
-
你的 Agent Loop 是怎么样的 -
你的 Sub Agent 策略是什么?哪些任务适合分包出去? -
你的 Agent Team 任务分发机制是什么?质量谁来把关? -
你的记忆机制能跨时间保持连续性吗? -
你的 Context 管理策略是什么?
这五个问题答不好,模型再强也是浪费。
夜雨聆风