Repository navigation
Conversation
calibration.gov.cbo.income_by_source.adjusted_gross_income had a 2015 value of $9.03T, cited to a Tax Foundation page whose table is tax-year 2013 AGI excluding dependent filers, and no values for 2016-2018, so the series and its per-capita sibling (the default uprating index for dollar inputs) held that figure through 2018 and then jumped 31.7% into 2019. Replace 2015 and add 2016-2018 with IRS SOI Publication 1304 Table 1.1, all returns, adjusted gross income less deficit: $10.210T, $10.226T, $11.010T and $11.643T. CBO values from 2019 on are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The CBO AGI total, which every dollar input without its own series follows per capita, must have a value for every year from its first to its last: a missing year holds the previous value, so the per-capita index drifts down with population and then jumps. The check fails on main (2016-2018 missing) and passes with the SOI fill. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The node description now says the by-source series are CBO's, with SOI actuals for total AGI in 2015-2018. The changelog also covers inputs projected to a year within 2016-2018, which the old flat series grew up to 12% too little. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
The CI run on this pull request was cancelled at 23:27Z on 2026-10-11 to free the organization's shared GitHub runners for an urgent fix in another repository. The US + core hub will re-run it automatically (cancelled jobs only; jobs that had passed are kept). Nothing in this pull request changed. Please don't push or reopen just to restart CI. |
PR Review: Fill CBO total AGI for 2015-2018 with IRS SOI actualsPR #10114 (author: MaxGhenis, head SummaryThe PR fixes the early years of
The data change itself is correct:
One blocking problem comes from timing:
Critical (must fix)1. Once merged with
Should address1. The changelog and the PR body's test-impact analysis predate #10106.
Suggestions
Verified correct
Axiom line assessmentValid
CI statusAll 26 checks pass (
Branch status
Verdict: REQUEST_CHANGES |
DTrim99
left a comment
There was a problem hiding this comment.
All four values match SOI Table 1.1 exactly, and the splice into CBO is smooth. One critical (details in the comment above): #10106, merged 10/12, deflates IRMAA two-year-lookback MAGI by this series, so merged with main the PR breaks three of its expectations (two_years_prior.yaml:33 and :91, senior_household_2015_2016_integration.yaml:56), and the medicare_irmaa_magi_two_years_prior docstring and index comments become false. Please merge main and update them. One should item: the changelog and PR body should state the IRMAA lookback effect (2019 factor 0.765 → 0.932, 2020 0.721 → 0.929).
Problem
calibration.gov.cbo.income_by_source.adjusted_gross_incomehad a 2015 value of $9.034T, cited to a Tax Foundation page whose Table 1 is tax-year 2013 AGI for all returns excluding dependent filers ($9,033,840 million; 138.3 million returns). It had no values for 2016-2018, so the parameter held that figure through 2018. IRS SOI's all-returns figure for tax year 2013 is $9.094T, and for tax year 2015 it is $10.210T.Its derived sibling
adjusted_gross_income_per_capita(total ÷calibration.gov.census.populations.total, built bytools/per_capita_uprating.py) is the default uprating index for 234 dollar-input variables. It drifted down over 2015-2018 and then jumped 31.7% into 2019.Change
2015-2018 now hold IRS SOI Publication 1304 Table 1.1 values: all returns, adjusted gross income less deficit. Each value cites its own tax year's table. CBO values from 2019 are unchanged.
The SOI-to-CBO splice is close to level. SOI's tax-year 2019 total ($11.967T) is within 0.04% of the series' 2019 value ($11.962T).
The node description now says that total AGI uses SOI actuals for 2015-2018.
A new guard,
test_default_series_has_a_value_for_every_yearintests/core/test_uprating_series.py, checks that the default series has a Jan-1 value for every year from its first to its last. It fails on main (2016-2018 missing) and passes here.Impact
Parameters. I dumped every leaf parameter's full
values_listafter system init (105,634 parameters, so uprating, extensions and per-capita derivation are all included) before and after the change. Only the AGI total and its per-capita sibling differ. policyengine-core parameter uprating only appends values after a parameter's last value orstart_instant. Every parameter uprated by this series has its last value (orstart_instant) in 2020 or later: 2021 for SOI rental, farm, farm-rent and alimony income, 2020 for the SOI AGI bands, and 2027 forgov.hhs.smi.amount. None of them moves.Household inputs. Core uprates a variable forward from its latest earlier known period, and holds the index at its first value before the index begins. So an AGI-uprated input dated 2018 or earlier changes when it is projected to a later year. Projected to 2019 or later, the old factors were too high by:
Projected only into 2016-2018, the old factors were too low, by up to 12% for a 2018 target. An input dated 2015 projected to 2018 was ×0.978 and is now ×1.115.
Microsimulation aggregates. These are unchanged. The default dataset (
populace_us_2024) has base year 2024, and its extension projects forward from 2024, so it never reads 2015-2018 index values. Microcosm and policyengine-us-data don't read this series for years before 2019.Tests.
offset(1, "year")loops inreforms/check whether parameters are in effect.gov/hhs/medicare/eligibility/medicare_irmaa_magi_two_years_prior.yaml. Each takes lag-year income from inputs dated in the lag year, which are read as stored arrays (holder.get_array) for lag years before 2015, so nothing is projected.employment_income, which has no uprating.Medicare IRMAA lookback (#10106, open). That PR deflates lookback income by this per-capita series, and its docstring documents the 2016-2018 gap. For a household entered for a single benefit year Y, the deflator is index(Y−2)/index(Y):
Once #10106 lands, this PR will update that docstring note, and any of its expectations the fix moves. Not to be merged before that step.
Invariants
test_every_per_capita_series_is_its_total_over_populationchecks this, andcheck_per_capita_series_is_currentenforces it at runtime.test_simulation_uprating_tracks_national_totalschecks this.Follow-up
Every IRS SOI series that inputs follow (
calibration.gov.irs.soi.*, 88 variables) has the same defect. Each has 2015 values and then nothing until 2020-2022. A separate task will fill those years and generalize the guard.axiom: n/a: calibration uprating series, not a legal provision
🤖 Generated with Claude Code