ANTIGRAVITY LABEN
記事一覧/Agents & Manager
Agents & Manager/2026-05-26上級

Antigravity のサブエージェントでリリース直前 QA を 4 経路並列に分散する設計ノート

6 本のアプリを並行運用する個人開発者の視点から、Antigravity のサブエージェントを使ってリリース直前 QA を 4 経路に分けて並列化する設計を書き残します。プロンプト雛形・終了条件・合流点までを実例付きで整理しました。

antigravity435subagent3qareleaseios35android27

プレミアム記事

私は廣川政樹といいます。2014 年からひとりで iOS / Android のアプリ開発を続けてきて、現在は壁紙系・癒し系・引き寄せ系を中心とした合計 6 本のアプリを並行して運用しています。累計 5,000 万ダウンロードを越えたあたりから、リリース週の作業量が「ひとりで直列に回す」では明らかに足りなくなり、Antigravity のサブエージェントに QA の前段をどこまで任せられるかを半年ほど試してきました。本稿はその設計ノートで、結論だけ先に書くと、リリース直前のチェックを 4 経路に分けて並列に走らせる構成に落ち着いています。

直列で進めていた頃は、静的解析が終わってから Simulator を立ち上げ、それからアセット差分、最後にストア提出物の確認、という順番でやっていました。1 本あたり 90 分前後かかり、6 本だと正味 9 時間です。実際には深夜帯にやることが多く、判断疲れで終盤のチェックが甘くなるという問題もありました。サブエージェントに細切れの責務を渡し、合流点を明示的に設計することで、所要時間は 6 本トータルで 2 時間半ほど、深夜の集中力依存も解消しています。

4 経路に分けた根拠

最初は「全部 1 つのエージェントに渡して、Plan Mode で順番に処理させる」やり方を試しました。Antigravity の Plan Mode は計画立案として優秀なのですが、QA のように「同じ手順を 6 本のアプリに繰り返し適用する」用途では、コンテキストが膨らみすぎて途中で判断が雑になる瞬間があります。私の手元では、3 本目あたりからエージェントが「以前のアプリと同じだから省略」と判断を始め、実際には差分があった項目を見落としたケースが二度ほどありました。

そこで、責務の境界を「読み取るリソースの種類」で切ることにしました。読み取り対象を限定すれば、各サブエージェントのコンテキストは小さく保てます。最終的に落ち着いた 4 経路はこうです。

  • 経路 1:ソースコードと git diff(静的解析と差分レビュー)
  • 経路 2:ビルド済みアプリのランタイム挙動(Simulator / Emulator スモーク)
  • 経路 3:アセットとローカライズリソース(差分検査)
  • 経路 4:ストア提出物と外部設定(メタデータ・AdMob・Crashlytics 等)

この 4 経路は、参照するファイル群がほぼ重複しません。経路 1 は src/app/src/main/ を読み、経路 3 は Assets.xcassets/res/drawable*/ を読みます。コンテキストの干渉が少ないので、Antigravity のサブエージェントを 4 並列で走らせても、それぞれが自分の責務だけに集中できます。

逆に、責務を切るときに気をつけたのは「判断の重なり」です。たとえば「アイコンが正しく差し替わったか」は経路 3 の責務ですが、「Info.plist の CFBundleIconName が正しく書き換えられているか」は経路 1 にも経路 3 にも関係します。こういうグレーゾーンは経路 1 を優先する、と決めておくと、最終合流時に矛盾が起きません。グレーゾーンを「両方で見る」にしてしまうと、片方の警告だけが残った場合の判断が難しくなり、結局メインエージェントの合流処理を複雑にしてしまいます。境界を明示するときは、片方を主担当にし、もう片方は「主担当が出した結果を信用する」という規約を最初に書いておくのが安定します。

経路 1:静的解析と差分レビュー

経路 1 のサブエージェントには、前回のリリースタグから今回の候補コミットまでの差分を渡し、リスクのあるパターンが入り込んでいないかをチェックさせます。私の場合、Swift / Kotlin / TypeScript の 3 言語が混ざっているので、言語別に確認項目を分けています。

代表的な引っかかりやすいパターンはこういう類です。

  • Swift で try!as! が増えていないか(クラッシュ要因になりやすい)
  • Kotlin で !! が増えていないか(同上)
  • console.log / print / Log.d のデバッグ出力が残っていないか
  • Feature flag の初期値が true で残っていないか
  • UserDefaults / SharedPreferences のキー名が前バージョンと衝突していないか

これらは Lint で拾える項目もありますが、Lint の警告レベル運用は私のプロジェクトごとにバラバラで、「リリース直前にだけ厳しくしたい」という要望に Lint だけだと応えられません。サブエージェントなら、テンポラリな閾値を自然言語で指示できるのが強みです。

