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

Prime Minister No-Confidence Vote

Last updated 2026-08-20
Source files

Overview#

This system is country-agnostic, not UK-only. It applies to any parliamentary country whose confidence-vote mechanism is enabled (assertConfidenceVoteMechanism), which today covers the UK and other parliamentary head-of-government countries. One-party states (e.g. China) have confidenceVoteMechanism disabled and are rejected at the route.

Members of the ruling party can propose a motion of no confidence in the sitting Prime Minister (or equivalent executive title). Any elected lower-chamber member of that country can then vote. If the motion reaches an absolute majority of the whole chamber, the PM is removed and government formation restarts.

Location: (proposeNoConfidence, castNoConfidenceVote), (resolveParliamentaryNoConfidenceVote, noConfidenceMotionCarries).

Collection: noConfidenceVotes

Triggering a No-Confidence Vote#

Who Can Propose#

Only a member of the ruling party (canTriggerNoConfidence, gated on the country's governmentType) can propose a motion. The proposer must be an elected member of the country's lower chamber (getLowerChamberOfficeType(countryId)).

Proposing the Motion#

  1. Eligible lower-chamber member of the ruling party calls POST /api/country/[code]/pm/no-confidence.
  2. A new noConfidenceVotes document is created with status: "active", a 24-hour voting window, and the proposer's own vote is not auto-recorded (unlike the Speaker vacate-motion filer).
  3. The sitting PM is notified: "{proposer} has proposed a vote of no confidence against you. {chamber} members will vote over the next 24 hours."

Voting Process#

Eligible Voters#

Any elected member of the country's lower chamber can vote. Voting is not restricted to the ruling party or coalition. Only proposing is restricted to the ruling party.

Vote Duration#

Casting Votes#

Votes are cast as "aye" (remove PM) or "nay" (keep PM) via POST /api/country/[code]/pm/no-confidence/[voteId]/vote.

Resolution#

resolveParliamentaryNoConfidenceVote recomputes the tally from the seat-weighted computeParliamentaryGovernmentTally (the single source of truth; in-memory counters on the vote doc are reconciled to match) and applies noConfidenceMotionCarries:

If the Motion Fails#

If the Motion Passes#

Database Schema#

Collection: noConfidenceVotes#

Fields actually present on the document (from proposeNoConfidence / castNoConfidenceVote):

interface NoConfidenceVote {
  _id: ObjectId;
  countryId: CountryId;
  proposedByCharacterId: ObjectId;
  proposedByName: string;
  targetPmCharacterId: ObjectId;
  targetPmName: string;
  votesFor: number; // seat-weighted "aye" total
  votesAgainst: number; // seat-weighted "nay" total
  votes: Record<string, "aye" | "nay">; // characterId -> vote
  status: "active" | "passed" | "failed";
  openedAt: Date;
  closesAt: Date;
  closesOnTurn: number;
  closedAt: Date | null;
  turnProposed: number;
}

API Routes#

Route Method Access Purpose
/api/country/[code]/pm/no-confidence POST Ruling-party lower-chamber member Propose a motion
/api/country/[code]/pm/no-confidence/[voteId] GET Any Get status of a vote
/api/country/[code]/pm/no-confidence/[voteId]/vote POST Any lower-chamber member Cast a vote (aye/nay)