# Changelog

## v2.0 — Phase 2 complete + Production cut-over (2026-04-23)

Phase 2 "Briefing-Room-Hybrid UI-Skin" closed. The v2 branch
(AR-2.0 "Spheres of Influence") is promoted from preview track
(`/v2/`, `index-v2.html`) to main production on atlanticrift.cc.

### Changed — cut-over mechanics

- **Production cut-over:** `index-v2.html` (née `v2/index.html`) is
  now the production `index.html`. Old v12.7 archived as
  `archive/atlantic-drift_v12.7.html`, continuing the existing
  archive convention (v9, v10, v11, v11.1, v11.2 — v12.7 joins).
- **Meta robots** switched from `noindex,nofollow` to
  `index,follow,max-image-preview:large`. v2 was never indexed while
  on the preview track; it is now publicly indexable.
- **robots.txt:** `/v2/` and `/index-v2.html` Disallow entries
  removed — those paths no longer exist as targets.
- **Production header comment** in `index.html` updated to reflect
  the cut-over status ("PRODUCTION (cut-over 2026-04-23)") instead
  of the WIP framing.

### Phase 2 Summary — what shipped

From the Pflichtenheft (`docs/planned/AR-2.0-phase-2-spec.md`),
four Design-Entscheidungen agreed 2026-04-20:
- Skin-Metaphorik: D — Briefing-Room-Hybrid
- Beat-Struktur: B — Briefing-Drama
- Konsequenz-Visualisierung: B+ — Hover-Delta + dotted-line
- Force-Tokens: D — Visual-Refactor now, mechanic in Phase 4

Implementation cuts that landed:

- **Cut 2.1-R** — capabilities-block + DEFCON range-bar (§3.4)
- **Cut 2.6** — inline-explanation system: status tooltips +
  first-time briefing (§3.6)
- **Cut 2.6b-Quick** — name-redact + vocab substitution (§3.6.4)
- **Cut 2.6b-Deep** — 27 power-specific action tooltips, EN+DE
  (§3.6.4)
- **Reviewer pass 20.04** — M2 clampAll sphere-sync + L4 DEFCON
  spec-code alignment
- **Audit findings resolved** — H1 + H2 + M3 + M4 + L7 (no-realnames
  LLM + save-schema + dom-id + esc-stacking + deploy-hygiene)

### Added — editorial sibling link

