Harrison Chase 那篇 Harness Design 发布后,Av1dlive 花了三个月搭建了一套完整实现。这篇文章是 4,000 字的工程复盘,附完整源码和 folder structure。
核心洞察
薄 harness、厚文件层。
Harness 不思考,它只读文件、调工具、写日志、跑钩子。所有智能住在 skill 文件和 memory 文件里,protocols 执行边界约束。
这意味着:
- 明天换掉 harness,什么都不丢
- 明天换掉模型,什么都不丢
- 唯一积累价值的是 skills、memory、protocols——都是 git 仓库里的 markdown 和 JSON
Folder Structure
.agent/
├── AGENTS.md # 根配置,harness 第一个读
├── harness/
│ ├── conductor.py # 薄循环(~200行)
│ ├── context_budget.py # token 分配管理
│ └── hooks/
│ ├── pre_tool_call.py # 权限执行
│ ├── post_execution.py # 自动写记忆
│ └── on_failure.py # 升级 + 反思触发
├── memory/
│ ├── working/ # 当前任务状态,易失
│ │ ├── WORKSPACE.md
│ │ └── ACTIVE_PLAN.md
│ ├── episodic/ # 历次运行发生了什么
│ │ ├── AGENT_LEARNINGS.jsonl
│ │ └── snapshots/
│ ├── semantic/ # 超越 episode 的抽象
│ │ ├── LESSONS.md
│ │ ├── DECISIONS.md
│ │ └── DOMAIN_KNOWLEDGE.md
│ ├── personal/ # 用户个人偏好
│ │ └── PREFERENCES.md
│ └── auto_dream.py # 夜间压缩 + 整合
├── skills/
│ ├── _index.md # 发现注册表
│ ├── _manifest.jsonl # 机器可读元数据
│ └── [各技能目录...]
├── protocols/
│ ├── tool_schemas/ # 每个工具的 typed 接口
│ ├── permissions.md # agent 能/不能做什么
│ └── delegation.md # sub-agent 交接规则
└── tools/
├── memory_reflect.py
├── skill_loader.py # 渐进式加载引擎
└── budget_tracker.py
四层记忆详解
Working Memory
WORKSPACE.md+ACTIVE_PLAN.md- 每次任务开始加载,结束时清除
Episodic Memory
AGENT_LEARNINGS.jsonl:原始经验日志,每次交互追加snapshots/:定期全量快照- 用途:告诉 agent "上次在这件事上你是怎么处理的"
Semantic Memory
LESSONS.md:提炼出的模式DECISIONS.md:重大决策及理由(含日期、考虑过的替代方案、状态)DOMAIN_KNOWLEDGE.md:领域知识- 用途:做决定前读,训练的是判断力而非过程
Personal Memory
PREFERENCES.md- 你的代码风格偏好、工作习惯、沟通方式
- 是上下文,不是指令——告诉 agent 你是什么样的人,不是教它怎么做
自动梦境压缩循环
每天凌晨 3 点运行 .agent/memory/auto_dream.py:
- 压缩记忆
- 将有价值的经验晋升到 LESSONS
- 归档过时内容
- git commit 结果
日志示例:
dream cycle: promoted 2, decayed 7, kept 31
这就是 agent 的自传——每一行都是一夜的学习。
失败处理钩子
on_failure.py 在每次失败时记录:
- 时间戳、skill 名称、错误类型
- 疼痛分数(自动给 8 分)
- 上下文(前 300 字符)
如果 14 天内同一 skill 失败 3 次以上,标记为需要重写,疼痛分数升到 10。
常见反模式
| 问题 | 表现 | 解法 |
|---|---|---|
| 上下文膨胀 | 加载 90K tokens 才能思考 | 渐进式加载,只加载匹配 skill |
| 技能过时 | API 变了,skill 还在自信跑旧指令 | manifest 每条加版本日期,60 天未触碰的标审 |
| 不安全组合 | 两个安全 skill 合成危险操作 | 约束放 pre_tool_call,不放在 skill 内部 |
| 教条执行 | agent 照着步骤做,哪怕已经不合理 | 写目标和边界,不写驾驶指令 |
| 工作区过期 | WORKSPACE.md 任务结束后没清零 | 梦境循环归档 2 天以上的工作区 |
Protocol 层
- permissions.md:读在任何工具调用之前,被禁止就是被禁止
- tool_schemas/:每个外部工具的 typed 接口
- delegation.md:何时交给 sub-agent,交给谁
对于个人编程 agent,薄心跳 + 一个 permissions 文件就够了。在生产系统上跑 agent,最终你会需要完整的 tool schemas 和审批钩子——但先跑几个星期的薄版本,它会告诉你 guardrail 具体要加在哪里。
架构核心原则
这套系统的 thesis:
模型可以随时换。skills 和 memory 换不了。它们编码了你的特定错误、你的特定决策、你的特定工作方式。
拥有你的记忆。拥有你的 skills。放在任何人都拿不走的 plain files 和 git 里。
这篇文章是工程实现的范本——把"薄 harness + 厚文件层"从概念变成了可运行的完整系统。四层记忆分离是最值得借鉴的设计决策。