這個單元解決什麼問題同一個模型,包在不同的執行外殼裡,行為天差地別。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」之間的差距,攤成一張對照表最清楚:| 面向 | 能跑起來(勉強動) | 設計良善的 harness |
|---|---|---|
| 權限 | 全開,或 --dangerously-skip-permissions | deny 高危動作、ask 不可逆動作、其餘 allow |
| 隔離 | 直接在主機與個人帳號上跑 | 不信任工作進 sandbox / 容器,網路預設封閉 |
| 迴圈 | 無步數上限,靠人盯著喊停 | 明確成功條件 + 最大步數 + 逾時退出 |
| 記憶 | 全塞進對話視窗 | 短期 / 工作 / 長期分層,跨 session 持久化 |
| 觀測 | 出事翻聊天記錄 | 每次 tool call 結構化日誌,可回放 |
| 急停 | 關掉終端機視窗 | kill process group + 審計紀錄 + heartbeat |
- OpenClaw:看它的工具集設計與 approval gate 怎麼實作,對應本單元要素一與第 3 節。
- Hermes-Agent:看它的記憶分層與迴圈終止條件怎麼設計,對應要素二與要素三。
6. 概念階梯定位:harness 是最外層的 L4
把工程四層由淺至深排好(見 01-3、01-4、01-5),harness 是最外面那層:工具對照
把 harness 各要素對到主流 agent 系統,你會發現概念一致、名稱不同(截至 2026-05,精確機制與設定路徑以各官方文件為準):| 要素 | Anthropic Claude(主範本) | OpenAI | 自建(裸 SDK / 框架) | |
|---|---|---|---|---|
| 工具集與 ACI | Claude Code 工具 + MCP;Agent SDK 自訂工具 [2] | Agents SDK function tools | Gemini API function calling | 自訂 function schema |
| 權限 / approval gate | settings.json 的 permissions(deny→ask→allow)[3] | Agents SDK guardrails / tool_use 審批 | 需確認原始出處 | 自行實作審批層 |
| 迴圈終止 | 任務完成判定;Stop hook 收斂哨兵 | Agents SDK max_turns 上限 | 需確認原始出處 | 自行設步數 / 逾時上限 |
| 記憶與狀態 | session 上下文 + CLAUDE.md + 記憶檔 | Agents SDK sessions | 需確認原始出處 | 自管 state store |
| 觀測 | transcript + hook 日誌 | Agents SDK tracing | 需確認原始出處 | 自接 logging / OpenTelemetry |
| sandbox / 隔離 | OS 層 sandbox(限 Bash 子 process)[3] | 需確認原始出處 | 需確認原始出處 | 容器 / devcontainer |
對照表只給座標,不給細節各 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;採 IEEE 編號制。- [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) - 銜接:01-4 記憶分層與 context rot 的成因、01-5 harness 兜底的 workflow 編排、03-3 安全邊界背後的威脅模型與攻擊面、04-1 長期記憶的設計、04-6 用 hook 實作確定性的 approval gate 與收斂哨兵、05-1/05-2 兩個開源 harness 的實際設計。