Harness Engineering · 智能体优先的软件开发

OpenAI 用 5 个月、3 名工程师、零行手写代码交付了一个百万行级产品的内部 beta 版。本文精读其官方工程博客,提炼这套「人类掌舵、智能体执行」的方法论:环境怎么搭、知识怎么存、架构怎么约束、熵怎么清理。

来源:OpenAI《工程技术:在智能体优先的世界中利用 Codex》 · 作者 Ryan Lopopolo · 2026-02-11
0 行手写代码 ~100 万行 ~1500 PR 1/10 时间 地图而非手册 渐进式披露 黄金原则 熵与垃圾回收
01
一次极端实验:空仓库起步

他们给自己加了一条硬约束,目的是逼出「工程速度提升数个数量级」所必需的条件

0
手写代码行数
~100 万
代码行数(5 个月)
~1500
被合并的 PR
1/10
相比手写所需时间

2025 年 8 月下旬,团队向一个空的 Git 仓库做了第一次提交。初始架构——仓库结构、CI 配置、格式化规则、包管理器设置、应用框架——全部由 Codex CLI 使用 GPT‑5 生成。连指导智能体如何在仓库中工作的 AGENTS.md 本身,也是 Codex 写的。

五个月后,这个仓库拥有约 100 万行代码,涵盖应用逻辑、基础设施、工具、文档到内部开发者工具。期间约 1500 个 PR 被创建与合并,而推动 Codex 的只有 3 名工程师——相当于人均每天 3.5 个 PR。更反直觉的是:当团队扩大到 7 人时,吞吐量不降反升

核心理念:不手动编写代码

整个开发过程中,人类从未直接贡献过任何代码行。人类始终参与,但工作层次变了:优先处理工作、把用户反馈转化为验收标准、验证结果。当智能体卡住时,团队把它当作一个信号——去识别缺失的工具、约束或文档,然后依然由 Codex 自己编写修复

这个数字意味着什么

通常「团队变大、人均产出下降」是软件工程的铁律(沟通成本随人数平方增长)。这里之所以相反,是因为人类的工作不再是写代码,而是搭建让智能体能可靠工作的环境——环境投入是可复用、可累积的,第 7 个人能直接享受前 6 个人建好的 harness。这是「规模收益递增」而非递减。

02
重新定义工程师的角色

「再努力一点」不再是解法;新的解法是「还缺什么能力,怎么让它对智能体清晰可读且可强制执行」

由于没有人工编码,工程师的工作重点转向了系统、架构和杠杆作用。早期进展比预期慢,但原因不是 Codex 能力不足,而是环境规范不够明确——智能体缺乏实现高级目标所需的工具、抽象层和内部结构。

深度优先的工作方式

  • 把大目标拆解为更小的构建模块(设计、代码、评审、测试…)
  • 提示智能体去构建这些模块,再用这些模块解锁更复杂的任务
  • 出问题时,人类介入并追问:「究竟还需要什么样的能力?我们该如何让这个能力对智能体既清晰可读又可强制执行?」

人类几乎完全通过提示与系统交互

工程师描述任务 → 运行智能体 → 允许其开一个 PR。为了推动 PR 完成,会指示 Codex:

  1. 在本地审核自己的更改
  2. 在本地和云端请求额外的特定智能体审查
  3. 对任何人工或智能体给出的反馈做出响应
  4. 循环往复,直到所有智能体审核人员都满意 Ralph Wiggum 循环

Codex 直接使用标准开发工具gh、本地脚本、嵌入仓库的技能)收集情境,无需人工把内容复制粘贴到 CLI 里。

人工评审:从必选项变成可选项

人类可以审核 PR,但并非必须。随着时间推移,团队把几乎所有评审工作都调整为智能体对智能体的方式。这是整个方法论里最反直觉、也最能释放吞吐量的一个转变。

Codex 还会直接使用标准开发工具完成闭环:拉取审查反馈、行内回复、推送更新,并且经常自己压缩并合并自己的 PR

03
提高应用程序的可读性

代码吞吐量上去之后,瓶颈变成了人工 QA——而人类的时间和注意力是固定的硬约束

唯一的出路是:让应用的 UI、日志、指标对 Codex 直接可读,把人类的验证能力「外包」给智能体。

🖥️ 让智能体能真正「用」这个应用

  • 应用可根据 git worktree 启动 → Codex 能为每次更改起一个独立实例
  • Chrome DevTools 协议接入智能体运行时
  • 创建处理 DOM 快照、截图、导航的技能
  • 于是 Codex 能:复现 bug → 验证修复 → 直接推理 UI 行为

