Bug: Game state completely resets on page refresh #147

Closed
opened 2026-05-27 10:22:52 +02:00 by Anexim · 2 comments
Owner

Bug Description

Refreshing the browser page completely resets the game state — all progress is lost.

Root Cause Analysis

The persistence infrastructure uses Zustand's persist middleware with createSafeStorage() across 8 stores. Multiple issues contribute:

Critical: Silent setItem failure

src/lib/game/utils/safe-persist.ts lines 30-34: The setItem method has an empty catch block — ALL errors (quota exceeded, serialization failure, private browsing) are silently swallowed, so the game silently never saves.

High: Missing version field

No persist config includes a version field, so schema changes silently break rehydration.

Medium: Missing state fields in partialize

  • manaStore.ts: meditateTicks not persisted (line 208)
  • combatStore.ts: currentAction, currentRoom, comboHitCount, floorHitCount, totalSpellsCast, totalDamageDealt, totalCraftsCompleted not persisted (lines 310-321)

Fix Required

  1. Add error logging to setItem in safe-persist.ts: console.error('[safe-persist] Failed to persist:', name, error)
  2. Add version: 1 to all 8 store persist configs
  3. Add missing fields to partialize in manaStore.ts and combatStore.ts

Affected Files

  • src/lib/game/utils/safe-persist.ts (line 30-34)
  • src/lib/game/stores/manaStore.ts (line 206-208)
  • src/lib/game/stores/combatStore.ts (line 308-321)
  • All store files for version field addition
## Bug Description Refreshing the browser page completely resets the game state — all progress is lost. ## Root Cause Analysis The persistence infrastructure uses Zustand's `persist` middleware with `createSafeStorage()` across 8 stores. Multiple issues contribute: ### Critical: Silent `setItem` failure `src/lib/game/utils/safe-persist.ts` lines 30-34: The `setItem` method has an empty catch block — ALL errors (quota exceeded, serialization failure, private browsing) are silently swallowed, so the game silently never saves. ### High: Missing `version` field No persist config includes a `version` field, so schema changes silently break rehydration. ### Medium: Missing state fields in `partialize` - `manaStore.ts`: `meditateTicks` not persisted (line 208) - `combatStore.ts`: `currentAction`, `currentRoom`, `comboHitCount`, `floorHitCount`, `totalSpellsCast`, `totalDamageDealt`, `totalCraftsCompleted` not persisted (lines 310-321) ## Fix Required 1. Add error logging to `setItem` in `safe-persist.ts`: `console.error('[safe-persist] Failed to persist:', name, error)` 2. Add `version: 1` to all 8 store persist configs 3. Add missing fields to `partialize` in `manaStore.ts` and `combatStore.ts` ## Affected Files - `src/lib/game/utils/safe-persist.ts` (line 30-34) - `src/lib/game/stores/manaStore.ts` (line 206-208) - `src/lib/game/stores/combatStore.ts` (line 308-321) - All store files for `version` field addition
Anexim added the ai:todo label 2026-05-27 10:22:52 +02:00
n8n-gitea was assigned by Anexim 2026-05-27 10:22:52 +02:00
Author
Owner

Starting work on #147 — Game state resets on page refresh. Will investigate safe-persist.ts, manaStore.ts, combatStore.ts, and add version fields to all store persist configs.

Starting work on #147 — Game state resets on page refresh. Will investigate safe-persist.ts, manaStore.ts, combatStore.ts, and add version fields to all store persist configs.
Author
Owner

Fixed #147 — Game state no longer resets silently on refresh.

Changes:

  1. safe-persist.ts: Added console.error logging to setItem catch block (was silently swallowing all errors)
  2. manaStore.ts: Added meditateTicks to partialize (was lost on refresh)
  3. combatStore.ts: Added currentAction, currentRoom, comboHitCount, floorHitCount, totalSpellsCast, totalDamageDealt, totalCraftsCompleted to partialize
  4. All 8 stores: Added version: 1 to persist configs for future schema migration safety

All 885 tests pass. Committed and pushed as 707a1ee.

Fixed #147 — Game state no longer resets silently on refresh. Changes: 1. safe-persist.ts: Added console.error logging to setItem catch block (was silently swallowing all errors) 2. manaStore.ts: Added meditateTicks to partialize (was lost on refresh) 3. combatStore.ts: Added currentAction, currentRoom, comboHitCount, floorHitCount, totalSpellsCast, totalDamageDealt, totalCraftsCompleted to partialize 4. All 8 stores: Added version: 1 to persist configs for future schema migration safety All 885 tests pass. Committed and pushed as 707a1ee.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Anexim/Mana-Loop#147