Major changes:
1. Sentinel approach for skill recency refresh
- Added 'recency-refresh' session status and SlotResult source field
- BKT skips pKnown updates for sentinel records (zero-weight)
- refreshSkillRecency() now inserts sentinel records instead of updating DB field
- Single source of truth: all lastPracticedAt comes from problem history
2. Skill progress chart (new component)
- 100% stacked area chart showing skill distribution over time
- Clickable legend cards for filtering by classification
- Adaptive time window presets (Recent, Last N, All)
- Synthetic "current" snapshot ensures chart matches legend staleness
3. Trend-aware encouragement messages
- Linear regression to detect improving/declining/stable trends
- Session timing analysis (gap detection, frequency patterns)
- Window-aware scope text ("over the past 2 weeks", "since Nov 15")
- Priority-based message selection (urgent issues first)
- Consistent "stale" terminology (not "rusty")
4. Dashboard improvements
- Virtualized session history list for performance
- Paginated session history API with cursor-based pagination
- BKT-computed lastPracticedAt used throughout (single source of truth)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>