- Start Web UI before the blocking initial sync so the dashboard is
reachable during the (rate-limited, potentially multi-minute) first
sync; fold the immediate sync into startPeriodicSync's overlap guard
so it can never race a concurrent tick over the shared DB / MB client.
- Make MarkNotificationSent idempotent: INSERT OR IGNORE for same-second
PK collisions, and explicitly swallow FK violations when a release was
pruned by a concurrent re-sync. Prevents a single vanished/duplicate
release from aborting the digest mark-sent loop and re-sending.
- Do not abort NotifyOnce's mark-sent loop on a single failure; log and
continue so every release in the batch is marked.
- NULL-safe reads: COALESCE(type,''), COALESCE(release_date,'') in the
external_releases and unnotified readers to match the cache reader.
- Update/extend tests for the new idempotency and startup contracts.