ANTIGRAVITY LABEN
記事一覧/アプリ開発
アプリ開発/2026-07-03上級

エージェントが書いた App Intent を Siri に喋らせる前に — 副作用で分類して確認ゲートを挟む設計

Antigravity が生成した App Intent を Siri やアシスタントに無確認で走らせると、破壊的な操作が音声一つで発火します。副作用で3分類し、確認ゲートを機械的に挟む実装と、欠落を push 前に弾く静的チェックをまとめました。

antigravity412app-intents2siri2ios34swift8agent-safety2

プレミアム記事

7月1日に Apple が新しいインテリジェンス・フレームワークと Xcode 27 を発表し、App Intents 経由でアプリの操作を Siri のアシスタント機能に接続できる範囲が広がりました。ちょうどその週、Antigravity に「壁紙を今日のおすすめに一括入れ替えするショートカットを追加して」と頼んで生成された Swift を眺めていて、少し背筋が冷えました。生成された PerformIntent は、確認も挟まずにユーザーの保存済みコレクションを丸ごと差し替える実装だったのです。

自分が手で叩くぶんには問題ありません。困るのは、この Intent が Siri やアシスタントから、私が画面を見ていない状態で音声一つで発火し得るという点です。エージェントが書いたコードは動きます。動くからこそ、副作用の重さに無頓着なまま「音声で叩ける操作」になってしまう。ここではその落とし穴を、副作用による分類と確認ゲートで塞ぐ設計をご紹介します。

自分で叩く Intent と、アシスタントに叩かせる Intent は別物です

App Intents(iOS 16 以降)は Swift のプロトコルに準拠するだけで、Siri・ショートカット・Spotlight・そして新しいアシスタント機能から呼び出せるようになります。実装のハードルが下がったぶん、見落とされがちなのが「誰が、どんな文脈で起動するか」です。

ショートカットアプリで自分がタップして起動する場合、ユーザーは何が起きるか分かっています。ところが音声やアシスタント経由の起動では、パラメータの解決も実行も、人間が結果を見る前に完了してしまいます。perform()return .result() を返した時点で操作は済んでいます。取り消しの猶予はありません。

私自身、2014年から個人開発で壁紙・癒し系のアプリを運営していますが、ユーザーの「保存済みコレクション」はアプリ内で最も繊細なデータです。ここを無確認で書き換える Intent は、たとえエージェントが正しくコンパイルの通るコードを書いたとしても、そのまま出してはいけないものでした。

問題は Antigravity が悪いコードを書いたことではありません。「音声で叩ける」という文脈情報が、コード生成のプロンプトに含まれていなかったことです。だから生成側を責める前に、受け取る側でゲートを機械的に挟む仕組みが要ります。

まず副作用で3つに分類する

すべての Intent に確認ダイアログを出すのは、体験を損ないます。「今日の壁紙は何?」と聞くたびに確認を求められては使い物になりません。判断の軸は機能名ではなく、副作用の取り消し可能性に置きます。

分類定義確認アシスタント起動
読み取り専用状態を変えない。何度呼んでも同じ今日のおすすめ表示、お気に入り件数不要直接実行可
取り消し可能状態を変えるが、元に戻せる操作がある1枚お気に入り追加、テーマ切替原則不要(Undo 提示)直接実行可
不可逆元に戻せない、または広範囲に及ぶコレクション一括差し替え、全削除、購入必須確認後のみ/アプリに引き渡し

この3分類を型で表現しておくと、後の静的チェックが楽になります。Intent 自身に「自分はどの副作用か」を宣言させます。

enum SideEffect {
    case readOnly          // 状態を変えない
    case reversible        // 取り消し可能
    case irreversible      // 不可逆・広範囲
}
 
/// すべての App Intent にこの宣言を強制する
protocol ClassifiedIntent: AppIntent {
    static var sideEffect: SideEffect { get }
}

ClassifiedIntent に準拠していない Intent を後述のスクリプトで検出できるようにしておくと、「分類し忘れた Intent」がそのまま出荷される事故を防げます。分類は設計時の思考を強制する装置でもあります。エージェントに Intent を書かせるときも、このプロトコル準拠を要件に含めておけば、生成物が自然と副作用を意識した形になります。

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

この記事の続きを読む

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

この記事で得られること
App Intent を「読み取り専用/取り消し可能/不可逆」の3副作用で分類し、確認ダイアログの要否を機械的に決める判断表
requestConfirmation と openAppWhenRun を組み合わせ、音声・アシスタント起動でも破壊的操作を無確認で走らせない実装パターン
エージェントが生成した Intent に確認ゲートの欠落がないかを push 前に検出する、依存ゼロの静的チェックスクリプト
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

アプリ開発2026-04-20
Antigravity で iOS の App Intents を実装する: Siri・ショートカット連携を最速で構築する方法
Antigravity を使って iOS アプリに App Intents を実装する実践ガイド。Siri とショートカットアプリへの連携手順を、Antigravity が生成するコードの落とし穴と合わせて解説します。
アプリ開発2026-06-15
新 iPhone が出るたびに三項演算子を増やすのをやめる — 解像度分岐をテーブル駆動に寄せた設計
iPhone Air・17 Pro など新解像度が増えるたびに、画面サイズ判定の三項演算子を29箇所も書き足していました。端末ではなくプロファイルで考えるテーブル駆動の設計に寄せ直し、次の端末追加を1行で終わらせるまでの具体的な手順を、壁紙アプリの実装コードとともにまとめます。
アプリ開発2026-06-12
10年前の SKPaymentQueue を StoreKit 2 へ — 壁紙アプリ4本の課金コードを Antigravity と移し替えた記録
SKPaymentQueue 依存の課金コードを StoreKit 2 の Transaction.currentEntitlements へ移行した実例です。壁紙アプリ4本での手順、Antigravity エージェントへの任せ方、実機でつまずいた点を記録しています。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →