Claude Code 是怎么做 Harness 的
摘要:Harness Engineering是确保LLM在真实环境中稳定运行的系统工程,Claude Code源码展示了其核心要素:1)构建包含环境、规则、记忆的工作空间;2)定义工具能力与权限边界;3)通过Agent Loop实现多轮自主决策;4)支持长期运行的会话恢复机制;5)独立验证系统确保结果可靠;6)拆分子智能体实现角色分工。其实质是将上下文、工具、状态管理等整合为可编程的运行时系统,使
结合 claude code 源码,可以把 Harness Engineering 理解成:
不是“把模型拴上”,而是把“模型所需的工作空间、行动边界、反馈链路、长期状态”工程化。
具体而言:
- Context Engineering 解决的是:模型这一步看到了什么
- Harness Engineering 解决的是:模型这一步能做什么、怎么做、做到哪一步停、失败后怎么恢复、结果如何验证
看了 Claude Code 源码后,我认为:
Harness Engineering = Context Engineering + Tool/Permission 协议 + Agent Loop + 状态/恢复 + 验证/反馈 + 子智能体编排
———
Claude Code 是怎么做 Harness 的
1)先给模型造“工作空间”
Claude Code 不直接把用户的问题发给模型,他会先拼运行上下文:
- system prompt 由很多 section 组成:session guidance、memory、环境信息、语言偏好、输出风格、MCP 指令、scratchpad、tool result 总结规则等
- 把环境细节补进 prompt,比如 cwd、OS、shell、额外工作目录,以及“子 agent 必须用绝对路径”这类执行约束
- 加载项目内的 CLAUDE.md、.claude/CLAUDE.md、.claude/rules/*.md ,作为模型的项目记忆/规范
- 统一组装 systemPrompt + userContext + systemContext
这一步就是 workspace construction:把 repo、规则、环境、记忆变成可用的“工作空间”。
———
2)定义“它能做什么”
Claude Code 给工具做了完整的能力装配:
- 内建工具 + MCP 工具会统一组装成 tool pool
- deny rule 会在调用之前先把工具从模型可见范围里剔掉
- 为了 prompt cache 稳定性,cc 会对工具排序
这一步很关键:
Harness 不只是 prompt,还包括 capability surface 的设计。
———
3)给行为加边界:权限、审批、策略
在 CLI 源码中,权限系统非常像 harness 的“边界层”:
- 每次 tool use 都会进入 permission context,支持记录决策、持久化权限更新、会话级规则变更
- bash 之类会先走 classifier 自动审批
- 运行 permission hooks,让策略先改写/拒绝请求
- 交互态下,本地 UI 和 bridge 远端审批会竞争响应,谁先批准谁生效
- swarm worker 模式下,worker 会把权限请求转发给 leader
这说明 Claude Code 的 harness 不是“模型自己决定一切”,而是:
模型负责规划,harness 负责定义可行动作的协议与边界。
———
4)核心是 agent loop
Claude Code 真正的 agentic 核心在 query() / queryLoop():
- 它维护多轮状态、消息、turn count、预算、compact 状态等
- 它让模型在 loop 里决定“继续说 / 调工具 / 接收结果 / 再规划”
- 当 token budget 没打满时,系统还能自动追加 continuation nudge,逼着 agent 继续工作
所以这不是传统的 workflow automation,而是:
一个由模型驱动、由 harness 托底的多轮执行循环。
———
5)成熟 harness 一定支持 long-running
Claude Code 把“长期运行”当一等公民:
- 当前主会话可以被后台化成 task
- 会话可恢复,文件历史、attribution、上下文折叠状态都能从日志恢复
- /resume 会恢复 session id、录屏、cost state、context collapse snapshot
- 上下文太大时会 compact/microcompact
- 可以分析当前 context 使用情况
这就是 Anthropic 的“long-running harness”相关文章说的东西:
不是让 agent 跑久,而是让它跑久了还不崩、能恢复、能继续。
———
6)反馈与验证也是 harness,不是附属品
“反馈”在流程中很关键很关键,源码中体现在:
- 每轮结束后会跑 stop hooks,拿当前消息、system prompt、上下文去做 turn-end 检查/后处理
- 内置了一个 verification agent,要求它独立跑 build/test/lint、做 adversarial probe,并且必须给出 VERDICT: PASS/FAIL/PARTIAL
实现 agent ≠ 验证 agent;验证本身也被产品化成 harness 的一部分。
———
7)成熟 harness 会做角色拆分
Claude Code 不是一个大一统 agent,它会造专职的子智能体:
- Explore agent 被限制成只读搜索型,不允许编辑/写文件,甚至可以省掉 CLAUDE.md
- runAgent() 会给子 agent 创建独立上下文、消息、状态和 transcript
这个可以理解为“相关上下文模块”:
不同 agent,不只是 prompt 不同,连工具权限、记忆范围、工作目标都不同。
———
所以,Claude Code 里的 Harness Engineering,本质是什么?
总结:
Claude Code 的完善,不在于 prompt 写得多,而是它把“上下文、工具、权限、执行循环、恢复、验证、分工”全部做成了一个可持续运行的系统。
Harness Engineering 就是把 LLM 从“会回答”变成“能在真实环境里稳定工作”的那层运行时工程。

更多推荐



所有评论(0)