Phase 1 - Design System: DesignSystem.swift (typography, colors, spacing
constants) and DataPanel.swift (reusable panel container with 3 densities
and optional team accent bar).
Phase 2 - Dashboard Density: LiveSituationBar (compact strip of all live
games with scores/innings/outs), MiniLinescoreView (R-H-E footer for game
cards), DiamondView (visual baseball diamond with runners and count).
Dashboard shows live situation bar when games are active. Game cards now
display mini linescore for live/final games.
Phase 3 - Game Center Intelligence: WinProbabilityChartView (full-game
line chart using Swift Charts with area fills), PitchArsenalView (pitch
type distribution with velocity bars). GameCenterViewModel now stores
full WP history array instead of just latest values.
Phase 4 - Feed Tab: MLBWebDataService (fetches league leaders from Stats
API, news headlines, transactions), FeedViewModel, FeedView with
reverse-chronological feed items. FeedItemView with colored edge bars
by category. Added 5th "Feed" tab to both tvOS and iOS.
Phase 5 - Intel Tab: LeaderboardView (top-5 stat cards with headshots),
integrated into LeagueCenterView. Renamed tabs: Games->Today,
League->Intel. LeagueCenterViewModel now fetches league leaders.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Memory: clean observers even during PiP, nil player on tile disappear,
track/cancel Werkout monitor tasks, add highlight player cleanup.
Data: add scenePhase-triggered reload on day change, unconditional
10-minute full schedule refresh, keep fast 60s score refresh for live games.
Audio: set mute state before playback starts, use consistent .moviePlayback
mode, add audio session interruption recovery handler.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- README.md with build/architecture overview
- Game Center screen with at-bat timeline, pitch sequence, spray chart,
and strike zone component views
- VideoShuffle service: per-model bucketed random selection with
no-back-to-back guarantee; replaces flat shuffle-bag approach
- Refresh JWT token for authenticated NSFW feed; add josie-hamming-2
and dani-speegle-2 to the user list
- MultiStreamView audio focus: remove redundant isMuted writes during
startStream and playNextWerkoutClip so audio stops ducking during
clip transitions; gate AVAudioSession.setCategory(.playback) behind
a one-shot flag
- GamesViewModel.attachPlayer: skip mute recalculation when the same
player is re-attached (prevents toggle flicker on item replace)
- mlbTVOSTests target wired through project.yml with
GENERATE_INFOPLIST_FILE; VideoShuffleTests covers groupByModel,
pickRandomFromBuckets, real-distribution no-back-to-back invariant,
and uniform model distribution over 6000 picks
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>