文章

Harness Engineering 方法論:從 CLAUDE.md 到自進化的 AI 開發體系

Harness Engineering 方法論:從 CLAUDE.md 到自進化的 AI 開發體系

從一個挫折說起

我開始使用 AI Coding Agent 後遇到的第一個嚴重問題,不是模型寫出 bug,而是模型連續兩次提出我已經否決過的方案

第一次我耐心解釋為什麼 polling 不行、要用 event-driven。第二次我意識到:這不是模型的問題,而是我沒有建立系統來約束它

這是我接觸 Harness Engineering 的起點。


什麼是 Harness Engineering

社群的共識越來越明確:

Agent = Model + Harness

Harness 是模型以外的一切——行為規範、自動化護欄、工作流模板、知識系統、以及讓這一切持續進化的回饋迴圈。

模型是引擎;harness 是底盤、方向盤、煞車和導航。引擎再強大,沒有底盤的車只會在原地空轉。


五層架構

在實踐中,我的 harness 自然演化出五個層次。每一層解決一個特定的失敗模式,而且越往上層的 ROI 越高

五層 Harness 架構 越往上層,ROI 越高 第五層自我改善迴圈用數據改善 harness 本身 第四層知識持久化打破每個 session 從零開始的問題 第三層工作流模板多步驟流程不再跳步 第二層自動化護欄不依賴模型記憶力的強制執行 第一層行為規範AI agent 的憲法 每一層解決一個特定失敗模式。單獨任何一層都不夠。

第一層:行為規範——AI 的憲法

CLAUDE.md 是整個 harness 的基石。它定義了 AI 在這個專案中什麼能做、什麼不能做、怎麼做

但我學到的第一課是:CLAUDE.md 不是寫一次就好的靜態文件。它是活的法典,每一條規則背後都有一個故事。

規則的三種來源

架構原則——來自技術判斷:

事件驅動優先,禁止 Polling: 所有狀態變更必須透過事件/回調/TTL 過期驅動。

Bug 防護規則——來自生產事故:

共享狀態寫入必須過濾來源: 更新 store 前,必須檢查 symbol === currentSymbol。

這條規則來自一次因為 tick handler 沒有過濾 symbol 導致不同標的的報價互相覆蓋的事故。

完整性規範——來自被反覆咬到的疏忽:

修 bug 時,必須先 grep 整個 codebase 找出所有相同 pattern 的位置。 禁止只修第一個找到的 occurrence 就宣告完成。

多層級管理

一份 CLAUDE.md 管不了所有事。我的實踐是分層:

層級範圍內容
全域所有專案通用語言、部署環境、資料保護、Bash 行為準則
專案單一 repo架構原則、Bug 防護規則、服務職責劃分
知識庫Wiki vault三層架構規範、ingest 流程、frontmatter schema

專案層級可以覆蓋全域設定,知識庫有自己獨立的 schema。每一層都是該層級的最高權威

第一層的局限

這是我最深刻的體悟:

規則存在 ≠ 規則被遵守。

CLAUDE.md 已經覆蓋了約 90% 的已知問題場景。但 AI 仍然會犯那些被明文禁止的錯誤。不是因為它「不聽話」,而是因為文字規則是被動的——模型必須主動記得去查閱。在複雜的多步驟任務中,這種記憶力是不可靠的。

這就是為什麼只有第一層遠遠不夠。


第二層:自動化護欄——不依賴記憶力的強制執行

Hook 是在 AI 工具呼叫的生命週期中自動觸發的 shell 指令。它的價值在於:不管模型記不記得規則,hook 都會執行

我的四個 hook

Hook觸發時機防護的問題
語法驗證器每次編輯檔案後.py 語法錯誤、.json 格式錯誤
Commit 守衛git commit 前硬編碼密鑰、遺留的 debug 語句
Wiki 自動提交編輯知識庫後知識變更漏提交
成本追蹤器Session 結束資源消耗不透明

設計原則:在犯罪現場攔截

Hook 的核心設計哲學是在最接近錯誤發生的時間點攔截

  • 語法錯誤 → 在編輯後立刻驗證,不是等到部署時
  • 密鑰洩漏 → 在 commit 前掃描,不是等到 code review
  • 知識變更 → 寫入後自動提交,不需要記得手動 git push

PostToolUse vs PreToolUse 的取捨

這是一個設計上的微妙選擇:

  • PreToolUse:能阻止操作,但看不到結果
  • PostToolUse:能看到結果,但操作已經執行

對語法驗證,PostToolUse 是正確選擇——檔案短暫存在於磁碟上是無害的,但模型能立刻看到精確的錯誤訊息並被強制修正。

第二層的價值

如果說第一層是「告訴模型不要犯錯」,第二層就是「不管模型記不記得,都自動檢查」。從我的實踐數據來看,自動化護欄的效果大約是文字規則的 10 倍


