From ios-qa-agent
AI QA Agent のメインオーケストレーター。テストスイートまたは個別テストケースの QA を段階的に実行する。フェーズスキルに委譲して段階的開示を行い、サブエージェントでコンテキスト隔離を実現する。「QA」「動作確認」「テストケース実行」「smoke test」「E2E」「手動テスト」「結合テスト」などのキーワードで自動適用。
npx claudepluginhub no-problem-dev/claude-code-plugins --plugin ios-qa-agentThis skill uses the workspace's default tool permissions.
人間がスマホをポチポチして動作確認する作業を AI に委譲する。
Creates isolated Git worktrees for feature branches with prioritized directory selection, gitignore safety checks, auto project setup for Node/Python/Rust/Go, and baseline verification.
Executes implementation plans in current session by dispatching fresh subagents per independent task, with two-stage reviews: spec compliance then code quality.
Dispatches parallel agents to independently tackle 2+ tasks like separate test failures or subsystems without shared state or dependencies.
人間がスマホをポチポチして動作確認する作業を AI に委譲する。
Phase 0: QA Readiness 検査(条件付き) → ios-qa-prepare スキルで判定し、必要に応じて実行 Phase 1: 準備 → ios-qa-prepare スキルの知識で実行 Phase 2: テスト実行 → ios-qa-execute スキルの知識で実行 Phase 3: レポート → ios-qa-report スキルの知識で実行
「QA を実行して tests/qa-suite.md」 「動作確認して tests/cases/」
「このテストケースを実行して tests/cases/TC-001.md」
「アプリを起動して、メッセージが送信できるか確認して」 → テストケースを即興で構築して実行
実行タイミング: ワークフロー開始時
ユーザー指示を解析し、回帰テストモードを判定:
REGRESSION_MODE = false
if ユーザー指示に以下のキーワード:
- "回帰テスト"
- "regression test"
- "regression"
- "差分テスト"
- "差分確認"
THEN
REGRESSION_MODE = true
通知: "回帰テストモードで実行します。App Map 差分分析を先に実施します。"
END IF
回帰テストモード有効時の処理:
以下のいずれかに該当する場合、Phase 0 を実行:
Phase 0 の内容:
QA Readiness Score の計算式:
スコア = (HIGH要素率 × 40% + MED要素率 × 30% + 操作可能性 × 20% + 状態観測性 × 10%) × 100
ios-dev プラグインがある場合: Agent(subagent_type: "ios-dev:xbm-run", prompt: "ビルドして実行。scheme: ")
ない場合: ToolSearch("select:mcp__XcodeBuildMCP__build_run_sim") build_run_sim(scheme: "")
scheme / simulator 情報を記憶。
App Map 注入をワンタイムで実施:
メリット:
実行順序に従い、各テストケースを処理。回帰テストモード有効時は影響テストケースを優先:
# 回帰テストモード: 影響テストケース優先
if REGRESSION_MODE:
affected_tests = Phase 0.5 の差分分析から抽出
test_execution_order = [
*affected_tests (優先度順),
*remaining_tests (元の優先度順)
]
else:
test_execution_order = 元の優先度順
for each test_case in test_execution_order:
# 回帰テストモード: 変更なしテストをスキップ提案
if REGRESSION_MODE and test_case not in affected_tests:
if ユーザー指示が「影響テストケースのみ」:
Skip(理由: App Map 差分なし)
continue
# 依存チェック
if depends_on が Fail/Inconclusive → Skipped
# アプリ状態リセット判断
if 前テストが Fail or preconditions が非互換 → アプリ再起動
# Step A: qa-runner で実行
Agent(
subagent_type: "ios-qa-agent:qa-runner",
prompt: |
以下のテストケースを実行してください。
## テストケース
{前提状態 + 操作意図のみ。期待結果は渡さない}
## 前提条件の達成手順(ヒント)
{プリセットの steps}
## 制限
max_actions: 20, timeout_seconds: {timeout}, stuck_threshold: 3
)
→ Execution Report を受け取る
# Step B: qa-judge で判定
Agent(
subagent_type: "ios-qa-agent:qa-judge",
prompt: |
以下のテスト結果を判定してください。
## 期待結果
{テストケースの期待結果セクション}
## 補足
{テストケースの補足セクション}
## 実行レポート
{qa-runner の Execution Report 全文}
)
→ Judgment を受け取る
results.append(judgment)
全 runner の Discoveries を集約し、App Map v5 フォーマットで更新:
Step 1: Discoveries の収集と分類
[interacted] — 操作して確認済み → 即座に App Map に反映[observed] — snapshot_ui のみで確認 → App Map に [unverified] マーク付きで追加Step 2: App Map への統合
既存 app-map.md がある場合:
[interacted] の情報: 既存記録を更新、日付を現在日時に更新[observed] の情報: 新規要素の場合は [MED, unverified] マーク付きで追加app-map.md がない場合:
Step 3: Known Issues への追記
Step 4: フォーマット更新
format_version: 5[HIGH, 2026-03-15][unverified] マーク付きの要素を Operation Patterns の Known Issues に記載実装注: このフェーズはオプション。テストスイート実行時のみ適用。単一ケース実行時はスキップ。
全テストスイート実行に対する全体タイムアウトを設定:
設定値:
タイムアウト判定ロジック:
for each test_case in remaining_tests:
elapsed_time = 現在時刻 - 実行開始時刻
remaining_time = total_timeout - elapsed_time
# 残りテストの平均実行時間を推定
avg_time_per_test = 3分(デフォルト推定値)
estimated_remaining_time = avg_time_per_test × len(remaining_tests)
if estimated_remaining_time > remaining_time:
# 時間不足の場合、残りテストを Skipped にする
for test in remaining_tests:
result.append(Skipped, reason: "全体タイムアウトによるスキップ")
break
else:
# テスト実行を続行
run_test(test_case)
警告メッセージ:
実行時間が圧迫しています。残り 10分で 5 件のテストが残っています。
以下のテストをスキップします: TC-004, TC-005
テストスイート内に 5 件を超えるテストがある場合、5 件ごとに中間サマリーを出力:
中間サマリーの内容:
## 中間レポート(TC-001 ~ TC-005)
| TC-ID | 結果 | Priority | 実行時間 |
|-------|------|----------|---------|
| TC-001 | Pass | critical | 45s |
| TC-002 | Pass | high | 52s |
| TC-003 | Fail | medium | 38s |
| TC-004 | Skipped | high | - |
| TC-005 | Inconclusive | medium | 55s |
**累計:** 3 Pass, 1 Fail, 1 Inconclusive, 1 Skipped / 実行時間: 190s
---
出力タイミング:
全テスト結果を集約してレポートを出力。
再起動する場合:
再起動しない場合:
再起動方法:
ToolSearch("select:mcp__XcodeBuildMCP__stop_app_sim,mcp__XcodeBuildMCP__launch_app_sim")
stop_app_sim() → launch_app_sim()
| 要素 | トークン消費 | 最適化前 | 最適化後 | 削減量 |
|---|---|---|---|---|
| App Map 読み込み | 300-600 × 1回 | 300-600 × N件 | 300-600 × 1回 | N-1 回分削減 |
| テストケース読み込み | 200-500 / 件 | 変わらず | 変わらず | - |
| qa-runner 結果 | 500-1,000 / 件 | 変わらず | 変わらず | - |
| qa-judge 結果 | 300-500 / 件 | 変わらず | 変わらず | - |
| レポート生成 | 1,000-3,000 | 変わらず | 変わらず | - |
| 10件実行時の合計 | 約 13,000-23,000 | - | 約 12,800-22,400 | 約 200-600(1回分) |
UI 操作ログ(snapshot_ui × N)は qa-runner 内で完全消費。
Phase 5 での効率化:
qa-runner には「期待結果」を渡さない。 理由: runner が期待結果を知ると、それに合わせた報告をする確認バイアスが生じる。 runner は「やったこと」と「見えたもの」を客観的に報告する。 judge が独立して「期待通りだったか」を判定する。