Add canonical ID pipeline and fix UUID consistency for CloudKit sync

- Add local canonicalization pipeline (stadiums, teams, games) that generates
  deterministic canonical IDs before CloudKit upload
- Fix CanonicalSyncService to use deterministic UUIDs from canonical IDs
  instead of random UUIDs from CloudKit records
- Add SyncStadium/SyncTeam/SyncGame types to CloudKitService that preserve
  canonical ID relationships during sync
- Add canonical ID field keys to CKModels for reading from CloudKit records
- Bundle canonical JSON files (stadiums_canonical, teams_canonical,
  games_canonical, stadium_aliases) for consistent bootstrap data
- Update BootstrapService to prefer canonical format files over legacy format

This ensures all entities use consistent deterministic UUIDs derived from
their canonical IDs, preventing duplicate records when syncing CloudKit
data with bootstrapped local data.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Trey t
2026-01-09 10:30:09 -06:00
parent 1ee47df53e
commit 7efcea7bd4
31 changed files with 128868 additions and 282 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,782 @@
[
{
"alias_name": "state farm arena",
"stadium_canonical_id": "stadium_nba_state_farm_arena",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "td garden",
"stadium_canonical_id": "stadium_nba_td_garden",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "barclays center",
"stadium_canonical_id": "stadium_nba_barclays_center",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "spectrum center",
"stadium_canonical_id": "stadium_nba_spectrum_center",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "united center",
"stadium_canonical_id": "stadium_nba_united_center",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "rocket mortgage fieldhouse",
"stadium_canonical_id": "stadium_nba_rocket_mortgage_fieldhouse",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "american airlines center",
"stadium_canonical_id": "stadium_nba_american_airlines_center",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "ball arena",
"stadium_canonical_id": "stadium_nba_ball_arena",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "little caesars arena",
"stadium_canonical_id": "stadium_nba_little_caesars_arena",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "chase center",
"stadium_canonical_id": "stadium_nba_chase_center",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "toyota center",
"stadium_canonical_id": "stadium_nba_toyota_center",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "gainbridge fieldhouse",
"stadium_canonical_id": "stadium_nba_gainbridge_fieldhouse",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "intuit dome",
"stadium_canonical_id": "stadium_nba_intuit_dome",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "crypto.com arena",
"stadium_canonical_id": "stadium_nba_cryptocom_arena",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "cryptocom arena",
"stadium_canonical_id": "stadium_nba_cryptocom_arena",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "fedexforum",
"stadium_canonical_id": "stadium_nba_fedexforum",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "kaseya center",
"stadium_canonical_id": "stadium_nba_kaseya_center",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "fiserv forum",
"stadium_canonical_id": "stadium_nba_fiserv_forum",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "target center",
"stadium_canonical_id": "stadium_nba_target_center",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "smoothie king center",
"stadium_canonical_id": "stadium_nba_smoothie_king_center",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "madison square garden",
"stadium_canonical_id": "stadium_nba_madison_square_garden",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "paycom center",
"stadium_canonical_id": "stadium_nba_paycom_center",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "kia center",
"stadium_canonical_id": "stadium_nba_kia_center",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "wells fargo center",
"stadium_canonical_id": "stadium_nba_wells_fargo_center",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "footprint center",
"stadium_canonical_id": "stadium_nba_footprint_center",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "moda center",
"stadium_canonical_id": "stadium_nba_moda_center",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "golden 1 center",
"stadium_canonical_id": "stadium_nba_golden_1_center",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "frost bank center",
"stadium_canonical_id": "stadium_nba_frost_bank_center",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "scotiabank arena",
"stadium_canonical_id": "stadium_nba_scotiabank_arena",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "delta center",
"stadium_canonical_id": "stadium_nba_delta_center",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "capital one arena",
"stadium_canonical_id": "stadium_nba_capital_one_arena",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "chase field",
"stadium_canonical_id": "stadium_mlb_chase_field",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "truist park",
"stadium_canonical_id": "stadium_mlb_truist_park",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "oriole park at camden yards",
"stadium_canonical_id": "stadium_mlb_oriole_park_at_camden_yards",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "fenway park",
"stadium_canonical_id": "stadium_mlb_fenway_park",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "wrigley field",
"stadium_canonical_id": "stadium_mlb_wrigley_field",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "guaranteed rate field",
"stadium_canonical_id": "stadium_mlb_guaranteed_rate_field",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "great american ball park",
"stadium_canonical_id": "stadium_mlb_great_american_ball_park",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "progressive field",
"stadium_canonical_id": "stadium_mlb_progressive_field",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "coors field",
"stadium_canonical_id": "stadium_mlb_coors_field",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "comerica park",
"stadium_canonical_id": "stadium_mlb_comerica_park",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "minute maid park",
"stadium_canonical_id": "stadium_mlb_minute_maid_park",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "kauffman stadium",
"stadium_canonical_id": "stadium_mlb_kauffman_stadium",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "angel stadium",
"stadium_canonical_id": "stadium_mlb_angel_stadium",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "dodger stadium",
"stadium_canonical_id": "stadium_mlb_dodger_stadium",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "loandepot park",
"stadium_canonical_id": "stadium_mlb_loandepot_park",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "american family field",
"stadium_canonical_id": "stadium_mlb_american_family_field",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "target field",
"stadium_canonical_id": "stadium_mlb_target_field",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "citi field",
"stadium_canonical_id": "stadium_mlb_citi_field",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "yankee stadium",
"stadium_canonical_id": "stadium_mlb_yankee_stadium",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "sutter health park",
"stadium_canonical_id": "stadium_mlb_sutter_health_park",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "citizens bank park",
"stadium_canonical_id": "stadium_mlb_citizens_bank_park",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "pnc park",
"stadium_canonical_id": "stadium_mlb_pnc_park",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "petco park",
"stadium_canonical_id": "stadium_mlb_petco_park",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "oracle park",
"stadium_canonical_id": "stadium_mlb_oracle_park",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "t-mobile park",
"stadium_canonical_id": "stadium_mlb_tmobile_park",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "tmobile park",
"stadium_canonical_id": "stadium_mlb_tmobile_park",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "busch stadium",
"stadium_canonical_id": "stadium_mlb_busch_stadium",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "tropicana field",
"stadium_canonical_id": "stadium_mlb_tropicana_field",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "globe life field",
"stadium_canonical_id": "stadium_mlb_globe_life_field",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "rogers centre",
"stadium_canonical_id": "stadium_mlb_rogers_centre",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "nationals park",
"stadium_canonical_id": "stadium_mlb_nationals_park",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "honda center",
"stadium_canonical_id": "stadium_nhl_honda_center",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "delta center",
"stadium_canonical_id": "stadium_nhl_delta_center",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "td garden",
"stadium_canonical_id": "stadium_nhl_td_garden",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "keybank center",
"stadium_canonical_id": "stadium_nhl_keybank_center",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "scotiabank saddledome",
"stadium_canonical_id": "stadium_nhl_scotiabank_saddledome",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "pnc arena",
"stadium_canonical_id": "stadium_nhl_pnc_arena",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "united center",
"stadium_canonical_id": "stadium_nhl_united_center",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "ball arena",
"stadium_canonical_id": "stadium_nhl_ball_arena",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "nationwide arena",
"stadium_canonical_id": "stadium_nhl_nationwide_arena",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "american airlines center",
"stadium_canonical_id": "stadium_nhl_american_airlines_center",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "little caesars arena",
"stadium_canonical_id": "stadium_nhl_little_caesars_arena",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "rogers place",
"stadium_canonical_id": "stadium_nhl_rogers_place",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "amerant bank arena",
"stadium_canonical_id": "stadium_nhl_amerant_bank_arena",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "crypto.com arena",
"stadium_canonical_id": "stadium_nhl_cryptocom_arena",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "cryptocom arena",
"stadium_canonical_id": "stadium_nhl_cryptocom_arena",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "xcel energy center",
"stadium_canonical_id": "stadium_nhl_xcel_energy_center",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "bell centre",
"stadium_canonical_id": "stadium_nhl_bell_centre",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "bridgestone arena",
"stadium_canonical_id": "stadium_nhl_bridgestone_arena",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "prudential center",
"stadium_canonical_id": "stadium_nhl_prudential_center",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "ubs arena",
"stadium_canonical_id": "stadium_nhl_ubs_arena",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "madison square garden",
"stadium_canonical_id": "stadium_nhl_madison_square_garden",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "canadian tire centre",
"stadium_canonical_id": "stadium_nhl_canadian_tire_centre",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "wells fargo center",
"stadium_canonical_id": "stadium_nhl_wells_fargo_center",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "ppg paints arena",
"stadium_canonical_id": "stadium_nhl_ppg_paints_arena",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "sap center",
"stadium_canonical_id": "stadium_nhl_sap_center",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "climate pledge arena",
"stadium_canonical_id": "stadium_nhl_climate_pledge_arena",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "enterprise center",
"stadium_canonical_id": "stadium_nhl_enterprise_center",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "amalie arena",
"stadium_canonical_id": "stadium_nhl_amalie_arena",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "scotiabank arena",
"stadium_canonical_id": "stadium_nhl_scotiabank_arena",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "rogers arena",
"stadium_canonical_id": "stadium_nhl_rogers_arena",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "t-mobile arena",
"stadium_canonical_id": "stadium_nhl_tmobile_arena",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "tmobile arena",
"stadium_canonical_id": "stadium_nhl_tmobile_arena",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "capital one arena",
"stadium_canonical_id": "stadium_nhl_capital_one_arena",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "canada life centre",
"stadium_canonical_id": "stadium_nhl_canada_life_centre",
"valid_from": null,
"valid_until": null
},
{
"alias_name": "daikin park",
"stadium_canonical_id": "stadium_mlb_minute_maid_park",
"valid_from": "2025-01-01",
"valid_until": null
},
{
"alias_name": "enron field",
"stadium_canonical_id": "stadium_mlb_minute_maid_park",
"valid_from": "2000-04-01",
"valid_until": "2002-02-28"
},
{
"alias_name": "astros field",
"stadium_canonical_id": "stadium_mlb_minute_maid_park",
"valid_from": "2002-03-01",
"valid_until": "2002-06-04"
},
{
"alias_name": "rate field",
"stadium_canonical_id": "stadium_mlb_guaranteed_rate_field",
"valid_from": "2024-01-01",
"valid_until": null
},
{
"alias_name": "us cellular field",
"stadium_canonical_id": "stadium_mlb_guaranteed_rate_field",
"valid_from": "2003-01-01",
"valid_until": "2016-08-24"
},
{
"alias_name": "comiskey park ii",
"stadium_canonical_id": "stadium_mlb_guaranteed_rate_field",
"valid_from": "1991-04-01",
"valid_until": "2002-12-31"
},
{
"alias_name": "new comiskey park",
"stadium_canonical_id": "stadium_mlb_guaranteed_rate_field",
"valid_from": "1991-04-01",
"valid_until": "2002-12-31"
},
{
"alias_name": "suntrust park",
"stadium_canonical_id": "stadium_mlb_truist_park",
"valid_from": "2017-04-01",
"valid_until": "2020-01-13"
},
{
"alias_name": "jacobs field",
"stadium_canonical_id": "stadium_mlb_progressive_field",
"valid_from": "1994-04-01",
"valid_until": "2008-01-10"
},
{
"alias_name": "the jake",
"stadium_canonical_id": "stadium_mlb_progressive_field",
"valid_from": "1994-04-01",
"valid_until": "2008-01-10"
},
{
"alias_name": "miller park",
"stadium_canonical_id": "stadium_mlb_american_family_field",
"valid_from": "2001-04-01",
"valid_until": "2020-12-31"
},
{
"alias_name": "skydome",
"stadium_canonical_id": "stadium_mlb_rogers_centre",
"valid_from": "1989-06-01",
"valid_until": "2005-02-01"
},
{
"alias_name": "marlins park",
"stadium_canonical_id": "stadium_mlb_loandepot_park",
"valid_from": "2012-04-01",
"valid_until": "2021-03-31"
},
{
"alias_name": "att park",
"stadium_canonical_id": "stadium_mlb_oracle_park",
"valid_from": "2006-01-01",
"valid_until": "2019-01-08"
},
{
"alias_name": "sbc park",
"stadium_canonical_id": "stadium_mlb_oracle_park",
"valid_from": "2004-01-01",
"valid_until": "2005-12-31"
},
{
"alias_name": "pac bell park",
"stadium_canonical_id": "stadium_mlb_oracle_park",
"valid_from": "2000-04-01",
"valid_until": "2003-12-31"
},
{
"alias_name": "choctaw stadium",
"stadium_canonical_id": "stadium_mlb_globe_life_field",
"valid_from": "2020-01-01",
"valid_until": null
},
{
"alias_name": "philips arena",
"stadium_canonical_id": "stadium_nba_state_farm_arena",
"valid_from": "1999-09-01",
"valid_until": "2018-06-25"
},
{
"alias_name": "ftx arena",
"stadium_canonical_id": "stadium_nba_kaseya_center",
"valid_from": "2021-06-01",
"valid_until": "2023-03-31"
},
{
"alias_name": "american airlines arena",
"stadium_canonical_id": "stadium_nba_kaseya_center",
"valid_from": "1999-12-01",
"valid_until": "2021-05-31"
},
{
"alias_name": "bankers life fieldhouse",
"stadium_canonical_id": "stadium_nba_gainbridge_fieldhouse",
"valid_from": "2011-01-01",
"valid_until": "2021-12-31"
},
{
"alias_name": "conseco fieldhouse",
"stadium_canonical_id": "stadium_nba_gainbridge_fieldhouse",
"valid_from": "1999-11-01",
"valid_until": "2010-12-31"
},
{
"alias_name": "quicken loans arena",
"stadium_canonical_id": "stadium_nba_rocket_mortgage_fieldhouse",
"valid_from": "2005-08-01",
"valid_until": "2019-08-08"
},
{
"alias_name": "gund arena",
"stadium_canonical_id": "stadium_nba_rocket_mortgage_fieldhouse",
"valid_from": "1994-10-01",
"valid_until": "2005-07-31"
},
{
"alias_name": "amway center",
"stadium_canonical_id": "stadium_nba_kia_center",
"valid_from": "2010-10-01",
"valid_until": "2023-07-12"
},
{
"alias_name": "att center",
"stadium_canonical_id": "stadium_nba_frost_bank_center",
"valid_from": "2002-10-01",
"valid_until": "2023-10-01"
},
{
"alias_name": "vivint arena",
"stadium_canonical_id": "stadium_nba_delta_center",
"valid_from": "2020-12-01",
"valid_until": "2023-07-01"
},
{
"alias_name": "vivint smart home arena",
"stadium_canonical_id": "stadium_nba_delta_center",
"valid_from": "2015-11-01",
"valid_until": "2020-11-30"
},
{
"alias_name": "energysolutions arena",
"stadium_canonical_id": "stadium_nba_delta_center",
"valid_from": "2006-11-01",
"valid_until": "2015-10-31"
},
{
"alias_name": "fla live arena",
"stadium_canonical_id": "stadium_nhl_amerant_bank_arena",
"valid_from": "2021-10-01",
"valid_until": "2024-05-31"
},
{
"alias_name": "bb&t center",
"stadium_canonical_id": "stadium_nhl_amerant_bank_arena",
"valid_from": "2012-06-01",
"valid_until": "2021-09-30"
},
{
"alias_name": "bankatlantic center",
"stadium_canonical_id": "stadium_nhl_amerant_bank_arena",
"valid_from": "2005-10-01",
"valid_until": "2012-05-31"
},
{
"alias_name": "keyarena",
"stadium_canonical_id": "stadium_nhl_climate_pledge_arena",
"valid_from": "1995-01-01",
"valid_until": "2018-10-01"
},
{
"alias_name": "seattle center coliseum",
"stadium_canonical_id": "stadium_nhl_climate_pledge_arena",
"valid_from": "1962-01-01",
"valid_until": "1994-12-31"
}
]

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff