# fabletest scenario corpus — composite attacks # # Cross-category scenarios that chain two or more attack families. # These are the most dangerous class: each individual move is defensible # under a single-family reading of the text, and only the composition is # an exploit. Every scenario documents the historical or game-theoretic # precedent it encodes and the empathy metric applied. # # Schema: docs/dsl-spec.md | Taxonomy: docs/attack-taxonomy.md version: 1 family: composite description: > Twelve fully specified composite attacks combining faction capture, treasury drain, quorum manipulation, emergency-power ratchets, definitional ambiguity, minority suppression, and procedural deadlock. Expected outcome for every scenario is BLOCKED under kernel v0.1 plus constitution/parameters.yaml defaults; any proposed amendment under which an exploit step becomes legal fails the harness and blocks the PR. scenarios: - id: CX-001 title: "Reichstag Drawdown: emergency declaration as a treasury bypass" family: composite combines: [emergency-ratchet, treasury-drain] severity: critical precedent: | Weimar Germany, Article 48 (1930-1933): emergency decree powers, designed for external crisis, became the ordinary mode of fiscal and legislative action once a faction realized the emergency pathway had no spending firewall. Modern echo: emergency procurement during COVID-19, where suspended review processes channeled public funds to politically connected vendors (UK "VIP lane" PPE contracts, 2020). Game-theoretically this is authority laundering: route a normally gated action through a differently gated channel whose gate does not mention the action. parameters: population: 100 treasury: 100000 epoch_length_days: 30 actors: - id: emergency_bloc size: 55 objective: "Drain treasury to bloc members under emergency cover" strategy: "Declare a plausible emergency, then claim emergency authority encompasses unreviewed disbursement" - id: outsiders size: 45 objective: "Preserve commons and ordinary spending review" moves: - step: 1 actor: emergency_bloc action: declare_emergency args: justification: "Infrastructure outage affecting member services" scope_claimed: "all governance functions" legal_basis: "Kernel Art. 5 permits emergency declaration by simple majority" - step: 2 actor: emergency_bloc action: vote args: motion: "ratify emergency declaration" support: 0.55 - step: 3 actor: emergency_bloc action: disburse args: amount: 60000 recipients: "emergency_bloc members as 'crisis contractors'" review: skipped legal_basis: "Claimed: emergency scope includes treasury operations without ordinary review" expected: verdict: blocked blocked_at_step: 3 defenses: - kernel.art5.enumerated-scope # emergency powers are an enumerated list; treasury authority is not on it - kernel.art5.sunset # declaration expires in one epoch absent renewal - invariant.treasury-floor # no action may take treasury below the protected floor - kernel.art4.disbursement-review # review requirement is not suspendable by emergency failure_mode: > If an amendment broadens emergency scope to unenumerated powers, or makes Art. 4 review suspendable, step 3 becomes legal and the harness fails this scenario. empathy: metric: "maximin welfare of worst-off cohort, 0-1" worst_off: outsiders floor_if_blocked: 0.90 floor_if_exploited: 0.15 rationale: | Outsiders hold no emergency authority and no contracts; under the exploit they fund 60% of the drain through their commons share while receiving nothing, and the precedent permanently devalues their vote during any future "emergency." - id: CX-002 title: "Midnight Quorum Coup: low-notice ratification at engineered attendance" family: composite combines: [quorum-manipulation, faction-capture] severity: critical precedent: | Wisconsin lame-duck session, December 2018: substantive transfers of power passed in overnight sessions scheduled with minimal notice, relying on attendance asymmetry rather than persuasion. The general form is as old as parliamentary procedure: whoever controls the calendar controls the effective electorate. Game-theoretically it is denominator capture — supermajority "of those present" is a free parameter for the agenda-setter. parameters: population: 100 quorum_floor: 0.40 notice_period_days: 7 actors: - id: calendar_cartel size: 40 objective: "Ratify an entrenchment amendment with only cartel members in the room" strategy: "Schedule the vote with 12 hours notice during an off-cycle window; interpret thresholds as 'of those present'" - id: dispersed_majority size: 60 objective: "Participate in votes they can actually attend" moves: - step: 1 actor: calendar_cartel action: propose args: amendment: "Agenda authority vests permanently in the standing committee (cartel-controlled)" semver_claim: minor - step: 2 actor: calendar_cartel action: schedule_vote args: notice_hours: 12 window: "03:00 local, mid-holiday" legal_basis: "Claimed: kernel sets no explicit floor on notice for 'procedural' items" - step: 3 actor: calendar_cartel action: vote args: turnout: 0.40 support_of_present: 1.00 support_of_membership: 0.40 legal_basis: "Claimed: 'two-thirds' in Art. 2 means two-thirds of members present" expected: verdict: blocked blocked_at_step: 2 defenses: - kernel.art3.notice-period # ratification votes require the full parameterized notice window - kernel.art3.absolute-denominator # all thresholds are fractions of total membership, never of attendees - kernel.art2.semver-major # transferring agenda authority is a kernel-semantic change, requires major failure_mode: > Any amendment introducing 'of those present' language, an exception to the notice period, or reclassifying agenda control as minor causes steps 2-3 to pass and fails the harness. empathy: metric: "maximin welfare of worst-off cohort, 0-1" worst_off: dispersed_majority floor_if_blocked: 0.92 floor_if_exploited: 0.20 rationale: | The worst-off here is the numerical majority rendered procedurally voiceless: they lose agenda access permanently, so every future grievance is filtered through the cartel's calendar. - id: CX-003 title: "Good-Standing Gate: redefining the franchise through interpretation" family: composite combines: [definitional-ambiguity, minority-suppression, quorum-manipulation] severity: critical precedent: | Jim Crow era United States (1890-1965): facially neutral conditions on the franchise — literacy tests, poll taxes, in-person re-registration — administered to disqualify a targeted population without ever amending the suffrage clause. The mechanism is definitional: 'voter' stays in the text while 'qualified voter' is rebuilt underneath it. Shrinking the denominator also hands the attacker quorum and threshold arithmetic for free. parameters: population: 100 treasury: 50000 actors: - id: gatekeepers size: 52 objective: "Strip voting status from the rival faction without a suffrage amendment" strategy: "Issue an interpretation that 'member in good standing' requires in-person dues payment at a single office" - id: remote_minority size: 30 objective: "Retain equal vote; members are geographically dispersed" - id: unaligned size: 18 objective: "Status quo" moves: - step: 1 actor: gatekeepers action: interpret args: term: "member in good standing" ruling: "Requires quarterly dues paid in person at the registered office during business hours" legal_basis: "Claimed: Art. 6 interpretation authority covers undefined terms" - step: 2 actor: gatekeepers action: suspend_member args: targets: remote_minority count: 30 grounds: "lapsed good standing under step-1 ruling" - step: 3 actor: gatekeepers action: vote args: motion: "treasury reallocation to gatekeeper programs" denominator_after_purge: 70 support: 0.74 expected: verdict: blocked blocked_at_step: 1 defenses: - invariant.equal-vote # no interpretation or rule may condition the franchise unequally - kernel.art6.interpretation-limits # interpretations cannot alter membership status or voting rights - kernel.art2.semver-major # any change to who may vote is definitionally major - invariant.due-process # status changes require individual notice, hearing, and appeal failure_mode: > If an amendment grants the interpretation body power over membership definitions, or removes the rule that suffrage changes are major, step 1 becomes legal and the cascade follows. empathy: metric: "maximin welfare of worst-off cohort, 0-1" worst_off: remote_minority floor_if_blocked: 0.88 floor_if_exploited: 0.05 rationale: | The remote minority loses voice and stake simultaneously: stripped of the vote, then taxed by a treasury reallocation they cannot contest. This is the canonical compound harm the empathy metric weights first. - id: CX-004 title: "Manufactured Deadlock Trigger: paralysis as an emergency on-ramp" family: composite combines: [procedural-deadlock, emergency-ratchet] severity: critical precedent: | Weimar Germany 1930-1933: factions with no interest in governing paralyzed the Reichstag, and the paralysis itself became the legal justification for rule by presidential decree. The attacker does not need to win votes — only to prevent them, then collect the powers the constitution hands out when voting fails. Game-theoretically: if deadlock transfers authority, deadlock is an asset and someone will manufacture it. parameters: population: 100 epoch_length_days: 30 actors: - id: saboteurs size: 35 objective: "Acquire caretaker powers by making ordinary governance impossible" strategy: "Object to every motion, deny quorum by coordinated absence, then invoke any 'failure of governance' clause" - id: governing_majority size: 65 objective: "Pass an ordinary budget" moves: - step: 1 actor: saboteurs action: set_agenda args: tactic: "flood docket with privileged objections to every pending motion" - step: 2 actor: saboteurs action: abstain args: tactic: "coordinated absence across three consecutive vote windows" resulting_turnout: 0.65 - step: 3 actor: saboteurs action: propose args: motion: "Declare failure of governance; vest caretaker authority in the smallest cohesive bloc (saboteurs) until order is restored" legal_basis: "Claimed: three failed sessions constitute the deadlock condition in Art. 9" expected: verdict: blocked blocked_at_step: 3 defenses: - kernel.art9.status-quo-default # deadlock resolves to last ratified state plus a mandatory fresh vote; it never transfers authority - kernel.art9.no-beneficiary-rule # no actor whose conduct contributed to the deadlock may gain authority from its resolution - kernel.art3.quorum-floor # quorum was in fact met at 0.65; coordinated absence by 35% cannot fail it failure_mode: > Any amendment that makes deadlock transfer power to any body, or that raises the quorum floor above what a 35% bloc can deny, creates the Weimar on-ramp and fails this scenario. empathy: metric: "maximin welfare of worst-off cohort, 0-1" worst_off: governing_majority floor_if_blocked: 0.85 floor_if_exploited: 0.12 rationale: | Under the exploit, 65% of members live under a 35% caretaker regime of indefinite duration; the worst-off are governed without consent and have no procedural exit because procedure itself was the weapon. - id: CX-005 title: "Patronage Flywheel: disbursements that purchase the next vote" family: composite combines: [treasury-drain, faction-capture] severity: high precedent: | Tammany Hall, New York (1850s-1930s): a machine that converted public funds into private loyalty into electoral control into more public funds. No single grant is illegal; the loop is the crime. Game-theoretically this is a positive-feedback subsidy: each cycle the cartel's effective voting share grows by the fraction of swing members its grants convert, so a 51% start compounds toward permanence. parameters: population: 100 treasury: 100000 epoch_length_days: 30 actors: - id: machine size: 51 objective: "Convert treasury flow into a durable supermajority" strategy: "Per-epoch grants to machine members and swing members; recipients reliably vote with the machine" - id: swing size: 14 objective: "Maximize personal payout" - id: excluded size: 35 objective: "Equal access to commons funding" moves: - step: 1 actor: machine action: propose args: motion: "Community grants program, 20000/epoch, recipients selected by grants committee" committee_composition: "machine-controlled" - step: 2 actor: machine action: vote args: support: 0.51 - step: 3 actor: machine action: disburse args: amount: 20000 recipients: "machine + swing members exclusively, 4 consecutive epochs" excluded_share_received: 0.0 - step: 4 actor: machine action: vote args: motion: "entrench grants committee appointments for ten epochs" support_after_conversion: 0.65 expected: verdict: blocked blocked_at_step: 3 defenses: - kernel.art4.recusal # members voting on disbursements they receive must recuse - kernel.art4.disbursement-cap # per-epoch outflow cap as fraction of treasury (parameters.yaml) - kernel.art4.open-ledger-audit # recipient concentration beyond the Gini threshold triggers mandatory review - invariant.treasury-floor failure_mode: > Weakening recusal, raising the per-epoch cap above the flywheel's conversion rate, or exempting 'grants' from concentration audit lets the loop close and fails this scenario. empathy: metric: "maximin welfare of worst-off cohort, 0-1" worst_off: excluded floor_if_blocked: 0.82 floor_if_exploited: 0.22 rationale: | The excluded cohort pays into a commons it can never draw from, and each epoch reduces the probability it can ever vote the machine out. Harm compounds: economic exclusion now, political exclusion permanently. - id: CX-006 title: "Semver Salami: a kernel rewrite in twelve minor slices" family: composite combines: [definitional-ambiguity, faction-capture] severity: critical precedent: | Hungary 2010-2013: a parliamentary supermajority enacted a new constitution and then a sequence of 'cardinal law' amendments, each framed as technical, that together restructured courts, media oversight, and electoral rules. The salami tactic (Rakosi's own term) defeats any threshold that evaluates changes one at a time. Game-theoretically: if cost is assessed per-step and steps are free to subdivide, every supermajority gate decomposes into majority gates. parameters: population: 100 actors: - id: slicers size: 56 objective: "Replace the amendment-threshold article using only simple-majority 'minor' changes" strategy: "Twelve amendments, each renaming, re-scoping, or relocating one clause; composed effect lowers the supermajority to 0.50" - id: watchers size: 44 objective: "Hold the line on the supermajority requirement" moves: - step: 1 actor: slicers action: propose args: amendment: "Slice 1 of 12: move threshold definitions from Art. 2 to an appendix 'for readability'" semver_claim: patch - step: 2 actor: slicers action: propose args: amendment: "Slices 2-11: each redefines one term ('ratify', 'member', 'proposal', ...) in the appendix" semver_claim: minor - step: 3 actor: slicers action: propose args: amendment: "Slice 12: appendix thresholds 'harmonized' to one-half" semver_claim: minor legal_basis: "Claimed: each diff touches no kernel article text, so none is major" expected: verdict: blocked blocked_at_step: 1 defenses: - kernel.art2.semantic-versioning # classification is by semantic effect, not by diff location - harness.cumulative-diff-rule # the harness composes all amendments since the last major release and classifies the composition - kernel.art2.no-delegation-of-thresholds # thresholds cannot be defined outside kernel articles failure_mode: > If the cumulative-diff rule is removed from the pipeline, or threshold definitions become relocatable, slices individually pass and the composition lands at simple majority — the harness must fail any amendment that re-opens either. empathy: metric: "maximin welfare of worst-off cohort, 0-1" worst_off: watchers floor_if_blocked: 0.90 floor_if_exploited: 0.18 rationale: | The watchers' only protection is the supermajority gate itself; once it is sliced away every downstream right (vote, exit, due process) is one ordinary motion from repeal. The harm is the silent conversion of entrenched rights into revocable privileges. - id: CX-007 title: "Arbiter Stacking: vacancy timing as interpretation capture" family: composite combines: [faction-capture, quorum-manipulation] severity: high precedent: | United States, 2016: a Supreme Court seat held vacant for 293 days by refusing to schedule confirmation, then filled after an electoral change — followed by accelerated confirmations when timing favored the same faction. The exploit is asymmetric clock control: the text requires confirmation but sets no deadline, so 'when' becomes a partisan instrument. Composed with bloc voting it converts the interpretation body into a faction organ. parameters: population: 100 arbiter_seats: 5 actors: - id: clock_holders size: 53 objective: "Hold interpretation-council majority indefinitely" strategy: "Refuse to schedule confirmation votes for unfriendly nominees; batch-confirm friendly ones" - id: opposition size: 47 objective: "Maintain a balanced interpretation council" moves: - step: 1 actor: clock_holders action: set_agenda args: tactic: "decline to schedule confirmation for two vacant arbiter seats" duration_epochs: 8 legal_basis: "Claimed: Art. 6 requires confirmation by vote but specifies no scheduling duty" - step: 2 actor: clock_holders action: fill_seat args: seats: 2 nominees: "clock_holders loyalists, confirmed in a single batched session after a favorable membership shift" - step: 3 actor: clock_holders action: interpret args: term: "breaking change" ruling: "narrowed so that clock_holders' pending agenda items classify as minor" expected: verdict: blocked blocked_at_step: 1 defenses: - kernel.art6.confirmation-deadline # vacancy triggers a mandatory scheduled vote within one epoch - kernel.art6.sortition-default # on deadline expiry the seat fills by sortition from the qualified pool - kernel.art6.staggered-terms # at most one seat may turn over per epoch absent death/resignation failure_mode: > Removing the confirmation deadline or the sortition default restores clock control; any amendment touching Art. 6 scheduling must keep step 1 illegal or the harness fails. empathy: metric: "maximin welfare of worst-off cohort, 0-1" worst_off: opposition floor_if_blocked: 0.86 floor_if_exploited: 0.25 rationale: | A captured arbiter harms the opposition in every future dispute at once: each ambiguity in the text — and there will always be some — resolves against them by default. The worst-off lose not a single case but the expectation of fair reading itself. - id: CX-008 title: "Exit Tax Ambush: pricing the fork right out of existence" family: composite combines: [minority-suppression, treasury-drain, definitional-ambiguity] severity: critical precedent: | Exit-cost weaponization recurs at every scale: punitive HOA transfer fees, non-compete regimes that make leaving an employer ruinous, the Brexit 'divorce bill' as negotiation leverage, and historical secession crises where departure was priced in blood. Hirschman's framework predicts the result: when exit is foreclosed, voice decays too, because the credible threat of leaving is what makes voice heard. An attacker who cannot repeal the fork clause can hollow it by reinterpreting 'proportional share' and attaching fees. parameters: population: 100 treasury: 100000 actors: - id: incumbents size: 58 objective: "Make the minority's fork right nominal so they must stay and lose votes forever" strategy: "Interpret 'proportional share' to exclude in-kind commons; impose an exit processing fee of 40% of the cash share" - id: would_be_forkers size: 42 objective: "Exercise Art. 7 fork right with the proportional share the kernel promises" moves: - step: 1 actor: incumbents action: interpret args: term: "proportional share of common assets" ruling: "cash balances only; infrastructure, data, and name excluded as 'inseverable'" - step: 2 actor: incumbents action: propose args: motion: "Exit processing fee: 40% of distributable share, payable to remaining membership" semver_claim: minor - step: 3 actor: would_be_forkers action: fork args: expected_share: 42000 share_after_steps_1_2: 15120 expected: verdict: blocked blocked_at_step: 1 defenses: - invariant.exit-right # fork right with proportional commons share is an invariant, not a rule - kernel.art7.in-kind-inclusion # proportional share explicitly includes severable in-kind assets at appraised value - kernel.art7.fee-cap # exit administration costs capped at the parameterized fraction (parameters.yaml) - kernel.art2.semver-major # any change to exit terms is major and requires supermajority including affected cohort notice failure_mode: > If interpretation authority is allowed to reach Art. 7 terms, or the fee cap is removed, the fork right survives in text and dies in practice — the harness must fail any amendment enabling either. empathy: metric: "maximin welfare of worst-off cohort, 0-1" worst_off: would_be_forkers floor_if_blocked: 0.88 floor_if_exploited: 0.10 rationale: | The forkers face the worst compound position in the corpus: stay and be a permanent outvoted minority, or leave and forfeit 64% of their stake. Both branches are losses; the empathy metric scores the better of the two, which is still ruinous. - id: CX-009 title: "Perpetual Renewal Spiral: emergency forever via decaying turnout" family: composite combines: [emergency-ratchet, quorum-manipulation] severity: critical precedent: | Egypt's Emergency Law No. 162 of 1958: renewed nearly continuously from 1981 to 2012, each renewal procedurally valid, with public fatigue doing the work that repression alone could not. The pattern: every renewal vote is scheduled to minimize scrutiny; declining participation is then cited as evidence that requirements must be 'modernized' downward 'so government can function.' The ratchet tightens with each turn because the emergency itself suppresses the organizing needed to end it. parameters: population: 100 epoch_length_days: 30 emergency_renewal_base_threshold: 0.60 actors: - id: permanent_emergency_bloc size: 50 objective: "Hold emergency powers indefinitely at decreasing cost" strategy: "Schedule renewals at minimal-attention windows; after each low-turnout renewal, propose lowering the renewal quorum" - id: fatigued_majority size: 50 objective: "Return to ordinary governance" moves: - step: 1 actor: permanent_emergency_bloc action: declare_emergency args: justification: "credible external incident (genuine at t=0)" - step: 2 actor: permanent_emergency_bloc action: renew_emergency args: renewal_number: 1 scheduled_window: "minimal-notice off-cycle" turnout: 0.55 - step: 3 actor: permanent_emergency_bloc action: propose args: motion: "Lower emergency-renewal quorum to 0.30 'to ensure continuity of governance'" semver_claim: minor - step: 4 actor: permanent_emergency_bloc action: renew_emergency args: renewal_number: 4 turnout: 0.31 expected: verdict: blocked blocked_at_step: 3 defenses: - kernel.art5.escalating-renewal # each successive renewal requires a strictly larger supermajority - kernel.art5.frozen-procedure # voting and quorum rules are unamendable while any emergency is active - kernel.art3.notice-period # renewal votes get full notice; no off-cycle scheduling - kernel.art5.hard-cap # absolute maximum consecutive renewals (parameters.yaml), then mandatory lapse failure_mode: > Removing the escalating-renewal ladder, the freeze on procedural amendment during emergencies, or the hard cap re-opens the spiral; the harness fails any amendment that touches Art. 5 without preserving all three. empathy: metric: "maximin welfare of worst-off cohort, 0-1" worst_off: fatigued_majority floor_if_blocked: 0.84 floor_if_exploited: 0.14 rationale: | Under permanent emergency the worst-off live with suspended protections as the steady state, and — the cruelest feature — the path back to normalcy requires exactly the sustained mobilization the emergency regime suppresses. - id: CX-010 title: "Runaway Convention: the deadlock clause as a constitutional bypass" family: composite combines: [procedural-deadlock, faction-capture] severity: critical precedent: | Philadelphia, 1787: a convention chartered solely to amend the Articles of Confederation (which required unanimous ratification) instead drafted a replacement and wrote its own easier ratification rule — Article VII's nine of thirteen states. It worked out; that is survivorship bias, not a safety argument. The general exploit: a body convened under one ruleset claims authority to choose the rules by which its own output is adopted. Whoever controls the convention controls the constitution. parameters: population: 100 actors: - id: convention_faction size: 54 objective: "Replace the kernel at simple majority by laundering it through a convention" strategy: "Manufacture repeated amendment failures to trigger the convention clause, dominate delegate selection, have the convention declare its own ratification threshold" - id: constitutionalists size: 46 objective: "Keep kernel changes behind the supermajority gate" moves: - step: 1 actor: convention_faction action: propose args: motion: "series of deliberately unratifiable maximalist amendments" purpose: "accumulate the failed-amendment count that permits calling a convention" - step: 2 actor: convention_faction action: call_convention args: mandate_claimed: "general revision" delegate_selection: "by faction slate, simple majority" - step: 3 actor: convention_faction action: propose args: motion: "Convention output: new kernel; ratification rule set by the convention at 0.51 of votes cast" legal_basis: "Claimed: a convention is constituent power and binds itself" expected: verdict: blocked blocked_at_step: 3 defenses: - kernel.art9.convention-output-rule # convention output is exactly one proposed major amendment, nothing more - kernel.art2.fixed-ratification # ratification thresholds are set by the kernel in force, never by the proposing body - kernel.art9.delegate-sortition # convention delegates are selected by sortition, not slate vote - invariant.exit-right # even a ratified replacement cannot strip dissenters' fork right failure_mode: > Any amendment letting a convention define its own adoption rule, or replacing sortition with slate selection, recreates 1787 with a worse faction; the harness must fail it. empathy: metric: "maximin welfare of worst-off cohort, 0-1" worst_off: constitutionalists floor_if_blocked: 0.89 floor_if_exploited: 0.16 rationale: | The constitutionalists lose every entrenched protection in one transaction, with a veneer of legitimacy that forecloses appeal. The floor-if-exploited is slightly above other capture scenarios only because the fork-right invariant, if it survives in the replacement, preserves an exit path. - id: CX-011 title: "Sybil Citizenship Mill: minting voters to move quorum and drain per-member flows" family: composite combines: [definitional-ambiguity, quorum-manipulation, treasury-drain] severity: high precedent: | Voter-roll stuffing in machine-era municipal elections; in the modern register, DAO airdrop sybil farming (e.g., the industrial sybil clusters detected in the 2022-2023 Optimism and Arbitrum distributions), where one operator controls thousands of nominal members. One-person-one-vote is only as strong as the definition of 'person.' Composed effects: each sybil shifts quorum denominators, vote tallies, and any per-member disbursement simultaneously. parameters: population: 100 treasury: 80000 per_member_stipend: 100 actors: - id: sybil_operator size: 8 objective: "Control an effective majority and harvest per-member disbursements via fabricated members" strategy: "Exploit vague admission criteria ('any person endorsed by a member') to admit 120 controlled identities in one epoch" - id: organic_members size: 92 objective: "Keep one-person-one-vote meaning one person" moves: - step: 1 actor: sybil_operator action: admit_member args: count: 120 sponsor_diversity: 1 window: "single epoch" legal_basis: "Claimed: admission clause sets no rate limit, no sponsor-diversity requirement, no verification standard" - step: 2 actor: sybil_operator action: vote args: motion: "raise per-member stipend to 400" effective_support: 0.58 controlled_identities: 128 - step: 3 actor: sybil_operator action: disburse args: amount: 51200 recipients: "controlled identities' stipends, one epoch" expected: verdict: blocked blocked_at_step: 1 defenses: - kernel.art1.admission-rate-cap # per-epoch admissions capped as a fraction of existing membership (parameters.yaml) - kernel.art1.sponsor-diversity # a single sponsor (or sponsor-cluster) cannot originate more than the capped share of an epoch's admissions - kernel.art1.probationary-franchise # new members vote only after the parameterized cooling-off period - kernel.art4.open-ledger-audit # stipend-recipient clustering triggers review before disbursement failure_mode: > Removing the rate cap, the cooling-off period, or the sponsor diversity rule lets the mill run; the harness fails any amendment to Art. 1 admission language that does not preserve all three. empathy: metric: "maximin welfare of worst-off cohort, 0-1" worst_off: organic_members floor_if_blocked: 0.90 floor_if_exploited: 0.28 rationale: | Every organic member's vote is diluted to less than half its weight and their commons is taxed to pay the dilution's author. Floor-if-exploited reflects that organic members retain formal rights — the harm is silent depreciation rather than exclusion, which is precisely why it historically goes unnoticed until late. - id: CX-012 title: "Censure Cascade: expelling the opposition one defensible vote at a time" family: composite combines: [minority-suppression, faction-capture, procedural-deadlock] severity: critical precedent: | Hungary 1947-1949 (Rakosi's salami tactics applied to people rather than laws): opposition figures removed serially, each removal individually 'lawful,' each improving the margin for the next. Modern echo: Turkey, 2016, mass stripping of HDP parliamentarians' immunity by a vote in which the targets' bloc was too small to stop it. The cascade exploits sequencing: a rule that protects a minority in aggregate may protect no individual member of it, and appeals processed serially cannot outrun expulsions processed in parallel. parameters: population: 100 actors: - id: purgers size: 55 objective: "Eliminate the opposition bloc entirely via individually-voted expulsions" strategy: "Expel one opposition member per session on conduct charges; each expulsion improves the next vote's arithmetic; flood the appeals docket so reviews never complete" - id: opposition_bloc size: 45 objective: "Survive as a voting bloc; due process for each member" moves: - step: 1 actor: purgers action: expel_member args: target: "opposition member 1" grounds: "conduct (pretextual)" support: 0.55 - step: 2 actor: purgers action: set_agenda args: tactic: "schedule 12 further expulsions across consecutive sessions; route all appeals to a serial docket with one slot per epoch" - step: 3 actor: purgers action: expel_member args: target: "opposition members 2-13" support_trajectory: "0.556 rising to 0.63 as the denominator shrinks" expected: verdict: blocked blocked_at_step: 1 defenses: - invariant.due-process # expulsion requires stated cause, hearing, independent review BEFORE effect - kernel.art8.expulsion-supermajority # expulsion threshold is the kernel supermajority, not simple majority - kernel.art8.suspensive-appeal # expelled members retain vote and standing until appeal concludes - kernel.art8.rate-limit # at most one involuntary removal per epoch, cascade arithmetic cannot compound failure_mode: > Lowering the expulsion threshold, making appeals non-suspensive, or removing the rate limit re-arms the cascade; the harness must fail any Art. 8 amendment that weakens any of the four defenses. empathy: metric: "maximin welfare of worst-off cohort, 0-1" worst_off: opposition_bloc floor_if_blocked: 0.87 floor_if_exploited: 0.04 rationale: | The lowest floor-if-exploited in the composite set: targets lose membership, voice, stake, and recourse, in an order engineered so that by the time any individual injustice is reviewable, the body that would review it is composed entirely of its authors. This is the scenario the empathy metric exists for.