Repository navigation
Uprate HSA payroll contributions by the 223(b)(2) contribution limit - #10097
Merged
Merged
Conversation
CMS per-capita out-of-pocket spending counts HSA withdrawals, not contributions. Add the 26 U.S.C. 223(b)(2) self-only and family contribution limits (2004-2026) and project them from the statute under 223(g): chained CPI-U over the 12 months ending March 31 against a 1997 base, rounded to the nearest $50. Point the payroll contribution input at the family limit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…r once Transcription, a differential test of an independent 223(g) implementation against every published limit for 2018-2026, the projection rule, and Hypothesis bounds and order. Simulation and dataset extension tests check the input follows the family limit and that a contribution at the cap stays at the cap. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every value 2004-2027 is cited to the IRS document and page that states it. The statutory projection had already given $4,500 and $9,000 for 2027; the independent 223(g) test now covers 2018-2027. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis
force-pushed
the
hsa-payroll-contribution-uprating
branch
from
October 11, 2026 19:32
a141eed to
e7ef37f
Compare
MaxGhenis
marked this pull request as ready for review
October 11, 2026 19:36
Contributor
Author
|
US + core hub merge audit, us#10097 at
|
1 similar comment
Contributor
Author
|
US + core hub merge audit, us#10097 at
|
MaxGhenis
added a commit
that referenced
this pull request
Oct 12, 2026
…wording Keeps #10097's HSA sentence and series; the CMS out-of-pocket list now ends with prescription expenses. Long-term care: the statute's index is for August of the preceding year and CBO and CMS do not project it. Part B: a growth proxy, not each person's premium. Trustees reference title carries its file pages. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis
added a commit
that referenced
this pull request
Oct 12, 2026
#10097 moved health_savings_account_payroll_contributions to the family HSA contribution limit, so it no longer uprates by moop_per_capita. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis
added a commit
that referenced
this pull request
Oct 13, 2026
…034 (#10084) * Update CMS out-of-pocket per-capita uprater to NHE projections 2025-2034 Replace calibration.gov.hhs.cms.moop_per_capita with Table 3 of the 2025-2034 NHE projections (2018-2024 historical estimates, 2025-2034 projections), derive 2015-2017 from the historical accounts by the rule that reproduces Table 3's 2018-2024 values, drop the hand-extended 2033-2035 values, and extend from 2034 at the 2033-2034 growth rate. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Fix HSA variable name and limit rounding check to derived years Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Qualify the interval check's typo detection in its docstring Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Leave HSA payroll contributions out of the CMS series' input list #10097 moved health_savings_account_payroll_contributions to the family HSA contribution limit, so it no longer uprates by moop_per_capita. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
health_savings_account_payroll_contributionsuprated bycalibration.gov.hhs.cms.moop_per_capita, CMS per-capita out-of-pocket health spending. The NHEA methodology paper defines out-of-pocket spending as direct consumer spending on care, including payments covered by HSAs (file page 14). That counts withdrawals from accounts, not the contributions this input holds.This PR:
moop_per_capitaon mainWhat the data put in this input
Nothing. Microcosm (
origin/main909586128) never writes the column. It appears only inpackages/microcosm-frame/tests/golden/concept-coverage/policyengine-us.json, underuncovered_inputs. The releasedpopulace_us_2024.h5has no HSA column in its person table (319 columns in the newest HF snapshot8ab57ffc, 318 in the certified26dcad66), and nopre_tax_contributionscolumn. Its only HSA input is the tax-unithealth_savings_account_ald.The series therefore applies in two places. The first is inputs entered for one year and calculated for another: core
Simulation._calculateuprates any earlier input byindex(period) / index(input period), read in policyengine-core 3.33.2simulations/simulation.py. The second isextend_single_year_dataset, for any dataset that fills the column. Microcosm aggregates do not change.Why the contribution limit
test_contributions_at_the_limit_stay_at_the_limitchecks this in a simulation.How the limits are projected
Values after the IRS's last publication come from
extend_hsa_contribution_limitsinuprating_extensions.py. It follows the existing statutory extensions such asextend_educator_expense_cap, computing each year from the base rather than chaining from the last rounded value:us/statute/26/223/g/1and/g/2.Averaging windows were checked against the IRS's own publications using the BLS series already in
gov.bls.cpi:The adopted windows also give Rev. Proc. 2018-18's 2018 limits ($3,450 / $6,850). The parameter holds $6,900 for 2018 because Rev. Proc. 2018-27 let taxpayers use it. The extension had projected $4,500 / $9,000 for 2027 before Rev. Proc. 2026-24 published those values.
Unobserved months are interpolated toward CBO's calendar-year C-CPI-U points with the existing
get_projected_cpi_u_for_month; observed C-CPI-U runs through June 2026. The extension adds about 0.1 s to system construction.The new parameters declare
uprating: gov.irs.uprating, with nearest-$50 rounding, as the educator expense cap does. The Trustees long-run reform (reforms/ssa/trustees_core_thresholds.py) wage-indexes everygov.irsparameter with that metadata after 2034, so it treats these limits like other CPI-indexed IRS amounts.Invariants (tested)
tests/core/test_hsa_contribution_limits.py:gov.bls.cpivalues, reproduces every published limit for 2019–2027 and Rev. Proc. 2018-18's 2018 values. The model'sget_hsa_colaequals it in every year whose window is observed.tests/microsimulation/test_hsa_payroll_contribution_uprating.py:pre_tax_contributionssubtracts that uprated amount.gov.irspath is not a national total, soper_capita_upratingdoes not divide it.tests/core/test_uprating_series.pynow expects the family limit for this input. The methodology-page link test covers the new series.Docs
docs-quarto/methodology/spm-poverty.qmd: HSA payroll contributions leave the sentence that lists the inputs following CMS out-of-pocket spending. A new sentence says they follow the family limit, and that the Microcosm data do not fill them.Coordination
moop_per_capita) edits the same docs line, and alsotest_uprating_series.pyanduprating_extensions.pyin other places. I told its session; whichever merges second resolves the one-line docs conflict.Axiom
axiom: us/statute/26/223/g TheAxiomFoundation/rulespec-us#1674 queued
us/statutes/26/223/b.yamlholds the $2,250 / $4,500 bases as constants from 1990 and has no 223(g) module.Tests run locally
226 passed:
tests/core/test_hsa_contribution_limits.py,test_uprating_series.pyandtest_per_capita_uprating.pytests/microsimulation/test_hsa_payroll_contribution_uprating.pytests/policy/contrib/ssa/test_trustees_core_thresholds.pyLocal machine; CI covers the rest.
Evidence (Rev. Procs, statute captures, KFF/EBRI sources, window-convention script):
~/reviews/hsa-uprating-2026-10-11/.🤖 Generated with Claude Code