製品接続層
三種類の接続形態は強制の度合いが違います。`vacant run` は「プロセスの終了」を納品の時点とし、隔離壁は bwrap で独立した名前空間を作り、出口は release/publish の能力分離で扱います。エージェントは自分のフックを削除できます——だからフックは補強にすぎず、信頼の根ではありません。
#三種類の接続形態
| 形態 | 強制の度合い | 説明 |
|---|---|---|
| ライブラリ/MCP ツール | 任意 | エージェントが自分の設定に Vacant の MCP サーバーを登録し、delegate などのツールを呼び出せます。エージェントが呼び出さなければ、Vacant には介入する手段がありません。 |
| コントローラー | 自分で起動した子プロセスに対してだけ | まず委任し、受け入れ検査をしてから、下流のエージェントを起動します。保証がカバーするのはこのコントローラーを通して起動したプロセスだけで、同じ OS ユーザーはこれを迂回してエージェントを直接実行できます。 |
| ループを持つ実行フレームワーク | 完全に強制 | 生成、受け入れ検査、出荷をすべて制御します。利得実験の runner はこの種類に属します。 |
コントローラーのソースコードのコメントには、この境界がはっきり書かれています。保証がカバーするのは、このコントローラーを通して起動した子プロセスだけである。
#vacant run:プロセスの終了を納品の時点とする
2026-09-18 に加わりました。一つの観察の上に成り立っています。
納品を差し止めたいだけなら、トリガーはネットワークプロトコルの上にあるのではなく、エージェントのプロセスが終了するその瞬間にある。
このシグナルは完全に信頼でき、プロトコルの知識を一切必要とせず、token を消費せず、しかもすべてのフレームワークで成り立ちます。
#流れ
- ローカルのプロキシサーバーを起動し、一覧に従ってエージェントの base URL 環境変数を設定します。本物の上流アドレスと鍵はエージェントの環境から取り除き、プロキシサーバーのプロセスにだけ残します。
- ワークスペースのツリーハッシュを記録します。
- エージェントを起動して終了を待ちます。終了したらプロセスグループ全体を終了させ、孫プロセスが凍結後に書き込むのを防ぎます。
- 凍結したワークスペースのスナップショット上で可視の受け入れ検査を実行し、ツリーハッシュをもう一度測ります。一致しなければインフラの失敗とします。
- 試行ごと、セルごとの判定に署名し、終了コードで判定を表します。
| 終了コード | 意味 |
|---|---|
0 | 納品 |
20 | 納品拒否 |
22 | インフラの失敗(ツリーハッシュが一致しない) |
#二つの厳格な規則
#プロキシサーバーは記録するだけで、注入しない
すべてのリクエストとレスポンスの生のバイト列をそのままディスクに書き出し、オンとオフの二つのアームのリクエストのバイト列はビット単位で同一です。
プロジェクトは意図的に、会話に一切のメッセージを注入しません。理由は、注入はモデルや利用者の発言を偽造することに等しく、「記録が忠実である」という論拠の土台を損なうからです。
#隔離壁、フック、出口
#隔離壁
bwrap で独立したネットワーク名前空間とマウント名前空間を作り、唯一の出口はホスト上のパス型の Unix socket で、常駐するプロキシサーバーがそれを守ります。モデル以外のパスはすべて拒否します。
実測:bwrap はゲート以外のすべてを遮断しました。陰性対照 7/7。
#フック
五種類のエージェントのフレームワークのフックは、どれも shell コマンドを差し止められます。
#出口:能力の分離
「拒否と判定された」ことは「公開できない」ことと同じではありません。出口の問題は能力の分離で扱います。
releaseモジュールは、合格したときにだけ通行証を鋳造します(構造は SLSA の検証サマリーの証明から取っています)。publishモジュールは、外部に書き込む能力を持つ唯一の部品です。通行証の署名、成果物のハッシュ、判定、有効期限、カバー範囲を検証します。publishは終了コードを読みません。強制的に公開するオプションも意図的に設けていません。
#私たちに言葉づかいを改めさせた監査
2026-09-20 の ABPI 監査(391 セル):
| 検査 | 結果 |
|---|---|
| サーバー側の会話に欠けがあるか | ありません。2,755 ターンすべてが一致 |
| レシートチェーン | 195 / 195 が検証を通る |
| レシートのレベル | すべて C レベル(サンドボックスなし、フックなし) |
| 「出口で止める」は成り立つか | 成り立たない |
これが五段階の語彙の書き直しに直接つながりました。
#五種類のエージェントの実測
| エージェント | バージョン | 結果 |
|---|---|---|
| pi | 0.85.1 | 20 セルすべてが判定基準を満たす |
| OpenCode | 1.18.31 | 同上 |
| Claude Code | 2.1.278 | 同上 |
| Codex | 0.147.0 | 同上 |
| Hermes | 0.19.0 | 同上 |
合計 20 本のレシートチェーン / 40 件です。ただし三社は同じ問題について判断が一致しませんでした——公開問題バンクのゲート(10 問 × 3 アシスタント × 二バッチ)では「三つのアシスタントが一致したのは 4/10 問だけ」という結果が出ました。
#vacant on と agentlane
#vacant on
利用者がターミナルで vacant と入力すると、ローカルに実在するコマンドラインのエージェントをメニューから選び、仲介のもとで起動できます。base URL は「この実行専用の」一時設定ディレクトリに書き込み、利用者の常設の設定ファイルは変更しません。
メニューには、エージェントごとに経路がどこまで検証されているかが表示されます。たとえば「経路は検証済み」や「経路は測っていません。実行後に requests_seen を確認してください」です。
#agentlane
vacant on を長時間実行するための測定ツールです。一つのセルが合格するには三つの独立した情報源が一致する必要があります。
requests_seen ≥ 1- プロキシサーバーの索引の行数 ==
requests_seen - エージェントの終了コードに値がある
どのラウンドでも陰性対照を実行します(上流を閉じたポートに向けます)。陰性対照が通らなかったラウンドでは、陽性対照も数えません。
納品が受け入れられたかどうかは、意図的に判定基準に入れていません。経路とモデルの能力を区別するためです。
最初のラウンドのスモークテストで抜け穴が一つ見つかりました。OpenCode が指定された作業ディレクトリを無視し、納品を別の場所に書き込んだため、仲介はすべて通ったのに、どのセルも納品拒否になりました。さらに OPENCODE_CONFIG_CONTENT は利用者の MCP 設定を消してしまいます。
#デジタルツインの展示物
54 セル、630 回の実モデル呼び出しによる展示会での実験は、「インターフェースが情報を与えるかどうか」についての直接的な対照を示しました。
| 条件 | 受け入れ |
|---|---|
| インターフェースが必要な情報を与えない | 0 / 27 |
| インターフェースが必要な情報を与える | 24 / 27 |
同時に、やり直しループが救ったのは 0 / 30 でした。さらに、エージェントが成功を宣言したのに可視の検査が失敗したケースが 82 回、タイムアウトで強制終了されたケースが 8 回ありました。
#次に
- 五段階の語彙の完全な説明:レシート
- 本研究が主張しないこと:限界と保証しない事項

