コンテンツにスキップ

モジュール XVII — エージェントシミュレーション&テストサンドボックス

モジュール XVII はテストサンドボックスである。隔離された一時的な環境で エージェントシナリオを実行し、履歴セッションを決定論的にリプレイし、デプロイ前に 2 つのバリアントを比較する。これはモジュール XII(evals)の姉妹であり — XVII は 隔離して実行し出力を生成する、XII はその品質を計測する — 両者は疎結合で、 どちらも他方を import しない。本ページは、サンドボックスが今日できることとその正直な 限界のリファレンスである。

サンドボックスはオペレーターが作成したシナリオをカタログ化する。ステップ入力の シーケンスに加え、実行が触れることを許されるツールとリソースのモックされたレスポンスで ある。シナリオは合成フィクスチャである — シークレットなし、本番ハンドルなし — 永続化 される前にクランプされる。これに対して 3 つのフローが実行される。

  • シナリオシミュレーション — シナリオのステップをそのモックに対して実行し、 ステップごとの出力を生成する(オプションで evals スイートに対してスコアリング)。
  • リプレイ — 履歴セッションの入力タイムラインを再構築し、モックに対して決定論的に 再実行する。同じ入力が同じ出力を生む。
  • デプロイ前後比較 — 同じシナリオをベースラインと候補バリアントに対して実行し、 両者をスコアリングし、差分とともに判定(improved / regressed / unchanged / inconclusive)を記録する。

本モジュールは 4 つのエンティティを所有する。変更可能な scenario、変更可能な run(running → 終端)、追記専用のステップごとの output、追記専用の デプロイ前後 comparison である。各 run は、どの runner がそれを実行したか、その runner が isolated であったか、一時状態が destroyed であったか、ステップごとの カウント、そして — scorer が配線されていれば — スイート、スコア、合否判定を記録する。

隔離はワイヤーの性質であり、単なる主張ではなく run ごとに証明される。デフォルトの インプロセス runner は構造的に隔離されている。step-and-mock の仕様のみを受け取り、 ストア、ネットワーク、いかなるシークレットへのハンドルも持たない。モックに存在しない リソースを要求するステップは決定論的な mock-miss マーカーを生み、実リソースに決して 到達しない。状態は呼び出し内に存在し戻り時に破棄されるので、run は destroyed を 記録する。オペレーターのプロビジョニング下では、OS レベルランタイムが同じ インターフェイスの背後に立つ — 一時的で堅牢化され egress を制御されたインスタンスで、 そのバックエンド(gVisor または Firecracker microVM)はポリシーによって選択され、 プリフライトでゲートされる。各 run は実際のバックエンドとその isolated フラグを記録 するので、劣化したバックエンドやポータブルなバックエンドは可視であり監査可能であって、 決して隠されない。

サンドボックスはイベントバスに発行しない。他のモジュールがこれに結合することなく読む 永続化された証跡を生成する。その出力は、コンポジションルートでのみ配線される アダプターを通じてモジュール XII によってスコアリングされる — 2 つの姉妹は import では なく薄いポート契約を共有する。そのデプロイ前後比較は、デプロイメントモジュールが プロモーションをゲートするために読む決定証跡であり、XII が追跡するリグレッション ベースラインに供給される。run、リプレイ、比較の起動は、特権的でテナントスコープの 監査対象アクションである(run は editor 以上、deploy 比較は admin の決定)。

生成されたシナリオを実行する

Section titled “生成されたシナリオを実行する”

olivares modules on sandbox で選択可能なモジュールを有効にします。生成、シナリオ作成、実行には編集者または管理者が必要です。閲覧者は保存されたシナリオ、実行、出力を確認できます。

末尾に改行のないテンプレートを作成します:

ターミナルウィンドウ
printf '%s' '{{subject_kind}}:user{{index}}@example.test' > seed.txt

この合成レスポンスを mocks.json に保存します:

[{"resource":"agent:user1@example.test","response":"first synthetic account"}]
ターミナルウィンドウ
olivares sandbox generate --count 2 --seed-file seed.txt -o json > steps.json
olivares sandbox scenarios create --name generated --steps-file steps.json --mocks-file mocks.json -o json
olivares sandbox scenarios run <scenario-id> --variant candidate -o json
olivares sandbox runs get <run-id> -o json
olivares sandbox runs outputs <run-id> -o json

作成で返されたシナリオ ID、次に実行で返された実行 ID を使います。デフォルトの inproc-mock runner では、最初の入力は上記のレスポンスに解決され、2 番目は [[mock-miss:agent:user2@example.test]] を返します。mock miss は steps_error を増加させますが、想定された合成結果です。実行には引き続き status: completed、steps_total: 2、steps_ok: 1、steps_error: 1、isolated: true、destroyed: true が記録されます。実リソースへのリクエストはありません。この例ではスコアリングを要求せず、OS レベルのランタイムの適格性も証明しません。照合には、テンプレートファイル内の改行も含め、入力の正確なテキストを使います。

シナリオ、実行、出力はエンジン再起動後も利用できます。モジュールをオフにすると、保存データを削除せずルートへのアクセスを無効にし、再度オンにするとアクセスを復元します。これらのレコードはテナントスコープで、別の組織は読めません。