Backbench
A living fictional country that runs on classical AI — a deterministic political simulation where elections, coalitions, party splits, and scandals emerge from 30,000 voter agents and 120 MP agents, with no LLMs and no cloud. You play a career politician inside it: campaign, hold your seat, climb to minister, survive to become PM.
The problem
Political games usually script their drama. Backbench asks whether a believable polity can emerge from classical systems instead — spatial voters, utility-driven MPs, and rule-based party lifecycles — with every outcome decomposable into legible causes rather than a scripted story.
Role & responsibilities
Sole designer and developer. Designed the agent models, election and coalition systems, the weekly action economy, and both drivers (graphical pygame and terminal). Owns tuning of the simulation parameters and the deterministic check suite that guards them.
Architecture
Pure-Python state machine: sim/ is presentation-free and driven by a single tick(state, actions) → events contract; drivers consume events without touching state. All randomness flows from one seeded generator, so every run is deterministic and replayable. Vote outcomes are computed as named utility terms, which powers the in-game why command that explains exactly which factors moved each vote.
Key features
- 30,000 voter agents in a 2D ideological space and 120 MP agents with ambition, loyalty, grudges, and utility functions
- Fully deterministic simulation — same seed, same country; autosaves and save/load with reference-identity checks
- Emergent systems: 120-district FPTP and multi-member elections, coalition formation, confidence votes, party splits, scandals, a constitutional bench, and a press corps
- Explainable votes — an inspect/why command decomposes every result into the named utility terms that drove it
- Two drivers: a graphical pygame client (hemicycle view, district map, auto-play bot) and a plain terminal driver with spectate mode
- No test framework — 43 runnable assertion checks guard worldgen, elections, parliament, persistence, and a 50-seed stability sweep
Outcomes
30k
voter agents per simulated country
120
MPs and districts per run
0
LLMs — every outcome is classical and explainable
Stack
PythonNumPypygameAgent-Based ModelingDeterministic Simulation