Correctness: - Recurring writes: move the series DTSTART by the *wall-clock* shift applied to the edited occurrence and re-resolve it in the event's zone, instead of by a millisecond delta. The old delta baked in whichever UTC offset applied on the edited occurrence's date, so pinning a recurring event to another zone — or editing an occurrence on the far side of a DST boundary from the series anchor — shifted the whole series by an hour. Also snaps the anchor to a UTC midnight when the event becomes all-day. - Detail card and edit form now resolve a pinned zone's abbreviation/offset at the *event's* instant, not at "now", so a July event no longer reads "CET · 10:00 AM" when opened in January. - Agenda: the zone used to label multi-day rows now travels on AgendaUiState.Success rather than a process-lifetime file-level constant, so labelling can't disagree with the grouping after a device time-zone change. - Week title: spell out the year when the week straddles New Year, via a new forceYear flag on formatCalendarTitle. Performance: - Build the ~600-entry zone catalogue off the main thread (produceState + Dispatchers.Default); resolve the device row's summary on its own so it still renders complete on the first frame. - Pre-normalize each TimeZoneOption's search keys at construction, turning ~2400 NFD normalizations per keystroke into plain prefix/substring checks. Hoist the combining-mark Regex out of the hot path. - Key the edit form's local-time line on the fields it reads instead of recomputing it on every keystroke. - Move LauncherNameManager's PackageManager binder calls off the main thread. Cleanup: - Drop a duplicate Public icon import and the unused event_edit_timezone_clear string. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>