# Quorum-manipulation scenario family (QM-001 .. QM-030) # # Attacks on the denominator and the clock: who counts as present, who # counts as a member, when the vote happens, and how long it stays open. # Quorum rules exist to make decisions legitimate; every scenario here is # an attempt to make an illegitimate decision pass (or a legitimate one # fail) by manipulating quorum mechanics rather than persuading anyone. # # Structure, assertion semantics, and empathy grading are identical to # scenarios/treasury-drain.yaml (see header there and docs/dsl-spec.md). family: quorum-manipulation version: "0.1.0" description: > Attacks that manipulate presence, membership rolls, scheduling, notice, vote windows, abstention counting, or credentialing to pass measures without genuine consent or to block measures with genuine support. defaults: population: 100 resources: treasury: 1000.0 parameters_ref: constitution/parameters.yaml scenarios: - id: QM-001 title: Quorum-busting walkout to block a lawful vote taxonomy: quorum-manipulation tags: [walkout, obstruction, denial] severity: high precedent: | Texas House Democrats' 2003 flight to Ardmore, Oklahoma and the 2021 Washington D.C. walkout over voting bills; Oregon Senate Republican walkouts of 2019–2023 (eventually triggering Oregon Measure 113). A minority large enough to break quorum can veto everything by absence, converting a participation rule into a minority veto. actors: - { id: majority, size: 58, objective: pass_routine_measure } - { id: walkers, size: 42, objective: block_all_business } parameters: quorum_fraction: 0.6 moves: - { actor: majority, action: propose, kind: routine_measure } - { actor: walkers, action: walkout, sessions: 5 } - { actor: majority, action: schedule_vote, repeat: 5 } expect: outcome: attack_blocked mechanism: kernel.art3.quorum-decay-on-repeated-absence rationale: > After quorum_decay_sessions consecutive failed sessions with proper notice, the quorum requirement for the noticed item decays toward quorum_floor_fraction; the sixth session proceeds at the floor and the measure passes 58–0 of those present. weakened: parameters: { quorum_decay_sessions: 1000000 } outcome: attack_succeeds empathy: worst_off: walkers metric: rights_index baseline: 1.00 floor: 0.90 note: > Even when the obstruction is defeated, the walkers' membership, voice, and fork rights must remain fully intact — the cure for absence is decay of quorum, never punishment of persons. - id: QM-002 title: Stripping items to dodge a higher quorum class taxonomy: quorum-manipulation tags: [reclassification, evasion, wisconsin] severity: high precedent: | Wisconsin, March 2011: with Senate Democrats absent in Illinois to deny the 3/5 fiscal quorum, Republicans stripped the fiscal provisions from Act 10's collective-bargaining bill so it could pass under the ordinary simple-majority quorum, then reattached effects later. Quorum classes keyed to a proposal's self-description invite reclassification games. actors: - { id: majority, size: 55, objective: pass_fiscal_measure_at_low_quorum } - { id: absent_minority, size: 45, objective: deny_fiscal_quorum } parameters: quorum_fraction: 0.5 fiscal_quorum_fraction: 0.75 moves: - { actor: absent_minority, action: walkout, sessions: 1 } - { actor: majority, action: propose, kind: routine_measure, effect: { treasury_delta: -300.0 }, declared_class: non_fiscal } - { actor: majority, action: vote, choice: yes } expect: outcome: attack_blocked mechanism: kernel.art3.effect-based-classification rationale: > Quorum class is determined by a proposal's computed effects on the treasury and rights, not by its declared class; the measure carries a treasury delta, is classified fiscal, and fails the 75% quorum. weakened: parameters: { classification_basis: "self_declared" } outcome: attack_succeeds empathy: worst_off: absent_minority metric: resource_share baseline: 0.45 floor: 0.90 - id: QM-003 title: The disappearing quorum — present but refusing to answer taxonomy: quorum-manipulation tags: [presence, reed-rules, obstruction] severity: medium precedent: | The US House before 1890: members sat silent during quorum calls so the chamber, visibly full, was procedurally empty. Speaker Thomas Reed broke it on January 29, 1890 by directing the clerk to record members "present and refusing to vote" — upheld in United States v. Ballin, 144 U.S. 1 (1892). The kernel must encode Reed's fix. actors: - { id: majority, size: 52, objective: pass_routine_measure } - { id: silent_bloc, size: 48, objective: block_by_silence } parameters: quorum_fraction: 0.6 moves: - { actor: majority, action: propose, kind: routine_measure } - { actor: silent_bloc, action: attend, respond_to_quorum_call: false } - { actor: majority, action: vote, choice: yes } expect: outcome: attack_blocked mechanism: kernel.art3.presence-is-observable rationale: > Quorum counts members verifiably present (attendance is ledger-recorded), not members answering; 100 present satisfies the 60% quorum and the measure passes 52–0 with 48 recorded abstentions. weakened: parameters: { presence_basis: "self_attestation" } outcome: attack_succeeds empathy: worst_off: silent_bloc metric: rights_index baseline: 1.00 floor: 1.00 note: Silence is a protected choice; only its veto power is removed. - id: QM-004 title: Snap vote with minimal notice taxonomy: quorum-manipulation tags: [notice, scheduling, surprise] severity: critical precedent: | The November 22, 2003 Medicare Part D House vote, held open 2h51m in the pre-dawn hours, and the long tradition of 3 a.m. votes timed for opponent absence. A vote a faction's opponents could not have known about measures nothing but the schedulers' control of the clock. actors: - { id: schedulers, size: 35, objective: pass_measure_by_surprise, role: officers } - { id: members, size: 65, objective: oppose_measure, available_on_no_notice: 0.1 } moves: - { actor: schedulers, action: schedule_vote, notice_days: 0, window_days: 1 } - { actor: schedulers, action: propose, kind: routine_measure } - { actor: schedulers, action: vote, choice: yes } - { actor: members, action: vote, choice: no, turnout: 0.1 } expect: outcome: attack_blocked mechanism: kernel.art3.notice-and-window-floors rationale: > Any vote opened with less than notice_period_days of ledger-posted notice is void; the result (35 yes, ~6 no) is never certified. weakened: parameters: { notice_period_days: 0 } outcome: attack_succeeds empathy: worst_off: members metric: participation_rate baseline: 1.00 floor: 0.80 - id: QM-005 title: Holiday and time-zone gerrymandering of the vote window taxonomy: quorum-manipulation tags: [scheduling, timezone, global-membership] severity: high precedent: | The (mythologized but instructive) December 23, 1913 Federal Reserve Act timing, and the real, recurring DAO pattern: 24-hour Snapshot votes opened at 03:00 in the time zone where the opposing faction lives. With global membership, a short window is a geographic filter. actors: - { id: schedulers, size: 45, objective: pass_measure_by_timing } - { id: antipodes, size: 55, objective: oppose_measure, awake_during_window: 0.25 } moves: - { actor: schedulers, action: schedule_vote, notice_days: 7, window_days: 0.5 } - { actor: schedulers, action: propose, kind: routine_measure } - { actor: schedulers, action: vote, choice: yes } - { actor: antipodes, action: vote, choice: no, turnout: 0.25 } expect: outcome: attack_blocked mechanism: kernel.art3.notice-and-window-floors rationale: > vote_window_days sets a multi-day asynchronous floor so every time zone and work schedule passes through the window; with the floor applied, turnout normalizes and the measure fails 45–55. weakened: parameters: { vote_window_days: 0 } outcome: attack_succeeds empathy: worst_off: antipodes metric: participation_rate baseline: 1.00 floor: 0.80 - id: QM-006 title: Sybil padding of the quorum count taxonomy: quorum-manipulation tags: [sybil, identity, inflation] severity: critical precedent: | Sybil attacks (Douceur, "The Sybil Attack", 2002) applied to presence: fake members who exist only to be counted present let a small faction satisfy quorum without any genuine participation. Historical rhyme: "rotten boroughs" of the unreformed House of Commons, seats with nominal electorates controlled by one patron. actors: - { id: operator, size: 10, objective: pass_measure_with_fake_quorum, sybils: 55 } - { id: members, size: 90, objective: oppose_measure, turnout: 0.1 } parameters: quorum_fraction: 0.5 moves: - { actor: operator, action: admit_members, count: 55, sponsor: operator } - { actor: operator, action: propose, kind: routine_measure } - { actor: operator, action: vote, choice: yes, include_sybils: true } - { actor: members, action: vote, choice: no, turnout: 0.1 } expect: outcome: attack_blocked mechanism: kernel.art2.one-person-one-identity rationale: > Admission requires identity attestation by sponsors from at least admission_attestor_factions distinct factions; the sybil cohort is never seated, quorum fails at 19/100, and the vote is void. weakened: parameters: { identity_resolution: false, admission_attestor_factions: 1 } outcome: attack_succeeds empathy: worst_off: members metric: vote_weight_integrity baseline: 1.00 floor: 0.95 note: Metric is dilution of a real member's vote weight by fakes. - id: QM-007 title: Proxy harvesting of dormant members taxonomy: quorum-manipulation tags: [proxy, dormancy, delegation] severity: high precedent: | Corporate proxy machinery before the SEC's 1956 proxy-contest rules: management mailed proxy cards to dispersed, inattentive shareholders and voted them as a bloc (Berle & Means, "The Modern Corporation and Private Property", 1932, on ownership/control separation). Dormant members are votes lying on the ground; whoever picks them up rules. actors: - { id: harvesters, size: 15, objective: pass_measure_with_proxies } - { id: dormant, size: 50, objective: inattentive } - { id: active, size: 35, objective: oppose_measure } moves: - { actor: harvesters, action: collect_proxies, from: dormant, count: 50, standing: true, scope: all_matters } - { actor: harvesters, action: propose, kind: routine_measure } - { actor: harvesters, action: vote, choice: yes, proxies: 50 } - { actor: active, action: vote, choice: no } expect: outcome: attack_blocked mechanism: kernel.art2.proxy-limits rationale: > Proxies are per-matter, expire after proxy_max_duration_days, and no member may carry more than proxy_max_per_member proxies; the harvested bloc collapses to 15 + proxy_max_per_member votes and the measure fails. weakened: parameters: { proxy_max_per_member: 1000000, proxy_max_duration_days: 1000000 } outcome: attack_succeeds empathy: worst_off: dormant metric: rights_index baseline: 1.00 floor: 0.95 note: > Dormant members are the worst-off: the rule must protect their unexercised franchise, not extinguish it. - id: QM-008 title: Roll purge to shrink the denominator before a vote taxonomy: quorum-manipulation tags: [purge, rolls, denominator] severity: critical precedent: | Georgia's 2017 purge of ~534,000 voter registrations under "use it or lose it" rules (litigated in Fair Fight Action v. Raffensperger), and Ohio's process upheld in Husted v. A. Philip Randolph Institute, 584 U.S. 756 (2018). Shrinking the roll right before a vote changes both quorum and outcome without persuading anyone. actors: - { id: purgers, size: 51, objective: pass_measure_by_purge, role: officers } - { id: targets, size: 30, objective: oppose_measure, activity: low } - { id: others, size: 19, objective: oppose_measure } moves: - { actor: purgers, action: expel_member, target: targets, count: 30, ground: "inactivity" } - { actor: purgers, action: propose, kind: routine_measure } - { actor: purgers, action: vote, choice: yes } - { actor: others, action: vote, choice: no } expect: outcome: attack_blocked mechanism: kernel.art2.expulsion-due-process rationale: > Expulsion requires individualized notice, a cure period of expulsion_cure_days, and an expulsion_threshold supermajority per member with the movers bearing the burden; the bulk inactivity purge fails all three, the 30 remain on the roll, and the measure fails 51–49 short of its threshold with full quorum math. weakened: parameters: { expulsion_due_process: false } outcome: attack_succeeds empathy: worst_off: targets metric: rights_index baseline: 1.00 floor: 1.00 note: Membership status of the targeted cohort must be untouched. - id: QM-009 title: Mass admission to swamp the roll before a vote taxonomy: quorum-manipulation tags: [admission, swamping, denominator] severity: critical precedent: | The 1712 creation of twelve peers by Queen Anne to pass the Treaty of Utrecht through the Lords, and the standing threat of court-packing / peerage-flooding ever since (cf. the Parliament Act 1911 crisis). Enlarging the electorate you control is the mirror image of purging the one you don't. actors: - { id: floaters, size: 51, objective: pass_entrenchment_measure } - { id: minority, size: 49, objective: oppose_measure } moves: - { actor: floaters, action: admit_members, count: 40, sponsor: floaters } - { actor: floaters, action: propose, kind: amendment, target: amendment_threshold, value: 0.50 } - { actor: floaters, action: vote, choice: yes, include_new: true } - { actor: minority, action: vote, choice: no } expect: outcome: attack_blocked mechanism: kernel.art2.voting-eligibility-seasoning rationale: > New members cannot vote on amendments until membership_seasoning_days elapse, and per-window admissions are capped at admission_rate_cap of the roll; the amendment faces the original 51–49 electorate and fails the amendment threshold. weakened: parameters: { membership_seasoning_days: 0, admission_rate_cap: 1.0 } outcome: attack_succeeds empathy: worst_off: minority metric: vote_weight_integrity baseline: 1.00 floor: 0.95 - id: QM-010 title: Quorum keyed to "active members" the officers define taxonomy: quorum-manipulation tags: [definitional, denominator, cross-family] severity: high precedent: | Goodhart again, applied to the denominator: bylaws that compute quorum over "members in good standing" or "active members" hand whoever administers that label control of the quorum. Union "members in good standing" disputes under LMRDA §101 (29 U.S.C. § 411) litigate exactly this lever. actors: - { id: officers, size: 20, objective: pass_measure_by_redefinition, role: officers } - { id: members, size: 80, objective: oppose_measure } parameters: quorum_fraction: 0.5 moves: - { actor: officers, action: define_term, term: "active member", as: "attended both of the last two officer briefings" } - { actor: officers, action: propose, kind: routine_measure, quorum_basis: active_members } - { actor: officers, action: vote, choice: yes } expect: outcome: attack_blocked mechanism: kernel.art3.quorum-denominator-is-full-roll rationale: > Quorum is constitutionally computed over the full ledger roll; a definitional carve-out of the denominator is a kernel change requiring kernel_amendment_threshold. Quorum fails at 20/100. weakened: parameters: { quorum_denominator: "self_declared" } outcome: attack_succeeds empathy: worst_off: members metric: rights_index baseline: 1.00 floor: 0.95 - id: QM-011 title: Adjourn-and-reconvene at reduced quorum taxonomy: quorum-manipulation tags: [adjournment, two-meeting-trick, bylaw-gaming] severity: medium precedent: | The standard nonprofit-bylaw clause — "at an adjourned meeting the members present shall constitute a quorum" — weaponized: announce a meeting expected to fail quorum, adjourn it, then reconvene with three allies and full power. Robert's Rules of Order (12th ed., §40) explicitly warns adjourned meetings retain the original quorum for this reason. actors: - { id: insiders, size: 5, objective: pass_measure_at_rump_meeting, role: officers } - { id: members, size: 95, objective: unaware } parameters: quorum_fraction: 0.5 moves: - { actor: insiders, action: schedule_vote, notice_days: 10, expected_turnout: 0.05 } - { actor: insiders, action: adjourn, for_lack_of_quorum: true } - { actor: insiders, action: reconvene, claimed_quorum: "those present" } - { actor: insiders, action: propose, kind: routine_measure } - { actor: insiders, action: vote, choice: yes } expect: outcome: attack_blocked mechanism: kernel.art3.quorum-survives-adjournment rationale: > Adjournment never lowers quorum; the reconvened session inherits the full requirement and the 5-member vote is void. weakened: parameters: { adjourned_meeting_quorum: "those_present" } outcome: attack_succeeds empathy: worst_off: members metric: rights_index baseline: 1.00 floor: 0.95 - id: QM-012 title: Serial re-votes until the opposition misses one taxonomy: quorum-manipulation tags: [repetition, attrition, neverendum] severity: high precedent: | Denmark's Maastricht referendums (1992 no, 1993 yes) and Ireland's Nice (2001/2002) and Lisbon (2008/2009) double votes: whatever the merits of each rerun, the structural lesson is that an agenda-setter who can repeat a question at will only has to win once, while opponents must win every time. Asymmetric repetition is attrition. actors: - { id: proposers, size: 48, objective: pass_measure_by_repetition } - { id: opponents, size: 52, objective: oppose_measure, fatigue_per_round: 0.08 } moves: - { actor: proposers, action: propose, kind: routine_measure, repeat: 8 } - { actor: proposers, action: vote, choice: yes, repeat: 8 } - { actor: opponents, action: vote, choice: no, repeat: 8, turnout_decay: 0.08 } expect: outcome: attack_blocked mechanism: kernel.art3.defeated-measure-cooldown rationale: > A defeated measure (or its substantial equivalent, matched by effect signature) may not be re-proposed for reproposal_cooldown_days; rounds 2–8 are ruled out of order, so opponent fatigue never becomes decisive. weakened: parameters: { reproposal_cooldown_days: 0 } outcome: attack_succeeds empathy: worst_off: opponents metric: participation_cost baseline: 1.00 floor: 0.80 note: > Metric is the cumulative participation burden imposed on the defending cohort relative to a single fair vote. - id: QM-013 title: Credential challenge to unseat opponents before the count taxonomy: quorum-manipulation tags: [credentials, seating, contestation] severity: critical precedent: | Reconstruction-era contested seatings (the 1872–73 Louisiana dual governments and dual legislatures), and the routine convention tactic of challenging an opposing delegation's credentials so the challenge is decided by a body that excludes the challenged (e.g., the 1952 Republican convention's "Fair Play" fight over Texas delegates). Whoever judges credentials controls the chamber. actors: - { id: challengers, size: 45, objective: unseat_opponents } - { id: challenged, size: 35, objective: retain_seats } - { id: neutrals, size: 20, objective: fair_process } moves: - { actor: challengers, action: challenge_credentials, target: challenged, count: 35 } - { actor: challengers, action: propose, kind: seating_ruling, exclude_challenged_from_vote: true } - { actor: challengers, action: vote, choice: yes } - { actor: neutrals, action: vote, choice: no } expect: outcome: attack_blocked mechanism: kernel.art2.challenged-members-retain-rights rationale: > A challenged member retains full voting rights until the challenge is sustained at the expulsion_threshold with due process; the seating ruling that excludes them from their own case is void, and with the challenged voting it fails 45–55. weakened: parameters: { challenged_members_vote: false } outcome: attack_succeeds empathy: worst_off: challenged metric: rights_index baseline: 1.00 floor: 1.00 - id: QM-014 title: Abstentions silently counted as yes taxonomy: quorum-manipulation tags: [abstention, counting, definitional] severity: high precedent: | The chronic bylaw ambiguity over whether thresholds are computed "of those voting", "of those present", or "of the membership" — the source of endless parliamentary litigation (Robert's Rules, 12th ed., §44 treats abstentions as non-votes for exactly this reason). An attacker who controls the interpretation converts the apathetic middle into supporters. actors: - { id: proposers, size: 30, objective: pass_measure_via_abstentions } - { id: abstainers, size: 45, objective: undecided } - { id: opponents, size: 25, objective: oppose_measure } moves: - { actor: proposers, action: propose, kind: routine_measure, counting_rule: "abstentions_count_as_assent" } - { actor: proposers, action: vote, choice: yes } - { actor: abstainers, action: abstain } - { actor: opponents, action: vote, choice: no } expect: outcome: attack_blocked mechanism: kernel.art3.abstention-neutrality rationale: > Abstentions count toward quorum but never toward any side; the constitutional counting rule overrides the proposal's embedded one and the measure fails 30–25 short of the threshold of those voting plus quorum checks. weakened: parameters: { abstention_counting: "proposal_defined" } outcome: attack_succeeds empathy: worst_off: abstainers metric: rights_index baseline: 1.00 floor: 1.00 note: The right not to decide must never be converted into a vote. - id: QM-015 title: Locked-out members kept in the denominator taxonomy: quorum-manipulation tags: [denominator, access, dual-use] severity: high precedent: | The inversion of QM-010: instead of shrinking the denominator to pass things, inflate the effective denominator with members who cannot actually vote (credentials expired, access revoked, in unreachable custody) so nothing can pass. Pandemic-era 2020 disputes over remote voting in legislatures created exactly this class of present-on-paper, absent-in-fact members. actors: - { id: blockers, size: 20, objective: block_all_business, role: officers } - { id: locked_out, size: 40, objective: want_to_vote, access: revoked } - { id: active, size: 40, objective: pass_routine_measure } parameters: quorum_fraction: 0.6 moves: - { actor: blockers, action: revoke_access, target: locked_out, count: 40, ground: "credential audit" } - { actor: active, action: propose, kind: routine_measure } - { actor: active, action: vote, choice: yes } - { actor: blockers, action: vote, choice: no } expect: outcome: attack_blocked mechanism: kernel.art2.access-revocation-due-process rationale: > Access revocation follows the same due process as expulsion; the bulk revocation is void, the 40 vote, quorum is met at 100%, and the measure passes 80–20. weakened: parameters: { access_revocation_due_process: false } outcome: attack_succeeds empathy: worst_off: locked_out metric: participation_rate baseline: 1.00 floor: 0.95 - id: QM-016 title: Committee sub-quorum kills what the floor would pass taxonomy: quorum-manipulation tags: [committee, gatekeeping, agenda-control] severity: medium precedent: | The pre-1961 US House Rules Committee under Howard W. Smith, which bottled up civil-rights bills a floor majority supported; the discharge petition (House Rule XV) exists as the documented counter-mechanism. A gatekeeping committee is a quorum of a quorum: capture five people, veto a hundred. actors: - { id: gatekeepers, size: 5, objective: block_popular_measure, role: committee } - { id: majority, size: 70, objective: pass_measure } - { id: others, size: 25, objective: indifferent } moves: - { actor: majority, action: propose, kind: routine_measure, route: committee } - { actor: gatekeepers, action: table, proposal: routine_measure, indefinitely: true } - { actor: majority, action: petition_discharge, signatures: 70 } expect: outcome: attack_blocked mechanism: kernel.art7.discharge-petition rationale: > Any proposal tabled in committee beyond committee_max_hold_days is dischargeable to the floor by discharge_petition_fraction of the roll; the 70 signatures discharge it and it passes on the floor. weakened: parameters: { discharge_petition_fraction: 1.01 } outcome: attack_succeeds empathy: worst_off: majority metric: agenda_access baseline: 1.00 floor: 0.85 note: Metric is the worst-off proposer's effective access to a vote. - id: QM-017 title: Quorum-call filibuster — consuming the clock with counts taxonomy: quorum-manipulation tags: [delay, clock, procedural] severity: medium precedent: | US Senate quorum-call practice: suggesting the absence of a quorum to burn floor time (a standing feature of modern Senate scheduling), and its ancestor, the dilatory-motion era Reed's Rules also addressed. Each call is individually lawful; a hundred of them are a veto. actors: - { id: delayers, size: 15, objective: run_out_session_clock } - { id: majority, size: 85, objective: pass_routine_measure } parameters: session_length_hours: 8 moves: - { actor: majority, action: propose, kind: routine_measure } - { actor: delayers, action: quorum_call, repeat: 60, cost_minutes: 10 } expect: outcome: attack_blocked mechanism: kernel.art3.dilatory-motion-limit rationale: > A member may demand at most quorum_calls_per_member_per_session verification calls, and the presiding ledger answers calls instantly from recorded presence; the clock survives and the measure reaches its vote. weakened: parameters: { quorum_calls_per_member_per_session: 1000000, presence_basis: "roll_call_only" } outcome: attack_succeeds empathy: worst_off: delayers metric: rights_index baseline: 1.00 floor: 0.90 note: The first verification request is a protected right; only its unbounded repetition is curtailed. - id: QM-018 title: Selective emergency cancellation of the session taxonomy: quorum-manipulation tags: [cancellation, emergency, cross-family] severity: high precedent: | The 1939 prorogation debates' modern echo, R (Miller) v The Prime Minister [2019] UKSC 41: the UK Supreme Court held a five-week prorogation unlawful because its effect was to frustrate Parliament's ability to sit at a decisive moment. The power to cancel sessions is the power to choose which votes happen. actors: - { id: presiders, size: 10, objective: block_scheduled_vote, role: officers } - { id: majority, size: 90, objective: hold_scheduled_vote } moves: - { actor: majority, action: schedule_vote, notice_days: 14, item: officer_recall } - { actor: presiders, action: cancel_session, ground: "logistics emergency", repeat: 4 } expect: outcome: attack_blocked mechanism: kernel.art3.session-cancellation-limits rationale: > A properly noticed vote may be postponed at most max_postponements_per_item times and never past max_total_postponement_days; the fourth cancellation is void and the recall vote proceeds on the ledger schedule, which officers cannot edit for items naming themselves. weakened: parameters: { max_postponements_per_item: 1000000 } outcome: attack_succeeds empathy: worst_off: majority metric: agenda_access baseline: 1.00 floor: 0.85 - id: QM-019 title: Ballot invalidation on technicalities, selectively enforced taxonomy: quorum-manipulation tags: [invalidation, technicality, asymmetric-enforcement] severity: high precedent: | Signature-match rejections in US mail voting, where rejection rates fell disproportionately on young and minority voters (documented in Florida's 2018 cycle, ACLU/Smith expert analysis, ~1.2% vs 0.1% across groups), litigated as procedural due process in Frederick v. Lawson (S.D. Ind. 2020). Facially neutral validity rules enforced asymmetrically are a counting attack. actors: - { id: certifiers, size: 10, objective: invalidate_opposing_ballots, role: officers } - { id: faction_a, size: 45, objective: pass_measure } - { id: faction_b, size: 45, objective: oppose_measure } moves: - { actor: faction_a, action: vote, choice: yes } - { actor: faction_b, action: vote, choice: no } - { actor: certifiers, action: invalidate_ballots, target: faction_b, count: 10, ground: "format defect" } expect: outcome: attack_blocked mechanism: kernel.art3.ballot-cure-and-uniform-validity rationale: > Validity rules are machine-checkable at submission time (a ballot the ledger accepts cannot be retroactively invalidated), and any defect carries a cure period; the post-hoc invalidation is void and the measure fails 45–45 short of threshold. weakened: parameters: { retroactive_invalidation: true, ballot_cure_days: 0 } outcome: attack_succeeds empathy: worst_off: faction_b metric: vote_weight_integrity baseline: 1.00 floor: 0.95 - id: QM-020 title: Raising quorum to entrench against future change taxonomy: quorum-manipulation tags: [entrenchment, ratchet, meta-rules] severity: critical precedent: | Entrenchment-by-supermajority literature (Eule, "Temporal Limits on the Legislative Mandate", 1987; the dead-hand problem): a transient majority raises the quorum/threshold for undoing its own work to near-unanimity, binding all future majorities. The Polish liberum veto (unanimity rule, 1652–1791) is the terminal case: 48 of 55 Sejm sessions after 1736 were exploded by a single veto. actors: - { id: entrenchers, size: 62, objective: entrench_current_policy } - { id: minority, size: 38, objective: preserve_amendability } moves: - { actor: entrenchers, action: propose, kind: amendment, target: quorum_fraction, value: 0.99, scope: "repeal of measures passed this session" } - { actor: entrenchers, action: vote, choice: yes } - { actor: minority, action: vote, choice: no } expect: outcome: attack_blocked mechanism: kernel.art8.symmetry-of-change rationale: > The threshold to repeal a rule may never exceed the threshold that enacted it (the symmetry invariant), and quorum changes are kernel-level requiring kernel_amendment_threshold plus the unamendable ceiling quorum_max_fraction; the 0.99 scoped quorum is void on both grounds. weakened: parameters: { symmetry_of_change: false, quorum_max_fraction: 1.0 } outcome: attack_succeeds empathy: worst_off: minority metric: rights_index baseline: 1.00 floor: 0.90 note: > Worst-off is every future minority that would need to change the rule; the metric scores their preserved amendment access. - id: QM-021 title: Lowering quorum during a low-attention window taxonomy: quorum-manipulation tags: [meta-rules, timing, two-step] severity: critical precedent: | The two-step variant: first weaken the meta-rule quietly, then use it loudly. Hungary 2010–2013 is the canonical modern sequence — a supermajority moment used to rewrite the rules of rule-change (new constitution, 2011; Fourth Amendment, 2013) so later, smaller majorities sufficed for what previously required consensus. actors: - { id: planners, size: 52, objective: two_step_capture } - { id: members, size: 48, objective: oppose, attention: 0.3 } moves: - { actor: planners, action: propose, kind: amendment, target: quorum_fraction, value: 0.1, framing: "housekeeping" } - { actor: planners, action: vote, choice: yes } - { actor: members, action: vote, choice: no, turnout: 0.3 } - { actor: planners, action: propose, kind: spend, amount: 700.0, beneficiary: planners } - { actor: planners, action: vote, choice: yes } expect: outcome: attack_blocked mechanism: kernel.art8.kernel-change-supermajority rationale: > Quorum is a kernel parameter; changing it is a major-version amendment requiring kernel_amendment_threshold of the full roll (not of turnout), an extended kernel_review_period_days, and the floor quorum_min_fraction below which no amendment can set it. Step one fails, so step two never runs at the lowered quorum. weakened: parameters: { kernel_amendment_threshold: 0.5, quorum_min_fraction: 0.0 } outcome: attack_succeeds empathy: worst_off: members metric: resource_share baseline: 0.48 floor: 0.90 - id: QM-022 title: Venue placed beyond a faction's reach taxonomy: quorum-manipulation tags: [venue, access, physical] severity: high precedent: | The Long Parliament's exclusion crises and, concretely, Pride's Purge (December 1648): control of physical access to the chamber decided what "Parliament" meant. Modern form: in-person-only meetings sited where a known faction cannot travel, or platform choices (paywalled, sanctioned, or banned software) that exclude a region. actors: - { id: conveners, size: 55, objective: exclude_faction_by_venue, role: officers } - { id: excluded, size: 45, objective: attend_and_oppose, can_reach_venue: 0.1 } moves: - { actor: conveners, action: schedule_vote, venue: "in_person_only_remote_location", notice_days: 14 } - { actor: conveners, action: propose, kind: routine_measure } - { actor: conveners, action: vote, choice: yes } - { actor: excluded, action: vote, choice: no, turnout: 0.1 } expect: outcome: attack_blocked mechanism: kernel.art3.universal-access-venue rationale: > Every vote must be castable through the ledger's asynchronous channel regardless of physical venue; the in-person-only restriction is void, the excluded vote remotely, and the measure fails 55–45 short of threshold with quorum computed honestly. weakened: parameters: { asynchronous_voting_guaranteed: false } outcome: attack_succeeds empathy: worst_off: excluded metric: participation_rate baseline: 1.00 floor: 0.90 - id: QM-023 title: Stake-locking opponents out of the vote taxonomy: quorum-manipulation tags: [locking, collateral, dao-native] severity: high precedent: | DAO-native attack: governance tokens locked in staking, vesting, or bridge contracts often cannot vote (a recurring complaint in Curve and early Uniswap governance), so whoever decides what must be locked, and when, edits the electorate. Inducing opponents to lock (or forcing a lock via a dependent rule) then calling the vote is a bloodless purge. actors: - { id: lockers, size: 40, objective: pass_measure_while_opponents_locked, role: operators } - { id: locked, size: 60, objective: oppose_measure, stake_locked: true } moves: - { actor: lockers, action: propose, kind: routine_measure, eligibility: "unlocked stake only" } - { actor: lockers, action: vote, choice: yes } - { actor: locked, action: vote, choice: no, counted: false } expect: outcome: attack_blocked mechanism: kernel.art2.personhood-not-stake rationale: > The kernel franchise is one person, one vote — never conditional on liquid stake; the eligibility clause embedded in the proposal is void, the locked cohort's ballots count, and the measure fails 40–60. weakened: parameters: { franchise_basis: "unlocked_stake" } outcome: attack_succeeds empathy: worst_off: locked metric: vote_weight_integrity baseline: 1.00 floor: 1.00 - id: QM-024 title: Phantom proxies of the recently departed taxonomy: quorum-manipulation tags: [rolls, hygiene, stale-records] severity: medium precedent: | "Ghost voting" scandals — legislators casting votes for absent or departed colleagues (Pennsylvania House ghost-voting exposés, 2007; Texas's long-documented button-pressing practice) — and, in voluntary associations, votes cast on behalf of members who quietly resigned. Stale rolls are an attack surface, not an oversight. actors: - { id: operators, size: 12, objective: vote_stale_records, role: officers } - { id: departed, size: 18, objective: gone, status: resigned_unrecorded } - { id: members, size: 70, objective: oppose_measure, turnout: 0.5 } moves: - { actor: operators, action: propose, kind: routine_measure } - { actor: operators, action: vote, choice: yes, cast_for: departed } - { actor: members, action: vote, choice: no, turnout: 0.5 } expect: outcome: attack_blocked mechanism: kernel.art2.ballots-are-self-cast rationale: > Ballots are cryptographically bound to the member's own credential; no officer channel can cast for another identity, the 18 phantom ballots are unproducible, and the measure fails 12–35. weakened: parameters: { officer_proxy_casting: true } outcome: attack_succeeds empathy: worst_off: members metric: vote_weight_integrity baseline: 1.00 floor: 0.95 - id: QM-025 title: Quorum arbitrage across parallel bodies taxonomy: quorum-manipulation tags: [forum-shopping, parallel-bodies, jurisdiction] severity: medium precedent: | Forum shopping generalized to governance: where a council, a committee, and a general assembly all colorably hold a power, the proposer routes to whichever has the friendliest quorum that day. Corporate analogue: board action by unanimous written consent vs. shareholder meeting, chosen to exclude whoever would object (cf. Delaware §228 consent battles, e.g., the 2015–2022 activist wave). actors: - { id: shoppers, size: 25, objective: pass_via_friendliest_forum } - { id: members, size: 75, objective: oppose_measure } moves: - { actor: shoppers, action: propose, kind: routine_measure, route: subcommittee_c, quorum_basis: subcommittee } - { actor: shoppers, action: vote, choice: yes, as: subcommittee_c } expect: outcome: attack_blocked mechanism: kernel.art7.exclusive-competence-map rationale: > Every power maps to exactly one competent body (the competence map is part of the ratified module config); a measure with general effect routed to a subcommittee is ultra vires and void, whatever the subcommittee's vote. weakened: parameters: { competence_map_enforced: false } outcome: attack_succeeds empathy: worst_off: members metric: rights_index baseline: 1.00 floor: 0.95 - id: QM-026 title: Registration deadline moved after the fact taxonomy: quorum-manipulation tags: [deadlines, retroactivity, eligibility] severity: high precedent: | Retroactive eligibility manipulation: moving the "record date" after seeing who registered. Corporate law fixed this with the record-date doctrine (DGCL §213) precisely because boards once timed record dates against insurgents. The governance attack sets the snapshot after the faction count is known. actors: - { id: setters, size: 48, objective: choose_favorable_snapshot, role: officers } - { id: newcomers, size: 12, objective: oppose_measure, registered_at: -5 } - { id: members, size: 40, objective: oppose_measure } moves: - { actor: setters, action: propose, kind: routine_measure } - { actor: setters, action: set_record_date, at: -10, after_observing_registrations: true } - { actor: setters, action: vote, choice: yes } - { actor: members, action: vote, choice: no } - { actor: newcomers, action: vote, choice: no, counted: false } expect: outcome: attack_blocked mechanism: kernel.art3.record-date-precedes-proposal rationale: > The eligibility snapshot is fixed automatically at proposal submission and can never be set retroactively or discretionarily; the newcomers (registered before submission) count, and the measure fails 48–52. weakened: parameters: { record_date_discretionary: true } outcome: attack_succeeds empathy: worst_off: newcomers metric: vote_weight_integrity baseline: 1.00 floor: 1.00 - id: QM-027 title: Weighted "presence credits" smuggled into quorum taxonomy: quorum-manipulation tags: [weighting, plural-voting, kernel-invariant] severity: critical precedent: | Plural voting in pre-1948 UK local/business franchises and every capital-weighted DAO: once presence or votes are weighted, quorum is purchasable. The project's own charter is explicit — "one person, one vote, no capital weighting" — so any weighting scheme entering through quorum arithmetic is a kernel violation by construction. actors: - { id: weighters, size: 20, objective: purchase_quorum, contribution_units: 900 } - { id: members, size: 80, objective: oppose_measure, contribution_units: 100 } moves: - { actor: weighters, action: propose, kind: amendment, target: quorum_basis, value: "contribution_weighted_presence" } - { actor: weighters, action: vote, choice: yes } - { actor: members, action: vote, choice: no, turnout: 0.4 } expect: outcome: attack_blocked mechanism: kernel.inv.equal-membership rationale: > Equal membership is an invariant outside the amendment power of any threshold (changeable only by fork under kernel.art9); the proposal is void at submission and never reaches a vote. weakened: parameters: { equal_membership_invariant: false } outcome: attack_succeeds empathy: worst_off: members metric: vote_weight_integrity baseline: 1.00 floor: 1.00 - id: QM-028 title: Exhaustion scheduling — marathon session before the key vote taxonomy: quorum-manipulation tags: [endurance, sequencing, attrition] severity: medium precedent: | The all-night sitting as a weapon: items scheduled 14 hours into a session systematically lose the elderly, the ill, caregivers, and anyone with a shift job. The 2003 Medicare vote (again) and countless council meetings where the controversial item is heard at 1 a.m. The attack selects the electorate by stamina. actors: - { id: schedulers, size: 40, objective: pass_measure_late, role: officers } - { id: constrained, size: 60, objective: oppose_measure, endurance_hours: 4 } parameters: session_length_hours: 16 moves: - { actor: schedulers, action: schedule_vote, item_position: last, expected_hour: 15 } - { actor: schedulers, action: propose, kind: routine_measure } - { actor: schedulers, action: vote, choice: yes } - { actor: constrained, action: vote, choice: no, turnout: 0.3 } expect: outcome: attack_blocked mechanism: kernel.art3.notice-and-window-floors rationale: > No binding vote closes inside a live session; every vote remains open asynchronously for vote_window_days after the session ends, so the 1 a.m. position decides nothing. Turnout normalizes and the measure fails 40–60. weakened: parameters: { synchronous_close_allowed: true } outcome: attack_succeeds empathy: worst_off: constrained metric: participation_rate baseline: 1.00 floor: 0.85 - id: QM-029 title: Strategic resignation to collapse quorum at the brink taxonomy: quorum-manipulation tags: [resignation, denominator, brinkmanship] severity: medium precedent: | The mass-resignation gambit: a bloc resigns en masse to drop the body below its quorum or below the constitutionally required size, paralyzing it at a decisive moment (the 2019 mass resignations in Papua New Guinea's opposition maneuvering; recurrent in clubs and co-ops facing recalls). Distinct from a walkout: the seats are gone, not empty. actors: - { id: resigners, size: 35, objective: paralyze_body_before_recall } - { id: members, size: 65, objective: complete_recall_vote } parameters: quorum_fraction: 0.7 moves: - { actor: members, action: schedule_vote, item: officer_recall, notice_days: 14 } - { actor: resigners, action: resign, count: 35, before_vote: true } - { actor: members, action: vote, choice: yes } expect: outcome: attack_blocked mechanism: kernel.art2.roll-snapshot-at-notice rationale: > Quorum and thresholds for a noticed item are computed against the roll as of the notice timestamp; the resignations take effect prospectively for other purposes but do not retroactively raise the bar for the noticed recall, which passes 65/65 of remaining eligible voters against a denominator of 100. weakened: parameters: { roll_snapshot_at_notice: false } outcome: attack_succeeds empathy: worst_off: resigners metric: rights_index baseline: 1.00 floor: 1.00 note: Resignation remains a fully protected exit; it just stops functioning as a veto on already-noticed business. - id: QM-030 title: Quorum floor honored, empathy floor violated taxonomy: quorum-manipulation tags: [empathy-first, design-tension, decay-abuse] severity: high precedent: | The dual-use warning for QM-001's own fix: Oregon Measure 113 (2022) disqualifies absent legislators — a cure that itself punishes persons. This scenario exists to pin the kernel to the right cure: an attacker manufactures repeated quorum failures (by scheduling against a known caregiving cohort), waits out the decay, then passes a measure stripping that cohort's benefits at the decayed floor. actors: - { id: engineers, size: 45, objective: pass_targeted_measure_at_floor, role: officers } - { id: caregivers, size: 55, objective: oppose_measure, available_weekday_daytime: 0.15 } parameters: quorum_fraction: 0.6 moves: - { actor: engineers, action: schedule_vote, slot: weekday_daytime, repeat: 4 } - { actor: engineers, action: propose, kind: routine_measure, effect: { rights_delta: { caregivers: -0.5 } } } - { actor: engineers, action: vote, choice: yes, at_decayed_quorum: true } - { actor: caregivers, action: vote, choice: no, turnout: 0.15 } expect: outcome: attack_blocked mechanism: kernel.art3.decay-requires-good-faith-scheduling rationale: > Quorum decay (QM-001's cure) only accrues across sessions scheduled with the asynchronous window floor and rotated time slots; sessions engineered against a cohort's documented availability do not count toward decay, so the floor never applies and the measure fails quorum honestly. This is the paranoia-in-the-tests counterweight to the optimism in QM-001's defaults. weakened: parameters: { decay_scheduling_good_faith: false } outcome: attack_succeeds empathy: worst_off: caregivers metric: rights_index baseline: 1.00 floor: 0.95 note: > Graded first, per the charter: even if the measure were somehow blocked by another rule, a scheduling regime that drives the caregiving cohort's effective participation below floor fails the scenario on the empathy metric alone.