昨天說零件全部在桌上。回頭看這九天:session、工具、loop、權限、skills、multi-agent、對外介面,一天拆一個,各講各的道理。但 harness 是一台裝好的機器,零件之間怎麼咬合,拆開講的時候看不見。收官前把它們組回去:挑系列一路引用、原始碼全開的 HermesAgent(Nous Research 的開源 agent),讓一個訊息走完全程。
訊息進來,先到 gateway。它是無狀態的 HTTP handler(Day 16(Session 設計)講過),每次收到訊息都重建 agent,靠 SQLite 把 session 撈回來,連 system prompt 都取回上一輪位元級相同的那一份,prompt cache 才會命中(Day 4(兩層快取)的紀律)。
組窗口的時候,注入的記憶是 session 開始時凍結的那張快照(Day 12(記憶的生命週期)的 frozen snapshot),新寫入的記憶下個 session 才生效,換來整個 session 的前綴穩定。工具清單也在這時候定案:依這個 agent 的用途在初始化就切割好(Day 17(Tool Design)的做法),做研究的看不到部署工具。
然後 loop 接手(Day 18(Agentic Loop))。模型決定呼叫哪些工具,先過並行分類:只讀的並行、寫檔的看路徑、等人的串行。API 掛了先分類再行動:可重試、該壓縮、該換金鑰,各有各的路。任務需要方法的時候,skills 從 ~/.hermes/skills/ 進來(Day 20(Skills)),複雜任務做完它還會提醒 agent 把這次的做法存成新 skill。任務太大就開 sub-agent,interrupt 訊號會遞迴傳進每一層,任何時候都停得下來。九十輪到頂,讓模型摘要進度再返回,呼叫方永遠拿得到有意義的回覆。
每一步都是前面某一天的內容。但走完一遍,你會看到拆開時看不到的東西:這些零件彼此互相約束,牽一髮動全身。
三個咬合處值得單獨看。
成本約束塑造了記憶哲學。 frozen snapshot 是 cache 帳單逼出來的設計,跟記憶理論沒什麼關係:記憶即時生效會打碎前綴,cache 全 miss。一條成本約束,長出「session 內所有記憶平等」的哲學。零件圖上這是記憶系統的特性,機器上它是 cache 紀律的後果。
session 的精度是為 cache 服務的。 恢復 session 不只是找回歷史,連 system prompt 的位元組都要一致,因為差一個字元 cache 就 miss。單看 session 設計,這個要求莫名其妙;看到它跟 cache 的咬合,才知道為什麼。
工具分類讓中斷做得到。 interrupt 能在並行執行中安全地廣播到所有執行緒,前提是每個工具在定義時就標好副作用屬性,沒有靜態分類,你不知道哪些執行緒能砍。Day 17 的設計決策,在 Day 18 的功能裡兌現。
這就是 harness 工程真正的難度:單一零件都有教科書答案,咬合沒有,它長在你自己系統的約束裡。你的系統不必長得跟 HermesAgent 一樣,咬合處的形狀因系統而異,但「找出你的咬合處」這個方法通用。這也回應了 Day 15(Harness Engineering)說的實驗心態:咬合處的問題在白板上想不出來,要觀察機器跑起來哪裡卡。
照 Day 7(Prompt 的極限)和 Day 14(Context 的極限)的慣例,離開一層之前,先誠實面對它的極限。假設機器組好了、每個咬合處都調對了,系統上線。接著有三個問題,這一層的任何零件都答不了:
「系統到底好不好?」 Harness 保證的是系統能安全地跑,沒有任何一個零件告訴你它跑出來的答案品質如何。上線第一週你靠感覺,第一個月你靠客訴。
「跑歪的時候,你看得見嗎?」 權限擋得住越界的操作,擋不住一次「合規但錯誤」的執行。Agent 用正確的權限、呼叫正確的工具、產出錯誤的結論,整條鏈沒有任何警報會響。
「它明天會比今天好嗎?」 Session 讓工作能延續、記憶讓知識能留存,但系統的能力是靜止的。今天犯的錯,明天原樣再犯。
三個問題指向同一個缺口:執行過了就過了,沒有任何東西回頭看它。補上這個回頭看的迴路(執行產生軌跡、軌跡被評估、評估結果回頭改進系統),就是最後一層 Loop Engineering 的核心工作,而那三個問題正好是它的路線:評估、可觀測性、自我改進。
迴路轉不轉得起來,第一個門檻是你敢不敢回答:「你怎麼知道系統這次做得比上次好?」明天進 Loop Engineering(這系列的 L4)。