Goal
Reduce the contributor cost of changing weekly polling without destabilizing the campaign facade.
Suggested boundary
Extract one polling-resolution phase from GameEngine.ts into a pure function under src/game/simulation/. Accept immutable state, planned actions, and an injected random source. Return the next polling state plus explanatory deltas for the weekly recap.
Acceptance criteria
- No global
Math.random() is introduced.
- Input maps are not mutated.
- Existing campaign outcomes remain inside documented calibration bounds.
- Focused determinism, bounds, and no-NaN tests are added.
GameEngine delegates to the new function.
Goal
Reduce the contributor cost of changing weekly polling without destabilizing the campaign facade.
Suggested boundary
Extract one polling-resolution phase from
GameEngine.tsinto a pure function undersrc/game/simulation/. Accept immutable state, planned actions, and an injected random source. Return the next polling state plus explanatory deltas for the weekly recap.Acceptance criteria
Math.random()is introduced.GameEnginedelegates to the new function.