截至 2026 年 8 月 23 日,Agent Harness 的競爭焦點已從多幾個工具,轉成一次長跑崩潰後,系統還能不能還原自己做過什麼。 Pi 官方設計稿 harness-v2.md 把一次被接受的 prompt 當成可持久化的 operation:先寫 intent,再執行效果,崩潰後從最後一個安全邊界恢復。DeepSeek Harness 的工具結果剪枝預設超過 8,192 個 Unicode 碼點就留頭 4,096、留尾 1,024,模型下次請求看不到中間那段。社群轉述把這兩件事揉成「Pi 官方銳評」,來源其實要拆開。
先把兩份文件分開
Pi 是 Earendil Works 的開源 coding agent toolkit,GitHub 倉庫 earendil-works/pi 截至 8 月 23 日約 95,700 星、11,800 個 fork,CLI 套件是 @earendil-works/pi-coding-agent,現役標籤到 0.84.2(8 月 14 日)。官網 pi.dev 的定位是極簡 harness:預設不做子 agent、不做 plan mode,其餘用 TypeScript 擴充。Mario Zechner(badlogic)在 7 月 29 日提交 docs(agent): harness design v2,檔案標題是 Durable AgentHarness design。目標寫得很硬:一次被接受的 run,崩潰後新行程必須從最後一個安全邊界接著跑;任何崩潰能產生的狀態都要可恢復。
這份設計稿談的是 session 四件套:append-only 的 conversation tree、可平行的 lane、每條 lane 的 operation log,以及 latest-wins 的 global facts。它沒有寫 DeepSeek 剪枝器的數字,也沒有寫 19 場 session 的跑分。
那些數字來自 8 月 15 日貢獻者 adamteale 的 PR #8172。PR 自稱依 DSH 預設校準,做 prune + spill:超過 50,000 碼點整份落到 ~/.pi/agent/cache/tool-spill/,超過 8,192 碼點留頭 4,096 加標記加尾 1,024,同時把全文寫進 spill 檔。作者用 GLM-5.3 與 DeepSeek V4 Flash 跑 19 場真實 session,回報未快取 prefill 降 72% 到 88%,每次請求的 context occupancy 從約 30–33K 降到 21–22K(降 26% 到 35%)。Kill-criteria 寫:9 次幻覺探測 0 次捏造;30K 日誌裡第 12,000 字的 AssertionError,Flash 能用 spill 檔上的 grep 與 sed 找回。這份 PR 被機器人依 CONTRIBUTING.md 自動關閉,後續 issue #8173 標成 no-action。把它當成已合併的 Pi 官方功能,時程寫錯了。
DSH 剪的是模型看到的面,不是整份日誌

DeepSeek 官方套件 @deepseek-ai/dsh-compaction-tool-result-pruner 寫得很清楚:它把超預算的 tool/result 表層改成有限頭部、固定標記 \n\n[... tool result middle pruned ...]\n\n、有限尾部,同時在 append-only session log 裡保留完整原始事件。預設門檻就是 8,192 / 4,096 / 1,024。模型下次請求看不到中間原文。原始事件仍可供持久化、重播與精確日誌檢查。
社群 PR 把這叫 permanently-lossy pruner,指的是模型當下的恢復路徑:上下文裡沒有檔案路徑與 offset,模型不能自己 grep 回去。DSH 的日誌並沒有把中間那段從磁碟抹掉。兩邊講的「丟失」層級不同。若錯誤剛好落在被剪掉的中段,模型這回合確實讀不到;運維若去翻 session log,原文仍在。Pi 那條 spill 路徑把恢復權交回模型:context 只留預覽與 locator,完整輸出在磁碟上。
這不是誰比較炫。這是長跑 debug 會不會被自己的壓縮策略害死。測試日誌 30,000 字、真正的 AssertionError 在第 12,000 字,是 PR 裡預先登記的探測,不是隨口比喻。
官方設計稿真正在解的,是崩潰現場

