Patch Notes

Ashen Throne Changelog

Every balance pass, fix, and feature shipped to the alpha. Newest first.

4936f11

New & Changed

  • market — terminal polish + $ato/ASH pair + market-level daily cap (c5b9305)
  • replay — per-location battle backdrops (subregion + citadel district) (90da91f)
  • analytics — Stripe refund clawback + exclude from REVENUE tab (52490b4)
  • analytics — REVENUE tab + onboarding depth + megatower/replay/i18n surfaces (e7770b6)
  • analytics — production-readiness pass - render tab, deploy markers, rage quits, dead-route removal (b9f0b10)
  • analytics — consolidate acquisition channel view + fold Zealy into the channel dimension (9204348)
  • replay — whoosh SFX per skill-proc name fly-in (one per combo beat) (a6fdf47)
  • barracks — server-authoritative cross-device squad presets (275d4a6)

Fixes

  • socket — make token rotation invisible — stop the 15-min reconnect spam (2cf4689)
  • ui — center menu titles, fix mobile filter chips, add mark-all-read to mailbox + replays (338809f)
  • replay — gate shared-link autoplay on real audio (no more silent replays on refresh) (42df2fe)
  • replay — combo ALL proc types fired in one commander turn window (c1d4ff0)
  • telemetry — capture console.error so swallowed client errors reach monitoring (1e17aba)

Internal

  • add verify-claude-md reference-drift lint + wire into verify-on-edit hook (df6483a)
  • claude — share postgres-staging MCP via env-var-gated .mcp.json (1e69b24)
  • claude — automation pack — client-ui reviewer, 2 skills, .env guard, schema lint routing (63f1cf4)

Other

  • l10n: auto-translate zh-Hant artifacts (4f58083)
  • l10n: auto-translate zh-Hant artifacts (1d7101f)
  • l10n: auto-translate zh-Hant artifacts (c839e97)
  • l10n: auto-translate zh-Hant artifacts (ec70a85)
  • l10n: auto-translate zh-Hant artifacts (c7dd629)
b63e3a3

