Problem
splitPolygonByRoute (resources/functions/geo.ts:381) is self-labeled 'simplified - for MVP' and only handles a clean 2-crossing convex case. Routes with >2 crossings, concave territories, or self-intersecting paths produce wrong/degenerate polygons or silently return the original (no split). This is the core conquest geometry and has only ever run on synthetic loops.
Acceptance
- Handle arbitrary crossing counts (sort crossings along the boundary, reconstruct both rings).
- Handle concave polygons correctly.
- Reject/flag self-intersecting routes instead of producing invalid geometry.
- Unit tests: 2-crossing, 3+ crossing, concave, self-intersecting.