PolicyEngine / PolicyEngine/policyengine-us
Marketplace enrollees under the filing threshold lose the PTC but keep the premium (tax_unit_is_filer)
- Dominant language
- Python
- Stars
- 162
- Forks
- 212
- Avg merge
- 3d 3h
- Merged PRs (30d)
- 97
Description
**Observed** (API, 2026): a childless married couple in Illinois, ages 30, on an `employment_income` axis $24,000–$36,000:
| earnings | `tax_unit_is_filer` | `premium_tax_credit` | `spm_unit_medical_out_of_pocket_expenses` | net income − MOOP |
|---|---|---|---|---|
| $27,000 | false | 0 | 0 (Medicaid) | $24,740 |
| $30,000 | **false** | **0** | **$19,870** | **$6,914** |
| $33,000 | true | $18,392 | $1,478 | $27,843 |
With `tax_unit_is_filer: true` forced on the tax unit, $30,000 gives PTC $18,779, MOOP $1,090, $25,694 — the phantom $18,780 cliff disappears.
**Cause**: `aca_ptc` multiplies by `tax_unit_is_filer`. Between the end of the childless EITC (~$26,800) and the joint filing threshold ($32,200) the unit is "not a filer", so the credit is zeroed while `pays_aca_premium` stays true and the unit is charged the full benchmark premium. The same happens to any unit with no EITC below its filing threshold (childless couples under 25; couples on non-taxable SSDI plus small wages).
**Expected**: a household that takes APTC must file a return (26 U.S.C. §36B(f); Form 8962), so PTC eligibility should not depend on the filing-threshold test — treat marketplace enrollees as filers, or gate `pays_aca_premium` on subsidy eligibility. In a 51-state sweep of a childless-couple archetype this artifact is the largest "cliff" in 45 states (Vermont $30,647, Wyoming $22,372, Utah $21,962, West Virginia $21,890).
**Repro**: the household above with `state_name: IL`, requesting `tax_unit_is_filer`, `premium_tax_credit`, `spm_unit_medical_out_of_pocket_expenses`; then the same with `tax_unit_is_filer: {"2026": true}` on the tax unit.
Contributor guide
Research direction
Start by tracing the aca_ptc and pays_aca_premium calculations using the Illinois household reproduction, requesting tax_unit_is_filer, premium_tax_credit, and spm_unit_medical_out_of_pocket_expenses. Compare the normal case with the forced tax_unit_is_filer case, then verify that marketplace enrollees no longer lose the credit while retaining the full premium and that the reported income cliff is removed.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- backend
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 55/100