# Corpus Audit Report — Milestone 3 Final Generated against the scenario corpus in `scenarios/` and the constitutional parameters in `constitution/parameters.yaml`. **Regenerate after any corpus change:** ```bash python -m fabletest audit --corpus scenarios --params constitution/parameters.yaml --report docs/audit-report.md ``` CI runs the same audit on every pull request (`.github/workflows/constitutional-tests.yml`); a stale report fails the consistency check in `tests/test_consistency.py`. ## Corpus statistics | Family | Scenarios | Files | Coverage notes | |---|---|---|---| | faction-capture | 28 | `faction-capture.yaml`, `faction-capture-v2.yaml` | entrenchment, vote-buying, committee capture, delegate slates | | treasury-drain | 28 | `treasury-drain.yaml`, `treasury-drain-v2.yaml` | direct drains, laundered grants, stipend abuse, floor probes | | quorum-manipulation | 28 | `quorum-manipulation.yaml`, `quorum-manipulation-v2.yaml` | denominator games, scheduling, absence cartels, notice abuse | | emergency-ratchet | 28 | `emergency-ratchet.yaml`, `emergency-ratchet-v2.yaml` | scope creep, renewal spirals, manufactured triggers, sunset evasion | | definitional-ambiguity | 28 | `definitional-ambiguity.yaml`, `definitional-ambiguity-v2.yaml` | term capture, interpretation overreach, semver misclassification | | minority-suppression | 28 | `minority-suppression.yaml`, `minority-suppression-v2.yaml` | franchise gating, expulsion abuse, exit-cost weaponization | | procedural-deadlock | 28 | `procedural-deadlock.yaml`, `procedural-deadlock-v2.yaml` | filibuster economics, docket flooding, deadlock-as-asset | | composite | 12 | `composite-attacks.yaml` | cross-family chains; see matrix below | | **Total** | **208** | 15 files | floor: 200 (`tests/test_corpus.py::test_corpus_size_floor`) | ## Quality gates (all enforced by `tests/test_corpus.py`) | Gate | Status | |---|---| | Corpus size ≥ 200 | ✅ 208 | | Each base family ≥ 20 scenarios | ✅ all at 28 | | Composite family ≥ 12 scenarios | ✅ 12 | | Globally unique scenario IDs | ✅ | | Precedent documented (≥ 80 chars, historical or game-theoretic) | ✅ 208/208 | | Empathy block present, worst-off identified, floors in [0,1] | ✅ 208/208 | | `floor_if_blocked > floor_if_exploited` for every blocked scenario | ✅ | | Every move references a declared actor | ✅ | | Expected verdict + enumerated textual defenses on every scenario | ✅ | | Engine verdict matches expected verdict for all 208 | ✅ (behavioral regression) | | Worst-off floor holds under engine evaluation | ✅ | ## Composite cross-family matrix Each composite scenario chains ≥ 2 base families; collectively the twelve exercise **all seven** (`test_composite_set_covers_all_base_families`). | ID | Title (short) | Families combined | |---|---|---| | CX-001 | Reichstag Drawdown | emergency-ratchet + treasury-drain | | CX-002 | Midnight Quorum Coup | quorum-manipulation + faction-capture | | CX-003 | Good-Standing Gate | definitional-ambiguity + minority-suppression + quorum-manipulation | | CX-004 | Manufactured Deadlock Trigger | procedural-deadlock + emergency-ratchet | | CX-005 | Patronage Flywheel | treasury-drain + faction-capture | | CX-006 | Semver Salami | definitional-ambiguity + faction-capture | | CX-007 | Arbiter Stacking | faction-capture + quorum-manipulation | | CX-008 | Exit Tax Ambush | minority-suppression + treasury-drain + definitional-ambiguity | | CX-009 | Perpetual Renewal Spiral | emergency-ratchet + quorum-manipulation | | CX-010 | Runaway Convention | procedural-deadlock + faction-capture | | CX-011 | Sybil Citizenship Mill | definitional-ambiguity + quorum-manipulation + treasury-drain | | CX-012 | Censure Cascade | minority-suppression + faction-capture + procedural-deadlock | Family appearance counts across composites: faction-capture ×6, quorum-manipulation ×5, definitional-ambiguity ×4, treasury-drain ×4, minority-suppression ×3, emergency-ratchet ×3, procedural-deadlock ×3. ## Empathy metric summary Every scenario is scored first on the worst-off cohort (maximin welfare, 0–1 scale; see `docs/empathy-metric.md`). - Mean `floor_if_blocked` across the corpus: **0.87** — the defenses, when they hold, keep the worst-off participant near baseline welfare. - Mean `floor_if_exploited`: **0.17** — what the corpus exists to prevent. - Lowest exploited floor in the composite set: **0.04** (CX-012, Censure Cascade) — serial expulsion compounds loss of membership, voice, stake, and recourse; this is the corpus's canonical worst case. - Largest single protection delta: **0.83** (CX-003, Good-Standing Gate). ## Severity distribution (composite set) critical: 9 · high: 3. Composite attacks skew critical by construction: chained families are how real captures happen — no historical capture in the precedent set used a single attack family in isolation. ## Defense citation frequency (top hooks the corpus depends on) The most load-bearing textual defenses across all 208 scenarios, i.e. the clauses where an amendment is most likely to silently re-arm an attack: 1. `kernel.art2.semver-major` — semantic (not diff-location) classification 2. `kernel.art3.absolute-denominator` — thresholds over total membership 3. `invariant.due-process` — notice, hearing, suspensive review 4. `kernel.art5.sunset` / `kernel.art5.escalating-renewal` 5. `invariant.treasury-floor` + `kernel.art4.disbursement-cap` 6. `invariant.exit-right` + `kernel.art7.fee-cap` 7. `harness.cumulative-diff-rule` — composition-aware semver (CX-006) Amendments touching any of these must expect broad corpus failures; that is the design working as intended. See `docs/runbook.md` §"When a defense clause changes" before proposing such amendments. ## Known gaps / future corpus work (out of scope for this milestone) - Cross-jurisdiction attacks (parent/child constitution interactions) — blocked on the federation design slated for a later milestone. - Timing attacks below epoch resolution — the engine models discrete epochs; sub-epoch race conditions are not yet expressible in the DSL. - Collusion among interpretation-body members *and* sortition-pool poisoning combined — single-stage versions exist (CX-007, CX-011); the combined form needs the richer identity model planned for milestone 4's self-play agents, which will generate it organically.