{
  "format": "agent-article-v0",
  "article_id": "EA-228",
  "canonical_url": "/tools/ea-228-push-notification-api-agent",
  "page_type": "reference",
  "claim_ids": [],
  "evidence_ids": [
    "EVD-EA-228-URL-3ACC68895F3E",
    "EVD-EA-228-URL-E46D4CC93A09",
    "EVD-EA-228-URL-BE91BDFB2039",
    "EVD-EA-228-URL-3E4860C8E551",
    "EVD-EA-228-URL-2AA16940C9B8",
    "EVD-EA-228-URL-8160BCBB9A53",
    "EA-228-CURRENT-APPROVAL",
    "EA-228-CURRENT-BODY-READBACK"
  ],
  "unknown_ids": [
    "EA-228-UNKNOWN-01"
  ],
  "operational_object_ids": [],
  "provider": [],
  "models": [],
  "plans": [],
  "surfaces": [],
  "regions": [],
  "current_status": "CURRENT",
  "observation_status": "SPEC_ONLY",
  "freshness": "CURRENT",
  "last_verified": "2026-10-19",
  "supersedes": [],
  "superseded_by": [],
  "provenance": [
    "V8-EA228-FIRST-20261019-C1",
    "SRC-EA-228-URL-3ACC68895F3E",
    "SRC-EA-228-URL-E46D4CC93A09",
    "SRC-EA-228-URL-BE91BDFB2039",
    "SRC-EA-228-URL-3E4860C8E551",
    "SRC-EA-228-URL-2AA16940C9B8",
    "SRC-EA-228-URL-8160BCBB9A53",
    "BODY-SHA256:cbd6cdb7fa23b54826bd85d0bbdcb0ea645da32bcef18591f893041afde1369f"
  ],
  "article_sources": [
    {
      "id": "EVD-EA-228-URL-3ACC68895F3E",
      "evidence_class": "RESEARCH",
      "title": "Firebase Cloud Messaging, Message types:",
      "href": "https://firebase.google.com/docs/cloud-messaging/customize-messages/set-message-type",
      "supports": [],
      "limit": "元の監査済み資料に記載された参照先です。URLの復元は、資料の最新性や全主張の支持を新たに検証したことを意味しません。",
      "origin_class": "SOURCE_PACKET_REFERENCE",
      "source_or_experiment_ids": [
        "SRC-EA-228-URL-3ACC68895F3E"
      ],
      "supporting_locators": [
        "source / provenance",
        "- Firebase Cloud Messaging, Message types: https://firebase.google.com/docs/cloud-messaging/customize-messages/set-message-type"
      ],
      "scope": "source / provenance",
      "provenance_status": "SOURCE_PACKET_REFERENCE_PROJECTED"
    },
    {
      "id": "EVD-EA-228-URL-E46D4CC93A09",
      "evidence_class": "RESEARCH",
      "title": "Firebase Cloud Messaging, Collapsible messages:",
      "href": "https://firebase.google.com/docs/cloud-messaging/customize-messages/collapsible-message-types",
      "supports": [],
      "limit": "元の監査済み資料に記載された参照先です。URLの復元は、資料の最新性や全主張の支持を新たに検証したことを意味しません。",
      "origin_class": "SOURCE_PACKET_REFERENCE",
      "source_or_experiment_ids": [
        "SRC-EA-228-URL-E46D4CC93A09"
      ],
      "supporting_locators": [
        "source / provenance",
        "- Firebase Cloud Messaging, Collapsible messages: https://firebase.google.com/docs/cloud-messaging/customize-messages/collapsible-message-types"
      ],
      "scope": "source / provenance",
      "provenance_status": "SOURCE_PACKET_REFERENCE_PROJECTED"
    },
    {
      "id": "EVD-EA-228-URL-BE91BDFB2039",
      "evidence_class": "RESEARCH",
      "title": "Firebase Cloud Messaging, Android message priority:",
      "href": "https://firebase.google.com/docs/cloud-messaging/android-message-priority",
      "supports": [],
      "limit": "元の監査済み資料に記載された参照先です。URLの復元は、資料の最新性や全主張の支持を新たに検証したことを意味しません。",
      "origin_class": "SOURCE_PACKET_REFERENCE",
      "source_or_experiment_ids": [
        "SRC-EA-228-URL-BE91BDFB2039"
      ],
      "supporting_locators": [
        "source / provenance",
        "- Firebase Cloud Messaging, Android message priority: https://firebase.google.com/docs/cloud-messaging/android-message-priority"
      ],
      "scope": "source / provenance",
      "provenance_status": "SOURCE_PACKET_REFERENCE_PROJECTED"
    },
    {
      "id": "EVD-EA-228-URL-3E4860C8E551",
      "evidence_class": "RESEARCH",
      "title": "Firebase Cloud Messaging, Customize a message across platforms:",
      "href": "https://firebase.google.com/docs/cloud-messaging/customize-messages/cross-platform",
      "supports": [],
      "limit": "元の監査済み資料に記載された参照先です。URLの復元は、資料の最新性や全主張の支持を新たに検証したことを意味しません。",
      "origin_class": "SOURCE_PACKET_REFERENCE",
      "source_or_experiment_ids": [
        "SRC-EA-228-URL-3E4860C8E551"
      ],
      "supporting_locators": [
        "source / provenance",
        "- Firebase Cloud Messaging, Customize a message across platforms: https://firebase.google.com/docs/cloud-messaging/customize-messages/cross-platform"
      ],
      "scope": "source / provenance",
      "provenance_status": "SOURCE_PACKET_REFERENCE_PROJECTED"
    },
    {
      "id": "EVD-EA-228-URL-2AA16940C9B8",
      "evidence_class": "RESEARCH",
      "title": "Apple Developer, Sending notification requests to APNs:",
      "href": "https://developer.apple.com/documentation/usernotifications/sending-notification-requests-to-apns",
      "supports": [],
      "limit": "元の監査済み資料に記載された参照先です。URLの復元は、資料の最新性や全主張の支持を新たに検証したことを意味しません。",
      "origin_class": "SOURCE_PACKET_REFERENCE",
      "source_or_experiment_ids": [
        "SRC-EA-228-URL-2AA16940C9B8"
      ],
      "supporting_locators": [
        "source / provenance",
        "- Apple Developer, Sending notification requests to APNs: https://developer.apple.com/documentation/usernotifications/sending-notification-requests-to-apns"
      ],
      "scope": "source / provenance",
      "provenance_status": "SOURCE_PACKET_REFERENCE_PROJECTED"
    },
    {
      "id": "EVD-EA-228-URL-8160BCBB9A53",
      "evidence_class": "RESEARCH",
      "title": "Apple Developer, Troubleshooting push notifications:",
      "href": "https://developer.apple.com/documentation/usernotifications/troubleshooting-push-notifications",
      "supports": [],
      "limit": "元の監査済み資料に記載された参照先です。URLの復元は、資料の最新性や全主張の支持を新たに検証したことを意味しません。",
      "origin_class": "SOURCE_PACKET_REFERENCE",
      "source_or_experiment_ids": [
        "SRC-EA-228-URL-8160BCBB9A53"
      ],
      "supporting_locators": [
        "source / provenance",
        "- Apple Developer, Troubleshooting push notifications: https://developer.apple.com/documentation/usernotifications/troubleshooting-push-notifications"
      ],
      "scope": "source / provenance",
      "provenance_status": "SOURCE_PACKET_REFERENCE_PROJECTED"
    },
    {
      "id": "EA-228-CURRENT-APPROVAL",
      "evidence_class": "RESEARCH",
      "title": "現行本文の監査・revision対応",
      "supports": [
        "現行台帳のAUDIT_PASSと候補・revision・本文ハッシュの対応を確認しています。"
      ],
      "limit": "監査状態と来歴の記録です。外部根拠の最新性や本文の全主張を追加保証しません。",
      "origin_class": "AUDITED_CANONICAL_RESEARCH_PACKET",
      "source_or_experiment_ids": [
        "V8-EA228-FIRST-20261019-C1"
      ],
      "supporting_locators": [
        "1KqhJtiSb2S84rWmeYVwKcT_76dBwZ_B0ZZuAWQqH0rQ/EA_REVISION_LEDGER#ea_id=EA-228&revision_id=EA-228-FIRST-20261019&candidate_id=V8-EA228-FIRST-20261019-C1",
        "EA-228-FIRST-20261019"
      ],
      "provenance_status": "CURRENT_CANONICAL_APPROVAL_READBACK"
    },
    {
      "id": "EA-228-CURRENT-BODY-READBACK",
      "evidence_class": "IMPL",
      "title": "現行本文の収録照合",
      "supports": [
        "公開生成入力の本文SHA-256が、監査済み候補に結び付いたハッシュと一致しています。"
      ],
      "limit": "本文の同一性の検査です。外部システムの挙動や全主張の真偽を実証したものではありません。",
      "checked_at": "2026-10-19",
      "origin_class": "IMPLEMENTATION_READBACK",
      "source_or_experiment_ids": [
        "BODY-SHA256:cbd6cdb7fa23b54826bd85d0bbdcb0ea645da32bcef18591f893041afde1369f"
      ],
      "supporting_locators": [
        "content/staging/EA-228.md",
        "cbd6cdb7fa23b54826bd85d0bbdcb0ea645da32bcef18591f893041afde1369f",
        "EA-228-FIRST-20261019"
      ],
      "provenance_status": "CURRENT_APPROVED_BODY_HASH_MATCH"
    }
  ],
  "research_sections": [
    {
      "heading": "主要claim",
      "text": "AI/AgentからPush Notification APIを呼べることは、利用者への確実な通知、閲覧、業務完了を意味しません。送信要求の受付、push serviceでの処理、端末への配信、OSによる表示、利用者の閲覧・操作、業務側の状態更新を別イベントとして扱い、重要な業務ではpushを唯一の正本・唯一の承認経路・唯一の完了証跡にしません。\n\nFirebase Cloud Messaging（FCM）はnotification messageとdata messageを区別し、background時のnotification messageはSDKが表示を扱う一方、data messageはclient appが処理します。notification+dataの混在もforeground/backgroundで挙動が異なります。したがってAgentがpayloadを生成する場合、単に本文を作るのではなく、message type、app state、platform override、TTL、priority、collapse semanticsを契約として固定する必要があります。"
    },
    {
      "heading": "配信保証と順序の境界",
      "text": "FCMはメッセージ順序を保証しません。collapsible messageは未配信の古いメッセージを新しいものが置き換え得ます。Androidでは同時に保持できるcollapse key数にも制約があります。重要な状態遷移をpushの到着順に依存させず、通知は「正本を取りに行く契機」として扱い、clientはversion/event IDを使ってserver stateをreadbackします。\n\nAPNsもprovider requestをHTTP/2で受け付けますが、端末表示までのexactly-once保証として扱うべきではありません。Appleはdevelopmentとproduction endpointを分離しており、接続stream数を固定値と仮定しないよう求めています。connection terminationやerror responseを考慮し、request acceptanceとuser-visible deliveryを分離します。"
    },
    {
      "heading": "priority・background executionの誤解",
      "text": "FCMのAndroid high priorityは、時間依存かつuser-visibleな通知向けです。高優先度を指定しただけで即時実行が保証されるわけではなく、利用状況によってdeprioritizeまたはGoogle Play servicesによるproxy表示が起こり得ます。通知後に長いnetwork処理を前提にせず、追加同期はWorkManager等へ分離します。\n\nApple側でもsilent/background notificationは無制限の実行トリガではありません。Appleのtroubleshooting guidanceは短時間の過剰送信やsilent notificationのthrottling、power budgetの影響を挙げています。Agent orchestrationのjob schedulerとしてpushを利用し、未達時に無制限再送する設計は避けます。"
    },
    {
      "heading": "security・privacy",
      "text": "FCMはtransport encryptionを提供しますが、data payload自体をend-to-end encryptedとは扱いません。機微情報を通知本文やdataへ直接埋め込まず、必要ならopaque event IDを送り、認証済みclientがserverから権限付きで詳細を取得します。device/registration tokenはrouting credentialとして扱い、ログ・分析基盤・LLM promptへ無制限に露出させません。\n\nAgentには最小権限のsend capabilityを与え、対象tenant/app/topic/user segment、message class、priority、TTL、時間帯、rate、sensitive-content policyをpolicy layerで制限します。大量送信、全体topic、critical alert相当、marketing用途、法的通知等は別approval boundaryにします。"
    },
    {
      "heading": "failure envelope",
      "text": "- provider request timeout後の盲目的retryによる重複通知\n- token失効・誤token・誤topic・誤tenantによる誤配信または未達\n- notification/data messageの取り違え\n- foreground/background差による処理漏れ\n- TTL切れ、offline、OS制御、Doze、Focus/通知許可、battery policyによる遅延・非表示\n- collapseによる中間イベント消失、順序逆転\n- high priorityのdeprioritization/proxy化\n- silent push throttling\n- payloadへの機微情報混入\n- send responseを閲覧・承認・業務完了と誤認\n- retry storm、rate limit、通知疲労、spam判定"
    },
    {
      "heading": "control / implementation implication",
      "text": "1. Agent出力は直接provider APIへ渡さず、typed notification requestへ正規化します。recipient selector、message class、event ID、source state version、TTL、priority、collapse key、deep link、sensitivity、approval classを検証します。\n2. idempotency keyまたは業務event IDをserver側で保持し、ambiguous timeout時は送信履歴をreadbackしてから再送します。providerがend-to-end idempotencyを保証すると仮定しません。\n3. clientはpush payloadを正本にせず、event IDからauthoritative stateを再取得します。古いversionや重複eventを拒否できるようにします。\n4. delivery/open analyticsは補助観測です。provider受付、端末到達、表示、open、業務完了を別metricにします。\n5. kill switch、per-tenant rate limit、quiet hours、segment size cap、dry-run/test projectを用意します。production credentialとtest credentialを分離します。"
    },
    {
      "heading": "counterevidence / limitations",
      "text": "notification serviceやSDKにはdelivery metrics、priority、TTL、collapse、platform-specific overrideなど豊富な制御があります。しかし、これらは端末状態・OS policy・利用者設定を越えて「必ず即時に見える」保証へは変換できません。逆に、すべてのpushを低信頼として捨てる必要もありません。目的が再同期の促進や一般的なユーザー通知であれば有効ですが、業務正本と通知チャネルの責任を分離する必要があります。"
    },
    {
      "heading": "適用境界",
      "text": "本項はFCM/APNs等をAgentから利用する際のprovider-neutral運用設計です。Android/iOS/Webではpayload field、priority、TTL、permission、background execution、analyticsが異なります。critical alerts、communication notifications、location push等の特権・entitlementを要する機能は一般pushと同一視しません。tenant固有quota、契約、region、SDK version、OS version、app実装は個別確認が必要です。"
    },
    {
      "heading": "SAFE_WORDING",
      "text": "Push Notification APIの送信成功は、利用者への表示・閲覧・承認・業務完了の証明ではありません。Agentから通知を送る場合は、通知をauthoritative stateへの案内として設計し、recipient、event ID、TTL、priority、collapse、rate、sensitivityを制御します。重複・順序逆転・遅延・非表示・throttlingをfailure envelopeへ含め、重要な処理はserver側正本をreadbackして確定します。"
    },
    {
      "heading": "OPEN_UNKNOWN",
      "text": "対象アプリのOS/SDK version、FCM/APNs direct利用範囲、tenant quota、token lifecycle、topic管理、通知許可率、delivery/open計測、quiet-hours policy、critical/privileged notification entitlement、idempotency実装、retry policy、PII classification、incident時kill switch、法的通知要件は未確認です。"
    },
    {
      "heading": "source / provenance",
      "text": "- Firebase Cloud Messaging, Message types: https://firebase.google.com/docs/cloud-messaging/customize-messages/set-message-type (accessed 2026-10-19)\n- Firebase Cloud Messaging, Collapsible messages: https://firebase.google.com/docs/cloud-messaging/customize-messages/collapsible-message-types (accessed 2026-10-19)\n- Firebase Cloud Messaging, Android message priority: https://firebase.google.com/docs/cloud-messaging/android-message-priority (accessed 2026-10-19)\n- Firebase Cloud Messaging, Customize a message across platforms: https://firebase.google.com/docs/cloud-messaging/customize-messages/cross-platform (accessed 2026-10-19)\n- Apple Developer, Sending notification requests to APNs: https://developer.apple.com/documentation/usernotifications/sending-notification-requests-to-apns (accessed 2026-10-19)\n- Apple Developer, Troubleshooting push notifications: https://developer.apple.com/documentation/usernotifications/troubleshooting-push-notifications (accessed 2026-10-19)"
    }
  ],
  "human_url": "/tools/ea-228-push-notification-api-agent",
  "markdown_url": "/agent/article.md?path=%2Ftools%2Fea-228-push-notification-api-agent",
  "json_url": "/agent/article.json?path=%2Ftools%2Fea-228-push-notification-api-agent"
}