Harness Engineering实践和分享
没有复杂的Claude/Codex Harness,极致简单朴素的Harness Engineering实践
项目人工智能成分100%,本文能工智人成分100%
内部版本 bytetech
Harness Engineering
2026年2月,OpenAI发布了一篇Harness Engineering文章
构建并交付一款软件产品,其中没有一行代码是人工编写的
人类掌舵,智能体执行
五个月后,该代码仓库已经拥有约一百万行代码,从应用逻辑、基础设施、工具、文档到内部开发者工具应有尽有
3月开始我做一个阅读产品的side project,计划实践一下Harness Engineering
三个月过去,同样没有一行代码是人写的,项目已经完全由Agent接管
接管的不只是开发,而是包含设计、开发、测试、运维等全流程
3个月是因为这是side project,另外就是纯token有限
整个的技术栈非常简单透明,同时证明了Harness Engineering可以非常朴素
这8个里面有3个是我写的(广告)
- 模型:GPT-5.5 / DeepSeek-V4-Pro
- GPT-5.5绝对主力,DS在没token的时候顶一下
- Agent:Pi Agent
- 除了极早期使用了Claude Code,中途换成了Codex一小段时间,绝大部分的主要工作都是用Pi Agent完成的
- 上下文管理:pi-context
- 最早切换到pi其实是为了迭代这个插件,进过多轮迭代已经完全重写到2.0版本非常好用了,让模型长期保持低占用高智力工作
- 任务管理:pi-tmux-task
- Pi没有后台任务功能,对于长耗时异步任务(比如subagent调度/开发服务运维等),后台任务能力是必要的,但没必要过度设计tool,让agent用tmux管理就好了
- 联网搜索:pi-web-search
- 搜文档查资料必备
- Sub Agent:Paseo
- Pi没有sub-agent功能,理论上也可以用pi cli实现,但paseo封装好了,还有ui方便观察
- 通用Skill: waza
- think和hunt非常好用
- IDE: Zed
- 代码变成了只看不写之后,VS Code甚至都太重了,Zed更轻量同时很方便的切换worktree变得很好用,但VS Code的Git功能比Zed好用太多了
整个项目是monorepo组织的,包含前后端,为了简单保持全栈Nodejs(早期后端是go写的,未来也可能切换到go,毕竟内存占用低)
整体是Spec-Driven Development(SDD)模式,目前人和Agent都会提需求(issue),然后进入开发流程,人只决策做什么?怎么做?以及验收有没有做好
统计了一下代码整体30+万行,大部分都是文档,生产代码和测试代码各占一半
| 语言 | 类型 | 文件 | 行数 |
|---|---|---|---|
| Markdown | 任务类(SDD) | 800+ | 17w+ |
| - | 说明类 | 100+ | 1w+ |
| - | 合计 | 900+ | 18w+ |
| TypeScript/TSX | 生产代码 | 400+ | 7w+ |
| - | 测试代码 | 200+ | 7w+ |
| - | 合计 | 600+ | 14w+ |
统计才发现它们似乎都有着合理的文件行数,平均200-300行
文档工程
Harness最重要的可能就是文档了,毕竟文档是上下文的重要组成,不仅仅是开发文档,还应该包含
- 产品:功能设计,思考,决策权衡和预期等
- 开发:架构,算法流程,数据关系等
- 设计:设计风格品味等
- 测试:测试文档和各种bug case记录
- 运维:环境运维手册
- …
一切需要被知道的知识都应该被文档化,只要有文档Agent就能干
更好的模型和更轻的SDD
早期用的是superpower,后来发现这个流程实在太重了
随着模型能力提升,在文档中塞太多内容/代码已经没有太大必要,于是我迁移到一个更轻量的自定义SDD上
所有任务只有两个文件,要做什么和要怎么做
- issue.md:简要描述任务目标,比如要实现什么功能、设计方向、解决什么bug等
- plan.md:记录解决方案、思考决策、实现步骤拆分等等(类似于superpower里spec和plan的融合压缩版)
因为项目是纯本地的,没有任何外部系统依赖,也没有GitHub issue
统一使用文件夹+markdown metadata语法管理,所有的内容都在本地
1 | - docs |
readme记录一些说明、规范和模板,比如目前的issue模板,利用metadata语法建立文档/代码之间的关联关系
模板其实都是Agent自己设计慢慢迭代出来的
1 | title: "Short issue title" |
除此之外,要保持文档更新,像维护项目代码一样维护文档,每个plan里都会要求更新相关文档
像OpenAI一样通过外部定时任务检查和更新文档也是一个好办法,但我发现在plan中加入自动更新文档机制,并且让文档们链接起来,模型在更新文档的时候就不容易遗漏,定时任务能发现的内容就比较有限了
项目质量保障
issue和plan驱动开发本身很简单,但要做好的工程还很远,模型很容易犯错
人也一样,不仅会犯错甚至还会偷懒,Agent有时候比我靠谱
独立review反馈
目前每个plan写完和开发完都都有一个独立的review,去检查plan是否完善,去检查实现是否完善
这两个Agent其实站在不同视角,这能很大程度上提高准确性和稳定性
完善的测试和环境
众所周知测试是很重要的质量保障工作,所有的plan都需要补充相关的测试,以及后续每个bug case都需要对应有测试补全,来持续保持质量
另外除了常规的单元测试和e2e测试来保障质量之外,我还补充了一个意图测试,像真实用户一样把产品功能都使用一遍,利用模型的“直觉”来发现问题
这里必须有视觉模型,像真实用户一样就要求多截图去看,文本模型这块只能猜效果很差
首先独立建立整个产品的功能梳理,对齐当前产品预期(需要同步更新文档)
相比e2e测试,文档在全不在细,需要列清楚预期的功能,但不需要写细节,比如只需要写在xx处有添加入口,支持输入文本和链接
同时还要生成对应的测试环境数据,并且为支持并行测试(在一个意图测试环境中可以并行多个测试agent,比如一个跑首页,一个跑设置页),还需要对所有不可逆的测试项(比如删除某个配置)设计独立的测试数据
另外这里callback回文档中的areas字段,是为了标识任务的改动范围,在plan完成后就只需要跑对应的测试来节省时间
人类决策和把关
项目早期我还会看spec和plan文档,甚至有code review,但随着项目变得复杂(有些看不懂),任务变多(看不过来)
现在流程里,人只做两件事
- 确认Plan
- 确认代码合并
但不再看各种文件或者代码本身,而是查看摘要,查看结果,以及对话询问去检查(有点像面试)
- 所有的plan都要提供任务解释和关键决策等信息
- 所有涉及ui的plan都提供设计图或者html交互预览
- 所有代码合并都提供关键改动说明,并提供项目的预览地址
以此做到即使不写一行代码,也对项目的所有关键逻辑和流程都有清晰和准确的认知
确保做决策的人对这件事有足够的认知,才能做出正确的决策
Agent并发和管理
当第一次建设并跑完整个意图测试之后,Agent一次写了20多个issue,我就知道这个人是看不过来的
于是尝试让Agent自己管理去解决这些任务,就有了多agent架构
所谓:人只需要和一个主Agent交流,这个Agent会管理好其他所有Agent干活
由于许多任务都是异步的,比如可以开5个线程去研究issue,再开3个线程去开发已经批准通过的plan,只要有线程空着,就可以自动找一个任务分配去做
此时就会发现这个主Agent的上下文会由各种不太相关的任务交织在一起,这对模型的要求非常高,尤其是指令遵循能力,要能做多任务切换,讨论产品设计,讨论技术方案,还要做任务编排,包括优先级定义,任务冲突分析等等工作,类似一个项目经理+技术Leader的角色吧
以至于目前只有GPT-5.5能干,而且干的也不是很好,GPT-5.4/DeepSeek直接没法用,Gemini更是不靠谱
看来暂时只有人类能做好这种八爪鱼的工作
比如目前Agent在和用户讨论一个plan的设计,此时有一个agent开发完了,要用来批准合并,理想情况下Agent在和用户讨论完之后,就应该把合并的事情拿出来了给用户看了
问题之一是丢任务(低概率),Agent有时候会直接忘记不管这个事情(说我以为这是干扰通知)
问题之二是主动性不够(高概率),Agent在和用户讨论完之后不会主动的把这个事情拿出来给用户,一定得要用户问“看看下一个任务”
丢任务的问题harness能解决,但主动性迭代了很多轮都没有显著提升,可能得靠模型迭代了
不过目前除了能力问题,当并发多了之后会明显感觉主agent成为新的瓶颈了,收到sub-agent消息要去处理,这时候没空和用户对话了,可能也和subagent调度有关系,比如拆分面向用户和后台任务的两个线程,但改动就比较大了,目前还是开多个tab跑主agent来解决
另外一个方向就是把主动性的问题交给程序,比如看板流程驱动(类似multica的产品)
Harness怎么在团队中落地和协作可能和并发问题类似
允许多个用户去创建issue,应该由一个带并发的agent来处理这件/些事,云端agent可以直接共享一个数据源
本地agent和云端agent协同可能得靠类似git或者其他的同步机制了
Harness本身的迭代
Harness仍然是围绕上下文的工作,只是上下文变成的项目文档,Agent的上下文从人类组织,到人类提供Agent组织
Harness不是一次建成的,而是文档和工作流的自然迭代
Harness去迭代项目,也需要有另一个外部循环去迭代Harness,优化现有的工作流(某种意义上来说也是一种项目级别的自我迭代)
最简单就是如果发现当前对话执行得不是很好,就可以再开一个Agent,让它去检查当前对话有什么可以优化的地方,进而优化整个工作流
当然也可以做成定时任务,定期回顾对话去迭代Harness
Harness也不是标准答案,更像是对这个项目的量体裁衣
不同的项目可能会有不同的Harness,但可以有预制的版型,再辅助一些定制化改动,而且不止是软件工程领域,还会有各种领域的Harness
有了各种领域的Harness,也会有做Harness模板套用工作的Meta Harness
突然也理解为什么FDE(Forward Deployed Engineer前沿部署工程师)会火了
人还需要做什么
Harness Engineering无疑在软件开发上带来巨大变革,但仍然是人类掌舵,智能体执行
短期看,一方面是需要阻止Agent在项目里堆屎山,积极的引导AI重构,另一方面是验收测试,模型视觉能力还是比较弱的,很难发现交互体验和UI上的问题,比如某些交互体验是连续动画,仅靠代码/截图也很难发现问题
长期看人只需要做产品和技术的关键决策,Agent可以提供各种的产品/技术方案让人来选
只要产品是给人用的,就需要人来对齐,想要什么样的产品,来提需求和砍需求
关于技术决策可能存疑,为什么人能做出更好、更对的决策呢?为什么Agent做不出来?(难道你比模型聪明?)
我觉得Agent做不出来不会是模型能力问题,而是缺少上下文,因为人会对这个产品有一个虚拟的未来预期,也就是这个产品未来会变成什么样子,但是这个预期没有变成上下文写在文档里,或者说它甚至很难变成一个文档,就像乔布斯说的“很多时候,人们在看到产品之前,并不知道自己真正想要什么”