feat(canopy-enrollment): wire overpayment recovery pipeline (currently log-only)

Context

The appeal.overpayment_assessed event handler at services/canopy-enrollment/src/main.rs:154-156 only emits a tracing::info!:

// For now, log the event — full recovery pipeline is post-UAT.

No claim row, no recovery hook, no offset against future issuances, no claims-database integration. The "post-UAT" promise is anchored only to this comment — not to any plan or roadmap row.

Acceptance criteria

  • Claims-database table for overpayments + recovery state (forward-only migration per ADR-016)
  • On appeal.overpayment_assessed: persist a claim row with original determination, amount, fault classification (IPV / agency error / inadvertent household error)
  • Issuance pipeline checks active claims and offsets per FNS overpayment recovery rules (7 CFR 273.18 for SNAP)
  • Recovery cap respects 10% / $10 minimum per program rules
  • Integration test covering at least the SNAP IHE recovery path
  • CHANGELOG entry under Added

Surfaced by

Multi-agent plan-vs-code audit, 2026-05-05.