Skip to content

Reconstruct gross CHIP per-capita value for premium netting#8094

Merged
MaxGhenis merged 3 commits intomainfrom
chip-gross-reconstruction
Apr 19, 2026
Merged

Reconstruct gross CHIP per-capita value for premium netting#8094
MaxGhenis merged 3 commits intomainfrom
chip-gross-reconstruction

Conversation

@MaxGhenis
Copy link
Copy Markdown
Contributor

Prerequisite for cliff-watch CHIP premium handling and for #8089's MOOP architecture.

Problem

per_capita_chip is sourced from MACPAC Exhibit 33 "CHIP Spending by State". MACPAC aggregates net CHIP expenditures — specifically, federal + state shares equal gross expenditures minus the "Premiums: Cost Sharing Offset" lines on CMS-21 (the form states file quarterly). So per_capita_chip already has household premium revenue netted out.

Consumers that track chip_premium separately as a household-paid cost (e.g. the in-flight cliff calculator, SPM-style MOOP accounting) would double-count if they subtracted chip_premium on top of a chip value that already netted it.

Fix

Add CMS-21 cost-sharing offset figures as calibration parameters and expose a gross counterpart:

  • parameters/calibration/gov/hhs/cms/chip/cost_sharing_offsets/separate_chip.yaml — FY2024 family-paid collections by state, separate-CHIP sheet
  • parameters/calibration/gov/hhs/cms/chip/cost_sharing_offsets/medicaid_expansion_chip.yaml — zeros placeholder for M-CHIP states (CT, DE, MA, MI, NY) pending a second-pass parse of the M-CHIP sheets
  • parameters/calibration/gov/hhs/cms/chip/cost_sharing_offsets/total.yaml — sum (currently equals separate_chip until M-CHIP lands)
  • per_capita_chip_gross — per-enrollee gross = net spending + offset, divided by enrollment
  • chip_gross — person-level sum, counterpart to existing chip

Data notes

  • Top charging states (FY2024 separate-CHIP): FL $19.9M, MO $12.7M, WA $9.6M, AL $5.5M, KS $4.7M, TX $2.8M, IA $2.7M.
  • National total ~$63M/yr from separate CHIP (FY2024).
  • M-CHIP placeholder: 5 states (CT, DE, MA, MI, NY) run CHIP as M-CHIP and file their premium collections on the M-CHIP CMS-21 sheets, not the separate-CHIP sheets. Zeros here now, to be filled by a follow-up PR that reads from FY 2024 FMR CHIP NET EXPENDITURES.xlsx M-CHIP tabs. NY Child Health Plus especially should have substantial revenue.
  • States with premium schedules but zero FY2024 collections (AZ, IL, CA M-CHIP, GA through Sept 2024, UT after July 2024): pandemic suspensions / program transitions / recent eliminations. Noted in description.

Source

CMS Medicaid Financial Management Report — FY 2024 CHIP Net Expenditures Excel workbook: https://www.medicaid.gov/medicaid/financial-management/state-expenditure-reporting-for-medicaid-chip/expenditure-reports-mbescbes

CMS-21 form layout (cost-sharing offset lines): https://www.medicaid.gov/medicaid-chip-program-information/by-topics/data-and-systems/downloads/collection-systems/chip-cms21-expenditure-forms.pdf

Testing

3/3 new tests pass. 57/57 CHIP tests pass. make format / ruff check clean.

Test plan

  • Tests pass locally
  • Format / lint clean
  • CI passes

MACPAC Exhibit 33 "CHIP Spending by State" reports federal + state
shares of net-of-cost-sharing CHIP expenditures (gross expenditures
minus CMS-21 offsetting collections). Because MACPAC is the source of
PolicyEngine's per-enrollee CHIP value, `per_capita_chip` already has
household premium revenue netted out.

For consumers that track household-paid CHIP premiums separately (e.g.
cliff calculators that show a per-tier premium cliff against the gross
benefit received), naively subtracting `chip_premium` double-counts.

Adds:
- `cost_sharing_offsets/separate_chip.yaml` — CMS-21 FY2024 family-paid
  collections by state on the separate-CHIP sheets
- `cost_sharing_offsets/medicaid_expansion_chip.yaml` — placeholder for
  M-CHIP state figures (Connecticut, Delaware, Massachusetts, Michigan,
  New York), populated in a follow-up as M-CHIP sheets are parsed
- `cost_sharing_offsets/total.yaml` — sum used by the derived variables
- `per_capita_chip_gross` — per-enrollee gross value = net + offsets
- `chip_gross` — person-level analog to `chip`

