Context
PR #667 (board metrics dashboard).
Issues
- All cards loaded into memory regardless of date range. `GetByBoardIdAsync` loads every card, then filters in-memory. For boards with 10,000+ cards this is O(n) memory per request.
- `Math.max(...spread)` stack overflow risk in MetricsView.vue if throughput array exceeds ~65k elements (unlikely for daily granularity but worth fixing).
- Blocked duration still uses `UpdatedAt` as proxy — needs separate audit tracking for block events.
Proposed Fix
- Add repository methods that filter by column and date range at SQL level
- Replace `Math.max(...spread)` with reduce-based max
- Track block/unblock in audit log for accurate blocked duration
Parent
#77
Context
PR #667 (board metrics dashboard).
Issues
Proposed Fix
Parent
#77