- Event-driven background sync, replacing the hourly launchd StartInterval
poll (only fired if the Mac happened to be awake at that instant, and got
throttled/coalesced by macOS). Once saved routes exist: registers as a
login item (SMAppService.mainApp), removes any old launchd schedule, and
reacts to EKEventStoreChanged (debounced ~3s), NSWorkspace.didWakeNotification,
plus a 30-min fallback timer as a safety net. Auto-sync always writes,
matching what the old scheduled runs did.
- This lives in BusyMirrorAppController (app-lifetime), not ContentView —
ContentView's own EKEventStoreChanged observer is torn down when the main
window closes, which would make auto-sync a no-op exactly when it needs to
keep working (window closed, menu-bar-only). Confirmed via MenuBarSupport's
existing "Sync Now" handler, which already has to reopen the window before
it can run anything.
All 47 unit tests pass.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>