harness-v2.md 的耐久規則只有兩句:效果發生前,先寫一筆 intent record,預先配好即將產生的 entry id;效果結束後,用完全相同的 id 把結果 append 進 tree。崩潰落在兩筆之間,recovery 依 intent 類型決定完成、重試,或用合成結果關掉。沒有多筆原子交易,也不需要:每筆 record 與每筆 entry 各自耐久。
Session 裡,tree 只長不改、不刪。Lane 像 git worktree:有名字、有 leaf、同一時間最多一個 open operation。Interactive Pi 預設一條 main lane,介面不秀這個概念;擴充才能用完整 API,例如子 agent 跑在父 session 的第二條 lane。Operation 分三種:run、compaction、navigation。工具真正開工前寫 tool_started,並快照該工具當時的 replay 宣告;recovery 只有在 record 與現行工具宣告都說 safe 時才重跑,否則寫合成的 interrupted 結果。
8 月 6 日的 0.84.0 changelog 把 v4 lane-based Session / SessionRepo 推成預設匯出,並加上「compile-complete 的 AgentHarness v2 scaffold」。同一段也寫:未完成的 operation 路徑會丟 HarnessNotImplemented,直到耐久執行實作完成。設計稿可以寫得很完整,套件標籤仍把一部分路徑標成還沒做完。評估時要把「文件怎麼寫」和「0.84.2 實際能跑什麼」分開。
模型和 Harness 開始成套出售
社群轉述說,新一代 Claude 在第三方 harness 上更容易把 tool 調錯,甚至捏造 requireUnique、matchCase、oldText2 這種 Pi schema 沒有的欄位。我在已合併的 Pi 文件與 harness-v2.md 裡,沒核到這三個欄位名。能核到的是另一層綁定:Pi 為了 Anthropic OAuth,必須把工具名對應成 Claude Code 系統提示裡的大小寫;OpenClaw 這類整合還要做 old_string → oldText、file_path → path 的別名。模型後訓練越貼自家 harness,第三方就越需要一層相容墊片。
DeepSeek 自己也把這件事寫進評測腳註:V4 的 Code Agent 成績是用 DeepSeek Harness 極簡模式加 max 思考檔跑的,並聲明其他框架下結果可能不同。極簡模式能看到的工具更少、壓縮關閉、系統提示很短。分數是「模型加這套脚手架」的分數。Claude 配 Claude Code、DeepSeek 配 DSH、GPT 配 Codex,會越來越像成套產品,而不是可以任意對調的零件。
Pi 對擴充的態度也在設計稿裡收緊。事件只能觀察、不能改執行;hook 可以攔截並改 context、請求、工具與 run 邊界。Conversation、runtime state、UI、extension 若混成同一團可持久化狀態,長跑之後沒人能推理此刻系統到底停在哪。DSH 走 Cordis 外掛很遠;Pi 官方文案仍強調核心要小。兩條路都合理,只是崩潰現場的可推理性不一樣。
| 列次 | 來源 | 截至 2026-08-23 能核對的狀態 |
|---|---|---|
| 第 1 列 | Pi harness-v2.md |
7 月 29 日官方設計稿:intent 先寫、崩潰可還原、lane + operation log |
| 第 2 列 | Pi 0.84.0 / 0.84.2 | 8 月 6 日把 v4 Session 推成預設;未完成路徑仍可能丟 HarnessNotImplemented |
| 第 3 列 | DSH tool-result-pruner | 模型面留頭尾;完整原文留在 append-only session log |
| 第 4 列 | Pi PR #8172 | prune + spill、19 場 session、−26%~−35% context;PR 自動關閉,未進主干 |
選 Harness 時,先問崩潰那一秒
短跑十分鐘,while loop 加幾個 tool、context 滿了做摘要,通常過得去。跑數小時之後,缺的是:工具有沒有真正執行過、剪掉的中段模型能不能自己找回、行程死在 tool 半途時下一輪要重跑還是合成結果。這些是作業系統與資料庫會問的問題。工具清單長短變成次要規格。
我自己看長跑 agent 時,會要三樣同時出現:崩潰後的還原邊界寫在哪、模型看到的 context 與磁碟上的原始輸出是不是同一份、評測分數用的是哪一套 harness。缺第一樣,長跑合約寫不下去。缺第二樣,debug 會在壓縮後失明。缺第三樣,跨產品比較會把脚手架差異當成模型差距。
FAQ
Agent Harness 現在最該先核對的,是不是工具數量
不是。Pi 官方設計稿把勝負放在崩潰後能不能從最後一個安全邊界恢復。DSH 與社群 spill PR 爭的是模型還能不能讀回被剪掉的工具輸出。工具數量仍有意義,但排在耐久規則後面。
DeepSeek 的工具結果剪枝會不會把原文從磁碟刪掉
官方 README 說完整原始事件留在 append-only session log。被剪的是模型下次請求看到的表層:預設留頭 4,096、留尾 1,024。模型當下沒有路徑可 grep 回去,並不表示運維日誌也空了。
Pi 的 prune 加 spill 是否已經合併進主干
沒有。數字與「strictly better than dsh’s permanently-lossy pruner」這句,寫在 8 月 15 日 PR #8172。該 PR 被自動關閉,後續 approval issue 標 no-action。可當社群實驗,不可當 0.84.2 的已出貨功能。
官方 Durable AgentHarness 在 0.84.2 是否全部可跑
8 月 6 日 changelog 把 v4 lane-based Session API 推成預設,同時標明 AgentHarness v2 scaffold 的未完成 operation 路徑會丟 HarnessNotImplemented。設計稿與套件標籤要分開讀。
評測 Coding Model 時,能否忽略它搭配的 Harness
風險很高。DeepSeek 已在官方評測說明裡寫,Code Agent 成績綁 DeepSeek Harness 極簡模式,其他框架可能不同。Pi 為 Anthropic OAuth 做 Claude Code 工具名對應,也顯示模型與自家脚手架正在長在一起。
權威引用
- Pi — Durable AgentHarness design (harness-v2.md)
- Pi — packages/agent CHANGELOG (0.84.0 / 0.84.2)
- Pi — GitHub repository
- Pi — Official site
- DeepSeek Harness — compaction-tool-result-pruner README
- Pi PR #8172 — tool-result pruner + spill extension
- Pi issue #8173 — request approval (no-action)
Author Insight
幫團隊接長跑 coding agent 時,我現在會先問崩潰那一秒:intent 有沒有先落盤,工具輸出被剪之後模型能不能自己讀回來。工具清單可以下周再補。先把 while loop 加摘要當成「夠用」,通常要等第一次跑過午夜、行程被殺,才會發現 session 已經說不清自己做過什麼。
我們最近協助研發團隊盤點 Claude Code、開源 harness 與自建 agent 迴圈的切換條件,做法是先鎖崩潰還原邊界與評測脚手架,再談要不要換模型。若你也在處理同一類 Agent Harness 決策,歡迎與 Tenten 團隊討論。
術語表
| 術語 | 說明 |
|---|---|
| Agent Harness | 包住模型迴圈、工具呼叫、session 與 context 的執行層,不是單顆模型 |
| Durable run | 被接受的 prompt 在崩潰後仍可從最後一個安全邊界恢復 |
| Lane | Pi 設計稿裡 session 內的具名工作位置,同一時間最多一個 open operation |
| Tool-result pruner | 把過長工具輸出改成頭尾加省略標記,以降低模型 context |
| Spill | 把完整工具輸出寫到磁碟,context 只留預覽與檔案 locator |
| Operation log | 記錄 intent 與執行步驟、不進入模型 context 的耐久日誌 |
