content-forge-vault/00-inbox/2026-03-24-harness-engineering-analysis.md
2026-03-25 02:00:01 +08:00

360 lines
16 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
id: "2026-03-24-harness-engineering-analysis"
title: "Harness Engineering 分析 — learn-claude-code 仓库逆向解读"
slug: "harness-engineering-analysis"
status: "inbox"
content_type: "article"
channels: ["wechat", "x"]
language: "zh-CN"
source_urls:
- "https://github.com/shareAI-lab/learn-claude-code"
assets: []
cover_image: ""
template: "article"
owner: "content-forge"
created_at: "2026-03-24T00:00:00+08:00"
updated_at: "2026-03-24T00:00:00+08:00"
published_at: null
tags: ["harness-engineering", "agent-friendly", "claude-code", "agent-loop", "MCP"]
---
# Harness Engineering 分析
> 来源仓库:[shareAI-lab/learn-claude-code](https://github.com/shareAI-lab/learn-claude-code)
> 定位:将 Claude Code 架构逆向工程为 12 课的 Harness Engineering 教程
---
## 一、核心论点
### 1.1 Agent = Model不是代码
```
Agent 的历史证据链:
2013 DeepMind DQN → 一个神经网络学会玩 49 款 Atari 游戏
2019 OpenAI Five → 五个网络打败 Dota 2 世界冠军 OG
2019 AlphaStar → 星际争霸 II 登顶 Grandmaster前 0.15%
2019 腾讯绝悟 → 王者荣耀 5v5 击败 KPL 职业选手
2024 LLM Coding Agents → 读代码库、写实现、调试、团队协作
共同真相Agent 从来不是代码Agent 始终是模型。
```
### 1.2 Harness = 驾驶舱,不是司机
```
Harness = Tools + Knowledge + Observation + Action + Permissions
模型决定。Harness 执行。
模型推理。Harness 提供上下文。
模型是司机。Harness 是车辆。
```
### 1.3 对 "Prompt Plumbing" 的批判
仓库明确批判了一整个行业:拖拽工作流构建器、无代码 "AI Agent" 平台、Prompt 链编排库——它们不是 Agent是"带有幻想的 shell 脚本"。
> "You cannot engineer your way to agency. Agency is learned, not programmed."
---
## 二、12 课架构
### 2.1 全景层级图
```
Phase 1: 循环 Phase 2: 规划与知识
┌───────────────────┐ ┌───────────────────┐
│ s01 Agent Loop │ │ s03 TodoWrite │
│ 30 行 Python │ │ 模型自管计划 │
│ = 完整 Agent │ │ 一次一个 in_prog. │
│ │ │ │
│ s02 Tool Use │ │ s04 Subagent │
│ 调度映射表 │ │ 上下文隔离 │
│ 路径沙箱 │ │ 子任务清洁上下文 │
│ │ │ │
│ │ │ s05 Skills │
│ │ │ 两层按需加载 │
│ │ │ │
│ │ │ s06 Compact │
│ │ │ 三层上下文压缩 │
└───────────────────┘ └───────────────────┘
Phase 3: 持久化 Phase 4: 团队
┌───────────────────┐ ┌───────────────────┐
│ s07 Task System │ │ s09 Agent Teams │
│ 任务 DAG 磁盘持久 │ │ 持久化队友 + 邮箱 │
│ 依赖自动解锁 │ │ │
│ │ │ s10 Protocols │
│ s08 Background │ │ 结构化握手协议 │
│ 后台线程异步执行 │ │ shutdown/plan │
│ 通知队列注入 │ │ │
│ │ │ s11 Autonomous │
│ │ │ 自组织领取任务 │
│ │ │ 60s 空闲自动退出 │
│ │ │ │
│ │ │ s12 Worktree │
│ │ │ Git worktree 隔离│
│ │ │ 控制面 + 执行面 │
└───────────────────┘ └───────────────────┘
```
### 2.2 每课核心机制
| 课 | Harness 层 | 核心机制 | 代码量 |
|---|-----------|---------|--------|
| s01 | Loop | `while True` + `stop_reason != "tool_use"` 退出 | 3.6KB |
| s02 | Tool dispatch | `{tool_name: handler}` 调度映射 + `safe_path()` 沙箱 | ~5KB |
| s03 | Planning | TodoManager 状态机pending→in_progress→completed一次一个 | ~7KB |
| s04 | Context isolation | 子 Agent 清空 messages只返回摘要文本 | ~9KB |
| s05 | Knowledge | 两层注入:系统提示含索引(~100 token/skill+ load_skill 工具返回全文 | ~11KB |
| s06 | Compression | 三层压缩:每轮微压 → 50K token 自动压 → 手动压缩工具 | ~14KB |
| s07 | Persistence | JSON 文件 DAGblockedBy/blocks 依赖,完成自动解锁 | ~17KB |
| s08 | Async | 守护线程 + 通知队列,每次 LLM 调用前排空队列 | ~19KB |
| s09 | Teams | 持久化队友 + JSONL 邮箱WORKING↔IDLE↔SHUTDOWN 生命周期 | ~21KB |
| s10 | Protocols | request_id FSMpending→approved/rejected一个状态机两种协议 | ~23KB |
| s11 | Autonomy | IDLE 轮询5s 间隔)+ 任务板自主领取 + 身份重注入 | ~25KB |
| s12 | Isolation | Git worktree 绑定 Task ID控制面(.tasks/) + 执行面(.worktrees/) | 25.9KB |
### 2.3 设计不变量
每一课都叠加在 s01 的循环之上,**循环本身从不改变**
```python
# s01: 永不改变的核心循环
while True:
response = client.messages.create(
model=model,
system=system_prompt,
messages=messages,
tools=tools
)
# 模型决定何时停止
if response.stop_reason != "tool_use":
break
# Harness 执行工具调用
for block in response.content:
if block.type == "tool_use":
result = dispatch[block.name](block.input)
messages.append(tool_result(block.id, result))
```
---
## 三、Harness Engineering 七原则
### P1: 循环永不改变The Loop Never Changes
每一课在循环**周围**添加机制,而非**修改**循环。Agent模型拥有循环Harness 拥有机制。
### P2: 工具是 Agent 的手Tools Are Hands
原子、可组合、描述清晰。调度映射模式(`{name: handler}`)意味着添加能力无需改变核心。
### P3: 知识按需加载不预加载Knowledge On-Demand
两层 Skill 加载——系统提示中的廉价索引(~100 token+ tool_result 中的昂贵内容(~2000 token——是标准模式。
### P4: 上下文是珍贵资源Context Is Precious
三种策略保护上下文:子 Agent 隔离s04、三层压缩s06、磁盘持久化s07
### P5: 约束聚焦非限制Constraints Focus, Not Limit
"一次一个 in_progress"s03、"只读子 Agent"s04、"路径沙箱"s02——都是让模型性能**更好**的护栏。
### P6: 持久化跨越会话Persistence Outlives Sessions
磁盘任务s07、团队配置 JSONs09、事件 JSONLs12——Harness 维护模型上下文窗口无法持有的状态。
### P7: 信任模型Trust the Model
最强主题。不预设工作流。不构建决策树。给工具和知识,让模型推理。
> "You are not writing intelligence. You are building the world intelligence inhabits."
---
## 四、附带 Skills
### agent-builder
核心哲学:"模型已经知道如何做 Agent。你的工作是让开。"
三要素Capabilities能做什么+ Knowledge知道什么+ Context发生了什么
渐进复杂度:从 3-5 个能力起步。大多数 Agent 不需要超过 Level 2规划
反模式清单:过度工程、工具太多、刚性工作流、预加载知识、微管理。
### mcp-builder
MCP Server 构建模板Python + TypeScript。最佳实践清晰工具描述、输入验证、错误处理、默认异步、安全、幂等。
### code-review
五维审查安全Critical→ 正确性 → 性能 → 可维护性 → 测试。结构化输出:摘要 + 关键问题 + 改进 + 亮点 + 结论。
### pdf
PDF 读取pdftotext/PyMuPDF、创建pandoc/reportlab、合并/拆分。实用工具检测 + 大文件逐页处理。
---
## 五、与 Agent Friendly 开发规约的对照
### 5.1 同一枚硬币的两面
```
┌──────────────────────────────────────────────────────────┐
│ │
│ Agent Friendly 规约 Harness Engineering │
│ (被调用方视角) (构建方视角) │
│ │
│ "怎么让 Agent 用好 "怎么给 Agent 建好 │
│ 你的系统" 运行环境" │
│ │
│ ┌──────────┐ ┌──────────┐ │
│ │ 你的 API │◀── MCP ──────────▶│ Agent │ │
│ │ 你的工具 │ A2A │ Harness │ │
│ │ 你的文档 │ │ 循环+工具 │ │
│ └──────────┘ └──────────┘ │
│ │
│ 规约约束: Harness 约束: │
│ - Schema-First - 循环永不改变 │
│ - 工具设计 7 子规约 - 工具原子可组合 │
│ - 10 条安全约束 - 路径沙箱 │
│ - 25 条 NEVER - 信任模型 │
│ │
└──────────────────────────────────────────────────────────┘
```
### 5.2 概念映射表
| Harness Engineering 概念 | Agent Friendly 规约对应 | 关系 |
|---|---|---|
| **Agent Loop**s01| — | Harness 独有概念,规约不涉及 Agent 内部循环 |
| **Tool dispatch map**s02| §2 Tool Design 7 子规约 | 构建方的调度 = 被调用方的 Schema |
| **safe_path() 沙箱**s02| §4.1 Least Agency | 同一约束的两侧实现 |
| **TodoWrite 一次一个**s03| P2 约束>能力 | 约束聚焦的典型实例 |
| **Subagent 上下文隔离**s04| §4 安全 / Sandbox | 隔离是双方共识 |
| **Skill 两层加载**s05| §5 文档发现层 (llms.txt) | 索引层+内容层 = 同一模式 |
| **Context Compact**s06| — | Harness 独有(管理 Agent 内部记忆) |
| **Task DAG 磁盘持久**s07| Agent Skills 标准 | 持久化知识的不同形式 |
| **Background tasks**s08| — | Harness 独有(异步执行管理) |
| **Team mailbox**s09| A2A 协议 | 邮箱 = 简化版 A2A |
| **Shutdown/Plan protocols**s10| HITL + Agent 协商 | 结构化握手 = Agent 间礼仪 |
| **Autonomous task claiming**s11| Agent Card 发现 | 自组织 = 去中心化发现 |
| **Worktree isolation**s12| §4 Sandbox / MicroVM | 目录隔离 ≈ 轻量级沙箱 |
| **"Trust the model"**(全局)| P2 约束>能力 | 同一哲学的不同表达 |
| **mcp-builder skill** | §2 + §3 全部 | MCP Server 构建 = 规约的执行 |
### 5.3 互补关系全景
```
Agent Friendly 完整画面
────────────────────────
被调用方(你的系统) 构建方Agent Harness
════════════════ ═══════════════════
§5 发现层 s05 Skill 两层加载
llms.txt / Agent Card 系统提示索引 + 按需加载
│ │
│ Agent 找到你 │ Agent 获取知识
▼ ▼
§2 工具设计 s02 Tool dispatch
Schema / 描述 / 注解 调度映射 + 沙箱
│ │
│ Agent 理解你 │ Agent 执行工具
▼ ▼
§3 API 设计 s01 Agent Loop
10 条 AX 原则 while True 核心循环
│ │
│ Agent 调用你 │ Agent 决策
▼ ▼
§4 安全规约 s04/s12 隔离
10 条安全约束 子 Agent + Worktree
│ │
│ Agent 安全运行 │ Agent 安全执行
▼ ▼
§6 评估规约 agent-builder skill
Postman 48 / 10 项评分 渐进复杂度 + 反模式
│ │
└───────────┬───────────────┘
┌────────────────┐
│ Agent 成功完成 │
│ 用户的任务 │
└────────────────┘
```
### 5.4 核心差异
| 维度 | Agent Friendly 规约 | Harness Engineering |
|------|-------------------|-------------------|
| **视角** | 被调用方API/工具提供者) | 构建方Agent 运行环境) |
| **关注点** | 接口契约、发现性、安全 | 循环、上下文、持久化 |
| **不涉及** | Agent 内部循环和记忆管理 | API/工具的 Schema 设计 |
| **核心动词** | "暴露"、"描述"、"约束" | "加载"、"隔离"、"持久化" |
| **评估方式** | 量化评分48 Checks | 12 课渐进验证 |
| **共识** | 约束 > 能力信任模型Schema-First | 约束聚焦;信任模型;循环不变 |
---
## 六、整合洞察
### 6.1 Agent Friendly 的完整定义(整合后)
```
Agent Friendly = 被调用方友好 + 构建方友好
被调用方友好(规约):
让 Agent 能发现、理解、调用、验证你的系统
构建方友好Harness
让 Agent 有清晰的感知、精准的行动、丰富的知识、安全的边界
两者的交汇点:
工具设计 ←→ 工具调度
文档发现 ←→ 知识加载
安全约束 ←→ 沙箱隔离
Agent 协议 ←→ 团队通信
```
### 6.2 为什么两个视角都需要
```
只有规约(被调用方):
→ Agent 能找到你的 API但不知道怎么高效使用
→ 好的菜单,但没有好的厨房
只有 Harness构建方
→ Agent 有好的运行环境,但外部工具难以对接
→ 好的厨房但食材API质量参差不齐
两者结合:
→ Agent 能发现好的工具 + 在好的环境中高效使用它们
→ 好的厨房 + 好的食材 = 好的菜
```
### 6.3 共享的哲学根基
两个视角共享三条根本信念:
**信念 1模型比你想的更聪明**
- 规约:不要猜测 Agent 的意图,给它好的 Schema 它会自己搞定
- Harness不要预设工作流给它工具和知识让它推理
**信念 2约束是最好的礼物**
- 规约NEVER 清单比功能列表更重要§10.7 约束>能力)
- Harness一次一个 in_progress 让模型更专注s03
**信念 3好设计是透明的**
- 规约:好的工具描述让 Agent 像读文档一样理解接口
- Harness好的循环设计让你几乎忘记它的存在