NC
HomeGuidesMechanics

Public changelog

NationCraft Online changelog

The changelog is the public record of player-facing updates. It is intentionally concise, but it now links more directly into the guide and mechanics pages that explain the systems behind each release note.

Player-facing updatesPermalinked entriesGuide-linked
2026-04-05Release day

Alliance creation after leaving now ignores stale same-alliance application state (Issue #824)

  • Fixed a regression where nations could be blocked from creating a new alliance after leaving another alliance due to a stale pending join-application row.
  • Leaving an alliance now clears same-alliance pending application state so post-leave alliance creation works as expected.

Dashboard labor values now respect world config overrides (Issue #821)

  • Fixed `/api/nations/{id}/dashboard` labor calculations to use the selected world's resolved config instead of global defaults.
  • Labor regen, daily bonus, acceleration costs, and start-cost displays now match each world's configured labor settings.

Development queue recovery for stranded slot indices (Issue #731)

  • Fixed tick queue processing so build/research rows with invalid `slotIndex` values are repaired to a valid slot instead of getting orphaned.
  • Repaired rows are now processed in the same tick, so stranded pending development can promote and progress normally.
  • If an invalid-row was marked `ACTIVE`, it is safely demoted back to `PENDING` before standard slot arbitration.

Research tick recovery for invalid in-progress state (Issue #730)

  • Fixed a tick-time failure path where a nation with `currentResearchKey` set but missing `currentResearchStartedAtTick` could throw instead of recovering.
  • Tick processing now clears the invalid research state and logs a `ResearchStateRecovered` event so world processing continues deterministically.
  • Corrupt research state in one nation no longer blocks valid research completion for other nations in the same world tick.
  • Existing valid research flows are unchanged; this only recovers malformed in-progress state safely.

Alliance ops: pending application and treaty request notification badges (Issue #820)

  • Alliance Operations Console now surfaces warning badges when there are pending join applications for officers/leaders.
  • Alliance leaders now see a separate pending inbound treaty-request badge so treaty approvals are visible from `/alliance` without opening sub-panels.

Alliance menu: direct alliance detail link (Issue #819)

  • Added `Alliance Detail` to the Alliance sidebar submenu so players can directly open their alliance profile from the Alliance menu.
  • Added `/alliance/detail` resolver route that checks the selected nation’s membership via `/api/nations/{id}` and redirects members to `/alliances/{allianceId}`.
  • Added clear fallback states when no nation is selected, no alliance exists, or membership lookup fails; no-alliance fallback includes a direct `Browse alliances` path.

V5 UI legacy cleanup — migration wrapper removal and doc sync (V5UI.W6.1, Issue #786)

  • Removed the `.v5` migration wrapper class and comment block from `globals.css`; all routes now unconditionally use the Neo-Cartographic design token system.
  • Updated `docs/ui/redesign-parameters.md` status to Shipped and corrected all token values to match the live `globals.css` (background, card, border, sidebar, and all 10 resource accent colors).
  • Added a superseded notice to `docs/ui/ui-philosophy.md` directing readers to `redesign-parameters.md` for canonical shipped parameters; updated identity and default-mode descriptions to reflect the brass/gold command interface.
  • Added Strategy UI design system row to `docs/WHAT_IS_IMPLEMENTED.md`.

V5 accessibility, contrast, and CSS performance guardrails (V5UI.W5.1B, Issue #785)

  • Added automated WCAG 2.1 AA contrast-ratio validation for all core design token pairs (`--foreground`, `--muted`, `--t3`, `--accent`, `--danger`, `--success`, `--warning`) in both dark and light themes. Thresholds: 4.5:1 for body text, 3.0:1 for UI components and tertiary text.
  • Added static-analysis a11y contract tests verifying dialog focus-trap coverage: `FOCUSABLE_SELECTOR` element types, `aria-hidden`/disabled filtering, both Tab directions (forward and Shift+Tab), and container fallback focus.
  • Added CSS perf guardrail tests with documented budgets: file size ≤ 50 KB, `backdrop-filter` ≤ 5, `@keyframes` ≤ 10, `will-change` ≤ 3, animation/transition shorthands ≤ 20. CI emits a structured JSON perf report on each run.
  • All guardrails run in the standard CI suite; any future token or CSS change that violates a threshold will fail CI immediately.
2026-04-03Release day

Settings + Glossary + Help reason-codes v5 route pack E (Issue #781)

  • `/settings` updated to v5 primitives and shared section styling for account/supporter controls.
  • `/glossary` search/form and term cards aligned to shared v5 primitives for consistent public-page UI.
  • `/help/reason-codes` updated to v5 badge/button primitives and layout consistency improvements.
  • Added secondary-page v5 contract coverage for Settings, Glossary, and Help reason-codes routes.
  • No settings/auth/provider API behavior changes.

Light mode completion sweep — tints, accents, shadows, contrast (V5UI.W5.0A, Issue #790)

  • Added `--tx`, `--t2`, `--t3` text-contrast hierarchy tokens to both dark (`:root`) and light (`html.light`) palettes for consistent foreground-text contrast across all migrated routes.
  • Resource dot colors (cash, food, energy, ore, oil, uranium, steel, fuel, munitions, electronics) overridden in `html.light` with saturated, contrast-safe values; `--res-oil` (#e0e0e0) and `--res-munitions` (#b0bec5) were near-invisible on white card backgrounds.
  • Supporter page surfaces (`.supporter-hero`, `.supporter-panel`, `.supporter-panel-premium`, `.supporter-panel-danger` and their `::before`/`::after` pseudo-elements) now have explicit `html.light` overrides replacing the hardcoded dark navy gradients that produced dark-on-dark rendering in light mode.
  • `.text-glow-gold` glow reduced and shifted to light-mode gold in `html.light` to prevent bleed on bright surfaces.
  • `::selection` highlight tinted to light-mode gold in `html.light`.
2026-04-02Release day

Development + Intelligence route pack D v5 migration (V5UI.W4.1D, Issue #780)

  • `/nations/[id]/development` now uses v5 `SectionHeader` for the page header and `Panel` primitives for Eras & Progression, Active Construction Lanes, and Build Options.
  • Development route shape classes were normalized from legacy `rounded-*` utilities to v5 `clip-sm`/`clip-md` tokens for consistent panel/tile corners.
  • `/intelligence/reports` removed redundant `rounded-none` utility overrides on feed cards and badges; existing report behavior and API calls are unchanged.
  • Added route-contract coverage for Development + Intelligence pages to lock shared `SectionHeader`, loading skeleton, and nation-required fallback patterns.

Alliance + World route pack C v5 migration (V5UI.W4.1C, Issue #779)

  • `/world/rankings` and `/world/predictions` now use the `strategy-page` max-width wrapper, aligning with other v5 World routes.
  • `/alliance/members` uses `strategy-page` on both the main view and the loading skeleton for consistent page-width behavior.
  • No-alliance empty states on the Alliance Members page and Alliance Operations Console upgraded from plain `Card` to v5 terminal-style panels with accent-colored border, uppercase mono status label, and descriptive copy.
  • No ranking logic, roster API calls, or pagination behavior changed.

Production route v5 migration (V5UI.W4.1B, Issue #778)

  • `/economy/production` sections migrated from `Card`+`SectionHeader` to `Panel` with eyebrow labels matching v5 game-aesthetic layout.
  • Added four-stat KPI row (Current Focus, Cooldown Ticks, Focus Bonus %, Per-Tick Income) between the hub nav and focus panel.
  • Production-line resource rows now use `strategy-stat-card` tile markup with per-resource accent border tops.
  • Inline danger error divs replaced with `ErrorBanner` across all four data sections (focus, obligations, forecast, warnings).
  • Warning tiles upgraded from `rounded-lg` to `clip-sm` bordered tiles matching v5 warning styling.
  • Added `shrink-0` to resource dot spans to prevent overflow squeeze at 375px.
  • No production logic, API calls, or calculations changed.

Forces + Construction v5 route pack A (Issue #777)

  • Updated `/military/forces` and `/economy/construction` route wrappers with `overflow-x-hidden` to prevent page-level horizontal bleed at narrow mobile widths (375px contract).
  • Updated Construction page header to v5 page convention (`size="page"`, `eyebrow="Economy"`, title `Construction`) for consistency with migrated routes.
  • Replaced route-level `rounded-lg`/`rounded` utility usage on Construction and Forces panels with `clip-sm`; preserved `rounded-full` on the infrastructure-capacity progress bar.
  • No train/build API behavior changes; queue actions remain unchanged.

Root/Login route v5 migration: auth entry shell + register redesign (V5UI.W3.0, Issue #787)

  • New `AuthEntryShell` component consolidates the `<main>` layout skeleton for all auth surfaces (login, forgot-password, register) with a `wide` prop for two-column register layout.
  • Register page migrated to v5 design tokens: `rounded-2xl`/`rounded-lg`/`rounded-full` replaced with `clip-md`/`clip-sm`; hardcoded `text-red-600` error replaced with `text-[var(--danger)]`.
  • Register page labels updated to v5 uppercase mono tracking pattern (consistent with login/forgot-password).
  • Register page submit button adopts the `Button` primitive (`variant="primary"`); OAuth provider links adopt `clip-sm` with `tracking-[0.12em]` pattern.
  • Login and forgot-password pages updated to use `AuthEntryShell` — no visual change, layout contract is now shared.
  • No auth logic, routing, or API changes.

Market route: order form/open orders/error-state integration (V5UI.W3.3B, Issue #783)

  • Side selector border/shadow now reflects selection: green (`--success`) for BUY, red (`--danger`) for SELL.
  • Price and quantity inputs show a red border when a non-empty value is non-positive; a role="alert" inline hint appears below the input grid.
  • Order feedback (success/blocked) moved from page-top to inside the place-order card, just above the Execute Trade button.
  • Cancel button in open order rows changed to `variant="danger"` for destructive-action clarity.
  • Open order rows now display a color-coded Badge (green BUY / red SELL) for at-a-glance side identification.
  • All raw inline danger-border `<div>` error blocks replaced with the shared `ErrorBanner` component (book, orders, summary, forecast, explain); each gets a Retry button.
  • Risk warning `<p>` elements replaced with `<div>` for correct block semantics in cap-warning and warnings list.
  • No route-level logic or API changes.

War Room: attack controls, sticky CTA guard, and feed pending state (V5UI.W3.2B, Issue #782)

  • Sticky mobile attack CTA (`StickyActionBar`) now disables the primary button while an attack request is in-flight (`isPrimaryDisabled={attacking}`), preventing double-tap submissions.
  • `WarResultsFeed` now accepts a `pendingCount` prop; when greater than zero it renders an accent-bordered banner: *"N attack(s) pending — resolves on next tick."*
  • War Room page passes `pendingCount={optimisticRows.length}` to surface optimistic rows as an explicit feed-level pending state.
  • Page outer container already carries `overflow-x-hidden`; no horizontal overflow is introduced at 375px.
  • No combat logic or API behavior changes.

Market route: responsive layout and order book a11y improvements (Issue #776)

  • Resource filter now uses a 2-column grid at mobile widths; the resource select spans both columns, preventing single-column stacking at 375px.
  • Order book / place-order form split now activates at `lg` (1024px) instead of `xl` (1280px), making tablets usable side-by-side.
  • Bid rows now display a ▲ glyph before the price; ask rows display ▼; section headers updated to "▲ Bids" / "▼ Asks" for non-color bid/ask distinction.
  • Added `aria-label` on each order book row describing level, price, and quantity for screen reader users.
  • Added `min-w-0 truncate` on price/quantity spans and `shrink-0` on badges to prevent flex overflow at narrow widths.
  • No data, API, or route logic changes.

War Room UI: responsive layout and combatant panels (Issue #775)

  • War Room combatant panel grid now switches to side-by-side at 768px (`md`) instead of 1280px (`xl`), making the tablet range usable.
  • Added `min-w-0` to both nation panels so grid columns can shrink below content-intrinsic width, preventing horizontal overflow at 375px mobile.
  • VS card padding reduced to `py-2` on mobile and restored to `py-4` at `md+`; VS text scales from `36px` → `44px` → `56px` across `base`/`md`/`xl` breakpoints.
  • Page root (`overflow-x-hidden`) prevents horizontal viewport bleed on narrow screens.
  • No combat logic or API behavior changes.

Dashboard route v5 migration: command bar and glance section (Issue #774)

  • Added responsive command bar below KPI cards: desktop shows a horizontal bar with icon + label + sublabel for Develop / Military / Market / Aid; mobile shows a 4-column icon grid.
  • Added `DashboardGlanceSection` wrapper: mobile collapses the Readiness & Brief panel behind a toggle (`aria-expanded`); desktop always shows the side-by-side checklist + brief grid.
  • Loading skeleton height increased to `h-64` to match the taller loaded layout.
  • Existing checklist and brief logic are unchanged; new components are pure layout wrappers.

V5 primitives pack B: form controls, loading/empty/error states (Issue #769)

  • Added `Input`, `Select`, `Textarea` React primitives sharing a `FORM_BASE` style constant — forms on migrated pages no longer fall back to browser-default chrome.
  • Added `FormField` wrapper (label + hint/error slot) and `InlineError` (`role="alert"`) for consistent field-level error display.
  • Added `EmptyState` component with optional icon, title, description, and action slots.
  • Enhanced `LoadingSkeleton` with `count` (multi-row) and `variant` (`block`/`text`/`circle`) props and `aria-busy` for screen readers.
  • Base CSS layer now gives all raw `<input>`, `<select>`, and `<textarea>` elements full token-based styling (border, radius, padding, placeholder, focus ring, disabled state).
  • Added `prefers-reduced-motion` override to disable skeleton pulse animation and fall back to a static dimmed element.

V5 primitives pack A: button, badge, card, data cell (Issue #767)

  • Updated shared v5 primitives to reduce one-off route styling: `Button`, `Badge`, `Card`, and new `DataCell`.
  • Added semantic `Badge` variants (`ok`, `dg`, `wn`, `bl`) with consistent token-based rendering in light and dark themes.
  • Added `Card` and `DataCell` interactive hover mode using the shared v5 card/border tokens.
  • Button loading/disabled states are now consistently non-interactive and expose accessibility state (`aria-disabled`, `aria-busy`).

Shell and navigation: header, sidebar, and mobile drawer (Issue #765)

  • Desktop sidebar is now a persistent **220px** panel at 1024px and wider breakpoints.
  • Mobile sidebar is hidden by default and opens as a full-height overlay drawer; the dark backdrop closes it on tap.
  • Closing the mobile drawer via backdrop or route change now returns keyboard focus to the hamburger trigger.
  • Shell root now sets `overflow-x-hidden` to prevent horizontal scroll bleed from the off-canvas drawer.
  • Z-index layer ordering aligned with the `--z-*` token system: header (60), mobile overlay (65), drawer (70), feedback modal (80), toast (90).

Security: tightened CSP connect-src to explicit allowlist (Issue #762)

  • Replaced `connect-src 'self' https:` wildcard with an explicit allowlist of required origins (first-party, Google Ads/DoubleClick, Tag Services).
  • Added regression tests to prevent reintroduction of the `https:` wildcard scheme.
  • Added `docs/security/csp-connect-src-allowlist-20260402.md` documenting ownership and the change process.
2026-04-01Release day

Feedback ticket draft import/export recovery flow (Issue #808)

  • Added an **Import draft** action in the feedback modal to restore ticket fields from exported JSON after a failed submit or page refresh.
  • Import only restores recognized fields (category, title, description, repro steps, raw mockup, severity, debug-context toggle), ignores unknown keys, and resets stale screenshot attachment state.
  • Added explicit save-draft guidance in submit-error state to use **Copy report** or **Download JSON** before retrying.

V5 UI foundation: tokens, focus, motion, layering (Issue #763)

  • Added `--z-*` z-index token system (10 named layers) to replace ad-hoc numeric stacking values.
  • Added global `:focus-visible` baseline so interactive controls show a visible keyboard-focus ring without affecting pointer interaction.
  • Added global `prefers-reduced-motion` baseline that collapses all animation and transition durations for users who opt in.
  • Added `.v5` migration wrapper class (`isolation: isolate`) as a stacking-context anchor for incrementally migrated routes.
2026-03-31Release day

Snapshot parity coverage hardening (Issue #766)

  • Expanded admin snapshot capture/restore coverage so newer gameplay tables are included consistently in backup/replay snapshot paths.
  • Added snapshot coverage documentation and parity-guard expectations so newly added Prisma models must be explicitly classified instead of silently omitted.

Retroactive era-event award grants (Issue #770)

  • Era milestone awards (era-state, era-nation, era-power, era-legacy) now grant retroactively for any nation at or beyond the required era. Nations that advanced past a milestone without receiving the award in the exact tick window will now earn it on the next tick evaluation.
2026-03-30Release day

Market order escrow hardening (Issue #757)

  • Market orders now reserve escrow at placement instead of only validating balances: SELL orders reserve resource quantity, and BUY orders reserve the full bid cash (`quantity × price`).
  • Canceling an open market order now refunds the remaining escrow consistently.
  • Fill settlement now consumes escrowed amounts and returns any BUY-side bid-over-clear difference to free cash, preventing multi-order overcommit exploits across ticks.
2026-03-28Release day
2026-03-27Release day

War Coordination Dashboard UI (P2.4C)

  • Added **War Overview** panel to the Alliance Wars Board with All / Offensive / Defensive status filters.
  • Added **Target List** panel showing alliance war targets with HIGH/MEDIUM/LOW priority badges and assigned member names.
  • Added **Contribution Tracker** table sortable by attacks, damage, loot, or command (click to sort, click again to reverse).
  • Added **Attack Scheduler** panel that posts structured `[ATTACK SCHEDULE]` messages to alliance chat (informational only — no tick engine enforcement).
  • Added **Member Availability** panel that posts structured `[AVAILABILITY]` messages to alliance chat for tick window coordination.

Feedback report error messaging clarity (Issue #694)

  • The feedback modal now shows specific failure messages when report submission fails (for example: rate-limited with wait time, server temporarily unavailable, auth required, and server error).
  • Network failures now show a distinct fallback message so players can clearly tell when the submit attempt failed due to connectivity.

Daily reward clarity on dashboard (Issue #637)

  • The Tick-Day Checklist now explains what the daily reward does before claiming: it shows the exact cash payout and the streak day your claim will advance to.
  • The action copy is now explicit (`Claim Reward`), and the full checklist claim button shows the exact payout amount (for example, `Claim $25,000`).

Research tutorial mobile alignment fix (Issue #692)

  • Fixed the research page tutorial card positioning on narrow screens so it is centered horizontally instead of left-shifted.
  • Fixed the dismissed-state **Resume tutorial** button to use the same mobile-centered placement, while preserving existing bottom-right placement on `sm+` screens.

Company upgrades + UI (P6.5D)

  • Companies can now be upgraded up to level 5 via `POST /api/nations/[id]/companies/[companyId]/upgrades`; each upgrade costs $50,000 cash and grants +5 worker slots.
  • Added `GET /api/nations/[id]/companies/[companyId]/revenue` to retrieve the last 10 revenue ticks for a company (owner and worker-share breakdown).
  • Added **Company Management** panel to the nation dashboard: upgrade shop with live cash check, worker assign/recall with capacity display, and revenue history table.

Newspaper UI (P6.4B)

  • Added public `/world/newspaper` with **Latest** and **Trending** sort tabs plus category filters.
  • Added in-page article editor with markdown write/preview tabs and publish flow.
  • Article cards now show upvote actions, featured badge state, and linked author nation profiles.
  • Added public `GET /api/public/newspaper` feed endpoint (no login required to read).
  • Upvotes now grant a small author prestige reward via `PRESTIGE_ARTICLE_UPVOTE` world config.

Arena + betting + predictions UI (P2.3D)

  • Added **Prediction Markets** page at `/world/predictions` with search by question, filter by resolved status and condition type, and per-prediction YES/NO bet placement with pool size and implied odds readout.
  • Added inline **Create Prediction** form on the predictions page (question, condition type + params, target tick offset, 5,000 cash listing fee).
  • Added **implied odds percentage bar** to the Public Wager Pool section on the Arena page showing challenger % vs defender % computed from live pool sizes.
  • Added **Predictions** (🔮) link to the World section of the sidebar, pointing to `/world/predictions`.

Prediction markets (P2.3C)

  • Nations can now create **Prediction Markets** with a question, condition (price threshold, alliance member count, or nation era), and a target tick at which the condition is evaluated.
  • Creating a prediction requires a listing fee of 5,000 cash (cash sink).
  • Any nation can bet YES or NO on a prediction via `POST /api/predictions/[id]/bets`; cash is deducted immediately.
  • At the target tick the condition is evaluated deterministically against the live world state; winners split the pool proportionally minus a 5% house fee. VOID outcomes (e.g., non-existent target) refund all bets.
  • API: `POST /api/predictions` (create), `GET /api/predictions` (list), `GET /api/predictions/[id]/bets` (view bets).

Spectator betting system (P2.3B)

  • Added `ArenaBet` model for durable, indexed bet storage (matchId, bettorNationId, side, amount, settled, payoutAmount).
  • Bet placement via `POST /api/arena/matches/[id]/bets` deducts cash atomically and rejects bets at or after the resolution tick.
  • `GET /api/arena/matches/[id]/bets` returns pool sizes, lock status, and all bets for a match.
  • Parimutuel settlement runs at tick time when a match resolves: winners split the total pool proportionally minus a 5% house fee; cash is credited automatically.

National Newspaper — Article model + publishing API (P6.4A)

  • Nations can now publish **Articles** (up to 1 per tick-day) with a title (100 chars), markdown body (5000 chars), category (NEWS / PROPAGANDA / EDITORIAL / GUIDE / FICTION), and optional tags.
  • Added `POST /api/nations/[id]/articles` to publish an article and `GET /api/nations/[id]/articles` to list a nation's articles.
  • Added `GET /api/articles` for world-scoped article listing with **recency** and **trending** (top upvoted) sort modes.
  • Added `GET /api/articles/[id]` to read a single article and `DELETE /api/articles/[id]` for author-only deletion.
  • Added `POST /api/articles/[id]/upvote` — one upvote per nation per article; the top-upvoted article per tick-day is automatically marked as **featured**.
  • Added `POST /api/articles/[id]/report` — reported articles are immediately hidden pending admin review.

Company data model + creation (P6.5A)

  • Nations can now found a **Company** — a nation-owned economic enterprise of type MINING, ARMS, TRADE, TECH, or ENERGY.
  • Each nation may have one active company; a second cannot be founded unless the existing company is dissolved.
  • Worker capacity (`workerSlots`) is derived at founding from `floor(population × 0.05)` and is fully server-authoritative.
  • Added `POST /api/nations/[id]/companies` to found a company and `GET /api/nations/[id]/companies` to list a nation's companies.

Worker assignment mechanics (P6.5B)

  • Added `GET/POST/DELETE /api/nations/[id]/companies/[companyId]/workers` for server-authoritative worker assignment management.
  • Workers can now be assigned cross-nation within the same world (not restricted to company owner nation).
  • Added a config-driven 3-tick reassignment cooldown (`COMPANY_WORKER_REASSIGN_COOLDOWN_TICKS`) to block rapid worker shuffling.
  • Added worker expulsion on non-war-game war declaration: workers assigned between the attacker and defender nations are removed automatically.
  • Worker capacity is tracked server-side using `floor(population × COMPANY_WORKER_CAPACITY_POPULATION_RATIO)`.
2026-03-26Release day

War room UI (P6.3C)

  • Added **War Room Snapshot** panel showing attacker readiness, defender resistance, ticks elapsed/remaining, and a timeline progress bar. Participants (INTEL tier) see exact percentages; spectators see banded labels (High / Medium / Low).
  • Added **Feed Commentary** section below the live feed — deterministically generated summaries of the last 5 attack events.
  • When a war ends, a banner now appears with a direct **View War Archives** link and a 10-second countdown, then auto-redirects to the War Archives page.

War room commentary (P6.3B)

  • Nations can now post text comments on any war in their world via the war room page, with comments visible to all nations in the same world.
  • Comment rate limit: max **5 comments per tick per nation** across all wars.
  • Each comment displays the commenter's nation name, alliance (if any), and prestige title (if Distinguished or above).
  • Added `GET/POST /api/wars/[id]/comments` — GET lists the 50 most recent comments; POST creates a new comment and logs a `WarCommentPosted` event.

Seasonal badges + leaderboard UI (P6.2B)

  • Added 4 seasonal badge types awarded to nations at season end: **Season Champion** (rank #1), **Top Alliance** (member of a top-3 ranked alliance), **Elite Contender** (top 10), and **Season Participant** (all participants).
  • Added seasonal leaderboard page at `/statistics/seasonal` with a Nations tab (rank, composite score, badge labels, optional per-component breakdown) and an Alliances tab (ranked by total member score).
  • Added `GET /api/stats/seasonal` world-scoped stats API with pagination.
  • Added `POST /api/admin/seasonal/badges/mint` admin endpoint for idempotent badge minting (auto-derives from standings or accepts explicit nation→badge mappings). Emits `AdminSeasonalBadgesMinted` audit event.
  • Badge cutoffs (`SEASON_CHAMPION_RANK_CUTOFF`, `SEASON_TOP_ALLIANCE_COUNT`, `SEASON_ELITE_CONTENDER_RANK_CUTOFF`) are world-config–driven and overridable. See `docs/specs/seasonal_badges.md`.

Season scoring + end processing (P6.2A)

  • Competitive seasonal worlds now support a configurable `seasonEndTick`; when the tick engine reaches that tick, final standings are calculated and the world is frozen (no further play).
  • Composite scoring formula: infrastructure (25%), wars won (20%), market volume (15%), alliance rank by member count (15%), prestige (15%), merits (10%); all components are max-normalized so the top nation in each category scores full weight.
  • War archives are preserved on season end — historical war data remains accessible.
  • A public `SeasonEnded` event is emitted containing the final nation count and the top-ranked nation.

World events UI (P6.1C)

  • Added **World Events** page (`/events`) showing the active seasonal event, modifier badges, community progress bar, upcoming event schedule, and event history with success/missed outcomes.
  • Dashboard now shows a compact inline banner between the nation header and KPI cards — green "Active Event" badge when an event is live, neutral "Next Event" badge otherwise — both linking to the events page.
  • Added **World Events** navigation entry under the World section.
  • Event selection, modifier application, community progress, and history are all deterministic and tick-based (no server round-trip required).

Community goals system (#613)

  • Added world-scoped **community goals** that track shared server progress against deterministic, config-driven targets.
  • Tick processing now evaluates active goals and resolves completion state server-side as nations contribute progress.
  • Nations can now see active goal progress and completion outcomes through the game surfaces backed by this new system.

World war live feed API (P2.1D)

  • Added `GET /api/world/wars/[id]/live` for authenticated live war updates, including per-side running counters (damage, loot, landed attacks) and current domain-control state.
  • Added cursor-style feed pagination via `sinceEventId` and `limit` for incremental polling without reloading the full war event history.
  • Enforced world scoping on live-war reads: nations can only access war feeds from their own world (`WORLD_SCOPE_MISMATCH` on cross-world access).

Seasonal world events (P6.1A)

  • Added deterministic **seasonal world events** (config-gated) that announce upcoming events ahead of cycle start and publish activation events to the world feed.
  • Active world events now apply config-driven global modifiers to resource/cash production and market trade fees each tick.
  • Build and unit-training cost calculations now support world-event runtime cost multipliers.

Protectorate war-declaration approvals + treaty restrictions (P5.3B)

  • War declarations initiated by a protected (vassal) alliance now enter a **pending protector approval** state instead of queuing immediately.
  • Protector alliance leaders can now review pending declarations from alliance management and either **approve** (queues war) or **veto**.
  • Pending declarations auto-approve after a config-driven timeout (`TREATY_PROTECTORATE_WAR_DECLARATION_APPROVAL_WINDOW_TICKS`).
  • Protected alliances are now blocked from signing new non-protectorate treaties with alliances their protector is currently at war with or has actively embargoed.
  • Public nation profiles now show **Protectorate Obligations** when a nation is in an active protectorate, including tribute and war-approval window details.
2026-03-25Release day

Convoy data model + creation (P4.4A)

  • Nations can now dispatch **trade convoys** to other nations, deducting multi-asset cargo from the sender at departure and recording an `IN_TRANSIT` convoy record.
  • Transit duration is determined by diplomatic relationship: **1 tick** for same-alliance or treaty partners, **2 ticks** for nations in different alliances with no treaty, **3 ticks** for at least one unaffiliated nation.
  • Convoys carry an optional `escortStrength` field for future interception mechanics.
  • Underlying `Convoy` model is fully world-scoped with cascade-delete.

Convoy UI + Logistics tab (P4.4D)

  • Added `GET /api/convoys/list` endpoint returning a nation's sent/received convoys (full cargo detail) plus all in-transit convoys in the world (cargo bracket only — small/medium/large).
  • Added **Logistics** tab under `/economy/logistics`: view sent, received, and world-visible convoys, plus interception notifications showing stolen cargo and theft percentage.
  • All nations can see in-transit convoy IDs, sender names, and approximate cargo bracket; full cargo is visible only to sender/recipient.

Interception mechanics + escorts (P4.4C)

  • Added `POST /api/transfers/intercept` for convoy interception attempts; attempts are only allowed for nations in an active war with the convoy sender and spend configurable Command on each valid attempt.
  • Interception odds are deterministic and config-driven: `attackerNavalStrength / (attackerNavalStrength + escortStrength + baseDefense)`, with a seeded roll from world seed + tick + convoy id.
  • Successful interceptions steal a deterministic partial share of cargo (between configurable 30%-60% based on attacker strength ratio), and the remaining cargo stays in transit to the recipient.
  • Escort strength now applies an upfront munitions upkeep cost at convoy creation for the full transit duration.

Protectorate tribute + automatic war entry (P5.3A)

  • Vassal alliances now pay a **per-tick income tribute** (10% by default, configurable 5–20%) to their protector at each tick. The tribute is deducted from each vassal nation's income and credited to the protector's LEADER nation.
  • **Automatic war entry**: when a protector is attacked, all vassal alliances auto-enter the war on the protector's side (and vice versa — protector defends vassal). Auto-entry creates a war against the original attacker.
  • **Dissolution notice**: a vassal that cancels a PROTECTORATE treaty gives 24-tick advance notice (treaty remains active until then). The protector can dissolve immediately without notice.
  • Dissolution notice is published to the world feed as a `TreatyDissolutionNotice` event.

Agent placement model + mechanics (P5.2A)

  • Nations can now **plant agents** inside enemy nations via the new `POST /api/espionage/agents` endpoint, costing 20 Command points per attempt.
  • Success chance is deterministic: base 50% + 10% per espionage tier − 8% per target counter-intel tier, clamped between 5% and 95%.
  • Each nation has an **agent limit** based on era (Settlement: 1 → Legacy: 5) plus a bonus for espionage-tier tech nodes.
  • **ACTIVE agents are invisible** to their target nation — only detected (EXPELLED / TURNED / RECALLED) agents appear in the target's view.
  • `GET /api/espionage/agents` lists your planted agents; the visibility gate is enforced server-side.

Passive intel snapshots + counter-intel sweeps (P5.2B)

  • ACTIVE planted agents now generate passive intel snapshots on a fixed 6-tick cadence (configurable via `SPY_AGENT_INTEL_SNAPSHOT_INTERVAL_TICKS`).
  • Added manual counter-intel sweep endpoint: `POST /api/espionage/counter-intel-sweep` (nation-owned, rate-limited), which spends Command and deterministically checks for hostile agents on your territory.
  • Sweep detection threshold is config-driven (`SPY_COUNTER_INTEL_SWEEP_BASE_DETECTION_THRESHOLD` + per-tier counter-intel bonus), and detected agents are expelled.
  • Passive counter-intel detection now runs each tick using a small per-tier chance (`SPY_PASSIVE_DETECTION_BPS_PER_COUNTER_INTEL_TIER`) and can expel ACTIVE hostile agents over time.
  • Expulsions emit public world-feed events and nation-private sweep audit events so detections are visible and traceable.

Alliance intelligence sharing + UI (P5.2D)

  • Alliance leaders can now **opt in to alliance intel sharing** via `POST /api/espionage/alliance` — when enabled, resolved spy operations from all alliance members are visible to every member.
  • New `GET /api/espionage/alliance` endpoint returns sharing status, aggregate spy metrics (total ops, pending ops, active planted agents, member count), and the shared op feed when sharing is enabled.
  • The Intelligence Operations page now shows three new panels: **Planted agents** (your active ACTIVE agents with target and concealment), **Counter-intel history** (resolved incoming ops against your nation), and **Alliance intelligence** (metrics, leader enable/disable controls, and shared feed).
  • `intelSharingEnabled` defaults to `false` — existing alliances are unaffected until a leader explicitly enables it.

Double agents (P5.2C)

  • When a SCOUT operation is **detected** (30% chance, deterministic), the defending nation can **turn the agent** into a double agent via `POST /api/espionage/turn` (costs 20 Command).
  • A turned agent continues appearing active to the attacker — but intel reports are replaced with **fabricated data** (fake resource counts, military composition, and improvement counts).
  • Attackers can spend 10 Command to **verify** their agent's status via `POST /api/espionage/verify`. The check has a 60% chance to reveal whether the agent has been turned.
  • Double agent status persists until the attacker recalls or the verify check succeeds.

Visibility tier computation + API filtering (P5.1A)

  • Nation profile API now computes a **visibility tier** (PUBLIC / TREATY / ALLIANCE / INTEL) for each viewer–target pair based on alliance membership, active treaties, active wars, and intelligence snapshots.
  • At **PUBLIC** tier (anonymous or unrelated viewers), exact military unit counts are hidden and replaced with a bracket label (Small / Medium / Large / Massive).
  • At **TREATY** tier (active treaty or ongoing war), exact military unit counts are revealed but treasury remains private.
  • At **ALLIANCE** tier (same alliance), exact military counts and treasury balance are both disclosed.
  • At **INTEL** tier (own nation or active intel snapshot), full data including exact cash is revealed.
  • Cash is represented as a bracket label (`<$10k` / `$10k-100k` / `$100k-500k` / `$500k-1M` / `$1M+`) for lower-visibility viewers.
  • Bracket thresholds are config-driven via `VISIBILITY_CASH_BRACKET_THRESHOLDS` and `VISIBILITY_MILITARY_BRACKET_THRESHOLDS` in world config.
  • The public nation profile page now shows a bracket label in the Military Snapshot header when exact counts are unavailable, and hides the unit breakdown grid for PUBLIC-tier viewers.

Fog UI + world rankings (P5.1C)

  • **Visibility tier badge** now appears on every public nation profile, showing your current access level: *Public View*, *Treaty Access*, *Alliance Access*, or *Intel Access (Full)*. The badge is colour-coded (grey / blue / green / gold).
  • **Restricted-data panel**: when your visibility is PUBLIC tier, the Military Snapshot section shows a styled "Data Restricted" notice explaining what relationship is required to unlock exact unit counts, replacing the previous plain-text message.
  • **Fog rankings mode**: the world rankings leaderboard now requests data in fog mode (`fog=rankings`). Nations outside your alliance have their score value masked as **Hidden** while their rank position is preserved. You always see exact values for your own nation and alliance-mates.
  • **Top-Movers cache hygiene**: only rows with visible (exact) values are written to the 24h movers snapshot, preventing fog-masked null values from corrupting the delta computation.
  • **Nation directory**: the directory continues to expose only PUBLIC-tier data (name, alliance, era, infrastructure, protection) — no military counts or treasury data is included.

Intel snapshot lifecycle for SCOUT ops (P5.1B)

  • Successful **SCOUT** operations now create an `IntelSnapshot` record for the attacker-target pair with full target nation data captured at resolve time.
  • Intel snapshots expire automatically after a config-driven duration (`INTEL_SNAPSHOT_DURATION_TICKS`, default 12 ticks / 24h), after which visibility falls back to normal tier rules.
  • Ongoing war opponents automatically receive **TREATY** visibility, and war status does not auto-upgrade to **INTEL**.

Black Market UI — order listings, buy/sell interface, and transaction history (P4.3C)

  • Added **Black Market** tab to the Intelligence section of the navigation (under Military).
  • New page at `/intelligence/black-market` with three tabs: **Listings**, **Place Order**, and **My History**.
  • Order book shows open listings with anonymized seller handles for anonymous listings, and highlights Contraband listings with a gold premium border.
  • Buy interface lets nations purchase intelligence or contraband listings directly from the order book.
  • **Place Order** form allows nations to list a spy operation result (SCOUT → Intelligence, successful SABOTAGE → Contraband) with optional anonymous posting.
  • **My History** tab shows participant-only transaction history with role (Buyer/Seller), counterparty, price, and report payload for purchased intelligence.

Black Market anonymous listings and intelligence trading (#597)

  • Added Black Market intelligence/contraband listings backed by `SpyOp` records, with listing lifecycle states (`OPEN`, `SOLD`, `CANCELLED`, `EXPIRED`).
  • Listings can be posted anonymously for an extra fee (`BLACK_MARKET_ANONYMOUS_FEE_BPS`), and anonymous listings hide seller identity from buyers.
  • SCOUT reports can be sold as intelligence, and buyers receive the full espionage report payload on purchase.
  • Contraband listings now require a **successful SABOTAGE** operation and can only be traded through the Black Market listing flow.
  • Black Market listing/trade events are private (`NATION` visibility) and are not published to the public world activity feed; participant-only transaction history is available at `/api/black-market/history`.

Black Market orderbook matching and embargo bypass fee (#596)

  • Black Market buy/sell orders now match deterministically each tick with price-time priority by resource.
  • Executed Black Market trades apply a base **8% fee** (`BLACK_MARKET_FEE_BASE_BPS`).
  • Trades between parties in an active embargo relationship are now allowed on the Black Market but apply an additional **30% embargo bypass premium** (`BLACK_MARKET_EMBARGO_BYPASS_PREMIUM_BPS`), for a total **38% fee**.
  • Executed trades publish `BlackMarketTradeExecuted` event logs with fee and embargo-bypass details.

Prestige UI, badges, and breakdown page (P4.1C)

  • **Profile badges**: Nations earn permanent prestige badges at each tier milestone — *Notable Nation* (tier 1), *Trusted Contractor* (tier 2), *Eminent Power* (tier 3), *Illustrious Empire* (tier 4), and *Legendary Legacy* (tier 5). Badges are tracked via peak tier and **persist through prestige decay**.
  • **Title display**: The prestige tier title (e.g. "Distinguished") is now displayed on public nation profiles and in the Nations Directory alongside each nation's name.
  • **Prestige breakdown page**: A new page at `/nations/[id]/prestige` shows prestige score, earned badges, tier thresholds with achieved/locked status, decay settings, prestige sources reference table, and recent prestige event history (last 20 accumulations and decay events).
  • **Directory integration**: Prestige titles appear as chips under nation names in the Nations Directory for nations that have earned one.

Prestige decay, named tiers, and diplomatic weight (P4.1B)

  • **Prestige decay**: Inactive nations (no login for 24+ ticks) now lose 1% of their prestige per tick-day. Decay is applied at most once per tick-day and is configurable via `PRESTIGE_DECAY_RATE_BPS` and `PRESTIGE_DECAY_INACTIVITY_THRESHOLD_TICKS`.
  • **Named prestige tiers**: Six tiers now reflect your legacy — **None** (0), **Notable** (100+), **Distinguished** (500+), **Eminent** (1,000+), **Illustrious** (2,500+), and **Legendary** (5,000+).
  • **Diplomatic weight**: Nations at Distinguished tier or above (500+ prestige) earn diplomatic weight — treaty proposals from these nations are highlighted, and they display a "Trusted Contractor" badge on bounty listings. This is a visibility bonus only and does not affect any game mechanic formulas.
2026-03-24Release day

Alliance leadership elections (P3.2C)

  • Alliance leaders can now open a formal **leadership election** via `POST /api/alliances/[id]/elections`.
  • Two election methods supported: **Plurality** (most votes wins with tie-break by seniority) and **Instant-runoff ranked-choice** (candidates ranked; lowest eliminated each round).
  • Elections run in two phases: **Nomination** (members nominate candidates) followed by **Voting** (members cast ballots).
  • Elections can be triggered manually by the leader, automatically when the leader is inactive for a configurable number of ticks, or on a recurring cycle.
  • The tick engine resolves elections when their voting window closes, transferring leadership to the winner and logging a `LeaderElectionConcluded` event.

National Prestige data model + tick engine calculation (P4.1A)

  • New `PrestigeRecord` model tracks each nation's `currentPrestige`, tier, and `lastActivityTick`.
  • Prestige accumulates at tick time from config-driven weighted sources: wars won (scaled by enemy strength), wars survived as defender, market trades, active treaties, wonders completed, merits earned, active play, and alliance leadership.
  • All weights are world-config-driven (`PRESTIGE_WEIGHT_*`) and fully deterministic.

Gold supporter tier benefits (P4.2C)

  • **API access tokens**: Gold supporters can generate up to 10 personal API tokens (labeled, SHA-256 hashed) for use with third-party tools. Manage tokens at `GET/POST /api/supporter/gold/tokens` and revoke via `DELETE /api/supporter/gold/tokens/[id]`.
  • **CSV data exports**: Three new Gold-gated datasets added to the supporter history export: `resources` (current nation resource snapshot), `production` (tick-production events), and `war-history` (war action events).
  • **Historical replay viewer**: `GET /api/supporter/gold/replay` returns nation event history grouped by tick, enabling step-through replay of nation history.
  • **Custom profile slug**: Gold supporters can claim a vanity URL slug for their public nation profile (`GET/POST /api/supporter/gold/profile/slug`). Public profiles are accessible to anyone at `GET /api/nations/public/[slug]`.
  • **Custom alliance banner**: Alliance leaders with Gold status can set a custom banner image URL for their alliance (`GET/POST /api/supporter/gold/alliance/banner`).
  • **Priority bug queue**: Bug reports submitted by Gold supporters are automatically stamped `priorityQueueTier: GOLD`. Admins can filter the bug queue by `?queue=gold|standard|all`.

Surrender terms data model + composer API (P3.3A)

  • New `SurrenderTerms` model tracks formal negotiation records per war: proposer, typed term conditions (JSON array), custom treaty name, status (`PROPOSED`/`ACCEPTED`/`DECLINED`/`COUNTERED`/`EXPIRED`), and counter-round.
  • New `ReparationObligation` model stores post-war debt rows created when terms are accepted: debtor/creditor nation, asset, total/paid amount, per-tick payment schedule, start/end tick, and status.
  • Five term condition types supported: **cash lump sum**, **cash installment**, **resource tribute**, **forced treaty**, and **non-aggression window**.
  • Propose/accept/decline/counter API under `POST /api/wars/[id]/surrender-terms` and `/api/wars/[id]/surrender-terms/[termsId]/{accept,decline,counter}`.
  • Counter-offer negotiation is capped at 3 rounds (`WAR_SURRENDER_TERMS_MAX_COUNTER_ROUNDS`); fourth counter returns a 400.
  • Accepting terms ends the war immediately and creates `ReparationObligation` rows for all payable conditions.
2026-03-23Release day

Alliance governance: vote tallying + auto-execution (P3.2B)

  • Proposals now automatically resolve at tick-time when their voting window closes (deterministic, server-authoritative).
  • Three threshold modes supported per proposal: **Simple majority** (>50%), **Supermajority** (>66%), and **Leader override** (leader YES vote auto-passes).
  • Quorum check enforced: a configurable minimum number of member votes must be cast or the proposal is rejected.
  • Passed proposals auto-execute: `DECLARE_WAR` activates alliance war mode, `ENACT_EMBARGO` creates an active embargo, `LIFT_EMBARGO` lifts an existing embargo, `KICK_MEMBER` removes the member, `PROMOTE_MEMBER`/`DEMOTE_OFFICER` updates the member's role, and `ELECT_LEADER` transfers alliance leadership.
  • Emergency proposals (`isEmergency: true`) require supermajority to pass.
  • A `GovernanceProposalResolved` event is logged to the alliance event log for each resolved proposal.

Alliance proposal and voting system (P3.2A)

  • Alliance leaders and officers can now create governance proposals via `POST /api/alliances/[id]/proposals`.
  • Eleven proposal types are supported: `DECLARE_WAR`, `OFFER_PEACE`, `APPROVE_TREATY`, `ENACT_EMBARGO`, `LIFT_EMBARGO`, `KICK_MEMBER`, `PROMOTE_MEMBER`, `DEMOTE_OFFICER`, `ELECT_LEADER`, `CHANGE_POLICY`, and `CUSTOM`.
  • Each proposal has a configurable voting window (default: 6 ticks / 12 h); members cast `YES`, `NO`, or `ABSTAIN` votes via `POST /api/alliances/[id]/proposals/[proposalId]/votes`.
  • Members can change their vote while the proposal is open; duplicate votes are prevented by a unique constraint.
  • Quorum and pass-threshold are configurable per-world (`ALLIANCE_PROPOSAL_QUORUM_MEMBER_COUNT`, `ALLIANCE_PROPOSAL_PASS_THRESHOLD_PCT`).
2026-03-22Release day

Supporter Silver and Gold tiers (#593)

  • Added **Silver** ($9.99/month) and **Gold** ($19.99/month) supporter subscription tiers alongside the existing Bronze ($4.99/month) tier.
  • Each tier grants one Supporter Pack per billing cycle; tier is tracked per billing cycle and stored server-side.
  • Silver and Gold packs are tracked separately (`silverSupporterPacks`, `goldSupporterPacks`) to support future tier-specific perks.

Embargo UI and public registry (P3.1C)

  • New **Embargo Management** page at `/diplomacy/embargoes` — alliance leaders can enact embargoes against nations or alliances, set optional durations, and lift active embargoes.
  • New **Embargo Registry** public page at `/embargoes` — unauthenticated listing of all active embargoes with enacting alliance and target names resolved.
  • Nation public profiles now include an `embargoes` field listing active nation-targeted embargoes.
  • New `GET /api/embargoes` authenticated endpoint for listing imposed embargoes by alliance.
  • New `GET /api/public/embargoes` unauthenticated endpoint powering the public registry.

Embargo enforcement: market + transfers (P3.1B)

  • Market order book now hides orders from embargoed nations/alliances — both sides of an embargo lose visibility into each other's orders (symmetric).
  • Tick-engine market matching skips trades between embargoed nation pairs, preventing embargoed orders from filling server-side.
  • Nation-to-nation resource/cash transfers are blocked (`TRANSFER_EMBARGO_BLOCKED`, HTTP 409) when any active embargo covers the sender or recipient.
  • Alliance bank deposits and withdrawals are blocked (`InternalSanctionBlocked`) for members whose own alliance has imposed an internal sanction (nation-level embargo) on them.

Embargo / Sanctions system (P3.1A)

  • Alliance leaders can now enact embargoes against nations or alliances via `POST /api/embargoes/enact`.
  • Enacting an embargo against an alliance automatically breaks any conflicting treaties between the two alliances.
  • Embargoes support optional durations; when `expiresAtTick` is reached the engine auto-expires them each tick.
  • Alliance leaders can lift an active embargo early via `POST /api/embargoes/lift`.
  • `EmbargoEnacted`, `EmbargoLifted`, and `EmbargoExpired` events are published to the world feed.

Arena challenges: accept/decline flow and deterministic match resolution (#570)

  • Nations can now accept or decline incoming arena challenges via `POST /api/arena/challenges/[id]/accept` and `POST /api/arena/challenges/[id]/decline`.
  • Match outcomes are resolved deterministically using a seeded FNV-1a hash of world seed, resolution tick, and match ID — no randomness beyond the configured seed.
  • House fee and winner payout are computed from configurable basis-point settings in world config.
  • Tick engine now processes arena match resolution at each tick, settling wagers and emitting outcome events.

Alliance war targets: priority queue and nation assignment (#574)

  • Alliance officers can now designate specific nations as war targets via `POST /api/alliances/[id]/war-targets`.
  • Each target has a configurable priority (`HIGH`, `MEDIUM`, `LOW`) and optional notes visible to alliance members.
  • Officers can assign specific member nations to a target and update or remove targets via `PATCH`/`DELETE /api/alliances/[id]/war-targets/[targetId]`.
  • Active targets are surfaced in the alliance ops console to coordinate war efforts.

Awards UI and nation profile integration (P2.2D)

  • New **Awards** page (`/awards`) with category tabs (Military, Economic, Diplomatic, Intelligence, Social, Progression, Meta), per-category progress bars, and earned/unearned award display.
  • Nation profile pages now show earned awards as badges when any have been earned.
  • Merit shop preview panel on the Awards page shows current bonus levels and purchase caps.
  • Awards nav item added to the Nation section of the sidebar.

Bounty Board UI and contract detail flow (P3.4C)

  • Added a new **Bounty Board** page at `/world/bounties` with filters for target/poster search, action type, reward size, and expiry window.
  • Added dedicated sections for contracts targeting the signed-in nation/alliance and for the poster's own active contracts.
  • Added contract detail page at `/world/bounties/[id]` with claim action and claim-status list.
  • Added authenticated `GET /api/contracts/[id]` for detail retrieval with world-scoped visibility checks.
2026-03-21Release day

Merit point spending system (P2.2C)

  • Nations can now spend merit points to unlock persistent gameplay bonuses.
  • Five bonus categories are available: **Market Fee Reduction** (−1% per level, max 3 levels), **Resource Production** (+1% per level, max 2), **Training Speed** (−1% training time per level, max 2), **Espionage Success** (+1% success rate per level, max 2), and **Command Regeneration** (+1 command/tick per level, max 2).
  • Each level costs 5 merit points. Purchased levels persist until the nation is deleted.
  • Bonuses apply automatically in the tick engine alongside archetype and supporter bonuses.
  • New API: `GET /api/nations/[id]/merits/bonuses` returns current levels and the purchase menu. `POST /api/nations/[id]/merits/bonuses` with `{ bonusKey }` purchases the next level.

Surrender terms UI: composer, counter-offers, and obligation visibility (#586)

  • War room surrender now supports a structured terms composer with drag-and-drop conditions for reparations, non-aggression duration, and forced treaty terms.
  • Surrender negotiation flow now supports propose → counter → accept/decline in the same war thread.
  • Custom treaty naming is now supported in surrender terms and displayed publicly after acceptance (for example, **Treaty of Ashford**).
  • Public nation profiles now show surrender agreements and active/defaulted reparation obligations.
  • Economy production dashboard now shows active surrender obligations for the selected nation.

War surrender terms: reparations processing and forced treaty execution (#585)

  • Accepted surrender offers can now execute forced treaty terms immediately by creating the specified treaty with deterministic start/end ticks.
  • Tick processing now applies active surrender reparation installments automatically, transferring funds/resources from debtor to creditor each tick until obligations are completed.
  • Missed reparation payments now accrue shortfall debt with configured interest and track consecutive misses; repeated misses trigger breach/default status and emit breach/payment event logs.
  • Downdeclare retaliation qualification now respects the most recent qualifying hostile action in the configured retaliation window, keeping retaliation windows deterministic and auditable.
2026-03-20Release day

Chain Offensives — milestone bonuses and chain-status API (P2.1B)

  • Alliance-vs-alliance wars now support Chain Offensive momentum: when an alliance lands at least one successful attack against a target alliance in a given tick, a `ChainTracker` increments their consecutive-tick count.
  • Milestone tiers apply damage and loot bonuses to conventional attacks (non-missile/nuke) when a chain is active: tier 1 at 10 consecutive ticks (+10% dmg/+5% loot), tier 2 at 25 (+20%/+10%), tier 3 at 50 (+35%/+15%), and tier 4 at 100 (+50%/+20% cap).
  • If a full tick passes with no attack, the chain resets to zero and enters a 6-tick cooldown before a new streak can start.
  • All bonuses and thresholds are config-driven (`CHAIN_OFFENSIVE_MILESTONES`, `CHAIN_OFFENSIVE_COOLDOWN_TICKS`).
  • New API endpoint `GET /api/alliances/[id]/chain-status`: own-alliance view returns full streak data (count, tier, ticks since last attack, bonuses); target-alliance view returns tier only (not exact count).
  • This is a simulation/data change; no UI surface is included in this slice (P2.1C delivers the UI).

Award checking logic now runs in the tick engine

  • The tick engine now evaluates award conditions for every nation each tick and grants achievements automatically.
  • Condition types supported: stat-threshold (infantry, cash, infrastructure, readiness, era age, etc.), era advancement, first-unit/weapon milestones, and cumulative counts (war wins, spy operations, techs researched, projects completed, wonders built).
  • Category-completion META awards (e.g. "Military Completionist") are checked after each grant within the same tick.
  • Cumulative-count checks use a rotating batch of nations per tick (default 10) to keep tick latency bounded.
  • A world-feed event is published (visibility: PUBLIC) each time a nation earns an award.

Awards and merit tracking data foundation

  • Added the core award-definition catalog and new world-scoped data models for awards and merit balances (`Award`, `NationAward`, `MeritBalance`) to support upcoming player achievement tracking.
  • This change establishes deterministic storage/config plumbing only; no award-earning gameplay flow or UI claim surface is enabled yet.

Alliance chat / message board

  • Alliances now have a persistent in-game chat board accessible from the alliance detail page (`/alliances/[id]`).
  • All alliance members can read and post messages. Leaders and officers can pin/unpin messages. Leaders can soft-delete messages.
  • Pinned messages appear at the top of the feed. History is paginated with a load-more cursor.
  • Message posting is rate-limited to 50 messages per tick-day per nation.
  • Chat refreshes automatically when the alliance page loads.

Public Declarations

  • Nations can now publish world-visible public declarations with a category (`DIPLOMATIC`, `MILITARY`, `ECONOMIC`, `GENERAL`), title, and body.
  • Alliance leaders and officers can post alliance-level declarations tagged with the alliance identity; regular members cannot.
  • Rate limits apply: 1 declaration per tick-day per nation; alliance-level declarations allow 2 per tick-day for leaders/officers.
  • Declarations are immutable after posting; corrections require a new declaration.
  • New dedicated page at `/world/declarations` with category filtering and nation/alliance name search.

Chain Offensives — sustained attack momentum tracker (P2.1C)

  • Alliances now build a **chain** against each target alliance by attacking on consecutive ticks.
  • The new **Chain Offensives** panel in the Alliance Ops Console (wars tab) shows active chains, consecutive-tick count, current and next milestone bonuses, and per-tick attack coverage for the last day.
  • Chains that break (no attack in a tick) enter a cooldown period; attacking again during cooldown restarts the chain.
  • Defensive chains appear as a tier indicator (no exact count exposed to the target).

Bounty Board — Contract data model and escrow API (P3.4A)

  • Added `Contract` and `ContractClaim` data models to support the Bounty Board feature.
  • Contracts let nations post bounties targeting a nation or alliance for a specific action (DECLARE_WAR, ATTACK_N_TIMES, WIN_WAR, BLOCKADE, SABOTAGE, SCOUT).
  • Reward escrow (full reward amount) and a 5% listing fee are deducted from the poster's balance on creation.
  • Abuse-prevention rules enforced: same-alliance targets blocked, active treaties block contract placement, minimum reward of 10,000, maximum of 5 active contracts per nation.
  • Claims are non-exclusive: multiple nations may register intent to fulfil the same contract.
  • New API endpoints: `POST /api/contracts/create`, `POST /api/contracts/claim`, `GET /api/contracts`.

Bounty Board — contract fulfillment verification and settlement (P3.4B)

  • Tick stage 9 now verifies open contract claims from authoritative `EventLog` records and settles matching claims automatically.
  • Verification is now live for `DECLARE_WAR`, `ATTACK_N_TIMES`, `WIN_WAR`, `SCOUT`, and `SABOTAGE` actions, with deterministic earliest-claim selection when multiple claims match.
  • Fulfilled contracts now auto-payout escrowed rewards to the successful claimant and mark other pending claims as failed.
  • Open contracts that reach expiry now auto-expire and refund escrow to the poster while retaining the listing fee.
2026-03-19Release day

World war archive API rollout

  • Added authenticated `GET /api/world/wars` to return completed wars scoped to the signed-in nation's world only.
  • Added deterministic archive sorting (`recent`, `damage`, `duration`) plus pagination (`page`, `limit`) for consistent client consumption.
  • Archive rows now include derived resolution labels (`surrender`, `timer`, `mutual_peace`, `inactivity`) and include attacker/defender names, totals, and winner id.

Mobile NC logo alignment fix

  • Fixed the top-left NC logo alignment on mobile header layouts so the mark is centered within its touch target after the top-menu button/brand-position update.
  • This is a visual alignment fix only; gameplay systems, simulation behavior, and API contracts are unchanged.

Civil Administration effect clarity on Development page

  • Updated the `/nations/[id]/development` improvement detail copy for **Civil Administration** to explicitly list what it does: labor cap bonus per tier and labor-start discounts by tier.
  • Added a practical note describing where the discount applies (infrastructure, improvements, wonders, and research starts), so players can evaluate why to build it.
  • This is a UI/help-text clarity update; simulation formulas and balancing are unchanged.

Feedback form category consolidation

  • Consolidated Bug Report and Feature Request tabs into a single feedback form with a **Category** dropdown.
  • Added category options for **Bug Report**, **Feature Request**, **Balance Suggestion**, and **General Feedback**.
  • Kept conditional fields: **Severity** appears for bug reports and **Raw HTML/Code mockup** appears for feature requests.

Research cards hide empty Unlocks/Bonuses sections

  • Updated `/nations/[id]/research` tech cards so the **Unlocks** and **Bonuses** panels only render when that node has at least one unlock or bonus value.
  • Removed repeated empty-state filler copy from early tech cards to reduce visual noise and improve mobile scanning.

War Archives world page and navigation

  • Added a new in-game **War Archives** page at `/world/wars` with completed-war cards sourced from `GET /api/world/wars`.
  • Added sort controls (`Most Recent`, `Most Damage`, `Longest`), loading skeletons, an empty-state message, and retryable error handling.
  • Added bottom pagination controls and linked **War Archives** into the World navigation menu.

Development: dedicated Eras page and submenu

  • Added a new **Eras** page at `/nations/[id]/eras` and wired it into the Development submenu.
  • The new page now shows era requirements, a next-era progress tracker bar, major per-era unlock summaries, and era card imagery.
  • Moved the old inline **Era & Projects** panel off `/nations/[id]/development` and replaced it with a direct link to the dedicated Eras page.
  • Expanded **Era Projects** on `/nations/[id]/eras` with a full per-project status list and concise in-page context so players can see what each project does for era progression.
  • Updated `/nations/[id]/development` with a compact top-level **Eras & Progression** submenu row that includes direct **Open Eras** and **Open Progression** actions plus a collapsible project-details panel.

Mechanics/help readability copy pass

  • Rewrote public copy on `/mechanics`, `/guides`, and `/kb` to be shorter and easier to scan on mobile.
  • Reduced repeated branding-heavy phrasing in hub labels, mechanics headings, and guide/KB intros.
  • This is a wording-only UX update; gameplay mechanics, formulas, and API behavior are unchanged.

Mechanics naming restoration

  • Restored `/mechanics` labeling from **Game Rules** back to **Mechanics** across in-game/public navigation, public footer links, and mechanics-page breadcrumb/meta fallback copy.
  • Kept the route and content structure unchanged (`/mechanics` and subpages); this is a wording-only clarification update.

Manual era promotion (no auto-advance on tick)

  • Nations no longer auto-promote to the next era when gate requirements are met during tick processing.
  • Progression now shows explicit era-promotion readiness and a `Promote Era` action; players can remain in their current era until they confirm.
  • Promotion attempts are server-validated and return stable reason codes on failure; successful promotions write an era-confirmation event log.

Alliance treaty-request self-target guard and cleanup

  • Alliance treaty-request actions now reject malformed self-referential requests server-side with a clear invalid-request error instead of allowing approve/decline/cancel flows to proceed.
  • Alliance detail request lists now filter out legacy malformed self-referential request rows, so players no longer see “request from myself” style entries on `/alliances/[id]`.
  • Valid cross-alliance treaty request flows are unchanged.

Development: delete improvement action

  • Added a **Delete Improvement** action to each improvement row on `/nations/[id]/development`.
  • Deleting now opens a confirmation modal, queues a single `demolish_improvement` action, and refreshes the development data so counts update right after success.
  • The first version explicitly provides no resource refund and disables delete when no completed level remains for that row (or when demolition is already queued for all completed instances).

Dashboard tick-readiness prominence pass

  • Moved a **Tick Readiness** summary card to the top of `/nations/[id]/dashboard` so checklist status is visible without scrolling on desktop and mobile.
  • Surfaced incomplete checklist items in that summary card and added a direct **View full checklist** CTA that jumps to the detailed checklist section.
  • Kept the full tick-day checklist behavior/content intact in the Operations & Logistics area, while moving Daily Command Brief to a single top-area card for faster scanning.

Mobile top-bar navigation priority update

  • Updated the authenticated top bar so the sidebar toggle now sits at the far-left on mobile, with the NC logo moved directly after it.
  • Reduced the mobile Discord CTA to an icon-sized button so header controls no longer crowd narrow screens; the labeled Discord button remains on `md+` widths.
  • This is a UI layout adjustment only; no gameplay formulas, simulation logic, or API contracts changed.

KB progression page now includes direct in-game open link

  • Added a prominent **Open in Game** action on `/kb/progression-status-page` that routes signed-in players with an active nation directly to that nation's progression screen.
  • Added signed-out and no-active-nation fallback routing so the same KB action safely directs players to `/login` or `/nations` instead of dead-ending.

Settings linked-provider fallback hardening

  • Updated `/settings` so the **Linked Login Providers** panel now fails safely when provider metadata cannot be loaded (for example, empty/non-JSON/500 provider responses).
  • Added a clear fallback notice in the panel instead of surfacing a page-level JSON parse failure, while keeping the rest of the settings screen usable.

Alliance join now requires leader/officer approval

  • Replaced instant alliance joining with an application workflow: joining from `/alliances` now submits a pending request instead of granting immediate membership.
  • Alliance leaders and officers can now approve or reject pending membership applications from `/alliances/[id]`.
  • Applicants now see clear request state on the alliance directory (`Pending`, `Approved`, or `Declined`) until resolution.
2026-03-15Release day

Public guides/mechanics/KB readability pass

  • Rewrote top-level `/guides`, `/mechanics`, and `/kb` intro copy to use simpler, step-by-step language for first-time readers.
  • Replaced jargon phrasing in the guides hub (for example, `High-signal guide paths`) with plain labels (`Recommended guide paths`).
  • This is a documentation/UI clarity update only; no gameplay mechanics, formulas, or API contracts changed.

Development improvement/wonder detail readability pass

  • Updated `/nations/[id]/development` so **Improvements** and **Wonders** detail panes now use labeled sections (**Overview**, **Key effects**, **Requirements/Prerequisites**, **Cost**, and capacity/slot context) instead of one continuous paragraph block.
  • Added stronger visual hierarchy (status badge, grouped cards, and bulletized effect lines) to make build decisions easier to scan on mobile and desktop.
2026-03-16Release day

Feature request modal code-mockup field

  • Added a collapsible **Raw HTML/Code mockup (optional)** textarea to the in-game **Feature Request** modal so players can paste HTML/CSS/JS mockups directly.
  • Submitted mockup text now travels with the report payload and appears in internal issue context for triage.

Notifications feed and delivery improvements

  • Build completions now generate in-game notifications, and supporter delivery preferences now control optional email/push fanout for those events.
  • `/notifications` now supports read-state, actionability, world/nation, and type filtering with consistent scoped unread/actionable counts.
  • Notification summaries and bell unread badge behavior were tightened so the notifications surface is more consistent across pages.
2026-03-14Release day

Alliance member management flow (roles + abdication)

  • Added leader-only role management controls to `/alliance/members`, including the ability to promote members, demote members, and transfer leadership by setting another member to `LEADER`.
  • Alliance role updates now synchronize canonical alliance membership roles and leadership ownership server-side, while preserving alliance-bank role permissions.

Development screen layout priority and density pass

  • Reordered `/nations/[id]/development` so **Active Construction Lanes** appears first and is visible without scrolling past other sections.
  • On desktop, **Era & Projects** now sits in a condensed right column next to construction lanes; on mobile, sections stack as **Construction Lanes -> Era & Projects -> Build Options**.
  • Reduced construction lane card visual footprint (including queue art height and idle-lane block height) to improve information density while preserving existing actions.
2026-03-13Release day

In-game password change option in Settings

  • Added an **Account Security** section to `/settings` with current/new password inputs and a direct **Change Password** action.
  • Added an authenticated `POST /api/auth/change-password` flow so logged-in players can update account credentials in-game without leaving the app.

Bug report modal mobile submit-reachability fix

  • Updated the in-game Bug Report / Feature Request modal to use a single scroll container on mobile and removed nested max-height scroll regions that could trap the action row off-screen on some Android Chrome devices.
  • Added mobile safe-area bottom padding so the Send/Copy actions remain reachable near the browser UI edge when report context preview expands.

Login password recovery link

  • Added a **Forgot your password?** link on `/login` so players who cannot remember credentials have a clear recovery path.
  • Added a public `/forgot-password` page with account-recovery instructions and direct support contact actions (email + Discord) while automated reset-token flow is pending.

Discord/Google linked-login flow

  • Added provider-account linking controls in `/settings` so signed-in players can link or unlink Discord and Google login identities on their existing NationCraft account.
  • Added Discord/Google login entry buttons on `/login` and `/register` that route through provider OAuth and sign in successfully when the provider identity is already linked.
  • Added clear provider status feedback (`linked`, `not_linked`, `provider_unavailable`) after OAuth redirects so players can recover to email/password setup when needed.

Archetype onboarding quiz copy refinement

  • Reduced the starter archetype quiz from 12 questions to 6 focused prompts to cut repetition in first-session onboarding.
  • Rewrote quiz prompts/options in clearer, less repetitive language while keeping deterministic server-side archetype scoring unchanged.
  • Updated the quiz header subtitle to use the live question count so onboarding copy stays accurate if quiz length changes again.

Dashboard/development guide-reward fail-safe

  • `/api/nations/[id]/dashboard` and `/api/nations/[id]/tutorial/first-hour` now fail safe if guide-reward claim queries throw, returning safe default reward state instead of a hard route failure.
  • This restores nation dashboard/development availability while guide-reward transaction-path query failures are investigated.

Dashboard API now fails safe on malformed event payload rows

  • `/api/nations/[id]/dashboard` now ignores malformed/null market settlement and tick-outcome event payload rows instead of failing the whole request.
  • When malformed rows are skipped, dashboard response fields now return safe defaults (for example, no recent settlement and empty outcome deltas/reasons) so nation dashboards remain available.

Energy maintenance demand rebalance for mid-infra nations

  • Reduced baseline per-tick energy maintenance demand from infrastructure so mid-infrastructure nations can reach full power coverage within normal improvement slot limits.
  • Shortage penalties and coverage logic are unchanged; this update only adjusts the baseline demand tuning.

War attack responses now include combat explanation details

  • `/api/wars/[id]/attack` now returns a structured `combatExplanation` object for both executed and rejected attacks, including a stable `reasonCode` for outcome handling.
  • War attack execution/rejection event payloads now carry the same explainability fields so client and ops surfaces can render consistent attack outcome context.

War loot cap and inactivity expiry boundary consistency

  • War loot now always respects the per-war loot cap even after consequence multipliers are applied (including War Games), preventing total loot from exceeding the configured cap.
  • Inactivity-expiry timing now consistently resolves on the configured boundary tick window (`WAR_INACTIVE_EXPIRED`), avoiding early expiry before the full window elapses.

Replay-audit diff output for deterministic tick verification

  • Added a new `sim:replay-audit` ops command that replays a selected world tick window and emits a machine-readable determinism report (`tickWindow`, hashes, and `diff.totalDifferences`).
  • Admin replay verification now supports normalized per-entity diff output so operations can pinpoint drift paths (`world.*`, `aggregates.*`, `counts.*`, `entityHashes.*`) instead of relying on hash mismatch alone.

Energy shortages now directly affect economy and military tempo

  • Nations now consume maintenance energy each tick based on infrastructure, and low energy coverage applies deterministic penalties to production, military training time, and upkeep pressure.
  • Severe shortages can now apply per-tick readiness and stability penalties until energy coverage recovers.
  • Military training inputs now include energy for advanced units (including Tanks, Aircraft, Naval, Missiles, and Nukes), so force growth planning must account for power availability.

First-hour and daily ops guide rewards (server-authoritative)

  • Added deterministic server-side guide rewards with one-time first-hour claims and once-per-tick-day daily ops claims, including anti-duplicate claim guards and audit EventLog entries.
  • First-hour rewards now grant early-game-safe assets only (`cash`, `food`, `infantry`) for: first farm, first infantry training, first research start, first market order, plus a one-time full-completion bonus.
  • Dashboard/guide progression payloads now include reward completion + claim status so the UI can clearly distinguish finished-vs-rewarded tasks.

Resource per-tick delta breakdown added to dashboard and forecast APIs

  • Added `resourceTickBreakdown` to nation dashboard and forecast responses so clients can show per-resource gross production, conversion consumption, upkeep consumption, shortage, and net per-tick delta.
  • Values are sourced from deterministic `IncomeBreakdown` event data and default to zeroed entries when no breakdown payload is available.

Dashboard and construction resource delta explainers

  • Updated dashboard and economy construction resource surfaces to show **Net ... / tick** as the primary value and added an expandable **Gross vs consumed** detail row per resource.
  • The new detail text now reflects backend delta breakdown fields directly (`gross produced`, `consumed by conversion`, `consumed by upkeep`, and `shortfall`) so players can see why net is lower than gross.

Power coverage observability in dashboard and construction forecast

  • Added server-authored power observability fields to nation dashboard/forecast payloads, including coverage, demand vs available, active penalty tier/effects, and demand contributors.
  • Updated `/nations/[id]/dashboard` and `/economy/construction` to show **Power Coverage** headline status, active shortage penalties in plain language, and expandable **Produced vs Demanded** plus top demand contributors.

Treaty API world-scope enforcement

  • Updated `/api/treaties` to require an authenticated nation context and always resolve treaty reads against the signed-in nation's world.
  • Requests that target a different world (by `worldId` or cross-world `allianceId`) now fail with `WORLD_SCOPE_MISMATCH` instead of returning out-of-scope treaty data.

Specialized industry lanes now clearly beat Industrial Park mixed conversion

  • Increased specialized Tier 1/2/3 outputs to reinforce role clarity and progression:
  • **Steel Mill**: `12 / 30 / 72` Steel per tick
  • **Refinery**: `9 / 23 / 54` Fuel per tick
  • **Munitions Factory**: `8 / 20 / 48` Munitions per tick
  • Kept **Industrial Park** mixed conversion outputs unchanged as the early, flexible conversion path.

Energy maintenance hotfix

  • Disabled infrastructure-linked passive energy maintenance drain by setting infra energy demand-per-tick to `0`.
  • This removes automatic global energy shortage pressure from rapid infrastructure growth while keeping direct energy usage intact for conversions, training, build/research costs, market/trade, and war loot.
2026-03-12Release day

Discord call-to-action visibility pass

  • Added clear **Join Discord** calls-to-action to the public homepage hero, login screen, and in-game top bar so players can reach community support from primary entry points.
  • Added **Join Discord** as a submenu item in the app navigation and updated the canonical invite URL to `https://discord.gg/keRrcyADWm`.

Settlement military unlock path restored via Industrial Park

  • Restored **Industrial Park** to development/construction improvement option lists so Settlement nations can follow the intended early converter path into war resources.
  • Updated player-facing improvement naming from legacy wording to **Industrial Park** for this active mixed-conversion path.

Eligibility ownership unification for attack/train/build/research

  • Unified attack-type input normalization under a single server owner so war-attack route handling and war-attack gameplay requests now share the exact same eligibility parser.
  • Unified build eligibility ownership between execution and dashboard visibility, so development/dashboard build availability now follows the same server-side improvement gate rules used by build queue actions.
  • Unified research start reason mapping and unit-training API reason-code mapping behind server modules to remove route-local duplication and reduce cross-surface drift.

Onboarding milestone v1: first decision + first milestone signals

  • Extended `GET /api/nations/[id]/tutorial/first-hour` with server-derived onboarding signals for first strategic decision and first milestone timing (completion tick/time plus elapsed tick/minute measurements from nation creation).
  • Added deterministic next-action blocker reason codes to the first-hour onboarding payload and surfaced them in the First Hour Ops UI so players can see the current path and blocker state without client-authored calculations.

Alliance onboarding and role-permission clarity flow

  • Alliance onboarding failures in create/join/leave now return stable server reason codes (for example `ALLIANCE_ALREADY_MEMBER`, `ALLIANCE_WORLD_MISMATCH`, `ALLIANCE_NOT_A_MEMBER`) so UI messaging remains deterministic and explainable.
  • Added clearer onboarding and role-permission guidance on the alliances directory, plus current-role context badges, to make first alliance actions and role boundaries easier to understand.
  • Alliance member-role update failures now return standardized API error envelopes with explicit reason codes (including permission-denied outcomes) for consistent client handling.

Actionable notifications and server-prioritized command brief signals

  • `/notifications` now distinguishes actionable vs informational events using server-authored metadata (`severity`, `priority`, and stable `reasonCode`) and shows an actionable unread count.
  • Dashboard Daily Command Brief now consumes server-prioritized `/api/brief` recommendations first (with blocker/opportunity classification and ETA ticks), while preserving existing endpoint-based fallback signals.

Military forces unlock summary compatibility fix

  • Fixed the nation forces API unlock-summary mapping so it reads unit unlock state from both runtime shapes (`unitStates` and legacy `units`) and reports consistent locked/unlocked data across environments.
  • Added route-contract coverage for the unlock summary payload (including per-unit unlock state and missing-tech reporting) to prevent regressions.

Statistics light-mode card styling fix

  • Fixed `/statistics` overview cards and leaderboard hub tiles so they now use shared strategy surface classes and theme tokens instead of hardcoded dark gradients/shadows.
  • Removed undefined `--border-strong` border usage on this route to prevent inconsistent outline rendering in light mode.

Special Forces baseline unlock aligned to Settlement

  • Special Forces training now baseline-unlocks at the `Settlement` era when nation prerequisites are met (`T08` plus `SF Command`), aligning runtime training policy with rollout guidance.
  • `SABOTAGE` remains separately gated at `State`, preserving escalation timing while keeping the Special Forces unit baseline available earlier.

War attack tech-gating compatibility + smoke stability fix

  • Restored deterministic compatibility for ground attack unlock checks so legacy starter-tech nations (`foundations`) and newer keyed unlock paths can both pass server-side validation where intended.
  • Updated war smoke/test harness seeding to grant the required ground-attack tech unlock before route-level attack execution, preventing false-negative failures in beta/stress and war-command test flows.

Development and dashboard now show owned improvements and wonders

  • Updated `/nations/[id]/development` to include explicit **Owned improvements** and **Owned wonders** lists so players can see current holdings before choosing the next build.
  • Updated `/nations/[id]/dashboard` Administration & Development to show **Owned Improvements** and **Owned Wonders** from live nation data instead of only a short recent-improvements snippet.

Directive controls and visibility surfaces

  • Labor-policy directive action routes now return stable reason codes for validation and missing-nation failures, while preserving authenticated ownership/world-scoped behavior and labor spend accounting fields.
  • Added active/expiring directive state to nation-facing API payloads used by Dashboard, Forecast, Outcomes, and Daily Brief surfaces.
  • Dashboard, Outcomes, and `/brief` now show live directive status (active windows + expiring-soon signals), and directive activation outcomes now render readable summaries in the outcomes feed.

Research successor queue action restored on research cards

  • Fixed `/nations/[id]/research` so available tech cards now expose a **Queue successor** action while another tech is actively researching and the successor slot is empty.
  • Cards now show explicit queue slot state labels (`In progress`, `Queued successor`, `Successor slot full`) so players can see why a node is or is not selectable.

Labor policy directive runtime + route completion

  • Added authenticated labor-policy action routes for **Food Security**, **Civil Stabilization**, and **Logistics Surge** with the same ownership, rate-limit, and response contracts as existing directive actions.
  • Completed deterministic runtime effects for these directives in tick processing (food-consumption reduction, stability-penalty dampening, and storage-cap bonus), with config-driven family/stack limits and event logging.
2026-03-11Release day

Research successor queue and auto-handoff

  • Players can now queue exactly one successor tech while another tech is actively researching, using the same research start action.
  • When active research completes, the queued successor auto-starts server-side if still valid; if not, the queue fails safe with a stable reason code and deterministic event logging for follow-up UI/dashboard surfaces.

Project funding runtime restored (baseline + bounded acceleration)

  • Active nation progression projects now advance every tick at baseline speed even when not currently funded.
  • Funding an active project now applies a bounded acceleration window (`1.5x` for `12` ticks by config) and can be applied again to extend the window deterministically instead of acting as a one-time permanent start marker.

Research hardlock and buildable-now gating fix

  • Fixed a progression hardlock where early Settlement military research nodes required refined war resources before players could produce those resources.
  • Updated development/construction improvement availability so locked options (era/tech/focus gated, such as **Munitions Factory** before `combined_arms`) no longer display misleading positive `buildable now` counts.

National operations surfaces: project coverage and successor visibility

  • Added bounded project prefunding with small multi-day top-up support and a deterministic prefund cap, so project acceleration can be buffered without unbounded stacking.
  • Dashboard, Development, Research, and Daily Brief now surface active project funding coverage (including due-soon state) and queued research successor status, using server-authoritative payloads and stable reason-code handling.
2026-03-10Release day

Overnight simulation stability and monitoring expansion

  • Fixed a large-world simulation stability issue in the overnight balance-lab pipeline so full-engine nightly worlds no longer fail immediately during the first market-processing tick.
  • Expanded overnight simulation coverage to four dedicated simulation worlds per run and tuned the initial nightly rollout to a tier that completes reliably on current infrastructure while still surfacing repeated economy anomalies for review.

Development infra queue preview now advances between clicks

  • Fixed `/nations/[id]/development` so the Infrastructure build card now re-bases on already queued infra after each successful queue action instead of staying on the original preview.
  • The card now also shows the next queue cash cost from the authoritative dashboard payload, so repeated infra queueing exposes updated price and preview context before the next click.

Research node cards now spell out cost, time, and effects

  • Updated `/nations/[id]/research` so each tech card now uses explicit labeled sections for **Start cost**, **Research time**, **Unlocks**, and **Bonuses** instead of compressed shorthand metadata.
  • Tech cards now show the full labor, cash, and resource start-cost breakdown together with earliest completion timing and clearer human-readable effect text for each node.

Mobile toast notification readability fix

  • Updated the in-game toast notification stack so mobile success/error notices use an opaque surface instead of translucent fills that let page content show through.
  • Toasts now anchor as a full-width inset stack below the mobile header area, improving visibility and fixed-position behavior on narrow screens such as iPhone Safari.

Mobile bug-report modal scroll fix

  • Fixed the in-game Bug Report / Feature Request modal so it scrolls reliably on mobile Safari (including iPhone) and keeps the full action row reachable instead of clipping the submit controls near the viewport edge.
  • The change is layout-only (mobile-safe viewport height and modal overflow handling); report fields and submit behavior are unchanged.

Mobile market header resource visibility fix

  • Updated mobile app-shell tick bar viewport initialization so phones load the compact mobile resource row first instead of briefly rendering desktop header-strip behavior.
  • Prevents top-right menu controls from obscuring resource visibility on narrow screens (including `/economy/market`) during initial load.

Development queue improvement labels and tiers corrected

  • Fixed `/nations/[id]/development` construction-lane cards so queued improvements now display concrete facility names (for example, **Steel Mill** and **Munitions Factory**) instead of raw internal keys.
  • Removed heuristic tier tagging for queued improvements and switched to canonical tier parsing, so split industrial facilities no longer show incorrect `T2` badges when queued at `T1`.

Research card unlock-cost and unlock-label clarity pass

  • Updated `/nations/[id]/research` node cards to show unlock cost explicitly as **Cash + resources** with a separate labor queue requirement line.
  • Refined unlock text so cards now show game-friendly wording (for example, `Enable Air attacks` and `Unlock Farm construction`) instead of dot-key style internal phrasing.

Research start-cost visibility and shortage feedback

  • Research cards on `/nations/[id]/research` now show the full start-cost breakdown (labor, cash, and required resources) before launch.
  • Failed research starts now return and display exact shortage details (cash/labor gaps and per-resource shortfalls) so players can see what is missing without guesswork.
2026-03-09Release day

Research cards now separate unlocks from stat increases

  • Updated `/nations/[id]/research` tech cards to show two explicit lines: **Unlocks** (features you gain) and **Increases** (numeric bonuses such as storage cap, market fee reduction, production yield, and war slots).
  • Added deterministic tech-node bonus fields to the nation tech API payload so the research page can render these stat increases directly from server data.

Split industrial facility descriptions corrected

  • Fixed improvement effect descriptions so **Steel Mill**, **Refinery**, **Munitions Factory**, and **Electronics Plant** now each show their own production output instead of sharing the old grouped Industrial Park copy.
  • Development/construction improvement detail cards and dashboard improvement-category payloads now report distinct per-facility summaries for these four buildings.

New-nation war-declare progression guard fix

  • Fixed war declaration progression checks so nations leaving newbie protection at Settlement no longer stay incorrectly blocked by downdeclare era gating.
  • Newbie protection now ends strictly at tick `168` (`NEW_NATION_WAR_PROTECTION_TICKS`) regardless of defender era.

Nation page headers now use nation names

  • Updated nation page headers so Research, Progression, and Outcomes now show the selected nation name when it matches the route nation ID (for example, `Testing2 Research`).
  • Numeric `Nation {id}` header text remains only as a safe fallback when the nation name is not yet available in context.

Public nation browsing and public feed auth alignment

  • `/nations/[id]/public` is now fully guest-accessible end-to-end, including middleware path handling and anonymous profile API reads.
  • `/api/public/events` now supports anonymous reads with explicit optional `worldId`, and falls back to the configured default world when `worldId` is omitted.
  • Public profile/feed contracts now enforce public-data-only payload boundaries without requiring an authenticated actor nation context.

1V1 Arena copy clarity pass

  • Rewrote the `/military/arena` explainer and rule snapshot text in more player-friendly language while keeping all mechanics unchanged (real 60-tick duels, real damage, command/resource costs, separate from regular war slots).
  • Updated challenge and history labels on the Arena page to use clearer wording such as **Target Nation**, **Ends Tick**, and a compact tick quick-reference line.

Development improvement unlock-path fix

  • Fixed `/nations/[id]/development` improvement options so military and defense facilities (including **Army Base**) are now visible in the selector instead of being hidden behind economy-only option filtering.
  • Improvement detail payloads for newly surfaced options now include deterministic era/tech/cost/build metadata from canonical config, so requirement panels stay populated instead of showing missing detail states.

Mobile header and menu readability on arena/small screens

  • Updated the mobile app shell to render a compact resource strip row instead of the full desktop header strip, reducing crowding and improving resource legibility on small screens (including `/military/arena`).
  • Mobile quick-nav and slide-out menu surfaces now use a dedicated, more opaque menu background for stronger text contrast in both dark and light themes.

War declaration and espionage race-condition hardening

  • Hardened war declaration against concurrent requests so duplicate active wars for the same nation pair can no longer be created under load.
  • Hardened espionage launch checks so concurrent requests cannot bypass action-point, cash, cooldown, or pending-operation limits.
  • Added regression coverage for concurrent declare and spy-op attempts to keep these integrity guarantees enforced.
2026-03-08Release day

Feedback screenshot uploads

  • Feedback and feature-request reporting now supports direct screenshot file uploads in-game, replacing the prior screenshot-link-only flow in the report modal.
  • Uploaded attachments are now validated and stored through authenticated feedback attachment endpoints, and report submissions include attachment URLs generated by this upload pipeline.

Bug report nation-name attribution

  • Bug and feedback submissions now snapshot the reporter nation name at submit time, so staff can see nation name attribution directly in report details and admin review views.
  • Linked GitHub issue bodies and duplicate-attach comments now include reporter nation name alongside existing nation ID metadata for clearer triage context.

Direct message thread reply action

  • Inbox direct-message thread cards now include a **Reply** action so players can respond from the thread list without restarting compose manually.
  • Reply opens the existing compose flow with recipient prefill via `toNationId`, while preserving existing inbox read-state and folder behavior.
2026-03-07Release day

Authenticated world-scoping fixes for alliances and events APIs

  • Fixed authenticated alliance and public-events API reads so they now resolve world scope strictly from the signed-in nation's `worldId` instead of default-world fallback behavior.
  • Added stricter auth guards so requests without an owned nation context fail with explicit reason codes rather than silently reading from another world.

Alliance actions now use your selected nation context

  • Alliance create/join/leave flows now use your currently selected authenticated nation context by default instead of asking you to manually enter a numeric nation ID.
  • Updated alliance guidance copy to point players to the nation switcher for context selection, removing the raw `Your nation ID` toolbar input from normal play.

Transfer and alliance aid integrity hardening

  • Nation transfers and alliance aid fulfillment now run with stronger transactional commit-time guards, preventing concurrent requests from overspending balances or bypassing transfer timing and aid slot limits.
  • Alliance aid now enforces daily value-cap rules using cash-equivalent value semantics across mixed resources.
  • Alliance aid requests now reject oversized amounts explicitly and expired open requests now fail with explicit reasoned responses instead of silently continuing with stale request state.
2026-03-06Release day

Alliance treaty requests and approvals

  • Alliance treaty creation now starts as a pending treaty request instead of signing immediately, so the target alliance leader must explicitly approve or decline it.
  • Alliance detail pages now show inbound requests, outbound requests you can cancel, request history, and active treaty controls without requiring players to type manual nation or alliance IDs.

Military cap visibility and training lock fixes

  • Nation dashboard and `/military/forces` now show the current server-side maximum for each military unit, plus clearer blocker/status context when a unit is locked or capped.
  • Military training now correctly enforces tech, improvement, wonder, and stockpile prerequisites for units such as Special Forces, missiles, and nukes, and strategic training caps now match strategic launch rules.

Concrete improvement names and unlock fixes

  • Replaced grouped player-facing improvement labels such as **Resource Extractor**, **Industrial Park**, and **Commercial District** with the actual in-game facilities: **Farm**, **Mine**, **Oil Well**, **Uranium Facility**, **Steel Mill**, **Refinery**, **Munitions Factory**, **Electronics Plant**, **Commercial Hub**, and **Financial Center**.
  • Mechanics, guide, dashboard, and public profile surfaces now show the correct concrete unlocks for techs instead of `Unlocks: none` or grouped placeholder names, while legacy save data remains compatible behind the scenes.

Daily reward payouts and streak scaling

  • Claiming the daily reward now grants a real cash payout instead of only starting a cooldown, and consecutive daily check-ins build a capped streak that increases the next claim amount.
  • Nation dashboard now shows the current streak, the next claim payout preview, and immediate post-claim cash/streak updates so players can see what the reward actually did.
  • Corrected the daily reward balance/next-claim preview wiring so the dashboard and claim response reflect the persisted post-claim cash total and the first truly claimable streak reward during cooldown.

Navigation and public browsing flow cleanup

  • Added direct in-game links to the Daily Brief and Guide, removed a dead no-nation Research fallback, and fixed several dashboard/public/statistics links that looked clickable or led to dead ends.
  • Treaty Web now keeps treaty detail views on an in-app shareable route, and public/profile/statistics surfaces link more consistently to nations, alliances, wars, and treaty context.

Supporter Stripe subscription fulfillment

  • Added a Stripe-backed `$4.99/month` Supporter checkout flow that sends existing subscribers to billing management instead of creating duplicate subscriptions.
  • Each successful monthly billing cycle now grants one tradable Supporter Pack, and redeeming a pack grants 30 days of in-game supporter status.

Public homepage and SEO content layer

  • Replaced the login-first root route with a public NationCraft Online homepage that explains the game loop, 2-hour ticks, start-here guides, recent updates, and account-entry actions.
  • Added public Guides, Mechanics, Calculators, Compare, Glossary, Changelog permalinks, robots, sitemap, RSS, and richer KB/changelog linking so search crawlers can index human-readable public content without exposing private gameplay routes.

Development build cards now explain slots, effects, and prerequisites

  • Reworked the development and economy construction build cards so Infrastructure, Improvements, and Wonders now explain their actual gameplay impact directly in the UI instead of relying on shorthand labels.
  • Improvements now show total slots used/available, how many more of the selected option can be built right now, and what each option does; Wonders now show status, prerequisites, costs, and effects with labels aligned to the Mechanics reference pages.
2026-03-05Release day

Bug and feature intake hardening

  • Bug reports and feature requests now dedupe onto a single active engineering thread instead of spawning conflicting duplicate fixes, while still preserving each in-game submission.
  • Feature requests are now tracked explicitly as **Feature Request** intake instead of generic feedback, and duplicate child reports no longer close or reopen the canonical GitHub issue by accident.

Light theme surface pass

  • Reworked shared strategy card, panel, and table surfaces so Light mode no longer leaves `/settings` and related game UI on dark-only gradients.
  • Added explicit light-theme surface tokens and overrides for reusable tactical shells, producing readable borders, fills, and contrast in Light mode without changing Dark mode styling.

Image delivery and widescreen asset routing

  • Fixed middleware auth bypass so public `/images/*` static assets are served directly instead of being redirected to `/login`, resolving broken image rendering on Render deployments.
  • Added the new `16x9 NationCraft Images` asset pack under `web/public/images` and wired 16:9 image slots to use widescreen variants where available, while preserving square assets where widescreen variants do not exist.

Dashboard armed-forces navigation fix

  • The **Armed Forces** card on nation dashboard is now directly clickable per unit row, each opening `/military/forces` with that unit preselected in the training console.
  • Added safe unit-query allowlisting on the Forces page so unsupported values are ignored and default behavior remains unchanged.
2026-03-04Release day

Public nation profile visual refresh

  • Restyled `/nations/[id]/public` to match the dashboard visual language with the same card-heavy structure, accent borders, and compact command-style labels.
  • Added dashboard-style KPI cards, a military snapshot panel, a structures ledger panel, and quick-action rails while keeping the profile strictly read-only and public-data-only.

Bug/feature reporting visibility update

  • The top-right report icon near **Exit** is now larger, high-contrast, and bright red for faster discovery.
  • `/settings` now includes a prominent reporting panel with direct actions for **Open Bug Report** and **Open Feature Request**.
  • Reporting labels are now consistent as **Bug Report** and **Feature Request** in the submission modal and copied report text.

Settings theme preference fix

  • Fixed `/settings` theme selection so choosing **Light** now applies immediately and persists across navigation/reload, including on macOS Chrome.
  • Added a dedicated light palette and corrected theme root class handling so explicit `light` preference is no longer treated as dark.

Knowledge Base expansion

  • Added a new `/kb` gameplay systems index with canonical reference tables for resources, infrastructure progression, improvements (all tiers + exact effects), wonders, tech tree nodes, command/labor, military units, and operations.
  • Kept the existing searchable KB article directory and first-hour path, now paired with the new systems index for single-page discoverability.

Feedback and bug-report pipeline reliability

  • In-game **Feedback** submissions now create first-class bug-report records and automatically sync to linked GitHub issues when integration is enabled.
  • Added fallback handling so feedback still saves in-game even if GitHub sync has a temporary network/API failure.
  • Hardened issue-triage automation schema validation so automated triage runs consistently and applies labels/comments without schema-format failures.
  • Added GitHub App installation-token auth support for in-game bug/feedback GitHub sync (with PAT fallback), reducing user-token API rate-limit failures in production intake.

Public profile intel expansion

  • Expanded `/nations/[id]/public` to show richer public nation intel: infrastructure, population, nation score, military score, visible military unit counts, and completed improvements/wonders.
  • Enforced a strict public allowlist for this profile so sensitive data remains hidden, including cash/resources, unlocked tech details, and special forces unit counts.
2026-03-03Release day
2026-02-23Release day

Alpha operations and safety updates

  • Added per-world config overrides so alpha/beta/prod worlds can run different tuning safely.
  • Added login brute-force protection and IP throttling on auth routes.
  • Added admin user moderation status controls (`ACTIVE`, `SUSPENDED`, `BANNED`).
  • Added admin force-end war tooling for live operations intervention.
  • Added direct admin nation resource patching and full nation inspect endpoint.
  • Added reporter notifications when bug reports move to `FIXED` or `REWARDED`.
  • Added Sentry observability wiring behind config flags for production error tracking.
2026-02-22Release day

Gameplay and UX improvements

  • Shipped Neutral Mode with deterministic activation/cooldown rules.
  • Added deterministic market cancel cooldown anti-abuse behavior.
  • Shipped role-gated alliance bank visibility controls.
  • Delivered deterministic espionage report resolution and intelligence UI updates.
  • Promoted more alliance, economy, and war surfaces from scaffold to live API-backed pages.