Replace navigation-based team→games flow with expandable Sport→Team→Date hierarchy. Games now grouped by date under each team with inline selection. Also fixed game loading to always fetch 90-day browsing window. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
160 lines
7.5 KiB
Markdown
160 lines
7.5 KiB
Markdown
# PROJECT STATE — CANONICAL
|
|
|
|
⚠️ This file is the single source of truth.
|
|
⚠️ Sections marked LOCKED may not be modified unless the user explicitly says "unlock".
|
|
⚠️ Claude must read this file before doing any work.
|
|
|
|
---
|
|
|
|
## Goal (LOCKED)
|
|
|
|
Build a functional iOS sports trip planning app that helps users plan multi-stop road trips to attend games across MLB, NBA, NHL, NFL, MLS, WNBA, and NWSL. The app creates optimized routes with 3 planning modes: by dates, by must-see games, or by start/end cities. Ongoing development with no fixed completion milestone.
|
|
|
|
## Non-Negotiable Constraints (LOCKED)
|
|
|
|
- No re-evaluation of prior decisions
|
|
- No alternative architectures unless explicitly requested
|
|
- No refactors outside the active task
|
|
- No scope expansion
|
|
- iOS 26 minimum target (do not support older iOS versions)
|
|
- SwiftData + CloudKit + offline-first architecture is locked
|
|
- Three-layer architecture (Presentation/Domain/Data) is locked
|
|
- Python pipeline for data scraping remains (even though it needs rewrite)
|
|
|
|
## Architecture Decisions (LOCKED)
|
|
|
|
- **Data flow**: Python scrape → canonicalize → CloudKit → SwiftData → AppDataProvider.shared (single source of truth)
|
|
- **Trip planning**: 3 scenario modes (A: by dates, B: must-see games, C: start/end cities) using GameDAGRouter with beam search
|
|
- **Offline-first**: Bundled JSON bootstrap → SwiftData → background CloudKit sync
|
|
- **Test framework**: Swift Testing (@Test/@Suite syntax, not XCTest)
|
|
- **Sports supported**: 7 leagues (MLB, NBA, NHL, NFL, MLS, WNBA, NWSL), 148 stadiums
|
|
- **Export**: PDF itinerary generation with maps, photos, POIs
|
|
|
|
## Current Phase
|
|
|
|
**No active phase** — Previous phase-based workflow (.planning/) was removed as failed organization system. Ignore all git commit references to "Phase 8", "Phase 9", "v1.1 milestone" etc.
|
|
|
|
## Active Tasks
|
|
|
|
- [x] Fix "By Games" Mode Game Selection
|
|
- [ ] Group Schedule View Games by Sport
|
|
- [ ] Remove Buffer Days from Trip Planner
|
|
|
|
## Completed Tasks
|
|
|
|
**Core Features (Working):**
|
|
- [x] Trip planning engine with 3 scenario modes (A/B/C)
|
|
- [x] GameDAGRouter with beam search optimization
|
|
- [x] Offline-first data architecture (bundled JSON → SwiftData → CloudKit)
|
|
- [x] AppDataProvider as single source of truth
|
|
- [x] Stadium progress tracking with photo import
|
|
- [x] Achievement system
|
|
- [x] PDF trip export with maps and POIs
|
|
- [x] UI: Home, Trip Creation/Detail, Schedule, Progress, Settings views
|
|
- [x] Python data pipeline (scraping, canonicalization, CloudKit upload) — functional but needs rewrite
|
|
- [x] 7 sport modules with multi-source fallback architecture
|
|
|
|
**Recent Work (from git history, prior to .planning/ removal):**
|
|
- [x] GameDAGRouter edge case tests
|
|
- [x] Performance optimization for large datasets (10-17x speedup)
|
|
- [x] Scenario A timezone and conflict tests
|
|
- [x] Scenario B filler conflict tests
|
|
- [x] Scenario C corridor efficiency and anti-backtracking tests
|
|
|
|
## Open Questions (User-Owned)
|
|
|
|
- Data quality: User is "unsure" if the 148 stadiums across 7 sports are accurate and complete
|
|
- CloudKit sync: "As far as I know yes" — not 100% certain sync is working correctly
|
|
- Test implementation completeness: Tests exist but are broken — unclear if implementations they test are actually complete
|
|
- When to rewrite Python pipeline: Acknowledged as needed but not scheduled
|
|
|
|
## Known Issues
|
|
|
|
1. **Test suite broken** — Tests do not run in parallel OR serial execution. Files and tests need complete revisit. (NOT BLOCKING: app is functional)
|
|
2. **Data scraping broken** — Python pipeline "messed up" data, data directories (`data/canonical/`, `data/games/`) emptied. CloudKit still has data, so app functions.
|
|
3. **5 flaky tests** — Fail in parallel but pass individually (Swift Testing + simulator state pollution). Ignoring for now.
|
|
4. **Python pipeline out of control** — Grown unwieldy, needs complete rewrite from scratch (future task).
|
|
|
|
## Deferred Work
|
|
|
|
All items in TO-DOS.md (16 items) are deferred — will become tasks in future phases when prioritized. See TO-DOS.md for full list.
|
|
|
|
**High-level categories:**
|
|
- In-app purchases (StoreKit, receipt validation)
|
|
- UI/UX improvements (redesign, theme fixes, region picker map)
|
|
- Testing gaps (trip filtering, repeat cities, must-stops, driving limits)
|
|
- Schedule improvements (UTC→local timezone, group by sport, show all games)
|
|
- Buffer days removal
|
|
|
|
**Feature flags (disabled, future work):**
|
|
- EV charging (`FeatureFlags.enableEVCharging = false`)
|
|
- Foundation Models / AI descriptions (commented out in RouteDescriptionGenerator)
|
|
|
|
## What Exists
|
|
|
|
**iOS App (SportsTime/):**
|
|
- Functional trip planning: 3 scenario modes, can create and save trips
|
|
- GameDAGRouter: Graph routing with beam search, directional filtering, performance-optimized
|
|
- Data layer: SwiftData models (SavedTrip, StadiumVisit, CanonicalStadium, CanonicalTeam, CanonicalGame)
|
|
- Services: CloudKitService, CanonicalSyncService, BootstrapService, LocationService, AchievementEngine
|
|
- UI: 5 main views (Home, Trip, Schedule, Progress, Settings), fully SwiftUI with @Observable ViewModels
|
|
- Export: PDF generator with map snapshots, remote image caching, POI search
|
|
- Progress tracking: Stadium visits, photos, achievements, progress map
|
|
- ~27,500 lines of Swift code
|
|
|
|
**Python Pipeline (Scripts/):**
|
|
- 7 sport scrapers (mlb, nba, nhl, nfl, mls, wnba, nwsl)
|
|
- Canonicalization pipeline (stadiums, teams, games with alias resolution)
|
|
- CloudKit import (full CRUD with diff reporting)
|
|
- Validation tools (health scores, completeness metrics)
|
|
- ~12,000 lines of Python code
|
|
- Status: Functional but "out of control", needs rewrite
|
|
|
|
**Tests:**
|
|
- 6 test files, ~7,000 lines of Swift Testing code
|
|
- Coverage: GameDAGRouter, ScenarioA/B/C planners, TravelEstimator
|
|
- Status: BROKEN (don't run in parallel or serial)
|
|
|
|
**Documentation:**
|
|
- CLAUDE.md: Comprehensive iOS app docs, build commands, architecture
|
|
- ARCHITECTURE.md: Original design document
|
|
- docs/: Market research, stadium progress spec, WNBA/MLS/NWSL implementation guides, data scraping architecture
|
|
- Scripts/: README, DATA_SOURCES, CLOUDKIT_SETUP
|
|
|
|
**Data:**
|
|
- Bundled JSON in `SportsTime/Resources/` (games_canonical.json, stadiums_canonical.json, teams_canonical.json, etc.)
|
|
- CloudKit container: `iCloud.com.sportstime.app` (contains current schedule data)
|
|
- Local data directories (`data/`) emptied after pipeline issues
|
|
|
|
## What Is Missing
|
|
|
|
**Broken/Incomplete:**
|
|
- Test suite execution (doesn't run properly)
|
|
- Python pipeline stable/maintainable implementation (current version works but needs rewrite)
|
|
- Data quality confidence (user unsure if 148 stadiums are accurate)
|
|
|
|
**Future Features (from TO-DOS.md):**
|
|
- In-app purchases / subscription system
|
|
- UI redesign
|
|
- Trip filtering
|
|
- Repeat cities option testing
|
|
- Must-stops (non-game POIs) testing
|
|
- Full test coverage for constraints (driving limits, etc.)
|
|
- Schedule improvements (timezone conversion, grouping by sport)
|
|
- Interactive region picker map
|
|
|
|
**Future Enhancements (from docs/MARKET_RESEARCH.md):**
|
|
- AI trip assistant (natural language planning)
|
|
- Group trip coordination
|
|
- Ticket integration
|
|
- Fan community features
|
|
|
|
## Checkpoints (APPEND-ONLY)
|
|
|
|
### Checkpoint 2026-01-10 16:30
|
|
- What exists: Functional iOS app with trip planning (3 modes), stadium tracking, PDF export. Python pipeline functional. CloudKit contains current data.
|
|
- What is missing: Working test suite (broken), stable Python pipeline (needs rewrite), data quality validation
|
|
- Known issues: Tests don't run (parallel or serial), data scraping "messed up" data (CloudKit still OK), flaky tests
|
|
- Next step: Fix broken test suite as first active task
|
|
|