Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.encoreos.io/llms.txt

Use this file to discover all available pages before exploring further.

ADR-015: PM Refund / Recoupment / Takeback Path — Lite-First with PM-53 Umbrella

Status: Accepted Date: 2026-04-20 Participants: PM Core Owner, FA Core Owner, module-strategic-reviewer (deep-review pass)

Context

The PM core has three overlapping spec drafts covering refund and payer-overpayment workflows, all created on 2026-04-17 as part of PR #108:
  • PM-53-refund-recoupment-takeback-management.md — FULL spec (umbrella)
  • PM-09-EN-11-refund-workflow.md — LITE (patient overpayment refunds)
  • PM-09-EN-15-payer-overpayment-takeback.md — LITE (payer-side 835 takebacks / overpayments)
The 2026-04-19 deep review (pm-deep-review-20260419.md Cluster D-1) identified this as an intentional umbrella ↔ lite scoping decision that needs a recorded path choice before any of the three enters generate-tasks. Without an explicit decision, parallel teams could end up implementing both the umbrella and the lites, duplicating tables (pm_refunds, pm_payer_takebacks) and event publishers (payment_refund_issued). Cross-core impact:
  • FA consumes a payment_refund_issued event on the cash-receipts side (fa-consume-pm-payment-events Edge Function, per IG-2).
  • PM-44 (Automated ERA Reconciliation) detects payer takebacks in incoming 835s and is the upstream signal for PM-09-EN-15.
  • PM-26 (Audit Trail) must capture every refund/takeback transition for HIPAA §164.316(b) retention.
The team needs:
  1. Measurable revenue protection in 1–2 sprints (HFMA cites 3–7% net revenue at risk from underpayments + improperly handled takebacks).
  2. A coherent state machine across patient refunds and payer takebacks (so the same pm_refunds lifecycle handles both sources).
  3. A single point where the FA event is published (avoid two competing event contracts).

Options Considered

Option A: Ship PM-53 as a single FULL spec; mark both lites Cancelled

  • How it works: PM-53 alone covers the unified state machine, both data flows, and the FA event contract. Lites archived as 🗂️ Cancelled — superseded by PM-53.
  • Pros: Cleanest single-spec narrative; one PR for the umbrella.
  • Cons: Slower to ship (full FULL-template scope is 4–6 sprints). Defers measurable revenue protection. PR-review surface is large; reviewer fatigue likely.
  • Why not chosen: Time-to-revenue-protection matters; HFMA gap is real today.

Option B: Ship two LITE specs (PM-09-EN-11, PM-09-EN-15) as independent deliverables; archive PM-53

  • How it works: Each lite ships its own table + state machine + FA event independently. PM-53 archived.
  • Pros: Two parallel teams; fastest to MVP.
  • Cons: Duplicate state-machine code; two competing FA event payloads (payment_refund_issued from EN-11 vs. payer_takeback_received from EN-15) — FA consumer would need to handle both, which contradicts the “one event per business fact” principle from EVENT_CONTRACTS.md. Risks divergence on pm_refunds table schema if both lites independently model it.
  • Why not chosen: Cross-core event proliferation + table-design divergence is exactly the problem the umbrella was meant to solve.

Option C: Adopt PM-53 as the umbrella plan; ship the two lites as Phase A and Phase B inside the umbrella ✓

  • How it works:
    • PM-53 status → 🗂️ Umbrella plan (not 📋 Specification). Its scope section lists Phase A and Phase B; it defines the unified pm_refunds table, the state machine, and the single payment_refund_issued FA event contract.
    • PM-09-EN-11 (Phase A) implements patient-overpayment refunds against the PM-53-defined pm_refunds table. Target: 2026-Q3.
    • PM-09-EN-15 (Phase B) extends the same pm_refunds table with the payer_takeback source enum value and adds 835 takeback ingest. Target: 2026-Q4.
    • The FA event publisher lives in a shared hook (useIssueRefund) that both lites consume.
  • Pros: Time-to-revenue-protection in 1 sprint (Phase A); shared schema and event contract by design; reviewer surface stays small per PR; PM-53 acts as the architectural reference for both Phase implementers.
  • Cons: PM-53 scope section needs careful editing to make clear it is “umbrella plan” not “implementation spec”; risk of Phase B drifting from PM-53’s contract if reviewers are not vigilant.
  • Why chosen: Best balance of time-to-value, cross-core event-contract hygiene, and reviewer-load distribution.

