"""Push backends: FCM (primary) + ntfy (fallback). ``PushBackend`` interface with two implementations: - ``FcmBackend``: FCM HTTP v1 via ``httpx`` + a Firebase service account (``ANDROID_FCM_SERVICE_ACCOUNT``), or a legacy server key (``ANDROID_FCM_SERVER_KEY``). - ``NtfyBackend``: reuses hermes ntfy publish (``NTFY_TOPIC`` / ``NTFY_SERVER_URL``). Selected by ``ANDROID_PUSH_BACKEND`` (``fcm`` default, ``ntfy`` fallback). Fired when a frame has no live subscriber; data payload drives a silent sync on the device. Milestone M5. """