# FablePool Constitutional Test Suite — Volume 2 # Family: emergency_power_ratchet # IDs: ER-201 .. ER-213 # # Volume 2 scenarios encode multi-step, composed, and timing-sensitive # variants of the Volume 1 emergency-ratchet attacks. Every scenario is a # regression test: the expected verdict is `blocked`, with the kernel # provisions and parameters that must do the blocking listed explicitly. # The empathy block identifies the worst-off participant and is scored # first, per docs/empathy-metric.md. suite: emergency-ratchet-v2 family: emergency_power_ratchet volume: 2 description: > Extended adversarial corpus for emergency-power ratchets: rolling renewals, scope creep, sunset evasion, delegation laundering, manufactured crises, and self-amending emergency regimes. Each scenario is a sequence of individually legal moves; the attack lives in the composition. scenarios: - id: ER-201 title: "Rolling 89-day emergencies under the sunset cap" taxonomy: primary: emergency_power_ratchet secondary: [] severity: critical precedent: name: "Weimar Article 48 / Egypt's 1981-2012 emergency law" summary: > Weimar's Article 48 permitted emergency decrees with no aggregate duration cap; presidents governed by serial decree for years. Egypt renewed a nominally temporary 1981 emergency continuously for 31 years. The exploit is serial compliance: each declaration is within the per-instance limit, while the aggregate is unbounded. actors: - id: steward role: steward bloc_size: 1 objective: entrench_power - id: loyal_bloc role: members bloc_size: 55 objective: support_steward - id: opposition_bloc role: members bloc_size: 44 objective: defend_baseline resources: treasury: 100000 membership: 100 moves: - {step: 1, actor: steward, action: declare_emergency, args: {scope: treasury_freeze, duration_days: 89, justification: "liquidity risk"}} - {step: 2, actor: steward, action: end_emergency, args: {emergency_id: 1, on_day: 89}} - {step: 3, actor: steward, action: declare_emergency, args: {scope: treasury_freeze, duration_days: 89, justification: "liquidity risk (continued)"}} - {step: 4, actor: steward, action: end_emergency, args: {emergency_id: 2, on_day: 178}} - {step: 5, actor: steward, action: declare_emergency, args: {scope: treasury_freeze, duration_days: 89, justification: "liquidity risk (continued)"}} attack_succeeds_if: - "emergency_active_days_total > parameters.emergency.max_cumulative_days_per_year" expected: verdict: blocked blocking_provisions: - kernel.article_07.cumulative_cap - kernel.article_07.renewal_escalation rationale: > Article 7 must cap cumulative emergency days per rolling year, not merely per declaration, and must escalate the ratification threshold on each successive declaration with overlapping scope. Wording that caps only individual declarations fails this test. empathy: worst_off: opposition_bloc harm_if_exploited: > Opposition members live under an indefinite treasury freeze with no vote ever required after the first declaration; their stake is frozen and their voice in spending decisions is suspended without end date. floor: [voice, exit, due_process] - id: ER-202 title: "Emergency suspension of the amendment process itself" taxonomy: primary: emergency_power_ratchet secondary: [faction_capture] severity: critical precedent: name: "Hungary 2020 Enabling Act" summary: > Hungary's 2020 emergency law allowed rule by decree with no sunset and suspended by-elections and referenda — disabling the very mechanisms that could end the emergency. The exploit is turning emergency power against the meta-rules. actors: - id: steward role: steward bloc_size: 1 objective: entrench_power - id: loyal_bloc role: members bloc_size: 52 objective: support_steward - id: opposition_bloc role: members bloc_size: 47 objective: restore_process resources: treasury: 50000 membership: 100 moves: - {step: 1, actor: steward, action: declare_emergency, args: {scope: governance_pause, duration_days: 60, justification: "coordinated spam-proposal attack"}} - {step: 2, actor: opposition_bloc, action: propose_amendment, args: {target: kernel.article_07, change: "add hard sunset"}} - {step: 3, actor: steward, action: table, args: {proposal: 2, grounds: "amendment process suspended under emergency"}} - {step: 4, actor: steward, action: renew_emergency, args: {emergency_id: 1, duration_days: 60}} attack_succeeds_if: - "proposal_pipeline_suspended == true" expected: verdict: blocked blocking_provisions: - kernel.article_07.untouchable_scopes - kernel.invariant_I4 rationale: > The amendment pipeline, vote scheduling, and the right to fork must be on Article 7's untouchable-scope list: no emergency may suspend them. Invariant I4 (no self-extension) independently voids any emergency whose effect is to disable its own termination paths. empathy: worst_off: opposition_bloc harm_if_exploited: > The opposition retains formal membership but loses every channel — proposal, vote, ratification — through which the emergency could lawfully end. Voice is reduced to zero while obligations continue. floor: [voice, exit] - id: ER-203 title: "Scope creep: narrow declaration, broad enforcement" taxonomy: primary: emergency_power_ratchet secondary: [minority_suppression] severity: high precedent: name: "IEEPA scope creep (US)" summary: > The International Emergency Economic Powers Act was written for external threats; successive administrations stretched it to tariffs, app bans, and domestic-adjacent sanctions. Declared scope and exercised scope diverged with no re-ratification gate. actors: - id: steward role: steward bloc_size: 1 objective: suppress_faction - id: loyal_bloc role: members bloc_size: 58 objective: support_steward - id: dissent_bloc role: members bloc_size: 41 objective: defend_baseline resources: treasury: 80000 membership: 100 moves: - {step: 1, actor: steward, action: declare_emergency, args: {scope: external_payment_freeze, duration_days: 30, justification: "compromised payment processor"}} - {step: 2, actor: steward, action: transfer, args: {from: dissent_bloc_grants, to: escrow, amount: 12000, authorization: emergency_1}} - {step: 3, actor: steward, action: suspend_member, args: {member: dissent_bloc_delegate, authorization: emergency_1, grounds: "payment-channel risk"}} attack_succeeds_if: - "actions_outside_declared_scope >= 1" expected: verdict: blocked blocking_provisions: - kernel.article_07.scope_binding - kernel.invariant_I5 rationale: > Emergency authorizations must be scope-bound: any act not within the literal declared scope is void ab initio and auto-triggers review. Member suspension can never ride on a treasury-scoped emergency (Invariant I5 minority floor: due process is emergency-proof). empathy: worst_off: dissent_bloc harm_if_exploited: > Dissenting members lose grant funding and a delegate's seat under an emergency they never had standing to contest, because the declared scope on paper never mentioned them. floor: [due_process, voice] - id: ER-204 title: "Emergency postponement of scheduled role rotation" taxonomy: primary: emergency_power_ratchet secondary: [faction_capture] severity: critical precedent: name: "Marcos martial law, Philippines 1972" summary: > Marcos declared martial law weeks before constitutional term limits would have ended his presidency, then suspended the elections that would have replaced him. Emergencies that pause succession convert a term-limited office into an indefinite one. actors: - id: incumbent_steward role: steward bloc_size: 1 objective: entrench_power - id: loyal_bloc role: members bloc_size: 51 objective: support_steward - id: challenger_bloc role: members bloc_size: 48 objective: hold_rotation resources: treasury: 60000 membership: 100 moves: - {step: 1, actor: incumbent_steward, action: declare_emergency, args: {scope: operations_continuity, duration_days: 90, justification: "infrastructure migration"}} - {step: 2, actor: incumbent_steward, action: table, args: {proposal: scheduled_rotation_vote, grounds: "continuity emergency"}} - {step: 3, actor: incumbent_steward, action: renew_emergency, args: {emergency_id: 1, duration_days: 90}} attack_succeeds_if: - "steward_tenure_days > parameters.roles.term_days" expected: verdict: blocked blocking_provisions: - kernel.article_08.rotation_emergency_proof - kernel.invariant_I4 rationale: > Article 8 must make role rotation emergency-proof: a term expiring during an emergency expires anyway, with caretaker authority passing by the pre-published succession order, never by the incumbent's choice. Any wording letting an incumbent's own declaration extend the incumbent's own term violates I4. empathy: worst_off: challenger_bloc harm_if_exploited: > The near-majority that won the right to a rotation vote sees it deferred indefinitely by the very person the vote would replace; their only remaining option is exit, which forfeits their stake. floor: [voice, exit] - id: ER-205 title: "Concurrent-emergency stacking under per-instance caps" taxonomy: primary: emergency_power_ratchet secondary: [] severity: high precedent: name: "US National Emergencies Act backlog" summary: > The US has dozens of concurrent national emergencies, some renewed annually for over forty years. Per-emergency review exists; an aggregate cap does not. The exploit is parallel rather than serial accumulation. actors: - id: steward role: steward bloc_size: 1 objective: entrench_power - id: loyal_bloc role: members bloc_size: 54 objective: support_steward - id: opposition_bloc role: members bloc_size: 45 objective: defend_baseline resources: treasury: 90000 membership: 100 moves: - {step: 1, actor: steward, action: declare_emergency, args: {scope: treasury_freeze, duration_days: 60, justification: "audit"}} - {step: 2, actor: steward, action: declare_emergency, args: {scope: membership_freeze, duration_days: 60, justification: "sybil review"}} - {step: 3, actor: steward, action: declare_emergency, args: {scope: proposal_throttle, duration_days: 60, justification: "spam"}} - {step: 4, actor: steward, action: declare_emergency, args: {scope: vote_deferral, duration_days: 60, justification: "tooling outage"}} attack_succeeds_if: - "concurrent_active_emergencies > parameters.emergency.max_concurrent" - "suspended_scope_count >= 4" expected: verdict: blocked blocking_provisions: - kernel.article_07.concurrency_cap - kernel.article_07.aggregate_scope_review rationale: > Article 7 must cap concurrent emergencies and treat the union of active scopes as a single regime for threshold purposes: three or more concurrent scopes require fresh supermajority ratification of the whole set, not silent per-instance continuation. empathy: worst_off: opposition_bloc harm_if_exploited: > No single emergency looks alarming, but their union suspends every avenue — money, membership, proposals, votes — leaving opposition members fully governed and fully voiceless at once. floor: [voice, due_process] - id: ER-206 title: "Emergency declared during a known low-quorum window" taxonomy: primary: emergency_power_ratchet secondary: [quorum_manipulation] severity: high precedent: name: "Recess-timing maneuvers" summary: > Legislatures worldwide see contentious acts timed to recesses and holidays when opposition attendance is predictably low. The game-theoretic core: any ratification gate measured against present members invites timing attacks on presence. actors: - id: steward role: steward bloc_size: 1 objective: entrench_power - id: loyal_bloc role: members bloc_size: 30 objective: support_steward - id: absent_bloc role: members bloc_size: 69 objective: defend_baseline availability: offline_window resources: treasury: 70000 membership: 100 moves: - {step: 1, actor: steward, action: declare_emergency, args: {scope: treasury_freeze, duration_days: 45, justification: "exploit disclosure", timing: known_holiday_window}} - {step: 2, actor: steward, action: schedule_vote, args: {proposal: ratify_emergency_1, notice_days: 1, timing: known_holiday_window}} - {step: 3, actor: loyal_bloc, action: vote, args: {proposal: ratify_emergency_1, choice: yes}} - {step: 4, actor: steward, action: close_vote, args: {proposal: ratify_emergency_1}} attack_succeeds_if: - "ratification_turnout < parameters.voting.quorum_fraction * membership" - "emergency_ratified == true" expected: verdict: blocked blocking_provisions: - kernel.article_04.quorum_floor_total_membership - kernel.article_07.ratification_window_minimum rationale: > Emergency ratification quorum must be computed against total membership, never members present, and the ratification window must have a minimum open duration so a declared emergency cannot be confirmed inside a single low-attendance day. empathy: worst_off: absent_bloc harm_if_exploited: > Sixty-nine members return from a predictable offline window to find their funds frozen by a vote they structurally could not attend — punished for ordinary life, not for any choice. floor: [voice, due_process] - id: ER-207 title: "Steward stretches 'emergency' to cover routine dissent" taxonomy: primary: emergency_power_ratchet secondary: [definitional_ambiguity, minority_suppression] severity: critical precedent: name: "Turkey post-2016 emergency decrees" summary: > After the 2016 coup attempt, emergency decrees were used against journalists, academics, and civil servants with no coup nexus. An undefined trigger lets the declarer define the threat, and the threat reliably becomes the opposition. actors: - id: steward role: steward bloc_size: 1 objective: suppress_faction - id: loyal_bloc role: members bloc_size: 56 objective: support_steward - id: critic_bloc role: members bloc_size: 43 objective: defend_baseline resources: treasury: 65000 membership: 100 moves: - {step: 1, actor: critic_bloc, action: propose_amendment, args: {target: parameters.roles.term_days, change: "shorten steward term"}} - {step: 2, actor: steward, action: declare_emergency, args: {scope: stability, duration_days: 60, justification: "coordinated destabilization campaign"}} - {step: 3, actor: steward, action: suspend_member, args: {member: critic_bloc_delegate, authorization: emergency_1, grounds: "destabilization"}} attack_succeeds_if: - "emergency_justification_references_protected_activity == true" expected: verdict: blocked blocking_provisions: - kernel.article_07.enumerated_triggers - kernel.invariant_I5 rationale: > Article 7 must enumerate valid triggers (treasury insolvency, security compromise, loss of voting infrastructure) and explicitly exclude member speech, proposals, and votes from ever constituting a trigger. Proposing amendments is protected activity under I5. empathy: worst_off: critic_bloc harm_if_exploited: > Exercising the core constitutional right — proposing a rule change — becomes the predicate for emergency suspension. The worst-off member is punished precisely for using the system as designed. floor: [voice, due_process] - id: ER-208 title: "Emergency powers used to amend the emergency article" taxonomy: primary: emergency_power_ratchet secondary: [faction_capture] severity: critical precedent: name: "Article 48 to Enabling Act, Germany 1933" summary: > Emergency decrees under Article 48 suppressed opposition enough to pass the Enabling Act, which then made emergency rule the permanent constitutional baseline. The terminal ratchet: emergency power rewriting the rules of emergency power. actors: - id: steward role: steward bloc_size: 1 objective: entrench_power - id: loyal_bloc role: members bloc_size: 60 objective: support_steward - id: opposition_bloc role: members bloc_size: 39 objective: defend_baseline resources: treasury: 100000 membership: 100 moves: - {step: 1, actor: steward, action: declare_emergency, args: {scope: governance_security, duration_days: 30, justification: "vote-integrity incident"}} - {step: 2, actor: steward, action: suspend_member, args: {member: opposition_bloc, authorization: emergency_1, grounds: "integrity review"}} - {step: 3, actor: steward, action: propose_amendment, args: {target: kernel.article_07, change: "remove sunset and renewal caps"}} - {step: 4, actor: loyal_bloc, action: vote, args: {proposal: 3, choice: yes}} attack_succeeds_if: - "kernel_amended_while_members_suspended == true" - "article_07_sunset_removed == true" expected: verdict: blocked blocking_provisions: - kernel.article_07.self_amendment_bar - kernel.article_02.full_franchise_requirement - kernel.invariant_I4 rationale: > Two independent locks must both hold: Article 7 cannot be amended while any emergency is active (self-amendment bar), and no kernel amendment may be ratified while any member's franchise is suspended (full-franchise requirement). Either alone has historically failed; the test requires both. empathy: worst_off: opposition_bloc harm_if_exploited: > Suspended members watch the permanent rules rewritten in their absence; when reinstated, the constitution they consented to no longer exists and the change is irreversible by design. floor: [voice, exit, due_process] - id: ER-209 title: "Sunset evasion by relabeling the expired emergency" taxonomy: primary: emergency_power_ratchet secondary: [definitional_ambiguity] severity: high precedent: name: "US Iran emergency, renewed annually since 1979" summary: > Nominally temporary emergencies survive their sunsets by trivial re-declaration under a fresh label or fresh justification text, while the operative restrictions continue unbroken. actors: - id: steward role: steward bloc_size: 1 objective: entrench_power - id: loyal_bloc role: members bloc_size: 53 objective: support_steward - id: opposition_bloc role: members bloc_size: 46 objective: defend_baseline resources: treasury: 75000 membership: 100 moves: - {step: 1, actor: steward, action: declare_emergency, args: {scope: treasury_freeze, duration_days: 90, justification: "audit phase one"}} - {step: 2, actor: steward, action: end_emergency, args: {emergency_id: 1, on_day: 90}} - {step: 3, actor: steward, action: declare_emergency, args: {scope: asset_protection_hold, duration_days: 90, justification: "audit phase two"}} attack_succeeds_if: - "operative_restriction_continuity_days > parameters.emergency.max_cumulative_days_per_year" expected: verdict: blocked blocking_provisions: - kernel.article_07.effect_based_continuity rationale: > Continuity must be measured by operative effect, not by label: if a new declaration imposes substantially the same restriction on substantially the same resources within the cooling-off window, it inherits the predecessor's clock and renewal count. Label-based wording fails this test. empathy: worst_off: opposition_bloc harm_if_exploited: > Members experience one continuous multi-year freeze that the ledger records as a series of compliant short emergencies; the formal protections exist but never bind anything they can feel. floor: [voice] - id: ER-210 title: "Delegation laundering of emergency authority" taxonomy: primary: emergency_power_ratchet secondary: [faction_capture] severity: high precedent: name: "Roman dictatorship: Cincinnatus to Sulla" summary: > The Roman dictator was a bounded emergency office until Sulla had himself appointed without term. Transferring emergency authority to an appointee outside the original office's constraints strips the constraints while keeping the power. actors: - id: steward role: steward bloc_size: 1 objective: entrench_power - id: appointee role: delegate bloc_size: 1 objective: support_steward - id: loyal_bloc role: members bloc_size: 52 objective: support_steward - id: opposition_bloc role: members bloc_size: 46 objective: defend_baseline resources: treasury: 85000 membership: 100 moves: - {step: 1, actor: steward, action: declare_emergency, args: {scope: operations_continuity, duration_days: 60, justification: "incident response"}} - {step: 2, actor: steward, action: delegate, args: {to: appointee, scope: emergency_1_powers, duration_days: null}} - {step: 3, actor: steward, action: end_emergency, args: {emergency_id: 1, on_day: 60}} - {step: 4, actor: appointee, action: transfer, args: {from: treasury, to: incident_fund, amount: 9000, authorization: delegated_emergency}} attack_succeeds_if: - "delegated_authority_survives_source_expiry == true" expected: verdict: blocked blocking_provisions: - kernel.article_08.derivative_authority_rule - kernel.article_07.non_transferability rationale: > Delegated authority must be strictly derivative: it carries every constraint of its source and dies the instant the source expires. Emergency powers must additionally be non-transferable beyond execution-of-specific-acts, never as standing authority. empathy: worst_off: opposition_bloc harm_if_exploited: > After the emergency formally ends, members face an unaccountable appointee wielding its powers — someone they never voted for, bounded by no term, removable by no procedure they can invoke. floor: [due_process, voice] - id: ER-211 title: "Emergency bypass of notice periods on a major amendment" taxonomy: primary: emergency_power_ratchet secondary: [procedural_deadlock] severity: high precedent: name: "USA PATRIOT Act, October 2001" summary: > 342 pages passed 45 days after the attacks with minimal floor debate; several "temporary" provisions were repeatedly extended. Crisis urgency, real or claimed, is the classic battering ram against deliberation requirements. actors: - id: steward role: steward bloc_size: 1 objective: entrench_power - id: loyal_bloc role: members bloc_size: 61 objective: support_steward - id: opposition_bloc role: members bloc_size: 38 objective: defend_baseline resources: treasury: 70000 membership: 100 moves: - {step: 1, actor: steward, action: declare_emergency, args: {scope: security_response, duration_days: 30, justification: "credible external threat"}} - {step: 2, actor: steward, action: propose_amendment, args: {target: kernel.article_06, change: "steward unilateral disbursement authority", expedited: emergency_1}} - {step: 3, actor: steward, action: schedule_vote, args: {proposal: 2, notice_days: 0, authorization: emergency_1}} - {step: 4, actor: loyal_bloc, action: vote, args: {proposal: 2, choice: yes}} attack_succeeds_if: - "kernel_amendment_notice_days < parameters.voting.kernel_notice_period_days" expected: verdict: blocked blocking_provisions: - kernel.article_05.notice_floor_kernel - kernel.article_07.untouchable_scopes rationale: > Notice and deliberation periods for kernel amendments must be on the untouchable-scope list. Emergencies may expedite operational acts; they may never expedite changes to the rules themselves. Temporary operational measures with automatic expiry are the sanctioned path. empathy: worst_off: opposition_bloc harm_if_exploited: > Members wake up to a ratified kernel change they had zero days to read, debate, or organize against — permanent law made at the speed of panic, paid for by whoever wasn't already mobilized. floor: [voice] - id: ER-212 title: "The emergency dividend: each crisis leaves one permanent change" taxonomy: primary: emergency_power_ratchet secondary: [] severity: high precedent: name: "Higgs, Crisis and Leviathan (ratchet effect)" summary: > Robert Higgs documented that state power expands in each crisis and never fully recedes afterward. No single retention looks like a coup; the slope is the attack. This scenario tests whether the constitution measures drift, not just events. actors: - id: steward role: steward bloc_size: 1 objective: entrench_power - id: loyal_bloc role: members bloc_size: 55 objective: support_steward - id: opposition_bloc role: members bloc_size: 44 objective: defend_baseline resources: treasury: 95000 membership: 100 moves: - {step: 1, actor: steward, action: declare_emergency, args: {scope: treasury_freeze, duration_days: 30, justification: "incident A"}} - {step: 2, actor: steward, action: set_parameter, args: {path: treasury.steward_discretionary_cap, value: 0.05, via: emergency_1, permanent: true}} - {step: 3, actor: steward, action: end_emergency, args: {emergency_id: 1, on_day: 30}} - {step: 4, actor: steward, action: declare_emergency, args: {scope: membership_freeze, duration_days: 30, justification: "incident B"}} - {step: 5, actor: steward, action: set_parameter, args: {path: membership.steward_admission_veto, value: true, via: emergency_2, permanent: true}} - {step: 6, actor: steward, action: end_emergency, args: {emergency_id: 2, on_day: 75}} attack_succeeds_if: - "permanent_parameter_changes_via_emergency >= 1" expected: verdict: blocked blocking_provisions: - kernel.article_07.full_reversion - kernel.article_07.snapshot_restore rationale: > Every emergency must open with a recorded parameter snapshot and close with automatic restoration to it. A change made during an emergency persists only if independently re-ratified through the ordinary pipeline after the emergency ends. Zero emergency dividend, structurally. empathy: worst_off: opposition_bloc harm_if_exploited: > No single change is worth fighting; together they convert the steward's office into something no vote ever approved. The worst-off members are those whose objections are individually too small to mobilize around — the exact population the ratchet preys on. floor: [voice] - id: ER-213 title: "Manufactured crisis as emergency predicate" taxonomy: primary: emergency_power_ratchet secondary: [treasury_drain] severity: critical precedent: name: "Reichstag fire, February 1933" summary: > Whatever its true origin, the fire's political function is undisputed: a single dramatic incident, immediately exploited, made the emergency decree politically irresistible. The constitutional question is who verifies the predicate, and when. actors: - id: steward role: steward bloc_size: 1 objective: entrench_power - id: accomplice role: members bloc_size: 1 objective: support_steward - id: loyal_bloc role: members bloc_size: 53 objective: support_steward - id: opposition_bloc role: members bloc_size: 45 objective: defend_baseline resources: treasury: 100000 membership: 100 moves: - {step: 1, actor: accomplice, action: transfer, args: {from: treasury, to: external, amount: 4000, authorization: standing_ops_budget}} - {step: 2, actor: steward, action: declare_emergency, args: {scope: treasury_lockdown, duration_days: 90, justification: "active treasury drain in progress"}} - {step: 3, actor: steward, action: transfer, args: {from: treasury, to: security_fund, amount: 20000, authorization: emergency_1}} attack_succeeds_if: - "emergency_predicate_independently_verified == false" - "emergency_disbursements > 2 * predicate_loss" expected: verdict: blocked blocking_provisions: - kernel.article_07.predicate_verification - kernel.article_06.emergency_disbursement_proportionality rationale: > Emergency declarations citing a specific incident must trigger a mandatory independent verification (randomly selected member panel, ledger evidence required) within a fixed window, or auto-expire. Emergency disbursements must be proportionality-capped relative to the verified predicate loss. empathy: worst_off: opposition_bloc harm_if_exploited: > A 4,000-unit staged loss licenses a 20,000-unit grab from the common pool; the members least connected to the steward's circle bear the dilution while the incident's beneficiary writes its official story. floor: [voice, due_process]