apple/ios 1.1(3): hung-load recovery — watchdog + heartbeat + reload paths
Field reports of the iOS app sitting on the boot.mjs animation indefinitely with no recovery short of force-quit. Root cause was structural: no host-side detection of a stuck JS runtime, no failure path on WKNavigationDelegate, and the network monitor cancelled itself on the first satisfied path so mid-session drops were invisible.
- AppNetworkMonitor (long-lived) replaces the one-shot monitor; online↔offline transitions auto-reload.
- BootStatus 5s-poll watchdog flips `stalled = true` after 25s of no JS heartbeat; SwiftUI overlay surfaces a Reload button.
- WKNavigationDelegate wired so provisional/final nav failures populate `BootStatus.lastError` for the overlay.
- boot.mjs IIFE posts {type:"boot:heartbeat"|"boot:ready"} via webkit.messageHandlers.iOSApp every 1s during boot, every 8s after acHIDE_BOOT_LOG.
- Pull-to-refresh attached to the WebView's scroll view via UIRefreshControl.
- Scene-phase reload after >5min background (stale runtime / timed-out sockets).
- offline.html "Try again" button posts {type:"reload-online"} to force-load even if path monitor still reads offline (cell-handoff lag).
- Reload gating on Coordinator.lastLoadedKey so updateUIView only reloads on real URL/trigger changes, not every SwiftUI re-render.
Bump CFBundleVersion to 3 before archiving.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>