Skip to content

Add ACA cost-sharing reduction actuarial values#8212

Draft
daphnehanse11 wants to merge 4 commits into
PolicyEngine:mainfrom
daphnehanse11:codex/issue-8211-selected-marketplace-plan
Draft

Add ACA cost-sharing reduction actuarial values#8212
daphnehanse11 wants to merge 4 commits into
PolicyEngine:mainfrom
daphnehanse11:codex/issue-8211-selected-marketplace-plan

Conversation

@daphnehanse11
Copy link
Copy Markdown
Collaborator

@daphnehanse11 daphnehanse11 commented Apr 30, 2026

Summary

  • Add a selected_marketplace_plan_category variable defaulting to Silver.
  • Use actual lcbp when the selected Marketplace plan category is Bronze, while preserving existing Silver/SLCSP default behavior.
  • Add Bronze and Silver standard Marketplace plan actuarial values.
  • Add ordinary income-based Silver cost-sharing reduction eligibility, category, CSR actuarial value, and effective actuarial value variables.
  • Add tests for the 94%, 87%, and 73% CSR tiers; no CSR at 275% FPL; no ordinary CSR for Bronze; and no direct change to marketplace_net_premium.

Out of scope

  • Dollar-valued expected Marketplace MOOP / CSR benefit value.
  • AI/AN zero- and limited-cost-sharing plan variations.

Tests

  • uv run python -m policyengine_core.scripts.policyengine_command test policyengine_us/tests/policy/baseline/gov/aca/csr policyengine_us/tests/policy/baseline/gov/aca/ptc/selected_marketplace_plan_premium_proxy.yaml policyengine_us/tests/policy/baseline/gov/aca/ptc/used_aca_ptc.yaml policyengine_us/tests/policy/baseline/gov/aca/ptc/marketplace_net_premium.yaml -c policyengine_us
  • uv run pytest policyengine_us/tests/test_parameter_files.py
  • uv run --extra dev ruff format --check .
  • uv run --extra dev ruff check .

Closes #8188.
Closes #8211.

@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 30, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (d55cd4f) to head (3fdaad4).
⚠️ Report is 56 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff            @@
##              main     #8212   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files            2         7    +5     
  Lines           35       101   +66     
=========================================
+ Hits            35       101   +66     
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.

@daphnehanse11 daphnehanse11 changed the title Use actual bronze premiums for selected Marketplace plans Add ACA cost-sharing reduction actuarial values Apr 30, 2026
Copy link
Copy Markdown
Collaborator Author

@daphnehanse11 daphnehanse11 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed_in_a_clean_temp_worktree_and_left_one_inline_finding.

def formula(tax_unit, period, parameters):
category = tax_unit("selected_marketplace_plan_category", period)
p = parameters(period).gov.aca.metal_actuarial_value
return where(category == MarketplacePlanCategory.BRONZE, p.bronze, p.silver)
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P2] Gate selected plan AV on Marketplace enrollment

Because selected_marketplace_plan_category defaults to SILVER, this formula returns 0.7 for every tax unit, even when nobody is enrolled in Marketplace coverage and selected_marketplace_plan_premium_proxy is 0. marketplace_effective_actuarial_value then also reports 0.7 via max_(selected_plan_av, csr_av). A blank simulation currently calculates both selected_marketplace_plan_actuarial_value and marketplace_effective_actuarial_value as [0.7]. Please gate the metal AV on actual selected Marketplace coverage, for example the same take-up/premium condition or a positive selected plan premium, so non-enrollees stay at 0.

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.

Use actual bronze premiums for selected Marketplace plan choice Add Cost Sharing Reductions

1 participant