senpi-qa について
omo Senpi アダプターとタスクエンジン向けの QA スキルです。単体テストだけに頼らず、実際の senpi バイナリを使うライブテスト、隔離されたエージェントディレクトリ、ローカル証跡の管理手順を定めています。
主な機能
- 01senpi によるライブ QA
- 02アダプターとタスクのライフサイクル検証
- 03エージェントディレクトリの隔離
- 04解決済みパスへの証跡保存
- 05ライブ検証と単体テストの区別
活用シーン
- 01ライブセッションでのアダプター動作確認
- 02タスクの開始、ストリーミング、終了状態の検証
- 03チームへの配信と再起動復旧の確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ code-yeongyu/ oh-my-openagent --skill senpi-qaインストール後、Claude Code で/senpi-qaを入力して読み込まれたか確認します。
同梱ファイルscripts/resolve-evidence-dir.mjsscripts/resolve-evidence-dir.test.mjs
詳細
Senpi QA
REAL な senpi バイナリを実際に実行して、omo Senpi アダプター(packages/omo-senpi/)とタスクエンジン
(packages/senpi-task/)の QA を行います。ここではユニットテストは実地 QA として認められません。bun run test:senpi はパッケージのゲートであり、packages/omo-senpi/scripts/qa/ のドライバーがハーネスの証明になります。
基本ルール
- 証拠を保存するパスは必ず 1 か所です。 すべての成果物を
.omo/evidence/omo-senpi-adapter/<slug>/に保存してください。scripts/resolve-evidence-dir.mjsでパスを決定し、それ以外は使わないでください。パスを手入力すると、実行結果がlocal-ignore/qa-evidence/や、ワークツリーのルートにある.qa-evidence/のような場所に保存されることがあります。これらは無視対象ルートの外にあるため、誤ってコミットされてしまいます(#8703)。 - 証拠はローカルにとどめます。
.omo/evidence/は gitignore 対象であり、追跡対象の証拠を監査するテストでは、証拠パスが追跡対象になっているとビルドが失敗します。成果物に対してgit add -fを実行しないでください。PR の本文に概要と決定的な抜粋を記載します。 - 実際のエージェントディレクトリには手を加えません。 ライブドライバーは独自の隔離された
SENPI_CODING_AGENT_DIRを構築し、呼び出し元から渡されたものは意図的に無視するため、サンドボックスとして~/.senpi/agentが使われることはありません。ドライバーのrealSenpiUntouched/変更パスのフィールドと、隔離されたエージェントディレクトリのパスを報告してください。ディレクトリ全体のダイジェストは補助的な証拠として扱い、それだけでは証明になりません。 - バイナリがない場合は、何も報告しないのではなく SKIP です。
senpiが見つからない場合、ライブドライバーは実際のホームディレクトリにフォールバックせず、最終 JSON でSKIPまたはFAILを報告します。SKIPは合格ではありません。証拠 README にその旨を記載してください。 - キャプチャした JSON が証拠です。 ディスク上にファイルがなければ QA は行われていないため、コミットもプッシュもできません。このファイルは実行したマシン上での実行を証明するものであり、コミットに含めるものではありません。
まず証拠ディレクトリを決定する
ev="$(node .agents/skills/senpi-qa/scripts/resolve-evidence-dir.mjs \
--repo-root "$(git rev-parse --show-toplevel)" --slug <YYYYMMDD>-<short-slug>)"
mkdir -p "$ev"
リゾルバーは絶対パスを返し、何も作成しないため、ディレクトリをいつ作成するかは呼び出し元が決めます。slug は小文字、数字、ハイフンで構成される相対パスの 1 セグメントです(20260820-senpi-qa-contract)。区切り文字、./..、パストラバーサル、絶対パス、git ルート以外のパスは拒否されます。拒否時はゼロ以外の終了コードと、問題のある slug を示すメッセージが返されます。
ルーター:ケースを選ぶ
| 変更内容 | 実行コマンド | 証明できること |
|---|---|---|
| アダプターコード全般(高速な前提条件チェック) | node packages/omo-senpi/scripts/qa/drive.mjs --self-test | ドライバーと隔離ハーネス自体が動作すること |
| ライブセッションに到達するアダプターの配線 | node packages/omo-senpi/scripts/qa/drive.mjs | プラグインを読み込み、エージェントディレクトリを隔離した状態での実際の senpi 実行と、実ホームディレクトリに起因する変更がないこと |
| タスクのライフサイクル(単一タスク+バッチ) | SENPI_BIN="$(command -v senpi)" node packages/omo-senpi/scripts/qa/task-e2e.mjs | ライブタスクの開始/ストリーム/終端状態 |
| チームの配信、シャットダウン、再取得、再起動時のリカバリー | SENPI_BIN="$(command -v senpi)" node packages/omo-senpi/scripts/qa/team-e2e.mjs | 注入の配信と、重複のないリカバリー |
| タスク RPC ドライバーのスクリプト | node packages/omo-senpi/scripts/qa/task-rpc-e2e.mjs --self-test | RPC サーフェスの契約 |
| タスクへのスキル配信 | SENPI_BIN="$(command -v senpi)" node packages/omo-senpi/scripts/qa/task-load-skills-e2e.mjs | スキルが子タスクに届くこと |
| 継続動作 | node packages/omo-senpi/scripts/qa/probe-continuation.mjs | ターンが想定どおり続くこと |
| DAG ステートマシン/ランナー | bun test packages/senpi-task | ユニットテストとカオス不変条件(ライブ実行の証明ではありません) |
次のように、ドライバーの出力先に決定したディレクトリを指定します。
TASK_E2E_OUT_DIR="$ev/live-task-dag" SENPI_BIN="$(command -v senpi)" \
node packages/omo-senpi/scripts/qa/task-e2e.mjs
パッケージのゲート
tsgo --noEmit -p packages/omo-senpi/tsconfig.json
bun run test:senpi
エビデンス README を作成する
各実行では、再実行しなくてもレビュー担当者が読める $ev/README.md が残ります。
必須セクションは、ルートの
AGENTS.md に記載されたリポジトリ全体のエビデンスルールです
(何をテスト/観察したか、なぜそれで十分なのか、
何を省略したか)。Senpi では、ドライバーの変更パス/分離フィールドとサンドボックスのエージェントディレクトリのパスを記録します。一部のドライバーはサンドボックスのパスを削除せずに報告するため、呼び出し元はタスク所有のサンドボックスをすべて削除し、クリーンアップレシートを作成する前に子 PID が終了状態にあることを確認する必要があります。