Patch Notes

Ashen Throne Changelog

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

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)