経路 1 サブエージェントの定義はこんな形にしています。Antigravity のサブエージェント定義は YAML で書くこともできますが、私はプロジェクトごとに微調整するので Markdown 風のプロンプトテンプレートに揃えています。

# .antigravity/subagents/path1-static-diff.yaml
name: path1-static-diff
role: 静的解析と差分レビュー
read_paths:
  - src/**
  - app/src/main/**
  - ios/**/*.swift
  - android/**/*.kt
write_paths: []  # 経路 1 は read-only
termination:
  on_finding_count_exceeds: 30  # ノイズが多すぎたら手動確認に切り替え
  on_critical_severity: true     # critical 1 件で即終了
output_format: json_schema_v1

このサブエージェントを Plan Mode から呼び出すときのプロンプト雛形を載せておきます。プロンプト本文に書く制約は、出力フォーマットを厳密に固定する部分が肝です。後段で 4 経路の結果をマージするので、フォーマットが揺れると合流処理が複雑になります。

あなたは経路 1 のサブエージェントです。{REPO_NAME} の {PREV_TAG}...HEAD の差分について、
以下の観点だけを評価してください。それ以外の判断や提案は不要です。
 
評価観点:
- 強制アンラップ / 強制キャストの新規追加 (Swift: try!/as!, Kotlin: !!)
- デバッグ出力の取り残し (console.log, print, Log.d)
- Feature flag の初期値が true で commit に残っているか
- UserDefaults/SharedPreferences キー名の前バージョンとの衝突
- 公開 API の breaking change (関数シグネチャ・enum の case 変更)
 
出力は次の JSON だけを返してください:
{
  "path": "path1-static-diff",
  "status": "pass" | "warn" | "fail",
  "findings": [
    { "severity": "info|warn|critical", "file": "...", "line": 0, "summary": "..." }
  ],
  "took_seconds": 0
}

status の決め方は明示的に渡しています。critical が 1 件以上で fail、warn が 5 件以上で warn、それ以下は pass、というルールです。サブエージェント側に判断を任せると、同じプロジェクトでも実行ごとに warnpass が揺れる現象が起きたので、閾値は外から決め打ちした方が安定します。

経路 1 だけで拾える典型例として、私の壁紙アプリで実際にあったのは「アイコンキャッシュをクリアするコードが、デバッグビルドだけのつもりで書かれていたのに、#if DEBUG の閉じ忘れで本番ビルドにも入っていた」というケースでした。git diff レベルでは #endif の位置がずれているだけだったので、人間の目では追いきれなかった部分です。

もう一つ経路 1 でやらせているのは、ライブラリのバージョンピン留めの検証です。Package.resolvedGemfile.lockpackage-lock.json が、意図せぬマイナーアップデートを巻き込んでいないかを差分で見せます。これは厳密には「静的解析」ではなく依存関係の検査ですが、コードを読むサブエージェントに渡すと文脈を共有できるので便利でした。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
iOS / Android 計 6 アプリのリリース直前 QA を 4 経路に分割した役割分担の判断軸
サブエージェントのプロンプト・終了条件・成果物 JSON フォーマットの実装テンプレート
AdMob メディエーション・dSYM・ストア提出物まで含めた合流点設計と差し戻し基準
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Antigravity Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

Agents & Manager2026-05-22
壁紙アプリの夜間アセット更新を Background Agent に任せる — 時間予算・重複検出・完了ゲートまで含めた運用設計
壁紙アプリの夜間アセット更新を Antigravity の Background Agent に任せた実運用記録を、再現できる形に落とし込みました。タスク定義の書き方、知覚ハッシュによる重複検出、12 プロファイル一括リサイズ、5 分で終わる朝の確認レポート、そして時間予算と完了ゲートの設計までをコード付きでまとめます。
Agents & Manager2026-05-18
Crashlyticsの毎朝トリアージを5つのAntigravityサブエージェントに分担させた話
個人で6本のアプリを運営している中で毎朝のクラッシュトリアージが負担になり、Antigravityのサブエージェント5つに責務を分割しました。Fetcher/Classifier/Repro/Patch/PRの各段で人間レビューの境界線をどこに置いたかを、二週間の実運用データと合わせて記録します。
Agents & Manager2026-05-27
6 アプリ並行の iOS 更新を Antigravity の Main / Sub エージェントで束ねた実体験
Beautiful HD Wallpapers / Ukiyo-e Wallpapers / Relaxing Healing / Law of Attraction を含む 6 アプリの iOS 更新を、Antigravity の Main エージェント + 6 サブエージェント構成で並行運用した実装ノート。直列化すべきところと並列化すべきところの判断軸を残します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →