Skip to content

Document disjoint health premium inputs and correct consumer treatment - #10046

Draft
MaxGhenis wants to merge 15 commits into
mainfrom
hub-premium-input-contract-1010
Draft

MaxGhenis wants to merge 15 commits into
mainfrom
hub-premium-input-contract-1010

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 10, 2026 •

Copy link
Copy Markdown
Contributor

The premium inputs previously left pretax payroll treatment ambiguous. Under the hub's settled disjoint-input contract, a caller supplying $3,000 of non-pretax premiums and $2,000 of pretax payroll premiums paid $5,000 in total. Several benefit consumers counted only the $3,000; this PR counts $5,000 where the program's definition includes both payment methods.

The PR documents the employee premium leaves and the separate employer-paid leaf. It adds pretax payments locally in SPM MOOP, SNAP, HUD, Missouri child care, Pennsylvania child care, Orange County General Relief and New Jersey medical deductions. SSI now excludes qualified cafeteria-plan salary-reduction premiums from wages, without excluding retirement deferrals or reducing self-employment income. North Dakota renter-refund income excludes pretax payments once as excluded income while continuing to deduct non-pretax medical expenses. The CRFB reform is unchanged here; its premium-base change is split into a separate draft PR for Max's methodology decision.

Input contract and invariants

  • pre_tax_health_insurance_premiums contains employee premiums paid through pretax payroll deductions. It remains a leaf with no formula.
  • health_insurance_premiums, health_insurance_premiums_without_medicare_part_b, other_health_insurance_premiums, reported Medicare Part B and long-term care premium inputs exclude those payroll payments. Applicable non-pretax aggregates and decomposed inputs are alternative representations; their overlapping components must not be added together.
  • The pretax and non-pretax sets are disjoint. Total employee-paid premiums equal the applicable non-pretax aggregate plus the separate pretax input. Employer-paid premiums belong in employer_sponsored_insurance_premiums and do not enter employee medical expenses.
  • Moving an amount between payment methods leaves spending-based consumers unchanged with eligibility, modeled program premiums and gross income held fixed. Federal taxable/FICA wages, SSI earnings/countable income and ACA/Medicaid MAGI change because tax law distinguishes the methods. SGA retains gross work earnings and remains unchanged. Michigan resources remain unchanged through offsetting wage exclusion and after-tax premium deduction with other benefit amounts held fixed. SSI can rise when wages move to pretax premiums, and SSI enters mi_household_resources; therefore total Michigan resources need not remain fixed when benefits are allowed to respond. North Dakota income remains unchanged through its distinct income-exclusion and medical-expense routes.

The shared medical_expense_health_insurance_premiums formula remains non-pretax. Consumers that count both sets add the separate leaf locally; consumers that exclude pretax keep the shared aggregate alone. Its documentation now makes that choice explicit.

Consumer audit

Round 1 audited main at fe0c3a651cf27a9974074dbbfd5bcac5684c85f2; round 2 uses fetched main 05907577140ce06f38b45777a05f479181161164 using variable and parameter references, including downstream medical-expense consumers. “Correct” describes this premium contract, not complete coverage of every provision in the program. Derived taxes/benefits inherit the treatment of the listed wage, premium, and expense consumers.

