Corby-Tuech argues that both Apple and Google have quietly inserted ML and policy layers between APNs/FCM payloads and the lock screen, meaning successful delivery no longer guarantees visibility. He documents how iOS Notification Summaries, Focus modes, Priority Notifications, and Android's Adaptive Notifications can demote, batch, rephrase, or hide notifications the developer successfully delivered.
The editorial extends Corby-Tuech's argument by noting that two apps with identical APNs delivery success can have wildly different lock-screen visibility depending on how the user's swipes, dismissals, and Focus configurations have trained the local ranker. The loss function the OS optimizes for is essentially 'does the user keep notifications enabled at all,' which makes traditional delivery and open-rate measurement misleading.
Cites the BBC complaint and Apple's early-2025 pause of news-app summaries as evidence that the summarization layer has produced results embarrassing enough to force Apple's hand. The implication is that developers now bear reputational risk for text they never authored.
Frames Android's stack — mandatory notification channels since Android 8, Adaptive Notifications ML ranking, runtime permission gating in Android 13+, and Android 15's Notification Cooldown that literally lowers ping volume — as the more mature gatekeeping system. iOS's recent additions (Summaries, Priority Notifications, Intelligent Breakthrough) represent Apple converging toward the same intermediation model.
Jacques Corby-Tuech's piece walks through a quiet but consequential shift: the push notification contract you wrote against three years ago no longer exists. Both Apple and Google have, over the last several OS releases, inserted progressively heavier machine-learning and policy layers between your APNs/FCM payload and the user's lock screen. The TL;DR — your `aps.alert.title` is now a suggestion, not a guarantee.
On iOS, the visible stack is: Notification Summaries (Apple Intelligence), Focus modes with Intelligent Breakthrough, the Scheduled Summary feature, Priority Notifications (iOS 18+), and the older `interruption-level` API (`passive`, `active`, `time-sensitive`, `critical`). Each of these can silently demote, batch, rephrase, or completely hide a notification you successfully delivered to the device. Apple Intelligence's summarization layer has been re-writing notification text since iOS 18.1, occasionally with results embarrassing enough that Apple paused news-app summaries in early 2025 after the BBC complaint.
On Android, the stack is older and arguably more aggressive. Notification channels (mandatory since Android 8.0 / API 26) force you to declare categories the user can mute independently. Adaptive Notifications uses on-device ML to rank by predicted relevance. Android 13+ requires runtime permission for notifications at all. And Android 15's Notification Cooldown will literally lower the volume of repeated pings from the same app.
The instinct for most teams shipping push is to measure delivery rate, open rate, and conversion. Those metrics are now downstream of a black-box ranking model whose loss function is 'does this user keep notifications enabled for this app at all.' Two apps with identical APNs delivery success can have wildly different lock-screen visibility depending on how the user's behavioral signal — swipes, dismissals, Focus configurations — has trained the local ranker.
This breaks a lot of received wisdom. The "send a re-engagement push to dormant users" play, which every growth deck from 2019 to 2023 ran, is now actively counterproductive: a dismissed notification is a negative training example for everything you send next. Apple's documentation for `interruption-level` is explicit that abusing `time-sensitive` to bypass Focus modes is a policy violation, and the OS will downgrade apps that lie. Google's adaptive ranking does the same implicitly — channels you spam get demoted, then muted, then the whole app's permission gets revoked at the next OS-level nudge.
The community reaction on HN was telling. The top comment chains weren't "Apple bad" or "Google bad" — they were product engineers comparing notes on which `interruption-level` values still work, which Focus mode bypasses are reliable, and how to A/B test when the OS itself is part of the funnel. One commenter, a former growth eng at a top-10 finance app, noted their team had stopped measuring delivery rate entirely in favor of a 'lock-screen visibility' metric inferred from open latency. That's a real shift: when the user opens a notification within 30 seconds, you can be fairly confident it surfaced immediately; when opens happen in clustered bursts at 8am, you're seeing Scheduled Summaries.
There's also a developer-experience problem buried in here. The APNs and FCM payload specs haven't grown matching observability. You can ship a `time-sensitive` push, get a 200 OK from APNs, and have absolutely no way to know whether the user saw it on the lock screen, saw it in a summary, saw a rephrased version, or never saw it at all. The OS has rich telemetry; you don't get it. Apple's Notification Service Extensions can modify content before display, but they can't observe how the system finally rendered it.
First, audit your `interruption-level` and Android channel `IMPORTANCE` usage today. If everything you send is `time-sensitive` or `IMPORTANCE_HIGH`, you are already being demoted — you just don't know it yet. Treat these as a budget: maybe 10-15% of your pushes earn the high-priority slot. The rest should be `active` or `IMPORTANCE_DEFAULT`, with `passive`/`IMPORTANCE_LOW` for anything the user didn't explicitly subscribe to.
Second, instrument what you can. The honest metrics now are: notification-to-open latency distribution (bimodal = you're getting summarized), per-channel opt-out rate, OS-level permission revocation rate, and the ratio of `provisional` to full authorization on iOS. The new `UNNotificationCategory` actions also give you a cleaner signal — if users are tapping a custom action instead of the body, that's stronger engagement than a passive open.
Third, rebuild your content layer around the assumption that title and body will be summarized. Front-load the entity and the verb. "Acme Corp invoice #4471 paid by Globex" survives summarization; "Great news! You have a new payment." gets compressed into uselessness. For Android, use `setStyle(BigTextStyle)` and `setStyle(MessagingStyle)` so the adaptive ranker has more semantic structure to work with — the ranker explicitly weights structured notifications higher than plain text.
The direction of travel is unambiguous: the OS is becoming the editor of your notification surface, and it answers to the user, not to you. Expect the next 18 months to bring per-app notification quotas, mandatory categorization beyond channels, and possibly OS-level fines (in the form of permission revocation) for senders who exceed predicted-relevance thresholds. The teams that win here will treat push the way good email teams treated Gmail's tabs in 2013 — as a deliverability problem solved by sending less, tagging more honestly, and earning the high-priority slot one well-targeted notification at a time.
Top 10 dev stories every morning at 8am UTC. AI-curated. Retro terminal HTML email.