文章

learn-claude-code 学习笔记(完结):12 课全景总结

learn-claude-code 学习笔记(完结):12 课全景总结

learn-claude-code 系列 12 课学完了。这篇做一个全景总结——每课解决了什么问题、怎么解决的、加了什么机制。

核心论点

1
Agent = Model(大脑)+ Harness(身体 + 环境)

模型提供智能,Harness 提供表达智能的空间。12 课教的都是 Harness——循环从未改变。

12 课总览

课程问题解决方案核心机制工具数
s01 Agent Loop模型碰不到真实世界while 循环 + bash 工具stop_reason 控制退出1
s02 Tool Usebash 干什么都不精准(截断、转义、安全)专用工具 + dispatch mapTOOL_HANDLERS 字典路由 + safe_path 沙箱4
s03 TodoWrite复杂任务做着做着就跑偏TodoManager + nag 提醒只允许一个 in_progress + 3 轮不更新就催5
s04 Subagent子任务的过程污染父上下文子 Agent + 独立 messagessub_messages=[] 全新上下文,只返回摘要5
s05 Skill Loading领域知识全塞 system prompt 太浪费两层注入:目录 + 按需加载system prompt 放摘要,tool_result 放全文5
s06 Context Compact上下文窗口有物理上限三层压缩micro(占位符)+ auto(LLM 摘要)+ manual(模型主动)5
s07 Task Systemtodo 在内存里,压缩后丢失,无依赖关系磁盘持久化的任务图(DAG)blockedBy/blocks 依赖 + 完成时自动解锁8
s08 Background Tasks慢命令卡住整个循环后台线程 + 通知队列goroutine/thread 跑命令,drain 通知注入 messages6
s09 Agent Teams子 Agent 是一次性的,不能通信持久队友 + JSONL 邮箱config.json 团队名册 + inbox/*.jsonl 通信9
s10 Team Protocols队友之间缺少结构化协调关机握手 + 计划审批request_id 关联 + pending→approved/rejected FSM12
s11 Autonomous Agents领导逐个分配任务,成为瓶颈WORK + IDLE 两阶段循环空闲时每 5 秒轮询收件箱和任务看板,自动认领14
s12 Worktree Isolation共享目录导致文件冲突git worktree 目录隔离任务管”做什么”,worktree 管”在哪做”,task_id 绑定16

四个阶段

第一阶段:基础能力(s01-s02)

 解决什么加了什么
s01模型只能输出文字,不能执行while 循环 + bash
s02bash 什么都能干但干不好专用工具 + 路径沙箱 + dispatch map

从零到一:一个能读写文件、跑命令的 Agent。

第二阶段:智能管理(s03-s06)

 解决什么加了什么
s03注意力稀释,忘记计划TodoManager(刷新到最近位置)+ nag 提醒
s04上下文被噪声污染子 Agent(独立 messages,只返回摘要)
s05知识前置塞入太浪费两层注入(目录 + 按需加载)
s06上下文物理上限三层压缩(占位符 / LLM 摘要 / 手动触发)

四课围绕上下文质量做文章:s03 对抗注意力稀释,s04 对抗噪声污染,s05 对抗无效占用,s06 对抗物理上限。

第三阶段:持久化(s07-s08)

 解决什么加了什么
s07任务状态在压缩后丢失,无依赖关系磁盘 JSON 文件 + blockedBy/blocks DAG
s08慢命令阻塞整个循环后台线程/goroutine + drain 通知队列

状态从内存走向磁盘,执行从单线程走向并发。

第四阶段:团队协作(s09-s12)

 解决什么加了什么
s09子 Agent 是一次性的,不能通信持久队友(config.json)+ JSONL 邮箱
s10缺少结构化协调关机握手 + 计划审批(request_id + FSM)
s11领导逐个分配成为瓶颈WORK+IDLE 循环 + 自动扫描看板认领
s12共享目录文件冲突git worktree 目录隔离 + 事件流

从单兵到团队:身份、通信、协议、自组织、隔离执行。

贯穿始终的设计模式

模式出现在哪做什么
dispatch maps02 起所有课工具名 → 执行函数,循环永不改
drain 队列s08 通知、s09 邮箱、s11 轮询读取并清空,保证不重复消费
文件持久化s07 任务、s09 团队、s12 worktree状态独立于对话,压缩和重启后存活
注入 messagess03 nag、s05 skill、s08 通知、s09 收件箱把外部信息塞到模型能看到的位置
安全上限s04 子 Agent 30 轮、s09 队友 50 轮、s11 IDLE 60 秒防止失控的后台循环
request_id 关联s10 关机、s10 计划审批把请求和响应对上号
状态机s03 todo、s07 任务、s10 协议、s12 worktreepending → in_progress → completed

循环从未改变

从 s01 到 s12,核心循环始终是:

1
2
3
4
5
6
7
while True:
    response = client.messages.create(model, system, messages, tools)
    messages.append({"role": "assistant", "content": response.content})
    if response.stop_reason != "tool_use":
        return
    results = execute_tools(response.content)
    messages.append({"role": "user", "content": results})

12 课加的所有机制——规划、子 Agent、技能、压缩、任务、后台、团队、协议、自治、隔离——都是在这个循环的外围。工具从 1 个增长到 16 个,线程从 1 个增长到 N 个,状态从内存扩展到磁盘——但循环本身,一行没改。

这就是 Harness Engineering 的核心:不改模型,改环境。

全部 Go 实现agents_go/


本文是 learn-claude-code 系列学习笔记的完结篇。全部 12 篇文章基于 learn-claude-code 仓库。Go 语言实现版本见同仓库 agents_go/ 目录。

本文由作者按照 CC BY 4.0 进行授权