Architecture - 2026-08-15 - 2 分鐘閱讀
Agent 說它只碰了一個檔案。我是這樣讓這句話可證明的。
Orvena 把「agent 宣稱自己待在宣告的 scope 裡」變成在 OS 層強制執行、可獨立驗證的事,而不是憑 agent 自己的一面之詞。
本文英文原文於 2026 年 8 月 15 日發表於 LinkedIn。
前兩篇我說過,當程式碼變便宜,稀缺的是受治理的意圖。上一篇是組織 schema——一種讓「合法正當的組織到底是什麼」可檢查的方法。這一篇是另一半:一個 runtime,讓 agent 對自己工作的交代變得可檢查,而不是只能憑信任接受。
如果你花過時間把任務交給 coding agent,這個前提會讓你不太舒服:你要它碰一個檔案,它告訴你它碰了一個檔案。也許真是這樣。但你正在讀的這份報告,來自你正想驗證的同一個 process。
所以我把 Orvena 建在一個比「agent 會乖」更窄的承諾上。你宣告一個任務的 scope——這些檔案、這個步數預算——Orvena 在 OS 層強制執行它,不是在 prompt 層。這個區別就是重點所在:prompt 是一個請求,模型可能誤讀、忘記,或在想幫忙的時候悄悄推翻它。一個被拒絕的 syscall 不是請求。Agent 沒有另作解釋的餘地——在那道邊界之內。邊界本身是檔案系統,不是 agent 搆得到的一切:一個被關起來的 agent 仍然可以透過網路和它自己的模型供應商通訊,那段流量不在箱子裡。今天經過驗證的是 macOS;Linux 的強制執行需要啟用 Landlock 的 kernel,而測試套件會大聲說明這一點,而不是回報一個它背書不了的通過。
這個宣稱連我自己講的我也不信,所以我建了一個裡面沒有任何模型的對手:十四種逃出宣告邊界的方法——path traversal、symlink 逃逸、丟到背景的 process、exec 進一個新 shell——每一種跑兩次。先在不受限的情況下跑,它必須成功,這樣一個因為自身原因失敗的技巧,永遠不會被誤認成被 sandbox 攔下的技巧。然後在受限的情況下跑,它必須失敗,而且不留下任何東西。旁邊還跑著一個 positive control,因為一個把所有東西都擋掉、連正事也擋掉的 sandbox,會通過每一項圍堵測試,卻什麼都不代表。
對手 — 裡面沒有任何模型
十四種逃出宣告邊界的方法
path traversal · symlink 逃逸 · 丟到背景的 process · exec 進一個新 shell
第一次 — 不受限
必須成功
這樣一個因為自身原因失敗的技巧,永遠不會被誤認成被 sandbox 攔下的技巧。
第二次 — 受限
必須失敗,而且不留下任何東西
只有這一腿在測強制力,而且強制力落在 OS 層,不是 prompt 層。
Positive control — 同時在跑
正事必須照樣完成
一個把所有東西都擋掉、連正事也擋掉的 sandbox,會通過每一項圍堵測試,卻什麼都不代表。
三項同時成立,才算這個技巧被圍堵住了。
然後我跑了真正的問題:同一個任務、同一個模型、同一個 agent,一次不受治理、一次受治理,然後去讀差異,而不是宣稱差異。這是一台機器上、一個本地模型跑出來的小型自架訊號——不是我敢拿去押一篇 benchmark 論文的主張——但它是一個真實的數字,而它產出的報告裡沒有逐字稿、沒有 prompt,只有那次執行實際做了什麼。誠實的但書是:產出這個數字的那次執行幾乎沒被攻擊。每一次被記錄到的突破都是同一件不足掛齒的事,而且只發生在不受治理的那一腿——那一次,沒有人對受治理的那一腿試過 redirect、symlink 或 rename。一場安靜的仗打出來的乾淨數字,和一場真仗打出來的乾淨數字,不是同一個主張。我寧可把這句話說出來,也不讓那個數字暗示它沒賺到的東西。
Orvena 不會寫出更好的程式碼。它根本不寫程式碼。它做的,是把「agent 說它待在 scope 裡」變成一件你不必聽信 agent 一面之詞的事——這和組織 schema 是同一步棋,只是瞄準另一道邊界。
下一篇:為什麼我認為「closed source」其實不是這裡的護城河,以及什麼才是。