# Proof-Chain Fixture Scaffold

**Status:** ADR-0202 grammar filled; not wired into the live suite  
**Scope:** data-only fixture scaffold; not wired into the live test suite

This directory is the independent validation scaffold for the propositional
canonicalizer and first `modus_ponens` proof-chain rule. The formula grammar,
atom declaration shape, and atom-to-FeatureBundle binding convention are governed
by `docs/decisions/ADR-0202-proposition-representation-contract.md`.

The fixture inventory in `propositional_cases.json` records concrete formula
strings, per-case `atoms` blocks, expected behaviors, and rationale. It is ready
for a future proof-chain harness to wire, but it is intentionally not part of the
live test suite yet.

## Atom Bindings

Where a case atom maps to a recognizable fact, the atom records the intended
ADR-0144/ADR-0143 `FeatureBundle` binding as `binding.features`. The corpus does
not author `EpistemicNode.node_id`; that is assigned at recognition time.
Schematic budget atoms use `binding: null`.

## Validation Boundaries

The three `modus_ponens` cases are validated at entailment only. Their typed rule
reasons (`conclusion_mismatch` / `missing_implication`) are marked pending phase
2.3 / ADR-0205, when the rule checker lands.

`modus_ponens_cases.json` is the independent 24-case adversarial MP corpus
authored against the ADR-0202/ADR-0205 contract. It was not authored by validating
against the implementation. After ADR-0205 landed, reconciliation cross-checked
24/24 on outcome and reason against the real rule at merge `b304270`. Reason
labels are consolidated to ADR-0205's five closed reasons:
`unique_canonical_conclusion`, `missing_implication`,
`unestablished_antecedent`, `conclusion_mismatch`, and
`conclusion_disagreement`.

The two out-of-regime cases assert `out_of_decidable_regime` and record that this
is the `LogicRegimeError` reason produced by merged main after ADR-0201.1.

## Required Categories

- `equivalent_key`: propositions that must reduce to identical canonical keys.
- `different_key`: near-miss propositions that must not collapse.
- `tautology_or_contradiction`: formulas that reduce to TRUE/FALSE leaves.
- `modus_ponens`: proof-chain admission and refusal examples.
- `acyclicity`: circular dependency refusal cases.
- `out_of_regime`: quantified or predicate input outside propositional logic.
- `budget`: scalable ROBDD blowup cases that must refuse when over budget.

## Interface Assumptions

- Formula grammar: ADR-0202 section 1.
- Atom declaration and FeatureBundle binding: ADR-0202 section 2.
- TRUE/FALSE leaf identity: `T` / `F`.
- Budget refusal reason: `canonicalization_budget_exceeded`.
- Proof-chain rule and DAG fields are fixture data only until `proof_chain`
  lands.

## Non-Goals

- No runtime wiring.
- No second canonicalizer implementation.
- No CNF/DNF fallback expectations.
- No predicate-logic equivalence claim.
- No repo capability claim.
