All checks were successful
CI / ci (pull_request) Successful in 6m21s
"Delete only this event" on a recurring series wrote a cancelled exception carrying just ORIGINAL_INSTANCE_TIME + STATUS_CANCELED. Without DTSTART + DURATION the provider clones the master *with its RRULE intact* and cancels the whole clone, so every other occurrence vanished, the target survived as a "cancelled" ghost, and re-deleting toggled the series back — exactly the reported corruption. Anchor the exception as a single instance (DTSTART + DURATION + zone + all-day, read from the series row) so the provider clears the inherited RRULE and cancels only that occurrence — the same discipline the edit path already documents (Codeberg #16). Also filter STATUS_CANCELED out of the instances grid query so the cancelled occurrence disappears instead of lingering as a tappable ghost (NULL status is kept — a normal event). Extracts the exception ContentValues into a pure buildOccurrenceCancelValues helper with JVM tests. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>