Port main's strategy changes into cloud's lib/strategy split

Cloud moved migration, page loading and page switching out of
strategy_provider.dart; main kept changing them there. Re-applied:

- StrategyMigrator: lineup graph and sunset scale migrations, agent
  weapon migration, forced migrations by original version, the
  finalize-at-current-version rule, and the graph shift in the 16:9
  world migration.
- Page data carries a LineUpGraph (StrategyEditorPageData,
  applyStrategyEditorPageData, local page source flush/load).
- Page transitions route agents over the navigation mesh when world
  geometry is enabled (strategy_page_session_provider).
- createNewStrategy takes the picked map and auto-name for cloud
  creates too, and returns the StrategyData main's navigator expects.
- switchSide(allPages:) patches every other page's side through the
  Convex op queue for cloud strategies; local strategies keep main's
  Hive path. Page-edit capability gates both.
- Unsaved tracking listens to the graph instead of legacy groups.

Cloud lineups stay on the lineupGroup payload (the Convex contract is
unchanged): sync, upload, export and hydration go through the graph's
legacy group projection. Each site is marked TODO(lineupGraph). Live
sync treats a missing agent `weapon` as none when comparing payloads,
matching the existing showVisionCone default, so hydrating older cloud
data never authors a rewrite.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
a4131f6a19Dara Adedeji committed on 9/24/2026, 8:38:30 PMparent6e6fb3d
11 files changedLine totals unavailable