# Codebase Concerns **Analysis Date:** 2026-01-09 ## Tech Debt **Foundation Models disabled:** - Issue: On-device AI route descriptions disabled due to simulator bug - File: `SportsTime/Core/Services/RouteDescriptionGenerator.swift:30` - Why: iOS 26.2 simulator crashes with Foundation Models - Impact: Route descriptions not generated; feature incomplete - Fix approach: Re-enable when Apple fixes the framework (tracked via TODO) **Large service files:** - Issue: Some service files exceed 500-800 lines - Files: `SportsTime/Core/Services/SuggestedTripsGenerator.swift` (794 lines) - Why: Accumulated functionality over time - Impact: Harder to navigate and test in isolation - Fix approach: Extract helper methods to focused utilities ## Known Bugs **No known bugs documented.** The codebase has comprehensive test coverage (180+ tests) and follows a regression test protocol for bug fixes. ## Security Considerations **No hardcoded secrets:** - CloudKit uses entitlements (no API keys in code) - Sports APIs are public (no authentication required) - No .env files or credential storage **CloudKit data access:** - Risk: Public database readable by any app user - Current mitigation: Only non-sensitive schedule data in public DB - Recommendations: User data correctly uses private database **Force unwrap usage:** - Risk: Potential crashes from force unwraps (`!`) - Current state: Limited to test fixtures and controlled scenarios - Recommendations: Continue avoiding force unwraps in production code ## Performance Bottlenecks **No significant bottlenecks detected.** - Route planning uses efficient DAG-based algorithms with beam search - Data loading is async and non-blocking - PDF export uses parallel asset prefetching (`PDFAssetPrefetcher.swift`) **Potential areas to monitor:** - Large game datasets (1000+ games) during planning - Map snapshot generation for long trips (10+ stops) ## Fragile Areas **GameDAGRouter complexity:** - File: `SportsTime/Planning/Engine/GameDAGRouter.swift` - Why fragile: Complex beam search with diversity pruning - Common failures: Edge cases in route diversity calculations - Safe modification: Comprehensive test coverage exists (180+ tests total) - Test coverage: Good - multiple scenario planner test suites **Canonical data sync:** - Files: `SportsTime/Core/Services/CanonicalSyncService.swift`, `DataProvider.swift` - Why fragile: Multiple data sources (bundled JSON, SwiftData, CloudKit) - Common failures: Data inconsistency if sync partially completes - Safe modification: Follow existing patterns, test offline scenarios - Test coverage: Limited - manual testing recommended ## Scaling Limits **CloudKit free tier:** - Current capacity: Standard CloudKit quotas - Limit: 10GB public database, rate limits on queries - Symptoms at limit: 429 errors, slow sync - Scaling path: Monitor usage; Apple provides generous free tier **In-memory data cache:** - Current capacity: All stadiums, teams loaded into memory (~few MB) - Limit: Not expected to hit limits with current data size - Symptoms at limit: Memory pressure on older devices - Scaling path: Implement lazy loading if data grows significantly ## Dependencies at Risk **NBA Stats API (unofficial):** - Risk: Unofficial API that may break without notice - File: `SportsTime/Core/Services/ScoreAPIProviders/NBAStatsProvider.swift` - Impact: NBA game scores unavailable if API changes - Migration plan: Multi-provider fallback system in `FreeScoreAPI.swift` **iOS 26+ requirement:** - Risk: Limits user base to newest iOS version - Impact: Users on older devices cannot use app - Migration plan: Monitor adoption; consider lowering deployment target later ## Missing Critical Features **None blocking current functionality.** Future phases documented in `docs/MARKET_RESEARCH.md`: - Phase 2: AI-powered natural language planning - Phase 3: Stadium bucket list with achievements (partially implemented) - Phase 4: Group trip coordination - Phase 5: Fan community features ## Test Coverage Gaps **CloudKit sync integration:** - What's not tested: Full CloudKit → SwiftData → memory refresh cycle - Risk: Sync issues not caught before production - Priority: Medium - Difficulty to test: Requires CloudKit test containers or mocks **PDF generation:** - What's not tested: PDFGenerator output (visual testing) - Risk: PDF layout issues not caught automatically - Priority: Low (manual QA sufficient) - Difficulty to test: Would need snapshot testing **UI tests:** - What's not tested: Limited UI test coverage - Risk: UI regressions - Priority: Low (app is relatively simple UI) - Difficulty to test: Standard Xcode UI testing --- *Concerns audit: 2026-01-09* *Update as issues are fixed or new ones discovered*