Their exporter writes the last day an all-day event occupies as DTEND,
where RFC 5545 means the day after. Read literally every all-day event
was a day short and single-day ones — birthdays, memorials, name days —
came out zero length, which the provider expands into no instances at
all, so they never appeared. IcsQuirks sniffs the producer and shifts
the end; independently, an all-day event may no longer end at or before
its start and an all-day DURATION is floored at P1D.
Fossify also emits a bare ";BYDAY=" for weekly events with no weekday
mask. EventRecurrence.parse throws on that, out of insert, and nothing
caught it — one such row failed the entire file. sanitizeRrule now drops
empty and malformed parts, and importEvents isolates each event, counting
rejects into IcsImportSummary.failed instead of unwinding the batch.
Rest of the dialect: VTODO imports as events (was dropped silently),
CATEGORIES stands in for the X-WR-CALNAME they never write, bare EXDATE
day codes resolve against a timed series' own time of day, and their
positive VALARM trigger is read as "on the day" so all-day reminders fire
at the hour the setting names rather than at UTC midnight.
Colours come across too: X-FOSSIFY-EVENT-COLOR / COLOR / the category
colour as fallback, plus the X-SMT-* legacy spellings, snapped in Oklab
to the nearest key a palette account publishes since those reject a raw
EVENT_COLOR.
Closes#225