Data source: CMS Medicaid Financial Management Report FY 2024 CHIP Net
Expenditures (https://www.medicaid.gov/medicaid/financial-management/state-expenditure-reporting-for-medicaid-chip/expenditure-reports-mbescbes).
@codecov
Copy link
Copy Markdown

codecov bot commented Apr 19, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (05d5d97) to head (745af58).
⚠️ Report is 32 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##              main     #8094    +/-   ##
==========================================
  Coverage   100.00%   100.00%            
==========================================
  Files           18         2    -16     
  Lines          353        32   -321     
  Branches         4         0     -4     
==========================================
- Hits           353        32   -321     
Flag Coverage Δ
unittests 100.00% <100.00%> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

M-CHIP sheet research confirmed the 5 Medicaid-expansion / combination
CHIP states (CT, DE, MA, MI, NY) do not report premium revenue on
CMS-21 Cost Sharing Offset lines. They do report it on Line 49
Less Collection on the Separate CHIP sheets. Line 49 can also include
third-party liability recoveries, so it is a proxy rather than a pure
premium figure; documented in the description.

FY2024 values (Separate CHIP sheet, absolute dollars):
- CT: $1.82M (HUSKY B premiums)
- DE: $0.14M (appears under-reported versus Delaware's $15/$25 monthly schedule)
- MA: $10.86M (CommonHealth + Family Assistance premiums)
- MI: $5.51M (MIChild $10/mo premiums)
- NY: $9.04M (Child Health Plus premiums; FY2023 had a $99M one-time
  entry inconsistent with steady premium flow)
MaxGhenis added a commit to PolicyEngine/cliff-watch that referenced this pull request Apr 19, 2026
… household cost

Restructures the repo as a proper installable Python package:
- `cliff_watch/` (was `scripts/`) with `__init__.py` exporting the
  public API; dev_api_server renamed to `dev_server`.
- `pyproject.toml` with hatchling build + pytest, ruff, coverage
  dev extras. `cliff-watch-dev-server` console script entry point.
- `examples/sample_household.json` (was `scripts/sample_household.json`).
- `api/_shared.py` imports repointed from `scripts.*` to `cliff_watch.*`.
- `tests/` with `pytest.importorskip("policyengine_us")` + a
  conditional marker that skips CHIP-premium tests when the installed
  policyengine-us release predates the variable (post #8086).

Adds CHIP premium wiring:
- `_calculate_variable` and `_calculate_variable_array` now gracefully
  return defaults when a variable isn't in the installed PolicyEngine-US
  release. Lets cliff-watch ship against versions pre/post new variables.
- `chip_premium` (household, annual USD) is pulled alongside the
  existing benefit bundle and surfaced as a new `household_costs`
  section in the calculator return value.
- `net_resources = market_income + core_support - taxes
                   - total_household_costs`.
- `HOUSEHOLD_COST_DEFINITIONS` in config and metadata API so the
  frontend can render the new line.
- Series payload exposes `chip_premium` per earnings point.

Tests:
- `test_chip_premium_surfaces_at_texas_enrollment_fee_band` — structural
  regression on the new household_costs shape.
- `test_missouri_premium_cliff_reduces_net_resources` — verifies that
  the MO family-of-4 premium schedule produces the cliff behavior once
  policyengine-us exposes `chip_premium` (skipped on older pins).

Caveat:
- Uses `chip` (MACPAC net-of-premium spending) rather than `chip_gross`
  pending PolicyEngine/policyengine-us#8094 landing in a release.
  Small baseline bias for the 17 CHIP-premium states; cliff shapes are
  correct either way. Swap to `chip_gross` is a follow-up.
@MaxGhenis MaxGhenis merged commit 1e062e7 into main Apr 19, 2026
12 of 15 checks passed
@MaxGhenis MaxGhenis deleted the chip-gross-reconstruction branch April 19, 2026 19:28
MaxGhenis added a commit to PolicyEngine/cliff-watch that referenced this pull request Apr 19, 2026
…urces (#2)

* Refactor scripts into a cliff_watch package and add CHIP premium as a household cost

Restructures the repo as a proper installable Python package:
- `cliff_watch/` (was `scripts/`) with `__init__.py` exporting the
  public API; dev_api_server renamed to `dev_server`.
- `pyproject.toml` with hatchling build + pytest, ruff, coverage
  dev extras. `cliff-watch-dev-server` console script entry point.
- `examples/sample_household.json` (was `scripts/sample_household.json`).
- `api/_shared.py` imports repointed from `scripts.*` to `cliff_watch.*`.
- `tests/` with `pytest.importorskip("policyengine_us")` + a
  conditional marker that skips CHIP-premium tests when the installed
  policyengine-us release predates the variable (post #8086).

Adds CHIP premium wiring:
- `_calculate_variable` and `_calculate_variable_array` now gracefully
  return defaults when a variable isn't in the installed PolicyEngine-US
  release. Lets cliff-watch ship against versions pre/post new variables.
- `chip_premium` (household, annual USD) is pulled alongside the
  existing benefit bundle and surfaced as a new `household_costs`
  section in the calculator return value.
- `net_resources = market_income + core_support - taxes
                   - total_household_costs`.
- `HOUSEHOLD_COST_DEFINITIONS` in config and metadata API so the
  frontend can render the new line.
- Series payload exposes `chip_premium` per earnings point.

Tests:
- `test_chip_premium_surfaces_at_texas_enrollment_fee_band` — structural
  regression on the new household_costs shape.
- `test_missouri_premium_cliff_reduces_net_resources` — verifies that
  the MO family-of-4 premium schedule produces the cliff behavior once
  policyengine-us exposes `chip_premium` (skipped on older pins).

Caveat:
- Uses `chip` (MACPAC net-of-premium spending) rather than `chip_gross`
  pending PolicyEngine/policyengine-us#8094 landing in a release.
  Small baseline bias for the 17 CHIP-premium states; cliff shapes are
  correct either way. Swap to `chip_gross` is a follow-up.

* Use calculator's Simulation loader in skip predicate and fix scripts path references
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant