openclaw-qa-testing について
openclaw-qa-testing は、OpenClaw リポジトリ内で QA Lab と qa-channel のテストを実行・保守するためのスキルです。テストスイート、シナリオ作成、モック・ライブ実行、認証情報、キャラクター評価を扱います。
主な機能
- 01モックとライブ QA スイートの実行ガイド
- 02シナリオ作成とエンドツーエンド検証
- 03OTel スモークテストの手順
- 04キャラクターとペルソナの評価
- 05認証情報とライブチャネルのテスト手順
活用シーン
- 01指定レーンで OpenClaw QA スイートを実行
- 02YAML QA シナリオの追加・更新
- 03OpenTelemetry のトレース出力をローカル検証
- 04モデル間のキャラクター挙動を比較
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ openclaw/ openclaw --skill openclaw-qa-testingインストール後、Claude Code で/openclaw-qa-testingを入力して読み込まれたか確認します。
同梱ファイルagents/openai.yaml
詳細
OpenClaw QA テスト
qa-lab / qa-channel の作業には、このスキルを使用します。リポジトリ内の QA のみに対応します。
最初に読むもの
docs/concepts/qa-e2e-automation.mddocs/help/testing.mddocs/channels/qa-channel.mdqa/README.mdqa/scenarios/index.yamlextensions/qa-lab/src/suite.tsextensions/qa-lab/src/character-eval.ts
モデルポリシー
- 通常のライブスイート実行では、QA Lab のソースと認証情報を考慮したデフォルト設定を使用します。
- デフォルトでは、
--model、--alt-model、--fastを渡さないでください。--fastを省略しても、高速モードが無効になるわけではありません。高速動作はソース側で制御されます。 - シナリオ固有の実行では、
execution.summaryの全内容を優先し、他のフラグが必要な場合も含め、一般的なデフォルトの指針より優先します。明示的にプロバイダー/モデルを指定するのは、execution.config.requiredProviderまたはrequiredModelで必要とされる場合に限ります。
デフォルトのワークフロー
- シナリオパックと現在のスイート実装を読みます。
- 実行レーンを決定します。
- モック/開発:
mock-openai - 実環境での検証:
live-frontier
- モック/開発:
- 通常のライブスイートでは、次を使用します。
pnpm openclaw qa suite \
--provider-mode live-frontier \
--output-dir .artifacts/qa-e2e/run-all-live-frontier-<tag>
- 出力を確認します。
- サマリー:
.artifacts/qa-e2e/run-all-live-frontier-<tag>/qa-suite-summary.json - レポート:
.artifacts/qa-e2e/run-all-live-frontier-<tag>/qa-suite-report.md
- サマリー:
- ユーザーがライブ UI の表示を希望する場合は、現在の
openclaw-qaのリッスンポートを確認し、http://127.0.0.1:<port>を報告します。 - シナリオが失敗した場合は、製品またはハーネスの根本原因を修正してから、レーン全体を再実行します。
OTEL スモークテスト
ローカルの QA-lab で OpenTelemetry を検証するには、次を使用します。
pnpm qa:otel:smoke
これにより、ローカルの OTLP/HTTP トレースレシーバーが起動し、qa-channel を介して otel-trace-smoke シナリオが実行され、出力された protobuf スパンがデコードされます。そのうえで、エクスポートされたトレース名とプライバシー要件が検証されます。Opik、Langfuse、外部コレクターの認証情報は不要です。
QA の認証情報と 1Password
- このリポジトリで QA のシークレットを検索する場合は、
opをtmux内でのみ使用してください。 - tmux 内での簡易認証チェック:
op account list
- Telegram の npm ライブテストで直接使用するシークレットは、現在 1Password の次のアイテムにあります。
- vault:
OpenClaw - item:
Telegram E2E
- vault:
- 次の値は、まずこのアイテムを確認してください。
OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKENOPENCLAW_QA_TELEGRAM_SUT_BOT_TOKENOPENCLAW_QA_PROVIDER_MODEOPENCLAW_NPM_TELEGRAM_PACKAGE_SPEC
- Convex の QA シークレットは、現在 1Password の次のアイテムにあります。
- vault:
OpenClaw - item:
OPENCLAW_QA_CONVEX_SITE_URL - item:
OPENCLAW_QA_CONVEX_SECRET_MAINTAINER - item:
OPENCLAW_QA_CONVEX_SECRET_CI
- vault:
- QA の認証情報作業中に確認された、関連する追加のメモ/ログインアイテム:
- vault:
Private - items:
OPENCLAW QA、Convex、Telegram
- vault:
- 必要な値がこれらのメモにない場合:
- 推測しないでください。
- メンテナー/オペレーターに、現在の値または現在の 1Password アイテム名を確認してください。
- Telegram の直接実行では、
OPENCLAW_QA_TELEGRAM_GROUP_IDがTelegram E2Eとは別に保存されている場合があります。 - Convex での実行では、貸し出された Telegram 認証情報に Telegram グループ ID とボットトークンがまとめて含まれている必要があります。
OPENCLAW_QA_TELEGRAM_GROUP_IDを別途要求しないでください。 - Convex での実行では、
OpenClaw/OPENCLAW_QA_CONVEX_SITE_URLを優先してください。古い値である、または不明瞭な場合は、実行前に現在有効なプール URL を確認してください。
- 利用可能な場合は、npm Telegram Docker レーンで Telegram の直接指定環境変数を優先してください。
OPENCLAW_QA_TELEGRAM_GROUP_ID="..." \
OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN="..." \
OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN="..." \
OPENCLAW_QA_PROVIDER_MODE="mock-openai" \
OPENCLAW_NPM_TELEGRAM_PACKAGE_SPEC="openclaw@beta" \
pnpm test:docker:npm-telegram-live
- 安定した共有 QA インフラが目的の場合は、Convex モードを優先してください。
- ラウンドロビン方式での認証情報の貸し出し
- チャネル固有のセットアップを行う薄いラッパー
- プールされた認証情報を扱う CLI/管理者向けフロー
- npm Telegram Docker ライブレーンに関する注意:
scripts/e2e/npm-telegram-live-runner.tsはOPENCLAW_NPM_TELEGRAM_PROVIDER_MODEを読み取ります。- このラッパーが
OPENCLAW_QA_PROVIDER_MODEを使用すると決めつけないでください。 - 1Password のメモに
OPENCLAW_QA_PROVIDER_MODEしか記載されていない場合、Docker レーンの実行前に明示的にOPENCLAW_NPM_TELEGRAM_PROVIDER_MODEに割り当ててください。
- 検証済みのライブ実行構成:
- Convex モードでは、Telegram の直接指定環境変数なしで実際の Docker レーンを通過できます。
- 貸し出される Telegram ペイロードには、ドライバー/SUT トークンと関連付けられたグループ ID が含まれます。
- 次の値を指定した
pnpm test:docker:npm-telegram-liveの実際の実行は成功しました。OPENCLAW_QA_CREDENTIAL_SOURCE=convexOPENCLAW_QA_CREDENTIAL_ROLE=maintainerOPENCLAW_QA_CONVEX_SITE_URLOPENCLAW_QA_CONVEX_SECRET_MAINTAINEROPENCLAW_NPM_TELEGRAM_PROVIDER_MODE=mock-openai
- Telegram の直接指定環境変数がローカルにない状態で
op signinがブロックされる場合は、qa-live-shared環境に Convex CI 認証情報がすでにあるため、手動の GitHub レーンをディスパッチしてください。
gh workflow run "NPM Telegram Beta E2E" --repo openclaw/openclaw --ref main \
-f [email protected] \
-f [email protected] \
-f provider_mode=mock-openai
- ディスパッチ URL に記載された正確な実行 ID をポーリングしてください。
gh run view --json artifactsはサポートされていません。次のコマンドでアーティファクトを一覧表示してください。
gh api repos/openclaw/openclaw/actions/runs/<run-id>/artifacts
WhatsApp のライブ認証情報
Convex の kind=whatsapp 認証情報を設定または置き換える場合に使用します。
- WhatsApp QA 認証情報は、生成されたフィクスチャではなく、オペレーターが所有するライブアカウントとして扱います。
- WhatsApp に対応した専用のテスト番号を2つ用意します。1つはドライバーアカウント、もう1つは SUT アカウントです。個人番号や個人用の OpenClaw WhatsApp アカウントを共有プールで使用しないでください。
- WhatsApp または WhatsApp Business を使って各アカウントを手動で登録およびリンクし、Web 認証情報はリポジトリ外の分離されたローカル認証ディレクトリにのみ保存します。
- グループのカバレッジをテストする場合は、両方の QA アカウントを含む専用のテストグループを作成し、その JID を
groupJidとして保存します。そうしない場合、グループのメンションゲーティングシナリオはデフォルトでスキップされ、明示的に要求された場合は失敗する必要があります。 - 2つの Baileys 認証ディレクトリを base64 の
.tgzペイロードフィールドにまとめ、新しい有効な Convex 認証情報行を追加します。認証情報をその場で上書きするより、新しい行を追加して、古い行や壊れた行を無効化することを推奨します。 - 予期されるペイロードフィールド:
driverPhoneE164、sutPhoneE164、driverAuthArchiveBase64、sutAuthArchiveBase64、および任意のgroupJid。 - 認証情報をリポジトリ、ログ、PR、スクリーンショットに含めないでください。オペレーターからローカルでのデバッグを明示的に依頼された場合を除き、電話番号は伏せてください。
pnpm openclaw qa whatsapp --credential-source convex --credential-role maintainer --provider-mode mock-openaiで検証し、アーティファクトのパスと、情報を伏せた合否サマリーを保存します。- WhatsApp の有効期限が切れた場合、またはリンク済みの Web セッションが無効になった場合は、ローカルで再リンクし、新しい認証アーカイブを作成して新しい Convex 行を追加した後、古い行を無効化します。
キャラクター評価
複数のライブモデルを対象にスタイル/ペルソナ/雰囲気を確認するには、qa character-eval を使用します。
pnpm openclaw qa character-eval \
--output-dir .artifacts/qa-e2e/character-eval-<tag>
- Docker ではなく、ローカルの QA ゲートウェイ子プロセスを実行します。
- パッケージ化された
pnpm buildでは、設計上 QA Lab と qa-channel は除外されます(ソースチェックアウトのみ)。ビルド済みの dist からopenclaw qa/qa-channel を実行するには、OPENCLAW_BUILD_PRIVATE_QA=1 pnpm buildでビルドするか(dist/plugin-sdk/qa-lab.js、qa-runtime.js、dist/extensions/{qa-lab,qa-channel}が生成されます)、pnpm devで実行します。 - モデルフラグを指定しない場合、キャラクター評価では現在ソースで定義されている候補、判定、思考、fast のデフォルト値が使用されます。
- 対応するインベントリを明示的に置き換える場合に限り、
--model provider/model,thinking=<level>[,fast|,no-fast|,fast=<bool>]または--judge-model ...を繰り返し指定します。 --model-thinkingを別途指定する新しい例は追加しないでください。このフラグはレガシー互換性のためだけに残します。- レポートには判定ランキング、実行統計、所要時間、完全なトランスクリプトが含まれます。判定の生の応答は含めないでください。所要時間はベンチマークの参考情報であり、評価指標ではありません。
- 候補と判定の同時実行数はデフォルトで16です。ローカルゲートウェイやプロバイダーの制限に応じて負荷を抑える必要がある場合は、
--concurrency <n>と--judge-concurrency <n>で上書きします。 - シナリオのソースは
qa/scenarios/配下の YAML のみです。index.yamlと、トップレベルにtitle、scenario、任意のflowを含むシナリオごとの*.yamlファイルを使用します。フェンス付きのqa-scenario/qa-flowMarkdown ファイルは追加しないでください。 - キャラクター/ペルソナを個別に評価する場合は、シナリオフローでペルソナを
SOUL.mdに記述し、IDENTITY.mdを空にします。通常の OpenClaw のアイデンティティがキャラクターとどのように組み合わさるかを意図的にテストする場合に限り、SOUL.md + IDENTITY.mdを使用します。 - プロンプトは自然で、タスクに即したものにしてください。候補モデルには、まず
SOUL.mdを通じてキャラクター設定を与え、その後、チャット、ワークスペースのサポート、小規模なファイル作業など、通常のユーザーとのやり取りを行います。「どう反応しますか?」と尋ねたり、モデルに評価中であると伝えたりしないでください。 - 純粋なロールプレイではなく、通常のツール利用時のキャラクターがトランスクリプトに記録されるよう、小さなワークスペース成果物の作成や編集など、実際のタスクを少なくとも1つ含めることを推奨します。
Codex CLI モデルレーン
QA で Codex をモデルバックエンドとしてテストする場合は、codex-cli/<codex-model> 形式のモデル参照を使用します。
例:
pnpm openclaw qa suite \
--provider-mode live-frontier \
--model codex-cli/<codex-model> \
--alt-model codex-cli/<codex-model> \
--scenario <scenario-id> \
--output-dir .artifacts/qa-e2e/codex-<tag>
pnpm openclaw qa manual \
--model codex-cli/<codex-model> \
--message "Reply exactly: CODEX_OK"
- 具体的な Codex モデル名はユーザー/設定からの入力として扱い、ソース、ドキュメントの例、シナリオにハードコードしないでください。
- ライブ QA では
CODEX_HOMEを維持して Codex CLI の認証/設定を機能させる一方、HOMEとOPENCLAW_HOMEはサンドボックス化します。 - モック QA では
CODEX_HOMEを消去してください。 - Codex が毎ターン、フォールバック/認証に関するテキストを返す場合は、シナリオのアサーションを変更する前に、まず
CODEX_HOME、関連するシークレットベースの認証、ゲートウェイの子プロセスログを確認してください。 - モデルを比較する場合は、
qa character-evalに別候補としてcodex-cli/<codex-model>を含めてください。レポートでは、不透明なモデル名として表示してください。
リポジトリの情報
- シードシナリオは
qa/scenarios/index.yamlとqa/scenarios/<theme>/*.yamlにあります。 - メインのライブランナー:
extensions/qa-lab/src/suite.ts - QA ラボサーバー:
extensions/qa-lab/src/lab-server.ts - 子ゲートウェイハーネス:
extensions/qa-lab/src/gateway-child.ts - 合成チャンネル:
extensions/qa-channel/
「完了」の状態
- リクエストされたレーンのスイート全体が成功している。
- ユーザーに以下を提供する:
- 該当する場合はウォッチ URL
- 成功/失敗の件数
- 成果物のパス
- 修正内容についての簡潔な説明
よくある失敗パターン
- ライブのタイムアウトが短すぎる:
extensions/qa-lab/src/suite.tsのライブ待機時間を延ばしてください
- リポジトリのファイルを検出できない:
- シードされたワークスペース内の
repo/...をプロンプトで指定してください
- シードされたワークスペース内の
- サブエージェントの証拠が不安定すぎる:
- 一時的な子セッションの一覧表示より、安定した最終応答の証拠を優先してください
- ハーネスの「再ビルド」による遅延:
- ツリーがダーティだと、実行前にビルドが行われることがあります。ポートが表示される前に発生するものとして想定してください
シナリオを追加する場合
qa/scenarios/にシナリオ YAML を追加または更新してください。.md 形式のシナリオファイルや、コードフェンスで囲んだ YAML ブロックは追加しないでください。qa/scenarios/index.yamlのキックオフ時の期待内容を整合させてください- 実行可能なカバレッジを
extensions/qa-lab/src/suite.tsに追加してください - モックのみのチェックより、エンドツーエンドのアサーションを優先してください
- 出力は
.artifacts/qa-e2e/に保存してください
コメント
Markdown 対応