- map.test.ts: rewrite the fixture for region keys; the #6 regression guard now
proves the owner resolves via properties.regionKey while the repacked numeric
feature.id and the sub-region regionId do not.
- regions.test.ts (new): the loader sees 1,796 valid keys; FRA expands to its
42 sub-region keys (all valid, all labelled '… (FRA)'); allTerritoryKeys
unions correctly; and with no data it degrades to the raw input.
- engine.test.ts: buildUserPrompt includes a regions table only when provided;
applyTurnResult with a validKeys set applies real keys and ignores bogus ones,
and without one applies all (the legacy/unit path).
Map (WorldMap):
- Keep the near-black OpenFreeMap `dark` basemap (verified HTTP 200; the
suggested dark-matter / dark-outdoors / liberty-dark variants 404 on that
host) so the choropleth nation colors pop
- Stable per-nation fills at 0.8 opacity, thin subtle borders, and a brighter
thicker amber border for the player nation so "this is me" is always obvious
- Hover brightens a region and shows a color-chipped owner + key stats popup;
click opens a full dossier popup and focuses the left panel on that nation
- Transient, self-cleaning flash (pulsing amber outline) over regions whose
ownership changed this turn
- Bottom-left legend auto-generated from the region map; per-scenario initial
camera (Europe for the WWII scenarios, wider for Cold War / Modern / Aegis)
Command-center UI:
- New header bar: scenario title, prominent turn + date, the player nation
(name + color chip), and a live Idle / "Simulating…" status indicator
- 3-column operations-console grid: nation dossier (left) / dominant map
(center) / command deck + event feed (right); stacks map-first on mobile
- EventFeed: one card per event with a category icon, a colored outcome badge
(success/failure/partial/neutral), a nation-colored accent edge, and the
turn + date; new events slide in and flash at the top
- NationPanel: value-colored animated stat bars (red → green), territory as
color-coded region chips, and diplomacy as a list with a colored indicator
per relation (ally/rival/war/neutral)
- ActionPanel: a "Your move" composer with one prominent Send button and a
spinner + "turns can take a few seconds" hint while a turn resolves
- sonner error toasts: a 502 / model-down surfaces as "AI temporarily
unavailable — try again"
Live LLM rewire (server, previously uncommitted):
- Default endpoint https://ai.kkhost.pl/v1 (vLLM, no API key); reasoning model
qwen3.8-27b; always send a generous max_tokens (4000) so it finishes its
chain-of-thought before emitting content; read only `content`, ignore
`reasoning`. docker-compose + AGENTS.md updated to match.
Tests: the deterministic Playwright e2e gains assertions for the dossier stat
bars, the map legend (all nations), and the event-card type icon + outcome
badge; it stays fully deterministic under LLM_STUB=1.