Harness Engineering: 讓 AI Agent 真正能幹活的工程紀律
OpenAI 這篇 Harness engineering: leveraging Codex in an agent-first world 蠻有料的,是內部團隊一個極端實驗的實戰報告: 從一個空的 git repo 開始,五個月寫出約一百萬行程式碼、開了 1,500 個 PR、做出真實有用戶在用的內部產品。三個工程師起步(後來七個),每人每天平均 3.5 個 PR,他們估計比人工寫快了 10 倍。
最關鍵的限制條件: 工程師一行 code 都不寫,所有程式碼包含應用邏輯、測試、CI、文件、observability、內部工具,全部由 Codex 寫。
這篇真正值得讀的不是「AI 寫了多少 code」,而是他們把這套方法論命名成 harness engineering ── harness 字面意思是「馬具」,引申為「讓動力能拉動車子的那套裝備」。當寫 code 不再是工程師的核心工作,人類的價值轉移到打造那套讓 agent 能可靠工作的環境、工具、約束、回饋迴路。這篇就是在講要怎麼打造這套 harness。
小編幫大家整理了「要怎麼做才能改進你的 agent」這個視角下的具體做法。
1. 心態切換: 失敗了不是「再試一次」,而是「補哪個能力」
這是整篇文章最重要的思維轉換。團隊早期進度比預期慢,不是因為 Codex 不行,而是環境沒準備好 ── agent 缺少必要的工具、抽象層、內部結構。
當 Codex 任務失敗時,他們從不問「怎麼讓 prompt 更好」,而是問:
缺了什麼能力? 怎麼讓 agent 看得懂、做得到、且可被機械驗證?
然後讓 Codex 自己把這個能力補進 repo。這個迴路本身就是 harness engineering 的核心動作: 每次 agent 撞牆,就在 harness 上補一塊。久了 harness 越來越完整,agent 越來越能獨立工作。
小編覺得這點蠻關鍵: 大部分人遇到 agent 出錯第一反應是調 prompt 或換模型,但真正的槓桿在於改造它身處的「世界」。
2. 讓應用對 Agent 可讀: agent 看不到的東西等於不存在
當程式碼產出量暴增,瓶頸變成人類的 QA 能力。他們的核心策略是把更多東西做成 agent 可讀,具體做了這幾件事:
🔹 每個 git worktree 都能獨立啟動 app ── Codex 拿到任務後可以開一個自己的 instance,不會跟其他任務互相干擾。
🔹 接 Chrome DevTools Protocol 進 agent runtime ── 寫了 skills 讓 Codex 能截圖、操作 DOM、做頁面導航,因此能自己重現 bug、驗證修復、推理 UI 行為。
🔹 完整的本地 observability stack ── Logs、metrics、traces 都暴露給 Codex,可以用 LogQL 查 logs、PromQL 查 metrics、TraceQL 查 traces。每個 worktree 有自己 ephemeral 的觀測 stack,用完就丟。
有了這套,像「確保服務啟動小於 800ms」「這四個關鍵 user journey 任何一個 span 不能超過兩秒」這種 prompt 才變成 agent 可以實際處理的任務。團隊現在常看到單一 Codex 任務連續跑超過六小時(通常是人類睡覺的時候)。
編按: 這條原則用一句話講就是「From the agent’s point of view, anything it can’t access in-context while running effectively doesn’t exist.」── 從 agent 的角度看,它在執行時沒辦法 in-context 取得的東西,等於不存在。Slack 討論、Google Doc、人腦裡的默會知識,對 agent 來說都是黑洞。要讓 agent 強,就要把這些東西想辦法塞進 repo。
3. AGENTS.md 是目錄,不是百科全書
Context 管理是讓 agent 在大型複雜任務中有效的最大挑戰之一。團隊一開始用「一個大 AGENTS.md」的做法,失敗得很徹底。原因:
- Context 是稀缺資源: 巨型指令文件擠掉真正的任務、code、相關 docs,agent 反而抓不到重點
- 太多指導等於沒有指導: 當每件事都「重要」,沒有東西是重要的,agent 會退化成在局部 pattern matching
- 它腐化得超快: 大文件變成過期規則的墓園,agent 分不出哪些還有效,最後變成「有吸引力的麻煩製造器」(attractive nuisance)
- 無法驗證: 一坨文字無法做機械化檢查(覆蓋率、新鮮度、所有權、交叉引用)
他們的做法是把 AGENTS.md 當目錄(table of contents)用,控制在約 100 行,指向 docs/ 下結構化的知識庫:
docs/
├── design-docs/ # 設計文件 + core-beliefs.md
├── exec-plans/ # 執行計畫 (active/completed/) + tech-debt-tracker.md
├── product-specs/ # 產品規格
├── references/ # 第三方 library 的 llms.txt
└── DESIGN.md / FRONTEND.md / QUALITY_SCORE.md / RELIABILITY.md / SECURITY.md
關鍵詞是「漸進式揭露(progressive disclosure)」: agent 從一個小而穩定的入口進來,被教會去哪裡找下一層資訊,而不是一開始就被全部資訊淹沒。
而且這套文件結構是機械化強制執行的: 專屬的 linter 和 CI 驗證知識庫的時效性、交叉引用、結構正確性,還有一個定期跑的 “doc-gardening” agent 自動掃描過期文件並開 PR 修正。
4. 用「無聊」的技術,必要時讓 agent 自己重寫
因為整個 repo 是 agent 生成、優化目標是 agent 的可讀性(不是人類的),他們的技術選型也跟著變:
- 偏好「無聊」的技術 ── 組合性好、API 穩定、訓練資料裡有大量代表
- 偏好可以完全在 repo 內被理解和驗證的依賴和抽象
- 有時候讓 agent 重寫一個簡化版的 library,比繞過第三方 library 不透明的行為更便宜
舉例: 他們不用 p-limit 這類通用套件,而是讓 Codex 自己寫一個 map-with-concurrency helper ── 跟自己的 OpenTelemetry instrumentation 緊密整合、100% 測試覆蓋率、行為完全符合 runtime 預期。
這個取捨蠻反直覺的,但邏輯一致: agent 看不懂的依賴 = 風險,自己重寫雖然增加 code 量,但換來完全可控的行為。
5. 用機械化規則執行架構品味
光有文件不夠,文件約束不了一個產出極快的 agent。他們的做法是「強制不變量(invariants),但不微管理實作」。
每個業務 domain 切成固定分層架構: Types → Config → Repo → Service → Runtime → UI,依賴方向嚴格驗證、跨領域關注(auth、telemetry、feature flags)只能透過唯一介面 Providers 進來。任何違反都被 custom linter 和結構測試擋下。
更妙的是這些 linter 也是 Codex 寫的,而且錯誤訊息會直接寫上修復指示,這樣下次 agent 撞到錯誤訊息就直接知道該怎麼改。
編按: 「parse, don’t validate」是他們強制的另一個品味 ── 在邊界把資料 parse 成型別,而不是用 if/else 驗證。模型自己愛用 Zod,他們沒指定但結果一致。具體做法可參考原文連結的 blog。
這種架構治理通常等到團隊有幾百人才會做,但在 agent-first 世界裡是早期必備: 因為約束才是讓速度不帶來腐化的關鍵。中央強制邊界,局部允許自由 ── 這跟管一個大型工程組織的 platform 部門很像。產出風格不一定符合人類偏好,但只要正確、可維護、對未來 agent 可讀就過關。
6. 從 throughput 反推: 重新設計 merge 流程
當 Codex 一天開出幾十個 PR,傳統工程習慣反而變成阻力。團隊的做法:
- 最少的 blocking merge gates ── 不要讓 PR 卡很久
- PR 都是短命的 ── 不搞長 branch
- Test flake 用「再跑一次」處理 ── 而不是無限期 block 進度
- 大部分 review 都是 agent-to-agent: Codex 自己 review 自己的 code,再請其他 agent reviewer 給意見,跑一個迴圈直到所有 agent reviewer 都滿意 ── 這個模式他們叫 Ralph Wiggum Loop
文章裡有句蠻坦白的話:「在低 throughput 環境這樣做是不負責任的,但在這裡通常是對的取捨。」邏輯是: agent throughput 遠超過人類注意力時,修正成本很便宜,但等待成本很貴。
7. 垃圾回收: 把品味寫成可機械執行的「黃金法則」
agent 會複製 repo 裡已有的 pattern,包括不好的。一開始團隊每週五花 20% 時間清理「AI slop」,但這完全不 scale。
後來改成把「golden principles」寫進 repo,例子:
- 偏好共用 utility package,不要手寫 helper(讓不變量集中)
- 不准 YOLO 式探測資料形狀 ── 在邊界驗證或用 typed SDK,agent 不能憑猜測的 shape 蓋東西
然後一組背景 Codex 任務定期掃描偏差、更新品質分數、開 refactoring PR。大部分一分鐘內就能 review 完並自動 merge。
這就像 GC: 技術債是高利貸,持續小額還款比累積到痛苦爆發好得多。人類的品味只需要捕捉一次,之後就在每一行 code 上自動執行。
自主性的天花板: end-to-end 跑完一個 feature
把上面這些 harness 元件全部組合起來後,repository 最近跨過了一個門檻: 給 Codex 一句話的 prompt,它可以自己
- 驗證 repo 當前狀態
- 重現報告中的 bug
- 錄一段影片證明 bug 存在
- 實作修復
- 開 app 自己驗證修復生效
- 錄第二段影片證明問題解決
- 開 PR
- 回應 agent 和人類的 review
- 偵測並修 build failure
- 只在需要人類判斷時才 escalate
- 自己 merge
文章誠實地補了一句: 這種程度的自主性高度依賴這個 repo 的特定結構和工具,沒做類似投資的 repo 不能假設能複製。
整篇最值得記住的: 紀律從 code 移到了 scaffolding
文章最後一段把整個哲學收得很漂亮:
寫軟體仍然需要紀律,但紀律展現的地方從 code 本身移到了 scaffolding。維持 codebase 連貫的工具、抽象、回饋迴路,重要性越來越高。我們最困難的挑戰,現在集中在設計環境、回饋迴路、和控制系統,讓 agent 能完成我們的目標: 大規模建構並維護複雜可靠的軟體。
(Building software still demands discipline, but the discipline shows up more in the scaffolding rather than the code.)
回頭看 harness engineering 這個詞用得蠻精準的: 它不是「prompt 工程」、不是「agent 調教」,而是整套讓 agent 能拉得動車的裝備工程。這篇文章列出的每一條技術 ── worktree 隔離、observability stack、AGENTS.md 當目錄、layered architecture、custom linter、agent-to-agent review、golden principles、doc-gardening agent ── 都是這套裝備的具體零件。
如果你正在打造 coding agent 或 agent-driven 系統,小編覺得這篇有兩個層次的啟發:
- 戰術層: 文章裡的每一條都是可以馬上偷的 pattern。worktree、observability、文件結構、layer architecture 這些不需要 OpenAI 等級的資源也能做。
- 戰略層: 「agent 做不好不是 prompt 問題,是 harness 不夠好」這個心態,會徹底改變你投資工程資源的方向。
有興趣的請完整讀原文: Harness engineering: leveraging Codex in an agent-first world。