A House Divided A House DividedDocumentation
Changelog
Game Design/Government & Executive

Constitutional Convention

Last updated 2026-08-20
Source files

Overview#

The constitutional convention is the voluntary exit path from one-party rule, a player-initiated alternative to the forced Stage-4 collapse conversion described in one-party-states-as-shipped.md. A sitting leader announces a convention, negotiates a draft (target system, legacy-party seat reservation, election delay), and, if the draft is submitted in time, the regime converts to a parliamentary or presidential republic on a schedule the player chose rather than one collapse imposed.

Location:

Both the convention path and the forced Stage-4 path share the same conversion implementation (triggerSystemConversion in systemConversion.ts), differing only in path: "voluntary" vs "forced" and in how the terms (legacy reservation, election delay) are set.

Three Phases#

The convention is a small state machine stored on the country's regime-escalation document (getRegimeEscalationCollection), under a convention field.

1. announced#

announceConvention(db, countryId, leaderCharacterId, currentTurn), player-initiated.

Pre-conditions (throws otherwise):

Effects:

2. draft#

submitConventionDraft(db, countryId, draft, currentTurn) locks the convention's terms and advances announced -> draft.

Input (ConventionDraftInput):

Also requires an in-progress convention already in the "announced" phase; throws if there is no convention or if it's already past that phase.

3. ratification#

Not player-triggered, reached automatically by the per-turn tick once the draft phase deadline passes (see below). At draftDeadlineTurn + electionDelayTurns, the tick driver fires triggerSystemConversion(db, countryId, currentTurn, {targetSystem, legacyReservation, path: "voluntary", electionAtTurn: currentTurn}), which flips governmentType and parks the snap-election marker for the election engine. The convention field is then cleared and conventionInProgress reset to false.

Per-Turn Auto-Transitions (tickConventionPhase)#

Called from processRegimeEscalationTurn, before the dwell update (so conventionInProgress is correct for that tick):

Design Notes#