📊 给智能体一整套可观测性

  • 日志、指标、追踪经由本地可观测性栈暴露给 Codex
  • 该栈对任一工作树都是临时的:任务完成,连同日志指标一起销毁
  • Codex 可用 LogQL 查日志、PromQL 查指标、TraceQL 查追踪
  • 于是这类提示变得可行:「确保服务启动在 800ms 内完成」「这四个关键用户旅程中的任何 span 都不得超过两秒」
本地可观测性栈:让 Codex 用数据验证自己的改动 应用实例 每 worktree 一个 emit Vector 分发 Victoria Logs Victoria Metrics Victoria Traces LogQL PromQL TraceQL Codex 查询 · 关联 · 推理 反馈循环:修复代码 → 重启应用 → 重跑负载 → 测 UI → 重复 整套栈随工作树临时创建、任务完成后销毁 —— 不留状态,可无限并行
应用 → Vector → Victoria 三件套 → 查询 API → Codex → 回写修复,形成闭环
单次运行超过六小时

有了这些能力后,团队经常见到单次 Codex 运行在单个任务上持续工作超过 6 小时——通常发生在人类睡觉的时候。这是「人类时间不再与产出线性绑定」的直接体现。

04
把代码仓库设为「记录系统」

情境管理是让智能体在大型复杂任务中有效的最大挑战之一

「要给 Codex 的是一张地图,而不是一本 1,000 页的说明书。」 —— 本文最核心的一句话

他们先试了「一个巨大的 AGENTS.md」方案,结果是一次失败的尝试。四个失败原因值得逐条记住:

① 情境是稀缺资源

巨大的指令文件会挤掉任务、代码和相关文档——智能体要么错过关键约束,要么针对错误的约束进行优化。

② 过多的指导反而无效

当一切都「重要」时,一切都不重要。智能体最终会退化成本地模式匹配,而不是有意识地导航。

③ 它会立即腐烂

庞杂手册会变成陈旧规则的坟场。智能体无法判断哪些还有效;一旦人类停止维护,它就成了「颇具吸引力的麻烦源头」。

④ 很难核实

单个大文件不适合机械检查(覆盖率、新鲜度、所有权、交叉链接),因此漂移不可避免

正确做法:AGENTS.md 当目录,docs/ 当记录系统

一份简短的 AGENTS.md(约 100 行)被注入情境,主要用作地图,指向其他地方更深层的真实信息源。真正的知识库位于结构化的 docs/ 目录。

AGENTS.md                      ← 约 100 行,只做地图
ARCHITECTURE.md                ← 域与包分层的顶层地图
docs/
├── design-docs/               ← 已编目索引,含验证状态 + 核心理念
│   ├── index.md
│   ├── core-beliefs.md
│   └── ...
├── exec-plans/                ← 执行计划:一等工件
│   ├── active/
│   ├── completed/
│   └── tech-debt-tracker.md
├── generated/                 ← 自动生成,如 db-schema.md
│   └── db-schema.md
├── product-specs/
│   ├── index.md
│   ├── new-user-onboarding.md
│   └── ...
├── references/                ← 外部文档的 llms.txt 快照
│   ├── design-system-reference-llms.txt
│   ├── nixpacks-llms.txt
│   └── uv-llms.txt
├── DESIGN.md
├── FRONTEND.md
├── PLANS.md
├── PRODUCT_SENSE.md
├── QUALITY_SCORE.md           ← 对每个产品域/架构层评分,追踪差距
├── RELIABILITY.md
└── SECURITY.md
这实现了「渐进式披露」

智能体从一个小而稳定的切入点开始,并被指引下一步去哪看,而不是一开始就被淹没。同时他们严格执行:专职 linter 和 CI 作业会验证知识库的更新状况、是否已交叉链接且结构正确;还有一个定期运行的 「doc-gardening」智能体,扫描不再反映真实代码行为的过时文档,并发起修复 PR。

计划被视为一等工件:小幅变更用轻量临时计划,复杂工作记录在执行计划中,附带进度与决策日志,一并提交进仓库。活跃计划、已完成计划、已知技术债务都版本化集中存放——让智能体不依赖外部情境即可运行。

05
目标是「智能体的可读性」

代码库完全由智能体生成,所以第一优化目标不是人类可读性,而是 Codex 的可读性

「从智能体的角度来看,它在运行时无法在情境中访问的任何内容都是不存在的。」
智能体知识的边界:看不到的东西就不存在 Codex 能看到的世界 代码 · Markdown · Schema · 可执行计划 日志 / 指标 / 追踪 · CI 结果 = 仓库内、已版本化的工件 不可见的知识(对智能体而言等于不存在) Google Docs Slack 讨论 / 聊天记录 人们头脑中的隐性知识 口头约定 / 临时决定 唯一解药:编码成 Markdown 提交进仓库 那次让团队就架构模式达成一致的 Slack 讨论?如果智能体发现不了它,它就像「迟了三个月入职的新员工」一样对此一无所知。
要让智能体知道,就必须把知识以仓库内工件的形式编码下来

