↓

Harness Engineering 簡介與讀後心得:用一個貪食蛇專案驗證「機械化執行」

··
資訊科技應用 學習筆記 Harness Engineering AI Agent Claude Code TDD Linter

Harness Engineering(駕馭工程)是 OpenAI 在 2026 年 2 月提出的工程做法,出處是〈Harness Engineering: Harnessing Codex in an Agent-First World〉。這篇文章後來被整理成一個公開的學習倉庫(deusyu 的 harness-engineering),本文依該整理閱讀。

Part 1 介紹概念,Part 2 記錄實作驗證。概念歸原作者,Part 2 的實作與修正是作者自己的紀錄。


Part 1:簡介
#

核心轉變
#

傳統:人寫程式碼 → 機器執行
HE:  人設計約束 → AI 寫程式碼 → 機器執行

工程師的產出,從程式碼變成一套約束系統:AGENTS.md、架構規則、自訂 linter、回饋迴路。一句話概括是「人類掌舵,智能體執行」。

六個核心概念
#

概念 一句話
倉庫即記錄系統 不在倉庫裡的東西,對 AI 不存在(Slack、腦中的知識都看不到)
地圖而非手冊 AGENTS.md 是目錄頁,不是百科全書,用漸進式揭露引導 AI 往下看
機械化執行 文件會腐爛,lint 規則不會;錯誤訊息要寫修復指令
智能體可讀性 優先選 API 穩定、訓練資料覆蓋好的「無聊」技術
吞吐量改變合併理念 糾錯成本低、等待成本高,PR 要短
熵管理 AI 會複製倉庫裡已有的模式,包括壞模式,需定期清理

原文的場景是 3 到 7 人的精英團隊、從空倉庫開始、預算沒有上限。倉庫的 README 也註明這些經驗並非普遍適用,需依情境判斷。


Part 2:讀後心得
#

驗證方式
#

六個概念中,機械化執行最容易停在口號,因此選它實作驗證:一個 Pygame 貪食蛇,唯一的規則是 src/logic.py 不得出現 import pygame,渲染與邏輯必須分開。

  • 做法:不在文件裡寫「請勿」,而是用 ast.parse() 寫架構 linter 掃描 logic.py,違規時以非零狀態結束並印出修復指令,再用 pre-commit hook 在每次 commit 前自動執行。
  • 規模:9 個 commit、33 個測試(4 個 linter、29 個邏輯)。

有效的地方
#

  • AST 比字串比對可靠。 註解裡的 # import pygame 不會被誤判,linter 只看可執行的節點。
  • 錯誤訊息的品質決定 AI 能否自行修正。 訊息寫明檔案、違反的規則與修復目標,AI 一次就改對。只寫 Architecture violation 的話,需要多輪對話才能收斂。因此修復指令是必要條件,不是優化項目。
  • Hook 是牆,文件是請求。 刻意在 logic.py 加入 import pygame 後 commit,被 hook 擋下,git log 確認沒有新 commit。文件說的是「不應該這樣做」,hook 讓人「做不到」。
  • 純函式的邏輯層容易測試。 六個函式都是「舊狀態進、新狀態出」,不依賴 pygame,也不需要模擬畫面。

被修正的地方
#

Code review 找到三個問題,原本的 TDD 週期都沒有發現:

問題 嚴重度 內容
step() 讓死掉的蛇復活 高 蛇已死亡時再呼叫,仍會移動並回傳活著的狀態
new_game() 修改了 dataclass 中 其他函式都回傳新物件,只有它直接改欄位,違反不可變原則
spawn_food() 棋盤全滿時當掉 中 20×20 棋盤蛇長到 400 格,候選清單為空,random.choice 出錯,而這是真實的獲勝情境

原因在測試清單是按「功能」列的,不是按「不變量」列的:

列法 能抓到什麼
按功能(吃食物、移動、撞牆) 三個問題都抓不到
按不變量(死亡狀態保持死亡、函式不改輸入、空輸入安全) 全部抓得到

後續在測試清單加入「不變量測試」一節,涵蓋邊界輸入、終端狀態、不可變性,以及輸入空間耗盡時的隨機函式。不可變性有更根本的做法:@dataclass(frozen=True) 讓 Python 在違反時直接拋出例外,這才是機械強制,而不是另一條約定。

Code review 另外發現 linter 本身的缺陷:logic.py 有語法錯誤時,linter 回傳 None 並以 0 結束,等於宣告沒問題,屬於漏報。應改為回報解析失敗。

幾點結論
#

  • 機械化執行是最後一道防線,不是唯一一道。 linter 守住架構邊界,守不住邏輯正確性。結構性的守護(linter、hook)與行為性的守護(測試)缺一層都有盲點。
  • 寫程式的 AI 與審查的 AI 要分開。 三個問題都由獨立的 code review subagent 找到,呼應 Anthropic 文章中「評估者與實作者分離」的說法:同一個 agent 寫完再自審,容易有確認偏誤。
  • 獨立 repo 帶來獨立的 hook 與測試閉環。 貪食蛇做成獨立的 git repo,pre-commit hook 只影響它自己,不干擾父倉庫。代價是第一次設定較麻煩。

單人開發的調整
#

倉庫中有一篇專門討論獨立開發者如何調整的文章(同樣由 deusyu 撰寫),依它整理的對照如下:

  • 直接可用: 倉庫即記錄系統(三天後的自己就是另一個團隊成員)、AGENTS.md(文章建議不超過 60 行)、機械化執行(需警惕測試帶來的虛假安全感)。
  • 需要降級: 吞吐量降為單線程,保留「快速迭代勝過追求完美」;熵管理降為每批程式碼完成後自問「這段醜不醜」,手動重構。
  • 需要重新定義: 智能體可讀性不再是選型標準,而是使用策略,在已選的技術裡優先用 AI 熟悉的慣用寫法。
  • 不需要: 多智能體並行編排、自動垃圾回收 agent、複雜的 session 管理。

該文章引用了 lalitm 的公開案例,其中的對比最具參考價值:把設計與實作都交給 AI,程式碼庫容易失控;自己做設計、讓 AI 負責實作並持續審查重構,才能順利發布。AI 放大的是判斷力,沒有判斷力時,放大的就是錯誤。

限制
#

  • 流程不能一律套用。 採用的 HE 流程是「設計規格、寫 TDD 計畫、每個任務交給全新的 subagent」。用在較大的功能很穩,但每個小任務都走一遍「寫測試、確認失敗、實作、確認通過、commit」,對快速驗證的原型太慢。原型因此改用「先做完整的最小流程,再整體測試一次」,嚴格逐步的流程留給高風險或長期維護的程式碼。
  • 貪食蛇是很小的案例。 它能驗證機械化執行這個概念,不能證明整套方法在大型專案或多人協作下依然成立。
  • 原文提到的規模數字(百萬行、上千個 PR)是 OpenAI 的敘述,無法獨立驗證。

參考
#

  • OpenAI,〈Harness Engineering: Harnessing Codex in an Agent-First World〉(2026 年 2 月)
  • deusyu,harness-engineering 學習倉庫(整理與延伸閱讀)