New & Changed

  • ios — activate CI release automation (API-key signing, auto-submit) (79b9fa9)
  • alliance — Leave Alliance + Kick from the member roster popup (#416) (b92efae)

Fixes

  • alliance — let vice-leaders kick officers (client Kick UI was over-restrictive) (4839f55)
  • ci — quote l10n.yml job if: — unquoted 'l10n: auto-translate' broke the YAML parse (e46ee5e)
  • ci — Node 22 for the Capacitor cap-sync jobs (android build gate + release) (5399cb2)
  • android — strip AD_ID permission merged by the Facebook SDK (f936ef4)
  • auth — Android native Google sign-in was completely broken (6fe35de)
  • gateway,login — promote-review followups — Apple directory backfill + identity-collision message + login disclosure reset (b5914e3)

Internal

  • release — Android Google sign-in needs BOTH upload + Play App Signing SHA-1 (e68333f)
  • capture Pixi texture-lifecycle footgun (assetTexture destroy on shared source) (6ab1332)
  • sync CLAUDE.md to current state — Pixi cutover complete, canvas-2D deprecated, l10n, native (3ed9afd)
  • ios — iPhone-only + export-compliance-exempt for App Store 1.0 (2) (04c8eba)
c204216

New & Changed

  • attribution — UTM acquisition tracking for playtoearn.com + /play link (ab93b00)
  • l10n — zh-Hant backfill artifact — 2,900+ translated strings (1c1463d)
  • l10n — supervised-backfill ops model — zhHantCheck, concurrency, CI work cap, backfill skill (dfd1885)
  • l10n — whispers are never auto-translated (owner decision) (ea04703)
  • l10n — mail templates + live chat auto-translation (wave 3, review-hardened) (908c8ff)
  • l10n — automated localization system — zh-Hant pilot (wave 1: pipeline + runtime + plumbing) (5a089c5)

Fixes

  • l10n — tutorial Ada spoke English — chip-token parity + glossary-blind critic (0ac1f56)
  • l10n — load extraction/hunter.js in the browser; lint the require↔script divergence (4f1b411)
  • l10n — align bot commit message with the workflow loop guard (8f74482)
  • l10n — ship locale artifacts in the Capacitor www build + coverage log (7d7df22)
  • l10n — backfill stall — thinking overflow + unawaited Batch results iterator (1785616)
  • verify — action-dispatch sanitizer went blind after nested template literals (1220fe4)
  • auth — add clickable deep-link fallback to Electron OAuth callback page (9e224ec)
  • combat — battle alert suppressed ONLY on real crawler destruction (explicit flag) (e25302a)
  • extraction — PvP battle outcome always notifies both players (emit-first) (2e6d1ef)

Internal

  • extraction — atomic PvP resolution — one withTransaction, rollback = retry (5b7b97c)
  • l10n — operator runbook + complete new-locale wiring checklist (0a35422)
b3f854b

New & Changed

  • marketing — Play Store listing creatives v2 + compositing pipeline (7a0a922)

Internal

  • store listing screenshots + icon plan (handoff) (d66474b)

Other

  • seo: make ashenthrone.com the canonical landing domain (0e02030)
  • seo: add WebSite schema to landing index, refresh sitemap (add /changelog + /follow, bump lastmods) (5762b2d)
df144f5

Fixes

  • client — stop Pixi auto-render ticker + guard megatower _exitRun NPE (7d72bf9)
  • tutorial — post-handoff "Claim Your Rewards" tip is durable-state-driven (88dc205)
  • tutorial — suppress the chat box during the tutorial sandbox (c99557b)
  • client — paint map first + self-heal buildings on facility screens (proper fix) (b77b073)
13836f0

New & Changed

  • monitoring — redesign anomaly-watch + telemetry for Pixi + sandbox-tutorial (eee2abd)

Fixes

  • client — prime /base + /army at post-login so map quick-nav facilities aren't empty (64ec62f)
  • extraction — wave formation packed a 4th front column (col:3) off the grid (338e995)
  • hud — DECIDE event badge lands on-screen regardless of containing block (0f29a3a)
  • shop — cap pack-art height so a lone card never buries the BUY button (adf1c2b)
  • tutorial — clear the guidance arrow when THE STAND replay plays (97ee34b)
8476125

New & Changed

  • landing — account-deletion request page for Play compliance (db94c9a)
  • tasks — new-player task chain — RoK-style post-tutorial direction (da469f5)
  • shop — real chest-open sample for the crate burst (bc89aab)
  • shop — ceremony wave 2 - dedicated synth audio, all-pack frames, gold-tier burst (9baaa9e)
  • gateway — multi-shard production readiness for web + native clients (f1df1c2)
  • shop — pack-opening ceremony — crate slam, charge, burst, fly-outs, tally (516e027)
  • tutorial — owner-drive feedback wave — 9 UX fixes + finale citadel redesign (38283e3)
  • tutorial — checkpoint-replay persistence — reload resumes, never stuck (d7efad1)
  • tutorial — design system wave B — engine invariants kill the drive's jank (f30cd5a)
  • sharding — multi-shard gateway — directory, CCU-latch assignment, warm-spare promotion, handoff login (Phase 1 overflow readiness) (4e99535)
  • tutorial — handoff auto-open + commander voice + Vael cameo + copy beats (c4dcec1)
  • tutorial — honest train timer — displayed == actual == TRAIN_SECONDS (811dcd4)
  • tutorial — THE STAND — the player wins the defense, then learns the replay (6b5bb8f)
  • android — Capacitor android platform scaffold (54862e1)
  • auth — Sign in with Apple server endpoint (/auth/apple) (8df9fb4)
  • tutorial — panel-free act phase + polish pass from owner playtest (c3b7f73)
  • capacitor — www packaging pipeline + native-origin CORS + Capacitor 8 deps (24301fe)
  • client — APP_ORIGIN absolute-origin support for the native shell (e9fc4a4)
  • iap — RevenueCat webhook fulfillment + store-build native purchase path (cd2d441)
  • compliance — 13+ age gate at registration + public /odds drop-rates page (064c72a)
  • store — store-surface server guard + store-bundle code strip + verify lint (f83d613)
  • tutorial — north-star Citadel card + Iron Marshal Vael villain arc (f24c4a5)
  • objectives — GO auto-nav + retroactive tutorial credit at the handoff (0a0c907)
  • tutorial+shop — free New Player Pack — crossed-out 100 ASH, costs 0, taught in-tutorial (f9fc8e0)
  • tutorial — first-commander CHOICE at the beacon (Voss / Cipher / Vell) (a9763eb)
  • tutorial — OBSERVE phase (serialized attention) + per-beat funnel telemetry (f63bb5e)
  • tutorial — narrate-first beats + universal pointer arrow (RoK pattern) (bee6305)
  • tutorial — open the squad panel + play the deterministic loot reveal on extraction (ffdf969)
  • tutorial — remove the post-fight + post-loot dead Continue panels (c5b4fa0)
  • tutorial — real Armory conduit step before the Barracks (reorder) (4a67226)
  • tutorial — sandbox infra for the real Armory conduit install (ac10b9a)
  • tutorial — action-labeled CTAs (CONFIRM FORMATION / ENTER THE FRONTIER) (4a17365)
  • tutorial — lock troop training outside the train step (14f1f6a)
  • tutorial — remove the dead generator 'continue' panel (4929607)
  • tutorial — quick-nav expanded only on menu-access steps (41c29b6)
  • tutorial — real out-of-range→in-range move + objective arrow + framing (a9840bf)
  • tutorial — generator celebration + on-rails crawler-move beat (121b131)
  • tutorial — bound the seam catalyst grant so the cryo D1 hook survives (G-HOOK) (42fd6ef)
  • tutorial — real pre-Fall competence fight + counter-triangle lesson (M8/G-FIGHT) (48aacb2)
  • tutorial — load the real combat engine client-side (foundation for a real G-FIGHT) (0ee217f)
  • tutorial — teach the real Crawler-move (Dig Out beat) + fidelity grading criteria (5b3993d)
  • tutorial — drive tutorial through the map menu (map-centric) + fix dossier card (607697d)
  • tutorial — Phase 5 — cutover (sandbox default-on + remove server monitoring) (8a950ea)
  • tutorial — Phase 4 — the Fall + the seam handoff (end-to-end) (05f24ca)
  • tutorial — Phase 3 — world map + beacon summon + extraction lifecycle (a6564f0)
  • tutorial — Phase 2 — base + command write handlers (generator step verified) (f89d57f)
  • tutorial — Phase 1 — client-side sandbox core (old overlay, identical UI) (59f09dc)
  • tutorial — Phase 0.5 — seam fromSandbox flag (suppress duplicate Fall emits) (e03269b)
  • tutorial — Phase 2 — client-only cutover (default on, remove monitoring) (8d8585c)
  • tutorial — Phase 1 — client-only tutorial sandbox (6816f21)
  • tutorial — Phase 1 foundation — telemetry parity allowlist + feature flag (7473097)
  • tutorial — Phase 0 — idempotent client-only provisioning seam (d6248c3)
  • map — tilt-shift mode, HD zone-blend seams, weather tuning, phone HD/fog fixes, perf (#346) (1ade55c)
  • map+home — phone HD terrain & fog-zoom fix, tall-screen Cipher scaling, 16:9 removal (#342) (32a2530)
  • map — thin haul bar under extraction-site labels (9c5bedb)
  • map — feather the ring-2 sandstorm into vision (gradient, not hard cut) (3203bd8)
  • map — real moving sandstorm (dust-driven colour) + rain in vision∩ring2 (8e8921c)
  • map — ring-2 fog as a thick brown CCW sandstorm that floors at 33% in vision (b5b6095)
  • map — remember seen TIMED ring-2/3 extraction sites as faded ghosts till expiry (9ed4345)
  • citadel — ruling-alliance label + Current Rulers tab; fix Citadel Grounds tooltip (ceb6330)
  • map — far-zoom Citadel Grounds reads as Frontier (Haven), + biome config knob (b3fc939)
  • map — remove the radar-sweep wave — plain static grid only (278a53e)
  • map — light-blue grid + diagonal white radar-sweep every 10s (ad95d10)
  • vision — share fog-of-war across the whole Frontier (Ring 0 + Ring 1) (cc0a548)
  • equipment — steeper epic scaling, 70% legendary, enable equipment power (9146884)
  • social-rewards — honor-system → T3 loot chest; verified ASH 300→100 (4b6065c)
  • extraction — remove the cycle-time boost (broke under the slot system) (024f036)
  • ui — shared ui.rewardModal primitive + fix recycle-complete drift (aae99bd)
  • boost — make all travel timers boostable + fix squad-panel countdown (83a20dd)
  • extraction — remove zone on-ramp seed bands (T1-in-wastes / T2-in-deep) (4d1442a)
  • map — ring-2 fog clouds swirl CCW around the capital; slower cloud cover (01ed05a)
  • map — show "Citadel Grounds" far-zoom zone label; stronger frontier green (5115f7f)
  • world — tweak Citadel-ring sites + rename ring 0 to "Capital Grounds" (3142750)
  • world — 4 named extraction sites ringing the Citadel (zone 0) (a47997e)
  • map — always-on drifting clouds + more visible grid (353889d)
  • map — bring back the warm yellow cast (no dark filter) (600d7e8)
  • map — weather = drifting patterns only, no haze (no dark filter) (ec6bacd)
  • map — native high-res terrain on ALL rings (kills the dark/soft bake look) (dd5ce48)
  • map — new citadel art (tile_citadel) on a 7×7 footprint (1f28146)
  • map — native-resolution terrain on all zones at close zoom (restored) (200e8e7)
  • map — native-resolution terrain on all zones at close zoom (ba68b29)
  • map — ring 0 renders as Frontier — Haven tiles + no fog shroud (ac0f88e)
  • zones — ring 0 (Citadel circle) shares the Frontier ruleset + look (6d0aec2)
  • map — port zone condition icons (eye / red swords) to Pixi (f319241)
  • map — hover highlights the actual click target (entity glow), not the ground (f854f22)
  • map — make deploy + packing hourglasses public (others see you "warming up") (6a1c5f0)
  • deploy — flat 6s prep everywhere, shown as hourglass(es) over the crawler (551dc09)
  • map — broadcast squad name to all viewers; every wave shows the monster; kill the name flicker (67c0ee8)
  • extraction — packing is vulnerable to an incoming wave (f078bab)
  • map — march dashes flow toward target; pixel_monster rides incoming-wave line (d762dbd)
  • map — extraction travel vehicle indicator — extractmobile on a brighter line (f7ae09f)
  • barracks — squad-name input per commander+preset (default "<Cmd> <n>", 12ch) (0ed2e0b)
  • server — per-(commander,preset) squad names — table + GET + save route (719a0c3)
  • ui — extractmobile_pixel asset; hide Loot in expanded menu; garage scooter icon (aa6b894)
  • settings — default FPS cap to 90 (was 60) (e1cd7ee)
  • settings — remove the Resolution (render-scale) graphics option (b3f8559)
  • map — Pixi weather (drifting pattern layers) + ping/chat-bubble overlay (cffcc63)
  • map — Pixi entity labels — site tier badges + base power labels (§52) (0eca822)
  • map — make the WebGL renderer the DEFAULT (Settings → Graphics toggle) (9f9d727)
  • map — fog drift wisp (§51) — scrolling smoke folded into the fog shader (0de5be9)
  • map — per-tile explored/visible fog (§50) — visibility texture (dd27ac3)
  • map — WebGL context-loss handling (mobile robustness) (003208c)
  • map — Pixi port Phase 5 — interaction visuals via 2D UI overlay (fee78f6)
  • map — Pixi port Phase 4 — entities + labels (f666f5d)
  • map — Pixi port Phase 3 — zones/edge + mood lighting (6003851)
  • map — PixiJS WebGL port — Phase 1 scaffold + Phase 2 terrain & fog (a5af48a)
  • client — tabbed Settings + graphics controls + map render perf/mobile fixes (5516b33)
  • alliance — per-pair daily help cap — anti-funnel friction for alts/bots (863aaa1)
  • auth — per-IP registration rate-limit to stop Sybil signup floods (13e3485)
  • ui — map expand-menu redesign, alliance Info/Bank/Social, Garage, alliance-XP rework (84a0a4b)
  • siege — net (destroyed - lost) leaderboard scoring + Zealy net quest (47c0db4)
  • analytics — retention by acquisition source (Zealy vs organic) (d2c208f)
  • analytics — track D14 + D30 retention offsets (d0e7fc1)
  • analytics — blended cohort-weighted retention card on dashboard (68d5fa2)

Fixes

  • promote-review — CI-red tutorial lint + seed-purge guard + tutorial-lint source meta-guard (#358) (8476125)
  • ci — eliminate CLIENT-section flake by forcing canvas-2D in the qa harness (ac8f76f)
  • tutorial — un-positioned panel shows landed at inset:auto — explicit dock (1ade19b)
  • tutorial — owner drive round 2 — train-bar start, panel jump, Vael's own beat (831489c)
  • bootstrap — stop staging boot crash-loop from idx_players_apple_sub (48be3f0)
  • tutorial — mobile-landscape drive — extract-beat clamp blocker + 3 fold bugs (7328380)
  • test — stale literal-string lint in verify-first-word-event.js (f808cb9)
  • tutorial — narrate-owns-frame at the SOURCE + design-system docs/verified (e00f848)
  • rebase — two gaps surfaced by the staging merge (app-store-launch) (b91d378)
  • test — missing db.ready await + extend CI-flake retry to Decide click (7608809)
  • docker — ship shard-admin.js in the image for railway-ssh cutover steps (236109b)
  • zealy — shard-scope + globally dedup USDC milestone claims (multi-shard safe) (bd50235)
  • compliance — show drop rates as an in-game modal, not a browser page (f7d434e)
  • tutorial — /train response missing queueEntry crashed the train popup (7eb091c)
  • compliance — show drop-rates link in the beacon's own confirm dialog (2aaba90)
  • iap — close the refund-before-grant race + reconciliation for stuck orders (1270615)
  • auth — make Apple signup's 23505 handler constraint-aware (b956de7)
  • release — kill staging-origin footgun + socket.io indirection (CI break) (b351591)
  • iap — close 5 money-integrity holes in the RevenueCat webhook (524c90c)
  • auth — enforce 13+ age gate on OAuth signup + make Apple account creation atomic (2a34611)
  • mobile — repair Track E CSS self-regressions (50abc74)
  • auth — harden Apple JWKS fetch — single-flight + cooldown + negative cache (35599f8)
  • tutorial — catalyst boost hard-block — sandbox /catalysts served item keys (dd8cc7b)
  • auth — tester bootstrap attests ageConfirmed (store surface requires it) (dac76f2)
  • capacitor — vendor pixi.min.mjs into www — WebGL map was silently demoting to canvas-2D (386c608)
  • store — scope blockStoreSurface to /vault + /zealy prefixes (02f0d1f)
  • tutorial — highlight repin wedges in a hidden tab (rAF never fires) (3450b80)
  • mobile — 6 high-severity mobile-UX fixes for store submission (b3056c8)
  • tutorial — render site/depleted/radial map cues correctly on the default Pixi renderer (500b4b2)
  • tutorial — render the move/beacon map cues on the default Pixi map (d217bfc)
  • tutorial — hospital boost-recovery highlight lands on the async-rendered button (33f43c7)
  • tutorial — haul-chest bank reveal shows the loot (was "empty-handed") (7486795)
  • tutorial — summon reveal no longer swallows the next step's panel render (0116c6f)
  • tutorial — generator celebration confirmation, beacon in-range refresh, drop forced combat (40dc5cb)
  • tutorial — port move-beat zoom to continuous model + closer zoom (dfd7beb)
  • tutorial — Phase 5 — deactivate sandbox on session clear / account switch (Codex review) (3d82aca)
  • tutorial — Phase 3-4 shape parity (Codex review) (3118f33)
  • tutorial — Phase 1 sandbox hardening (Codex review) (d29210c)
  • tutorial — harden provisioning post-commit side effects (3796ade)
  • hunter — weakest Hunter is now 1 unit, not 6 - new players survive the Wastes (9e16c86)
  • cache — auto-version SW cache per deploy + stale-while-revalidate assets (f3d0b26)
  • map — make Pixi the sole canvas-CSS writer (autoDensity), drop manual pin (edd93d3)
  • map — disable Pixi autoDensity — own the canvas CSS like the 2D canvas (d27cf16)
  • map — harden Pixi viewport sizing for Android Chrome / iOS Safari (8c75602)
  • map — uniform spacing on Citadel label — top-anchor all 3 lines (5895837)
  • hospital — boost modal counted paused (away) wounded it can't boost (aa21955)
  • map — haul bar width = type label width (stops shrinking on zoom-out) (f563f29)
  • map — guard storm shader against atan(0,0) NaN at the map centre (8eaa5c6)
  • map — ring-2 sandstorm clouds actually render + move (swirl texture was 404) (c458082)
  • map — "Safe zone" chip on ALL frontier tiles + bigger readable citadel label (889972e)
  • map — lower Summon Beacon slightly so it centers on its base (0c5a83e)
  • map — render weather ABOVE structures so sites/beacons sit under it (d7118d1)
  • 4 server bugs surfaced while repairing the verify suite (b17d29a)
  • map — lower the risen arcology — half-tile lift sat too high in its 2x2 (72a397a)
  • map — drop the Summon Beacon ground shadow (read as "floating" after lift) (839678e)
  • map — lift Summon Beacon + risen arcology art ~half a tile in their slots (fa5c7ee)
  • map — REAL phone fix — _viewport divided logical size by DPR (map in corner) (666d0b0)
  • map — phone — Pixi map filled only the top-left quarter of the screen (0e1f222)
  • reveal — SKIP finishes the haul modal once the reveal is done (was a no-op) (ca28cfc)
  • barracks — stop double-posting the "replaced from Reserves" SYS line (7b80d97)
  • barracks — deploy-modal EDIT no longer overwrites a preset on switch (252aeb5)
  • map — fade the Pixi map in on cold load — hide the stale-bake "lava" flash (42e97a8)
  • world — Citadel (not Capital) naming + move/rename the energy site (9595db6)
  • lint — satisfy action-dispatch + extraction-wave-state CI gates (79c443d)
  • map — yellow filter over ALL tiles; drop the CITADEL label to the footprint (4d8c354)
  • map — weather fills ring 0 + ring 1 (contested merged into frontier) (e7e7bfd)
  • map — smaller rain streaks (WEATHER_REF_TILEW 40 -> 26) (dad37af)
  • map — yellow as a filter IN FRONT of the capital + fix giant rain (bec47a5)
  • map — raise citadel art half a tile (drop 2·tileH → 1.5·tileH) (9b90bca)
  • map — drop citadel art down 2 squares (visual only; footprint unchanged) (0995192)
  • map — citadel under weather, no shadow; grid below sites/citadel (5ef100f)
  • map — port the walkable-tile grid to Pixi + dim ring-0 overlay (dff9898)
  • map — drop ring-0 dark fog shroud + feather the Haven overlay edge (30d29b2)
  • hud — food deficit shows red 0, not a draining -82k (it never drains) (7e56010)
  • ui — player-info panel overflowed the modal — fit content to the box (0f746bc)
  • map — use server-resolved squad_name for the optimistic deploy marker (7773b89)
  • map — extractmobile rides the full deploy trip, not just the last 15s (bfa82c3)
  • map — crawler relocation line is BLUE, extract-team march stays orange (20ade29)
  • map — port packing hourglass + extraction march direction to WebGL; mail badge top-right (3961ce1)
  • hud — show true food net (red minus), tint gain rates subtle green (cd47a2e)
  • hud — resource dividers sit in the gap, not under the numbers (b3134d6)
  • hud — resource detail popup rises from the bottom bar on the map (634b392)
  • map — render the persistent Deep-Wastes (ring 3) weather, not just player ring (d146a8a)
  • map — terrain frozen at old viewport after portrait->landscape rotation (89af0a7)
  • map — megatower + citadel were 2x / 1.4x too big — match canvas sizes (2703967)
  • map — restore extraction range ring look — short dashes + edge glow (a8d3e4f)
  • map — sunken arcology rendered too big — use top-crop, not squashed sprite (7613209)
  • ui — player-info action bar clipped the 5th button (CLOSE) (9cda2c8)
  • map — port the above-crawler "lasagna" ghost re-draw to the WebGL map (e8b4f0a)
  • map — size extraction type-line to match the site name (10px, was 9px) (8b9428a)
  • map — show FPS overlay on the WebGL map (was hidden behind opaque canvas) (9834a39)
  • map — resize the WebGL map canvas on window/fullscreen resize (3dde884)
  • map — supersample labels instead of roundPixels — crisp AND smooth on pan (6cf1943)
  • map — roundPixels on labels — crisp text + true-bright red, matching canvas (2d96df9)
  • map — render label text at renderer resolution (1:1) — canvas-faithful weight (b1ca7ca)
  • map — thinner font-proportional label outline (no shadow) — readable small text (bad560a)
  • map — clip weather to player zone (off ring 2) + supersampled readable text (01a90db)
  • map — exact label colors — YOU state color, Citadel #ffd700, power #666 (dff6c5c)
  • map — faithful label styling — DPR-crisp text, exact colors/alpha, real fonts (2365861)
  • map — sunken arcology spawn now visible (megatower crown + hazard zone + label) (7f2f34d)
  • map — restore missing entity parity — area names, site titles, arcology, colors, fog (a855902)
  • map — fog as a screen-pinned MESH, not a filter — ends the drift for good (3d13f5c)
  • map — extraction range ring — even dots instead of a few big arcs (bfeb679)
  • map — terrain as viewport mesh — fog/edge now track the ground (24da227)
  • map — terrain far-zoom — draw full texture scaled+positioned (no frame mutation) (b4e974c)
  • map — terrain far-zoom breakage — set sprite scale, not width (87e32f7)
  • map — supply explicit vertex to fog Filter (Pixi v8 ensurePrecision) (0b274d7)
  • map — Pixi terrain off-center camera bug — use stable source width (f38f1d3)
  • map — bundle Pixi with unsafe-eval polyfills (CSP) + live harness (47df436)
  • zealy — enforce claim ownership — reward claims resolve only via the claimant's own link (99b33b8)
  • world — surface quest-guidance T2 site to its quest holder (8cdf6c8)
  • ui — pin menu CTAs on small landscape via .mpane scroll/footer primitive (18b7e3c)
  • anomaly-scan — count only active raid statuses in double_deployed_commander (32e0adc)
  • socket — pair emits with mutations across audited routes + verify-mutation-emit lint (9c9a3de)
  • delivery — emit on claim so the loot-crate icon clears instantly (a94ac03)
  • deps — declare stripe in package.json (was lock-only → npm install couldn't boot) (87f39a4)
  • extraction — preserve wave power across the /extraction/active poll (b01e3be)
  • restore old tutorial as default (UI must be identical to old version) (e34baf9)
  • map — undo the Pixi autoDensity viewport fix from #338 (low-quality map) (816cdf1)

Performance

  • map — player-name labels from a shared glyph atlas + per-frame allocation sweep (#348) (9b3f003)
  • map — strip native-terrain Sprite masks on mobile; revert the DPR cap (10074a1)
  • map — cap Pixi backing density to 1 on phones (5-FPS mobile fix) (a30bf1e)

Internal

  • tutorial — design system wave A — the SCRIPT splits from the ENGINE (7395d4c)
  • shop — config-derived lint - every pack must pass the ceremony bar (5cef53f)
  • qa — extend the CI-flake retry to every socket/render wait in CLIENT (900f086)
  • qa — contain the Pixi/CI GPU-stall flake with a scoped retry-once (57ba155)
  • qa — size the overlay wait against the measured CI stall, not a guess (f905077)
  • qa — instrument the CLIENT cycle-pause section instead of guessing again (c6b5d65)
  • qa — CI-tolerant budgets across the CLIENT Playwright section (1ffd878)
  • qa — gate CLIENT wave asserts on page-socket readiness (CI un-masking) (e80ecac)
  • ci — fix the two deterministic baseline failures blocking CI (476f390)
  • echo7 — update member_count lint to the recompute-from-rows idiom (8db6c8a)
  • repair 13 rotted verify scripts + extend combat coverage (7e19b85)
  • alliance — assert per-pair lock keys on both helper AND requester (Codex review d) (d6faa18)
  • pvp — defended-crawler-raid E2E (defender fields its commander squad) (76ad86e)
  • prod-targeted release AAB built + verified (upload-ready) (a441c1a)
  • mark Google Play screenshots done in store-listing reference (2b1f17f)
  • test — record the accepted CI-flake decision (stop containment here) (b023573)
  • Phase 3 store-listing + compliance reference (listing copy, IARC, Data Safety, App Privacy) (6c84bdb)
  • privacy — disclose Apple Sign-In + RevenueCat/store-billing IAP processing (7e97b33)
  • tutorial — Stand drive primitives, analysis status, coverage-log entry (f766b5a)
  • Wave 5 fix-pass outcome — 15/15 findings resolved, verified, device re-confirmed (e21837d)
  • tutorial — player-pace drive study + RoK comparison (ashen-tutorial-analysis.md) (bed5532)
  • DONE-gate result — on-device smoke passed (Pixel 3a) (2d554b8)
  • app-store execution plan (wave orchestration) (1529591)
  • tutorial — retention redesign plan — serialized attention, commander choice, free pack (aa8e3ae)
  • tutorial — live-verified Rise of Kingdoms tutorial study + retention analysis (c852911)
  • tutorial — playbook notes for verifying the tutorial on the default Pixi renderer (70c80ba)
  • re-score — all 9 gates satisfied (continuous run confirms changed flow clean) (13f7012)
  • tutorial grading scorecard (6/9 hard gates verified + committed) (2271ce7)
  • tutorial client-side sandbox plan (Rev 2, post Codex review) (fd511be)
  • record cutover revert (old tutorial UI restored as default) (b934e77)
  • record Phase 2 cutover executed + Codex-reviewed (c1a3f9f)
  • Phase 1 done + Phase 2 importer audit (corrects deletion scope) (19d6f65)
  • tutorial client-only refactor plan (Rev 2, post Codex review) (1fc7473)
  • fix stale CLAUDE.md references and generalize model-specific guidance (be55716)
  • codify "every timer is boostable" + "we sell time and power" (3b337cd)
  • economy & progression analysis (Zeninn model account + top-tier cohort) (84bb9e8)
  • store — Fastlane submission automation + iOS platform dep (53bf632)
  • remove dead code (unused locals, constants, config keys, exports) (51731fc)
  • map — refresh citadel art (new tile_citadel, 1344×1052) (8743b47)
  • android — release signing config + release-build guide (c542fb8)
  • map — remove the zoomed-in FRONTIER + THE ASHLANDS zone labels (00568df)
  • map — hover glow is a grid-aligned iso cube, not a flat square (0f2a74f)
  • map — hover entity glow is a rectangular column, not an ellipse (4392213)
  • hud — food deficit rate "+0"; reposition "stays 0" note left + green (3e27c1d)
  • map — dormant sunken arcology — faded diagonal stripes, no border, no name (a2e26a5)
  • hud — divider on the right of the rations pill too (44c9c1f)
  • hud — more space + visibility for resource-bar dividers (b5e409e)
  • hud — subtle vertical dividers between resource pills (6ce176d)
  • hud — compact resource bar — drop "/h", tighten gaps, slide left (9f34ce0)
  • hud — move Replays badge to top-right in the expanded menu (like Task Log) (aedabc4)

Other

  • assets: 4 Google Play store screenshots (world map, barracks, commander, events) (1383dcd)
  • docs+assets: Play Store feature graphic + corrected odds-disclosure UX note (86a1f32)
  • docs+lint(tutorial): redesign shipped — plan status, drive primitives, index-pin update (00207bd)
  • wip(app-store): Track A crypto-strip + plan docs + store-assets (pre-rebase snapshot) (3ddb407)
  • docs+landing: align positioning to canonical 4X + ownership thesis (4990671)
  • hotfix(map): restore _ls0 def — Pixi map regressed to canvas-2D after merge (#343) (1d6a142)
  • tune(map): raise Citadel label block 2 more lines (45efc42)
  • tune(map): raise THE CITADEL ~1.5 lines, alliance lines flush as line 2/3 (c79176a)
  • tune(map): narrow haul bars 10%, raise + tighten the Citadel label block (1150155)
  • tune(map): black outline on site haul bar + fill matches label colour (21f0722)
  • tune(map): hold site/beacon/arcology icons a notch longer before far-zoom dots (f6bce3e)
  • tune(map): slow the normal cloud cover 3x (rings 0/1/3) (9ad9fa4)
  • tune(map): rain only in vision; bolder + faster CCW sandstorm swirl (e47ccf7)
  • tune(map): tame the Wastes acid rain + confine it to ring 2 only (a3e2180)
  • tune(map): drop the green companion line; tint the single grid line slightly green (f3382b9)
  • tune(map): add a mid-green 1px grid line 1px below the ivory one (5086716)
  • tune(map): move Hollowpoint Systems → 119,131 and The Birdsong Relay → 119,157 (4671c17)
  • art(map): refresh the Summon Beacon sprite again (d5b7eb0)
  • tune(map): single 1px grid line, near-white-brown color (5cbc6f0)
  • tune(map): blend a hint of brown into the grid blue + fade grid on zoom-out (97121bf)
  • art(map): refresh the Summon Beacon sprite again (20de8ca)
  • tune(map): nudge grid blue a bit whiter (0x55A6F0 -> 0x6EB3F2) (6aab9f6)
  • art(map): refresh the Summon Beacon sprite (bf46671)
  • tune(map): drop the main grid line to 85% opacity (30e261a)
  • tune(map): fake 1.5px grid with a crisp 1px line + faint offset 1px line (5b856e4)
  • art(map): refresh megatower sprite again (256×384, 2:3) (25b0913)
  • art(map): refresh the risen-arcology (megatower) sprite (4263469)
  • tune(map): thicker bluer grid + map-wide radar band (7cb9168)
  • tune(map): decouple wave interval from sweep speed — 14s apart, 20% faster cross (1f24061)
  • tune(map): revert 2px grid back to 1px, brighten the blue instead (a1cbb2a)
  • tune(map): 2px blue grid lines, 1px white wave, ~2x faster sweep (b1efaff)
  • tune(map): brighter blue grid, softer white sweep, slightly faster cadence (033d933)
  • tune(map): reduce the piss filter strength to 80% (WARM_FILTER_ALPHA 0.13 → 0.104) (392193c)
  • tune(map): much bigger + much slower clouds (c1799d9)
  • tune(map): make the cloud cover clearly visible (CLOUD_ALPHA 0.5 -> 0.8) (916eba0)
  • tune(map): bigger, slower drifting clouds (ff6526b)
  • balance(alliance): set per-pair help cap to 3 (data-calibrated) (e5a21a1)
  • harden(alliance): race-safe per-pair cap + index (Codex review) (1b08486)
fbb6751

Fixes

  • pvp — resolve crawler defense from the defending commander's live squad (0774202)
  • economy — scale extraction credit faucet to 0.3 (Lever 2) (bdcf574)

Internal

  • clarify basket claim-model + scope the formations-retirement follow-up (cf2bc3b)
11fe282

New & Changed

  • events — percentile leaderboard prizes (top 50% scaling to rank 1) (b0f2f7e)
  • extraction — show "+N% loot" boost chip for seed-band sites in the squad panel (4838a6d)
  • extraction — seed Wastes/Deep Wastes with accessible on-ramp sites (743ad91)

Fixes

  • extraction — wire on-ramp seed sites into the live boot path (c3da48c)
  • worldmap — stop off-map camera default rendering a grey screen (5181db3)
  • mobile — pause audio when the app is backgrounded (48b6481)
  • battle-consistency — stop false-flagging Field Medic (skill_proc) heals (9deb1ec)

Internal

  • server — sweep 10 dead internal helpers (codex-verified) (9547786)
  • server — remove 22 dead exports (codex-verified, zero callers) (625a023)
  • worldmap — delete retired SQLite-era world-init functions (dead post-cutover) (4d785bb)

Other

  • balance(arcology): cut Sunken Arcology leaderboard ash (500/200/100 -> 100/50/25) (ea963a5)
419fcd1

New & Changed

  • hospital — unified per-pool heal queue + one queue-level boost (192d7f9)

Fixes

  • hospital — boost control at top of queue + release healed rows on read (6c3308a)

Other

  • balance(hospital): cryostasis boost cost scales (3× hospital rate), no flat floor (54e5b65)
78c1d54

New & Changed

  • speedup — free-boost window = max(10% of total, 120s) + boost:free-ready socket (2faa34a)
  • alliance — confirm kick/demote + name the player in the action log (8c31819)
  • economy — deploy cost = 5% of training cost (T2/T3 split into credits) + Logistics research (0f1ec2e)
  • battle-report — list equipment bonuses in COMBAT BUFFS modal (d7689ae)
  • zealy — extend siege power-destroyed ladder to 300k/400k/500k (08db6f2)
  • megatower — Sunken Arcology cache opens an extraction-style loot reveal (4594c48)
  • economy — Lever 2 — pulls + skill-card craft cost credits (credit sinks) (118334f)

Fixes

  • siege — squad-lock derives from the live rotation stage (unlock orphaned-stage rows) (8378de4)
  • hospital — BOOST on a queued heal stack lowers its own timer, doesn't start it (1773eb9)
  • siege — unlock squad preset after a Citadel loss (filter terminal queue rows) (449c1cd)
  • socket — guard connectSocket against unloaded io global (6861eee)
  • replay — cap unit count at startCount + sync maxHP from resolver (5d8ee0b)
  • anomaly-scan — filter terminal siege rows from double_deployed_commander (0e713a0)
  • megatower — allow skill-swap while deployed; raise panel above chat (269d6c3)
  • shop — emit currency:update after golden_ashes grants/spends (393856d)
  • worldmap — one extraction march arrow, glued to a moving crawler (f7f9f4a)
  • hospital-screen undefined-array crash + CI gating fail-open (d25baa5)
  • megatower — harden advance + guard races, add markReturned arity lint (7d4cf19)

Internal

  • shop — add verify-currency-emit drift lint for golden_ashes routes (eccf22d)
  • megatower — rewrite run + ghost verify for the real-basket model (54fe70c)
6278d9f

New & Changed

  • arcology — real-basket Megatower + single crawler-arrival sound (0f57a41)

Fixes

  • extraction — close heat lost-update race (92bf372)
  • alliance — stop troop-help slider freezing at 1/1 (7011482)
  • landing — mobile-portrait hero polish + kill horizontal scroll (54fed8c)
  • client — guard the worldTiles render loop against null (not iterable) (b72c46e)
  • client — guard null socket in squad-rail + objectives-panel socket wiring (a46422e)
  • armory — restore skill-description text contrast under beige theme (75fa1b5)
  • tutorial — kill generator-step + hospital-boost panel jank (d2f72f4)

Internal

  • hospital — behavioral sequential-heal queue + boost verification (2feda71)
  • gate heavy jobs by changed paths + trigger to cut Actions minutes (add6015)
38b8ca9

New & Changed

  • tutorial — self-heal missing step entities on connect + stuck-player watchdog (4eef85d)
  • mail — player & officer mail — compose/reply/block UI + abuse limits (ad9d65a)

Fixes

  • tutorial — keep the panel off the highlighted modal button (bank-reveal DONE) (cd2d9e3)
  • tutorial — lock the camera on ALL on-map objective steps (not just beacon) (d1b6388)
4d7767a

Fixes

  • tutorial — reliably center the crawler on the beacon step + recenter helper (e6e716a)
  • extraction — enforce commander leadership cap on deploy (60de05c)
  • extraction — reset per-squad run-state on PvP site takeover (df038dc)
  • socket — pair emits with state mutations across socket audit findings (f9e11c4)
  • skill — promote — changelog branch-PR + scoped notes (drop broken bypass) (#165) (fd088e2)
  • lint — verify-deploy-paths false-positive on is_deployed clear (#167) (fff79e1)

Internal

  • pvp — land staging PvP E2E + leadership-bypass probe (4699ce3)
f9e903c

Fixes

  • tutorial — release orphaned commander on recover so the deploy step isn't stuck (#162) (f9e903c)
  • tutorial — frame the Summon Beacon step so the camera keeps the crawler in view (#161) (aca9d36)
  • tick — run orphaned-commander sweep on reliable cadence, not now%60 (#160) (13d3b2e)
  • whisper+lore — radial WHISPER retargets via dossier path; catalyst_cache lore (066c192)
9696a93

New & Changed

  • scripts — read-only prod data-integrity anomaly scanner (56ccb96)
  • arcology mailbox rewards, crate→haul extraction UI, region renames, social (239d580)

Fixes

  • concurrency — defer crawler-destroy hooks post-commit (replace tx-threading) (c98b9ef)
  • concurrency — crawler-destroy deadlock + hospital heal/loss races (a09c485)
  • alliance — clear orphaned siege state on disband (citadel_stage_progress + siege_lockouts) (b30ddc9)
  • extraction — deterministic squad-rail ordering (id ASC tiebreaker) (a62e4cc)
  • shop — gate /shop/purchase-ash off production (no-receipt ASH-mint STUB) (d984556)
  • concurrency — claim-guard 3 Sweep-B idempotency double-grants (81e5bab)
  • concurrency — megatower ghost/guard duplicate-troop-grant claim-guards (e6f8dcf)
  • concurrency — atomic claim-guards on 5 high-sev double-process paths (d3179e2)
  • extraction — refresh the pending-haul chip when a squad returns (e42a4d6)
  • Ceaserkrizz prod bug report — loot-on-return, reconnect, injury recover (6917987)
  • auth — respawn despawned players on /auth/refresh (11d678c)
  • debug — force-despawn endpoint calls despawnPlayer directly (6ac91af)
  • alliance,despawn — gate inactivity prune + despawn on last_tick_at, not last_login_at (79d61f7)
  • crawler — atomic shield toggle + Wastes/Deep Wastes parity (c0a476d)
  • pvp — extraction-PvP dual-leader resolution gate + arrival alliance re-check (4fbe65f)
  • pvp — atomic claim-guards on raid + siege resolution/return/recall (862d72c)
  • extraction — one PvP attack = one battle (idempotent queue by raidId) (3edfa45)

Internal

  • equipment-system — finalize mails Arcology caches (claim-from-mailbox), not direct grant (909632f)
7186124

New & Changed

  • analytics — /analytics/abuse — sock-puppet / IP-farming discovery (81a4257)
  • map+extraction+defender — scooter range, summon beacon, ring-3 vision, 4h site relocation, defender event UI (e3c588b)

Fixes

  • extraction — unique delivery id per run — stop dropping repeat-deplete chests (9784d68)
  • social-rewards — grant per-platform ASH, remove YouTube (66e60c3)
  • tutorial+extraction — airtight tutorial flow, all-tier cycle regen, ECHO-7 fix (5f37046)
  • server — command_center level reverts to Lv1 while upgrading (a6fb2fe)
  • server — building benefits revert to fallback while upgrading (bundle) (ff1a28f)
  • server — building capacity/cap reverts to fallback while upgrading (deac06e)
  • server — training cap collapsed to Lv1 while barracks upgrading (68bc928)

Internal

  • server — getBuildingLevel helper + lint the is_upgrading=0 read class (04f56b6)
  • slim reviewers to cite CLAUDE.md + wire /pre-pr to invoke them (17de394)
  • extraction — enforce banked-implies-delivery invariant (static + behavioral) (68264b3)
  • carry-cap — re-baseline loot-content assertions to the DROP_TABLE model (3a4c40d)
  • carry-cap — re-pin stale T2 yield expectation to 16k (e094243)
  • scripts — migrate guest-auth + carry-cap verify off sync SQLite API (e3f9ff8)
  • social-rewards — rewrite verify script for Postgres (c0893a9)
  • add Claude Code setup guide + share read-only permission allowlist (d9fe473)
  • add db-tx reviewer, push guard, verify-on-edit, /promote + /pre-pr (75e1931)
  • share Claude Code config — syntax-check hook, code reviewers, MCP servers (1cb8218)
ee1f382

New & Changed

  • telemetry — director tools — churn autopsies, deploy markers, rage-quit detector, prod backfill (#108) (04cf4b2)

Fixes

  • zealy — Zealy Connect callback must be a top-level navigation (93f19af)

Internal

  • zealy — end-to-end Zealy Connect handshake verify + connect-flow docs (f526325)
  • zealy — record prod ZEALY_CONNECT_DEFAULT_RETURN_URL override and why (1e0c195)
5c97c12

New & Changed

  • telemetry — Phase 5 — anomaly digest + combat-balance watcher loop scripts (13850e6)
  • telemetry — Phase 4 — decommission Metabase, add coverage-gated retention prune (a948aa8)
  • telemetry — Phase 3 — combat/economy instrumentation + funnel/combat/economy dashboards (f02969f)
  • telemetry — Phase 2 — first-party /admin/analytics dashboard (Alpha Health + Errors) (87d49dd)
  • telemetry — Phase 1 foundations — hardened ingest, error capture, metric rollups (39e0f58)

Fixes

  • ui — extract deploy modal shows server-authoritative squad counts (cf2b2b4)
  • client — suppress phantom Reconnected chat message on non-reconnect resyncs (46e888f)
  • ui — upgrade costs in blocked state, deploy modal preset cutoff + cost, chat docked-preview fixes (84d4034)
  • pg — cast aggregates feeding typed consumers; repair 3 endpoints dead since PG cutover (e344c46)

Internal

  • pvp — fix pvp-test.js for commander-required raids + shield-drop cooldown (88c9d17)
  • telemetry — user guide for Telemetry v2 (502f4f2)
  • zealy — sprint went live — USDC auto-distribution, $45 1st place (ed254c1)
55af09e

New & Changed

  • zealy — power-milestone sprint endpoint + commander power recalibration (a46eb1d)
  • client — juice kit — milestone celebrations, choice cards, Obtain routing (Phase A4) (fbda257)
  • client — Awakening presentation — HUD reveal, claim glow, Ada keywords (Phase A3) (a8a33ff)
  • client — mood-lighting tint + vignette on world map (Phase A2) (0b63523)
  • client — motion tokens + screen-enter transitions + canvas veil (Phase A1) (afd883a)
  • client — dispatch migration — remaining screens and panels (0cb28ad)
  • client — dispatch migration — world map (27 actions) (6eabc14)
  • client — dispatch migration — shop, market, workshop (17 money paths) (fefa060)
  • client — global same-frame press ack on every button click (ad91168)
  • client — dispatch migration — army + megatower screens (20 actions) (2723da8)
  • client — dispatch migration — alliance screen (27 actions) (fd72d18)
  • client — dispatch migration — auth, barracks, tutorial, chat, tips (fragile set) (dcc9dee)
  • client — action dispatcher — same-frame ack, single-flight, timeout, kill switch (6f00168)
  • encyclopedia+extraction — Encyclopedia menu, site-specific gear, HUD polish (8cf03ca)
  • worldmap — redesign tile-info tooltips — extraction + generic + shared header (89d12a4)
  • barracks/siege — true-basket parity + perf + UX session (9c26031)
  • map — Deep Wastes gets the safe-ring chill weather + soft fog fade at the boundary (aaf7a6e)
  • map — expand Wastes ring +10% (95->104.5), shrinking Deep Wastes (f88c567)
  • map — Deep Wastes ring is fog-free + visible PvP (high-risk outer zone) (20a6ca8)
  • barracks — live-update on heal via server refetch; drop optimistic slot surgery (200be1b)
  • barracks — allow assigning hospitalized units to a slot (+ orange warning) (83362d3)
  • deploy — restore preset selector (1/2/3) in extract send modal (e5ce032)
  • menus — facility topbar title shows current level (BARRACKS · Lv 5) (be9ab71)
  • security — server-side per-commander squad store + retag clamp (790ef3f)
  • reserves — regen high-water display with 490/500 + regen-plus (9e5c1de)
  • barracks — squad-priority replacement from Reserves on return (13f9a1f)
  • barracks — live squad updates while commander is deployed (19faba6)

Fixes

  • extraction+test — root-cause qa-test wave flake; harden tick loops against silent starvation (fa17374)
  • client — paint screens before fetching — no more black-screen hang on slow loads (6238415)
  • client — boost rows say NEED n when unaffordable, not a mute grey-out (850a5b7)
  • client — boost modals — stale-fetch guard for rapid multi-spend (8da04aa)
  • client — boost modals — live timers + visible catalyst-spend reaction (b8aa201)
  • client — remove alliance screen-wide _busy double-gate (review finding 11) (6292593)
  • client — single celebration pipeline + offline catch-up ledger (Phase A follow-up) (0dc0286)
  • client — wallet flows un-deadlined, AMM confirm disable moved inside dispatch (findings 9, 12a) (51b7a4b)
  • client — event-decide cross-surface key + bounded force-deploy retries (findings 5, 8) (12d2a37)
  • client — de-wrap last-write-wins toggles/saves wrongly single-flighted (review finding 6) (9846c96)
  • client — dispatcher core hardening from PR-94 review (findings 1-4, 7, 9, 12b, 14, 15) (a926ad6)
  • client — mail force-delete flag never reached the server (1e43448)
  • client — drop _doMove rethrow — double-toasted via dispatcher catch (7c0e230)
  • lint — direct-post marker must sit on the line directly above the call (9dcb984)
  • client — bank-reveal double-open race + dispatcher migration for haul flow (6257482)
  • encyclopedia — drop the loot-table descriptor line (6cd89e3)
  • ci+sweep — clear 3 CI lints + 3 dormant bugs surfaced by general check (2514980)
  • release wave-pause on the resolveWave exhaust early-return (4070e58)
  • clear orphaned extraction cycle-pause refcount on boot (a648fb7)
  • resource realize preserves concurrent spends (lost-update dupe) (98b88b6)
  • guard build-upgrade and research deducts against concurrent races (b230a6a)
  • cryo instant-revive tech-core cost now scales with stack size (ee1b8a5)
  • use PG jsonb extraction in analytics queries (was SQLite json_extract) (0bb9ffa)
  • keep siege point contested during an active battle (overtime hold) (4f84163)
  • serialize beacon-summon gacha to stop free-pull duplication (6969681)
  • cap duplicate building placement (unlimited-free-building exploit) (253421a)
  • close free-speedup exploit and megatower exit troop duplication (9fa89f8)
  • barracks/ui — client cache mirror on cmd-tagged heal + beacon SUMMON confirm (be00926)
  • hospital — pause cmd-tagged heal timers while commander is deployed (11d9a47)
  • events — no defender 'field decision' events when the crawler-defender basket is empty (3b744e0)
  • map — Deep Wastes is ALWAYS fog-free for everyone, not just when standing in it (44dcfba)
  • barracks — refetch reserves pool from server after a sick-move, not optimistic math (9684c4c)
  • siege — tag siege losses to the commander so they heal to the basket, not reserves (46fb9fa)
  • arcology — seed initial preview from the active commander's server basket (3ee0c5e)
  • hospital — distribute heal-back across slots; add troop-conservation regression test (9887c7c)
  • barracks — use server-derived wound gap verbatim, stop resurrecting stale localStorage requested (546a759)
  • barracks — stop full re-render every second from stale injury/training timers (17d38cc)
  • hospital — derive slot wound gap from real recovering rows — kill phantom wounds (0f2e654)
  • barracks — Reserves tile counts only NULL-tagged wounded, not commander-tagged (no double-count) (769b3c3)
  • megatower — clamp formation to survivors on floor advance instead of blocking ENGAGE (9fb2ae1)
  • barracks — only offer FREE reserves-bound sick to a slot, not other commanders' committed wounded (40a31fc)
  • barracks — make scale-to-fit robust against measurement race (offscreen clip) (e1b45ad)
  • barracks — slot editor sets ASSIGNED, derives healthy — wounded survive manual edits (ea2fabe)
  • troops — make server authoritative for squad live counts; Barracks reconciles on entry (c288b2d)
  • troops — preserve wounded indicator across edits, Megatower exit, and server sync (d26ab44)
  • megatower — clamp squad to bank-available, render 'live/requested' on under-supply (b26797a)
  • megatower — wire arcology to per-commander Barracks baskets (0ccfff5)
  • megatower — unified ecosystem — deduct only commanders squads, tag losses (5ce5ac4)
  • megatower — load formation from active commander's Barracks preset (081ec8f)
  • barracks — Reserves regen pool counts ALL pending hospital, not just NULL-tagged (c13374c)
  • dev — cache images for 60s in dev so wallpaper preloads actually stick (8e1ae46)
  • menu — preload home wallpaper via <link rel=preload> in HTML head (9202ea7)
  • menu — preload home full-bleed wallpaper (crawler_desert.png) + cipher tablet (1bbe2e5)
  • menu — preload hot wallpapers at app boot — no more cold-cache flicker (1a10d85)
  • menu — preload wallpaper before showing to prevent open-flicker (7b0af55)
  • tasks — remove hauls from Tasks panel — chest button surfaces them (84e0485)
  • barracks — Barracks edits move in-flight wounded to Reserves regen (28735dc)
  • hospital — cache bust on every state change + defensive INSERTs + logging (e4c726b)
  • barracks — _onWoundedHealedToSlot guarantees the slot bump lands (d83742d)
  • barracks — server-verified swap delta + bulk sync on entry (526d1fc)
  • return — client computes swap-with-Reserves using accurate squad data (b9a011a)
  • reserves — clear is_deployed BEFORE return_arrived emit (kept survivors out of Reserves) (6d0043d)
  • barracks — suppress regen during deploy + don't double-render wounded on Reserves (3905204)
  • return — snapshot bank pre-survivor + log swap calc end-to-end (e2c11e7)
  • reserves — pick up regen pool on Barracks enter + bust /army cache on return (432ceba)
  • barracks — subtract every commander's preset from Reserves, incl. benched (01eb41c)
  • barracks — authoritative squad rebuild from server payload + diag logs (eeac620)
  • barracks — keep dead slots visible as 0/N in deployed greyed-out grid (5381f88)
  • barracks — preserve requested high-water mark so wounded slash displays (434311b)
  • barracks — reconcile commander squad with survivors on return (e20c1a8)
  • barracks — unify clamp alert format + prefix commander name (98ac181)
  • barracks/preset — partial clamps also fire alert toast (cf89ae7)
  • barracks/preset — phantom slot keeps icon during flash + stacking alert toasts (55fcd1e)
  • barracks/preset — impossible clamp persists blueprint loss + visual stays at "500" (2bfcbb8)
  • barracks — training:complete socket re-renders commandScreen + stops tick (5dcc5f8)
  • workshop — inventory action buttons (CRAFT/PROMOTE/UPGRADE/RECYCLE) theme-aware (1cd0b9f)
  • workshop — army names + dark-mode prompt text + label copy (2d6c4a7)
  • barracks — training timer stuck when training starts mid-session (20d499f)
  • barracks — restore preset-switch bank-clamp + red flash (20976f1)
  • barracks — auto-load active preset on entry — match doc (8f6413e)
  • barracks — preset = squad's actual count, deploy greys instead of clamps (d8d9532)
  • barracks/picker — count editor opens at default size, not picker's full-screen (2835a6e)
  • preset loadPreset preserves requested + home-tile training timer + barracks tick (2ff14e4)
  • preset units vanish on deploy + chat bg width + chat input on SYS (42109aa)
  • chat — bg covers input on mid-size viewports, lighter inactive tabs, minus only on active tab (244632a)

Internal

  • client — code-review fixes — isCanvas hoist, token-derived re-measure, shared resource labels (6166d6c)
  • lint — sanitize strings/comments/regex + multiline dispatch detection (finding 13) (359363a)
  • lint — verify-action-dispatch — mutating api calls must route through dispatcher (2f71973)
  • Phase A criteria trued up to implementation (mood states, single-PR batching) (ab1be27)
  • Phase A motion-pass goal + success criteria (82ae857)
  • FGF Phase 1 competitor analysis — visual/UX technique catalog (eaaebdd)
  • test-coverage-log entry for action-dispatcher migration + verification (be8ddc3)
  • action-dispatcher convention in CLAUDE.md code conventions (3d17e72)
  • Phase 1 brief for FGF competitor analysis (session transfer) (1a76260)
  • record deferred-caveat resolutions (resource dupe, cycle-pause, refute) (b87353d)
  • log 2026-06-09 codebase-wide bug sweep (8 fixes + 2 open leads) (605c0d8)
  • slot editor sets ASSIGNED / derives healthy; wounded survive manual edits (40b85a9)
  • SUPREME RULE — one shared troop ecosystem (Reserves + squads + hospital) (cf766d2)
  • barracks — user's plain-language model + impossible-fulfillment is permanent (5f27a5d)
  • barracks — clarify — permanent loss just lowers the total (f991571)
  • barracks + commander presets — model, display rules, deploy lockout (1c5780c)
  • gitignore local agent-playtest scratch dir (raw dumps + JWT) (bd0b949)
  • gitignore local redis dump.rdb test artifact (551b419)
  • clean up stale references + dead code after recent reworks (f92ba04)
  • assets — re-encode crawler_desert PNG → JPG (2.27 MB → 213 KB) (17de2c7)
4aaf5e0

New & Changed

  • PvP-audit fixes + known-gaps closure (#60) (0971629)
  • tutorial onboarding overhaul + post-tutorial NPX polish (#56) (6119305)
  • infra — pool-stats emitter + generalize tx-propagation lint (#53) (7645f41)
  • infra — idle-tx watchdog + Phase 0 PG migration + accumulated staging work (#47) (511dbcb)
  • base/tablet — icon-top + LV-under + centered labels, button size unchanged (f199623)
  • theme — default to dark mode, keep toggle for light (1333da5)
  • vault — audit trail + operator restore for real-money export/import (#43) (2dbd092)
  • vault redesign (hero state + card grid + chip + import demote) + economy tune (#42) (9391494)
  • add commander NFT card art (8bdaf04)
  • polish commander mint landing flow (517a7dd)
  • add landing commander mint page (8fee0a9)
  • add Zealy commander NFT campaign flow (c5c0192)
  • commander equipment economy + squad modal polish (#41) (f65ae80)
  • events — Sunken Arcology lore frame + LOCATE button + rename (cc0a2f7)
  • map — haul-chest button — pending banked-haul indicator (map-only) (dec1078)
  • base — WELCOME EVENT button deep-links to welcome entry in events menu (3fdbccc)
  • events — list menu — sidebar + detail (welcome event placeholder) (1a1a0a4)
  • extraction — reveal pipeline polish + battle pause UX + foreign-tile hardening (#40) (8ee2553)
  • extraction — defer resource credit from bank → /claim (unified box reveal) (995c70d)
  • extraction — event-interrupt popup over reveal + lift first-cycle gate (915f260)
  • extraction — chaos-team-hardened extraction loop (64698f4)
  • base — enable 50/50 Cipher 1/2 roll on every home-screen entry (39f3f03)
  • base/cipher-1 — extraction banner now shows on mobile too (f60451f)
  • base/cipher-2 — extraction banner now shows on mobile too (aab2bb6)
  • base/banners — split per-cipher banner placement, lock Cipher 2 (a778495)
  • base/pc — +20% sand cluster size and count (955c855)
  • base/cipher-2/pc — pin menu anchor to phone-equivalent on PC (1c364b1)
  • base/cipher-2 — -10deg CCW menu rotation + right-side perspective tilt (baa544c)
  • base — 50/50 Cipher 1 / Cipher 2 variant system on home entry (5c4defc)
  • base — PC home screen mirrors phone layout via transform scale (b3a60c0)
  • map — HOME button (was CRAWLER) with proper dark chrome (8cda610)
  • chat — docked = same element as opened, cropped to 2 lines (b526839)
  • chat — unify docked + opened at 15.2 px (+10% on opened) (c95e1dd)
  • chat — docked -30%, opened +20%, opened +10% wider (df20048)
  • chat — extend opened-chat bg to bottom, shrink docked, unify SEND (93b18b4)
  • base — lock approved mobile tablet-menu geometry (d88a601)
  • base — wind sand clusters + pointer-drag tablet scroll + chat clearance (246cd35)
  • base — add soft sandy wind drift overlay (31de021)
  • crawler screen UI overhaul with cipher tablet menu (1468816)
  • extract+attack unified modal, cross-cmd troop allocation, clamp cue, more (8d6dc49)
  • mobile polish — Barracks scaling + map HUD + chat (f48711a)
  • Barracks UI polish — picker, train modal, drag-drop, layout (44a90ea)
  • bundle cold-load client assets (f074ab4)
  • audio — replace extraction reveal synth with RPG Interface Essentials assets (d7e8163)
  • extraction — cycle-pause primitive + event-as-badge UX + reveal polish (ab8faca)
  • bank-reveal — legendary near-miss fade (77e7d60)
  • reveal — cycle flight + haul ticker + landing pulse (e7d96cd)
  • reveal — particles, per-crate shimmer, haul rarity polish (ddee061)
  • reveal — soak-phase escalation — panel wash, screen overlay, LEGENDARY banner (2ac62ed)
  • reveal — phase-fraction pacing + real loot icons (match prototype) (de0e8f3)
  • reveal — squad-modal extracting layout — wide LEFT reveal column (c486caf)
  • debug — TEST ACCOUNT button + /api/debug/skip-tutorial endpoint (0b6e50f)
  • extraction — reveal audio + boot-time recall sweep (Phase 2e/f) (603d207)
  • extraction — value-only haul + cycle reveal area (Phase 2d) (5ca5032)
  • extraction — delivery boxes + bank reveal modal (Phase 2a/b/c) (777cc24)
  • extraction — per-cycle item registry + structured items[] emit (Phase 1) (ae71883)
  • add shard admission cap (dcfd880)
  • modernize chat baseline (09d9c2e)
  • add clean-start postgres cutover (2117658)
  • alliance — NPC starter alliance — Phase 2 (LLM persona) + Phase 3 (Citadel march) (b178fee)
  • add tick worker redis heartbeat (e29cf05)
  • map — animated packing-hourglass overlay above extraction sites (b28b413)
  • hud — scale top + bottom bars 20%, tighten chat alignment, fix wheel reopen on deploy (d9781dc)
  • add realistic scale readiness harness (edfec3d)
  • alliance — redesign Requests panel — single panel + tile-picker modal (cf6f937)
  • add redis replica readiness (da19ce5)
  • alliance — broadcast notable history events to chat + per-member contributions panel (e59243c)

Fixes

  • ui — cipher Firefox scaling, click swallowing, rate wrap + SIEGE PRESEASON (3412ffa)
  • separate shield-drop cooldown (30s) from squad-deploy prep (10s) (#59) (b4d452f)
  • security — pre-promote audit findings (#57) (4e6c051)
  • shutdown — arm force-exit timer first, halt tick loop between ops (#52) (e5e66f6)
  • chat/pc — bump message font 11→12 px (81bdae0)
  • chat/pc — drop viewport-scaled font on message rows (9a28b62)
  • shop — un-gate VAULT tab — remove "COMING SOON" + disabled state (098272a)
  • barracks — preserve original requested count on partial-clamp persist (053a981)
  • prefer versioned NFT commander art (cc7dba4)
  • polish vault export UI (09f6f9e)
  • restore commander vault export (bf2fb52)
  • remove in-game Zealy mint panel (6258cac)
  • harden campaign NFT burn import (1e9d1b4)
  • show and grant campaign import imprints (b545350)
  • stop megatower placeholder from bouncing to Welcome (e012921)
  • events — human-readable HOW TO SCORE for megatower + safer fallback (bf47fe4)
  • events — Sunken Arcology pinned in sidebar with inactive state (ee75514)
  • map/chest — socket-late-bind retry + 15s polling backstop (d077672)
  • chat — hoist hud-bottom z-index bump to global scope (PC + phone) (b57033d)
  • barracks — clear _returnTo in tutorial early-return path (af1d407)
  • chat — restore input+SEND on home + scope chat to base/worldMap (60425fc)
  • events — welcome placeholder no longer reverts after 1s (122b0bd)
  • barracks — DONE button honors _returnTo (restores extract→edit→back) (4b17d33)
  • chaos-test regressions + basket allocation filter (72cbe46)
  • polish base menus and preload assets (369814b)
  • extraction — bankHaul credits non-delivery delta (defender-event resources) (1d9de95)
  • extraction — sync event-interrupt overlay during same-scene patch (6355f6b)
  • extraction — Ignore closes overlay + Continue resumes reveal animation (4238a85)
  • extraction — defer haul celebration from bank → box-open + wire tasks refresh (79745ed)
  • extraction — Ignore button fires safe-default immediately (5b100c8)
  • chaos-team open-items polish pass (7e89774)
  • base — clean cipher body class in exit(); doc PC↔phone coupling (85f6f89)
  • base/cipher-2 — pin transform-origin so extended bottom keeps locked angle (527a366)
  • base/cipher-2 — extend menu bottom another 45px (34ca11b)
  • base/cipher-2 — extend menu bottom by 1 button height (PC + phone) (7645225)
  • base/pc — remove .base-fullbleed overflow:hidden on desktop (910c7dc)
  • base/pc — wallpaper full-viewport, hide bottom bar, fix chat-docked (51997c6)
  • map — HOME button flush to bottom-right corner, only top-left rounded (68984e2)
  • chat — shrink docked top-fade band 14 -> 6 px (28f887b)
  • chat — mask-fade top of docked chat to hide line slivers (bfc3162)
  • chat — persistent chat element across base + worldMap (3f74bf3)
  • chat — docked chat clickable + empty-state placeholder (d0a6850)
  • chat — minimize no longer wipes the docked preview (d450079)
  • chat — SEND grey to match placeholder + shorten input placeholder (17014a7)
  • chat — SEND button matches input height pixel-for-pixel (9e82dda)
  • unblock barracks tutorial flow (190a7a3)
  • enforce qa socket client coverage (82c8403)
  • scope back-button override to Barracks→Armory only (d42b35b)
  • server — allow dotfiles in / and /index.html sendFile (dac5b47)
  • harden cold-load dist serving (2449633)
  • cache static game assets (3a35c97)
  • prevent resource drift on speedup completions (af9b338)
  • debug — maxout grants 3 starter commanders, not 6 (22309b9)
  • reveal — review-pass — kill near-miss fade on skip, re-query haul on landing (f13d0e9)
  • reveal — pause-debt cycle bar, run-id abort, transient FX cleanup (129e242)
  • reveal — seed cycle bar + last-cycle crates on modal open (ba74e4e)
  • reveal — match cycle siteId against squad.id stripped of 'site:' prefix (56fc237)
  • hunter — await cancelDefenderPendingEvent inside try/catch (playbook §B) (14e134e)
  • post-cutover race-condition hardening (playbook §A) (ec081d9)
  • extraction — IIFE-wrap shared/itemRegistry.js (classic-script const collision broke client boot) (7d53bb3)
  • enforce realtime crawler visibility (452cd87)
  • narrow crawler presence fanout (120b61f)
  • bound tick burst work for load (a0525f4)
  • add postgres npc alliance drift columns (bed0fa0)
  • unblock alliance pr verification (3b272b3)
  • P0/P1 PR review — fulfillment contract, nested-tx, FK cleanup, encoding, verifier drift (df330d2)
  • type world map postgres filters (11bd56e)
  • repair postgres chat schema drift (5af5dfb)
  • keep player bases live in world cache (4de00c2)
  • alliance — invalidate research-bonus cache on level change (9e3f28f)
  • guard legacy market spends (effd08f)
  • persist sparse explored map features (c97abf0)
  • reduce scale read-path write pressure (371cf8e)
  • avoid load-test alliance tag collisions (fa8c566)
  • reduce crawler tick load for scale tests (f16ef32)
  • stabilize redis socket setup (9878853)

Performance

  • prepare single-shard 1k ccu path (bdfe21a)
  • batch training resource recompute (8ea671f)
  • batch tick training completion (3e32033)
  • make health checks db-free (d331e17)
  • batch resource safety buffs (7467639)
  • parallelize world map reads (b5d72d5)
  • cache auth player existence (3138726)
  • widen hot poll cache windows (50732d5)
  • align world tile cache with map polling (9df0c39)
  • cache shared world viewport tiles (d0a66c5)
  • cache serialized state responses (33d8479)
  • cache hot research bonus reads (1d202a0)
  • cache alliance help board lists (c187f85)
  • reuse world player alliance lookup (5206b30)
  • cadence gate moving vision invalidation (0195cf2)
  • jitter socket connect catchup (66448dd)
  • gate socket connection logs (fbfdec3)
  • cadence gate shield drain (61d33fb)
  • cache socket siege subscribe state (f8db0a7)
  • consolidate combat load reads (f8e9a00)
  • align state cache ttl with load cadence (f340a20)
  • compact extraction site read payloads (fb06e0e)
  • cache hot scale read payloads (4f165c4)
  • persist sparse event reveal memory (19dbb09)
  • throttle moving presence rechecks (0ba82f8)
  • avoid duplicate world player enrichment (dc424f9)
  • skip redundant frontier vision circles (def7de5)
  • bound resource safety bonuses (a6139fd)
  • consolidate scale state reads (ff25eab)
  • tune hot read cache windows (9a88fef)
  • cache stable hot read routes (c015055)
  • skip api response compression (1ab854b)
  • compact world reveal payloads (ec40baa)

Internal

  • collapse tx.mode === 'postgres' branches (Phase 3) (#50) (8e4c892)
  • drop SQLite, Postgres-only (Phase 2) + docker-compose fix (#48) (77ad817)
  • convert events manager to async db (8928b51)
  • convert megatower lifecycle to async db (d8c20ff)
  • convert dossier card manager to async db (15e22df)
  • convert mail and social rewards to async db (20142a9)
  • adapt async siege observer helpers (2a8f24e)
  • convert world map reads to async db (627dba5)
  • convert tutorial cleanup to async db (978a02b)
  • convert despawn ticks to async db (f3f5e5e)
  • adapt cloud and amm helpers to db adapter (561f581)
  • convert completion managers to async db (476ae93)
  • make tick helpers adapter-safe (d0011e1)
  • convert player deletion to async db (7025c6c)
  • convert alliance manager to async db (39132c8)
  • convert alliance help manager to async db (2f667ef)
  • convert alliance event logger reads (eb815b4)
  • convert debug routes to async db (a8e6c2d)
  • convert amm routes to async db (bc58b12)
  • convert tutorial route actions to async db (50a4996)
  • convert speedup routes to async db (bc64970)
  • convert commander routes to async db (cd19238)
  • convert extraction payload reads to async db (fda1c17)
  • convert raid routes to async db (bc9d3ab)
  • convert siege routes to async db (9579c53)
  • convert alliance route reads to async db (d9f4454)
  • convert small event routes to async db (a046e6d)
  • convert world route queries to async db (a8f51e5)
  • convert analytics routes to async db (69b2a47)
  • convert portal routes to async db (0f9aea6)
  • convert shop routes to async db (49c759d)
  • convert economy routes to async db (0c31162)
  • convert troop routes to async db (fac34cf)
  • convert chat manager to async db (544ff8e)
  • convert state payload reads to async db (41d928d)
  • make resource projection async (67e2bc9)
  • convert auth and quest paths to async db (379af9d)
  • add async db helpers for base routes (e0b9125)
  • port all 18 KNOWN_FAILING verify scripts + 4 real prod bug fixes (#54) (66692fd)
  • port 10 verify scripts from better-sqlite3 to pg.Client (#49) (c96454f)
  • qa — event UX moved from header badge → reveal-area popup overlay (7ed5646)
  • qa — address review findings on the SOCKETS + CLIENT sections (3147517)
  • qa — add SOCKETS + CLIENT regression coverage to qa-test (ad327d0)
  • stabilize world map qa under fog (ba8a926)
  • gate load health on server metrics (da05573)
  • isolate load setup metrics (c94511a)
  • instrument postgres query latency (1af84ff)
  • gate realistic load harness (6c31cd1)
  • add postgres post-cutover gate (2718c31)
  • stabilize staging postgres smoke (abbead5)
  • match client token refresh in load harness (954e997)
  • refresh load harness tokens before gameplay (2f0d5e3)
  • make load harness map camera sticky (6b60156)
  • add no-socket load diagnostic (6980771)
  • bound load harness request hangs (5fad066)
  • avoid setup player fanout (e52b988)
  • isolate load health probes (4143229)
  • add scale event-loop diagnostics (5f8dd3e)
  • clear explored tiles in load cohort reset (ed4273a)
  • add staging load cohort reset (4c3ec92)
  • stagger realistic load harness starts (086af58)
  • add staging redis smoke (a9f08c0)
  • fix stale refs after PR #53 lint rename + SQLite removal (#55) (489abec)
  • GOD SAVE CHECKPOINT — lock mobile crawler screen at d88a601 (6479c0e)
  • add staging qa load evidence (6364dc0)
  • record postgres load blocker (7fedf9a)
  • wrap 1k ccu readiness evidence (71f12d9)
  • record market guard staging verification (693918c)
  • record staging heartbeat verification (67bbb69)
  • note staging heartbeat deploy blocker (13e0a1b)
  • fix 1k report branch baseline (c703639)
  • record 750 socket ladder stop (f872464)
  • add 1k ccu readiness wrap report (725f294)
  • record world viewport cache 750-client result (6bf7e34)
  • refresh latest staging scale evidence (2767334)
  • record serialized state cache 750-client result (b9a8ace)
  • record http-only 750-client result (ec61272)
  • record research cache 750-client result (a323cc7)
  • record help board cache 750-client result (e8bf9f2)
  • record moving vision 750-client result (c2d5f82)
  • record 750 socket load result (58fcedf)
  • record socket cache 750-client result (353c244)
  • clarify tested scale commit (eb358b6)
  • record compact payload 750-client result (7229de7)
  • record hot-read cache 750-client result (6e3f2ad)
  • record sparse reveal 750-client result (801b0f4)
  • record 750-client scale blocker (474a994)
  • record 500-client staging pass (f89253f)
  • record isolated health load blocker (c8d25b4)
  • record consolidated state load evidence (9af0dfe)
  • record route cache load evidence (2202169)
  • record 500 ccu staging blocker (48e98fc)
  • alliance social cooperation audit + improvement plan (943baa6)
  • drop stale SQLite references after Postgres-only cutover (#62) (4aaf5e0)
  • compress audio assets (e65ca96)
  • remove dead founder pack join hook (2658e23)
  • remove redundant debug route requires (c940e33)
  • remove dead amm statements (4319ba4)
  • wire postgres runtime selector (c9de3ba)
  • add postgres bootstrap gates (2dbfcae)

Other

  • docs+refactor: PG-only docs cleanup + verify-script renames (Phase 4+5) (#51) (7f2b28a)
  • tune(menu-fx): walk back static + scanline cut from −30% to −10% (1af0f2b)
  • tune(menu-fx): −30% static + scanline, kill wallpaper flicker (a2b57e7)
  • wip: siv-version UI session work + merge staging (5e1e7a0)
  • tune(events/mobile): side-by-side lore frame, smaller image, locate in view (54488bb)
  • tweak(events): one-sentence HOW TO SCORE for Sunken Arcology (14a635a)
  • tweak(events): red SUBMERGED badge + 'Currently submerged' label (4300c79)
  • tune(map/mobile): haul-chest button -12% size on phone (55 -> 48) (b22f57b)
  • tune(map): haul-chest button +25% size (44 -> 55 px) (2b14f91)
  • art: darker orange menu icons + white per-hour resource rates (141323a)
  • art(base/menu): tablet menu icons → glowing orange (all 4 ciphers) (c1c4ee8)
  • tune(base/cipher-1/pc): shift banner -12px up, -6px left (ef6b8cc)
  • tune(base/cipher-1/pc): rotate banner -4deg CCW, shift -5px up (b063000)
  • tune(base/cipher-1/pc): rotate banner +15deg CW, shift +50px right (569ddbe)
  • tune(base/cipher-1/pc): rotate banner +10deg CW, shift -20px up (f66a674)
  • tune(base/cipher-1/pc): shift banner +60px down, +15px right (c646776)
  • tune(base/cipher-1/pc): shift banner -60px left, rotate -12deg (0fd87f0)
  • art(base): sync cipher PNGs, extend extraction banners to Cipher 1 (f8d7a1f)
  • art(base): sync updated cipher tablet PNGs from main repo (96c2c3c)
  • tune(base/pc): sand cluster scale 1.2 -> 1.1 (PC-only) (b298a37)
  • tune(base/cipher-2/pc): shift extraction banners 5px right (c2f5c40)
  • tune(base/cipher-2/pc): shift extraction banners another 34px left (a108c1b)
  • tune(base/cipher-2/pc): shift extraction banners -30px left, +3% size, tie to cipher (0f3e4b7)
  • art(base/cipher-2/pc): add extraction-tape banners overlay (6884ed5)
  • lock(base/cipher-2): mobile menu layout + crop top at viewport y=20px (488c285)
  • tune(base/cipher-2): +0.5deg clockwise menu rotation (5 -> 5.5) (b5ae1e7)
  • tune(base/cipher-2): reduce menu side-view angle (rotateY -36 -> -33) (6b7008c)
  • tune(base/cipher-2): nudge menu 1px left + 3px down (d899aa2)
  • tune(base/cipher-2): nudge menu 2px left + 5px down (8ea675e)
  • tune(base/cipher-2): nudge menu 4px left, 3px down, +2deg angle (c737438)
  • tune(base/cipher-2): bump menu side-view angle (rotateY -28 -> -34, perspective 550 -> 500) (6a26745)
  • tune(base/cipher-2): +3deg clockwise rotation on menu plane (2b3cf0d)
  • tune(base/cipher-2): stronger right-side perspective tilt on menu plane (5256a87)
  • art(base): swap back to Cipher 1; full Cipher 1/2 spec in comments (463f8ad)
  • art(base): shrink Cipher 2 (angled) ~7.5%, label both cipher options (bd8f0c8)
  • art(base): swap cipher tablet art to the angled variant (11b9b2f)
  • checkpoint: Barracks redesign — known-good Squads + Reserves layout (aa44f4b)
1b959cd

New & Changed

  • tutorial onboarding overhaul + post-tutorial NPX polish (#56) (6119305)
  • infra — pool-stats emitter + generalize tx-propagation lint (#53) (7645f41)
  • infra — idle-tx watchdog + Phase 0 PG migration + accumulated staging work (#47) (511dbcb)
  • base/tablet — icon-top + LV-under + centered labels, button size unchanged (f199623)
  • theme — default to dark mode, keep toggle for light (1333da5)
  • vault — audit trail + operator restore for real-money export/import (#43) (2dbd092)
  • vault redesign (hero state + card grid + chip + import demote) + economy tune (#42) (9391494)
  • add commander NFT card art (8bdaf04)
  • polish commander mint landing flow (517a7dd)
  • add landing commander mint page (8fee0a9)
  • add Zealy commander NFT campaign flow (c5c0192)
  • commander equipment economy + squad modal polish (#41) (f65ae80)
  • events — Sunken Arcology lore frame + LOCATE button + rename (cc0a2f7)
  • map — haul-chest button — pending banked-haul indicator (map-only) (dec1078)
  • base — WELCOME EVENT button deep-links to welcome entry in events menu (3fdbccc)
  • events — list menu — sidebar + detail (welcome event placeholder) (1a1a0a4)
  • extraction — reveal pipeline polish + battle pause UX + foreign-tile hardening (#40) (8ee2553)
  • extraction — defer resource credit from bank → /claim (unified box reveal) (995c70d)
  • extraction — event-interrupt popup over reveal + lift first-cycle gate (915f260)
  • extraction — chaos-team-hardened extraction loop (64698f4)
  • base — enable 50/50 Cipher 1/2 roll on every home-screen entry (39f3f03)
  • base/cipher-1 — extraction banner now shows on mobile too (f60451f)
  • base/cipher-2 — extraction banner now shows on mobile too (aab2bb6)
  • base/banners — split per-cipher banner placement, lock Cipher 2 (a778495)
  • base/pc — +20% sand cluster size and count (955c855)
  • base/cipher-2/pc — pin menu anchor to phone-equivalent on PC (1c364b1)
  • base/cipher-2 — -10deg CCW menu rotation + right-side perspective tilt (baa544c)
  • base — 50/50 Cipher 1 / Cipher 2 variant system on home entry (5c4defc)
  • base — PC home screen mirrors phone layout via transform scale (b3a60c0)
  • map — HOME button (was CRAWLER) with proper dark chrome (8cda610)
  • chat — docked = same element as opened, cropped to 2 lines (b526839)
  • chat — unify docked + opened at 15.2 px (+10% on opened) (c95e1dd)
  • chat — docked -30%, opened +20%, opened +10% wider (df20048)
  • chat — extend opened-chat bg to bottom, shrink docked, unify SEND (93b18b4)
  • base — lock approved mobile tablet-menu geometry (d88a601)
  • base — wind sand clusters + pointer-drag tablet scroll + chat clearance (246cd35)
  • base — add soft sandy wind drift overlay (31de021)
  • crawler screen UI overhaul with cipher tablet menu (1468816)
  • extract+attack unified modal, cross-cmd troop allocation, clamp cue, more (8d6dc49)
  • mobile polish — Barracks scaling + map HUD + chat (f48711a)
  • Barracks UI polish — picker, train modal, drag-drop, layout (44a90ea)
  • bundle cold-load client assets (f074ab4)
  • audio — replace extraction reveal synth with RPG Interface Essentials assets (d7e8163)
  • extraction — cycle-pause primitive + event-as-badge UX + reveal polish (ab8faca)
  • bank-reveal — legendary near-miss fade (77e7d60)
  • reveal — cycle flight + haul ticker + landing pulse (e7d96cd)
  • reveal — particles, per-crate shimmer, haul rarity polish (ddee061)
  • reveal — soak-phase escalation — panel wash, screen overlay, LEGENDARY banner (2ac62ed)
  • reveal — phase-fraction pacing + real loot icons (match prototype) (de0e8f3)
  • reveal — squad-modal extracting layout — wide LEFT reveal column (c486caf)
  • debug — TEST ACCOUNT button + /api/debug/skip-tutorial endpoint (0b6e50f)
  • extraction — reveal audio + boot-time recall sweep (Phase 2e/f) (603d207)
  • extraction — value-only haul + cycle reveal area (Phase 2d) (5ca5032)
  • extraction — delivery boxes + bank reveal modal (Phase 2a/b/c) (777cc24)
  • extraction — per-cycle item registry + structured items[] emit (Phase 1) (ae71883)
  • add shard admission cap (dcfd880)
  • modernize chat baseline (09d9c2e)
  • add clean-start postgres cutover (2117658)
  • alliance — NPC starter alliance — Phase 2 (LLM persona) + Phase 3 (Citadel march) (b178fee)
  • add tick worker redis heartbeat (e29cf05)
  • map — animated packing-hourglass overlay above extraction sites (b28b413)
  • hud — scale top + bottom bars 20%, tighten chat alignment, fix wheel reopen on deploy (d9781dc)
  • add realistic scale readiness harness (edfec3d)
  • alliance — redesign Requests panel — single panel + tile-picker modal (cf6f937)
  • add redis replica readiness (da19ce5)
  • alliance — broadcast notable history events to chat + per-member contributions panel (e59243c)

Fixes

  • separate shield-drop cooldown (30s) from squad-deploy prep (10s) (#59) (b4d452f)
  • security — pre-promote audit findings (#57) (4e6c051)
  • shutdown — arm force-exit timer first, halt tick loop between ops (#52) (e5e66f6)
  • chat/pc — bump message font 11→12 px (81bdae0)
  • chat/pc — drop viewport-scaled font on message rows (9a28b62)
  • shop — un-gate VAULT tab — remove "COMING SOON" + disabled state (098272a)
  • barracks — preserve original requested count on partial-clamp persist (053a981)
  • prefer versioned NFT commander art (cc7dba4)
  • polish vault export UI (09f6f9e)
  • restore commander vault export (bf2fb52)
  • remove in-game Zealy mint panel (6258cac)
  • harden campaign NFT burn import (1e9d1b4)
  • show and grant campaign import imprints (b545350)
  • stop megatower placeholder from bouncing to Welcome (e012921)
  • events — human-readable HOW TO SCORE for megatower + safer fallback (bf47fe4)
  • events — Sunken Arcology pinned in sidebar with inactive state (ee75514)
  • map/chest — socket-late-bind retry + 15s polling backstop (d077672)
  • chat — hoist hud-bottom z-index bump to global scope (PC + phone) (b57033d)
  • barracks — clear _returnTo in tutorial early-return path (af1d407)
  • chat — restore input+SEND on home + scope chat to base/worldMap (60425fc)
  • events — welcome placeholder no longer reverts after 1s (122b0bd)
  • barracks — DONE button honors _returnTo (restores extract→edit→back) (4b17d33)
  • chaos-test regressions + basket allocation filter (72cbe46)
  • polish base menus and preload assets (369814b)
  • extraction — bankHaul credits non-delivery delta (defender-event resources) (1d9de95)
  • extraction — sync event-interrupt overlay during same-scene patch (6355f6b)
  • extraction — Ignore closes overlay + Continue resumes reveal animation (4238a85)
  • extraction — defer haul celebration from bank → box-open + wire tasks refresh (79745ed)
  • extraction — Ignore button fires safe-default immediately (5b100c8)
  • chaos-team open-items polish pass (7e89774)
  • base — clean cipher body class in exit(); doc PC↔phone coupling (85f6f89)
  • base/cipher-2 — pin transform-origin so extended bottom keeps locked angle (527a366)
  • base/cipher-2 — extend menu bottom another 45px (34ca11b)
  • base/cipher-2 — extend menu bottom by 1 button height (PC + phone) (7645225)
  • base/pc — remove .base-fullbleed overflow:hidden on desktop (910c7dc)
  • base/pc — wallpaper full-viewport, hide bottom bar, fix chat-docked (51997c6)
  • map — HOME button flush to bottom-right corner, only top-left rounded (68984e2)
  • chat — shrink docked top-fade band 14 -> 6 px (28f887b)
  • chat — mask-fade top of docked chat to hide line slivers (bfc3162)
  • chat — persistent chat element across base + worldMap (3f74bf3)
  • chat — docked chat clickable + empty-state placeholder (d0a6850)
  • chat — minimize no longer wipes the docked preview (d450079)
  • chat — SEND grey to match placeholder + shorten input placeholder (17014a7)
  • chat — SEND button matches input height pixel-for-pixel (9e82dda)
  • unblock barracks tutorial flow (190a7a3)
  • enforce qa socket client coverage (82c8403)
  • scope back-button override to Barracks→Armory only (d42b35b)
  • server — allow dotfiles in / and /index.html sendFile (dac5b47)
  • harden cold-load dist serving (2449633)
  • cache static game assets (3a35c97)
  • prevent resource drift on speedup completions (af9b338)
  • debug — maxout grants 3 starter commanders, not 6 (22309b9)
  • reveal — review-pass — kill near-miss fade on skip, re-query haul on landing (f13d0e9)
  • reveal — pause-debt cycle bar, run-id abort, transient FX cleanup (129e242)
  • reveal — seed cycle bar + last-cycle crates on modal open (ba74e4e)
  • reveal — match cycle siteId against squad.id stripped of 'site:' prefix (56fc237)
  • hunter — await cancelDefenderPendingEvent inside try/catch (playbook §B) (14e134e)
  • post-cutover race-condition hardening (playbook §A) (ec081d9)
  • extraction — IIFE-wrap shared/itemRegistry.js (classic-script const collision broke client boot) (7d53bb3)
  • enforce realtime crawler visibility (452cd87)
  • narrow crawler presence fanout (120b61f)
  • bound tick burst work for load (a0525f4)
  • add postgres npc alliance drift columns (bed0fa0)
  • unblock alliance pr verification (3b272b3)
  • P0/P1 PR review — fulfillment contract, nested-tx, FK cleanup, encoding, verifier drift (df330d2)
  • type world map postgres filters (11bd56e)
  • repair postgres chat schema drift (5af5dfb)
  • keep player bases live in world cache (4de00c2)
  • alliance — invalidate research-bonus cache on level change (9e3f28f)
  • guard legacy market spends (effd08f)
  • persist sparse explored map features (c97abf0)
  • reduce scale read-path write pressure (371cf8e)
  • avoid load-test alliance tag collisions (fa8c566)
  • reduce crawler tick load for scale tests (f16ef32)
  • stabilize redis socket setup (9878853)

Performance

  • prepare single-shard 1k ccu path (bdfe21a)
  • batch training resource recompute (8ea671f)
  • batch tick training completion (3e32033)
  • make health checks db-free (d331e17)
  • batch resource safety buffs (7467639)
  • parallelize world map reads (b5d72d5)
  • cache auth player existence (3138726)
  • widen hot poll cache windows (50732d5)
  • align world tile cache with map polling (9df0c39)
  • cache shared world viewport tiles (d0a66c5)
  • cache serialized state responses (33d8479)
  • cache hot research bonus reads (1d202a0)
  • cache alliance help board lists (c187f85)
  • reuse world player alliance lookup (5206b30)
  • cadence gate moving vision invalidation (0195cf2)
  • jitter socket connect catchup (66448dd)
  • gate socket connection logs (fbfdec3)
  • cadence gate shield drain (61d33fb)
  • cache socket siege subscribe state (f8db0a7)
  • consolidate combat load reads (f8e9a00)
  • align state cache ttl with load cadence (f340a20)
  • compact extraction site read payloads (fb06e0e)
  • cache hot scale read payloads (4f165c4)
  • persist sparse event reveal memory (19dbb09)
  • throttle moving presence rechecks (0ba82f8)
  • avoid duplicate world player enrichment (dc424f9)
  • skip redundant frontier vision circles (def7de5)
  • bound resource safety bonuses (a6139fd)
  • consolidate scale state reads (ff25eab)
  • tune hot read cache windows (9a88fef)
  • cache stable hot read routes (c015055)
  • skip api response compression (1ab854b)
  • compact world reveal payloads (ec40baa)

Internal

  • collapse tx.mode === 'postgres' branches (Phase 3) (#50) (8e4c892)
  • drop SQLite, Postgres-only (Phase 2) + docker-compose fix (#48) (77ad817)
  • convert events manager to async db (8928b51)
  • convert megatower lifecycle to async db (d8c20ff)
  • convert dossier card manager to async db (15e22df)
  • convert mail and social rewards to async db (20142a9)
  • adapt async siege observer helpers (2a8f24e)
  • convert world map reads to async db (627dba5)
  • convert tutorial cleanup to async db (978a02b)
  • convert despawn ticks to async db (f3f5e5e)
  • adapt cloud and amm helpers to db adapter (561f581)
  • convert completion managers to async db (476ae93)
  • make tick helpers adapter-safe (d0011e1)
  • convert player deletion to async db (7025c6c)
  • convert alliance manager to async db (39132c8)
  • convert alliance help manager to async db (2f667ef)
  • convert alliance event logger reads (eb815b4)
  • convert debug routes to async db (a8e6c2d)
  • convert amm routes to async db (bc58b12)
  • convert tutorial route actions to async db (50a4996)
  • convert speedup routes to async db (bc64970)
  • convert commander routes to async db (cd19238)
  • convert extraction payload reads to async db (fda1c17)
  • convert raid routes to async db (bc9d3ab)
  • convert siege routes to async db (9579c53)
  • convert alliance route reads to async db (d9f4454)
  • convert small event routes to async db (a046e6d)
  • convert world route queries to async db (a8f51e5)
  • convert analytics routes to async db (69b2a47)
  • convert portal routes to async db (0f9aea6)
  • convert shop routes to async db (49c759d)
  • convert economy routes to async db (0c31162)
  • convert troop routes to async db (fac34cf)
  • convert chat manager to async db (544ff8e)
  • convert state payload reads to async db (41d928d)
  • make resource projection async (67e2bc9)
  • convert auth and quest paths to async db (379af9d)
  • add async db helpers for base routes (e0b9125)
  • port all 18 KNOWN_FAILING verify scripts + 4 real prod bug fixes (#54) (66692fd)
  • port 10 verify scripts from better-sqlite3 to pg.Client (#49) (c96454f)
  • qa — event UX moved from header badge → reveal-area popup overlay (7ed5646)
  • qa — address review findings on the SOCKETS + CLIENT sections (3147517)
  • qa — add SOCKETS + CLIENT regression coverage to qa-test (ad327d0)
  • stabilize world map qa under fog (ba8a926)
  • gate load health on server metrics (da05573)
  • isolate load setup metrics (c94511a)
  • instrument postgres query latency (1af84ff)
  • gate realistic load harness (6c31cd1)
  • add postgres post-cutover gate (2718c31)
  • stabilize staging postgres smoke (abbead5)
  • match client token refresh in load harness (954e997)
  • refresh load harness tokens before gameplay (2f0d5e3)
  • make load harness map camera sticky (6b60156)
  • add no-socket load diagnostic (6980771)
  • bound load harness request hangs (5fad066)
  • avoid setup player fanout (e52b988)
  • isolate load health probes (4143229)
  • add scale event-loop diagnostics (5f8dd3e)
  • clear explored tiles in load cohort reset (ed4273a)
  • add staging load cohort reset (4c3ec92)
  • stagger realistic load harness starts (086af58)
  • add staging redis smoke (a9f08c0)
  • changelog for 2026-05-21 promote (4700ef0)
  • fix stale refs after PR #53 lint rename + SQLite removal (#55) (489abec)
  • GOD SAVE CHECKPOINT — lock mobile crawler screen at d88a601 (6479c0e)
  • add staging qa load evidence (6364dc0)
  • record postgres load blocker (7fedf9a)
  • wrap 1k ccu readiness evidence (71f12d9)
  • record market guard staging verification (693918c)
  • record staging heartbeat verification (67bbb69)
  • note staging heartbeat deploy blocker (13e0a1b)
  • fix 1k report branch baseline (c703639)
  • record 750 socket ladder stop (f872464)
  • add 1k ccu readiness wrap report (725f294)
  • record world viewport cache 750-client result (6bf7e34)
  • refresh latest staging scale evidence (2767334)
  • record serialized state cache 750-client result (b9a8ace)
  • record http-only 750-client result (ec61272)
  • record research cache 750-client result (a323cc7)
  • record help board cache 750-client result (e8bf9f2)
  • record moving vision 750-client result (c2d5f82)
  • record 750 socket load result (58fcedf)
  • record socket cache 750-client result (353c244)
  • clarify tested scale commit (eb358b6)
  • record compact payload 750-client result (7229de7)
  • record hot-read cache 750-client result (6e3f2ad)
  • record sparse reveal 750-client result (801b0f4)
  • record 750-client scale blocker (474a994)
  • record 500-client staging pass (f89253f)
  • record isolated health load blocker (c8d25b4)
  • record consolidated state load evidence (9af0dfe)
  • record route cache load evidence (2202169)
  • record 500 ccu staging blocker (48e98fc)
  • alliance social cooperation audit + improvement plan (943baa6)
  • compress audio assets (e65ca96)
  • remove dead founder pack join hook (2658e23)
  • remove redundant debug route requires (c940e33)
  • remove dead amm statements (4319ba4)
  • wire postgres runtime selector (c9de3ba)
  • add postgres bootstrap gates (2dbfcae)

Other

  • docs+refactor: PG-only docs cleanup + verify-script renames (Phase 4+5) (#51) (7f2b28a)
  • tune(menu-fx): walk back static + scanline cut from −30% to −10% (1af0f2b)
  • tune(menu-fx): −30% static + scanline, kill wallpaper flicker (a2b57e7)
  • wip: siv-version UI session work + merge staging (5e1e7a0)
  • tune(events/mobile): side-by-side lore frame, smaller image, locate in view (54488bb)
  • tweak(events): one-sentence HOW TO SCORE for Sunken Arcology (14a635a)
  • tweak(events): red SUBMERGED badge + 'Currently submerged' label (4300c79)
  • tune(map/mobile): haul-chest button -12% size on phone (55 -> 48) (b22f57b)
  • tune(map): haul-chest button +25% size (44 -> 55 px) (2b14f91)
  • art: darker orange menu icons + white per-hour resource rates (141323a)
  • art(base/menu): tablet menu icons → glowing orange (all 4 ciphers) (c1c4ee8)
  • tune(base/cipher-1/pc): shift banner -12px up, -6px left (ef6b8cc)
  • tune(base/cipher-1/pc): rotate banner -4deg CCW, shift -5px up (b063000)
  • tune(base/cipher-1/pc): rotate banner +15deg CW, shift +50px right (569ddbe)
  • tune(base/cipher-1/pc): rotate banner +10deg CW, shift -20px up (f66a674)
  • tune(base/cipher-1/pc): shift banner +60px down, +15px right (c646776)
  • tune(base/cipher-1/pc): shift banner -60px left, rotate -12deg (0fd87f0)
  • art(base): sync cipher PNGs, extend extraction banners to Cipher 1 (f8d7a1f)
  • art(base): sync updated cipher tablet PNGs from main repo (96c2c3c)
  • tune(base/pc): sand cluster scale 1.2 -> 1.1 (PC-only) (b298a37)
  • tune(base/cipher-2/pc): shift extraction banners 5px right (c2f5c40)
  • tune(base/cipher-2/pc): shift extraction banners another 34px left (a108c1b)
  • tune(base/cipher-2/pc): shift extraction banners -30px left, +3% size, tie to cipher (0f3e4b7)
  • art(base/cipher-2/pc): add extraction-tape banners overlay (6884ed5)
  • lock(base/cipher-2): mobile menu layout + crop top at viewport y=20px (488c285)
  • tune(base/cipher-2): +0.5deg clockwise menu rotation (5 -> 5.5) (b5ae1e7)
  • tune(base/cipher-2): reduce menu side-view angle (rotateY -36 -> -33) (6b7008c)
  • tune(base/cipher-2): nudge menu 1px left + 3px down (d899aa2)
  • tune(base/cipher-2): nudge menu 2px left + 5px down (8ea675e)
  • tune(base/cipher-2): nudge menu 4px left, 3px down, +2deg angle (c737438)
  • tune(base/cipher-2): bump menu side-view angle (rotateY -28 -> -34, perspective 550 -> 500) (6a26745)
  • tune(base/cipher-2): +3deg clockwise rotation on menu plane (2b3cf0d)
  • tune(base/cipher-2): stronger right-side perspective tilt on menu plane (5256a87)
  • art(base): swap back to Cipher 1; full Cipher 1/2 spec in comments (463f8ad)
  • art(base): shrink Cipher 2 (angled) ~7.5%, label both cipher options (bd8f0c8)
  • art(base): swap cipher tablet art to the angled variant (11b9b2f)
  • checkpoint: Barracks redesign — known-good Squads + Reserves layout (aa44f4b)
4e6c051

New & Changed

  • tutorial onboarding overhaul + post-tutorial NPX polish (#56) (6119305)
  • infra — pool-stats emitter + generalize tx-propagation lint (#53) (7645f41)
  • infra — idle-tx watchdog + Phase 0 PG migration + accumulated staging work (#47) (511dbcb)
  • base/tablet — icon-top + LV-under + centered labels, button size unchanged (f199623)
  • theme — default to dark mode, keep toggle for light (1333da5)
  • vault — audit trail + operator restore for real-money export/import (#43) (2dbd092)
  • vault redesign (hero state + card grid + chip + import demote) + economy tune (#42) (9391494)
  • add commander NFT card art (8bdaf04)
  • polish commander mint landing flow (517a7dd)
  • add landing commander mint page (8fee0a9)
  • add Zealy commander NFT campaign flow (c5c0192)
  • commander equipment economy + squad modal polish (#41) (f65ae80)
  • events — Sunken Arcology lore frame + LOCATE button + rename (cc0a2f7)
  • map — haul-chest button — pending banked-haul indicator (map-only) (dec1078)
  • base — WELCOME EVENT button deep-links to welcome entry in events menu (3fdbccc)
  • events — list menu — sidebar + detail (welcome event placeholder) (1a1a0a4)
  • extraction — reveal pipeline polish + battle pause UX + foreign-tile hardening (#40) (8ee2553)
  • extraction — defer resource credit from bank → /claim (unified box reveal) (995c70d)
  • extraction — event-interrupt popup over reveal + lift first-cycle gate (915f260)
  • extraction — chaos-team-hardened extraction loop (64698f4)
  • base — enable 50/50 Cipher 1/2 roll on every home-screen entry (39f3f03)
  • base/cipher-1 — extraction banner now shows on mobile too (f60451f)
  • base/cipher-2 — extraction banner now shows on mobile too (aab2bb6)
  • base/banners — split per-cipher banner placement, lock Cipher 2 (a778495)
  • base/pc — +20% sand cluster size and count (955c855)
  • base/cipher-2/pc — pin menu anchor to phone-equivalent on PC (1c364b1)
  • base/cipher-2 — -10deg CCW menu rotation + right-side perspective tilt (baa544c)
  • base — 50/50 Cipher 1 / Cipher 2 variant system on home entry (5c4defc)
  • base — PC home screen mirrors phone layout via transform scale (b3a60c0)
  • map — HOME button (was CRAWLER) with proper dark chrome (8cda610)
  • chat — docked = same element as opened, cropped to 2 lines (b526839)
  • chat — unify docked + opened at 15.2 px (+10% on opened) (c95e1dd)
  • chat — docked -30%, opened +20%, opened +10% wider (df20048)
  • chat — extend opened-chat bg to bottom, shrink docked, unify SEND (93b18b4)
  • base — lock approved mobile tablet-menu geometry (d88a601)
  • base — wind sand clusters + pointer-drag tablet scroll + chat clearance (246cd35)
  • base — add soft sandy wind drift overlay (31de021)
  • crawler screen UI overhaul with cipher tablet menu (1468816)
  • extract+attack unified modal, cross-cmd troop allocation, clamp cue, more (8d6dc49)
  • mobile polish — Barracks scaling + map HUD + chat (f48711a)
  • Barracks UI polish — picker, train modal, drag-drop, layout (44a90ea)
  • bundle cold-load client assets (f074ab4)
  • audio — replace extraction reveal synth with RPG Interface Essentials assets (d7e8163)
  • extraction — cycle-pause primitive + event-as-badge UX + reveal polish (ab8faca)
  • bank-reveal — legendary near-miss fade (77e7d60)
  • reveal — cycle flight + haul ticker + landing pulse (e7d96cd)
  • reveal — particles, per-crate shimmer, haul rarity polish (ddee061)
  • reveal — soak-phase escalation — panel wash, screen overlay, LEGENDARY banner (2ac62ed)
  • reveal — phase-fraction pacing + real loot icons (match prototype) (de0e8f3)
  • reveal — squad-modal extracting layout — wide LEFT reveal column (c486caf)
  • debug — TEST ACCOUNT button + /api/debug/skip-tutorial endpoint (0b6e50f)
  • extraction — reveal audio + boot-time recall sweep (Phase 2e/f) (603d207)
  • extraction — value-only haul + cycle reveal area (Phase 2d) (5ca5032)
  • extraction — delivery boxes + bank reveal modal (Phase 2a/b/c) (777cc24)
  • extraction — per-cycle item registry + structured items[] emit (Phase 1) (ae71883)
  • add shard admission cap (dcfd880)
  • modernize chat baseline (09d9c2e)
  • add clean-start postgres cutover (2117658)
  • alliance — NPC starter alliance — Phase 2 (LLM persona) + Phase 3 (Citadel march) (b178fee)
  • add tick worker redis heartbeat (e29cf05)
  • map — animated packing-hourglass overlay above extraction sites (b28b413)
  • hud — scale top + bottom bars 20%, tighten chat alignment, fix wheel reopen on deploy (d9781dc)
  • add realistic scale readiness harness (edfec3d)
  • alliance — redesign Requests panel — single panel + tile-picker modal (cf6f937)
  • add redis replica readiness (da19ce5)
  • alliance — broadcast notable history events to chat + per-member contributions panel (e59243c)

Fixes

  • security — pre-promote audit findings (#57) (4e6c051)
  • shutdown — arm force-exit timer first, halt tick loop between ops (#52) (e5e66f6)
  • chat/pc — bump message font 11→12 px (81bdae0)
  • chat/pc — drop viewport-scaled font on message rows (9a28b62)
  • shop — un-gate VAULT tab — remove "COMING SOON" + disabled state (098272a)
  • barracks — preserve original requested count on partial-clamp persist (053a981)
  • prefer versioned NFT commander art (cc7dba4)
  • polish vault export UI (09f6f9e)
  • restore commander vault export (bf2fb52)
  • remove in-game Zealy mint panel (6258cac)
  • harden campaign NFT burn import (1e9d1b4)
  • show and grant campaign import imprints (b545350)
  • stop megatower placeholder from bouncing to Welcome (e012921)
  • events — human-readable HOW TO SCORE for megatower + safer fallback (bf47fe4)
  • events — Sunken Arcology pinned in sidebar with inactive state (ee75514)
  • map/chest — socket-late-bind retry + 15s polling backstop (d077672)
  • chat — hoist hud-bottom z-index bump to global scope (PC + phone) (b57033d)
  • barracks — clear _returnTo in tutorial early-return path (af1d407)
  • chat — restore input+SEND on home + scope chat to base/worldMap (60425fc)
  • events — welcome placeholder no longer reverts after 1s (122b0bd)
  • barracks — DONE button honors _returnTo (restores extract→edit→back) (4b17d33)
  • chaos-test regressions + basket allocation filter (72cbe46)
  • polish base menus and preload assets (369814b)
  • extraction — bankHaul credits non-delivery delta (defender-event resources) (1d9de95)
  • extraction — sync event-interrupt overlay during same-scene patch (6355f6b)
  • extraction — Ignore closes overlay + Continue resumes reveal animation (4238a85)
  • extraction — defer haul celebration from bank → box-open + wire tasks refresh (79745ed)
  • extraction — Ignore button fires safe-default immediately (5b100c8)
  • chaos-team open-items polish pass (7e89774)
  • base — clean cipher body class in exit(); doc PC↔phone coupling (85f6f89)
  • base/cipher-2 — pin transform-origin so extended bottom keeps locked angle (527a366)
  • base/cipher-2 — extend menu bottom another 45px (34ca11b)
  • base/cipher-2 — extend menu bottom by 1 button height (PC + phone) (7645225)
  • base/pc — remove .base-fullbleed overflow:hidden on desktop (910c7dc)
  • base/pc — wallpaper full-viewport, hide bottom bar, fix chat-docked (51997c6)
  • map — HOME button flush to bottom-right corner, only top-left rounded (68984e2)
  • chat — shrink docked top-fade band 14 -> 6 px (28f887b)
  • chat — mask-fade top of docked chat to hide line slivers (bfc3162)
  • chat — persistent chat element across base + worldMap (3f74bf3)
  • chat — docked chat clickable + empty-state placeholder (d0a6850)
  • chat — minimize no longer wipes the docked preview (d450079)
  • chat — SEND grey to match placeholder + shorten input placeholder (17014a7)
  • chat — SEND button matches input height pixel-for-pixel (9e82dda)
  • unblock barracks tutorial flow (190a7a3)
  • enforce qa socket client coverage (82c8403)
  • scope back-button override to Barracks→Armory only (d42b35b)
  • server — allow dotfiles in / and /index.html sendFile (dac5b47)
  • harden cold-load dist serving (2449633)
  • cache static game assets (3a35c97)
  • prevent resource drift on speedup completions (af9b338)
  • debug — maxout grants 3 starter commanders, not 6 (22309b9)
  • reveal — review-pass — kill near-miss fade on skip, re-query haul on landing (f13d0e9)
  • reveal — pause-debt cycle bar, run-id abort, transient FX cleanup (129e242)
  • reveal — seed cycle bar + last-cycle crates on modal open (ba74e4e)
  • reveal — match cycle siteId against squad.id stripped of 'site:' prefix (56fc237)
  • hunter — await cancelDefenderPendingEvent inside try/catch (playbook §B) (14e134e)
  • post-cutover race-condition hardening (playbook §A) (ec081d9)
  • extraction — IIFE-wrap shared/itemRegistry.js (classic-script const collision broke client boot) (7d53bb3)
  • enforce realtime crawler visibility (452cd87)
  • narrow crawler presence fanout (120b61f)
  • bound tick burst work for load (a0525f4)
  • add postgres npc alliance drift columns (bed0fa0)
  • unblock alliance pr verification (3b272b3)
  • P0/P1 PR review — fulfillment contract, nested-tx, FK cleanup, encoding, verifier drift (df330d2)
  • type world map postgres filters (11bd56e)
  • repair postgres chat schema drift (5af5dfb)
  • keep player bases live in world cache (4de00c2)
  • alliance — invalidate research-bonus cache on level change (9e3f28f)
  • guard legacy market spends (effd08f)
  • persist sparse explored map features (c97abf0)
  • reduce scale read-path write pressure (371cf8e)
  • avoid load-test alliance tag collisions (fa8c566)
  • reduce crawler tick load for scale tests (f16ef32)
  • stabilize redis socket setup (9878853)

Performance

  • prepare single-shard 1k ccu path (bdfe21a)
  • batch training resource recompute (8ea671f)
  • batch tick training completion (3e32033)
  • make health checks db-free (d331e17)
  • batch resource safety buffs (7467639)
  • parallelize world map reads (b5d72d5)
  • cache auth player existence (3138726)
  • widen hot poll cache windows (50732d5)
  • align world tile cache with map polling (9df0c39)
  • cache shared world viewport tiles (d0a66c5)
  • cache serialized state responses (33d8479)
  • cache hot research bonus reads (1d202a0)
  • cache alliance help board lists (c187f85)
  • reuse world player alliance lookup (5206b30)
  • cadence gate moving vision invalidation (0195cf2)
  • jitter socket connect catchup (66448dd)
  • gate socket connection logs (fbfdec3)
  • cadence gate shield drain (61d33fb)
  • cache socket siege subscribe state (f8db0a7)
  • consolidate combat load reads (f8e9a00)
  • align state cache ttl with load cadence (f340a20)
  • compact extraction site read payloads (fb06e0e)
  • cache hot scale read payloads (4f165c4)
  • persist sparse event reveal memory (19dbb09)
  • throttle moving presence rechecks (0ba82f8)
  • avoid duplicate world player enrichment (dc424f9)
  • skip redundant frontier vision circles (def7de5)
  • bound resource safety bonuses (a6139fd)
  • consolidate scale state reads (ff25eab)
  • tune hot read cache windows (9a88fef)
  • cache stable hot read routes (c015055)
  • skip api response compression (1ab854b)
  • compact world reveal payloads (ec40baa)

Internal

  • collapse tx.mode === 'postgres' branches (Phase 3) (#50) (8e4c892)
  • drop SQLite, Postgres-only (Phase 2) + docker-compose fix (#48) (77ad817)
  • convert events manager to async db (8928b51)
  • convert megatower lifecycle to async db (d8c20ff)
  • convert dossier card manager to async db (15e22df)
  • convert mail and social rewards to async db (20142a9)
  • adapt async siege observer helpers (2a8f24e)
  • convert world map reads to async db (627dba5)
  • convert tutorial cleanup to async db (978a02b)
  • convert despawn ticks to async db (f3f5e5e)
  • adapt cloud and amm helpers to db adapter (561f581)
  • convert completion managers to async db (476ae93)
  • make tick helpers adapter-safe (d0011e1)
  • convert player deletion to async db (7025c6c)
  • convert alliance manager to async db (39132c8)
  • convert alliance help manager to async db (2f667ef)
  • convert alliance event logger reads (eb815b4)
  • convert debug routes to async db (a8e6c2d)
  • convert amm routes to async db (bc58b12)
  • convert tutorial route actions to async db (50a4996)
  • convert speedup routes to async db (bc64970)
  • convert commander routes to async db (cd19238)
  • convert extraction payload reads to async db (fda1c17)
  • convert raid routes to async db (bc9d3ab)
  • convert siege routes to async db (9579c53)
  • convert alliance route reads to async db (d9f4454)
  • convert small event routes to async db (a046e6d)
  • convert world route queries to async db (a8f51e5)
  • convert analytics routes to async db (69b2a47)
  • convert portal routes to async db (0f9aea6)
  • convert shop routes to async db (49c759d)
  • convert economy routes to async db (0c31162)
  • convert troop routes to async db (fac34cf)
  • convert chat manager to async db (544ff8e)
  • convert state payload reads to async db (41d928d)
  • make resource projection async (67e2bc9)
  • convert auth and quest paths to async db (379af9d)
  • add async db helpers for base routes (e0b9125)
  • port all 18 KNOWN_FAILING verify scripts + 4 real prod bug fixes (#54) (66692fd)
  • port 10 verify scripts from better-sqlite3 to pg.Client (#49) (c96454f)
  • qa — event UX moved from header badge → reveal-area popup overlay (7ed5646)
  • qa — address review findings on the SOCKETS + CLIENT sections (3147517)
  • qa — add SOCKETS + CLIENT regression coverage to qa-test (ad327d0)
  • stabilize world map qa under fog (ba8a926)
  • gate load health on server metrics (da05573)
  • isolate load setup metrics (c94511a)
  • instrument postgres query latency (1af84ff)
  • gate realistic load harness (6c31cd1)
  • add postgres post-cutover gate (2718c31)
  • stabilize staging postgres smoke (abbead5)
  • match client token refresh in load harness (954e997)
  • refresh load harness tokens before gameplay (2f0d5e3)
  • make load harness map camera sticky (6b60156)
  • add no-socket load diagnostic (6980771)
  • bound load harness request hangs (5fad066)
  • avoid setup player fanout (e52b988)
  • isolate load health probes (4143229)
  • add scale event-loop diagnostics (5f8dd3e)
  • clear explored tiles in load cohort reset (ed4273a)
  • add staging load cohort reset (4c3ec92)
  • stagger realistic load harness starts (086af58)
  • add staging redis smoke (a9f08c0)
  • fix stale refs after PR #53 lint rename + SQLite removal (#55) (489abec)
  • GOD SAVE CHECKPOINT — lock mobile crawler screen at d88a601 (6479c0e)
  • add staging qa load evidence (6364dc0)
  • record postgres load blocker (7fedf9a)
  • wrap 1k ccu readiness evidence (71f12d9)
  • record market guard staging verification (693918c)
  • record staging heartbeat verification (67bbb69)
  • note staging heartbeat deploy blocker (13e0a1b)
  • fix 1k report branch baseline (c703639)
  • record 750 socket ladder stop (f872464)
  • add 1k ccu readiness wrap report (725f294)
  • record world viewport cache 750-client result (6bf7e34)
  • refresh latest staging scale evidence (2767334)
  • record serialized state cache 750-client result (b9a8ace)
  • record http-only 750-client result (ec61272)
  • record research cache 750-client result (a323cc7)
  • record help board cache 750-client result (e8bf9f2)
  • record moving vision 750-client result (c2d5f82)
  • record 750 socket load result (58fcedf)
  • record socket cache 750-client result (353c244)
  • clarify tested scale commit (eb358b6)
  • record compact payload 750-client result (7229de7)
  • record hot-read cache 750-client result (6e3f2ad)
  • record sparse reveal 750-client result (801b0f4)
  • record 750-client scale blocker (474a994)
  • record 500-client staging pass (f89253f)
  • record isolated health load blocker (c8d25b4)
  • record consolidated state load evidence (9af0dfe)
  • record route cache load evidence (2202169)
  • record 500 ccu staging blocker (48e98fc)
  • alliance social cooperation audit + improvement plan (943baa6)
  • compress audio assets (e65ca96)
  • remove dead founder pack join hook (2658e23)
  • remove redundant debug route requires (c940e33)
  • remove dead amm statements (4319ba4)
  • wire postgres runtime selector (c9de3ba)
  • add postgres bootstrap gates (2dbfcae)

Other

  • docs+refactor: PG-only docs cleanup + verify-script renames (Phase 4+5) (#51) (7f2b28a)
  • tune(menu-fx): walk back static + scanline cut from −30% to −10% (1af0f2b)
  • tune(menu-fx): −30% static + scanline, kill wallpaper flicker (a2b57e7)
  • wip: siv-version UI session work + merge staging (5e1e7a0)
  • tune(events/mobile): side-by-side lore frame, smaller image, locate in view (54488bb)
  • tweak(events): one-sentence HOW TO SCORE for Sunken Arcology (14a635a)
  • tweak(events): red SUBMERGED badge + 'Currently submerged' label (4300c79)
  • tune(map/mobile): haul-chest button -12% size on phone (55 -> 48) (b22f57b)
  • tune(map): haul-chest button +25% size (44 -> 55 px) (2b14f91)
  • art: darker orange menu icons + white per-hour resource rates (141323a)
  • art(base/menu): tablet menu icons → glowing orange (all 4 ciphers) (c1c4ee8)
  • tune(base/cipher-1/pc): shift banner -12px up, -6px left (ef6b8cc)
  • tune(base/cipher-1/pc): rotate banner -4deg CCW, shift -5px up (b063000)
  • tune(base/cipher-1/pc): rotate banner +15deg CW, shift +50px right (569ddbe)
  • tune(base/cipher-1/pc): rotate banner +10deg CW, shift -20px up (f66a674)
  • tune(base/cipher-1/pc): shift banner +60px down, +15px right (c646776)
  • tune(base/cipher-1/pc): shift banner -60px left, rotate -12deg (0fd87f0)
  • art(base): sync cipher PNGs, extend extraction banners to Cipher 1 (f8d7a1f)
  • art(base): sync updated cipher tablet PNGs from main repo (96c2c3c)
  • tune(base/pc): sand cluster scale 1.2 -> 1.1 (PC-only) (b298a37)
  • tune(base/cipher-2/pc): shift extraction banners 5px right (c2f5c40)
  • tune(base/cipher-2/pc): shift extraction banners another 34px left (a108c1b)
  • tune(base/cipher-2/pc): shift extraction banners -30px left, +3% size, tie to cipher (0f3e4b7)
  • art(base/cipher-2/pc): add extraction-tape banners overlay (6884ed5)
  • lock(base/cipher-2): mobile menu layout + crop top at viewport y=20px (488c285)
  • tune(base/cipher-2): +0.5deg clockwise menu rotation (5 -> 5.5) (b5ae1e7)
  • tune(base/cipher-2): reduce menu side-view angle (rotateY -36 -> -33) (6b7008c)
  • tune(base/cipher-2): nudge menu 1px left + 3px down (d899aa2)
  • tune(base/cipher-2): nudge menu 2px left + 5px down (8ea675e)
  • tune(base/cipher-2): nudge menu 4px left, 3px down, +2deg angle (c737438)
  • tune(base/cipher-2): bump menu side-view angle (rotateY -28 -> -34, perspective 550 -> 500) (6a26745)
  • tune(base/cipher-2): +3deg clockwise rotation on menu plane (2b3cf0d)
  • tune(base/cipher-2): stronger right-side perspective tilt on menu plane (5256a87)
  • art(base): swap back to Cipher 1; full Cipher 1/2 spec in comments (463f8ad)
  • art(base): shrink Cipher 2 (angled) ~7.5%, label both cipher options (bd8f0c8)
  • art(base): swap cipher tablet art to the angled variant (11b9b2f)
  • checkpoint: Barracks redesign — known-good Squads + Reserves layout (aa44f4b)
83af14f

New & Changed

  • skills — staging-tester for one-command logins to Railway staging (003292e)
  • tooling — changelog generator for staging → master promotes (ba24aa6)
  • db — file-based migration system for data backfills (7c0369b)
  • map — patch 15 — minimalist atmospheric clouds for citadel + frontier (restored) (b517879)

Fixes

  • skills — staging-tester username was over the 20-char server cap (c023281)
  • deploy — include megatower-tune scripts so staging boots (915b432)
  • roll back to 5863231 (post battle-replay-decoder-fixes) (restored) (4bb15ea)

Performance

  • map — patch 16 — drop friendly-zone weather (restored) (4b279bc)
  • map — micro-wins — hoist matrix, cache pattern + mask gradients, LRU img cache (restored) (ad89b4f)

Internal

  • stabilize verify-extraction-spawns by pooling N=1000 trials (bf94cc3)
  • update verify-event-resource-gates to $ato copy + un-skip in CI (2470fb1)
  • fix server-dep partition + skip 2 known-failing verify scripts (cf1e784)
  • add PR + push checks (verify-* + qa-test against running server) (7d07ae5)
  • add monitoring & alerting runbook (eca3d24)
  • switch to staging-first branching workflow (c331724)
  • add staging environment runbook + Railway setup guide (7b08677)