作者:個人獨立開發者 | 專案:3KLife(三國題材策略遊戲,Cocos Creator 3.8)
關鍵字:Harness Engineering、AI Agent、Coding Agent、自動化驗證、小模型友善設計
回首頁 | 回文章列表 | English version
過去一年,我幾乎把自己的遊戲開發流程全面轉向 AI Agent 驅動。GitHub Copilot、Claude,還有各種自動化腳本,輪番上陣。效率確實大幅提升——但隨之而來的問題是:Agent 會犯錯,而且犯的錯都是無聲的。
它不會跳錯,不會報警,只會安靜地在你的 JSON 裡塞入一個結構錯的欄位,或者把一個模組的 import 悄悄指向它不該碰的地方。等你發現的時候,可能已經是三天後的 code review。
直到我讀到 Martin Fowler 的 Harness Engineering for Coding Agent Users,才意識到這件事有個正式的名字,而且有系統的解法。
本文是我的盤點與反思——我已經做了哪些「韁繩(Harness)」?哪些還缺?以及我打算怎麼補。
Harness = AI Agent 中除了模型本身以外的一切。
分兩種:
好的外部韁繩能做到兩件事:
| 執行方式 | 特性 | 典型範例 | 建議使用頻率 |
|---|---|---|---|
| Computational(計算型) | 確定性、快速、CPU 驅動 | tsc、ESLint、JSON Schema 驗證 | 每次變更都跑 |
| Inferential(推論型) | 非確定性、較慢、GPU/LLM | AI Code Review、語意分析 | 選擇性使用 |
| 可維護性(Maintainability) | 架構適配性(Architecture Fitness) | 行為正確性(Behaviour) |
|---|---|---|
| 重複碼偵測 | 效能基線測試 | 功能規格驗證 |
| 複雜度分析 | 模組邊界守衛 | AI 生成測試 |
| 覆蓋率檢查 | API 品質檢查 | Approved Fixtures |
在 .github/instructions/ 下維護了 10 份針對不同場景的引導規則,包含 token 預算控制、UI 框架遵守規則、圖片讀取節流等。每份都有 applyTo 路徑過濾,只在相關檔案被編輯時自動載入。
把常見工作流程封裝成可調用的 Skill,例如:
Skill 的價值在於:把「人類專家的執行記憶」形式化了,不是靠 Agent 自行推理,而是讀到 Skill 就知道標準作業流程。
每張任務卡包含:
INPUT_CONTRACT:此任務前提條件OUTPUT_CONTRACT:完成後產出物VALIDATION_CMD:完成後要跑的驗證指令這讓 Agent 不需要「理解整個系統」就能執行局部任務——只需讀卡片、按契約做、跑驗證、通過就完成。
所有設計決策都留有記錄,並拆成四個分片按需讀取,避免每次載入全文浪費 tokens。
維護了 check-context-budget.js,可在任務中途主動檢查 token 使用量,並在接近上限時觸發壓縮。這個設計很關鍵——LLM 的品質在 context 過滿時會嚴重下降,而大多數人根本不知道自己已撞上這個問題。
| 工具 | 守護對象 | 狀態 |
|---|---|---|
check-encoding-touched.js | UTF-8 BOM / 亂碼防災 | ✅ 有 |
validate-ui-specs.js | UI 規格結構完整性 | ✅ 有 |
validate-skin-contracts.js | 皮膚家族資產契約 | ✅ 有 |
validate-generals-data.js | 武將資料 JSON Schema | ✅ 有 |
validate-bloodline-integrity.js | 血脈圖資料一致性 | ✅ 有 |
ucuf-screenshot-regression.js | 截圖回歸比對 | ✅ 有 |
| ESLint / TSLint | 編碼規範自動強制 | ❌ 無 |
| 自動化單元測試套件 | 功能邏輯正確性 | ❌ 無 |
check-import-boundaries.js | 模組間交叉耦合防護 | ❌ 無 |
| Approved Fixtures 機制 | 行為快照自動比對 | ❌ 無 |
目前的品質保障幾乎完全依賴 Agent 的「推論能力」——讓它去「判斷」這段程式碼對不對。這恰恰是 Harness Engineering 最警告的反模式。
| 現狀(依賴 LLM 判斷) | 目標(計算型工具判斷) |
|---|---|
| LLM 判斷「這個 import 違反架構嗎?」 | check-import-boundaries.js 用 AST 直接判定 |
| LLM 判斷「JSON 格式正確嗎?」 | JSON Schema 驗證腳本 |
| LLM 判斷「UI 元件尺寸符合規格嗎?」 | validate-ui-specs.js 數值比對 |
| LLM 判斷「型別是否正確?」 | tsc --noEmit 告訴你哪行有錯 |
| LLM 判斷「這個功能輸出對嗎?」 | Approved Fixtures 預設答案比對 |
一句話原則:把你目前讓 LLM 做的「判斷」,能用腳本做的就用腳本做。LLM 只負責「寫新東西」和「讀懂人話」。
tsc --noEmit:型別與語法檢查check-encoding-touched.js:UTF-8 完整性validate-*.js:資料 / UI 結構驗證check-import-boundaries.js:模組邊界守衛| 模組 | 可以 import | 禁止 import |
|---|---|---|
shared/ | (無,不可依賴任何業務模組) | core、ui、battle |
core/ | shared/ | ui/、battle/ |
ui/ | shared/、core/ | battle/ |
battle/ | shared/、core/ | ui/(單向) |
用 AST 靜態分析每個 .ts 檔的 import 路徑,違規直接報錯。純計算型,不需要 LLM。
當計算型工具承擔了所有「判斷」工作,LLM 只需要做最簡單的迴圈:
即使是 1.5B 的小型模型,只要給它「明確的任務卡」+「確定性的錯誤訊息」,就能穩定完成複雜功能。這不是因為小模型變聰明了,而是因為我們把「判斷」的工作從模型身上移走了。
| 類別 | 分數 | 說明 |
|---|---|---|
| Feedforward Guides | 80% | Instructions、Skills、任務卡、共識文件均完整 |
| Computational Sensors | 30% | 資料驗證充分,但缺 Linter、單元測試、邊界守衛 |
| Behaviour Harness | 40% | 截圖回歸配置中,Approved Fixtures 尚未建立 |
| 整體評分 | ~55 / 100 | 前饋強,計算型回饋嚴重不足 |
Harness Engineering 的本質,是把你身為開發者的「隱性知識」外顯化、形式化,讓 AI Agent 能夠在沒有你的情況下,也盡量按照你的意圖行事。
我的專案在前饋層已經做得很好——29 個 Skill、10 份 Instructions、142 張任務卡。但計算型回饋感測器嚴重不足,這是今後最需要補強的方向。
一句話行動指南:把你目前讓 LLM 做的「判斷」,能用腳本做的就用腳本做。LLM 只負責「寫新東西」和「讀懂人話」。
本文基於 Martin Fowler《Harness Engineering for Coding Agent Users》(2026-04-02) 的核心框架,結合個人 Cocos Creator 遊戲專案(3KLife)的實際工程經驗撰寫。