On iOS, private browsing, storage pressure, an invalid worker response, or a non-secure context can make registration unavailable or unstable. A browser may expose the API and still reject the specific registration.
Chat should not depend on that success. The registration helper checks support, catches failures, logs `sw_register_fail`, and allows ordinary page operation to continue.
What was actually going wrong
Feature detection stopped at checking whether `serviceWorker` existed on `navigator`.
What I tried
- Retrying registration on every interaction
- Blocking startup until a controller appeared
- Treating every iOS browser as unsupported in advance
Support, registration, readiness, and control are tracked as separate states with bounded waiting and graceful fallback.
Why it worked
Partial platform support is represented accurately instead of collapsed into a boolean.
Web capability presence is not the same as successful capability use.
Where EACI uses this today
Main remains usable when iOS cannot install or activate its service worker.
This journal covers real engineering on EACI Companion / The Veil. Companions include Caelum, Chad, Natalia, Atreus, Luna, Roxy, and Cael. Journal articles stay family-safe in content. See Privacy and Ethics.