Decision

Adopt Option C — PM-53 becomes the umbrella plan; PM-09-EN-11 and PM-09-EN-15 become Phase A and Phase B implementations against the PM-53-defined contract.

Concrete actions

  1. PM-53 spec edits (Wave 0 follow-up):
    • Header status: 📋 Specification🗂️ Umbrella plan
    • Add prominent block: “This is an architectural umbrella. The actual implementation lives in PM-09-EN-11 (Phase A) and PM-09-EN-15 (Phase B). PM-53 owns the unified state machine, the pm_refunds table contract, and the payment_refund_issued FA event.”
    • Move generate-tasks references out of PM-53; re-target to the two lites.
  2. PM-09-EN-11 spec edits:
    • Add “Phase A of PM-53 umbrella” reference in header.
    • Constrain DDL to the columns required for patient-overpayment source.
    • Use the pm_refunds.source enum value 'patient_overpayment'.
  3. PM-09-EN-15 spec edits:
    • Add “Phase B of PM-53 umbrella” reference in header.
    • Constrain DDL to ALTER (add columns if needed) — must not redefine pm_refunds.
    • Use the pm_refunds.source enum value 'payer_takeback'.
  4. FA-side coordination:
    • Confirm FA owner accepts the unified payment_refund_issued event payload (with source discriminator field) before Phase A generate-tasks.
    • Add row to docs/architecture/integrations/EVENT_CONTRACTS.md for the unified event.
  5. PR sequencing:
    • PR-1: PM-53 header + scope edits (this ADR + Wave 0 commit).
    • PR-2: PM-09-EN-11 spec-review → generate-tasks.
    • PR-3: PM-09-EN-15 spec-review → generate-tasks (after Phase A ships).

Consequences

Positive

  • Phase A revenue protection in 1 sprint.
  • Single FA event contract; FA consumer Edge Function written once.
  • Unified state machine reduces future maintenance.
  • PR-review load distributed across 3 reviewable PRs instead of one mega-PR.
  • PM-53 remains the architectural reference document.

Negative

  • Three artifacts (PM-53 + 2 lites) must stay in sync; risk of drift if Phase B reviewer doesn’t cross-check PM-53.
  • “Umbrella plan” is a non-standard status — must be documented in SPEC_GUIDE.md as a recognised type.
  • Adds one extra spec-review pass (PM-53 itself, even though no implementation comes from it).

Neutral

  • PM-37 (Self-Pay AR Ledger) remains adjacent — it consumes the pm_refunds rows for patient-account display but does not own the lifecycle.

Compliance

  • Constitution §1.1 (PF-only dependency): Umbrella → 2 lites pattern stays within PM core; FA event contract stays within the canonical Platform Integration Layer per ADR-002.
  • Constitution §5.2.7 (cross-core FK): No new cross-core FK introduced; pm_refunds.original_payment_id references pm_payments.id (intra-core).
  • HIPAA §164.316(b): PM-26 audit captures every pm_refunds state transition (already in scope per existing PM-26 patterns).
  • specs/pm/specs/PM-53-refund-recoupment-takeback-management.md
  • specs/pm/specs/PM-09-EN-11-refund-workflow.md
  • specs/pm/specs/PM-09-EN-15-payer-overpayment-takeback.md
  • specs/pm/IMPLEMENTATION_LOG.md Decision Log 2026-04-20
  • specs/pm/plans/PM-SPEC-AUTHORING-PLAN-20260419.md Wave 0 W0-4
  • specs/pm/reports/pm-deep-review-20260419.md Cluster D-1
  • docs/architecture/decisions/ADR-002-cl-pm-cross-core-foreign-keys.md (cross-core FK precedent)

Review

Reviewers: PM Core Owner, FA Core Owner, Architecture Validator (auto) Approval date: 2026-04-20
Authored as part of PM-SPEC-AUTHORING-PLAN-20260419 v1.1 Wave 0 (W0-4-ADR).