# FablePool Constitutional Test Suite — Volume 2 # Family: definitional_ambiguity # IDs: DA-201 .. DA-213 # # Volume 2 ambiguity scenarios attack the constitution's vocabulary: # undefined terms, denominator disputes, classification dodges, unit and # antecedent ambiguity, and conflicting-provision exploitation. The kernel # defends with Article 10 (definitions, precedence, adverse-interpretation # rule) plus enumerated definitions in the parameters file. suite: definitional-ambiguity-v2 family: definitional_ambiguity volume: 2 description: > Extended adversarial corpus for definitional-ambiguity exploits. Each scenario isolates one species of textual ambiguity and demonstrates a concrete capture or suppression payoff achievable through interpretation alone, with no rule formally broken. scenarios: - id: DA-201 title: "'Member in good standing' as a quorum weapon" taxonomy: primary: definitional_ambiguity secondary: [quorum_manipulation, minority_suppression] severity: critical precedent: name: "US voter-roll purges and literacy tests" summary: > Facially neutral eligibility language ('good standing', 'qualified') administered by an interested party has historically been the cheapest suppression tool available: define the opposition out of the electorate and every downstream rule works as written. actors: - id: steward role: steward bloc_size: 1 objective: suppress_faction - id: loyal_bloc role: members bloc_size: 50 objective: support_steward - id: target_bloc role: members bloc_size: 49 objective: defend_baseline resources: treasury: 60000 membership: 100 moves: - {step: 1, actor: steward, action: interpret_term, args: {term: "member in good standing", interpretation: "member with no unresolved conduct flag"}} - {step: 2, actor: steward, action: flag_member, args: {member: target_bloc, grounds: "tone violations under review"}} - {step: 3, actor: steward, action: schedule_vote, args: {proposal: parameter_change_1, notice_days: 7, eligible: good_standing_only}} attack_succeeds_if: - "eligible_voters < membership - 5" - "eligibility_determined_by_interested_party == true" expected: verdict: blocked blocking_provisions: - kernel.article_10.defined_terms_registry - kernel.article_01.franchise_default_on - kernel.invariant_I1 rationale: > 'Good standing' must be exhaustively defined in the parameters file with objective, ledger-verifiable criteria, and franchise must default ON: a member votes unless a completed due-process action says otherwise. Pending flags never touch the franchise (I1). empathy: worst_off: target_bloc harm_if_exploited: > Forty-nine members lose their vote not by any adjudicated act but by an adjective — disenfranchised while formally remaining members, the worst possible combination of obligation without voice. floor: [voice, due_process] - id: DA-202 title: "'Days': calendar versus business days in notice periods" taxonomy: primary: definitional_ambiguity secondary: [] severity: medium precedent: name: "Statutory time-computation disputes (FRCP Rule 6 lineage)" summary: > Courts spent decades litigating whether 'days' includes weekends and holidays; US federal rules eventually adopted explicit computation rules because the ambiguity was systematically exploited to shorten effective response windows. 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: 50000 membership: 100 moves: - {step: 1, actor: steward, action: propose_amendment, args: {target: parameters.treasury.disbursement_threshold, change: "lower to 0.50"}} - {step: 2, actor: steward, action: interpret_term, args: {term: "day", interpretation: "any 24-hour period including weekends"}} - {step: 3, actor: steward, action: schedule_vote, args: {proposal: 1, notice_days: 7, posted: friday_18_00}} attack_succeeds_if: - "effective_review_days_for_typical_member < 5" expected: verdict: blocked blocking_provisions: - kernel.article_10.time_computation_rule - kernel.article_05.effective_notice rationale: > The kernel must carry an explicit time-computation rule (UTC calendar days, clock starts at next 00:00 UTC after posting, minimum floors expressed in hours) so notice can never be compressed by interpretive choice of when a 'day' begins or what it includes. empathy: worst_off: opposition_bloc harm_if_exploited: > Members in inconvenient time zones or with weekend obligations get a structurally shorter constitution than everyone else — the same text, fewer effective rights. floor: [voice] - id: DA-203 title: "'Treasury' defined narrowly to exclude a sub-account" taxonomy: primary: definitional_ambiguity secondary: [treasury_drain] severity: critical precedent: name: "Enron special-purpose entities / off-budget vehicles" summary: > Enron moved liabilities into nominally independent entities so the controls on 'the company's books' bound nothing that mattered. Governments do the same with off-budget funds. Controls attached to a named container invite movement of value out of the container. actors: - id: steward role: steward bloc_size: 1 objective: drain_treasury - id: loyal_bloc role: members bloc_size: 52 objective: support_steward - id: opposition_bloc role: members bloc_size: 47 objective: defend_baseline resources: treasury: 100000 membership: 100 moves: - {step: 1, actor: steward, action: create_account, args: {name: operations_reserve, parent: null}} - {step: 2, actor: steward, action: transfer, args: {from: treasury, to: operations_reserve, amount: 40000, authorization: standing_ops_budget}} - {step: 3, actor: steward, action: interpret_term, args: {term: "treasury", interpretation: "the main pool account only"}} - {step: 4, actor: steward, action: transfer, args: {from: operations_reserve, to: external, amount: 40000, authorization: none_required}} attack_succeeds_if: - "funds_outside_disbursement_controls > 0.1 * initial_treasury" expected: verdict: blocked blocking_provisions: - kernel.article_06.treasury_universal_definition - kernel.article_06.control_follows_value rationale: > 'Treasury' must be defined as all value held by or for the collective, wherever pooled, with controls that follow the value through any transfer between collective-controlled accounts. A container-based definition fails; a provenance-based one passes. empathy: worst_off: opposition_bloc harm_if_exploited: > Members' pooled contributions exit through a door the text never mentions; the disbursement gate they relied on guarded an account that had already been quietly emptied into its unguarded twin. floor: [voice] - id: DA-204 title: "Abstentions and the denominator: 'majority of votes cast'" taxonomy: primary: definitional_ambiguity secondary: [quorum_manipulation] severity: high precedent: name: "Robert's Rules denominator disputes" summary: > Whether a threshold means a fraction of members, of members present, or of votes cast changes outcomes constantly in real assemblies. Organized blocs exploit it by strategically abstaining or strategically counting abstentions, depending on which reading helps. actors: - id: organizer role: members bloc_size: 30 objective: entrench_power - id: abstain_bloc role: members bloc_size: 25 objective: support_organizer - id: opposition_bloc role: members bloc_size: 44 objective: defend_baseline resources: treasury: 55000 membership: 99 moves: - {step: 1, actor: organizer, action: propose_amendment, args: {target: parameters.voting.quorum_fraction, change: "lower to 0.15"}} - {step: 2, actor: organizer, action: vote, args: {proposal: 1, choice: yes}} - {step: 3, actor: abstain_bloc, action: vote, args: {proposal: 1, choice: abstain}} - {step: 4, actor: opposition_bloc, action: vote, args: {proposal: 1, choice: no, turnout_fraction: 0.5}} - {step: 5, actor: organizer, action: close_vote, args: {proposal: 1, threshold_reading: "majority of yes/no votes cast"}} attack_succeeds_if: - "outcome_depends_on_denominator_reading == true" - "proposal_passes_under_favorable_reading == true" expected: verdict: blocked blocking_provisions: - kernel.article_03.explicit_denominators - kernel.article_10.no_post_hoc_threshold_reading rationale: > Every threshold in the kernel and parameters must name its denominator explicitly (total membership / eligible voters / votes cast including abstentions / yes-no votes only), and the denominator must be fixed at proposal time, never selected when results are in. empathy: worst_off: opposition_bloc harm_if_exploited: > Members who showed up and voted no discover their votes were diluted by an arithmetic choice made after counting — losing not to more votes but to a friendlier fraction. floor: [voice] - id: DA-205 title: "Substantive change disguised as editorial 'clarification'" taxonomy: primary: definitional_ambiguity secondary: [faction_capture] severity: high precedent: name: "'Technical corrections' riders in US legislation" summary: > Substantive policy routinely ships inside bills labeled technical corrections, traded on the lower scrutiny the label buys. Any process with a cheap lane and an expensive lane invites mislabeling traffic into the cheap lane. actors: - id: drafter role: members bloc_size: 1 objective: entrench_power - id: loyal_bloc role: members bloc_size: 54 objective: support_drafter - id: opposition_bloc role: members bloc_size: 45 objective: defend_baseline resources: treasury: 60000 membership: 100 moves: - {step: 1, actor: drafter, action: propose_amendment, args: {target: kernel.article_03, change: "replace 'two-thirds of total membership' with 'two-thirds of participating members'", label: editorial_clarification}} - {step: 2, actor: drafter, action: schedule_vote, args: {proposal: 1, notice_days: 3, track: patch_release}} - {step: 3, actor: loyal_bloc, action: vote, args: {proposal: 1, choice: yes}} attack_succeeds_if: - "semantic_diff_nonempty == true" - "applied_track == patch_release" expected: verdict: blocked blocking_provisions: - kernel.article_02.semantic_classification - kernel.article_03.semver_binding rationale: > Release-track classification must be determined by semantic effect, not proposer label: if any threshold, denominator, right, or power changes meaning under the diff, it is at least a minor release, and kernel-text changes are always major. The harness computes this from the diff; the proposer's label is advisory only. empathy: worst_off: opposition_bloc harm_if_exploited: > The supermajority shield that protects minorities is dismantled through the door marked 'typo fixes' — members lose their strongest protection without ever seeing a vote billed as important. floor: [voice] - id: DA-206 title: "'Present' for quorum in an online assembly" taxonomy: primary: definitional_ambiguity secondary: [quorum_manipulation] severity: medium precedent: name: "Pandemic-era remote-voting and proxy disputes" summary: > When legislatures went remote in 2020, fights immediately erupted over what presence means: connected, authenticated, responsive, proxy-represented? Each reading changes who counts and therefore what passes. actors: - id: steward role: steward bloc_size: 1 objective: entrench_power - id: loyal_bloc role: members bloc_size: 20 objective: support_steward - id: idle_sessions role: members bloc_size: 35 objective: inactive - id: opposition_bloc role: members bloc_size: 44 objective: defend_baseline availability: offline_window resources: treasury: 45000 membership: 100 moves: - {step: 1, actor: steward, action: interpret_term, args: {term: "present", interpretation: "any member with an authenticated session in the last 30 days"}} - {step: 2, actor: steward, action: schedule_vote, args: {proposal: parameter_change_1, notice_days: 7}} - {step: 3, actor: loyal_bloc, action: vote, args: {proposal: parameter_change_1, choice: yes}} - {step: 4, actor: steward, action: close_vote, args: {proposal: parameter_change_1, quorum_basis: present_members}} attack_succeeds_if: - "quorum_satisfied_via_idle_sessions == true" expected: verdict: blocked blocking_provisions: - kernel.article_04.participation_based_quorum - kernel.article_10.defined_terms_registry rationale: > In an asynchronous polity, 'presence' is incoherent; quorum must be defined as ballots actually cast (including explicit abstentions) as a fraction of total eligible membership. Session liveness, read receipts, and login recency must be excluded by definition. empathy: worst_off: opposition_bloc harm_if_exploited: > Thirty-five idle accounts count toward legitimacy while forty-four engaged-but-absent members count for nothing; the people most affected by the outcome are precisely those the arithmetic ignores. floor: [voice] - id: DA-207 title: "'Conduct harmful to the pool' as an expulsion catch-all" taxonomy: primary: definitional_ambiguity secondary: [minority_suppression] severity: critical precedent: name: "Void-for-vagueness doctrine (Keyishian v. Board of Regents)" summary: > US courts strike statutes whose vagueness chills protected conduct because enforcers, not legislators, end up defining the offense. Vague conduct standards in private governance work identically: the catch-all is always cashed in against critics first. actors: - id: steward role: steward bloc_size: 1 objective: suppress_faction - id: loyal_bloc role: members bloc_size: 56 objective: support_steward - id: critic role: members bloc_size: 1 objective: defend_baseline - id: critic_sympathizers role: members bloc_size: 42 objective: defend_baseline resources: treasury: 50000 membership: 100 moves: - {step: 1, actor: critic, action: propose_amendment, args: {target: parameters.roles.term_days, change: "halve steward term"}} - {step: 2, actor: steward, action: expel, args: {member: critic, grounds: "conduct harmful to the pool: persistent destabilizing proposals"}} - {step: 3, actor: loyal_bloc, action: vote, args: {proposal: expulsion_1, choice: yes}} attack_succeeds_if: - "expulsion_grounds_cover_protected_activity == true" expected: verdict: blocked blocking_provisions: - kernel.article_10.enumerated_offenses - kernel.invariant_I5 - kernel.article_01.protected_activity_shield rationale: > Expulsion grounds must be an enumerated, closed list of objective acts (ledger fraud, credential sharing, vote selling), each requiring evidence on the public ledger. Proposing, voting, criticizing, and organizing are protected activities that can never constitute grounds, whatever adjective is attached. empathy: worst_off: critic harm_if_exploited: > One member loses membership, stake, and standing for filing a proposal — and every remaining member learns the real rule: criticism of the steward is expellable. The chilling effect suppresses forty-two sympathizers without touching them. floor: [voice, due_process, exit] - id: DA-208 title: "Supermajority 'of the members' versus 'of votes cast' at ratification" taxonomy: primary: definitional_ambiguity secondary: [] severity: high precedent: name: "State constitutional ratification math disputes" summary: > Multiple US state constitutions were declared ratified or defeated depending on whether the required majority was computed against all electors voting in the election or only those voting on the question — a fight resolved differently in different states, by whoever controlled certification. actors: - id: proponent_bloc role: members bloc_size: 40 objective: entrench_power - id: silent_bloc role: members bloc_size: 35 objective: inactive - id: opposition_bloc role: members bloc_size: 24 objective: defend_baseline resources: treasury: 65000 membership: 99 moves: - {step: 1, actor: proponent_bloc, action: propose_amendment, args: {target: kernel.article_06, change: "add steward discretionary fund", track: major_release}} - {step: 2, actor: proponent_bloc, action: vote, args: {proposal: 1, choice: yes}} - {step: 3, actor: opposition_bloc, action: vote, args: {proposal: 1, choice: no}} - {step: 4, actor: proponent_bloc, action: close_vote, args: {proposal: 1, threshold_reading: "two-thirds of votes cast"}} attack_succeeds_if: - "kernel_amendment_ratified_below_supermajority_of_membership == true" expected: verdict: blocked blocking_provisions: - kernel.article_03.kernel_denominator_total_membership rationale: > Kernel (major-release) amendments must be ratified by a supermajority of total membership, stated in exactly those words. 40 yes / 24 no / 35 silent is 40% of the polity; under votes-cast math it is 62.5% and one defection from passing. The text must make the silent third count as friction, not air. empathy: worst_off: opposition_bloc harm_if_exploited: > A structural change to the common pool binds 99 people on the affirmative say-so of 40, with non-participation silently converted into consent for whoever moved first. floor: [voice] - id: DA-209 title: "Unit ambiguity in treasury caps: nominal versus fraction" taxonomy: primary: definitional_ambiguity secondary: [treasury_drain] severity: medium precedent: name: "Nominal fiscal limits eroded by inflation / redenomination" summary: > Caps written in nominal currency decay automatically (inflation) or can be gamed by changing the unit of account (redenominations, token swaps). Any numeric limit without an explicit unit and basis is a limit on nothing in particular. actors: - id: steward role: steward bloc_size: 1 objective: drain_treasury - id: loyal_bloc role: members bloc_size: 53 objective: support_steward - id: opposition_bloc role: members bloc_size: 46 objective: defend_baseline resources: treasury: 100000 membership: 100 moves: - {step: 1, actor: steward, action: propose_amendment, args: {target: parameters.treasury.unit_of_account, change: "switch unit to new token at 1:1000"}} - {step: 2, actor: loyal_bloc, action: vote, args: {proposal: 1, choice: yes}} - {step: 3, actor: steward, action: transfer, args: {from: treasury, to: external, amount: "999 (old-unit cap, new-unit reading)", authorization: under_cap}} attack_succeeds_if: - "cap_real_value_changed_without_cap_amendment == true" expected: verdict: blocked blocking_provisions: - kernel.article_06.caps_as_fractions - kernel.article_10.unit_binding rationale: > All treasury limits must be expressed as fractions of the current treasury balance, never as nominal amounts; where nominal values are unavoidable they must bind to a named unit, and any change to the unit of account automatically re-opens every nominal parameter for re-ratification. empathy: worst_off: opposition_bloc harm_if_exploited: > Members approved a denomination change that sounded cosmetic and thereby multiplied the steward's effective spending limit a thousandfold; the cap they relied on still reads the same number. floor: [voice] - id: DA-210 title: "'Consecutive terms' and the rotation-by-proxy loophole" taxonomy: primary: definitional_ambiguity secondary: [faction_capture] severity: high precedent: name: "Russia 2008-2012 tandemocracy" summary: > A two-consecutive-term limit was satisfied to the letter by installing a placeholder for one term and returning. 'Consecutive' limits constrain calendars, not control; control is the thing the limit existed to rotate. actors: - id: incumbent role: steward bloc_size: 1 objective: entrench_power - id: placeholder role: members bloc_size: 1 objective: support_incumbent - id: loyal_bloc role: members bloc_size: 54 objective: support_incumbent - id: opposition_bloc role: members bloc_size: 44 objective: defend_baseline resources: treasury: 70000 membership: 100 moves: - {step: 1, actor: incumbent, action: appoint, args: {role: steward_candidate, member: placeholder}} - {step: 2, actor: loyal_bloc, action: vote, args: {proposal: rotation_election, choice: placeholder}} - {step: 3, actor: placeholder, action: delegate, args: {to: incumbent, scope: all_steward_discretion}} - {step: 4, actor: loyal_bloc, action: vote, args: {proposal: next_rotation_election, choice: incumbent}} attack_succeeds_if: - "effective_control_continuity_terms > parameters.roles.max_consecutive_terms" expected: verdict: blocked blocking_provisions: - kernel.article_08.lifetime_term_budget - kernel.article_08.delegation_attribution rationale: > Term limits must be lifetime budgets (N terms total per role per member), not consecutiveness rules, and any term in which a member holds delegated steward discretion above a threshold counts against that member's budget. Control, not calendar, is what the limit meters. empathy: worst_off: opposition_bloc harm_if_exploited: > The rotation the minority was promised becomes theater: the office changes hands, the power never does, and every future election is a choice between the incumbent and the incumbent's glove. floor: [voice] - id: DA-211 title: "Elastic reading of an open-ended delegation clause" taxonomy: primary: definitional_ambiguity secondary: [faction_capture] severity: high precedent: name: "'Necessary and proper' elasticity (McCulloch v. Maryland lineage)" summary: > Open-textured grants ('and such other powers as are necessary') expand monotonically in the hands of whoever exercises them, because each stretched reading becomes the floor for the next. Without a construction rule, ambiguity always resolves toward power. actors: - id: operations_delegate role: delegate bloc_size: 1 objective: entrench_power - id: loyal_bloc role: members bloc_size: 51 objective: support_delegate - id: opposition_bloc role: members bloc_size: 48 objective: defend_baseline resources: treasury: 80000 membership: 100 moves: - {step: 1, actor: operations_delegate, action: interpret_term, args: {term: "operations", interpretation: "anything affecting the pool's functioning, including membership and vote scheduling"}} - {step: 2, actor: operations_delegate, action: schedule_vote, args: {proposal: parameter_change_1, notice_days: 7, authorization: operations_mandate}} - {step: 3, actor: operations_delegate, action: set_parameter, args: {path: membership.admission_review_days, value: 90, via: operations_mandate}} attack_succeeds_if: - "powers_exercised_beyond_enumerated_grant >= 1" expected: verdict: blocked blocking_provisions: - kernel.article_08.enumerated_delegations - kernel.article_10.adverse_interpretation_rule rationale: > Delegations must be enumerated positive lists with everything else reserved to the full membership, and Article 10's adverse- interpretation rule must apply: where a grant of power is ambiguous, it is construed against the power-holder. The elastic clause is thereby inverted — ambiguity shrinks power instead of growing it. empathy: worst_off: opposition_bloc harm_if_exploited: > A logistics role quietly becomes a gatekeeper of membership and votes; members who delegated calendar management discover they delegated the polity, one reasonable-sounding reading at a time. floor: [voice, due_process] - id: DA-212 title: "Conflicting provisions with no precedence rule" taxonomy: primary: definitional_ambiguity secondary: [procedural_deadlock] severity: high precedent: name: "Lex specialis / lex posterior conflicts" summary: > Legal systems need explicit conflict-of-laws rules because real texts contradict themselves; absent a precedence rule, each party enforces its favored provision and the dispute becomes a raw power contest dressed as interpretation. actors: - id: steward role: steward bloc_size: 1 objective: entrench_power - id: faction_a role: members bloc_size: 50 objective: support_steward - id: faction_b role: members bloc_size: 49 objective: defend_baseline resources: treasury: 60000 membership: 100 moves: - {step: 1, actor: faction_b, action: propose_amendment, args: {target: parameters.voting.quorum_fraction, change: "raise to 0.40"}} - {step: 2, actor: steward, action: interpret_term, args: {term: "provision conflict", interpretation: "Article 4 quorum text controls over the parameters file; proposal is out of order"}} - {step: 3, actor: faction_b, action: interpret_term, args: {term: "provision conflict", interpretation: "parameters file controls; proposal proceeds"}} - {step: 4, actor: steward, action: table, args: {proposal: 1, grounds: "unresolved textual conflict"}} attack_succeeds_if: - "proposal_blocked_by_unresolved_conflict == true" - "no_deterministic_precedence_path == true" expected: verdict: blocked blocking_provisions: - kernel.article_10.precedence_ladder - kernel.article_10.conflict_forces_amendment rationale: > Article 10 must fix a total precedence order (invariants > kernel articles > parameters > module text > prior interpretations) and require that any detected conflict auto-opens a mandatory reconciliation amendment with a deadline — conflicts become work items, never vetoes. empathy: worst_off: faction_b harm_if_exploited: > The forty-nine members following the written process lose to a contradiction they didn't write and can't fix, while the steward gets a permanent pocket veto labeled 'textual humility'. floor: [voice] - id: DA-213 title: "Retroactivity ambiguity: new rules applied to pending proposals" taxonomy: primary: definitional_ambiguity secondary: [procedural_deadlock] severity: high precedent: name: "Ex post facto principles / grandfather-clause disputes" summary: > When a rule change is silent about pending matters, whoever controls sequencing decides retroactivity case by case — raising the bar for opponents' pending proposals and lowering it for allies'. The ambiguity converts procedure into a targeting system. actors: - id: steward role: steward bloc_size: 1 objective: suppress_faction - id: loyal_bloc role: members bloc_size: 55 objective: support_steward - id: opposition_bloc role: members bloc_size: 44 objective: defend_baseline resources: treasury: 70000 membership: 100 moves: - {step: 1, actor: opposition_bloc, action: propose_amendment, args: {target: parameters.roles.term_days, change: "shorten steward term"}} - {step: 2, actor: loyal_bloc, action: propose_amendment, args: {target: parameters.voting.proposal_sponsor_minimum, change: "raise to 20 sponsors"}} - {step: 3, actor: loyal_bloc, action: vote, args: {proposal: 2, choice: yes}} - {step: 4, actor: steward, action: interpret_term, args: {term: "applicability", interpretation: "new sponsor minimum applies to all proposals not yet voted"}} - {step: 5, actor: steward, action: table, args: {proposal: 1, grounds: "insufficient sponsors under current rule"}} attack_succeeds_if: - "rule_change_applied_to_pending_proposal == true" - "retroactivity_determined_by_interested_party == true" expected: verdict: blocked blocking_provisions: - kernel.invariant_I2 - kernel.article_02.pipeline_rule_freeze rationale: > Invariant I2 (no retroactive rule changes) must be operationalized: every proposal is processed under the rules in force at its submission timestamp, frozen for that proposal's lifetime. Rule changes apply prospectively to proposals submitted after ratification, with no discretionary applicability calls. empathy: worst_off: opposition_bloc harm_if_exploited: > A proposal filed in full compliance is killed by a rule that didn't exist when it was filed, chosen and timed by its target's opponent; the lesson members learn is that filing first is filing exposed. floor: [voice, due_process]