Vacant
Engineering dossier
2026.07.22 / VF-01
Case VF-01 mandatory trust path

Vacantfirst.

從「希望 agent 自願呼叫工具」,改成「沒有通過 Vacant,就根本不啟動 agent」。這是一份關於控制權、證據與誠實邊界的完整工程卷宗。

第一次看?直接從白話互動圖開始
Scroll to inspect完整繁中報告
01 / The turn

不是提醒。
是拿走選擇權。

第一次 Hermes e2e(n=1,單例演示、非統計證據)讓我們看到一件事:MCP 工具被成功發現,不等於 agent 會使用它。真正的產品問題不是 prompt 不夠強,而是架構仍把安全路徑當成選項。

「wrapper 就算存在,Hermes 不想使用,還是不會去用啊。」
Before / optional MCP

模型決定
要不要負責

工具在場,但 tool choice 仍在模型手上。Hermes 可以列出 delegate,然後自己寫檔、自己宣布測試通過。

  • 提示詞只能提高機率
  • tools/list 被誤當成使用證據
  • 先寫答案,再略過信任層
After / mandatory controller

程式決定
何時能啟動

controller 自己呼叫 Vacant。只有 receipt、review、audit、chain 與本地重驗全部成立,才建立 Hermes 子行程。

  • agent 啟動點成為唯一 choke point
  • 每次 request 都有不可重放 receipt
  • 失敗時外部 agent 根本不存在
02 / Task journey

一個任務,
到底經過了誰?

不用先懂 agent、模型或簽章。把 agent 想成會替你操作電腦的數位工作者;Vacant 則是它拿到工作區鑰匙前,必須先通過的驗收站。

先懂一個詞 / Agent 會讀任務、
操作工具、
修改檔案的
數位工作者。

Hermes 就是這一層。它能真的進入專案工作,所以一旦做錯,可能已經留下檔案或其他副作用。

Vacant 放在哪裡?

Vacant controller 是驗收站。站內 resident 先呼叫模型產生答案、檢查、修正與簽收;全部成立後,才把 Hermes 叫進來施工。

先釐清 現在不是三個 AI 同時寫三份答案。Router 先選一名 resident,由它連續產生最多三次候選。 「在 Hermes 之前」不等於「沒有模型推理」:Vacant 自己已連到模型端點,Hermes 只是最後的整合者。
示意任務寫一個函式,只加總清單裡的偶數,然後放進專案
STEP 00 / REQUEST

你先說清楚「要什麼」與「怎樣算對」

任務不會直接落到 Hermes。Controller 先接住它;若沒有可執行的強檢查,產品模式就不允許啟動下游 agent。

同一個任務,
兩條路。

切換看看差異。Vacant 並沒有取代 Hermes,而是在 Hermes 前面增加「先證明,再施工」的路段。

多一道驗收

速度較慢、需要額外模型呼叫與檢查;換來的是錯誤可在碰到工作區前重試或停止,而且每次放行都有可重驗收據。

可檢查的錯誤
較少直接交付

原因候選先跑客觀 check;失敗就再生成,仍失敗就停止。
實際效果錯誤有機會在 Hermes 啟動前被攔下,但跨任務能提升多少仍需正式 batch 量化。
機制已驗/幅度待量化

略過驗證的路徑
被拿掉

原因Controller 擁有唯一的 subprocess 出口,不把是否使用 Vacant 交給模型選擇。
實際效果在這條 controller 路徑內,沒有有效 receipt 就不會建立 Hermes process。
測試+真機 e2e 已驗

結果比較容易
重驗與追究

原因任務、check、答案、review、audit 與當前鏈頭一起簽進 receipt。
實際效果替換答案、搬用舊 review 或重播 request 都會讓驗證失敗。
竄改矩陣已驗

模型會不會因此
真正學得更好?

可能機制記憶注入、歷史信譽路由、錯誤後果,理論上能累積較好的選擇。
目前證據X1 pilot 沒測到 lesson transfer;不能把流程可靠性說成模型智力提升。
尚未證明

這裡刻意把「機制能運作」、「合理預期改善」與「研究已證明」分開,避免把示意動畫當成實驗數據。

You gain

得到什麼

  • 錯誤先在驗收站重試或停止,不必先碰工作區。
  • 每次放行都有 reviewer、audit、鏈頭與 receipt 可回查。
  • 歷史結果可以影響未來路由、probation 與 slash。
