COB and dual-eligibility on member detail
Outcome
You can preview the COB waterfall and Medicare MSP classification for a member from the UI without writing data, and explain to a customer how the secondary chain would resolve before submitting a real claim.
Prerequisites
eligibility.readscope (the same scope that gates/coverage/priority).- Member with multiple coverage policies on file.
What's available
The Member detail page surfaces two read-only views backed by RM-11's COB engine:
| View | Endpoint | What it shows |
|---|---|---|
| Coverage policies (enriched) | GET /api/v1/cob/members/:memberId/policies?asOfDate=YYYY-MM-DD | Coverage rows joined to rcm_master.payer. Meta envelope carries isDualEligible, hasMedicare, hasMedicaid, Medicare entitlement reason. |
| Simulate waterfall | POST /api/v1/cob/simulate-waterfall | Calls findSecondaryCoverages (MSP-aware). Optional deniedCarcCodes runs checkMedicaidLastResort per Medicaid secondary. |
Both routes are gated by eligibility.read.
What "dual-eligible" means
A member is flagged dual-eligible when they carry at least one MEDICARE
policy and at least one MEDICAID_FFS or MEDICAID_MCO policy, both
active on the requested asOfDate.
The badge appears in the member detail summary bar and is decorated with the Medicare entitlement reason (AGE / ESRD / DISABILITY / BLACK_LUNG) when one is recorded on the Medicare row.
Validate MSP behaviour from the UI
Open a dual-eligible member.
Coverage tab → Simulate Waterfall.
Pick Medicare as primary, set service dates inside the EGHP's effective range, leave CARCs empty. Click Run simulation.
Expect: when the EGHP qualifies (e.g. employer ≥ 20 for working-aged, or ESRD inside the 30-month coordination window), the EGHP surfaces in the preview before any Medicaid entry.
Add CARC
96to Primary CARC codes and re-run.Expect: the Medicaid row's "Last resort" pill flips to a red blocked indicator with reason
medicaid-last-resort: CARC 96 (federal)sourced fromrcm_reference.medicaid_non_covered_carc.
Validation
| Check | Expected |
|---|---|
isDualEligible flag on policies response | true for members with both MEDICARE + MEDICAID coverage |
| EGHP surfaces ahead of Medicaid when MSP rules say so | Yes |
Medicaid blocked indicator on CARC 96 | Reason includes medicaid-last-resort |
Lapsed coverage on asOfDate | Hidden from response |
Gotchas
- Preview only. The drawer never writes to
billing.claimorbilling.claim_relationship. The real waterfall runs inprocessSecondaryClaimWaterfallafter a primary 835 posts. Treat the preview as a what-if explorer — its output is not idempotency-keyed and is not audited. asOfDatematters. The policies endpoint filterscoverage_policybyeffective_from <= asOfDate <= coalesce(effective_to, ∞). A coverage that lapsed yesterday won't appear today, even thoughis_active = true.- Primary not on member. If you pick a primary payer the member
doesn't carry, the simulator returns
primary: nulland a note explaining why. Intentional —findSecondaryCoveragesshort-circuits on a missing primary.
Schema reference
| Column | Notes |
|---|---|
coverage_policy.priority_order | 1 = primary, 2 = secondary, etc. |
coverage_policy.is_active | Hard gate; deactivated rows are hidden by the UI. |
coverage_policy.coverage_status | Free-form; surfaced as the "Status" cell. |
coverage_policy.medicare_entitlement_reason | Drives the dual-eligible chip's (reason) suffix. |
rcm_master.payer.name / payer_type / state | Joined via payerName / payerType / payerState. |
rcm_reference.medicaid_non_covered_carc | Federal seed includes 26 / 27 / 96 / 204 / 256. |
Cross-references
- Payer priority & Medicaid-last-resort for the actual production guard.
- Tertiary waterfall for the live auto-trigger after a real 835.