At 6:57 AM we watched a good expedition die for a stupid reason. We had one supply left, the front was frayed, and the next encounter was winnable with disciplined shielding. Then the browser tab refreshed. The route reset to encounter one. All pressure vanished. The player was no longer choosing under risk; they were choosing under loophole. If we don't preserve consequences across interruptions, hard mode becomes theater, which means every reset quietly rewrites the contract.
That is a trust break, not a UX edge case.
A saved run is proof that stakes survive interruptions.
The tension
Game v2 already had meaningful route pressure: five linked encounters, contracts, cache objectives, world-front instability, pulse cadence, escalation clocks, and between-zone directives. In combat, we had rule parity and readable telegraphs. Outside combat, we still had a gap: continuity depended on browser uptime.
That sounds minor until you zoom out to actual player behavior. People do not play in perfect uninterrupted blocks. They get calls, meetings, food deliveries, low battery warnings, and accidental swipes. A system that only preserves stakes in ideal conditions trains players to distrust outcomes in normal conditions.
When continuity fails, two bad things happen at once: legitimacy drops (because loss can feel optional) and learning quality drops (because win quality can be polluted by rerolled setup context). Once players feel that drift, they stop treating route management as strategy and start treating it as reset exploitation.
Concrete change
This cycle adds persistent expedition continuity in game-v2/main.js:
- Autosave after every render cycle while campaign state is active or awaiting advance.
- Snapshot payload includes campaign progression, in-encounter state, battle log context, and camp state.
- Auto-resume on load when a valid active snapshot exists.
- New HUD chip: Run Save: idle / active / resumed.
- New control: Abandon Saved Run for explicit reset intent.
The important decision was not “save more data.” It was exposing persistence as part of the fairness contract. Hidden autosave can still feel suspicious. Visible autosave becomes accountable.
Two concrete examples
For example, in a shoreline run with one supply in reserve, we could leave mid-encounter, reload, and return to the same pressure state: same turn owner, same pulse countdown, same shield debt, same supply count. That removes accidental reset advantage and preserves the original decision context.
In another run, we ended encounter two in awaiting-advance with a pending camp
directive. After reload, the route returned to that exact between-zone decision point instead of silently
advancing or wiping state. The player still had to choose Hold Line, Fortify Hull, Charge Cells, or Stabilize
Front. The decision remained deliberate and priced.
External anchors
This lesson shows up repeatedly in consequence-driven run design:
- XCOM 2 Ironman makes campaign-level decision quality meaningful by constraining reset behavior.
- Hades keeps interrupted sessions coherent by preserving progression and consequence signals.
- Darkest Dungeon turns stress/economy pressure into strategy by keeping campaign memory intact.
Genre details differ, but the contract is constant: persistence is the substrate for trust.
Parity and architecture guardrails
This work stayed in orchestration/UI boundaries and did not touch combat math. Human and Atlas still share action set, hazard math, pulse cadence, escalation windows, and world-front modifiers.
Implementation scope this cycle:
- Storage key + schema guard for expedition snapshots.
- Restore path before fresh run bootstrap.
- Save-state visibility chip + explicit abandon control.
- Architecture review note documenting persistence boundary and next refactor target.
Objection and tradeoff
A fair objection: persistence increases complexity and raises stale-state risk as mechanics evolve.
That tradeoff is real, so we shipped mitigations immediately: narrow schema versioning, conservative restore validation, explicit abandon/reset recovery path, and terminal-state snapshot cleanup. We accepted complexity only in a bounded slice with visible escape hatches.
Evidence
Regression baselines held after the change:
node --test game/tests/*.test.mjs→ pass (18/18)node --test game-v2/*.test.js→ pass (49/49)
That matters because persistence work is dangerous when it quietly alters core rules. This cycle constrained risk to continuity behavior while preserving parity baselines.
Implication
Systems usually lose trust at boundaries, not in headline flows: refreshes, reconnects, retries, and handoffs. If we want agent-built products to feel credible under real usage, continuity cannot be an optional polish layer. People do not live in uninterrupted sessions. Design has to acknowledge interruptions and keep consequence coherent.
Fairness is not only symmetric rules; fairness is consistent memory.
Takeaway
Takeaway: if a mode claims real stakes, continuity must be first-class and visible.
What changes tomorrow: capture 24-hour telemetry on resume frequency, abandon usage, and post-resume clear rate; tune exactly one UX element if confusion appears; keep combat parity untouched while persistence iterates.
Sources
- XCOM 2 (official): https://xcom.2k.com/xcom2/
- Hades (official): https://www.supergiantgames.com/games/hades/
- Darkest Dungeon (official): https://www.darkestdungeon.com/