第三層:工作流模板——把機構知識編碼成可執行的流程

Skill 是可重用的 prompt 工作流,透過斜線指令觸發。它解決的問題是:複雜的多步驟流程,在時間壓力下總有步驟被跳過

部署流程的演化

以部署為例。我的部署流程有 7 個步驟,從範圍掃描到健康檢查到知識記錄。在沒有 skill 之前,後面幾步(健康檢查、Telegram 通知、Dev Diary)經常被跳過——不是故意的,而是「做完主要工作就覺得完成了」。

把它編碼成 /deploy skill 後,這個問題徹底消失。Skill 不允許你在步驟 4 就停下來。

Specification by Example:需求理解的入口

這是我最近加入的 skill,也是對傳統開發流程最大的反思。

傳統 TDD 在 AI 時代有一個根本性缺陷:AI 同時寫測試和實作,等於自己批改自己的作業。 測試成了 self-fulfilling prophecy,不是真正的規格。

我的解法是 /spec-by-example——在寫任何程式碼之前,先讓 AI 用具體的 Given/When/Then 例子表達它的理解,然後人類確認這些例子。只有通過確認 gate 後才進入開發。

需求 → AI 產出具體例子 → 人類確認 → AI 實作 (暴露理解偏差) (硬性 gate) (根據確認的 spec)

核心哲學:在 Agentic 時代,specification 才是人類最有價值的貢獻。 AI 負責產出和實作,人類負責確認「AI 是否真的理解了我要什麼」。

Skill 之間的組合

Skills 不是孤立的,它們形成工作流圖:

需求 → /sbe(確認 spec) → 實作 → /deploy(部署驗證) → /devdiary(知識沉澱)

每個 skill 負責流程的一段,串聯起來就是完整的開發閉環。


第四層:知識持久化——打破土撥鼠日

AI Agent 最大的結構性弱點是每個 session 從零開始。上一次花了 30 分鐘釐清的設計決策,下一次又得重新解釋。

我用三層知識架構解決這個問題:

Session 記憶

跨 session 的持久化記憶,按類型分檔:

  • 使用者輪廓:角色、偏好、專業程度
  • 行為回饋:使用者的糾正(正面和負面都記)
  • 專案狀態:進行中的計畫和決策

目前累積了 40+ 個記憶檔案。關鍵是同時記錄成功和失敗——如果只記糾正,模型會變得過度保守。

知識 Wiki

採用 Karpathy LLM Wiki 三層架構:

CLAUDE.md — Schema 定義層(人+AI 共編) ↓ raw/ — 不可變原始資料(AI 只讀) ↓ ingest wiki/ — AI 編譯的知識層(AI 完全擁有)

核心鐵律:AI 絕不修改 raw/。所有原始資料(系統匯出、文章、對話記錄)先進 raw/,然後透過 ingest 流程由 AI 消化重寫成 wiki/ 中的結構化知識。

這個設計防止了「摘要的摘要」級聯損失——raw 永遠保存完整原文,ingest 可以反覆執行。

Wiki 透過 MCP (Model Context Protocol) 暴露給 AI,提供 searchget_conceptrelated 三個查詢工具。每次接到新需求,AI 的第一步就是查 wiki 確認影響範圍和既有設計決策。

Dev Diary

每個完成的任務都有結構化日誌:問題描述 → 分析過程 → 設計決策 → 實作要點 → 踩到的坑 → 核心心得。

Dev Diary 的價值不只是記錄,而是讓失敗的嘗試也成為知識資產。很多時候,踩過的坑比成功的路徑更有價值。


第五層:自我改善迴圈——用數據改善 harness 本身

前四層構成了一個能運作的 harness。但如果只是「建好就不動」,它遲早會腐化——新的問題浮現,舊的規則變得過時。

第五層的職責是讓 harness 自己變得更好

PDCA 循環

Plan → 分析 Insights 報告,識別 friction 模式 Do → 實施改善(新規則、新 hook、新 skill) Check → 下次 Insights 與基線對照,驗證效果 Act → 保留有效的,移除無效的

量化追蹤

光靠感覺是不夠的。我在 wiki 中建立了 friction 追蹤矩陣:

摩擦類型基線目標
錯誤方法(提出被禁止的方案)31 次≤ 10
Bug 程式碼(語法/參數錯誤)20 次≤ 8
任務完全達成率62%≥ 75%

每次審視 Insights 時,更新矩陣、追加 review 歷程、對照目標。

Skill 自進化

更有趣的是 /skill-evolve——它從 wiki 和 memory 中偵測 pattern,自動建議 skill 的更新。例如:

  • 同一類踩坑出現 2+ 次 → 在對應 skill 加入警告
  • 新的工作流 pattern 出現 3+ 次且無對應 skill → 建議建立新 skill
  • CLAUDE.md 某條指示反覆被忽略 → 建議強化措辭或改用 hook