Consumer Rule Primary source Status
Federal taxable wages, pre_tax_contributions; FICA wages, fica_pre_tax_contributions Qualified payroll premiums excluded once; non-pretax payments do not reduce wages IRC 125, IRS cafeteria-plan explanation Correct, unchanged
ACA MAGI and Medicaid MAGI Follow taxable-income methodology; no additional deduction for ordinary non-pretax premiums 42 CFR 435.603(e), CMS training p106 Correct, unchanged
Shared medical premium resolver Select direct non-pretax premiums or non-Medicare plus modeled Part B; tax consumers exclude the separate pretax input IRS medical-expense definition, program-specific sources below Formula unchanged; documentation clarified
SPM premium aggregate → MOOP → SPM resources Count employee-paid premiums, including paycheck deductions; exclude employer share Census SPM documentation p18, ASEC payroll findings pp63–65 Fixed: add separate pretax leaf
SNAP allowable medical expenses Gross earnings include voluntary pretax reductions; actual insurance premiums have no tax-status exclusion, subject to elderly/disabled medical-deduction rules 7 CFR 273.9(d)(3)(iv), FNS coordination toolkit p47 Fixed: add pretax leaf
HUD medical expenses Unreimbursed paid/anticipated premiums; HUD bars importing all IRS 502 exclusions PIH 2023-27 C.3.b p37 Fixed: add pretax leaf
SSI earnings → countable income/deeming; Medicare Savings Programs; optional senior/disabled Medicaid income Qualified cafeteria-plan salary reductions are not wages; ordinary payroll deductions and retirement deferrals remain wages SSA POMS SI00820.102 C.2–C.4, retirement earnings rules Fixed: exclude pretax premiums from wages, capped at wages; preserve parameter-defined other earned sources
Minnesota MSA countable income, gross eligibility, payment and guardian fees Countable income adopts SSI exclusions; gross income is before deductions/disregards and guardian allowance is capped at 5% of gross income/$100 monthly. Restore employee salary-reduction premiums only for the gross base; retain SSI exclusions for net eligibility/payment Minn. Stat. 256D.435 subds. 4a, 6, 256D.35 subd. 10, Minn. R. 9500.1206 subp. 15a, 256D.44 subd. 5(d) Fixed: preserve gross eligibility/guardian treatment while net income inherits SSI exclusion; five integration cases
SSI substantial gainful activity (SGA) Work earnings retain payroll insurance deductions, unlike SSI countable income SSA POMS DI10505.010A, 20 CFR 416.974 Preserve gross earnings by restoring only the premium excluded from SSI wages
Medicaid medically needy/209(b) spenddown expenses SSI income excludes qualified salary reductions; Kansas bars repeating pretax payroll deductions as spenddown expenses. State income/expense methods differ 42 CFR 435.831(b), (d), (e)(1), Kansas §7532.1(4) Expense formula unchanged; SSI income corrected; state sequencing limitation documented
Missouri CCS adjusted income Gross income less household-paid insurance premiums, without tax distinction 5 CSR 25-200.050(2), DESE manual §5.7 Fixed: add pretax leaf
Pennsylvania CCW medical expenses → adjusted income Wages before insurance deductions; unreimbursed premiums allowed subject to medical-expense conditions 55 Pa. Code Ch3042 Appendix A I(A), II(C), PDF pp59,61 Fixed: add pretax leaf
Orange County General Relief countable income Income diverted to third parties is counted; medical-insurance payments deducted OC income manual §70.2.a(1), .o(4), .p(1), PDF pp1,4 Fixed: add pretax leaf
New Jersey medical deduction Salary-reduction premiums taxable in NJ; employee-paid premiums deductible above 2% income TB-39(R), NJ instructions PDF p25 Fixed: add pretax leaf; raw wage treatment already correct
North Dakota renter-refund income Exclude federally/state-excluded income; medical expenses use income-tax definition NDCC 57-02-08.1(5)(c–d), state guidance Fixed: pretax income exclusion once, non-pretax medical deduction unchanged
Michigan household resources Deduct posttax premiums only; wage source already excludes pretax payroll premiums Treasury premium FAQ, 2025 instructions p33 Correct, unchanged
Missouri qualified health-insurance subtraction → AGI Only premiums included in federal taxable income qualify RSMo 143.121.7, Form 5695 Correct pretax exclusion, unchanged
Ohio medical-insurance helper → insured/uninsured deductions; LTC Exclude premiums already excluded/deducted in federal/Ohio AGI ORC 5747.01(A)(10), 2025 worksheet p41 Correct, unchanged
Montana individual/joint medical deductions Cafeteria-plan premiums ineligible 2022 Form 2 instructions pp26–27 Correct pretax exclusion, unchanged
Washington senior/disabled property-tax deduction sources Medicare/Medigap/LTC allowed; general private premiums not allowed RCW 84.36.383(2) Correct exclusion of aggregate pretax input; no formula change
Alabama medical deduction Cafeteria-plan premiums ineligible 2024 Form 40 instructions p19 Correct pretax exclusion, unchanged
Arkansas individual/joint medical deductions Federal medical definition; cafeteria benefits excluded from wages 2024 instructions, IRS Topic 502 Correct pretax exclusion, unchanged
Arizona itemized deductions Exclude cafeteria premiums unless included in taxable wages 2025 Form 140 booklet p46 Correct pretax exclusion, unchanged
Hawaii medical deduction Federal IRC medical rules adopted HRS 235-2.3, N11 instructions pp15–16 Correct pretax exclusion, unchanged
New Mexico medical deduction/exemption/credit Pretax payroll premiums explicitly ineligible 2022 PIT booklet pp26–27, ADJ6, RC10 Correct pretax exclusion, unchanged
CRFB expanded surtax base Add employer-provided coverage; employee pretax restoration is a modeling inference from salary-reduction coverage classification CRFB Break Glass footnote 2, IRS Revenue Ruling 2002-3, PDF pp1–2 Unchanged here; separate PR (#10066)
CBO household market-income additions Gross wages include employee amounts; add employer-paid premiums only CBO health-insurance measurement, CBO income definition Correct, unchanged
Reported Medicare Part B premium input Non-pretax leaf; no current formula/parameter consumer Main reference inventory; Medicare/program rules represented by modeled premiums Documentation only
Federal Schedule A and self-employed health-insurance ALD Exclude payroll-pretax premiums; payer and SE deduction exclusions owned separately Schedule A instructions, Form 7206 instructions Out of scope; formulas untouched; separate hub-schedA-se-premiums-1010 PR
Idaho premium subtraction Exclude disjoint payroll premiums from claimant subtraction Idaho Code 63-3022P, PR #10023 methodology Out of scope; no Idaho formula edits

For Minnesota, 256D.35 subd. 10 directly defines MSA gross income before deductions/disregards. Rule 9500.1206 primarily governs General Assistance under 9500.1200; Combined Manual 0017 adopts GA gross-income conventions for non-SSI MSA recipients and substitutes the full federal benefit rate for SSI recipients. The gross test therefore restores the employee salary reduction, while 256D.435 preserves SSI exclusions for net eligibility/payment.

Open reading, Minnesota MSA gross income (decision d1314). The sources do not expressly say how Minnesota classifies an employee's pre-tax cafeteria-plan premium for the gross-income test.

  • Keep it in gross income (implemented; unchanged from main for the person's own gross income). Gross income is measured before deductions and disregards (256D.35 subd. 10).
  • Exclude it, as SSI does. POMS SI 00820.102 says salary reductions used to buy qualified benefits are not wages and not income for SSI; 256D.435 adopts SSI exclusions, and Minnesota's in-kind rules exclude noncash income and vendor payments.
  • Consequence, first new MSA fixture: gross income $1,950, guardian allowance $97.50 and MSA $155 if kept; $1,850, $92.50 and $150 if excluded.

Medically needy eligibility currently models ABD applicants using SSI countable income. This PR retains the non-pretax-only medical expense aggregate to avoid a blanket second deduction after correcting SSI wages. Kansas explicitly prohibits that repetition. Utah allows employee payroll premiums, paired with gross-income payroll rules. The audit does not establish a universal federal exclusion of pretax premiums as expenses. State-specific sequencing remains a limitation of the existing annual proxy; IRS employer-provided tax classification alone does not establish third-party payment for Medicaid.

The audit also noted pre-existing limits unrelated to this contract: Montana's premium/floor treatment, Washington's unmodeled Medigap component, New Mexico's federal-itemization adjustment, and Alabama's separate small-business insurance deduction. They are reported here without expanding this patch.

Round 2

Removed the CRFB parameter/test changes from this PR in an additive revert commit and opened #10066 from current main. That draft separates the definite after-tax double count from the choice to restore qualified employee salary reductions. Added 16 integration cases: two MSP, two student, one child allocation, SSI spouse/parent deeming, optional Medicaid spouse/parent deeming, two Connecticut SSP, and five Minnesota MSA. Parental fixtures assign singleton marital units to unmarried people and assert zero spousal deeming. The Hypothesis property now includes one-person and two-person married units in every state/example and freezes SSI payments for the Michigan spending invariant. MSA gross eligibility and guardian fees now restore the capped wage exclusion; net eligibility/payment retain it. Medicaid spenddown sequencing remains limited as described above.

Validation

Round-2 runtime results at c7d270970e (one file per process): the revised property file and seven YAML files passed: both optional-Medicaid deeming files, msp_countable_income, SSI deeming from an ineligible parent and from an ineligible spouse, ssi_ineligible_child_allocation, and ssi_blind_or_disabled_working_student_exclusion (10 passed; it had 2 failures before the last commit supplied the SSI disability criteria in its fixtures). The local run stopped there when the build reached its time limit; the other nine files in the round's list were not re-run locally at this head. The PR is a draft, so CI has not run at this head.

The round-1 run passed 81 YAML cases across 12 files (38 added and 43 preserved) before the CRFB split, plus the original one-person property. The revised property retains eight generated examples and two explicit examples. Every changed YAML file is run directly, foreground, one at a time. The Python property exercises generated premium transfers rather than duplicating the policy formulas; explicit examples cover zero, complete transfer, and no transfer. Frozen eligibility/program premiums isolate payment treatment from legitimate MAGI-induced coverage changes. The Kansas spenddown case starts from raw wages of $27,020, age 65 and $4,000 of pretax premiums, and verifies SSI earnings of $23,020 and countable income of $11,000. It explicitly disables the separate SSI-recipient Medicaid pathway, so its eligibility assertion detects an erroneous second premium deduction.

No partner files are edited. Read-only inventory found 144 partner YAML files, no pretax or employer-paid inputs, and only zero direct-premium inputs. No relevant partner output movement is expected from those facts; partner scenarios are not rewritten to make the model pass.

The property belongs to the existing Rest/core CI subgroup; no jobs or concurrency are added. Baseline successful main Rest/core at the same main commit ran 830 tests with external elapsed 681.09 seconds and peak RSS 6,756,660 KiB (6.44 GiB). The new file did not exist on main, so its standalone baseline file cost is zero. The round-1 property's standalone run took 901.06 seconds including process/model startup and peaked at 3,317,071,872 bytes (3.09 GiB RSS) on the contended local macOS machine, with one math-library thread. Pytest reported 720.09 seconds. These local measurements are not an estimate of incremental Linux subgroup cost; updated Linux group time/memory remains for hub/CI validation.

Changelog: changelog.d/hub-premium-input-contract-1010.fixed.md.

axiom: needed

Maintainer Axiom follow-up is required. The signed encoder is not available in this workspace; no billed encoder run was requested or performed. The primary provisions and companion tests are listed above.

Coordination with #10055

#10055 (hub-schedA-se-premiums-1010, 1951078ce369e863fdaa37c3d79067e396231623) lands first. It is not merged into this branch. Both PRs modify these four paths:

Shared path #10055 #10046
policyengine_us/variables/gov/states/nj/tax/income/deductions/nj_medical_expense_deduction.py Remove each dependent's separately deducted SE premiums from general medical expenses Add disjoint pretax payroll premiums
policyengine_us/tests/policy/baseline/gov/states/nj/tax/income/deductions/nj_medical_expense_deduction.yaml Four SE attribution cases Four payment-method cases
policyengine_us/variables/gov/states/nd/tax/property/renters_refund/nd_renters_refund_income.py Use medical costs actually paid, retaining SE-ALD premiums Exclude disjoint pretax premiums from raw income once
policyengine_us/tests/policy/baseline/gov/states/nd/tax/property/renters_refund/nd_renters_refund_income.yaml One paid-cost case Four payment-method cases

When sequencing the merge, preserve both NJ adjustments (itemized_medical_expenses - excluded_dependent_premiums + pretax premiums) and both ND adjustments (gross income minus pretax premiums minus #10055's paid-cost medical base). Keep both sets of cases/references, then rerun those YAML files and both properties against the combined tree.

Hub microsimulation impact

No microsimulation run locally; hub refresh pending. Rechecked DEFAULT_DATASET at main and the cached schema of the certified populace-us-2024-spm-20260909 build, revision 9a814a3b3b53c0ecd6e1737b6ec862c31300ef6f: no pre_tax_health_insurance_premiums column, and the variable has no formula. Therefore the baseline pretax additions/exclusion are zero on the pinned dataset. The split CRFB draft changes its premium addback sources and can change reform aggregates even without a pretax column; its impact must be checked in that separate PR. The cached schema has no employer-paid premium column either.

@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Cross-repo note for the hub, from the session behind #10067. No change requested on this PR.

A producer for the pre-tax input is coming. PolicyEngine/microcosm#1189 as opened wrote the reported premium (PHIP_VAL, about $181B) to pre_tax_health_insurance_premiums and left the same dollars in health_insurance_premiums_without_medicare_part_b, which breaks the disjoint contract this PR documents. I raised it there. Its session agrees with the contract and has told me it will:

  • ship only employer_sponsored_insurance_premiums in microcosm#1189;
  • add the pre-tax column in a follow-up that nets it out of the non-pre-tax premium outputs, with a release gate that stays red until the pinned engine counts the pre-tax input in SPM medical out-of-pocket expenses.

So this PR is a prerequisite for that data. The "no pre_tax_health_insurance_premiums column" finding under "Hub microsimulation impact" holds for the pinned dataset, but will stop holding once the follow-up ships. #10064, which asked for an engine subtraction on Schedule A, is closed as not planned.

One point for the audit, relayed from that session. On Microcosm's PUF-support rows the non-pre-tax premium is not PHIP_VAL. puf_support.py sets health_insurance_premiums_without_medicare_part_b to 45.3% of PUF E17500 (_PUF_MEDICAL_EXPENSE_CATEGORY_BREAKDOWNS, lines 603–607 and 4273–4276 at 6f727eac), or to a QRF draw. So person-level disjointness against a carried pre-tax premium can be asserted only on measured ASEC rows. I confirmed the constant and its use; I did not trace the QRF path.

#10067 adds federal Schedule A tests under this contract: eight YAML cases in itemized_medical_expenses.yaml and a Hypothesis property test. It changes no formula and shares no file with this PR, #10055 or #10023. Both files pass on this branch at de43bf5f61; the two SSI deeming cases added since do not touch the federal path.

MaxGhenis added a commit to PolicyEngine/microcosm that referenced this pull request Oct 10, 2026
The first independent review asked for changes on five points; each held up
against sources.

Anchor and universe. BEA NIPA 7.8 line 17 is not an active-worker series:
BEA's State Personal Income methodology (December 2025, paragraphs 3.18 and
3.19) says it covers active and retired employees, as CMS NHE Table 24 does.
The stage now prices every current policyholder, scales that universe to NHE
Table 24 (the anchor #454 chose), and writes the column for employed
policyholders only. Retiree and COBRA dollars are priced and left out, not
loaded onto workers. BEA and MEPS-IC's own private-sector enrollment total are
recorded beside the anchor verdict.

Payment status. "Employer pays some" subtracts the contribution of an employee
who pays one: MEPS-IC's average contribution divided by one minus the published
share of enrollees with no contribution (Tables II.C/D/E.4.a). A cohort with
MEPS-IC's own mix reproduces the published cell mean.

Gates. Both gates fail when a raw ASEC coverage column is missing. The anchor
gate recomputes the anchor-universe total at release weights and bands the
employed share. The evidence file carries the base and export signal verdicts,
so a waived failure stays on the record. An ACS local build refuses a frame
whose input is null on some rows instead of default-filling it. The output
family is registered at the raw-stage operator boundary.

Pre-tax premium. Removed from this change. PolicyEngine-US treats the premium
inputs as disjoint (PolicyEngine/policyengine-us#10046), so a producer must
move those dollars out of the reported premium on an engine that includes that
change. The earlier derivation is kept on branch esi-pre-tax-premiums-454. The
stage now has one output and no seeded draw; the seed-protocol registration is
reverted.

Measured on the default pinned pool, target year 2024, before calibration:
$925.7B over 74.0M employed policyholders with a positive premium, mean
$12,515. Receipts regenerated for both pools.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
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