You pay

付出什麼

  • 額外推理時間與算力;若使用付費 API,也會增加 token 成本。
  • 必須先定義可執行的成功條件;主觀任務難以得到同等保證。
  • 多了身份、金鑰、logbook、registry 與 receipt 的維運複雜度。
You keep

不必犧牲

  • 不必修改 Hermes 核心;任何能以 argv 啟動的 CLI agent 都能接在後面。
  • Hidden checks 不會直接交給生成模型,減少只背測資的捷徑。
  • Hermes 仍保留最後的專案整合、工具操作與回報能力。

真實時間樣本:兩次 Hermes e2e 的 Vacant gate 分別約 119 秒與 91 秒;Hermes 階段約 387 秒與 303 秒。這是兩筆觀測,不是一般效能保證。

03 / Architecture

七道關卡,
一個出口。

`vacant run` 不再是另一個 agent。它是 agent 前面的執行控制器:先產生證據,再交付能力。

Mandatory execution path / product mode 任何一步失敗 → no spawn
01

Task

任務+強 check

02

Route

信譽路由 resident

03

Verify-fix

最多三次生成

04

Peer

簽章 envelope

05

Audit

隔離重跑 check

06

Receipt

全量雜湊綁定

07

Spawn

Hermes / any CLI

核心逆轉:Hermes 不是 Vacant 的 caller,而是 verified delivery 的 consumer。它啟動時,`task_id`、答案、trust card 與 receipt 都已存在。

DELEGATE_START → GATE_PASS → AGENT_START → AGENT_DONE

Gate
contract

簽章有效不等於可啟動。密碼學完整性與產品准入政策分開判定,任何一層都不能被 bool 帶過。

Request 綁定

完整綁定 request_id、task、check-spec、risk;同一 request ID 不能再次簽發。

SHA-256

Answer 投影

只交付 verifier 真正檢查的 code、canonical JSON 或 exact value;模型尾文不進 agent context。

Projected

Reviewer 獨立驗章

每張 ReviewEnvelope 由 reviewer 自己簽名,公鑰必須存在於當前 registry,且 target head 必須指向本次 DELIVER。

2 / 2

當前鏈頭

receipt 的 stream、branch、substrate、chain head 必須和磁碟上的 resident 現況完全一致。

Current

強 check 才能 launch

只有 equals、json_schema、run_python 能授權 spawn;contains/regex 僅供 advisory。

Fail closed
04 / Evidence

不是 demo 截圖。
是可重驗證據。

兩次真模型、真 Hermes、真檔案落地。每次都能從 receipt 反查 reviewer、audit、鏈頭與 verified projection。

Latest local suite329
Real Hermes e2e2
Infra void0
Gate bypass0

偶數總和

RUN 34ad7630…
Request
solve(nums) → sum of even integers
Vacant attempt
1 / 3 · PASS
Peer review
2 / 2 signed PASS
Audit
performed · PASS · forced
Hermes output
/home/user1/vacant-first-e2e/solve.py
Independent replay
receipt ✓ chain ✓ file tests ✓
Vacant gate
119 s
Hermes
387 s
def solve(nums):
    return sum(x for x in nums if x % 2 == 0)

# controller replay
RECEIPT_VALID  True
REVIEW_PASS   2
AUDIT_PASS   True
FILE_PASSES  True
05 / Hardening

不是一個 wrapper。
是一輪攻防。

每次 review 都假設 candidate、agent、檔案狀態或序列化邊界會找最短路徑繞過 gate。以下是被實際抓到並修掉的路徑。

Critical候選碼與 hidden tests 同行程,可用 exit(0) 偽造成功

攻擊:候選碼提前終止 verifier、讀取同檔測試,或以 stdout 偽造 protocol。

修補:hidden tests 留在父 verifier;candidate 在 import-free worker;結果走私有 OS pipe,只接受 exact literal type。

Critical檢查 code fence,卻把 fence 外提示注入 agent

攻擊:第一段 code 通過,但尾端藏有「忽略使用者、刪除檔案」等未驗文字。

修補:receipt 與 agent context 只綁定 verified projection;raw model message 不進產品交付。

