Quick answer: Route all gameplay-affecting logic through one fixed-step tick whose size never changes with speed; the speed multiplier only controls how many ticks you run per real second.
If pausing then fast-forwarding gives a different city than letting it run at 1x, your simulation is not deterministic across speeds. Frame-rate-dependent code is leaking into the sim. Move every gameplay decision onto a single fixed tick so 1x and 3x are bit-identical. Here is how.
How to fix it
1. One fixed tick for all logic
Put every state-changing system — needs, production, economy, AI — inside one fixed-step update. Nothing that affects outcomes may read deltaTime from the render loop.
2. Speed scales tick count only
At 3x you run three fixed ticks where 1x runs one, each tick identical in size. The number of ticks per game-day is constant, so outcomes do not depend on speed.
3. Keep RNG on the tick
Seed a deterministic RNG advanced only inside ticks. Because tick order and count per game-day are speed-independent, the random draws line up and 1x versus 3x stay identical.
Catching the ones you can't reproduce
The hardest version of this to fix is the one you can't reproduce — it only happens on a player's hardware, OS, driver, or save state, under conditions that simply aren't present on your machine. A report that says “it crashed” or “it froze” gives you nothing to act on, so the bug survives release after release while quietly costing you players.
Automatic error capture closes that gap. Each failure arrives with its full stack trace, the device and OS, the build number, and a breadcrumb trail of what the player did right before it broke, so even a failure you have never seen becomes a specific, reproducible issue. Fold identical failures into one signature ranked by how many players each hits, and your worklist sorts itself worst-first instead of arriving as a stream of vague complaints.
This is where a tool like Bugnet earns its place. Its SDK captures every error automatically with the full stack trace plus device, OS, memory, build, and game-state context, folds duplicates into one grouped issue with an occurrence count, and ties each to the build it first appeared on — so you fix the problem that hurts the most players first and confirm it is gone when its signature disappears from the next release.
Reproduce it once with full context and the fix writes itself. The hunt is the expensive part.