- aggregator.py: store union of (start_at, end_at) intervals, not sum of
active_hours — active_hours is Claude's estimate, not wall-clock time
- dashboard/monthly: compute from session intervals + overhead per day
instead of DailyStat.total_hours (which lacked overhead and used active_hours)
- dashboard/dow: same fix — query sessions directly, apply union + overhead
- Both monthly and dow now match the KPI summary card exactly
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>