Bash is all you need — A nano claude code–like 「agent harness」, built from 0 to 1
shareAI-lab 出品的 20 课递进式 Agent Harness 工程教程。从 while True 出发,逐步叠加 Claude Code 的每一个核心机制。与 claw0 组成姊妹教程——一个拆解 Agent Harness 内核,一个拆解网关路由与主动行为。
核心命题:Agency 不是编出来的
这个教程的开篇不是 Hello World,而是一段长达几千字的哲学陈述。它要讲一件反直觉的事:
Agency——感知、推理、行动的能力——是训练出来的,不是编出来的。
从 DeepMind 的 DQN 玩 Atari(2013),到 OpenAI Five 战胜 Dota 2 世界冠军(2019),到 AlphaStar 制霸星际争霸 II(2019),到腾讯绝悟碾压王者荣耀职业选手(2019),再到 Claude Code 重塑软件工程(2024-2025)——每一个里程碑指向同一个事实:Agent 的核心是一个被训练出来的神经网络,不是外面那层 if-else 代码。 外面的代码(模拟器、游戏客户端、IDE 和终端)提供的是环境(Harness),不是智能。
基于这个前提,教程做了一个犀利到冒犯的批判:
“提示词水管工式 ‘Agent’ 平台是不做模型的程序员的意淫。”
拖拽式工作流构建器、无代码 AI Agent 平台、提示词链编排库——这些东西试图通过堆叠过程式逻辑来暴力模拟智能,本质上是 GOFAI(经典符号 AI)的现代还魂。它们共享同一个幻觉:把 LLM API 调用用 if-else 分支、节点图、硬编码路由连在一起,就算”构建 Agent”了。那不是 Agent,那是一个有着宏大妄想的 shell 脚本。
心智转换:从”开发 Agent”到开发 Harness
当一个人说”我在开发 Agent”,他只能是两个意思之一:
- 训练模型(DeepMind、OpenAI、Anthropic 在做的事)
- 构建 Harness(我们大多数人在做的事)
教程明确定义了 Harness 的公式:
Harness = Tools + Knowledge + Observation + Action + Permissions
Tools: 文件读写、Shell、网络、数据库、浏览器
Knowledge: 产品文档、领域资料、API 规范、风格指南
Observation: git diff、错误日志、浏览器状态、传感器数据
Action: CLI 命令、API 调用、UI 交互
Permissions: 沙箱隔离、审批流程、信任边界
模型做决策,Harness 执行。模型做推理,Harness 提供上下文。模型是驾驶者,Harness 是载具。
这个隐喻贯穿全教程——你不需要”开发 Agent”,你需要的是造一个足够好的载具,然后把一个已经够聪明的模型放进去。这也正是 Harness工程 中反复强调的:Harness 工程师的职责不是编写智能,而是为智能构建栖居的世界。
Harness 工程师的五项职责
- 实现工具——给 Agent 一双手。每个工具是 Agent 在环境中可以采取的一个行动。设计时要原子化、可组合、描述清晰
- 策划知识——给 Agent 领域专长。按需加载(s07),不前置塞入。Agent 应该知道有什么可用,然后自己拉取所需
- 管理上下文——给 Agent 干净的记忆。子 Agent 隔离防噪声泄露(s06),压缩防历史淹没(s08),任务系统让目标跨会话持久化(s12)
- 控制权限——给 Agent 边界。沙箱化文件访问,破坏性操作要求审批。这是安全工程与 Harness 工程的交汇点
- 收集任务过程数据——Agent 在 Harness 中的每一条行动序列都是训练信号。这些感知-推理-行动轨迹是微调下一代 Agent 模型的原材料
为什么以 Claude Code 为教学标本
教程选择拆解 Claude Code 作为 Harness 工程的大师课,不是因为 Claude Code 做了什么特别聪明的设计,恰恰相反——是因为它没做太多事。
Claude Code 是最优雅的 harness 实现——不是因为它做了什么,而是因为它没做的事:它没有试图成为 Agent 本身。
把 Claude Code 剥到本质:
Claude Code = 一个 agent loop
+ 工具 (bash, read, write, edit, glob, grep, browser...)
+ 按需 Skill 加载
+ 上下文压缩
+ 子 Agent 派生
+ 带依赖图的任务系统
+ 异步邮箱的团队协调
+ worktree 隔离的并行执行
+ 权限治理
每一个组件都是 Harness 机制——为 Agent 构建的栖居世界的一部分。Agent 本身是 Claude(模型,由 Anthropic 训练)。Harness 没有让 Claude 变聪明。Claude 本来就聪明。Harness 给了 Claude 双手、双眼和一个工作空间。
这个拆解揭示了一个通用规律:最好的 Agent 产品,出自那些明白自己的工作是 Harness 而非 Intelligence 的工程师之手。 这个洞察适用于编程 Agent,也适用于农业、酒店、医疗、制造等任何领域的 Agent。
20 课递进路径
每个课程在同一个 Agent Loop 上叠加一个 Harness 机制。循环本身从不修改。每节有一句格言概括其核心理念:
| # | 主题 | 格言 | 关键机制 |
|---|---|---|---|
| s01 | Agent Loop | ”One loop & Bash is all you need” | while True + stop_reason |
| s02 | Tools | ”加一个工具, 只加一个 handler” | dispatch map 模式 |
| s03 | Permissions | ”先划边界, 再给自由” | 操作前判断,问用户 |
| s04 | Hooks | ”挂在循环上, 不写进循环里” | 工具前后留插口 |
| s05 | TodoWrite | ”没有计划的 agent 走哪算哪” | 先列步骤再动手 |
| s06 | Subagent | ”大任务拆小, 干净上下文” | 子 Agent 隔离,只带结果回来 |
| s07 | Skill | ”用到时再加载, 别全塞 prompt” | 先列目录,用到再展开 |
| s08 | Compact | ”上下文总会满, 腾地方” | 四层压缩策略,便宜的优先 |
| s09 | Memory | ”记住该记的, 忘掉该忘的” | 筛选 + 提取 + 整理三子系统 |
| s10 | System Prompt | ”prompt 是组装出来的” | 分段 + 按需拼接 |
| s11 | Error Recovery | ”错误不是终点, 是重试起点” | 重试 + 腾空间 + 换路子 |
| s12 | Task | ”大目标拆小任务, 排好序, 持久化” | 文件持久化的任务图 |
| s13 | Background | ”慢操作丢后台” | 后台线程 + 完成通知注入 |
| s14 | Cron | ”定时触发, 不需要人推” | 按时间自动触发任务 |
| s15 | Teams | ”一个搞不定, 组队来” | 持久化队友 + 异步邮箱 |
| s16 | Protocols | ”队友之间要有约定” | 固定请求-回复格式沟通 |
| s17 | Autonomous | ”队友自己看板, 有活就认领” | 自组织,不需要领导分配 |
| s18 | Worktree | ”各干各的目录, 互不干扰” | 任务管目标,worktree 管目录 |
| s19 | MCP | ”能力不够? 插上 MCP” | 外部工具接入同一工具池 |
| s20 | Comprehensive | ”机制很多,循环一个” | 所有机制回到一个完整 Harness |
核心架构代码(贯穿全部 20 课不变):
def agent_loop(messages):
while True:
response = client.messages.create(
model=MODEL, system=SYSTEM,
messages=messages, tools=TOOLS,
)
messages.append({"role": "assistant", "content": response.content})
if response.stop_reason != "tool_use":
return
results = []
for block in response.content:
if block.type == "tool_use":
output = TOOL_HANDLERS[block.name](**block.input)
results.append({
"type": "tool_result",
"tool_use_id": block.id,
"content": output,
})
messages.append({"role": "user", "content": results})这个循环就是一切。课程中的所有机制——权限检查、Hook 拦截、子 Agent 派生、上下文压缩、任务调度——都是挂在这个循环上的插件。循环属于 Agent,机制属于 Harness。
跨领域通用性
教程反复强调它教的不只是”怎么造一个编程 Agent”,而是一套可以泛化到任何领域的 Harness 工程模式:
庄园管理 Agent = 模型 + 物业传感器 + 维护工具 + 租户通信
农业 Agent = 模型 + 土壤/气象数据 + 灌溉控制 + 作物知识
酒店运营 Agent = 模型 + 预订系统 + 客户渠道 + 设施 API
医学研究 Agent = 模型 + 文献检索 + 实验仪器 + 协议文档
制造业 Agent = 模型 + 产线传感器 + 质量控制 + 物流系统
教育 Agent = 模型 + 课程知识 + 学生进度 + 评估工具
循环永远不变。工具在变。知识在变。权限在变。 Agent = 模型 + 泛化的操作环境(Harness)。这是 Harness工程 中”Harness 是跨领域抽象”的最完整陈述。
与 Vault 中其他概念的关联
这篇教程与 vault 中多个概念笔记深度交叉:
- Harness工程:教程本身就是”Harness 工程”最系统的教学实现——Harness = Tools + Knowledge + Observation + Action + Permissions 直接定义了它的边界
- [Agent Skill](Agent Skill.md)(s07):教程中 Skill 的实现——先列目录、用到再展开——与开放式的 Agent Skill 协议完全一致
- Subagent(s06):教程中 Subagent 的设计——隔离上下文、只带结果回来——提供了具体实现思路
- 上下文工程:Compact(s08)+ Memory(s09)+ System Prompt(s10)三个课程构成了上下文工程的实操三部曲
- [MCP 模型上下文协议](MCP 模型上下文协议.md)(s19):作为工具池的”万能插座”接入
- 三层架构:教程 + claw0 的组合覆盖了 Harness 层(执行层)+ Gateway 层(网关层)
- pi-coding-agent:完美示例——一个独立开发者用同样的 Harness 工程思维从零构建了一个极简 Agent
重要引用
“Agency — 感知、推理、行动的能力 — 是训练出来的,不是编出来的。”
“造好 Harness。Agent 会完成剩下的。”
“Bash is all you need. Real agents are all the universe needs.”
“最好的 agent 产品,出自那些明白自己的工作是 harness 而非 intelligence 的工程师之手。”