Adds the full Django application layer on top of sportstime_parser:
- core: Sport, Team, Stadium, Game models with aliases and league structure
- scraper: orchestration engine, adapter, job management, Celery tasks
- cloudkit: CloudKit sync client, sync state tracking, sync jobs
- dashboard: staff dashboard for monitoring scrapers, sync, review queue
- notifications: email reports for scrape/sync results
- Docker setup for deployment (Dockerfile, docker-compose, entrypoint)
Game exports now use game_datetime_utc (ISO 8601 UTC) instead of
venue-local date+time strings, matching the canonical format used
by the iOS app.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Complete Python package for scraping, normalizing, and uploading
sports schedule data to CloudKit. Includes:
- Multi-source scrapers for NBA, MLB, NFL, NHL, MLS, WNBA, NWSL
- Canonical ID system for teams, stadiums, and games
- Fuzzy matching with manual alias support
- CloudKit uploader with batch operations and deduplication
- Comprehensive test suite with fixtures
- WNBA abbreviation aliases for improved team resolution
- Alias validation script to detect orphan references
All 5 phases of data remediation plan completed:
- Phase 1: Alias fixes (team/stadium alias additions)
- Phase 2: NHL stadium coordinate fixes
- Phase 3: Re-scrape validation
- Phase 4: iOS bundle update
- Phase 5: Code quality improvements (WNBA aliases)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Tasks completed: 3/3
- Task 1: Migrate to modern UITableViewDragDelegate/UITableViewDropDelegate
- Task 2: Implement lift animation with scale, shadow, and tilt
- Task 3: Add haptic feedback for grab and drop
All tasks completed in single commit due to code interdependency.
SUMMARY: .planning/phases/04-drag-interaction/04-01-SUMMARY.md
Phase 04: Drag Interaction
- 2 plans in 2 waves
- Plan 01: Migrate to modern drag-drop delegates, lift animation, haptics
- Plan 02: Themed insertion line, invalid zone feedback, snap-back animation
Ready for execution
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Phase 3: Visual Flattening
- Analyzed existing flatten implementation in ItineraryTableViewController
- Documented current bucket-based approach (beforeGames/afterGames)
- Recommended pure sortOrder-based sorting within each day
- Identified ItineraryFlattener extraction for testability
- Documented determinism test patterns
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Tasks completed: 3/3
- Verified requirements coverage (CONS-01 through CONS-04)
- Migrated 13 tests to Swift Testing (expanded to 22)
- Deleted old XCTest file
SUMMARY: .planning/phases/02-constraint-validation/02-01-SUMMARY.md
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Tasks completed: 3/3
- Add edge case tests (10 new tests)
- Create API documentation for Phase 4
- Run full test suite (22 constraint tests pass)
SUMMARY: .planning/phases/02-constraint-validation/02-02-SUMMARY.md
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Document public API for drag-drop integration:
- isValidPosition() for position validation
- validDayRange() for precomputing valid days
- barrierGames() for visual highlighting
- Integration patterns for ItineraryTableViewController
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Phase 2: Constraint Validation
- 2 plans in 1 wave (parallel)
- Both plans autonomous (no checkpoints)
Plan 02-01: Migrate 13 XCTest tests to Swift Testing
Plan 02-02: Add edge case tests and document constraint API
Note: ItineraryConstraints is already fully implemented.
This phase verifies and standardizes tests.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Phase 2: Constraint Validation
- Discovered ItineraryConstraints already implemented
- 17 XCTest tests cover all CONS-* requirements
- Integration with ItineraryTableViewController verified
- Main work: migrate tests to Swift Testing
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Phase 1 verified:
- 8/8 requirements satisfied (DATA-01 through DATA-05, PERS-01 through PERS-03)
- 34 tests passing (22 unit + 12 integration)
- SortOrderProvider with 6 methods for sortOrder calculation
- Trip extension with day derivation methods
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 01-01: Reframe must_haves.truths to user-observable behaviors
- 01-01: Remove unimplemented key_link (wiring happens in later phases)
- 01-02: Add test case for DATA-04 (custom items at any position)
- 01-02: Add must_haves.truths entry for custom item flexibility
- 01-02: Document LocalItineraryItem is standalone (no sibling models needed)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>