「枯燥」的技术反而更好用

他们倾向于选择可以完全内化于仓库中进行推理的依赖项和抽象。对智能体来说,通常被称为「枯燥」的技术,由于其可组合性、API 稳定性、以及在训练集里的充分表现,往往更容易建立模型。

一个具体取舍

他们没有引入通用的 p-limit 风格并发包,而是自己实现了带并发的 map 辅助函数。理由:它与他们的 OpenTelemetry 仪表紧密集成、具备 100% 测试覆盖率、行为完全符合运行时预期。有时重新实现一个功能子集,比绕过公共库中不透明的上游行为更便宜。

给 Codex 更多情境,重点是组织和展示正确的信息,让智能体能基于它推理,而不是用临时指令把它压垮。就像给新队友做入职引导(产品原则、工程规范、团队文化)一样,把这些提供给智能体会带来更一致的输出

06
规范架构与品味

仅靠文档无法保持完全由智能体生成的代码库的连贯性——要靠强制执行不变量

「通过强制执行不变量,而非对实施过程进行微观管理,我们令智能体能够快速交付,而且不会削弱基础。」

例如:他们要求 Codex 在边界处解析数据形状(parse, don't validate),但不规定具体实现方式——模型似乎偏好 Zod,但他们没有指定库。

分层领域架构:依赖只能「向前」,横切关注点只能从 Providers 进入 Types Config Repo Service Runtime UI 依赖方向严格单向:Types → Config → Repo → Service → Runtime → UI(只允许「向前」) Providers —— 横切关注点的唯一显式入口 认证 · 连接器 · 遥测 · 功能标志 Utils 位于界限之外,向 Providers 供输入 App Wiring + UI 装配层,把 Providers 注入各域 其他任何依赖路径都不被允许 —— 由自定义 linter(也是 Codex 写的!)与结构测试机械地强制执行 这种架构通常要等到几百人规模才需要;对编码智能体而言,它是早期的先决条件
每个业务域划分为固定层,依赖方向严格验证,横切关注点单一入口

「品味不变式」与错误信息的妙用

在以人为本的流程里显得迂腐的规则,有了智能体就成了倍增器

因为这些规则一旦编码,就能立即应用于所有地方。生成的代码不总是符合人类的风格偏好,这没关系——只要输出正确、可维护、对未来的智能体运行清晰易读,就算达标。人类的品味通过评审评论、重构 PR、面向用户的 Bug 持续反馈回系统;当文档不够完善时,就把规则转化为代码

07
吞吐量改变了合并的理念

当智能体的吞吐量远超人类的注意力,传统的工程规范开始失效

尽量减少阻塞式合并门

仓库在运行过程中刻意减少阻塞合并门,Pull Request 的生命周期很短。

偶发失败用重跑解决

测试偶发失败通常通过后续重跑解决,而不是无限期阻碍进展。

纠错便宜,等待昂贵

在智能体吞吐量远超人类注意力的系统里,纠错成本低,等待成本高

注意这句限定,很重要

原文明确说:「在低吞吐量环境中,这样做是不负责任的。而在这里,这通常是正确的选择。」 这条经验不可直接照搬——它成立的前提是你已经有了可靠的可观测性、自动回滚能力和极高的修复速度。如果你的团队还在人工验证为主、回滚要半小时,那么「减少合并门」就是灾难。

08
「智能体生成」意味着什么 · 自主水平的跃迁

不只是业务代码——整个仓库的每一个角落

智能体的产出范围(这就是「整个代码库」的含义)

  • 产品代码与测试
  • CI 配置和发布工具
  • 内部开发者工具
  • 文档和设计历史
  • 评估框架
  • 审阅评论和回复
  • 管理代码仓库本身的脚本
  • 生产仪表板定义文件

端到端:给一个提示,智能体能走完 11 步

1

验证代码库当前状态

先确认起点,不假设。

2

重现已报告的漏洞

用真实运行环境复现,而非推测。

3

录制演示故障的视频

用可视化证据锚定问题。

4

实施修复措施

在分层架构约束内改动。

5

运行应用验证修复

靠 CDP + 可观测性栈自证。

6

录制第二个视频演示解决

前后对比,形成可审查证据。

7

打开 Pull Request

走标准 gh 流程。

8

回应智能体与人类反馈

Ralph Wiggum 循环迭代。

9

检测并修复构建故障

自己收拾自己的烂摊子。

10

仅在需要判断时才交人工

人只做真正的判断。

11

合并更改

自行压缩并合并 PR,完成闭环。

原文的重要免责声明,别忽略

「此行为在很大程度上取决于此代码仓库的具体结构和工具不应在没有类似投入的情况下假定它可以泛化——至少目前还不行。」换句话说:这不是开箱即用的能力,而是先投入建好 harness 之后的回报

09
熵与垃圾收集

完全自主的智能体也引入了新问题:它会复现仓库里已有的模式——包括那些不够理想的模式

这不可避免导致漂移。最初人类手动处理:团队每周五(占一周的 20%)都要花时间清理「AI 残渣」。原文的评价很坦率:「不出所料,那并不具备可扩展性。」

解法:把「黄金原则」编码进仓库 + 建立循环清理流程

黄金原则是带主观意见的机械规则,目的是保持代码库对未来智能体运行的可读性与一致性。两个例子:

原则一:共享优先

倾向于使用共享的实用程序包,而不是手工编写的辅助工具,以便将不变式集中管理

原则二:禁止「YOLO 式」探测

不使用猜测式的探测数据——验证边界,或依赖类型化的 SDK,这样智能体就不会意外地基于猜测的结构进行构建。

后台 Codex 任务 = 技术债务的「垃圾回收器」 后台 Codex 任务 定期运行 扫描偏差 对照黄金原则 + 质量评分 发起针对性重构 PR 小、聚焦、可快速审查 一分钟内审查并自动合并 大多数如此 「技术债务就像一笔高息贷款」 不断地以小额贷款的方式偿还,总比让债务累积后痛苦地一次性解决要好得多
人类的品味一旦被捕捉,就会持续应用于每一行代码
效果:从「每周五集中清理」到「每天发现并解决」

这套机制让他们能够每天发现并解决不良模式,而不是让它们在代码库中传播数天或数周。原文把它类比为垃圾回收(GC)——持续、自动、小额,而不是周期性的人工大扫除。

10
他们仍在学习的内容

原文诚实地列出了三个「还不知道」

❓ 架构连贯性如何演化

在一个完全由智能体生成的系统中,架构连贯性会随着时间的推移如何演变,尚不清楚。

❓ 人类判断力用在哪

人类的判断力在哪些方面能发挥最大作用,以及如何把这种判断力编码使其发挥更大作用。

❓ 模型变强后怎么办

随着模型能力不断增强,这套系统在长期会如何演变。

「构建软件仍然需要纪律,但纪律更多地体现在支撑结构上,而不是代码上。」 —— 保持代码库一致性的工具、抽象和反馈回路变得越发重要
当前最棘手的挑战

「我们当前最棘手的挑战集中在设计环境、反馈回路和控制系统方面,帮助智能体实现我们的目标:大规模构建和维护复杂、可靠的软件。」

11
可落地清单:把方法论带回到自己的项目

按投入产出比排序,可直接照做与必须谨慎照做的分开列

实践具体做法可照搬度
AGENTS.md 当目录不当手册控制在 ~100 行,只做地图与索引;真正的知识放结构化 docs/,按 design-docs / exec-plans / references 分类
知识进仓库,不进人脑把架构决策、约定、Slack 里达成的共识,全部以 Markdown 提交进仓库;建立「文档园艺」任务定期清理过期文档
渐进式披露入口小而稳定,指引下一步去哪看,而不是一次性灌入全部约束
用 lint 强制架构不变量分层依赖方向、命名约定、文件大小上限等机械化;错误信息里写修复指引
让应用对智能体可读每 worktree 起一个实例;接入 DevTools 协议;临时可观测性栈 + LogQL/PromQL 供查询
黄金原则 + 后台清理循环把品味写成机械规则,用后台任务扫描偏差、发小重构 PR、快速自动合并
执行计划作为一等工件复杂工作的计划、进度、决策日志一并提交进仓库,让智能体不依赖外部情境
减少阻塞式合并门缩短 PR 生命周期;偶发失败靠重跑而非阻塞 需先有回滚能力
几乎取消人工代码评审转向智能体对智能体评审 需先建好验证体系
三条最容易被误读、也最危险的地方
  • 「零手写代码」是实验约束,不是目标。他们刻意加这个限制,是为了逼出必需的环境建设。把它当 KPI 是本末倒置。
  • 「减少合并门」「取消人工评审」有严格前提。原文明确限定「在低吞吐量环境中这样做是不负责任的」。没有可靠的自动验证与快速回滚,照搬就是事故。
  • 端到端自主不可泛化。原文明确说「不应在没有类似投入的情况下假定它可以泛化」。那是建好 harness 之后的回报,不是起点。

一句话总结

当写代码不再是瓶颈,工程的重心就从「代码本身」转移到了承托代码的那一层——环境、约束、知识结构与反馈回路。人类掌舵,智能体执行:人类负责设计环境、明确意图、构建反馈回路;智能体负责在其间可靠地工作。而衡量这套体系的指标,也从「写了多少代码」变成「智能体能自主、正确、一致地走完多少步」。