2b48509a3561e21e889edbd25086abf14f4c02c1
The real bug behind "Leona's Birthday, 5 days left" showing 0% filled: Mode B (recurring span: previous -> next occurrence) only ran for app-tracked events, while the upcoming-queue / picked-event paths still anchored from first-seen (so a yearly birthday started at 0%). - EventEntity now carries isRecurring/recurrenceLabel (populated from the shared task data) so the auto-select and picker paths know the rule. - resolveSpan() centralizes the window: recurring -> prev/next occurrence everywhere; one-off -> explicit start / tracking date / first-seen. - A yearly birthday 5 days away now reads ~98% (≈360/365 days elapsed). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Description
Personal productivity and fitness companion — iOS SwiftUI app
Languages
Swift
99.3%
HTML
0.4%
Shell
0.3%