Problem
The defense side of the game is entirely unimplemented. TerritoryHistory has a defended event type that nothing writes, TerritoryStats.territories_defended is only ever initialized to 0, and Territory.status='contested' is never set by any code path (only seed data is 'contested'). The UI filters for contested (useTerritoryExplorer.ts) but it never happens live.
Acceptance
- Define the state machine: when does a territory become 'contested' and how is it resolved (conquered vs defended)?
- Add a defend/contest path that writes
defendedhistory rows and incrementsterritories_defended. - Surface 'under attack'/contested state from real data, not seed.