Low-severity correctness follow-ups from the M1-S2 (#186) review — non-blocking, deferred.
F2 — recurrence uses occurrence-START windowing, not interval-overlap.expand_occurrences keeps occurrences whose START is in [start_window,end_window], while list_calendar_events (non-recurring path) uses interval-overlap (an event starting before the window but still ongoing is returned, db.rs:944-947). So a recurring occurrence that starts just before start_window but whose duration extends into the window is dropped, whereas an equivalent non-recurring event is returned. #186's Goal says 'instances that overlap that window.' Fix: compute occurrence end = start + (master.end - master.start) and use overlap semantics; add a straddle-start test.
F3 — the two layers use different 'is-recurring' predicates.list_recurring_calendar_events uses SQL rrule IS NOT NULL AND rrule != ''; the passthrough keeps rrule.is_none(). Not exact inverses: an event with rrule = Some("") is dropped from BOTH sets (silently); Some(" ") is classed recurring by SQL but the engine early-returns the raw clone. Unify: trim consistently and treat empty-after-trim as non-recurring in both places.
Both are narrow edges (short events/wide windows; malformed CalDAV RRULE). Fold into the next calendar touch.
Low-severity correctness follow-ups from the M1-S2 (#186) review — non-blocking, deferred.
**F2 — recurrence uses occurrence-START windowing, not interval-overlap.** `expand_occurrences` keeps occurrences whose START is in `[start_window,end_window]`, while `list_calendar_events` (non-recurring path) uses interval-**overlap** (an event starting before the window but still ongoing is returned, db.rs:944-947). So a recurring occurrence that starts just before `start_window` but whose duration extends into the window is dropped, whereas an equivalent non-recurring event is returned. #186's Goal says 'instances that overlap that window.' Fix: compute occurrence end = start + (master.end - master.start) and use overlap semantics; add a straddle-start test.
**F3 — the two layers use different 'is-recurring' predicates.** `list_recurring_calendar_events` uses SQL `rrule IS NOT NULL AND rrule != ''`; the passthrough keeps `rrule.is_none()`. Not exact inverses: an event with `rrule = Some("")` is dropped from BOTH sets (silently); `Some(" ")` is classed recurring by SQL but the engine early-returns the raw clone. Unify: trim consistently and treat empty-after-trim as non-recurring in both places.
Both are narrow edges (short events/wide windows; malformed CalDAV RRULE). Fold into the next calendar touch.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Low-severity correctness follow-ups from the M1-S2 (#186) review — non-blocking, deferred.
F2 — recurrence uses occurrence-START windowing, not interval-overlap.
expand_occurrenceskeeps occurrences whose START is in[start_window,end_window], whilelist_calendar_events(non-recurring path) uses interval-overlap (an event starting before the window but still ongoing is returned, db.rs:944-947). So a recurring occurrence that starts just beforestart_windowbut whose duration extends into the window is dropped, whereas an equivalent non-recurring event is returned. #186's Goal says 'instances that overlap that window.' Fix: compute occurrence end = start + (master.end - master.start) and use overlap semantics; add a straddle-start test.F3 — the two layers use different 'is-recurring' predicates.
list_recurring_calendar_eventsuses SQLrrule IS NOT NULL AND rrule != ''; the passthrough keepsrrule.is_none(). Not exact inverses: an event withrrule = Some("")is dropped from BOTH sets (silently);Some(" ")is classed recurring by SQL but the engine early-returns the raw clone. Unify: trim consistently and treat empty-after-trim as non-recurring in both places.Both are narrow edges (short events/wide windows; malformed CalDAV RRULE). Fold into the next calendar touch.