テスト
OpenClawには3つのVitestスイート(ユニット/インテグレーション、E2E、ライブ)と少数のDockerランナーがあります。
このドキュメントは「テストの進め方」ガイドです:
- 各スイートがカバーする範囲(および意図的にカバー_しない_範囲)
- 一般的なワークフロー(ローカル、プッシュ前、デバッグ)で実行すべきコマンド
- ライブテストが認証情報を検出しモデル/プロバイダーを選択する仕組み
- 実際のモデル/プロバイダーの問題に対するリグレッションの追加方法
クイックスタート
通常の作業:
- フルゲート(プッシュ前に推奨):
pnpm build && pnpm check && pnpm test
テストに変更を加えた場合や追加の信頼性が必要な場合:
- カバレッジゲート:
pnpm test:coverage - E2Eスイート:
pnpm test:e2e
実際のプロバイダー/モデルのデバッグ時(実際の認証情報が必要):
- ライブスイート(モデル + ゲートウェイツール/画像プローブ):
pnpm test:live
ヒント: 失敗するケースが1つだけの場合、以下に記載する許可リスト環境変数でライブテストを絞り込むことをお勧めします。
テストスイート(何がどこで実行されるか)
スイートは「現実性が増す順」(そしてフレーキネス/コストも増す順)と考えてください:
ユニット/インテグレーション(デフォルト)
- コマンド:
pnpm test - 設定:
scripts/test-parallel.mjs(vitest.unit.config.ts、vitest.extensions.config.ts、vitest.gateway.config.tsを実行) - ファイル:
src/**/*.test.ts、extensions/**/*.test.ts - スコープ:
- 純粋なユニットテスト
- プロセス内インテグレーションテスト(ゲートウェイ認証、ルーティング、ツール、パース、設定)
- 既知のバグに対する決定論的リグレッション
- 期待値:
- CIで実行
- 実際のキー不要
- 高速で安定であるべき
- プールに関する注記:
- OpenClawはNode 22、23、24ではVitest
vmForksを使用してユニットシャードを高速化します。 - Node 25以降では、リポジトリが再検証されるまで自動的に通常の
forksにフォールバックします。 - 手動オーバーライド:
OPENCLAW_TEST_VM_FORKS=0(forksを強制)またはOPENCLAW_TEST_VM_FORKS=1(vmForksを強制)。
- OpenClawはNode 22、23、24ではVitest
E2E(ゲートウェイスモーク)
- コマンド:
pnpm test:e2e - 設定:
vitest.e2e.config.ts - ファイル:
src/**/*.e2e.test.ts - ランタイムデフォルト:
- ファイル起動を高速化するためVitest
vmForksを使用。 - アダプティブワーカー(CI:2-4、ローカル:4-8)を使用。
- コンソールI/Oオーバーヘッドを削減するためデフォルトでサイレントモード。
- ファイル起動を高速化するためVitest
- 有用なオーバーライド:
OPENCLAW_E2E_WORKERS=<n>でワーカー数を強制(上限16)。OPENCLAW_E2E_VERBOSE=1で詳細コンソール出力を再有効化。
- スコープ:
- マルチインスタンスゲートウェイのエンドツーエンド動作
- WebSocket/HTTPサーフェス、ノードペアリング、および重いネットワーキング
- 期待値:
- CI実行(パイプラインで有効時)
- 実際のキー不要
- ユニットテストより可動部分が多い(遅くなる可能性あり)
ライブ(実プロバイダー + 実モデル)
- コマンド:
pnpm test:live - 設定:
vitest.live.config.ts - ファイル:
src/**/*.live.test.ts - デフォルト:
pnpm test:liveにより有効(OPENCLAW_LIVE_TEST=1を設定) - スコープ:
- 「このプロバイダー/モデルは実際の認証情報で_今日_動作するか?」
- プロバイダーフォーマット変更、ツール呼び出しの癖、認証問題、レート制限動作の検出
- 期待値:
- 設計上CI安定ではない(実ネットワーク、実プロバイダーポリシー、クォータ、障害)
- 費用がかかる / レート制限を消費
- 「すべて」ではなく絞り込んだサブセットの実行を推奨
- ライブ実行は不足しているAPIキーを取得するため
~/.profileをソース
- APIキーローテーション(プロバイダー固有):
*_API_KEYSをカンマ/セミコロン形式で設定、または*_API_KEY_1、*_API_KEY_2(例:OPENAI_API_KEYS、ANTHROPIC_API_KEYS、GEMINI_API_KEYS)またはライブ固有のOPENCLAW_LIVE_*_KEYで設定;テストはレート制限レスポンスでリトライ。
どのスイートを実行すべきか?
この判断テーブルを使用してください:
- ロジック/テストの編集:
pnpm testを実行(多くの変更をした場合はpnpm test:coverageも) - ゲートウェイネットワーキング / WSプロトコル / ペアリングに触れた場合:
pnpm test:e2eを追加 - 「ボットがダウン」/ プロバイダー固有の障害 / ツール呼び出しのデバッグ:絞り込んだ
pnpm test:liveを実行
ライブ:Androidノード機能スイープ
- テスト:
src/gateway/android-node.capabilities.live.test.ts - スクリプト:
pnpm android:test:integration - 目標:接続されたAndroidノードが現在アドバタイズするすべてのコマンドを呼び出し、コマンドコントラクトの動作をアサート。
- スコープ:
- 前提条件/手動セットアップ(スイートはアプリのインストール/実行/ペアリングを行わない)。
- 選択されたAndroidノードに対するコマンドごとのゲートウェイ
node.invoke検証。
- 必要な事前セットアップ:
- Androidアプリがゲートウェイに接続+ペアリング済み。
- アプリがフォアグラウンドに保持されている。
- パスを期待する機能に対して権限/キャプチャ同意が付与されている。
- オプションのターゲットオーバーライド:
OPENCLAW_ANDROID_NODE_IDまたはOPENCLAW_ANDROID_NODE_NAME。OPENCLAW_ANDROID_GATEWAY_URL/OPENCLAW_ANDROID_GATEWAY_TOKEN/OPENCLAW_ANDROID_GATEWAY_PASSWORD。
- 完全なAndroidセットアップの詳細:Android App
ライブ:モデルスモーク(プロファイルキー)
ライブテストは障害を分離できるよう2つのレイヤーに分割されています:
- 「ダイレクトモデル」は、指定されたキーでプロバイダー/モデルが応答できるかを確認。
- 「ゲートウェイスモーク」は、そのモデルでフルゲートウェイ+エージェントパイプラインが動作するかを確認(セッション、履歴、ツール、サンドボックスポリシー等)。
レイヤー1:ダイレクトモデル完了(ゲートウェイなし)
- テスト:
src/agents/models.profiles.live.test.ts - 目標:
- 検出されたモデルを列挙
getApiKeyForModelを使用して認証情報のあるモデルを選択- モデルごとに小さな完了を実行(必要に応じてターゲットリグレッションも)
- 有効化方法:
pnpm test:live(またはVitestを直接呼び出す場合はOPENCLAW_LIVE_TEST=1)
OPENCLAW_LIVE_MODELS=modern(またはall、modernのエイリアス)を設定してこのスイートを実際に実行;それ以外ではpnpm test:liveをゲートウェイスモークに集中させるためスキップ- モデル選択方法:
OPENCLAW_LIVE_MODELS=modernでモダン許可リストを実行(Opus/Sonnet/Haiku 4.5、GPT-5.x + Codex、Gemini 3、GLM 4.7、MiniMax M2.5、Grok 4)OPENCLAW_LIVE_MODELS=allはモダン許可リストのエイリアス- または
OPENCLAW_LIVE_MODELS="openai/gpt-5.2,anthropic/claude-opus-4-6,..."(カンマ区切り許可リスト)
- プロバイダー選択方法:
OPENCLAW_LIVE_PROVIDERS="google,google-antigravity,google-gemini-cli"(カンマ区切り許可リスト)
- キーの取得元:
- デフォルト:プロファイルストアと環境変数フォールバック
OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1でプロファイルストアのみを強制
- 存在理由:
- 「プロバイダーAPIが壊れている / キーが無効」と「ゲートウェイエージェントパイプラインが壊れている」を分離
- 小さく分離されたリグレッションを含む(例:OpenAI Responses/Codex Responsesの推論リプレイ + ツール呼び出しフロー)
レイヤー2:ゲートウェイ + devエージェントスモーク(“@openclaw”が実際に行うこと)
- テスト:
src/gateway/gateway-models.profiles.live.test.ts - 目標:
- プロセス内ゲートウェイを起動
agent:dev:*セッションを作成/パッチ(実行ごとにモデルオーバーライド)- キー付きモデルを反復しアサート:
- 「意味のある」レスポンス(ツールなし)
- 実際のツール呼び出しが動作(readプローブ)
- オプションの追加ツールプローブ(exec+readプローブ)
- OpenAIリグレッションパス(tool-call-only → フォローアップ)の継続動作
- プローブの詳細(障害の素早い説明用):
readプローブ:テストがワークスペースにnonceファイルを書き込み、エージェントにそれをreadしてnonceをエコーバックするよう依頼。exec+readプローブ:テストがエージェントにexecでnonceを一時ファイルに書き込み、readで読み戻すよう依頼。- 画像プローブ:テストが生成されたPNG(猫 + ランダムコード)を添付し、モデルが
cat <CODE>を返すことを期待。 - 実装参照:
src/gateway/gateway-models.profiles.live.test.tsとsrc/gateway/live-image-probe.ts。
- 有効化方法:
pnpm test:live(またはVitestを直接呼び出す場合はOPENCLAW_LIVE_TEST=1)
- モデル選択方法:
- デフォルト:モダン許可リスト(Opus/Sonnet/Haiku 4.5、GPT-5.x + Codex、Gemini 3、GLM 4.7、MiniMax M2.5、Grok 4)
OPENCLAW_LIVE_GATEWAY_MODELS=allはモダン許可リストのエイリアス- または
OPENCLAW_LIVE_GATEWAY_MODELS="provider/model"(またはカンマ区切りリスト)で絞り込み
- プロバイダー選択方法(「OpenRouterですべて」を避ける):
OPENCLAW_LIVE_GATEWAY_PROVIDERS="google,google-antigravity,google-gemini-cli,openai,anthropic,zai,minimax"(カンマ区切り許可リスト)
- ツール + 画像プローブはこのライブテストで常時有効:
readプローブ +exec+readプローブ(ツールストレス)- 画像プローブはモデルが画像入力サポートをアドバタイズした場合に実行
- フロー(概要):
- テストが「CAT」+ ランダムコードを含む小さなPNGを生成(
src/gateway/live-image-probe.ts) agentattachments: [{ mimeType: "image/png", content: "<base64>" }]で送信- ゲートウェイが添付ファイルを
images[]にパース(src/gateway/server-methods/agent.ts+src/gateway/chat-attachments.ts) - 組み込みエージェントがマルチモーダルユーザーメッセージをモデルに転送
- アサーション:返信に
cat+ コードが含まれる(OCR許容:軽微なミスは許可)
- テストが「CAT」+ ランダムコードを含む小さなPNGを生成(
ヒント: マシンでテスト可能なもの(および正確な
provider/modelID)を確認するには:
openclaw models list
openclaw models list --json
ライブ:Anthropicセットアップトークンスモーク
- テスト:
src/agents/anthropic.setup-token.live.test.ts - 目標:Claude Code CLIのセットアップトークン(またはペーストされたセットアップトークンプロファイル)がAnthropicプロンプトを完了できることを検証。
- 有効化:
pnpm test:live(またはVitestを直接呼び出す場合はOPENCLAW_LIVE_TEST=1)OPENCLAW_LIVE_SETUP_TOKEN=1
- トークンソース(1つ選択):
- プロファイル:
OPENCLAW_LIVE_SETUP_TOKEN_PROFILE=anthropic:setup-token-test - 生トークン:
OPENCLAW_LIVE_SETUP_TOKEN_VALUE=sk-ant-oat01-...
- プロファイル:
- モデルオーバーライド(オプション):
OPENCLAW_LIVE_SETUP_TOKEN_MODEL=anthropic/claude-opus-4-6
セットアップ例:
openclaw models auth paste-token --provider anthropic --profile-id anthropic:setup-token-test
OPENCLAW_LIVE_SETUP_TOKEN=1 OPENCLAW_LIVE_SETUP_TOKEN_PROFILE=anthropic:setup-token-test pnpm test:live src/agents/anthropic.setup-token.live.test.ts
ライブ:CLIバックエンドスモーク(Claude Code CLIまたはその他のローカルCLI)
- テスト:
src/gateway/gateway-cli-backend.live.test.ts - 目標:デフォルト設定に触れずに、ローカルCLIバックエンドを使用してゲートウェイ + エージェントパイプラインを検証。
- 有効化:
pnpm test:live(またはVitestを直接呼び出す場合はOPENCLAW_LIVE_TEST=1)OPENCLAW_LIVE_CLI_BACKEND=1
- デフォルト:
- モデル:
claude-cli/claude-sonnet-4-6 - コマンド:
claude - 引数:
["-p","--output-format","json","--permission-mode","bypassPermissions"]
- モデル:
- オーバーライド(オプション):
OPENCLAW_LIVE_CLI_BACKEND_MODEL="claude-cli/claude-opus-4-6"OPENCLAW_LIVE_CLI_BACKEND_MODEL="codex-cli/gpt-5.4"OPENCLAW_LIVE_CLI_BACKEND_COMMAND="/full/path/to/claude"OPENCLAW_LIVE_CLI_BACKEND_ARGS='["-p","--output-format","json","--permission-mode","bypassPermissions"]'OPENCLAW_LIVE_CLI_BACKEND_CLEAR_ENV='["ANTHROPIC_API_KEY","ANTHROPIC_API_KEY_OLD"]'OPENCLAW_LIVE_CLI_BACKEND_IMAGE_PROBE=1で実際の画像添付を送信(パスはプロンプトに注入)。OPENCLAW_LIVE_CLI_BACKEND_IMAGE_ARG="--image"でプロンプト注入の代わりに画像ファイルパスをCLI引数として渡す。OPENCLAW_LIVE_CLI_BACKEND_IMAGE_MODE="repeat"(または"list")でIMAGE_ARG設定時の画像引数の渡し方を制御。OPENCLAW_LIVE_CLI_BACKEND_RESUME_PROBE=1で2番目のターンを送信しリジュームフローを検証。
OPENCLAW_LIVE_CLI_BACKEND_DISABLE_MCP_CONFIG=0でClaude Code CLI MCP設定を有効に保つ(デフォルトは一時的な空ファイルでMCP設定を無効化)。
例:
OPENCLAW_LIVE_CLI_BACKEND=1 \
OPENCLAW_LIVE_CLI_BACKEND_MODEL="claude-cli/claude-sonnet-4-6" \
pnpm test:live src/gateway/gateway-cli-backend.live.test.ts
推奨ライブレシピ
絞り込んだ明示的な許可リストが最も高速でフレーキーではありません:
-
単一モデル、ダイレクト(ゲートウェイなし):
OPENCLAW_LIVE_MODELS="openai/gpt-5.2" pnpm test:live src/agents/models.profiles.live.test.ts
-
単一モデル、ゲートウェイスモーク:
OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.2" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts
-
複数プロバイダーでのツール呼び出し:
OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.2,anthropic/claude-opus-4-6,google/gemini-3-flash-preview,zai/glm-4.7,minimax/minimax-m2.5" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts
-
Google集中(Gemini APIキー + Antigravity):
- Gemini(APIキー):
OPENCLAW_LIVE_GATEWAY_MODELS="google/gemini-3-flash-preview" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts - Antigravity(OAuth):
OPENCLAW_LIVE_GATEWAY_MODELS="google-antigravity/claude-opus-4-6-thinking,google-antigravity/gemini-3-pro-high" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts
- Gemini(APIキー):
注記:
google/...はGemini API(APIキー)を使用。google-antigravity/...はAntigravity OAuthブリッジ(Cloud Code Assist形式のエージェントエンドポイント)を使用。google-gemini-cli/...はマシン上のローカルGemini CLI(独自の認証 + ツールの癖)を使用。- Gemini API vs Gemini CLI:
- API:OpenClawがHTTP経由でGoogleのホストGemini APIを呼び出す(APIキー / プロファイル認証);ほとんどのユーザーが「Gemini」で意味するもの。
- CLI:OpenClawがローカルの
geminiバイナリにシェルアウト;独自の認証があり動作が異なる可能性(ストリーミング/ツールサポート/バージョンスキュー)。
ライブ:モデルマトリックス(カバー範囲)
固定の「CIモデルリスト」はありません(ライブはオプトイン)が、キーを持つ開発マシンで定期的にカバーすることを推奨するモデルは以下の通りです。
モダンスモークセット(ツール呼び出し + 画像)
これは継続的に動作を維持することを期待する「一般的なモデル」実行です:
- OpenAI(非Codex):
openai/gpt-5.2(オプション:openai/gpt-5.1) - OpenAI Codex:
openai-codex/gpt-5.4 - Anthropic:
anthropic/claude-opus-4-6(またはanthropic/claude-sonnet-4-5) - Google(Gemini API):
google/gemini-3.1-pro-previewとgoogle/gemini-3-flash-preview(古いGemini 2.xモデルは避ける) - Google(Antigravity):
google-antigravity/claude-opus-4-6-thinkingとgoogle-antigravity/gemini-3-flash - Z.AI(GLM):
zai/glm-4.7 - MiniMax:
minimax/minimax-m2.5
ツール + 画像付きゲートウェイスモーク実行:
OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.2,openai-codex/gpt-5.4,anthropic/claude-opus-4-6,google/gemini-3.1-pro-preview,google/gemini-3-flash-preview,google-antigravity/claude-opus-4-6-thinking,google-antigravity/gemini-3-flash,zai/glm-4.7,minimax/minimax-m2.5" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts
ベースライン:ツール呼び出し(Read + オプションExec)
プロバイダーファミリーごとに少なくとも1つ選択:
- OpenAI:
openai/gpt-5.2(またはopenai/gpt-5-mini) - Anthropic:
anthropic/claude-opus-4-6(またはanthropic/claude-sonnet-4-5) - Google:
google/gemini-3-flash-preview(またはgoogle/gemini-3.1-pro-preview) - Z.AI(GLM):
zai/glm-4.7 - MiniMax:
minimax/minimax-m2.5
追加カバレッジ(あると良い):
- xAI:
xai/grok-4(または最新の利用可能バージョン) - Mistral:
mistral/…(「tools」対応モデルを1つ選択) - Cerebras:
cerebras/…(アクセスがある場合) - LM Studio:
lmstudio/…(ローカル;ツール呼び出しはAPIモードに依存)
ビジョン:画像送信(添付ファイル → マルチモーダルメッセージ)
画像プローブを実行するため、OPENCLAW_LIVE_GATEWAY_MODELSに少なくとも1つの画像対応モデル(Claude/Gemini/OpenAIのビジョン対応バリアントなど)を含めてください。
アグリゲーター / 代替ゲートウェイ
キーが有効な場合、以下経由のテストもサポートしています:
- OpenRouter:
openrouter/...(数百のモデル;openclaw models scanでツール+画像対応候補を検索) - OpenCode:
opencode/...(Zen用)とopencode-go/...(Go用)(認証はOPENCODE_API_KEY/OPENCODE_ZEN_API_KEY経由)
ライブマトリックスに含められる追加プロバイダー(認証情報/設定がある場合):
- 組み込み:
openai、openai-codex、anthropic、google、google-vertex、google-antigravity、google-gemini-cli、zai、openrouter、opencode、opencode-go、xai、groq、cerebras、mistral、github-copilot models.providers経由(カスタムエンドポイント):minimax(クラウド/API)、その他OpenAI/Anthropic互換プロキシ(LM Studio、vLLM、LiteLLMなど)
ヒント: ドキュメントで「すべてのモデル」をハードコードしようとしないでください。権威あるリストはマシン上で
discoverModels(...)が返すもの + 利用可能なキーです。
認証情報(コミット厳禁)
ライブテストはCLIと同じ方法で認証情報を検出します。実用的な意味合い:
-
CLIが動作すれば、ライブテストも同じキーを見つけるはずです。
-
ライブテストが「認証情報なし」と言う場合、
openclaw models list/ モデル選択のデバッグと同じ方法でデバッグしてください。 -
プロファイルストア:
~/.openclaw/credentials/(推奨;テストで「プロファイルキー」が意味するもの) -
設定:
~/.openclaw/openclaw.json(またはOPENCLAW_CONFIG_PATH)
環境変数キー(例:~/.profileでエクスポート)に頼りたい場合、source ~/.profile後にローカルテストを実行するか、以下のDockerランナーを使用してください(コンテナに~/.profileをマウント可能)。
Deepgramライブ(音声文字起こし)
- テスト:
src/media-understanding/providers/deepgram/audio.live.test.ts - 有効化:
DEEPGRAM_API_KEY=... DEEPGRAM_LIVE_TEST=1 pnpm test:live src/media-understanding/providers/deepgram/audio.live.test.ts
BytePlusコーディングプランライブ
- テスト:
src/agents/byteplus.live.test.ts - 有効化:
BYTEPLUS_API_KEY=... BYTEPLUS_LIVE_TEST=1 pnpm test:live src/agents/byteplus.live.test.ts - オプションのモデルオーバーライド:
BYTEPLUS_CODING_MODEL=ark-code-latest
Dockerランナー(オプションの「Linuxで動作確認」チェック)
リポジトリDockerイメージ内でpnpm test:liveを実行し、ローカル設定ディレクトリとワークスペースをマウント(マウントされた場合は~/.profileもソース):
- ダイレクトモデル:
pnpm test:docker:live-models(スクリプト:scripts/test-live-models-docker.sh) - ゲートウェイ + devエージェント:
pnpm test:docker:live-gateway(スクリプト:scripts/test-live-gateway-models-docker.sh) - オンボーディングウィザード(TTY、フルスキャフォールディング):
pnpm test:docker:onboard(スクリプト:scripts/e2e/onboard-docker.sh) - ゲートウェイネットワーキング(2コンテナ、WS認証 + ヘルス):
pnpm test:docker:gateway-network(スクリプト:scripts/e2e/gateway-network-docker.sh) - プラグイン(カスタム拡張ロード + レジストリスモーク):
pnpm test:docker:plugins(スクリプト:scripts/e2e/plugins-docker.sh)
ライブモデルDockerランナーは現在のチェックアウトを読み取り専用でバインドマウントし、コンテナ内の一時作業ディレクトリにステージングします。これによりランタイムイメージをスリムに保ちながら、正確なローカルソース/設定に対してVitestを実行できます。
手動ACPプレーンランゲージスレッドスモーク(非CI):
bun scripts/dev/discord-acp-plain-language-smoke.ts --channel <discord-channel-id> ...- このスクリプトはリグレッション/デバッグワークフロー用に保持してください。ACPスレッドルーティング検証に再び必要になる可能性があるため、削除しないでください。
有用な環境変数:
OPENCLAW_CONFIG_DIR=...(デフォルト:~/.openclaw)/home/node/.openclawにマウントOPENCLAW_WORKSPACE_DIR=...(デフォルト:~/.openclaw/workspace)/home/node/.openclaw/workspaceにマウントOPENCLAW_PROFILE_FILE=...(デフォルト:~/.profile)/home/node/.profileにマウントしテスト実行前にソースOPENCLAW_LIVE_GATEWAY_MODELS=.../OPENCLAW_LIVE_MODELS=...で実行を絞り込みOPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1で認証情報がプロファイルストアから来ることを保証(環境変数ではなく)
ドキュメントの正当性
ドキュメント編集後にドキュメントチェックを実行:pnpm docs:list。
オフラインリグレッション(CI安全)
実プロバイダーなしの「実パイプライン」リグレッション:
- ゲートウェイツール呼び出し(モックOpenAI、実ゲートウェイ + エージェントループ):
src/gateway/gateway.test.ts(ケース:“runs a mock OpenAI tool call end-to-end via gateway agent loop”) - ゲートウェイウィザード(WS
wizard.start/wizard.next、設定書き込み + 認証強制):src/gateway/gateway.test.ts(ケース:“runs wizard over ws and writes auth token config”)
エージェント信頼性評価(スキル)
CI安全な「エージェント信頼性評価」として動作するテストがすでにいくつかあります:
- 実ゲートウェイ + エージェントループを通したモックツール呼び出し(
src/gateway/gateway.test.ts)。 - セッション配線と設定効果を検証するエンドツーエンドウィザードフロー(
src/gateway/gateway.test.ts)。
スキルにまだ不足しているもの(Skills参照):
- 判断: スキルがプロンプトにリストされた場合、エージェントは適切なスキルを選択するか(または無関係なスキルを避けるか)?
- 準拠: エージェントは使用前に
SKILL.mdを読み、必要なステップ/引数に従うか? - ワークフローコントラクト: ツールの順序、セッション履歴の引き継ぎ、サンドボックス境界をアサートするマルチターンシナリオ。
将来の評価はまず決定論的であるべき:
- モックプロバイダーを使用してツール呼び出し + 順序、スキルファイルの読み取り、セッション配線をアサートするシナリオランナー。
- スキルに焦点を当てた小さなシナリオスイート(使用 vs 回避、ゲーティング、プロンプトインジェクション)。
- CI安全スイートが整った後にのみ、オプションのライブ評価(オプトイン、環境変数ゲート)。
リグレッションの追加(ガイダンス)
ライブで発見されたプロバイダー/モデルの問題を修正する際:
- 可能であればCI安全なリグレッションを追加(モック/スタブプロバイダー、または正確なリクエスト形状変換をキャプチャ)
- 本質的にライブのみの場合(レート制限、認証ポリシー)、ライブテストを絞り込み環境変数でオプトインに保つ
- バグを捕捉する最小のレイヤーをターゲットにすることを推奨:
- プロバイダーリクエスト変換/リプレイバグ → ダイレクトモデルテスト
- ゲートウェイセッション/履歴/ツールパイプラインバグ → ゲートウェイライブスモークまたはCI安全ゲートウェイモックテスト
- SecretRefトラバーサルガードレール:
src/secrets/exec-secret-ref-id-parity.test.tsがレジストリメタデータ(listSecretTargetRegistryEntries())からSecretRefクラスごとに1つのサンプルターゲットを導出し、トラバーサルセグメントexec IDが拒否されることをアサート。src/secrets/target-registry-data.tsに新しいincludeInPlanSecretRefターゲットファミリーを追加する場合、そのテストのclassifyTargetClassを更新してください。テストは未分類のターゲットIDで意図的に失敗するため、新しいクラスが暗黙的にスキップされることはありません。