Skip to content
>GLB_
Go back

CCLF is not eligibility: where dual status gets lost in Medicare ACO data

If you work with Medicare Shared Savings Program (MSSP) data, you get two families of files from CMS: CCLF (claims and beneficiary demographics, monthly) and ALR (Assignment List Reports, quarterly). The usual advice is correct: CCLF does not tell you who is assigned to your ACO. The ALR does.

What I didn’t see written anywhere is the next question: the ALR tells you who is in. Which source tells you what attributes they have?

This post walks through one attribute, dual eligibility status, in the open-source Tuva Project connectors. It shows how a reasonable-looking coalesce plus a “latest month” rule can turn full-dual beneficiaries into non-duals in the risk model, without any test or flag going off.


Why dual status matters

In the CMS-HCC model, the community segment a beneficiary falls into depends on dual status (full, partial, or non-dual) together with age and disability. Different segment, different coefficients, different RAF. Classifying a full dual as non-dual changes the risk score of that member.

In Tuva’s cms_hcc package, the mapping looks like this:

case
    when dual_status_code in ('02', '04', '08') then 'Full'
    when dual_status_code in ('01', '03', '05', '06') then 'Partial'
    else 'Non'
end as dual_status

That’s a lookup on a categorical code. Keep that in mind.


Two sources, two different fields

FieldSourceWhat it isExample
BENE_DUAL_STUS_CDCCLF8 (beneficiary demographics)Categorical dual status code02
BENE_PSNYRS_DUALALR table 1 (assigned beneficiaries)Dual-eligible person-years fraction0.4166666667

Both have “dual” in the name. Only one is a code.

Tuva’s own docs agree on where dual status comes from: the Medicare CCLF Connector page lists dual eligibility status as one of the attributes in beneficiary_demographics. The ALR connector README describes bene_psnyrs_dual as a person-years fraction, keeps it at numeric(38,10) and pins that precision with a unit test.


Issue 1: coalescing a fraction with a code

With cms_alr_connector: true, the CCLF connector builds dual_status_code like this (eligibility.sql#L215):

cast(coalesce(
    latest_span_record.bene_psnyrs_dual,   -- ALR, numeric fraction
    latest_span_record.bene_dual_stus_cd   -- CCLF8, categorical code
) as string) as dual_status_code

Synthetic example:

memberbene_psnyrs_dual (ALR)bene_dual_stus_cd (CCLF8)dual_status_codecms_hcc reads
m11.0000000000021.0000000000Non
m20.4166666667040.4166666667Non
m3null0202Full

m1 was dual for the whole year and has a full-dual code in CCLF8. It ends up non-dual.

Without the ALR connector, the other branch of the same model uses bene_dual_stus_cd directly, so the mapping is correct there. The issue is specific to the ALR + CCLF combination, which is the setup the docs recommend for MSSP.


Issue 2: latest month of the span

Eligibility spans are built by grouping consecutive months with the same eligibility_flag and data_sharing_flag. For each span, the connector keeps one row: the latest coverage_month.

membermonthbene_dual_stus_cd
m42026-0102
m42026-0202
m42026-03null

The span gets the March row, so dual_status_code is null, and cms_hcc maps it to Non. Two months of valid information discarded.


Why nothing catches it

cms_hcc has a flag for this situation, medicaid_dual_status_default. It is set only when dual_status_code is null:

The Input Layer contract does define the valid values (00–10) and says a missing value defaults to non-dual in CMS-HCC. There is also a terminology seed, terminology__medicare_dual_eligibility. But I didn’t find any test that checks dual_status_code against it.


Eligibility authority ≠ attribute authority

The maintainers’ position, paraphrased: CCLF8 is not eligibility. The ALR is the source of truth for whether a member is eligible, and since ALRs are quarterly and delayed, the connector carries the latest ALR status forward. CCLF8 elements could be integrated where available.

That’s correct for eligibility, and the connector implements it carefully: inferred_eligibility_flag extends the latest ALR using CCLF8’s bene_entlmt_buyin_ind only for members active in the latest ALR month.

But “the ALR decides who is eligible” doesn’t imply “every attribute should come from the ALR”. Eligibility has an authoritative source. Dual status has another one. And a person-years fraction isn’t a status code, whatever file it comes from.


Options

None of these are mine to decide. They’re the alternatives I’d put on the table:

  1. Use a categorical source for dual_status_code. Either CCLF8 bene_dual_stus_cd, or ALR table 9 BENE_DUAL_STATUS if CMS defines it with a compatible value set (to verify against the ALR data dictionary). Keep bene_psnyrs_dual as an extension column.
  2. Latest non-null within the span instead of the latest row.
  3. Test the value set: an accepted_values or relationships test against terminology__medicare_dual_eligibility.
  4. Widen the default flag: set medicaid_dual_status_default when the code is null or not in the valid set.

What Tuva said


Takeaway

The Tuva blog post Understanding Medicare ACO Assignment explains why CCLF alone can’t define your population. This is the next layer of the same problem: once the ALR has decided who is in, every attribute still needs its own answer to “which source is the truth, and what does this field actually mean?”

Technical lineage says dual_status_code comes from latest_span_record. Semantic lineage asks whether that value is still a dual status code by the time cms_hcc reads it.


References

Tuva Project — docs

Tuva Project — code (pinned commits)

Tuva Project — blog

CMS


Share this post:

Related Posts


Previous Post
AWS Glue Job Fails Due to Dependency Version Conflict: How to Fix It
Next Post
COALESCE doesn't care what your columns mean