這個單元解決什麼問題同一個模型,包在不同的執行外殼裡,行為天差地別。Harness 是 agent 的執行外殼:工具集、權限邊界、記憶、迴圈控制、觀測、kill switch。模型決定能力天花板,harness 決定你實際拿到幾成,以及它穩不穩、能不能重現、出事會不會收不住。本單元拆開 harness 的組成要素與設計判準,讓你在選用或自建 agent 系統時有一套明確的評估框架,而不是靠試錯撞出能動的配置。
學習目標
- 用自己的話說清楚「模型」與「harness」的分界,並舉出混淆兩者時會產生的具體問題。
- 列舉一個健全 harness 的六個組成要素,並對照現有工具或自建系統評估其完整性。
- 設計合理的安全邊界:approval gate、sandbox 隔離、heartbeat 死人開關、kill switch,並知道各自在哪種情境下不可省略。
- 說明為何「可重現」比「聰明」更重要,並指出讓 agent 行為可重現的最小觀測配置。
1. 什麼是 harness:模型決定天花板,harness 決定你拿到幾成
先看一個對照。同一個 Claude 模型,你可以用兩種方式驅動它:一種是自己寫一個裸迴圈,丟 prompt、收回應、把模型要的工具呼叫手動執行、結果再貼回去,沒有權限檢查、沒有步數上限、沒有任何日誌;另一種是跑 Claude Code,同一個模型,但外面包了權限規則、sandbox、hook、session 持久化、可中斷的迴圈。兩者產出的穩定度、可重現度、安全度差一個數量級。差的不是模型,是 harness。 Anthropic 把 agentic 系統的基礎積木描述為「一個被檢索、工具、記憶等能力增強過的 LLM」(augmented LLM)[1]。這句話點出分界:- 模型管的是:推理、生成、決定「下一步要呼叫哪個工具、要記住什麼、要查什麼」。
- harness 管的是:工具實際怎麼被執行、權限邊界在哪、狀態怎麼持久化、迴圈何時停、出了異常誰來踩剎車、整個過程留不留得下軌跡。
rm -rf,不會在第 50 步無限重試時喊停,也不會在 agent 卡死時終止 process。這些是 harness 的職責。把兩者混為一談,結果就是你以為「寫好提示詞就安全了」,而真正的安全與穩定性空白被整個忽略。
2. 一個健全 harness 的六個組成要素
評估任何 agent 系統(不管是現成工具還是自建),對著這六個要素逐項檢查,缺哪個一清二楚。前四個對應 Anthropic 的 augmented LLM 與 agent loop,後兩個是把它放進生產環境必須補上的。 要素一:工具集與權限邊界。 工具的形狀直接影響模型的決策品質。Anthropic 建議把工具介面(agent-computer interface, ACI)當成人機介面(HCI)一樣慎重設計,投入同等心力:給模型足夠的 token 思考再動手、用接近自然網路文本的格式、消除容易出錯的格式負擔 [1]。形狀之外是邊界:每個工具能碰到的檔案、網域、指令範圍,決定了出錯時的爆炸半徑(blast radius)。最小權限原則在 agent 場景比傳統系統更關鍵,因為決策者是一個會即興發揮的模型,不是行為固定可預期的程式。 要素二:記憶與狀態。 分三層,各有適用場景與污染風險:- 短期(對話上下文):session 內的對話歷史。Claude Agent SDK 明確指出 context window 在 session 內只增不減,system prompt、工具定義、對話、工具輸入輸出全部累積 [2],這正是 01-4 講的 context rot 來源。
- 工作記憶(session 內的結構化狀態):把中間結果存成 key-value 或摘要,而不是讓它漂在對話裡被稀釋。
- 長期(跨 session 持久化):
CLAUDE.md、記憶檔這類跨 session 載入的內容(見 04-1)。風險最高的也是這層,因為被污染的記憶會在未來的 session 安靜地重新組裝。
session_id resume,恢復讀過的檔案、做過的分析與動作 [2])。第 4 節展開。
對照你手邊的工具做一次盤點拿 Claude Code 當例子套這六項:工具集與權限(
settings.json 的 permissions)、記憶(session 上下文 + CLAUDE.md + 記憶檔)、迴圈終止(任務完成判定 + 你隨時可中斷)、觀測(transcript + hook 日誌)、安全邊界(permissions + sandbox + hook gate)、可重現(session resume)。六項都有對應,這就是它比裸 API 迴圈穩的原因。換成你自建的 agent,逐項問「這個我有嗎」,第一個答不出來的,就是它最先會出問題的地方。3. 安全邊界:approval gate、sandbox、heartbeat、kill switch
這四樣是 harness 設計最容易被偷懶跳過的部分,因為跳過它們時系統「看起來也能跑」。問題在出事那一刻才暴露,而那時通常已經來不及。 Approval gate(審批閘門)。 哪些動作自動放行、哪些必須人工確認。判準只有一條:這個動作造成的傷害可逆嗎? 讀檔案、跑測試這類可逆動作可以放行;刪檔、git push、網路 egress、寫入 repo 以外的路徑這類不可逆或外部可見的動作,應該攔下確認。Claude Code 的 permissions 把規則分三類 allow / ask / deny,評估順序是 deny → ask → allow,第一條命中的規則勝出,所以 deny 永遠優先(截至 2026-05)[3]。
date +%s > /tmp/agent.heartbeat)。這套機制的價值不在平常,在它真的卡死的那一次。
此處只給設計判準,威脅模型留給 03-3本節談的是 harness 該有哪些安全機制與設計取捨。具體的攻擊面分析(prompt injection、供應鏈、記憶污染、相關 CVE)屬於威脅模型範疇,集中在 03-3 展開,這裡不重複。
4. 觀測與可重現:為什麼「可重現」比「聰明」更值得追
一個能偶爾給出驚艷結果但每次都不一樣的 agent,工程價值低於一個穩定產出 80 分的 agent。理由很實際:無法重現的行為無法改進,也無法向利害關係人舉證。「它上次就是這樣做的」不是工程答案,是運氣報告。 讓行為可重現,需要兩件事:- 觀測(事後能看見發生了什麼)。 最小配置就是第 2 節要素四那組結構化日誌欄位。重點是用 structured log(JSON 一行一筆)而不是完整 transcript,前者便宜、可查詢、夠用,後者貴且難搜。觀測還有一個被低估的用途:異常模式辨識。被劫持或失控的執行,通常在 tool call trace 上先出現異常訊號(突然讀一堆
.env、對外連不該連的網域),早於你人肉察覺。 - 可回放與可續跑(事後能重建狀態)。 Claude Agent SDK 的 session 機制讓你抓住
session_id後可以 resume,恢復先前讀過的檔案、做過的分析與採取的動作 [2]。至少要保留 tool call 序列,不需要完整 token 流。
grep approval=blocked 或 grep .env 直接定位異常。這就是 structured log 比 transcript 值錢的地方。
5. 成熟的 harness 長什麼樣:從「能跑」到「設計良善」
「能跑起來」和「設計良善的 harness」之間的差距,攤成一張對照表最清楚:
兩個具體的參照點放在 Part V,建議讀完本單元後對照看,把抽象判準對到真實程式碼(兩單元目前為骨架,尚在展開中):
- OpenClaw:看它的工具集設計與 approval gate 怎麼實作,對應本單元要素一與第 3 節。
- Hermes-Agent:看它的記憶分層與迴圈終止條件怎麼設計,對應要素二與要素三。
6. 概念階梯定位:harness 是最外層的 L4
把工程四層由淺至深排好(見 01-3、01-4、01-5),harness 是最外面那層:工具對照
把 harness 各要素對到主流 agent 系統,你會發現概念一致、名稱不同(截至 2026-05,精確機制與設定路徑以各官方文件為準):對照表只給座標,不給細節各 cell 的精確名稱、版本與設定路徑屬快變動事實,官方文件無對應說明者以各官方文件為準。本表末欄以「自建」取代慣用對照欄的 GitHub Copilot 與 Cursor,因為這兩者目前不提供對等的可程式化 agent harness 層;harness engineering 的對照點本來就是「現成工具」對「自己搭」。本表用途是讓你知道「同一個 harness 要素在你的工具叫什麼」,深入設定見 Part II 與 Part IV。
動手做
兩個練習,一個盤點、一個動手補上最常缺的那塊。-
對六要素審核你現有的 agent 設定。 拿你正在用的系統(Claude Code 的
.claude/settings.json、或你自建的 agent),對著第 2 節六要素逐項打勾:工具集與權限、記憶與狀態、迴圈終止、觀測、安全邊界、可重現。第一個打不了勾的,寫下「它在什麼場景會第一個出問題」。多數人會發現缺的是觀測或 kill switch,因為平常不需要,需要時已經晚了。 -
為一個無人值守迴圈補上 heartbeat。 拿第 3 節的
supervisor.sh當骨架,改成監看你自己的 agent:決定合理的TIMEOUT(略大於單步最慢的正常耗時)、在 agent 迴圈每步加一行寫心跳、用setsid讓它自成 process group。驗證方式:故意讓 agent 卡在一個無窮迴圈,確認 supervisor 在TIMEOUT後真的把整個 group 收掉,而不是留下孤兒 process。
常見誤區
自我檢核
通過本單元的標準
- 你能不能用一句話講清楚「模型」與「harness」各自管什麼?混淆它們時,你踩過或看過哪個具體問題?
- 把第 2 節六要素套到你現在用的 agent 工具上,哪幾項是缺的?缺的那項在什麼場景會第一個出問題?
- 你的 approval 邊界是按「動作可逆性」分流,還是一律放行 / 一律攔?舉一個你會放行、一個你會攔下的動作。
- 你的無人值守迴圈有沒有 heartbeat 與 process group 等級的 kill switch?終止訊號送給的是父 process 還是整個 group?
- 如果現在要你重建 agent 上一次執行「到底做了什麼」,你手上的觀測資料夠不夠?不夠的話缺哪一塊?
來源與延伸閱讀
事實主張依官方文件,快變動項標註截至 2026-05。- [1] E. Schluntz and B. Zhang, “Building Effective Agents,” Anthropic Engineering, Dec. 19, 2024.(augmented LLM 作為基礎積木 = LLM + retrieval + tools + memory;agent 每步取得 environment ground truth;stopping conditions 維持控制;ACI 應如 HCI 般慎重設計;production 需 sandboxed testing + guardrails)https://www.anthropic.com/engineering/building-effective-agents (截至 2026-05)
- [2] Anthropic, “How the agent loop works,” Claude Agent SDK Docs.(gather context → take action → verify work → repeat;驅動 Claude Code 的 harness 可驅動其他 agent;context 在 session 內累積不重置;
session_idresume 恢復完整 context)https://code.claude.com/docs/en/agent-sdk/agent-loop (截至 2026-05) - [3] Anthropic, “Configure permissions,” Claude Code Docs.(
permissions的 allow / ask / deny;評估順序 deny → ask → allow first-match-wins;sandbox 為 OS 層強制、只作用於 Bash 及子 process;permissions 與 sandboxing 互補的 defense-in-depth)https://code.claude.com/docs/en/permissions (截至 2026-05)