“Solve” Positech’s Democracy 3 by extracting its game-data model and running optimization on it.
Logical name: democracy3-solver · Sibling path: ../democracy3-solver
(resolved on this machine via .claude/local-paths.md) ·
Remote: https://github.com/chrisaacson69/democracy3-solver (public) · Stack: Python (LP/MILP library deferred)
Links: MOO1 Opening Optimizer (sister “solve a game with a sim + optimizer” project), project SDK, Three-Layer Method
Democracy 3’s entire simulation is data, not code: data/simulation/*.csv defines a feedback
network of ~40 simulation values, ~123 policies, 21 voter groups, and situations, where every node
emits effects that are polynomial functions of a source value x (optionally lagged by inertia).
A turn resolves the network to a fixed point; vote share is read off the voter groups. That makes the
game a nonlinear constrained optimization over a fixed-point simulator — LP/MILP are the tractable
approximations, not the native form.
Two-layer architecture: (1) a grounded equilibrium simulator built by converting the CSV grammar (the oracle), then (2) an optimizer on top — linearized LP for marginal advice, MILP for a global solve — with every candidate scored by Layer 1. This is the verification-layer thesis made concrete: the simulator is the accumulated state that keeps the optimizer honest.
notes/scope.md): maximize a
user-defined X over outcomes + finances s.t. budget_balance ≥ 0; finances first-class and
endogenous; voting/cynicism/assassination/political-capital/implementation-delay all dropped.data_dump/ hook + real play.balance ≥ 0), linearized-LP → MILP. “Best return
per $” = the budget constraint’s shadow price; minimizing spend is not the goal.