Today tab: Removed LiveSituationBar, restored the full Live game shelf
below the featured Astros card where it belongs.
Feed tab: Changed from two grouped shelves (condensed / highlights) to a
single horizontal scroll with ALL highlights ordered by timestamp (most
recent first). Added condensed game badge overlay on thumbnails. Added
date field to Highlight model for time-based ordering.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Feed tab: Replaced news/transaction feed with league-wide highlights and
condensed game replays. FeedViewModel now fetches highlights from all
games concurrently, splits into condensed games vs individual highlights.
Cards show team color thumbnails with play button overlay.
Today tab: Removed duplicate Live games shelf — LiveSituationBar already
shows all live games at the top, so the shelf was redundant.
Intel tab: Removed schedule section (already on Today tab). Updated
header description and stat pills. Added division hydration to standings
API call so division names display correctly instead of "Division".
Focus: Added .platformFocusable() to standings cards and leaderboard
cards so tvOS remote can scroll horizontally through them.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
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>
SingleStream: pass preserveServerResolutionWhenBest=false so "best"
always reaches the server for a full multi-variant manifest. Increase
buffer to 8s and enable automaticallyWaitsToMinimizeStalling so AVPlayer
can measure bandwidth and select higher variants. Add quality monitor
that nudges AVPlayer if observed bandwidth far exceeds indicated bitrate.
MultiStream: remove broken URL-param resolution detection that falsely
skipped upgrades, log actual indicatedBitrate instead. Extend upgrade
check windows from [2,4,7]s to [2,4,7,15,30]s for slow-to-stabilize
streams.
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>
- Remove cache expiry on video feed (fetch once, keep for session)
- Add retry logic (3 attempts with backoff) for autoplay resolution
- Replace random video selection with shuffle-bag (no repeats until all played)
- Reload games every time DashboardView appears
- Cache standings per day to avoid redundant fetches
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>