Dashboard usability pass:
- Auto-refresh: poll today every 45s with a live "updated Xs ago" indicator
and toggle; auto-pauses on past dates.
- Table search, click-to-sort column headers, and clickable summary pills
that filter by on-time / late.
- View state (date, cutoff, controller, filters) persists to localStorage and
the URL for reloads, bookmarking, and sharing; adds a Today button.
- First-run onboarding CTA when no controllers exist, plus a header health
pill and per-controller last-event time driven by a new last_event_at column
(stamped on webhook ingest; auto-migrated on boot).
- Report pivot gains per-person on-time/late/absent totals and an All row;
CSV export now downloads via fetch/blob so failures surface as errors.
- New badge-in times modal (GET /api/badge-events) listing every badge-in for
a person on a day — across all identities for merged people.
Docs updated to cover all of the above.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>