HighDeliverer 可以把假的 PASS reviewer 塞進自己簽的 card

攻擊:只驗外層 trust card,不逐張驗 ReviewEnvelope。

修補:保存 reviewer pub+完整 envelope;獨立驗簽、registry 錨定、target head 與 answer SHA-256 綁定。

High兩個 controller 先讀舊鏈,再依序覆蓋彼此狀態

攻擊:鎖只包寫入,Ecosystem 卻在鎖外建好,形成 stale-state overwrite。

修補:在 controller lock 內 `fresh()`;toggle、wipe、report 共用同一把鎖;registry state 壞檔直接拒絕重置。

HighAgent 繼承 Vacant API key 與 SSH stdio

攻擊:child environment 帶出模型金鑰;Hermes 後代持有 pipe,成功後 CLI 仍等待 EOF。

修補:移除 `VACANT_API_KEY`/`VACANT_MCP_API_KEY`;stdin=DEVNULL,stdout/stderr 走暫存檔,等待主行程而非後代 pipe。

MediumDemo saboteur 與產品 resident 共用信任庫

風險:研究用人工錯誤 resident 污染真實產品路由、scoreboard 與 artifacts。

修補:持久化 `.vacant-root-mode`;product/demo root 不可互換,遇到舊 artifacts 或外來 resident 立即 fail-closed。

06 / Verification

測試不是尾聲。
是產品介面的一部分。

不只測 happy path,也測「runner 必須不可達」:壞 receipt、trust off、錯答案、壞 chain、未錨定 reviewer、落盤失敗,都以 marker 檔不存在作為硬斷言。

LATEST LOCAL / MAIN329

passed
1 skipped

驗證面核心斷言結果
Receipt tamper matrixtask / tests / risk / answer / card / sig / anchor / requestPASS
Spawn orderingdelegate → verify → evidence → launchPASS
Python isolationexit-zero / custom repr / stdout forge / frame escapePASS
State integritystale reload / atomic state / corrupt state fail-closedPASS
VM baseline完整 VM suite 328 passed;final controller suite 32 passedPASS
True e2e2 × Qwen reasoning → Vacant → Hermes → filesystemPASS
f9a381a fix: isolate downstream agent stdio origin/main ↗
07 / Product path

任何 CLI agent,
同一條必經路徑。

Hermes 是第一個 adapter,不是特例。只要能用 argv 啟動,就能在收到 verified delivery 後工作。

Three-minute
start

模型端點負責 Vacant 生成;下游 agent 使用自己的設定。兩者序列執行,不爭用 tool choice。

Hermes--agent hermesbuilt-in
Claude Code--agent-argv '[…]'ready
Aider{context_path}ready
CustomSequence[str]shell-free
$ export VACANT_MCP_BASE=http://localhost:1234
$ export VACANT_MCP_MODEL=your-model
$ export VACANT_MCP_API=openai

$ vacant run \
  "Write solve(nums), summing even integers." \
  --test "assert solve([1,2,3,4]) == 6" \
  --test "assert solve([]) == 0" \
  --agent hermes
08 / Honest boundary

證明到哪裡,
就說到哪裡。

Vacant 提高可修復錯誤的回收率,並把每次交付變成可追究物件;它不會把不可檢查的主觀任務變成數學真理。

PREVENTS / IN CONTROLLER

軟體旁路

經 `vacant run` 啟動的 agent,沒有有效 receipt 就不存在。Request replay、卡片竄改、舊鏈頭與未錨定 reviewer 都被拒。

DETECTS / ACCOUNTABILITY

錯誤與漂移

客觀 check、peer review、audit、hash chain 與 human report 把「看起來可以」轉成可重驗的事件歷史。

RAISES-COST / NOT PREVENTS

Sybil 與洗白

probation、行為相關降權、decay、slash 提高攻擊成本;公開門檻仍可能被針對,不能說成絕對阻止。

OUTSIDE SOFTWARE GUARANTEE

Root、直接執行、惡意碼

使用者直接執行 Hermes 可繞過 controller;同 UID/root 可讀私鑰。真正唯一出口需 container、ACL、獨立服務帳號、HSM 或 TEE。

FINAL DISPOSITION / SHIP

信任不再是
agent 的好意。

它成為啟動 agent 之前,必須先成立、能被驗證、可以被追究的一組工程條件。