Archived
mergeIntoCache() unconditionally evicted all cached events in the fetched range, so a transient sync failure (expired CalDAV credentials, an HA/Google token-refresh failure) wiped the affected calendar until the next clean fetch. Home Assistant was the most visible victim: a token failure aborts the whole account fetch and the error arrives without a calendar_id. Now sync errors are split into per-calendar keys (error carries a calendar_id) and whole sources (account-level error without one). mergeIntoCache() keeps matching cached events, and only extends the cached range on a fully clean fetch so failed calendars are retried on the next load. Mirrors the iOS fix. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>