- **Companion-site link:** "Strategy Gaming" entry in
  `start-footer-links`, pointing to [pcplayerhub.com](https://pcplayerhub.com/).
  pcplayerhub is the editorial magazine companion to Atlantic Rift —
  strategy game essays, dev logs, genre analysis. Sibling project
  under the same ConsultD framing.

### Unchanged

- Game mechanics from Phase 1 baseline (sphere vector + map heat-map
  remain canonical).
- Sim-harness corridor — reckless/cautious/diplomatic distributions
  stay within Phase 1 bounds.
- Mistral headline proxy + rate limiting + env handling.
- Impressum, Datenschutzerklärung (DSGVO content unchanged).

### Next — Phase 3

- AI-Phase as sequence-modal — the AI opponent turn becomes a
  scripted reveal instead of a single atomic jump.
- **China as third power** — prerequisite for the Phase 4
  EU-Coalition mechanic to have real stakes.
- Power-Selection — the player chooses which sphere to play (US /
  EU / eventually China) at game start.
- Estimated effort: 3-4 AI-pair-programming days.

### The milestone ahead — Phase 4

Phase 4 is the EU-Coalition-Mechanic. After Phase 4 the
"EU-Augenhöhe" vision becomes actually playable for the first time —
the core design hypothesis of AR-2.0 gets its first honest test
against a finished game loop. Everything before Phase 4 is
infrastructure for that test.



## v12.6.4 — Claim hygiene + authorship framing (2026-04-19)

Docs-only patch on the v12.6-branch concerns, filed after v12.7 shipped
but semantically belonging to the compliance/positioning pass.

### Changed
- Replaced werbende "DSGVO-clean" / "Real compliance, not theater"
  superlatives in `index.html` (comments), `README.md` (vendor block
  + design principle 5) with neutral descriptions: "privacy-
  conservative", "no CDN calls", "we aim for GDPR compliance and
  document our data handling in datenschutz.html". UWG §5
  (irreführende geschäftliche Handlung) is a real abmahn-vector for
  compliance-superlatives; the new phrasing states what the site does
  without claiming a verdict it hasn't earned.
- Credits block in `README.md` now explicitly names both co-authors
  (Daniel Papcke + Anthropic's Claude) and frames the collaboration
  as "DNA enhanced by AI" — ConsultD's positioning statement. Not
  AI-as-tool wording; co-authorship wording.
- `about.html` gets a kicker + byline block directly under the title:
  "DNA enhanced by AI · A ConsultD production" / "Co-authored by
  Daniel Papcke and Anthropic's Claude, April 2026." — matches the
  editorial tokens (JetBrains Mono + Georgia italic) used elsewhere.
- Meta-description in `index.html` now names both co-authors for
  link-preview cards and search results.
- `README.md` top: new italic subtitle "*DNA enhanced by AI — a
  ConsultD production.*"

### Unchanged
- `datenschutz.html` — legal text describing actual processing.
- `impressum.html` — legally mandated contact info.
- `THIRD_PARTY_LICENSES` — defensive phrasing already ("DSGVO-
  conservative").
- Game mechanics, balance, i18n strings, sim-harness.


## v12.7 — Game Feel (2026-04-19)

Six UI/UX polish features. No gameplay, no balance, no mechanic touched.
Sim-harness `--seed 42` against `baseline-50786f2.txt` stays byte-identical
across the entire series — stdout diff empty after every commit.

### Added
- **Quarterly Dispatch Dossier (F1).** Between-turn 4–6 s editorial
  overlay. Generates 3–5 bullet lines from the turn's actions
  (`state.dispatchQueue`) using a keyed verb dictionary ("Washington
  signed a trade deal with Brazil"). No Mistral call, all local, full
  EN/DE. Skippable via ESC / Space / Enter / click / footer. Auto-
  dismisses after 5 s. Deferred until any crisis modal resolves.
- **Treasury / Unity context labels + range bars (F2).** Each metric
  now shows its tier ("Stressed", "Austerity", "Crisis", "Cohesive",
  "Restive", "Fracturing" etc.) with a horizontal red→amber→green
  gradient bar and an indicator dot at the current position. Tiers
  match the Schwellen the game uses internally (austerity event at
  treasury < −130, uprising at unity < 30) — they're surfaced, not
  invented.
- **Selected-country pulse + alignment shimmer (F3).** GPU-only CSS.
  Selected country pulses stroke-width 1.5↔2.4 at 1.6 s cycle. When
  an action lands a positive alignment shift, the affected country
  flashes blue→amber→default over 820 ms. Rival shifts flash red→
  amber. 5-concurrent cap prevents flicker storms.
- **Instrument tooltips (F4).** Hover / focus / long-press on any of
  the 9 Instruments-of-Power buttons opens a paper-card tooltip with
  kicker · title · summary · effect-block (alignment / treasury /
  tension / AP, values read from the real `ACTIONS` array) · context.
  Tension-negative (reg / destab) instruments get a red warning line.
  Bilingual. 300 ms hover delay, instant on focus. ESC closes.
- **16-quarter timeline strip (F5).** Above the map. Current turn
  highlighted (ink block, red-hot bottom rule), past turns show up to
  3 event-dots colored by kind (neutral=grey, friction=amber, tension
  =red, stabilizing=blue), overflow collapses to "+N". Native tooltip
  lists headlines for that quarter. No click → no time-travel.
  Responsive: dots disappear under 900 px, ribbon tints instead.
- **Cold-open first-visit intro (F6).** 15 s kinetic sequence of four
  scripted lines ("April 2026." / "The Arctic ultimatum is in its
  sixtieth day." …) on an ink background, fading to white before the
  start-screen reveals. Once per browser (`localStorage`), bypassed on
  Continue-flow. Skippable. Four lines in EN + DE verbatim from spec.

### Changed
- Nothing mechanical. `SAVE_VERSION` stays at 1. Existing Matomo
  events keep their category/action/name schema.

### Added (meta)
- New Matomo category `ui_v127` with events: `dispatch_viewed`,
  `dispatch_skipped`, `tooltip_open`, `cold_open_viewed`,
  `cold_open_skipped`.
- New state fields (optional, backfilled on load for older saves):
  `state.dispatchQueue`, `state.headlineHistory`.

### Honored
- `prefers-reduced-motion`: every animated affordance has a static or
  cross-fade fallback (pulse→dropshadow, staggered fades→simultaneous,
  scale-ups→instant).
- Crawford philosophy: no Fortnite bling, no achievement toasts, no
  sound (audio layer is a v12.9 candidate, not v12.7). The Rupture
  ending's Yeats/Mark-3:25 register is still the master tone regulator.


## v12.5.1 — Force Token completion (2026-04-19)

Closes the v12.5 half-ship. No mechanic change — v12.5 already had the
state, the deploy/withdraw workflow, upkeep, and crisis-suppression
rolls. v12.5.1 adds the two pieces that were deferred:

### Added
- **On-map glyph.** Deployed Force Tokens now render as a small paper-
  colored circle with a bloc-colored crossed-swords (⚔) at the country
  centroid. US tokens are red-ish (#c83d4a), EU tokens blue-ish
  (#2e4a7a) — matching `countryFill()`'s home-country tones. Visible
  on the canonical world map next to country labels. Updates on every
  `renderAll()`; no extra wiring needed for deploy/withdraw/endTurn.
  State captured once via `countryCentroids{}` during `loadWorld()`.
- **Commit-in-crisis bonus.** When a flashpoint fires in a country
  where the player's own token is stationed, a third choice appears
  in the crisis modal: **⚔ Commit the Force Token**. Clicking it
  consumes the token (no AP cost — that was paid at deploy-time) and
  delivers a decisive alignment swing of `+rand(8,12)` to the player's
  bloc, with `−floor(swing/2)` to the rival. Matomo event
  `Force/Commit/<country>` captures the swing magnitude.

### i18n
- `force.commit.label`, `force.commit.risk`, `force.commit.outcome`,
  `force.logCommit` — all EN + DE.

### Unchanged (deliberate)
- `checkCrisis()` suppression (the 35% probability-dampening from v12.5)
  still fires first. Commit is the second-chance lever if suppression
  rolled against and the crisis fired anyway.
- No AP cost, no treasury cost on commit. The token was paid for at
  deploy, its upkeep has been paid quarter-by-quarter, and committing
  it is the moment it earns its keep.
- `SAVE_VERSION` stays at 1. `state.forceTokens` shape unchanged.
- Sim-harness regression: reckless 84%, cautious 4%, diplomatic 0%
  rupture — inside the v12.6.3 corridor. Commit-button code path is
  only reachable under human interaction; harness auto-dismisses
  crises by first-choice.


## v12.6.2 — Security hardening for public exposure (2026-04-19)

Infrastructure pass. No gameplay, UI or content change. Closes the six
findings from the v12.6.1 re-classification pass:

### Fixed
- **Mistral-proxy rate-limit race (#7).** `api/mistral-headline.php` now
  reads and writes the per-IP history file under a single `flock(LOCK_EX)`.
  Parallel requests serialize through one atomic read-modify-write;
  fail-closed (503) if the lock cannot be acquired. Verified with 70
  parallel POSTs: 60 pass, 10 get 429 — ceiling holds.
- **Double redirect on www / non-www (#12, #13).** Port 80 is now a
  pure redirect-only vHost; port 443 splits `www` (redirect) from
  `atlanticrift.cc` (canonical). Each request terminates in one 301.
- **HSTS not preload-eligible (#13).** Upgraded to
  `max-age=63072000; includeSubDomains; preload` so the domain can be
  submitted to `hstspreload.org` (Dan submits manually).

### Added
- **fail2ban jail `atlanticrift-mistral` (#18).** 120 abuse requests
  (429/403 on `POST /api/mistral-headline.php`) within 10 minutes → 1h
  ban, repeat offenders escalate by factor 24 to 24h max. Willytel ranges
  inherited from `[DEFAULT] ignoreip`.
- **Daily abuse-digest cron (#18).** `/usr/local/bin/ar-abuse-alert.sh`
  mails Dan only if yesterday's abuse 429s exceeded 1000/day.
- **Mistral dashboard hard cap: 10 EUR/month (#19).** Set manually by
  Dan in console.mistral.ai with email alerts at 80 % and 95 %.
  Documented in `docs/MISTRAL.md`.
- **`robots.txt` + `sitemap.xml` (#20).** Policy INDEX, `/api/` disallowed.
  Sitemap covers home, about, impressum, datenschutz.
- **DEPLOY.md §10–13** and **MISTRAL.md §Budget & Abuse Limits** document
  every server-side change so nothing is implicit infrastructure.

### Unchanged (deliberate)
- `index.html`, gameplay, rendering, save format, Matomo events, fonts.


## v12.6.1 — Real bold font cuts (2026-04-19)

### Fixed
- **Faux-bold on meta-screens (#17).** v12.6 shipped three 400-weight
  woff2 files with `font-weight: 400 700` declarations that assumed
  variable-axis cuts. They were static 400s, so the browser synthesized
  bold by stroke thickening — visibly ugly on the "Atlantic RIFT" lockup.
- Replaced with six discrete latin static cuts from Google Fonts:
  - `playfair-400.woff2` / `playfair-700.woff2` (upright)
  - `playfair-400-italic.woff2` / `playfair-700-italic.woff2`
  - `jetbrains-mono-400.woff2` / `jetbrains-mono-700.woff2`
- Six `@font-face` declarations with exact `font-weight: 400` vs `700`.
  Real bold glyphs; no more faux-bold.

### Changed
- Self-hosted font footprint: ~135 KB (6 files) instead of ~107 KB (3).


## v12.6 — Editorial meta-screen redesign (2026-04-19)

### Changed
- **Start, briefing and end screens redesigned** in an editorial register — ink-on-paper cards with Playfair Display serif headlines, Georgia body copy, and JetBrains Mono kickers / tickers. The in-game UI (map, dossier, actions, status strip, headlines panel) is unchanged and keeps its Apple-styled look.
- **New cinematic start screen.** Dimmed orthographic globe (45°N / 30°W, Mid-Atlantic Ridge accent) fills the viewport behind sparse editorial type: eyebrow coord, "Atlantic RIFT" lockup, red "— A Strategy of Nations —" subtitle, and two "Play As" buttons. Continue / Import affordances are now on the start screen.
- **Rupture ending** now renders in an inverted variant — ink card, paper text, red rift rule, Yeats epigraph in serif italic. The other endings (Win / Bretton Woods III / Draw) use the paper-on-ink variant with a JetBrains Mono stats ticker (quarters played, end tension, Unit adoption, treasury).
- **Briefing modal** repainted as a paper-coloured card with a "§ 01 · BRIEFING · …" section marker, bracket-corners, Playfair headings and Georgia paragraph copy.

### Added
- **Self-hosted fonts** (SIL OFL 1.1): `vendor/fonts/playfair-regular.woff2`, `playfair-italic.woff2`, `jetbrains-mono.woff2`. No fonts.googleapis.com or fonts.gstatic.com runtime calls.
- **Globe renderer** `vendor/globe.js` + `vendor/coastlines.json` (Natural Earth 50m, North Atlantic, simplified). `prefers-reduced-motion` respected — the slow drift is disabled.
- **Favicon** `favicon.svg` — globe mark with diagonal rift line.
- **THIRD_PARTY_LICENSES** §7, §8, §9 added for Playfair, JetBrains Mono and Natural Earth 50m.

### Unchanged (deliberate)
- **Gameplay, AI, events, crises, balance, scoring.** No gameplay function body was modified. `endGame()` only added a presentation toggle and a ticker fill — both run after the outcome has been decided. Balance profile is unchanged by construction; no sim-harness run because no gameplay surface was touched.
- **`about.html`, `impressum.html`, `datenschutz.html`** — their Apple-styled look is left alone.
- **`api/mistral-headline.php`** — unchanged.
- **Save format.** `SAVE_VERSION` stays at 1. Pre-v12.6 saves load and run without migration.
- **Matomo events.** `Game/*`, `Action/*`, `Country/Select`, etc., unchanged. New event `Start/ChooseSide/<side>` only.

### Out of scope (v12.7 backlog)
- Event-headline and crisis-template translations (i18n) — the run()/body() closures still need to be refactored to keyed templates.
- Commit-in-crisis Force Token bonus — still needs a crisis-modal choice-injection.
- On-map Force Token glyph — crossed-swords circle at country centroid.


## v12.1 – v12.5 (2026-04-18) — retroactive notes

Committed but not yet changelogged at the time:

- **v12.1** — Save/Load via localStorage. Pause/Resume, Base64 Export/Import, `SAVE_VERSION=1`.
- **v12.2** — Headlines deduplication. 4-quarter cooldown window per event id, overridable per entry.
- **v12.3** — Extended Matomo hooks. `Game/Start|Resume|Import|Quit|Duration`, `Action/<id>/<country>`, `Country/Select/<id>`, `Mistral/Success|Fail` with elapsed ms. No new PII.
- **v12.4** — EN/DE i18n for UI, briefings and end screens. STRINGS dict, `t(key, params)` with placeholder substitution. Tone: formal "Sie". Event headlines and crisis templates still EN (v12.6 backlog).
- **v12.5** — Force Tokens (deploy/withdraw/upkeep/passive crisis suppression), without on-map glyph or commit-in-crisis bonus (both deferred).


## v11.4 — Rename: Atlantic Drift → Atlantic Rift (2026-04-18)

### Changed
- **Project renamed.** "Atlantic Drift" is now "Atlantic Rift" across all user-facing surfaces (game title, About page, Impressum, Datenschutz, documentation, Mistral prompt, Matomo site label).
- **Rationale.** "Rift" is the better word for what the game is about: visible, acute, political, consequential. "Drift" is geologic and passive; "Rift" sits on the gradient between Friction and Rupture exactly where the game mechanically lives. And the domain was already `atlanticrift.cc` — the two-word ambiguity cost ConsultD showcase-professionalism every time a visitor mistyped.
- **Preserved.** The event kicker "The Atlantic Rift" (formerly "The Atlantic Drift") still fires on two key UK-narrative events, now as self-referential label rather than title. Domain, codebase IDs, vault-entry names, NC paths renamed to `atlantic-rift/`.
- **Proper HTML head added** to `index.html` — title, description, Open Graph tags. Previously the page had no `<title>` element at all.

### Files affected
- `index.html`, `about.html`, `impressum.html`, `datenschutz.html` — all user-facing strings
- `README.md`, `CHANGELOG.md` — project documentation
- `docs/*.md` — all internal docs, including deploy paths
- `api/mistral-headline.php` — prompt text so Mistral refers to the correct game name
- Archive files (`archive/atlantic-drift_v*.html`, `docs/archive/*-NGINX.md`) kept with old naming as historical artifacts

### Migration note for deployed instance
If you have the old `atlantic-drift/` folder on Nextcloud, it has been renamed to `atlantic-rift/`. All deploy docs now reference the new path. If you already ran the old `rsync` pointing at the old folder, re-sync.


## v11.3 — UK Narrative + Matomo + About + Map Fallback (2026-04-18)

### Added
- **UK scenario events** — three new events modeling the "can EU reattract UK / will it become 51st state" dynamic:
  - `uk-brexit-regret` (EU-pull, triggers at `uk.euAlign > 65`)
  - `uk-special-relationship` (US lock-in, triggers at `uk.usAlign > 80`; also bumps intra-West frictions)
  - `uk-swing-moment` (contested UK creates a fork event depending on which side you play)
- **About page** (`about.html`) — Atlantic Rift framed as an AI-collaboration study. Links to ConsultD, Conversations with Claude, danielpapcke.com, Anthropic. Four bloc sigils (SVG) introduced.
- **Bloc sigils** — clean inline SVG icons for US / EU / China / Russia. Currently displayed on the About page; can be pulled into status strip, briefing badges, and endings in a later pass.
- **Matomo integration** — DSGVO-conservative tracking snippet at bottom of `index.html`. Cookie-less, IP-anonymized, respects Do-Not-Track. Exposes `window.trackGameEvent(category, action, name, value)` for game-level analytics. `endGame()` now emits an event per ending kind. Replace two placeholders (`[YOUR_MATOMO_HOST]` and `[YOUR_SITE_ID]`) in the snippet before going live.
- **Datenschutzerklärung updated** — Matomo section now affirmative (active on this instance), with its privacy-conservative configuration documented.

### Fixed
- **"Map data failed to load"** now shows a real diagnostic panel with probable causes (file:// protocol, missing `vendor/` folder, etc.) plus a **"Play without map" fallback** that replaces the map with a clickable country list grouped by region. Game remains playable if topojson fails to load.

### Balance profile (50 runs × 3 styles)

| Style | Rupture | Win | Avg treasury |
|---|---|---|---|
| reckless | 62% | 38% | -7 |
| cautious | 28% | 72% | +2 |
| diplomatic | 10% | 90% | +44 |

### Security note
- A Mistral API key was shared during this session's chat; it has been treated as exposed and has not been integrated into the frontend. Rotate it before any Mistral work begins and route through a proxy on `darth` per `docs/MISTRAL.md`.

# Changelog

## v11.1 — Bug-Fix + Debt Cascade (2026-04-18)

### Fixed
- **Action buttons no longer lie about tension cost.** Only `Regulatory Pressure` and `Covert Destabilize` show "Tension -1". All other actions (previously falsely labeled with "Tension +1" or higher) are now correctly marked as tension-neutral. Labels match mechanics.
- **Rupture-risk warning** uses the same honest logic — no more false alarms on tech/mil/arms clicks.
- **"Q=undefined"** header bug on final tick — quarter index now bounded.

### Added
- **Debt cascade events** (Daniel's request: Debt → Taxes → Social cuts → Unity loss → Uprisings):
  - `austerity-vs-stimulus` — fires when treasury < -130 and unity still healthy. 50/50 whether government picks austerity (stabilizes treasury, shrinks unity) or stimulus (opposite). Player sees it as a news headline; the choice is implied by the government's response.
  - `domestic-uprising` — eligible when own unity < 30. Mass protests in your capital. Treasury takes a hit, bloc alignment quietly erodes.
  - `rival-uprising` — when the opponent's unity < 30. Your opening, their mess. Subtle realignment gains.
- **Progressive debt stress** — deep debt now erodes Domestic Unity directly (austerity → social cuts → public patience). Below -100: gradual unity drain. Below -150: faster. Below -200: brutal.

### Balance profile (50 runs × 3 styles)

| Style | Rupture | Win | Avg unity | Avg treasury |
|---|---|---|---|---|
| reckless | 72% | 28% | 70/100 | -24 |
| cautious | 30% | 70% | 73/100 | +7 |
| diplomatic | 10% | 90% | 79/100 | +57 |

**Treasury now correlates with play style** (was purely decorative before v11.1).

# Changelog

All notable changes to Atlantic Rift. Versions are quarterly-themed snapshots; the game itself isn't on semantic versioning.

## v11 — Hail-Mary Edition (2026-04-18)

### Added
- **AI behaviour modes**: the rival bloc now picks one of three per-turn modes
  - *normal* (~75%) — rational play as in v10
  - *miscalculate* (~15%) — wastes effort on weaker targets, slight aggression
  - *hail-mary* (~10%) — erratic, big-swing moves, includes destab out of the blue. Logs show `⚡hail-mary` tag.
- **Erraticness tracker** (`state.erraticness[side]`, 0–20) rises when a side goes hail-mary, slowly decays during normal play.
- **Intra-West frictions** — five new events covering survivable Atlantic skirmishes:
  - `atlantic-tariff-row` — steel/machinery tariff disputes
  - `greenland-escalation` — US Navy operations without EU notification
  - `canada-bypass` — EU-Canada deals around Washington
  - `digital-services-retaliation` — DMA vs US firms
  - `atlantic-summit-reset` — release valve; cools tensions and frictions
  - `frictions-boil-over` — threshold event at `intraWestFrictions >= 5`, hits tension once
- **Self-hosted libraries**: D3.js, TopoJSON, and world-atlas are now served from `vendor/` — no third-party CDN calls at runtime.
- **Legal scaffolding**: `impressum.html` and `datenschutz.html` with German DSGVO coverage and clearly-marked placeholders.
- Footer links to Impressum, Datenschutz, Roadmap, Changelog.

### Changed
- **Passive tension cooling** raised from 45% → 55% chance per quarter when tension < 8.
- **Boil-over tension cost** reduced from -2 to -1 (softer but still bites).
- **Atlantic-summit-reset** fires earlier (frictions >= 2, was 3) and more often (weight 3, was 2).
- Hail-mary destabilize tolerance softened (30% chance of destab inclusion, was 50%).
- Hail-mary big-swing bias softened (50%, was 70%).

### Balance profile (50-run simulation, three play styles)

| Play style | Rupture | Win | Avg turns | End tension |
|---|---|---|---|---|
| reckless | 72% | 28% | 13.3 | 2.2/10 |
| cautious | 22% | 76% | 19.1 | 5.3/10 |
| diplomatic | 2% | 98% | 20.9 | 6.8/10 |

---

## v10 — Crawford-Conform Tension (2026-04-18)

### Changed
- **Tension scale expanded** from 1–5 internal to 1–10 internal, still displayed as 5 levels.
- **Actions no longer directly cost tension** except for `Regulatory Pressure` and `Covert Destabilize` (–1 each).
  - All other actions (Diplomatic Capital, Trade Deal, Tech Alignment, Energy Deal, Strategic Investment, Military Support, Arms Deal) are tension-neutral.
  - This is closer to Chris Crawford's original design, where tension rose through *crises*, not routine diplomacy.
- Starting tension is now 8 (was 4 on the old scale, functionally similar to "Friction").
- AI tension budget halved (only coercive tools pay tension).

### Added
- **Rupture warning**: any player action that would drop tension to 1 (game-ending) now shows a confirmation dialog.
- **AI miscalculation mode**: ~15% chance per turn, AI widens target pool and picks slightly more aggressive actions.
- **Domestic Unity stub** (`state.unity`) — visible in the status strip with a "v11 factor" tag. Drifts based on fiscal health, tension, and Unit adoption. Not yet consequential; will constrain AP and crisis options in a future edition.
- **End-turn debounce** to prevent rapid double-click skipping quarters.
- **Rupture ending** rewritten with apocalyptic register — Yeats (*The Second Coming*) and Mark 3:25 epigraphs, atmospheric copy about the post-1945 order closing its books.

### Balance profile

| Play style | Rupture | Win |
|---|---|---|
| reckless | 74% | 26% |
| cautious | 28% | 70% |
| diplomatic | 10% | 90% |

### Why Rupture instead of Rapture

The English word *rupture* and the biblical *rapture* share the Latin root *rumpere* (to break). Rupture is the secular term for what's happening: a breaking apart of the Atlantic order. The ending copy leans into the apocalyptic resonance — Yeats, Mark 3:25, Lincoln's house-divided speech — without preaching.

---

## v9 — First Playable Build (2026-04-17)

### Added
- Full game loop: map, 34 playable countries, 8 Action Points per quarter, 20 quarters total, Rupture / BRICS-Unit / win-lose-draw endings.
- Action system with 9 Instruments of Power.
- Event system with 23 recurring events.
- Crisis system with 5 flashpoint templates.
- Headlines panel, action log, country dossiers.
- Side-switchable briefings (US / EU).
- Natural Earth 1:110m map via TopoJSON, loaded from CDN.

### Known issues fixed in later versions

- **Rupture trigger too easy** (fixed in v10) — a single `Covert Destabilize` at default tension ended the game.
- **No signalling of upcoming rupture** (fixed in v10) — players had no way to see they were one action from losing.
- **AI too passive** (fixed in v11) — rival never took aggressive or unpredictable moves.
- **CDN dependency** (fixed in v11) — ran libraries from third-party CDNs with no fallback for DSGVO deployment.
- **Missing legal pages** (fixed in v11) — no Impressum, no Datenschutzerklärung.