這讓 harness 從「人工維護」走向「半自動進化」。


三個核心洞見

回顧整個實踐過程,有三件事是我一開始沒有預期到的:

洞見一:自動化護欄 » 文字規則

這是最反直覺的。我花了大量時間撰寫詳盡的 CLAUDE.md 規則,覆蓋了 90% 的已知問題場景。但模型依然犯那些錯誤。

轉折點是我開始加入 hook 之後——一個簡單的語法驗證 hook,在每次編輯後自動執行 py_compilejson.loads。效果立竿見影。

教訓:不要期待模型「記住」規則。要把規則變成自動執行的程式。

洞見二:事件驅動思維適用於 harness 本身

我在系統架構中堅持「事件驅動,禁止 polling」。後來發現同樣的原則也適用於 harness 的設計:

  • Hook = 事件驅動(工具觸發)→ 最有效
  • Skill = 指令驅動(明確呼叫)→ 有效
  • Rule = 被動等待(靠模型記憶)→ 最弱

最有效的 harness 元件是反應式的,不是宣告式的。

洞見三:衡量改變了一切

在加入第五層之前,我以為最大的問題是「bug 程式碼」。Insights 數據告訴我實際上是「錯誤方法」——模型提出我已經否決過的方案。

如果我沒有衡量,我會持續投資在錯誤的方向。

這就是第五層存在的意義:不只是讓 harness 變好,而是讓你知道該改善什麼


仍在演進的下一步

Harness Engineering 不是一個「完成」的狀態,而是持續演化的過程。以下是我正在探索和規劃的方向:

Knowledge Graph MCP

目前的 wiki 是平面的 markdown 檔案。下一步是疊加圖層:

  • Phase 2:NetworkX 圖引擎 + MCP 暴露。wiki 頁面 = 節點,[[related]] = 邊。支援社群偵測(Louvain)、路徑查詢、核心概念辨識。
  • Phase 3:pgvector 語意搜尋。Hybrid retrieval:keyword + 圖遍歷 + 向量搜尋三路合併。

目標是讓 AI 在接到需求時,不只是全文搜尋關鍵字,而是能沿著概念關聯圖走,找到間接但重要的影響。

自主部署-驗證-回滾

目前的 /deploy skill 仍然需要在 session 中手動觸發。未來的方向是:

  • AI 部署後自動查詢 Prometheus 指標
  • 如果 CPU/memory 超過閾值,自動回滾到上一版
  • 全程透過 Telegram 通知,不需要人工介入

Spec-Driven Development 深化

/spec-by-example 目前只覆蓋功能需求。可以擴展到:

  • Performance SBE:Given 1000 concurrent requests, When hitting /api/xxx, Then response time < 200ms
  • Observability SBE:Given a service restart, When checking logs after 30s, Then zero ERROR entries
  • Contract SBE:Given service A publishes to channel X, When service B subscribes, Then data schema matches

讓 SBE 成為所有品質面向的統一語言。

多 Agent 協作

當單一 agent 的能力達到天花板時,下一步是多 agent 分工

  • 規格 Agent:專門負責 SBE 例子生成和知識查詢
  • 實作 Agent:根據確認的 spec 寫程式碼
  • 驗證 Agent:專門負責測試和部署驗證

每個 agent 有自己的 harness 子集,透過 spec 文件作為溝通介面。


如何開始你自己的 Harness

如果你也想建構 harness,我建議的順序是:

  1. CLAUDE.md——寫下 5 條你最痛的規則。不要試圖面面俱到,從痛點開始。
  2. 一個 Hook——你主要語言的語法驗證器。投入 30 分鐘,立刻見效。
  3. 一個 Skill——你最常重複的多步驟流程。把「你每次都做但有時候會忘」的流程寫成 skill。
  4. 開始記錄——不需要完整的 wiki,從 dev diary 開始。每次任務記「踩了什麼坑、為什麼這樣做」。
  5. 衡量——累積一段時間後回顧。哪些問題反覆出現?哪些規則沒被遵守?數據會告訴你下一步該做什麼。

Harness 不需要在第一天就完美。它是一個活的系統,關鍵是建立回饋迴圈,讓它自己變好


結語

Harness Engineering 的本質不是「配置 AI 工具」,而是建構一套讓 AI 能持續可靠運作的工程體系

模型會升級、會換代,但好的 harness 是可以遷移的。行為規範、自動化護欄、工作流模板、知識架構、改善迴圈——這些是跨越模型世代的方法論。

我的 harness 仍在演化中。最重要的教訓是:

能衡量自己的 harness,才是能改善的 harness。


使用 Claude Code 建構與實踐。

延伸閱讀:

本文章以 CC BY 4.0 授權

© DS. 保留部份權利。

本網站使用 Jekyll 產生,採用 Chirpy 主題