From 732b821c86a36f3cbd75e7225e1d6bc5573dd96e Mon Sep 17 00:00:00 2001 From: David Trimmer Date: Mon, 21 Sep 2026 14:28:48 -0400 Subject: [PATCH 1/9] Integrate modeled state unemployment insurance into income flows Rebase of PR #8303 onto current main under new ownership (original author has left PolicyEngine). Adds modeled_state_unemployment_compensation (sums al_ui, nj_unemployment_insurance, ny_ui, ok_ui, pa_uc, ut_ui) and total_unemployment_compensation (reported-wins fallback), repoints the direct consumers of unemployment_compensation - including the household_benefits parameter list - and extends the five state UI integration suites with income-flow, reported-preservation, and no-double-count cases. Resolves the uprating/adds computation-mode conflict Pavel flagged on #8303 via Option A: unemployment_compensation stays a pure uprated survey input, so CPS-reported values and future-year uprating are untouched and modeled UI reaches income flows only when no reported amount is present. NJ UI, modeled on main after #8303 was opened, is included in the modeled aggregate as part of the rebase. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01LqCGPgxDukji8Bhs57c5rH --- .../state-ui-income-flow-integration.added.md | 1 + .../gov/household/household_benefits.yaml | 4 +- .../unemployment_insurance/integration.yaml | 70 +++++++++++++++++++ .../unemployment_insurance/integration.yaml | 65 +++++++++++++++++ .../unemployment_insurance/integration.yaml | 65 +++++++++++++++++ .../integration.yaml | 64 +++++++++++++++++ .../unemployment_insurance/integration.yaml | 65 +++++++++++++++++ .../variables/contrib/taxsim/taxsim_pui.py | 2 +- .../variables/contrib/taxsim/taxsim_ui.py | 2 +- .../gov/irs/income/dependent_gross_income.py | 2 +- .../capped_qualified_tuition_expenses_ald.py | 2 +- .../social_security/taxable_ss_magi.py | 2 +- .../tax_exempt_unemployment_compensation.py | 2 +- .../tax_unit_unemployment_compensation.py | 2 +- .../taxable_unemployment_insurance.py | 6 +- ...a_cc_general_assistance_eligible_person.py | 2 +- .../ar_medicaid_work_requirement_eligible.py | 2 +- ...modeled_state_unemployment_compensation.py | 21 ++++++ ...meowner_renter_relief_nontaxable_income.py | 2 +- ...s_snap_work_registration_exempt_non_age.py | 2 +- .../person/total_unemployment_compensation.py | 19 +++++ .../income/spm_unit/spm_unit_benefits.py | 2 +- 22 files changed, 387 insertions(+), 17 deletions(-) create mode 100644 changelog.d/state-ui-income-flow-integration.added.md create mode 100644 policyengine_us/variables/gov/states/modeled_state_unemployment_compensation.py create mode 100644 policyengine_us/variables/household/income/person/total_unemployment_compensation.py diff --git a/changelog.d/state-ui-income-flow-integration.added.md b/changelog.d/state-ui-income-flow-integration.added.md new file mode 100644 index 00000000000..4df888cf91a --- /dev/null +++ b/changelog.d/state-ui-income-flow-integration.added.md @@ -0,0 +1 @@ +Integrated modeled Alabama, New York, Oklahoma, Pennsylvania, and Utah unemployment insurance into unemployment compensation income flows. diff --git a/policyengine_us/parameters/gov/household/household_benefits.yaml b/policyengine_us/parameters/gov/household/household_benefits.yaml index 4f7023ff818..aaec818b609 100644 --- a/policyengine_us/parameters/gov/household/household_benefits.yaml +++ b/policyengine_us/parameters/gov/household/household_benefits.yaml @@ -13,7 +13,7 @@ values: - tanf - high_efficiency_electric_home_rebate - residential_efficiency_electrification_rebate - - unemployment_compensation + - total_unemployment_compensation - child_support_received - workers_compensation - educational_assistance @@ -43,7 +43,7 @@ values: - tanf - high_efficiency_electric_home_rebate - residential_efficiency_electrification_rebate - - unemployment_compensation + - total_unemployment_compensation - child_support_received - workers_compensation - educational_assistance diff --git a/policyengine_us/tests/policy/baseline/gov/states/al/dol/unemployment_insurance/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/al/dol/unemployment_insurance/integration.yaml index 8d2581e2aae..a7629833204 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/al/dol/unemployment_insurance/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/al/dol/unemployment_insurance/integration.yaml @@ -367,3 +367,73 @@ # so the clamp binds. Annual = 275 * 14 = 3,850 (equals MBA, so the # MBA cap is not additionally binding here). al_ui: 3_850 + +- name: Case 13, AL UI feeds unemployment compensation income flows. + # Reuses Case 1's monetarily-eligible input set (al_ui = $3,850) and asserts + # the state benefit surfaces through the total unemployment compensation + # income chain (modeled fallback: no reported UC, so total = modeled al_ui). + period: 2024 + absolute_error_margin: 0.01 + input: + age: 35 + state_code: AL + employment_income: 100_000 + is_tax_unit_dependent: false + al_ui_high_quarter_wages: 10_000 + al_ui_second_high_quarter_wages: 10_000 + al_ui_base_period_wages: 40_000 + al_ui_quarters_with_wages: 4 + al_ui_weekly_earnings: 0 + weeks_unemployed: 20 + output: + al_ui: 3_850 + # No reported unemployment_compensation input -> fallback to modeled. + modeled_state_unemployment_compensation: 3_850 + total_unemployment_compensation: 3_850 + tax_unit_unemployment_compensation: 3_850 + taxable_unemployment_compensation: 3_850 + tax_unit_taxable_unemployment_compensation: 3_850 + +- name: Case 14, reported UC preserved when present (no state UI inputs). + # Reported unemployment_compensation is supplied and no AL UI wage inputs are + # given, so total_unemployment_compensation equals the reported amount. + period: 2024 + absolute_error_margin: 0.01 + input: + age: 35 + state_code: AL + employment_income: 100_000 + is_tax_unit_dependent: false + unemployment_compensation: 5_000 + output: + al_ui: 0 + modeled_state_unemployment_compensation: 0 + unemployment_compensation: 5_000 + total_unemployment_compensation: 5_000 + tax_unit_unemployment_compensation: 5_000 + +- name: Case 15, reported UC wins over modeled - no double count. + # Both reported unemployment_compensation and AL UI wage inputs are present. + # total_unemployment_compensation uses the reported amount only (does not + # add reported + modeled), proving the fallback prevents double counting. + period: 2024 + absolute_error_margin: 0.01 + input: + age: 35 + state_code: AL + employment_income: 100_000 + is_tax_unit_dependent: false + unemployment_compensation: 5_000 + al_ui_high_quarter_wages: 10_000 + al_ui_second_high_quarter_wages: 10_000 + al_ui_base_period_wages: 40_000 + al_ui_quarters_with_wages: 4 + al_ui_weekly_earnings: 0 + weeks_unemployed: 20 + output: + al_ui: 3_850 + modeled_state_unemployment_compensation: 3_850 + unemployment_compensation: 5_000 + # Reported wins; total is 5,000 (not 5,000 + 3,850). + total_unemployment_compensation: 5_000 + tax_unit_unemployment_compensation: 5_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ny/dol/unemployment_insurance/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/ny/dol/unemployment_insurance/integration.yaml index 028c782f6d0..1828677f567 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ny/dol/unemployment_insurance/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ny/dol/unemployment_insurance/integration.yaml @@ -246,3 +246,68 @@ ny_ui_weekly_payable: 71.5 # Annual = $71.50 * 10 = $715; MBA = $143 * 26 = $3,718 (not binding). ny_ui: 715 + +- name: Case 9, NY UI feeds unemployment compensation income flows. + # Reuses Case 1's monetarily-eligible input set (ny_ui = $7,982) and asserts + # the state benefit surfaces through the total unemployment compensation + # income chain (modeled fallback: no reported UC, so total = modeled ny_ui). + period: 2025 + absolute_error_margin: 0.01 + input: + age: 35 + state_code: NY + employment_income: 100_000 + is_tax_unit_dependent: false + ny_ui_high_quarter_wages: 8_000 + ny_ui_base_period_wages: 28_000 + ny_ui_quarters_with_wages: 4 + weeks_unemployed: 26 + ny_ui_weekly_hours_worked: 0 + ny_ui_gross_weekly_earnings: 0 + output: + ny_ui: 7_982 + # No reported unemployment_compensation input -> fallback to modeled. + modeled_state_unemployment_compensation: 7_982 + total_unemployment_compensation: 7_982 + tax_unit_unemployment_compensation: 7_982 + taxable_unemployment_compensation: 7_982 + tax_unit_taxable_unemployment_compensation: 7_982 + +- name: Case 10, reported UC preserved when present (no NY UI inputs). + period: 2025 + absolute_error_margin: 0.01 + input: + age: 35 + state_code: NY + employment_income: 100_000 + is_tax_unit_dependent: false + unemployment_compensation: 4_500 + output: + ny_ui: 0 + modeled_state_unemployment_compensation: 0 + unemployment_compensation: 4_500 + total_unemployment_compensation: 4_500 + tax_unit_unemployment_compensation: 4_500 + +- name: Case 11, reported UC wins over modeled NY UI - no double count. + period: 2025 + absolute_error_margin: 0.01 + input: + age: 35 + state_code: NY + employment_income: 100_000 + is_tax_unit_dependent: false + unemployment_compensation: 4_500 + ny_ui_high_quarter_wages: 8_000 + ny_ui_base_period_wages: 28_000 + ny_ui_quarters_with_wages: 4 + weeks_unemployed: 26 + ny_ui_weekly_hours_worked: 0 + ny_ui_gross_weekly_earnings: 0 + output: + ny_ui: 7_982 + modeled_state_unemployment_compensation: 7_982 + unemployment_compensation: 4_500 + # Reported wins; total is 4,500 (not 4,500 + 7,982). + total_unemployment_compensation: 4_500 + tax_unit_unemployment_compensation: 4_500 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ok/oesc/unemployment_insurance/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/ok/oesc/unemployment_insurance/integration.yaml index c776e6375d4..3d1996a506d 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ok/oesc/unemployment_insurance/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ok/oesc/unemployment_insurance/integration.yaml @@ -213,3 +213,68 @@ # Note: intermediate variables (eligibility, WBA, etc.) may still # compute, but the top-level ok_ui is gated to OK households only. ok_ui: 0 + +- name: Case 8, OK UI feeds unemployment compensation income flows. + # Reuses Case 1's monetarily-eligible input set (ok_ui = $8,000) and asserts + # the state benefit surfaces through the total unemployment compensation + # income chain (modeled fallback: no reported UC, so total = modeled ok_ui). + period: 2024 + absolute_error_margin: 0.01 + input: + age: 35 + state_code: OK + employment_income: 100_000 + is_tax_unit_dependent: false + ok_ui_high_quarter_taxable_wages: 11_500 + ok_ui_high_quarter_total_wages: 11_500 + ok_ui_base_period_taxable_wages: 11_500 + ok_ui_base_period_total_wages: 35_000 + ok_ui_gross_weekly_earnings: 0 + weeks_unemployed: 16 + output: + ok_ui: 8_000 + # No reported unemployment_compensation input -> fallback to modeled. + modeled_state_unemployment_compensation: 8_000 + total_unemployment_compensation: 8_000 + tax_unit_unemployment_compensation: 8_000 + taxable_unemployment_compensation: 8_000 + tax_unit_taxable_unemployment_compensation: 8_000 + +- name: Case 9, reported UC preserved when present (no OK UI inputs). + period: 2024 + absolute_error_margin: 0.01 + input: + age: 35 + state_code: OK + employment_income: 100_000 + is_tax_unit_dependent: false + unemployment_compensation: 3_200 + output: + ok_ui: 0 + modeled_state_unemployment_compensation: 0 + unemployment_compensation: 3_200 + total_unemployment_compensation: 3_200 + tax_unit_unemployment_compensation: 3_200 + +- name: Case 10, reported UC wins over modeled OK UI - no double count. + period: 2024 + absolute_error_margin: 0.01 + input: + age: 35 + state_code: OK + employment_income: 100_000 + is_tax_unit_dependent: false + unemployment_compensation: 3_200 + ok_ui_high_quarter_taxable_wages: 11_500 + ok_ui_high_quarter_total_wages: 11_500 + ok_ui_base_period_taxable_wages: 11_500 + ok_ui_base_period_total_wages: 35_000 + ok_ui_gross_weekly_earnings: 0 + weeks_unemployed: 16 + output: + ok_ui: 8_000 + modeled_state_unemployment_compensation: 8_000 + unemployment_compensation: 3_200 + # Reported wins; total is 3,200 (not 3,200 + 8,000). + total_unemployment_compensation: 3_200 + tax_unit_unemployment_compensation: 3_200 diff --git a/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/integration.yaml index bf6f9384e27..d7c5becc519 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/integration.yaml @@ -263,3 +263,67 @@ person1: # Household is outside PA -> defined_for filters the benefit. pa_uc: 0 + +- name: Case 8, PA UC feeds unemployment compensation income flows. + period: 2025 + absolute_error_margin: 0.01 + input: + age: 35 + state_code: PA + employment_income: 100_000 + is_tax_unit_dependent: false + pa_uc_highest_quarter_wages: 10_000 + pa_uc_base_year_wages: 28_000 + pa_uc_credit_weeks: 26 + weeks_unemployed: 26 + pa_uc_gross_weekly_earnings: 0 + output: + pa_uc: 10_218 + # No reported unemployment_compensation input -> fallback to modeled. + modeled_state_unemployment_compensation: 10_218 + total_unemployment_compensation: 10_218 + tax_unit_unemployment_compensation: 10_218 + taxable_unemployment_compensation: 10_218 + tax_unit_taxable_unemployment_compensation: 10_218 + spm_unit_benefits: 10_218 + household_benefits: 10_218 + +- name: Case 9, reported UC preserved when present (no PA UC inputs). + period: 2025 + absolute_error_margin: 0.01 + input: + age: 35 + state_code: PA + employment_income: 100_000 + is_tax_unit_dependent: false + unemployment_compensation: 6_000 + output: + pa_uc: 0 + modeled_state_unemployment_compensation: 0 + unemployment_compensation: 6_000 + total_unemployment_compensation: 6_000 + tax_unit_unemployment_compensation: 6_000 + spm_unit_benefits: 6_000 + +- name: Case 10, reported UC wins over modeled PA UC - no double count. + period: 2025 + absolute_error_margin: 0.01 + input: + age: 35 + state_code: PA + employment_income: 100_000 + is_tax_unit_dependent: false + unemployment_compensation: 6_000 + pa_uc_highest_quarter_wages: 10_000 + pa_uc_base_year_wages: 28_000 + pa_uc_credit_weeks: 26 + weeks_unemployed: 26 + pa_uc_gross_weekly_earnings: 0 + output: + pa_uc: 10_218 + modeled_state_unemployment_compensation: 10_218 + unemployment_compensation: 6_000 + # Reported wins; total is 6,000 (not 6,000 + 10,218). + total_unemployment_compensation: 6_000 + tax_unit_unemployment_compensation: 6_000 + spm_unit_benefits: 6_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ut/dws/unemployment_insurance/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/ut/dws/unemployment_insurance/integration.yaml index 36f811ebc1c..28ae0891c86 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ut/dws/unemployment_insurance/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ut/dws/unemployment_insurance/integration.yaml @@ -266,3 +266,68 @@ # weeks_unemployed (17) == duration (17): annual = $395 * 17 = $6,715. # min($6,715, MBA $6,715) = $6,715 -> cap binds exactly at equality. ut_ui: 6_715 + +- name: Case 9, UT UI feeds unemployment compensation income flows. + # Reuses Case 2's monetarily-eligible input set (ut_ui = $19,396) and asserts + # the state benefit surfaces through the total unemployment compensation + # income chain (modeled fallback: no reported UC, so total = modeled ut_ui). + period: 2024 + absolute_error_margin: 0.01 + input: + age: 35 + state_code: UT + employment_income: 100_000 + is_tax_unit_dependent: false + ut_ui_base_period_wages: 80_000 + ut_ui_high_quarter_wages: 25_000 + ut_ui_quarters_with_wages: 4 + ut_ui_weeks_unemployed: 26 + ut_ui_gross_weekly_earnings: 0 + ut_ui_weekly_hours_worked: 0 + output: + ut_ui: 19_396 + # No reported unemployment_compensation input -> fallback to modeled. + modeled_state_unemployment_compensation: 19_396 + total_unemployment_compensation: 19_396 + tax_unit_unemployment_compensation: 19_396 + taxable_unemployment_compensation: 19_396 + tax_unit_taxable_unemployment_compensation: 19_396 + +- name: Case 10, reported UC preserved when present (no UT UI inputs). + period: 2024 + absolute_error_margin: 0.01 + input: + age: 35 + state_code: UT + employment_income: 100_000 + is_tax_unit_dependent: false + unemployment_compensation: 12_000 + output: + ut_ui: 0 + modeled_state_unemployment_compensation: 0 + unemployment_compensation: 12_000 + total_unemployment_compensation: 12_000 + tax_unit_unemployment_compensation: 12_000 + +- name: Case 11, reported UC wins over modeled UT UI - no double count. + period: 2024 + absolute_error_margin: 0.01 + input: + age: 35 + state_code: UT + employment_income: 100_000 + is_tax_unit_dependent: false + unemployment_compensation: 12_000 + ut_ui_base_period_wages: 80_000 + ut_ui_high_quarter_wages: 25_000 + ut_ui_quarters_with_wages: 4 + ut_ui_weeks_unemployed: 26 + ut_ui_gross_weekly_earnings: 0 + ut_ui_weekly_hours_worked: 0 + output: + ut_ui: 19_396 + modeled_state_unemployment_compensation: 19_396 + unemployment_compensation: 12_000 + # Reported wins; total is 12,000 (not 12,000 + 19,396). + total_unemployment_compensation: 12_000 + tax_unit_unemployment_compensation: 12_000 diff --git a/policyengine_us/variables/contrib/taxsim/taxsim_pui.py b/policyengine_us/variables/contrib/taxsim/taxsim_pui.py index 4c2e77569d6..cad57b42fdb 100644 --- a/policyengine_us/variables/contrib/taxsim/taxsim_pui.py +++ b/policyengine_us/variables/contrib/taxsim/taxsim_pui.py @@ -12,5 +12,5 @@ class taxsim_pui(Variable): def formula(tax_unit, period, parameters): person = tax_unit.members is_primary = person("is_tax_unit_head", period) - unemployment_compensation = person("unemployment_compensation", period) + unemployment_compensation = person("total_unemployment_compensation", period) return tax_unit.sum(unemployment_compensation * is_primary) diff --git a/policyengine_us/variables/contrib/taxsim/taxsim_ui.py b/policyengine_us/variables/contrib/taxsim/taxsim_ui.py index c92f53b750d..75efacb838a 100644 --- a/policyengine_us/variables/contrib/taxsim/taxsim_ui.py +++ b/policyengine_us/variables/contrib/taxsim/taxsim_ui.py @@ -12,5 +12,5 @@ class taxsim_ui(Variable): def formula(tax_unit, period, parameters): person = tax_unit.members is_spouse = person("is_tax_unit_spouse", period) - unemployment_compensation = person("unemployment_compensation", period) + unemployment_compensation = person("total_unemployment_compensation", period) return tax_unit.sum(unemployment_compensation * is_spouse) diff --git a/policyengine_us/variables/gov/irs/income/dependent_gross_income.py b/policyengine_us/variables/gov/irs/income/dependent_gross_income.py index 011fadabc3d..d0193c97ffd 100644 --- a/policyengine_us/variables/gov/irs/income/dependent_gross_income.py +++ b/policyengine_us/variables/gov/irs/income/dependent_gross_income.py @@ -2,7 +2,7 @@ # Sources that depend on filing_status and would cause circular dependencies CIRCULAR_SOURCES = { - "taxable_unemployment_compensation": "unemployment_compensation", + "taxable_unemployment_compensation": "total_unemployment_compensation", "taxable_social_security": "social_security", } diff --git a/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/capped_qualified_tuition_expenses_ald.py b/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/capped_qualified_tuition_expenses_ald.py index 5ec84daea9a..7270a9cce57 100644 --- a/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/capped_qualified_tuition_expenses_ald.py +++ b/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/capped_qualified_tuition_expenses_ald.py @@ -44,7 +44,7 @@ def formula(tax_unit, period, parameters): } safe_sources = [src for src in gross_income_sources if src not in cycle_sources] if "taxable_unemployment_compensation" in gross_income_sources: - safe_sources.append("unemployment_compensation") + safe_sources.append("total_unemployment_compensation") magi = 0 for source in safe_sources: magi += not_dependent * max_(0, add(person, period, [source])) diff --git a/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/irs_gross_income/social_security/taxable_ss_magi.py b/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/irs_gross_income/social_security/taxable_ss_magi.py index 0e8a6beb1fb..6ca9ee87251 100644 --- a/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/irs_gross_income/social_security/taxable_ss_magi.py +++ b/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/irs_gross_income/social_security/taxable_ss_magi.py @@ -26,7 +26,7 @@ def formula(tax_unit, period, parameters): if "taxable_unemployment_compensation" in gross_income_sources: # Reforms which drop the UI variable from gross income should # trigger SS-related MAGI to drop it too. - income_sources_without_ss.append("unemployment_compensation") + income_sources_without_ss.append("total_unemployment_compensation") income_sources_without_ss.append("tax_exempt_interest_income") gross_income = 0 person = tax_unit.members diff --git a/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/irs_gross_income/unemployment_insurance/tax_exempt_unemployment_compensation.py b/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/irs_gross_income/unemployment_insurance/tax_exempt_unemployment_compensation.py index 6a0cfa3542d..3aac62db317 100644 --- a/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/irs_gross_income/unemployment_insurance/tax_exempt_unemployment_compensation.py +++ b/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/irs_gross_income/unemployment_insurance/tax_exempt_unemployment_compensation.py @@ -8,5 +8,5 @@ class tax_exempt_unemployment_compensation(Variable): unit = USD definition_period = YEAR - adds = ["unemployment_compensation"] + adds = ["total_unemployment_compensation"] subtracts = ["taxable_unemployment_compensation"] diff --git a/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/irs_gross_income/unemployment_insurance/tax_unit_unemployment_compensation.py b/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/irs_gross_income/unemployment_insurance/tax_unit_unemployment_compensation.py index 5a89006fb1f..9f32516cc60 100644 --- a/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/irs_gross_income/unemployment_insurance/tax_unit_unemployment_compensation.py +++ b/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/irs_gross_income/unemployment_insurance/tax_unit_unemployment_compensation.py @@ -9,4 +9,4 @@ class tax_unit_unemployment_compensation(Variable): documentation = "Combined unemployment compensation for the tax unit." definition_period = YEAR - adds = ["unemployment_compensation"] + adds = ["total_unemployment_compensation"] diff --git a/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/irs_gross_income/unemployment_insurance/taxable_unemployment_insurance.py b/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/irs_gross_income/unemployment_insurance/taxable_unemployment_insurance.py index 707baf719c0..e4d4aa53eed 100644 --- a/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/irs_gross_income/unemployment_insurance/taxable_unemployment_insurance.py +++ b/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/irs_gross_income/unemployment_insurance/taxable_unemployment_insurance.py @@ -12,12 +12,12 @@ def formula(person, period, parameters): # The taxable amount of unemployment compensation is decided at the tax # unit level, but gross income (which contains taxable UI) is person-level. # Allocate the tax unit's taxable UC to each person in proportion to their - # unemployment_compensation, so that per-person AGI reflects the actual - # recipient (required by states with combined-return optimization). + # total_unemployment_compensation, so that per-person AGI reflects the + # actual recipient (required by states with combined-return optimization). tax_unit_taxable_uc = person.tax_unit( "tax_unit_taxable_unemployment_compensation", period ) - person_uc = person("unemployment_compensation", period) + person_uc = person("total_unemployment_compensation", period) tax_unit_uc = person.tax_unit.sum(person_uc) share = where(tax_unit_uc > 0, person_uc / tax_unit_uc, 0) return tax_unit_taxable_uc * share diff --git a/policyengine_us/variables/gov/local/ca/cc/ga/eligibility/ca_cc_general_assistance_eligible_person.py b/policyengine_us/variables/gov/local/ca/cc/ga/eligibility/ca_cc_general_assistance_eligible_person.py index fb272acefb0..9291a31648c 100644 --- a/policyengine_us/variables/gov/local/ca/cc/ga/eligibility/ca_cc_general_assistance_eligible_person.py +++ b/policyengine_us/variables/gov/local/ca/cc/ga/eligibility/ca_cc_general_assistance_eligible_person.py @@ -28,7 +28,7 @@ def formula(person, period, parameters): (person("ssi", period) > 0) | person("receives_ssi", period) | (person("social_security_disability", period.this_year) > 0) - | (person("unemployment_compensation", period.this_year) > 0) + | (person("total_unemployment_compensation", period.this_year) > 0) | (person("ca_state_disability_insurance", period.this_year) > 0) ) is_head_or_spouse = person("is_tax_unit_head_or_spouse", period) diff --git a/policyengine_us/variables/gov/states/ar/dhs/medicaid/eligibility/ar_medicaid_work_requirement_eligible.py b/policyengine_us/variables/gov/states/ar/dhs/medicaid/eligibility/ar_medicaid_work_requirement_eligible.py index c19d822191b..33d9cba04ba 100644 --- a/policyengine_us/variables/gov/states/ar/dhs/medicaid/eligibility/ar_medicaid_work_requirement_eligible.py +++ b/policyengine_us/variables/gov/states/ar/dhs/medicaid/eligibility/ar_medicaid_work_requirement_eligible.py @@ -42,7 +42,7 @@ def formula(person, period, parameters): is_dependent & (is_disabled | is_blind | is_incapable_of_self_care) ) receives_unemployment_compensation = ( - person("unemployment_compensation", period) > 0 + person("total_unemployment_compensation", period) > 0 ) eligible_disabled = is_disabled | is_blind | is_incapable_of_self_care diff --git a/policyengine_us/variables/gov/states/modeled_state_unemployment_compensation.py b/policyengine_us/variables/gov/states/modeled_state_unemployment_compensation.py new file mode 100644 index 00000000000..6430636bb32 --- /dev/null +++ b/policyengine_us/variables/gov/states/modeled_state_unemployment_compensation.py @@ -0,0 +1,21 @@ +from policyengine_us.model_api import * + + +class modeled_state_unemployment_compensation(Variable): + value_type = float + entity = Person + label = "modeled state unemployment compensation" + unit = USD + documentation = ( + "Unemployment compensation computed from the modeled state " + "unemployment insurance programs." + ) + definition_period = YEAR + adds = [ + "al_ui", + "nj_unemployment_insurance", + "ny_ui", + "ok_ui", + "pa_uc", + "ut_ui", + ] diff --git a/policyengine_us/variables/gov/states/ut/tax/property/homeowner_renter_relief/ut_homeowner_renter_relief_nontaxable_income.py b/policyengine_us/variables/gov/states/ut/tax/property/homeowner_renter_relief/ut_homeowner_renter_relief_nontaxable_income.py index c883faddaf8..e658c62eba4 100644 --- a/policyengine_us/variables/gov/states/ut/tax/property/homeowner_renter_relief/ut_homeowner_renter_relief_nontaxable_income.py +++ b/policyengine_us/variables/gov/states/ut/tax/property/homeowner_renter_relief/ut_homeowner_renter_relief_nontaxable_income.py @@ -21,7 +21,7 @@ def formula(person, period, parameters): nontaxable_social_security = max_( 0, social_security - ssdi - taxable_social_security ) - unemployment_compensation = person("unemployment_compensation", period) + unemployment_compensation = person("total_unemployment_compensation", period) taxable_unemployment_compensation = person( "taxable_unemployment_compensation", period ) diff --git a/policyengine_us/variables/gov/usda/snap/eligibility/work_requirements/is_snap_work_registration_exempt_non_age.py b/policyengine_us/variables/gov/usda/snap/eligibility/work_requirements/is_snap_work_registration_exempt_non_age.py index aa55ab563ca..c89eadbc236 100644 --- a/policyengine_us/variables/gov/usda/snap/eligibility/work_requirements/is_snap_work_registration_exempt_non_age.py +++ b/policyengine_us/variables/gov/usda/snap/eligibility/work_requirements/is_snap_work_registration_exempt_non_age.py @@ -49,7 +49,7 @@ def formula(person, period, parameters): # Simplification: any UC receipt during the year exempts the person # in all months of that year, since survey data lack monthly UC # receipt histories. - receiving_ui = person("unemployment_compensation", period.this_year) > 0 + receiving_ui = person("total_unemployment_compensation", period.this_year) > 0 applied_for_ui = person("has_applied_for_unemployment_compensation", period) # (vi) Regular participant in a drug addiction or alcoholic # treatment and rehabilitation program — 7 CFR 273.7(b)(1)(vi). diff --git a/policyengine_us/variables/household/income/person/total_unemployment_compensation.py b/policyengine_us/variables/household/income/person/total_unemployment_compensation.py new file mode 100644 index 00000000000..1d65430c02c --- /dev/null +++ b/policyengine_us/variables/household/income/person/total_unemployment_compensation.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class total_unemployment_compensation(Variable): + value_type = float + entity = Person + label = "total unemployment compensation" + unit = USD + documentation = ( + "Unemployment compensation used in downstream income flows, using " + "the reported (uprated) amount when present and otherwise falling " + "back to the modeled state unemployment insurance programs." + ) + definition_period = YEAR + + def formula(person, period, parameters): + reported = person("unemployment_compensation", period) + modeled = person("modeled_state_unemployment_compensation", period) + return where(reported > 0, reported, modeled) diff --git a/policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py b/policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py index 41ead044f46..a473c2b438d 100644 --- a/policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py +++ b/policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py @@ -72,7 +72,7 @@ def formula(spm_unit, period, parameters): "wa_rca", "high_efficiency_electric_home_rebate", "residential_efficiency_electrification_rebate", - "unemployment_compensation", + "total_unemployment_compensation", # One-time energy relief payments. # Paid at the same time as the Alaska Permanent Fund Dividend, # which is part of IRS gross income. From 02fec91642cd2c7785fa43e1e70cd2a8ec29ce8a Mon Sep 17 00:00:00 2001 From: David Trimmer Date: Wed, 23 Sep 2026 14:08:07 -0400 Subject: [PATCH 2/9] Route parameter-driven UI consumers through total unemployment compensation Per review: migrate every income-source list under parameters/gov/ (SNAP, TANF, SSI, WIC, school meals, Head Start, HUD, CBO, CCAP, state tax lists and the VA subtraction) and four contrib reform benefit lists from the reported unemployment_compensation input to total_unemployment_compensation. Document the reported-zero rule, fold two always-true source appends into direct substitutions, and add low-income SNAP, NJ, asymmetric-household, monthly and reported-zero tests. Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01LqCGPgxDukji8Bhs57c5rH --- .../state-ui-income-flow-integration.added.md | 2 +- .../gov/hhs/head_start/income/sources.yaml | 2 +- .../tanf/cash/income/sources/unearned.yaml | 2 +- .../cbo_social_insurance_benefits.yaml | 2 +- .../hud/annual_income/sources/unearned.yaml | 2 +- .../countable_income/sources.yaml | 2 +- .../countable_income/sources.yaml | 2 +- .../ca/la/dwp/ez_save/income_sources.yaml | 2 +- .../ca/la/general_relief/income_sources.yaml | 2 +- .../marin/general_relief/income_sources.yaml | 2 +- .../income/sources/unearned.yaml | 2 +- .../cap/liheap/countable_income/sources.yaml | 2 +- .../cap/share/countable_income/sources.yaml | 2 +- .../income/sources/unearned.yaml | 2 +- .../income/sources/unearned.yaml | 2 +- .../countable_income/unearned_sources.yaml | 2 +- .../countable_income/sources/unearned.yaml | 2 +- .../general_assistance/income/sources.yaml | 2 +- .../property_tax_relief/income_sources.yaml | 2 +- .../gov/ssa/ssi/income/sources/unearned.yaml | 2 +- .../countable_income/unearned_sources.yaml | 2 +- .../ccsp/income/countable_income/sources.yaml | 2 +- .../states/ar/ade/oec/sra/income/sources.yaml | 2 +- .../gross_income/sources/individual.yaml | 4 +- .../income/gross_income/sources/joint.yaml | 4 +- .../ccap/income/countable_income/sources.yaml | 2 +- .../ca/cdss/child_care/income/sources.yaml | 2 +- .../gov/states/ca/cpuc/income_sources.yaml | 4 +- .../ccap/income/countable_income/sources.yaml | 2 +- .../states/co/cdhs/tanf/income/unearned.yaml | 2 +- .../ct/oec/c4k/income/unearned_sources.yaml | 2 +- .../dc/dhs/power/disqualifying_benefits.yaml | 2 +- .../dc/dhs/tanf/income/sources/unearned.yaml | 2 +- .../poc/income/countable_income/sources.yaml | 2 +- .../gov/states/fl/doe/sr/income/sources.yaml | 2 +- .../caps/income/countable_income/sources.yaml | 2 +- .../ccap/income/countable_income/sources.yaml | 2 +- .../countable_income/unearned_sources.yaml | 2 +- .../id/dhw/iccp/income/unearned_sources.yaml | 2 +- .../il/dhs/aabd/income/sources/unearned.yaml | 2 +- .../ccap/income/countable_income/sources.yaml | 2 +- .../il/dhs/tanf/income/sources/unearned.yaml | 2 +- .../eligibility/income/sources/unearned.yaml | 2 +- .../il/isbe/income/countable_sources.yaml | 2 +- .../states/in/fssa/ccdf/income/sources.yaml | 2 +- .../income/countable_income/unearned.yaml | 2 +- .../ccap/income/countable_income/sources.yaml | 2 +- .../la/ldoe/ccap/income/unearned_sources.yaml | 4 +- .../ma/dta/tcap/gross_income/unearned.yaml | 2 +- .../countable_income/sources/unearned.yaml | 6 +- .../disqualifying_programs.yaml | 4 +- .../ccs/income/countable_income/sources.yaml | 2 +- .../ccap/income/countable_income/sources.yaml | 2 +- .../me/dhhs/tanf/income/sources/unearned.yaml | 2 +- .../ccap/income/countable_income/sources.yaml | 2 +- .../mi/tax/income/household_resources.yaml | 2 +- .../income/countable_income/unearned.yaml | 2 +- .../mn/dcyf/mfip/income/sources/unearned.yaml | 2 +- .../ccs/income/countable_income/sources.yaml | 2 +- .../mo/dss/tanf/income/sources/unearned.yaml | 2 +- .../countable_income/unearned_sources.yaml | 2 +- .../eligibility/income/sources/unearned.yaml | 2 +- .../states/ms/tax/income/income_sources.yaml | 2 +- .../mt/dhs/tanf/income/sources/unearned.yaml | 2 +- .../ccap/income/countable_income/sources.yaml | 2 +- .../states/nc/ncdhhs/scca/income/sources.yaml | 2 +- .../nc/ncdhhs/tanf/income/unearned.yaml | 2 +- .../states/nd/dhs/ccap/income/sources.yaml | 2 +- .../nd/dhs/tanf/income/sources/unearned.yaml | 2 +- .../renters_refund/income_sources.yaml | 2 +- .../income/sources/unearned.yaml | 2 +- .../ccap/income/countable_income/sources.yaml | 2 +- .../countable_income/unearned_sources.yaml | 2 +- .../nm/tax/income/modified_gross_income.yaml | 2 +- .../ccdp/income/countable_income/sources.yaml | 2 +- .../ccap/income/countable_income/sources.yaml | 2 +- .../ccap/income/countable_income/sources.yaml | 2 +- .../gov/states/ok/dhs/ccs/income/sources.yaml | 2 +- .../income/credits/gross_income_sources.yaml | 2 +- .../erdc/income/countable_income/sources.yaml | 2 +- .../ccw/income/countable_income/sources.yaml | 2 +- .../ccap/income/countable_income/sources.yaml | 2 +- .../ccap/income/countable_income/sources.yaml | 2 +- .../gov/states/sd/dss/cca/income/sources.yaml | 2 +- .../tx/fpp/income/sources/unearned.yaml | 2 +- .../tx/tanf/income/sources/unearned.yaml | 2 +- .../states/tx/tdhca/ceap/income/sources.yaml | 2 +- .../ut/dwf/ccap/income/sources/unearned.yaml | 2 +- .../countable_income/unearned_sources.yaml | 2 +- .../tax/income/subtractions/subtractions.yaml | 2 +- .../states/vt/dcf/ccfap/income/sources.yaml | 2 +- .../states/wa/dcyf/eceap/income_sources.yaml | 2 +- .../gov/states/wa/dcyf/wccc/sources.yaml | 2 +- .../states/wi/dcf/shares/income/sources.yaml | 2 +- .../ccap/income/countable_income/sources.yaml | 2 +- .../ccap/income/countable_income/sources.yaml | 2 +- .../wy/dfs/power/income/sources/unearned.yaml | 2 +- .../gov/usda/school_meals/income/sources.yaml | 2 +- .../usda/snap/income/sources/unearned.yaml | 2 +- .../gov/usda/snap/work_requirements/README.md | 6 +- .../gov/usda/wic/income/sources.yaml | 2 +- .../boost/boost_middle_class_tax_credit.py | 4 +- .../edaa_end_child_poverty_act.py | 2 +- .../congress/tlaib/end_child_poverty_act.py | 4 +- .../reforms/states/tx/rebate/tx_rebate.py | 2 +- .../total_unemployment_compensation.yaml | 296 ++++++++++++++++++ .../income/spm_unit/spm_unit_benefits.yaml | 32 ++ .../capped_qualified_tuition_expenses_ald.py | 18 +- .../social_security/taxable_ss_magi.py | 18 +- .../ny/dol/unemployment_insurance/ny_ui.py | 4 +- .../person/total_unemployment_compensation.py | 6 +- 111 files changed, 471 insertions(+), 135 deletions(-) create mode 100644 policyengine_us/tests/policy/baseline/household/income/person/total_unemployment_compensation.yaml diff --git a/changelog.d/state-ui-income-flow-integration.added.md b/changelog.d/state-ui-income-flow-integration.added.md index 4df888cf91a..10135eeb06d 100644 --- a/changelog.d/state-ui-income-flow-integration.added.md +++ b/changelog.d/state-ui-income-flow-integration.added.md @@ -1 +1 @@ -Integrated modeled Alabama, New York, Oklahoma, Pennsylvania, and Utah unemployment insurance into unemployment compensation income flows. +Integrated modeled Alabama, New Jersey, New York, Oklahoma, Pennsylvania, and Utah unemployment insurance into unemployment compensation income flows, including federal and state taxes, SNAP, TANF, SSI, WIC, school meals, Head Start, HUD, child care, and other means-tested program income sources. diff --git a/policyengine_us/parameters/gov/hhs/head_start/income/sources.yaml b/policyengine_us/parameters/gov/hhs/head_start/income/sources.yaml index b77dc933bef..321dfb5f414 100644 --- a/policyengine_us/parameters/gov/hhs/head_start/income/sources.yaml +++ b/policyengine_us/parameters/gov/hhs/head_start/income/sources.yaml @@ -6,7 +6,7 @@ values: - employment_income # Business income. - self_employment_income - - unemployment_compensation + - total_unemployment_compensation # Pension or annuity payments. - pension_income # Military income. The exclusions for hostile fire or imminent danger diff --git a/policyengine_us/parameters/gov/hhs/tanf/cash/income/sources/unearned.yaml b/policyengine_us/parameters/gov/hhs/tanf/cash/income/sources/unearned.yaml index fa1ccf3f9dd..99639e2b9e0 100644 --- a/policyengine_us/parameters/gov/hhs/tanf/cash/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/hhs/tanf/cash/income/sources/unearned.yaml @@ -11,7 +11,7 @@ values: - interest_income - miscellaneous_income - pension_income - - unemployment_compensation + - total_unemployment_compensation - gi_cash_assistance - social_security diff --git a/policyengine_us/parameters/gov/household/cbo_social_insurance_benefits.yaml b/policyengine_us/parameters/gov/household/cbo_social_insurance_benefits.yaml index ac597fb7156..340ddec03b1 100644 --- a/policyengine_us/parameters/gov/household/cbo_social_insurance_benefits.yaml +++ b/policyengine_us/parameters/gov/household/cbo_social_insurance_benefits.yaml @@ -3,7 +3,7 @@ values: 0000-01-01: - social_security - medicare_gross_cost - - unemployment_compensation + - total_unemployment_compensation - workers_compensation metadata: diff --git a/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml b/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml index d2b2bbd8675..0df11213631 100644 --- a/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml @@ -20,7 +20,7 @@ values: - social_security - ssi - general_assistance - - unemployment_compensation + - total_unemployment_compensation - child_support_received - veterans_benefits # - workers_compensation: excluded per 24 CFR 5.609(b)(5) — insurance diff --git a/policyengine_us/parameters/gov/local/ca/ala/general_assistance/countable_income/sources.yaml b/policyengine_us/parameters/gov/local/ca/ala/general_assistance/countable_income/sources.yaml index e0e037067d4..c65adafb8ea 100644 --- a/policyengine_us/parameters/gov/local/ca/ala/general_assistance/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/local/ca/ala/general_assistance/countable_income/sources.yaml @@ -5,7 +5,7 @@ values: - self_employment_income - sstb_self_employment_income - social_security - - unemployment_compensation + - total_unemployment_compensation - veterans_benefits metadata: diff --git a/policyengine_us/parameters/gov/local/ca/cc/general_assistance/countable_income/sources.yaml b/policyengine_us/parameters/gov/local/ca/cc/general_assistance/countable_income/sources.yaml index 8f185220190..3f4caafb6b8 100644 --- a/policyengine_us/parameters/gov/local/ca/cc/general_assistance/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/local/ca/cc/general_assistance/countable_income/sources.yaml @@ -5,7 +5,7 @@ values: - self_employment_income - sstb_self_employment_income - social_security - - unemployment_compensation + - total_unemployment_compensation - veterans_benefits metadata: diff --git a/policyengine_us/parameters/gov/local/ca/la/dwp/ez_save/income_sources.yaml b/policyengine_us/parameters/gov/local/ca/la/dwp/ez_save/income_sources.yaml index 934d141459e..47fca887a48 100644 --- a/policyengine_us/parameters/gov/local/ca/la/dwp/ez_save/income_sources.yaml +++ b/policyengine_us/parameters/gov/local/ca/la/dwp/ez_save/income_sources.yaml @@ -19,5 +19,5 @@ values: - tanf - snap - veterans_benefits - - unemployment_compensation + - total_unemployment_compensation - pension_income diff --git a/policyengine_us/parameters/gov/local/ca/la/general_relief/income_sources.yaml b/policyengine_us/parameters/gov/local/ca/la/general_relief/income_sources.yaml index 5406060c67f..9e7d684cd95 100644 --- a/policyengine_us/parameters/gov/local/ca/la/general_relief/income_sources.yaml +++ b/policyengine_us/parameters/gov/local/ca/la/general_relief/income_sources.yaml @@ -4,7 +4,7 @@ values: # Veterans benefits. - veterans_benefits # Unemployment Insurance Benefits (UIB) : - - unemployment_compensation # match? + - total_unemployment_compensation # match? - ca_state_disability_insurance # Income from a job of any type. - irs_employment_income diff --git a/policyengine_us/parameters/gov/local/ca/marin/general_relief/income_sources.yaml b/policyengine_us/parameters/gov/local/ca/marin/general_relief/income_sources.yaml index a98b181f24c..89e750c73b0 100644 --- a/policyengine_us/parameters/gov/local/ca/marin/general_relief/income_sources.yaml +++ b/policyengine_us/parameters/gov/local/ca/marin/general_relief/income_sources.yaml @@ -17,7 +17,7 @@ values: - retirement_distributions - railroad_benefits # Unemployment Insurance Benefits. - - unemployment_compensation + - total_unemployment_compensation # State Disability Insurance. - ca_state_disability_insurance # Disability and workers' compensation benefits. diff --git a/policyengine_us/parameters/gov/local/ca/oc/general_relief/income/sources/unearned.yaml b/policyengine_us/parameters/gov/local/ca/oc/general_relief/income/sources/unearned.yaml index 3ccc6d270eb..e5f2a7cf212 100644 --- a/policyengine_us/parameters/gov/local/ca/oc/general_relief/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/local/ca/oc/general_relief/income/sources/unearned.yaml @@ -5,7 +5,7 @@ values: - interest_income - dividend_income - social_security - - unemployment_compensation + - total_unemployment_compensation - ca_state_disability_insurance - veterans_benefits - pension_income diff --git a/policyengine_us/parameters/gov/local/ca/riv/cap/liheap/countable_income/sources.yaml b/policyengine_us/parameters/gov/local/ca/riv/cap/liheap/countable_income/sources.yaml index 4af53d25288..79d37505ec9 100644 --- a/policyengine_us/parameters/gov/local/ca/riv/cap/liheap/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/local/ca/riv/cap/liheap/countable_income/sources.yaml @@ -7,7 +7,7 @@ values: - alimony_income - child_support_received - pension_income - - unemployment_compensation + - total_unemployment_compensation - social_security - ssi - ca_tanf diff --git a/policyengine_us/parameters/gov/local/ca/riv/cap/share/countable_income/sources.yaml b/policyengine_us/parameters/gov/local/ca/riv/cap/share/countable_income/sources.yaml index adde7842456..ee6ff9269d7 100644 --- a/policyengine_us/parameters/gov/local/ca/riv/cap/share/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/local/ca/riv/cap/share/countable_income/sources.yaml @@ -7,7 +7,7 @@ values: - alimony_income - child_support_received - pension_income - - unemployment_compensation + - total_unemployment_compensation - social_security - ssi - ca_tanf diff --git a/policyengine_us/parameters/gov/local/ca/riv/general_relief/income/sources/unearned.yaml b/policyengine_us/parameters/gov/local/ca/riv/general_relief/income/sources/unearned.yaml index 08089f0f9de..aa522efd584 100644 --- a/policyengine_us/parameters/gov/local/ca/riv/general_relief/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/local/ca/riv/general_relief/income/sources/unearned.yaml @@ -5,7 +5,7 @@ values: - interest_income - social_security - ca_state_disability_insurance - - unemployment_compensation + - total_unemployment_compensation - veterans_benefits # assistance from other programs # benefits from life insurance or burial payments diff --git a/policyengine_us/parameters/gov/local/ca/sbd/general_relief/income/sources/unearned.yaml b/policyengine_us/parameters/gov/local/ca/sbd/general_relief/income/sources/unearned.yaml index df206f326f7..c97d5469501 100644 --- a/policyengine_us/parameters/gov/local/ca/sbd/general_relief/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/local/ca/sbd/general_relief/income/sources/unearned.yaml @@ -8,7 +8,7 @@ values: # Social Security retirement, survivors, and disability benefits. - social_security # Unemployment Insurance Benefits. - - unemployment_compensation + - total_unemployment_compensation # State Disability Insurance. - ca_state_disability_insurance # Disability and workers' compensation benefits. diff --git a/policyengine_us/parameters/gov/local/ca/scc/general_assistance/countable_income/unearned_sources.yaml b/policyengine_us/parameters/gov/local/ca/scc/general_assistance/countable_income/unearned_sources.yaml index eee5cbcc950..5783e6aa911 100644 --- a/policyengine_us/parameters/gov/local/ca/scc/general_assistance/countable_income/unearned_sources.yaml +++ b/policyengine_us/parameters/gov/local/ca/scc/general_assistance/countable_income/unearned_sources.yaml @@ -5,7 +5,7 @@ values: - ca_state_disability_insurance - disability_benefits - railroad_benefits - - unemployment_compensation + - total_unemployment_compensation - veterans_benefits - workers_compensation - taxable_pension_income diff --git a/policyengine_us/parameters/gov/local/ca/sf/caap/countable_income/sources/unearned.yaml b/policyengine_us/parameters/gov/local/ca/sf/caap/countable_income/sources/unearned.yaml index 84f0a2b3b51..89c0a7b841e 100644 --- a/policyengine_us/parameters/gov/local/ca/sf/caap/countable_income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/local/ca/sf/caap/countable_income/sources/unearned.yaml @@ -2,7 +2,7 @@ description: San Francisco County counts these unearned income sources under the values: 2017-01-01: - social_security - - unemployment_compensation + - total_unemployment_compensation - veterans_benefits - pension_income - child_support_received diff --git a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/income/sources.yaml b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/income/sources.yaml index 4e97b6ff8d5..19555039689 100644 --- a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/income/sources.yaml +++ b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/income/sources.yaml @@ -4,7 +4,7 @@ values: - employment_income - self_employment_income - sstb_self_employment_income - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - disability_benefits - ca_state_disability_insurance diff --git a/policyengine_us/parameters/gov/local/co/denver/dhs/property_tax_relief/income_sources.yaml b/policyengine_us/parameters/gov/local/co/denver/dhs/property_tax_relief/income_sources.yaml index 4363f021253..7cf94b56cc4 100644 --- a/policyengine_us/parameters/gov/local/co/denver/dhs/property_tax_relief/income_sources.yaml +++ b/policyengine_us/parameters/gov/local/co/denver/dhs/property_tax_relief/income_sources.yaml @@ -12,7 +12,7 @@ values: - interest_income - dividend_income - workers_compensation - - unemployment_compensation + - total_unemployment_compensation metadata: diff --git a/policyengine_us/parameters/gov/ssa/ssi/income/sources/unearned.yaml b/policyengine_us/parameters/gov/ssa/ssi/income/sources/unearned.yaml index 1f9c23e14ef..31f8890c835 100644 --- a/policyengine_us/parameters/gov/ssa/ssi/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/ssa/ssi/income/sources/unearned.yaml @@ -8,7 +8,7 @@ values: - veterans_benefits - survivor_benefits - workers_compensation - - unemployment_compensation + - total_unemployment_compensation - retirement_distributions - gi_cash_assistance # (b) Alimony and support payments. diff --git a/policyengine_us/parameters/gov/states/ak/dpa/ccap/income/countable_income/unearned_sources.yaml b/policyengine_us/parameters/gov/states/ak/dpa/ccap/income/countable_income/unearned_sources.yaml index f9e42af5ebf..61649b1c299 100644 --- a/policyengine_us/parameters/gov/states/ak/dpa/ccap/income/countable_income/unearned_sources.yaml +++ b/policyengine_us/parameters/gov/states/ak/dpa/ccap/income/countable_income/unearned_sources.yaml @@ -11,7 +11,7 @@ values: - alimony_income - social_security - ssi - - unemployment_compensation + - total_unemployment_compensation - veterans_benefits - rental_income - pension_income diff --git a/policyengine_us/parameters/gov/states/al/dhr/ccsp/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/al/dhr/ccsp/income/countable_income/sources.yaml index 2feb93e5c50..93102a0af62 100644 --- a/policyengine_us/parameters/gov/states/al/dhr/ccsp/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/al/dhr/ccsp/income/countable_income/sources.yaml @@ -6,7 +6,7 @@ values: - farm_operations_income - social_security - pension_income - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - ssi - al_ssp diff --git a/policyengine_us/parameters/gov/states/ar/ade/oec/sra/income/sources.yaml b/policyengine_us/parameters/gov/states/ar/ade/oec/sra/income/sources.yaml index fcdfecd2200..c8e03ed83dd 100644 --- a/policyengine_us/parameters/gov/states/ar/ade/oec/sra/income/sources.yaml +++ b/policyengine_us/parameters/gov/states/ar/ade/oec/sra/income/sources.yaml @@ -7,7 +7,7 @@ values: - social_security_disability - social_security_survivors - ssi - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - alimony_income - pension_income diff --git a/policyengine_us/parameters/gov/states/ar/tax/income/gross_income/sources/individual.yaml b/policyengine_us/parameters/gov/states/ar/tax/income/gross_income/sources/individual.yaml index fda2ae79246..65f36207feb 100644 --- a/policyengine_us/parameters/gov/states/ar/tax/income/gross_income/sources/individual.yaml +++ b/policyengine_us/parameters/gov/states/ar/tax/income/gross_income/sources/individual.yaml @@ -18,7 +18,7 @@ values: - disability_benefits # Line 18b - rental_income # Line 19 - farm_rent_income # Line 20 - - unemployment_compensation # Line 21 + - total_unemployment_compensation # Line 21 2020-01-01: - irs_employment_income # Line 8 - self_employment_income # Line 8 @@ -53,7 +53,7 @@ values: - disability_benefits # Line 18b - rental_income # Line 19 - farm_rent_income # Line 20 - - unemployment_compensation # Line 21 + - total_unemployment_compensation # Line 21 metadata: unit: list diff --git a/policyengine_us/parameters/gov/states/ar/tax/income/gross_income/sources/joint.yaml b/policyengine_us/parameters/gov/states/ar/tax/income/gross_income/sources/joint.yaml index c9631d11ac3..ef18054efef 100644 --- a/policyengine_us/parameters/gov/states/ar/tax/income/gross_income/sources/joint.yaml +++ b/policyengine_us/parameters/gov/states/ar/tax/income/gross_income/sources/joint.yaml @@ -18,7 +18,7 @@ values: - disability_benefits # Line 18b - rental_income # Line 19 - farm_rent_income # Line 20 - - unemployment_compensation # Line 21 + - total_unemployment_compensation # Line 21 2020-01-01: - irs_employment_income # Line 8 - self_employment_income # Line 8 @@ -53,7 +53,7 @@ values: - disability_benefits # Line 18b - rental_income # Line 19 - farm_rent_income # Line 20 - - unemployment_compensation # Line 21 + - total_unemployment_compensation # Line 21 metadata: unit: list diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/countable_income/sources.yaml index f49fe943561..c6c8df574b8 100644 --- a/policyengine_us/parameters/gov/states/az/hhs/ccap/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/countable_income/sources.yaml @@ -5,7 +5,7 @@ values: - self_employment_income - sstb_self_employment_income - farm_operations_income - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - child_support_received - alimony_income diff --git a/policyengine_us/parameters/gov/states/ca/cdss/child_care/income/sources.yaml b/policyengine_us/parameters/gov/states/ca/cdss/child_care/income/sources.yaml index 3803425d6d0..9810ac7b91f 100644 --- a/policyengine_us/parameters/gov/states/ca/cdss/child_care/income/sources.yaml +++ b/policyengine_us/parameters/gov/states/ca/cdss/child_care/income/sources.yaml @@ -9,7 +9,7 @@ values: # Public assistance - ca_tanf # Unemployment and disability - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - ca_state_disability_insurance # Social Security (excluding SSI) diff --git a/policyengine_us/parameters/gov/states/ca/cpuc/income_sources.yaml b/policyengine_us/parameters/gov/states/ca/cpuc/income_sources.yaml index 066d595d891..e59d4ae7935 100644 --- a/policyengine_us/parameters/gov/states/ca/cpuc/income_sources.yaml +++ b/policyengine_us/parameters/gov/states/ca/cpuc/income_sources.yaml @@ -85,7 +85,7 @@ values: - farm_rent_income # Other income sources (from whatever sources derived) - capital_gains - - unemployment_compensation + - total_unemployment_compensation - miscellaneous_income - gi_cash_assistance - debt_relief @@ -126,7 +126,7 @@ values: - farm_rent_income # Other income sources (from whatever sources derived) - capital_gains - - unemployment_compensation + - total_unemployment_compensation - miscellaneous_income - gi_cash_assistance - debt_relief diff --git a/policyengine_us/parameters/gov/states/co/ccap/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/co/ccap/income/countable_income/sources.yaml index 601cbc2e4cc..45e866cdfe4 100644 --- a/policyengine_us/parameters/gov/states/co/ccap/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/co/ccap/income/countable_income/sources.yaml @@ -11,7 +11,7 @@ values: - pension_income - retirement_distributions - military_retirement_pay - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - child_support_received - alimony_income diff --git a/policyengine_us/parameters/gov/states/co/cdhs/tanf/income/unearned.yaml b/policyengine_us/parameters/gov/states/co/cdhs/tanf/income/unearned.yaml index eb09d81b0c0..b027d8b0036 100644 --- a/policyengine_us/parameters/gov/states/co/cdhs/tanf/income/unearned.yaml +++ b/policyengine_us/parameters/gov/states/co/cdhs/tanf/income/unearned.yaml @@ -8,7 +8,7 @@ values: - interest_income - miscellaneous_income - pension_income - - unemployment_compensation + - total_unemployment_compensation - gi_cash_assistance - social_security - workers_compensation diff --git a/policyengine_us/parameters/gov/states/ct/oec/c4k/income/unearned_sources.yaml b/policyengine_us/parameters/gov/states/ct/oec/c4k/income/unearned_sources.yaml index 005131a15bf..d23fc3299bc 100644 --- a/policyengine_us/parameters/gov/states/ct/oec/c4k/income/unearned_sources.yaml +++ b/policyengine_us/parameters/gov/states/ct/oec/c4k/income/unearned_sources.yaml @@ -3,7 +3,7 @@ values: 2020-01-01: - social_security - pension_income - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - alimony_income - rental_income diff --git a/policyengine_us/parameters/gov/states/dc/dhs/power/disqualifying_benefits.yaml b/policyengine_us/parameters/gov/states/dc/dhs/power/disqualifying_benefits.yaml index 852e03053f6..03f1d73a3f7 100644 --- a/policyengine_us/parameters/gov/states/dc/dhs/power/disqualifying_benefits.yaml +++ b/policyengine_us/parameters/gov/states/dc/dhs/power/disqualifying_benefits.yaml @@ -4,7 +4,7 @@ values: - dc_tanf - ssi - receives_ssi # Reported SSI receipt, for people the model gives a $0 payment. - - unemployment_compensation + - total_unemployment_compensation metadata: label: DC POWER disqualifying benefits diff --git a/policyengine_us/parameters/gov/states/dc/dhs/tanf/income/sources/unearned.yaml b/policyengine_us/parameters/gov/states/dc/dhs/tanf/income/sources/unearned.yaml index 967168a5a6a..97c6a8abfc0 100644 --- a/policyengine_us/parameters/gov/states/dc/dhs/tanf/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/states/dc/dhs/tanf/income/sources/unearned.yaml @@ -9,7 +9,7 @@ values: - interest_income - miscellaneous_income - pension_income - - unemployment_compensation + - total_unemployment_compensation - gi_cash_assistance # D.C. Code 4-205.05(4) counts District and federal public assistance payments - general_assistance diff --git a/policyengine_us/parameters/gov/states/de/dss/poc/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/de/dss/poc/income/countable_income/sources.yaml index 0a4bc293eed..5ee078fd76a 100644 --- a/policyengine_us/parameters/gov/states/de/dss/poc/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/de/dss/poc/income/countable_income/sources.yaml @@ -14,7 +14,7 @@ values: - pension_income - veterans_benefits - military_retirement_pay - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - alimony_income - child_support_received diff --git a/policyengine_us/parameters/gov/states/fl/doe/sr/income/sources.yaml b/policyengine_us/parameters/gov/states/fl/doe/sr/income/sources.yaml index e3dd84c45e6..de99ddf33e4 100644 --- a/policyengine_us/parameters/gov/states/fl/doe/sr/income/sources.yaml +++ b/policyengine_us/parameters/gov/states/fl/doe/sr/income/sources.yaml @@ -15,7 +15,7 @@ values: - social_security_disability - social_security_survivors - ssi - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - alimony_income - child_support_received diff --git a/policyengine_us/parameters/gov/states/ga/decal/caps/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/ga/decal/caps/income/countable_income/sources.yaml index 3cfe537b440..8eaf3acc5c7 100644 --- a/policyengine_us/parameters/gov/states/ga/decal/caps/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/ga/decal/caps/income/countable_income/sources.yaml @@ -3,7 +3,7 @@ values: 2026-03-02: - employment_income - self_employment_income - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - alimony_income - child_support_received diff --git a/policyengine_us/parameters/gov/states/hi/bessd/ccap/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/hi/bessd/ccap/income/countable_income/sources.yaml index 63eaaa2b789..c733afb8bb8 100644 --- a/policyengine_us/parameters/gov/states/hi/bessd/ccap/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/hi/bessd/ccap/income/countable_income/sources.yaml @@ -18,7 +18,7 @@ values: # Military retirement pay maps to HAR 17-798.2-10(b) item (5) # (pensions and annuities), not item (7) (allotments). - military_retirement_pay - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - alimony_income - child_support_received diff --git a/policyengine_us/parameters/gov/states/ia/hhs/cca/income/countable_income/unearned_sources.yaml b/policyengine_us/parameters/gov/states/ia/hhs/cca/income/countable_income/unearned_sources.yaml index 7e24009bf25..c4371a853cf 100644 --- a/policyengine_us/parameters/gov/states/ia/hhs/cca/income/countable_income/unearned_sources.yaml +++ b/policyengine_us/parameters/gov/states/ia/hhs/cca/income/countable_income/unearned_sources.yaml @@ -8,7 +8,7 @@ values: - interest_income # includes taxable and tax-exempt interest - estate_income # estate and trust income - rental_income # net rental and royalty income - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - alimony_income - child_support_received diff --git a/policyengine_us/parameters/gov/states/id/dhw/iccp/income/unearned_sources.yaml b/policyengine_us/parameters/gov/states/id/dhw/iccp/income/unearned_sources.yaml index a538dd5155f..12e40cf6110 100644 --- a/policyengine_us/parameters/gov/states/id/dhw/iccp/income/unearned_sources.yaml +++ b/policyengine_us/parameters/gov/states/id/dhw/iccp/income/unearned_sources.yaml @@ -6,7 +6,7 @@ values: - ssi - pension_income - military_retirement_pay - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - veterans_benefits - child_support_received diff --git a/policyengine_us/parameters/gov/states/il/dhs/aabd/income/sources/unearned.yaml b/policyengine_us/parameters/gov/states/il/dhs/aabd/income/sources/unearned.yaml index 9cec29b5902..c6b56325250 100644 --- a/policyengine_us/parameters/gov/states/il/dhs/aabd/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/states/il/dhs/aabd/income/sources/unearned.yaml @@ -7,7 +7,7 @@ values: - disability_benefits #- veterans_benefits # exempt - workers_compensation - - unemployment_compensation + - total_unemployment_compensation - retirement_distributions #- gi_cash_assistance # exempt - alimony_income diff --git a/policyengine_us/parameters/gov/states/il/dhs/ccap/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/il/dhs/ccap/income/countable_income/sources.yaml index 4ac487f47d4..d00ce984f0c 100644 --- a/policyengine_us/parameters/gov/states/il/dhs/ccap/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/il/dhs/ccap/income/countable_income/sources.yaml @@ -10,7 +10,7 @@ values: - interest_income - pension_income - veterans_benefits - - unemployment_compensation + - total_unemployment_compensation - workers_compensation metadata: diff --git a/policyengine_us/parameters/gov/states/il/dhs/tanf/income/sources/unearned.yaml b/policyengine_us/parameters/gov/states/il/dhs/tanf/income/sources/unearned.yaml index 9592926035c..6001fca05d5 100644 --- a/policyengine_us/parameters/gov/states/il/dhs/tanf/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/states/il/dhs/tanf/income/sources/unearned.yaml @@ -4,7 +4,7 @@ values: - social_security - disability_benefits - workers_compensation - - unemployment_compensation + - total_unemployment_compensation - retirement_distributions - alimony_income - dividend_income diff --git a/policyengine_us/parameters/gov/states/il/hfs/hbwd/eligibility/income/sources/unearned.yaml b/policyengine_us/parameters/gov/states/il/hfs/hbwd/eligibility/income/sources/unearned.yaml index f056d1b67c2..c284e580cd6 100644 --- a/policyengine_us/parameters/gov/states/il/hfs/hbwd/eligibility/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/states/il/hfs/hbwd/eligibility/income/sources/unearned.yaml @@ -4,7 +4,7 @@ values: - social_security - disability_benefits - workers_compensation - - unemployment_compensation + - total_unemployment_compensation - retirement_distributions - alimony_income - dividend_income diff --git a/policyengine_us/parameters/gov/states/il/isbe/income/countable_sources.yaml b/policyengine_us/parameters/gov/states/il/isbe/income/countable_sources.yaml index 711fac9039b..1396bad9071 100644 --- a/policyengine_us/parameters/gov/states/il/isbe/income/countable_sources.yaml +++ b/policyengine_us/parameters/gov/states/il/isbe/income/countable_sources.yaml @@ -15,7 +15,7 @@ values: - veterans_benefits - disability_benefits - workers_compensation - - unemployment_compensation + - total_unemployment_compensation - strike_benefits # Excluded: snap, wic, tanf (welfare benefits) # Excluded: Federal education benefits, foster payments diff --git a/policyengine_us/parameters/gov/states/in/fssa/ccdf/income/sources.yaml b/policyengine_us/parameters/gov/states/in/fssa/ccdf/income/sources.yaml index e2b6df11f04..5b85352a045 100644 --- a/policyengine_us/parameters/gov/states/in/fssa/ccdf/income/sources.yaml +++ b/policyengine_us/parameters/gov/states/in/fssa/ccdf/income/sources.yaml @@ -11,7 +11,7 @@ values: # separately to avoid double-counting Social Security Disability Insurance. - social_security - ssi - - unemployment_compensation + - total_unemployment_compensation - veterans_benefits - workers_compensation - child_support_received diff --git a/policyengine_us/parameters/gov/states/ks/dcf/ccap/income/countable_income/unearned.yaml b/policyengine_us/parameters/gov/states/ks/dcf/ccap/income/countable_income/unearned.yaml index 50b11cae85f..7bba9cc3664 100644 --- a/policyengine_us/parameters/gov/states/ks/dcf/ccap/income/countable_income/unearned.yaml +++ b/policyengine_us/parameters/gov/states/ks/dcf/ccap/income/countable_income/unearned.yaml @@ -3,7 +3,7 @@ values: 2021-07-01: # Unearned income (KEESM 6200): benefits, pensions, settlements. - social_security - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - pension_income # PolicyEngine records military retirement separately from pension_income, diff --git a/policyengine_us/parameters/gov/states/ky/dcbs/ccap/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/ky/dcbs/ccap/income/countable_income/sources.yaml index 7a82aa1c49f..190603ab63b 100644 --- a/policyengine_us/parameters/gov/states/ky/dcbs/ccap/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/ky/dcbs/ccap/income/countable_income/sources.yaml @@ -5,7 +5,7 @@ values: - self_employment_income - farm_operations_income - social_security - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - pension_income - alimony_income diff --git a/policyengine_us/parameters/gov/states/la/ldoe/ccap/income/unearned_sources.yaml b/policyengine_us/parameters/gov/states/la/ldoe/ccap/income/unearned_sources.yaml index 598764d4ba2..668df3bbe46 100644 --- a/policyengine_us/parameters/gov/states/la/ldoe/ccap/income/unearned_sources.yaml +++ b/policyengine_us/parameters/gov/states/la/ldoe/ccap/income/unearned_sources.yaml @@ -6,7 +6,7 @@ values: - veterans_benefits - pension_income - disability_benefits - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - child_support_received - alimony_income @@ -19,7 +19,7 @@ values: - veterans_benefits - pension_income - disability_benefits - - unemployment_compensation + - total_unemployment_compensation - workers_compensation metadata: diff --git a/policyengine_us/parameters/gov/states/ma/dta/tcap/gross_income/unearned.yaml b/policyengine_us/parameters/gov/states/ma/dta/tcap/gross_income/unearned.yaml index a6f04e3fa87..9ece76780b1 100644 --- a/policyengine_us/parameters/gov/states/ma/dta/tcap/gross_income/unearned.yaml +++ b/policyengine_us/parameters/gov/states/ma/dta/tcap/gross_income/unearned.yaml @@ -4,7 +4,7 @@ values: - dividend_income - interest_income - social_security - - unemployment_compensation + - total_unemployment_compensation - veterans_benefits - pension_income diff --git a/policyengine_us/parameters/gov/states/ma/eec/ccfa/income/countable_income/sources/unearned.yaml b/policyengine_us/parameters/gov/states/ma/eec/ccfa/income/countable_income/sources/unearned.yaml index 01907fcbd30..f1605c7c34f 100644 --- a/policyengine_us/parameters/gov/states/ma/eec/ccfa/income/countable_income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/states/ma/eec/ccfa/income/countable_income/sources/unearned.yaml @@ -13,7 +13,7 @@ values: - child_support_received - social_security - ssi - - unemployment_compensation + - total_unemployment_compensation - workers_compensation # Effective October 1, 2023, the interim policies exclude Social Security # (all types), SSI, child support, and veterans disability benefits, and @@ -27,7 +27,7 @@ values: - pension_income - military_retirement_pay - alimony_income - - unemployment_compensation + - total_unemployment_compensation - workers_compensation 2025-04-01: - farm_rent_income @@ -37,7 +37,7 @@ values: - pension_income - military_retirement_pay - alimony_income - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - pfml_benefits metadata: diff --git a/policyengine_us/parameters/gov/states/ma/tax/income/credits/covid_19_essential_employee_premium_pay_program/disqualifying_programs.yaml b/policyengine_us/parameters/gov/states/ma/tax/income/credits/covid_19_essential_employee_premium_pay_program/disqualifying_programs.yaml index 217e5db9e48..ecd36a949af 100644 --- a/policyengine_us/parameters/gov/states/ma/tax/income/credits/covid_19_essential_employee_premium_pay_program/disqualifying_programs.yaml +++ b/policyengine_us/parameters/gov/states/ma/tax/income/credits/covid_19_essential_employee_premium_pay_program/disqualifying_programs.yaml @@ -1,11 +1,11 @@ description: Disqualifying programs for Massachusetts COVID-19 Essential Employee Premium Pay Program. values: 2020-01-01: - - unemployment_compensation + - total_unemployment_compensation # Not implemented: # "If you are an employee of the Commonwealth’s Executive Branch, received a one-time COVID-related payment from the Commonwealth as your employer." 2021-01-01: - - unemployment_compensation + - total_unemployment_compensation - claimed_ma_covid_19_essential_employee_premium_pay_program_2020 metadata: unit: list diff --git a/policyengine_us/parameters/gov/states/md/msde/ccs/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/md/msde/ccs/income/countable_income/sources.yaml index c3e5098bf1e..603fc7587e5 100644 --- a/policyengine_us/parameters/gov/states/md/msde/ccs/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/md/msde/ccs/income/countable_income/sources.yaml @@ -11,7 +11,7 @@ values: - rental_income - alimony_income - child_support_received - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - veterans_benefits - disability_benefits diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/income/countable_income/sources.yaml index d8e9d88e573..83352d72d77 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/income/countable_income/sources.yaml @@ -17,7 +17,7 @@ values: # circular dependency: tanf → childcare_expenses → me_ccap → me_ccap_countable_income → tanf - veterans_benefits - military_retirement_pay - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - interest_income - dividend_income diff --git a/policyengine_us/parameters/gov/states/me/dhhs/tanf/income/sources/unearned.yaml b/policyengine_us/parameters/gov/states/me/dhhs/tanf/income/sources/unearned.yaml index 77ce6beea62..26af4399f38 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/tanf/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/tanf/income/sources/unearned.yaml @@ -15,7 +15,7 @@ values: - interest_income - miscellaneous_income - pension_income - - unemployment_compensation + - total_unemployment_compensation - gi_cash_assistance - social_security # Chapter III, Section B(2)(d) excludes General Assistance, so diff --git a/policyengine_us/parameters/gov/states/mi/mdhhs/ccap/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/mi/mdhhs/ccap/income/countable_income/sources.yaml index d8cef00f31f..d515ea88d3d 100644 --- a/policyengine_us/parameters/gov/states/mi/mdhhs/ccap/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/mi/mdhhs/ccap/income/countable_income/sources.yaml @@ -14,7 +14,7 @@ values: - pension_income - veterans_benefits - military_retirement_pay - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - alimony_income - child_support_received diff --git a/policyengine_us/parameters/gov/states/mi/tax/income/household_resources.yaml b/policyengine_us/parameters/gov/states/mi/tax/income/household_resources.yaml index d767f2da36c..bb68e84477b 100644 --- a/policyengine_us/parameters/gov/states/mi/tax/income/household_resources.yaml +++ b/policyengine_us/parameters/gov/states/mi/tax/income/household_resources.yaml @@ -19,7 +19,7 @@ values: - ssi - railroad_benefits - child_support_received - - unemployment_compensation + - total_unemployment_compensation # Gifts received or expenses paid on your behalf - miscellaneous_income - veterans_benefits diff --git a/policyengine_us/parameters/gov/states/mn/dcyf/ccap/income/countable_income/unearned.yaml b/policyengine_us/parameters/gov/states/mn/dcyf/ccap/income/countable_income/unearned.yaml index 3e39bd0568f..a8bc102168b 100644 --- a/policyengine_us/parameters/gov/states/mn/dcyf/ccap/income/countable_income/unearned.yaml +++ b/policyengine_us/parameters/gov/states/mn/dcyf/ccap/income/countable_income/unearned.yaml @@ -12,7 +12,7 @@ values: - pension_income - veterans_benefits - military_retirement_pay - - unemployment_compensation + - total_unemployment_compensation - workers_compensation # Child or spousal support not assigned to the state. - alimony_income diff --git a/policyengine_us/parameters/gov/states/mn/dcyf/mfip/income/sources/unearned.yaml b/policyengine_us/parameters/gov/states/mn/dcyf/mfip/income/sources/unearned.yaml index 499e3c25e42..084172e982f 100644 --- a/policyengine_us/parameters/gov/states/mn/dcyf/mfip/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/states/mn/dcyf/mfip/income/sources/unearned.yaml @@ -12,7 +12,7 @@ values: - interest_income - miscellaneous_income - pension_income - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - gi_cash_assistance - social_security diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/income/countable_income/sources.yaml index 567b8e4df09..44060fc03dc 100644 --- a/policyengine_us/parameters/gov/states/mo/dese/ccs/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/income/countable_income/sources.yaml @@ -10,7 +10,7 @@ values: - pension_income # PolicyEngine records military retirement separately from pension_income. - military_retirement_pay - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - child_support_received - alimony_income diff --git a/policyengine_us/parameters/gov/states/mo/dss/tanf/income/sources/unearned.yaml b/policyengine_us/parameters/gov/states/mo/dss/tanf/income/sources/unearned.yaml index ac033235b7e..cb091aef2af 100644 --- a/policyengine_us/parameters/gov/states/mo/dss/tanf/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/states/mo/dss/tanf/income/sources/unearned.yaml @@ -24,7 +24,7 @@ values: - financial_assistance - gi_cash_assistance - dividend_income - - unemployment_compensation + - total_unemployment_compensation - strike_benefits - gambling_winnings - miscellaneous_income diff --git a/policyengine_us/parameters/gov/states/ms/dhs/ccpp/income/countable_income/unearned_sources.yaml b/policyengine_us/parameters/gov/states/ms/dhs/ccpp/income/countable_income/unearned_sources.yaml index 3386d136047..b6fb36f70df 100644 --- a/policyengine_us/parameters/gov/states/ms/dhs/ccpp/income/countable_income/unearned_sources.yaml +++ b/policyengine_us/parameters/gov/states/ms/dhs/ccpp/income/countable_income/unearned_sources.yaml @@ -3,7 +3,7 @@ values: 2021-11-01: - social_security # SSA benefits for parent and child (umbrella; do not also add social_security_disability) - ssi # SSI for parent and child (separate from the social_security umbrella) - - unemployment_compensation # counted at redetermination only; simplified to always countable + - total_unemployment_compensation # counted at redetermination only; simplified to always countable - workers_compensation - alimony_income - veterans_benefits diff --git a/policyengine_us/parameters/gov/states/ms/dom/wd/eligibility/income/sources/unearned.yaml b/policyengine_us/parameters/gov/states/ms/dom/wd/eligibility/income/sources/unearned.yaml index e8666ca5f98..6c712513e65 100644 --- a/policyengine_us/parameters/gov/states/ms/dom/wd/eligibility/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/states/ms/dom/wd/eligibility/income/sources/unearned.yaml @@ -7,7 +7,7 @@ values: - veterans_benefits - survivor_benefits - workers_compensation - - unemployment_compensation + - total_unemployment_compensation - retirement_distributions - gi_cash_assistance - alimony_income diff --git a/policyengine_us/parameters/gov/states/ms/tax/income/income_sources.yaml b/policyengine_us/parameters/gov/states/ms/tax/income/income_sources.yaml index c2207eb0c56..7cd11c6a236 100644 --- a/policyengine_us/parameters/gov/states/ms/tax/income/income_sources.yaml +++ b/policyengine_us/parameters/gov/states/ms/tax/income/income_sources.yaml @@ -14,7 +14,7 @@ values: - taxable_pension_income - taxable_retirement_distributions - taxable_social_security - - unemployment_compensation + - total_unemployment_compensation metadata: label: Mississippi AGI income sources diff --git a/policyengine_us/parameters/gov/states/mt/dhs/tanf/income/sources/unearned.yaml b/policyengine_us/parameters/gov/states/mt/dhs/tanf/income/sources/unearned.yaml index 1fa50c3f231..bb23422452f 100644 --- a/policyengine_us/parameters/gov/states/mt/dhs/tanf/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/states/mt/dhs/tanf/income/sources/unearned.yaml @@ -8,7 +8,7 @@ values: - dividend_income - interest_income - rental_income - - unemployment_compensation + - total_unemployment_compensation - social_security - veterans_benefits - workers_compensation diff --git a/policyengine_us/parameters/gov/states/mt/dphhs/ccap/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/mt/dphhs/ccap/income/countable_income/sources.yaml index 507aa6d6bc5..614538ff662 100644 --- a/policyengine_us/parameters/gov/states/mt/dphhs/ccap/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/mt/dphhs/ccap/income/countable_income/sources.yaml @@ -15,7 +15,7 @@ values: - social_security # SS and SSDI counted; SSI excluded (social_security omits SSI) - pension_income # Government pension, annuity, railroad retirement, veterans' pensions - retirement_distributions - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - child_support_received # Child support retained, "in excess", arrearage - alimony_income diff --git a/policyengine_us/parameters/gov/states/nc/ncdhhs/scca/income/sources.yaml b/policyengine_us/parameters/gov/states/nc/ncdhhs/scca/income/sources.yaml index d92cb5b9e10..e8cc2a2b04e 100644 --- a/policyengine_us/parameters/gov/states/nc/ncdhhs/scca/income/sources.yaml +++ b/policyengine_us/parameters/gov/states/nc/ncdhhs/scca/income/sources.yaml @@ -7,7 +7,7 @@ values: - sstb_self_employment_income - pension_income - veterans_benefits - - unemployment_compensation + - total_unemployment_compensation - disability_benefits - workers_compensation - social_security diff --git a/policyengine_us/parameters/gov/states/nc/ncdhhs/tanf/income/unearned.yaml b/policyengine_us/parameters/gov/states/nc/ncdhhs/tanf/income/unearned.yaml index 80e169c2dcb..46e17577708 100644 --- a/policyengine_us/parameters/gov/states/nc/ncdhhs/tanf/income/unearned.yaml +++ b/policyengine_us/parameters/gov/states/nc/ncdhhs/tanf/income/unearned.yaml @@ -9,7 +9,7 @@ values: - interest_income - miscellaneous_income - pension_income - - unemployment_compensation + - total_unemployment_compensation - gi_cash_assistance - social_security # general_assistance is not counted per the WF-114 income chart, which diff --git a/policyengine_us/parameters/gov/states/nd/dhs/ccap/income/sources.yaml b/policyengine_us/parameters/gov/states/nd/dhs/ccap/income/sources.yaml index 39227e59c5c..f3d11f8a4eb 100644 --- a/policyengine_us/parameters/gov/states/nd/dhs/ccap/income/sources.yaml +++ b/policyengine_us/parameters/gov/states/nd/dhs/ccap/income/sources.yaml @@ -10,7 +10,7 @@ values: # and dependents components, so social_security_disability is not listed # separately to avoid double-counting Social Security Disability Insurance. - social_security - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - veterans_benefits # Regular periodic withdrawals from annuities, pensions, and other diff --git a/policyengine_us/parameters/gov/states/nd/dhs/tanf/income/sources/unearned.yaml b/policyengine_us/parameters/gov/states/nd/dhs/tanf/income/sources/unearned.yaml index f3d68362db1..e817b97e75b 100644 --- a/policyengine_us/parameters/gov/states/nd/dhs/tanf/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/states/nd/dhs/tanf/income/sources/unearned.yaml @@ -12,7 +12,7 @@ values: - miscellaneous_income # Regular pension payments, including their interest, remain countable. - pension_income - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - gi_cash_assistance - social_security diff --git a/policyengine_us/parameters/gov/states/nd/tax/property/renters_refund/income_sources.yaml b/policyengine_us/parameters/gov/states/nd/tax/property/renters_refund/income_sources.yaml index 58e2ba3172e..31642f83af3 100644 --- a/policyengine_us/parameters/gov/states/nd/tax/property/renters_refund/income_sources.yaml +++ b/policyengine_us/parameters/gov/states/nd/tax/property/renters_refund/income_sources.yaml @@ -3,7 +3,7 @@ values: 2025-01-01: - market_income - social_security - - unemployment_compensation + - total_unemployment_compensation - general_assistance metadata: unit: list diff --git a/policyengine_us/parameters/gov/states/ne/dhhs/child_care_subsidy/income/sources/unearned.yaml b/policyengine_us/parameters/gov/states/ne/dhhs/child_care_subsidy/income/sources/unearned.yaml index b6bc11229eb..5c21967cb57 100644 --- a/policyengine_us/parameters/gov/states/ne/dhhs/child_care_subsidy/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/states/ne/dhhs/child_care_subsidy/income/sources/unearned.yaml @@ -13,7 +13,7 @@ values: - military_retirement_pay - veterans_benefits - strike_benefits - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - child_support_received - alimony_income diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/countable_income/sources.yaml index f50ea1c4016..0aa0187bb20 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/countable_income/sources.yaml @@ -10,7 +10,7 @@ values: - social_security - pension_income - retirement_distributions - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - child_support_received - alimony_income diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/income/countable_income/unearned_sources.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/income/countable_income/unearned_sources.yaml index 610fca18206..e9288765265 100644 --- a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/income/countable_income/unearned_sources.yaml +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/income/countable_income/unearned_sources.yaml @@ -9,7 +9,7 @@ values: - interest_income - rental_income - pension_income - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - alimony_income - child_support_received diff --git a/policyengine_us/parameters/gov/states/nm/tax/income/modified_gross_income.yaml b/policyengine_us/parameters/gov/states/nm/tax/income/modified_gross_income.yaml index aeb990f7858..bba8dbfcd8a 100644 --- a/policyengine_us/parameters/gov/states/nm/tax/income/modified_gross_income.yaml +++ b/policyengine_us/parameters/gov/states/nm/tax/income/modified_gross_income.yaml @@ -12,7 +12,7 @@ values: - rental_income - pension_income - retirement_distributions - - unemployment_compensation + - total_unemployment_compensation - irs_employment_income - self_employment_income - sstb_self_employment_income diff --git a/policyengine_us/parameters/gov/states/nv/dwss/ccdp/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/nv/dwss/ccdp/income/countable_income/sources.yaml index 9d090eb325f..78984aeaf91 100644 --- a/policyengine_us/parameters/gov/states/nv/dwss/ccdp/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/nv/dwss/ccdp/income/countable_income/sources.yaml @@ -11,7 +11,7 @@ values: # Unearned income (countable per MS 306). - social_security # MS 306.34 RSDI umbrella (Retirement, Survivors, Disability) - disability_benefits # MS 306.9 Disability Insurance Benefits (employer/private disability; distinct from RSDI 306.34 and workers' comp 306.49) - - unemployment_compensation # MS 306.45 + - total_unemployment_compensation # MS 306.45 - workers_compensation # MS 306.49 - pension_income # MS 306.29 - military_retirement_pay # MS 306.29 pensions; PolicyEngine records this separately from pension_income diff --git a/policyengine_us/parameters/gov/states/ny/ocfs/ccap/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/ny/ocfs/ccap/income/countable_income/sources.yaml index 903b2778e8f..3d5703656b4 100644 --- a/policyengine_us/parameters/gov/states/ny/ocfs/ccap/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/ny/ocfs/ccap/income/countable_income/sources.yaml @@ -29,7 +29,7 @@ values: - military_retirement_pay # 404.5(b)(5)(viii): unemployment compensation, including strike benefits # received from union funds. - - unemployment_compensation + - total_unemployment_compensation - strike_benefits - workers_compensation - alimony_income diff --git a/policyengine_us/parameters/gov/states/oh/dcy/ccap/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/oh/dcy/ccap/income/countable_income/sources.yaml index 54c9cf23feb..a78a92e6cf0 100644 --- a/policyengine_us/parameters/gov/states/oh/dcy/ccap/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/oh/dcy/ccap/income/countable_income/sources.yaml @@ -12,7 +12,7 @@ values: - child_support_received - alimony_income - workers_compensation - - unemployment_compensation + - total_unemployment_compensation - pension_income # PolicyEngine records military retirement separately from pension_income; # it is countable under the 5180:2-16-03(H)(1)-(2) gross-unearned-income diff --git a/policyengine_us/parameters/gov/states/ok/dhs/ccs/income/sources.yaml b/policyengine_us/parameters/gov/states/ok/dhs/ccs/income/sources.yaml index df50f7aa8ff..6cb829c7804 100644 --- a/policyengine_us/parameters/gov/states/ok/dhs/ccs/income/sources.yaml +++ b/policyengine_us/parameters/gov/states/ok/dhs/ccs/income/sources.yaml @@ -14,7 +14,7 @@ values: # social_security already includes the disability, retirement, survivors, # and dependents components. - social_security - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - child_support_received - alimony_income diff --git a/policyengine_us/parameters/gov/states/ok/tax/income/credits/gross_income_sources.yaml b/policyengine_us/parameters/gov/states/ok/tax/income/credits/gross_income_sources.yaml index 1b3e2d73e89..e661dfa4906 100644 --- a/policyengine_us/parameters/gov/states/ok/tax/income/credits/gross_income_sources.yaml +++ b/policyengine_us/parameters/gov/states/ok/tax/income/credits/gross_income_sources.yaml @@ -14,7 +14,7 @@ values: - dividend_income - pension_income - debt_relief - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - social_security - alimony_income diff --git a/policyengine_us/parameters/gov/states/or/delc/erdc/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/or/delc/erdc/income/countable_income/sources.yaml index e0db46c9d95..a5b468b01d9 100644 --- a/policyengine_us/parameters/gov/states/or/delc/erdc/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/or/delc/erdc/income/countable_income/sources.yaml @@ -10,7 +10,7 @@ values: - pension_income - retirement_distributions - military_retirement_pay - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - alimony_income - child_support_received diff --git a/policyengine_us/parameters/gov/states/pa/dhs/ccw/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/pa/dhs/ccw/income/countable_income/sources.yaml index c84001e2836..ec4044f268d 100644 --- a/policyengine_us/parameters/gov/states/pa/dhs/ccw/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/pa/dhs/ccw/income/countable_income/sources.yaml @@ -10,7 +10,7 @@ values: - ssi - pension_income - military_retirement_pay - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - veterans_benefits - child_support_received diff --git a/policyengine_us/parameters/gov/states/ri/dhs/ccap/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/ri/dhs/ccap/income/countable_income/sources.yaml index 480a264061f..905d73a5174 100644 --- a/policyengine_us/parameters/gov/states/ri/dhs/ccap/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/ri/dhs/ccap/income/countable_income/sources.yaml @@ -14,7 +14,7 @@ values: - pension_income - veterans_benefits - military_retirement_pay - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - alimony_income - child_support_received diff --git a/policyengine_us/parameters/gov/states/sc/dss/ccap/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/sc/dss/ccap/income/countable_income/sources.yaml index 99f02918536..b6fce673bbd 100644 --- a/policyengine_us/parameters/gov/states/sc/dss/ccap/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/sc/dss/ccap/income/countable_income/sources.yaml @@ -7,7 +7,7 @@ values: - farm_operations_income - social_security - pension_income - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - child_support_received - alimony_income diff --git a/policyengine_us/parameters/gov/states/sd/dss/cca/income/sources.yaml b/policyengine_us/parameters/gov/states/sd/dss/cca/income/sources.yaml index 3e5ac725799..647e963ed32 100644 --- a/policyengine_us/parameters/gov/states/sd/dss/cca/income/sources.yaml +++ b/policyengine_us/parameters/gov/states/sd/dss/cca/income/sources.yaml @@ -10,7 +10,7 @@ values: # Unearned income (Subsidy Manual, Section 4). - rental_income # "lease income" - social_security # "Social Security (SSA)"; already excludes SSI - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - veterans_benefits # "VA benefits"; VA disability is non-countable - pension_income # "pensions" and "retirement" diff --git a/policyengine_us/parameters/gov/states/tx/fpp/income/sources/unearned.yaml b/policyengine_us/parameters/gov/states/tx/fpp/income/sources/unearned.yaml index 75af6b2a023..1946779b7bc 100644 --- a/policyengine_us/parameters/gov/states/tx/fpp/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/states/tx/fpp/income/sources/unearned.yaml @@ -6,7 +6,7 @@ values: - pension_income # Employment-based disability insurance benefits - disability_benefits - - unemployment_compensation + - total_unemployment_compensation - workers_compensation # 1 TAC 382.109(3)(L) and (3)(M) have exempted dividends, interest # and royalties, and Veteran's Administration payments since the diff --git a/policyengine_us/parameters/gov/states/tx/tanf/income/sources/unearned.yaml b/policyengine_us/parameters/gov/states/tx/tanf/income/sources/unearned.yaml index 857235a72f6..b109432a3b0 100644 --- a/policyengine_us/parameters/gov/states/tx/tanf/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/states/tx/tanf/income/sources/unearned.yaml @@ -8,7 +8,7 @@ values: - disability_benefits - workers_compensation # A-1324.19 and A-1324.20. - - unemployment_compensation + - total_unemployment_compensation - veterans_benefits # A-1326.9: pensions, including military retirement and recurring withdrawals. - pension_income diff --git a/policyengine_us/parameters/gov/states/tx/tdhca/ceap/income/sources.yaml b/policyengine_us/parameters/gov/states/tx/tdhca/ceap/income/sources.yaml index 2f6f99daebc..62c2170277f 100644 --- a/policyengine_us/parameters/gov/states/tx/tdhca/ceap/income/sources.yaml +++ b/policyengine_us/parameters/gov/states/tx/tdhca/ceap/income/sources.yaml @@ -10,7 +10,7 @@ values: # Net gambling or lottery winnings count per 10 TAC 6.4(c)(2); # we track gross winnings at the moment - gambling_winnings - - unemployment_compensation + - total_unemployment_compensation - strike_benefits # Counted excluding the Medicare deduction; we don't track # Medicare premium withholding at the moment diff --git a/policyengine_us/parameters/gov/states/ut/dwf/ccap/income/sources/unearned.yaml b/policyengine_us/parameters/gov/states/ut/dwf/ccap/income/sources/unearned.yaml index 3b89c7b4bc0..a323a8baab2 100644 --- a/policyengine_us/parameters/gov/states/ut/dwf/ccap/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/states/ut/dwf/ccap/income/sources/unearned.yaml @@ -32,7 +32,7 @@ values: 2020-01-01: - social_security - pension_income - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - veterans_benefits - rental_income diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/income/countable_income/unearned_sources.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/countable_income/unearned_sources.yaml index a24f546d2a7..4a7db44d921 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/income/countable_income/unearned_sources.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/countable_income/unearned_sources.yaml @@ -4,7 +4,7 @@ values: - child_support_received - social_security - pension_income - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - veterans_benefits - disability_benefits diff --git a/policyengine_us/parameters/gov/states/va/tax/income/subtractions/subtractions.yaml b/policyengine_us/parameters/gov/states/va/tax/income/subtractions/subtractions.yaml index 4e8db1e3717..cfbe7af680e 100644 --- a/policyengine_us/parameters/gov/states/va/tax/income/subtractions/subtractions.yaml +++ b/policyengine_us/parameters/gov/states/va/tax/income/subtractions/subtractions.yaml @@ -8,7 +8,7 @@ values: - va_disability_income_subtraction_person # Certification Number 5 - railroad_benefits # Certification Number 22 - va_national_guard_subtraction_person # Certification Number 28 - - unemployment_compensation # Certification Number 37 + - total_unemployment_compensation # Certification Number 37 - va_federal_state_employees_subtraction_person # Certification Number 39 - va_military_benefit_subtraction_person # Certification Number 60 - va_529_plan_deduction_person # Certification Number 34 diff --git a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/income/sources.yaml b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/income/sources.yaml index 51e291bb95d..f753d519a45 100644 --- a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/income/sources.yaml +++ b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/income/sources.yaml @@ -11,7 +11,7 @@ values: - dividend_income - interest_income - rental_income - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - veterans_benefits - military_retirement_pay diff --git a/policyengine_us/parameters/gov/states/wa/dcyf/eceap/income_sources.yaml b/policyengine_us/parameters/gov/states/wa/dcyf/eceap/income_sources.yaml index 823dc9cad7c..f1493945d32 100644 --- a/policyengine_us/parameters/gov/states/wa/dcyf/eceap/income_sources.yaml +++ b/policyengine_us/parameters/gov/states/wa/dcyf/eceap/income_sources.yaml @@ -7,7 +7,7 @@ values: - ssi - social_security - child_support_received - - unemployment_compensation + - total_unemployment_compensation - veterans_benefits - workers_compensation diff --git a/policyengine_us/parameters/gov/states/wa/dcyf/wccc/sources.yaml b/policyengine_us/parameters/gov/states/wa/dcyf/wccc/sources.yaml index 1e592f3c4b3..4543a23239d 100644 --- a/policyengine_us/parameters/gov/states/wa/dcyf/wccc/sources.yaml +++ b/policyengine_us/parameters/gov/states/wa/dcyf/wccc/sources.yaml @@ -14,7 +14,7 @@ values: - ssi - veterans_benefits - military_retirement_pay - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - interest_income - dividend_income diff --git a/policyengine_us/parameters/gov/states/wi/dcf/shares/income/sources.yaml b/policyengine_us/parameters/gov/states/wi/dcf/shares/income/sources.yaml index a4ff9c0211c..a720047408c 100644 --- a/policyengine_us/parameters/gov/states/wi/dcf/shares/income/sources.yaml +++ b/policyengine_us/parameters/gov/states/wi/dcf/shares/income/sources.yaml @@ -33,7 +33,7 @@ values: - social_security # Pensions and annuities, including veteran pensions. - pension_income - - unemployment_compensation + - total_unemployment_compensation - workers_compensation # Alimony and other maintenance payments. - alimony_income diff --git a/policyengine_us/parameters/gov/states/wv/dhhr/ccap/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/income/countable_income/sources.yaml index 9bccce64e85..b6752c35eb8 100644 --- a/policyengine_us/parameters/gov/states/wv/dhhr/ccap/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/income/countable_income/sources.yaml @@ -6,7 +6,7 @@ values: - farm_operations_income - social_security - ssi - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - pension_income - alimony_income diff --git a/policyengine_us/parameters/gov/states/wy/dfs/ccap/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/wy/dfs/ccap/income/countable_income/sources.yaml index e8aa6cfa845..e2bcfca99cd 100644 --- a/policyengine_us/parameters/gov/states/wy/dfs/ccap/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/wy/dfs/ccap/income/countable_income/sources.yaml @@ -11,7 +11,7 @@ values: - farm_operations_income # Unearned income - social_security # RSDI counted; SSI exempt (social_security omits SSI) - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - disability_benefits - interest_income diff --git a/policyengine_us/parameters/gov/states/wy/dfs/power/income/sources/unearned.yaml b/policyengine_us/parameters/gov/states/wy/dfs/power/income/sources/unearned.yaml index 522c4b9464c..90a9dfc133a 100644 --- a/policyengine_us/parameters/gov/states/wy/dfs/power/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/states/wy/dfs/power/income/sources/unearned.yaml @@ -12,7 +12,7 @@ values: # Section 901(J) excludes interest income; dividends remain countable. - miscellaneous_income - pension_income - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - gi_cash_assistance - social_security diff --git a/policyengine_us/parameters/gov/usda/school_meals/income/sources.yaml b/policyengine_us/parameters/gov/usda/school_meals/income/sources.yaml index a8fa7b0aeef..9ac98a6a27a 100644 --- a/policyengine_us/parameters/gov/usda/school_meals/income/sources.yaml +++ b/policyengine_us/parameters/gov/usda/school_meals/income/sources.yaml @@ -19,7 +19,7 @@ values: - financial_assistance - miscellaneous_income - veterans_benefits - - unemployment_compensation + - total_unemployment_compensation - strike_benefits - rental_income - retirement_distributions diff --git a/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml b/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml index 4a9a02d66bd..2e7cd2597f9 100644 --- a/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml @@ -57,7 +57,7 @@ values: # (ii) - pension_income # Includes annuities. - veterans_benefits - - unemployment_compensation + - total_unemployment_compensation - disability_benefits - workers_compensation - social_security diff --git a/policyengine_us/parameters/gov/usda/snap/work_requirements/README.md b/policyengine_us/parameters/gov/usda/snap/work_requirements/README.md index 308b099cdb2..37981dae6a6 100644 --- a/policyengine_us/parameters/gov/usda/snap/work_requirements/README.md +++ b/policyengine_us/parameters/gov/usda/snap/work_requirements/README.md @@ -55,8 +55,10 @@ supplied inputs: - `is_pregnant`: no survey source; defaults to false. - `is_incapable_of_self_care`: care-of-incapacitated-person exemption. - `is_homeless` and `is_veteran`: pre-HR1 ABAWD exemptions. -- `is_snap_higher_ed_student` and `unemployment_compensation`: non-age work - registration exemptions. +- `is_snap_higher_ed_student` and `unemployment_compensation` (read through + `total_unemployment_compensation`, which falls back to modeled state + unemployment insurance when none is reported): non-age work registration + exemptions. Population-level data parity is tracked separately in [PolicyEngine/populace#248](https://github.com/PolicyEngine/populace/issues/248). diff --git a/policyengine_us/parameters/gov/usda/wic/income/sources.yaml b/policyengine_us/parameters/gov/usda/wic/income/sources.yaml index 436a7223dd2..5675060f05b 100644 --- a/policyengine_us/parameters/gov/usda/wic/income/sources.yaml +++ b/policyengine_us/parameters/gov/usda/wic/income/sources.yaml @@ -18,7 +18,7 @@ values: - financial_assistance - miscellaneous_income - veterans_benefits - - unemployment_compensation + - total_unemployment_compensation - strike_benefits - rental_income - retirement_distributions diff --git a/policyengine_us/reforms/congress/tlaib/boost/boost_middle_class_tax_credit.py b/policyengine_us/reforms/congress/tlaib/boost/boost_middle_class_tax_credit.py index 72e3418adaa..3bc42955517 100644 --- a/policyengine_us/reforms/congress/tlaib/boost/boost_middle_class_tax_credit.py +++ b/policyengine_us/reforms/congress/tlaib/boost/boost_middle_class_tax_credit.py @@ -69,7 +69,7 @@ def formula(household, period, parameters): "tanf", "high_efficiency_electric_home_rebate", "residential_efficiency_electrification_rebate", - "unemployment_compensation", + "total_unemployment_compensation", # Contributed. "basic_income", "trump_dividend", @@ -126,7 +126,7 @@ def formula(spm_unit, period, parameters): "tanf", "high_efficiency_electric_home_rebate", "residential_efficiency_electrification_rebate", - "unemployment_compensation", + "total_unemployment_compensation", # Contributed. "basic_income", "trump_dividend", diff --git a/policyengine_us/reforms/congress/tlaib/economic_dignity_for_all_agenda/edaa_end_child_poverty_act.py b/policyengine_us/reforms/congress/tlaib/economic_dignity_for_all_agenda/edaa_end_child_poverty_act.py index abdb9b17928..47eba8ba25d 100644 --- a/policyengine_us/reforms/congress/tlaib/economic_dignity_for_all_agenda/edaa_end_child_poverty_act.py +++ b/policyengine_us/reforms/congress/tlaib/economic_dignity_for_all_agenda/edaa_end_child_poverty_act.py @@ -138,7 +138,7 @@ def formula(spm_unit, period, parameters): "tanf", "high_efficiency_electric_home_rebate", "residential_efficiency_electrification_rebate", - "unemployment_compensation", + "total_unemployment_compensation", "ak_energy_relief", "basic_income", "trump_dividend", diff --git a/policyengine_us/reforms/congress/tlaib/end_child_poverty_act.py b/policyengine_us/reforms/congress/tlaib/end_child_poverty_act.py index c1d9cb13e40..42729a88112 100644 --- a/policyengine_us/reforms/congress/tlaib/end_child_poverty_act.py +++ b/policyengine_us/reforms/congress/tlaib/end_child_poverty_act.py @@ -105,7 +105,7 @@ def formula(household, period, parameters): "tanf", "high_efficiency_electric_home_rebate", "residential_efficiency_electrification_rebate", - "unemployment_compensation", + "total_unemployment_compensation", # Contributed. "basic_income", "trump_dividend", @@ -154,7 +154,7 @@ def formula(spm_unit, period, parameters): "tanf", "high_efficiency_electric_home_rebate", "residential_efficiency_electrification_rebate", - "unemployment_compensation", + "total_unemployment_compensation", # Contributed. "basic_income", "trump_dividend", diff --git a/policyengine_us/reforms/states/tx/rebate/tx_rebate.py b/policyengine_us/reforms/states/tx/rebate/tx_rebate.py index 22019ce28df..4d5d1f4c86a 100644 --- a/policyengine_us/reforms/states/tx/rebate/tx_rebate.py +++ b/policyengine_us/reforms/states/tx/rebate/tx_rebate.py @@ -109,7 +109,7 @@ def formula(spm_unit, period, parameters): "wa_rca", "high_efficiency_electric_home_rebate", "residential_efficiency_electrification_rebate", - "unemployment_compensation", + "total_unemployment_compensation", # One-time energy relief payments. # Paid at the same time as the Alaska Permanent Fund Dividend, # which is part of IRS gross income. diff --git a/policyengine_us/tests/policy/baseline/household/income/person/total_unemployment_compensation.yaml b/policyengine_us/tests/policy/baseline/household/income/person/total_unemployment_compensation.yaml new file mode 100644 index 00000000000..37a9ebbd8c4 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/household/income/person/total_unemployment_compensation.yaml @@ -0,0 +1,296 @@ +# total_unemployment_compensation uses reported unemployment_compensation when it +# is above 0 and otherwise falls back to the modeled state UI programs. These +# cases follow modeled UI into means tests (SNAP) and the remaining direct +# consumers. PA inputs below give pa_uc = 10,218 per year (see the PA UC +# integration tests); a MONTH test period reports YEAR amounts divided by 12. + +- name: Case 1, modeled PA UC counts as SNAP unearned income for a low-income adult. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + pa_uc_highest_quarter_wages: 10_000 + pa_uc_base_year_wages: 28_000 + pa_uc_credit_weeks: 26 + weeks_unemployed: 26 + pa_uc_gross_weekly_earnings: 0 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: PA + output: + # No reported UC, so total UC falls back to modeled pa_uc: + # 10,218 / 12 = 851.50 per month. + pa_uc: 851.5 + total_unemployment_compensation: 851.5 + # 7 CFR 273.9(b)(2)(ii): unemployment compensation is unearned income. + snap_unearned_income_person: 851.5 + snap_gross_income: 851.5 + # 851.50 - 204 standard deduction = 647.50; shelter = 758 SUA + # - 647.50 / 2 = 434.25; net = 647.50 - 434.25 = 213.25 -> 213. + snap_net_income: 213 + is_snap_work_registration_exempt_non_age: true + # 292 maximum allotment - ceil(0.3 * 213 = 63.90) = 292 - 64 = 228. + # Before modeled UI reached the SNAP income list, SNAP paid the full 292. + snap: 228 + +- name: Case 2, modeled NJ UI flows into federal unemployment compensation. + period: 2024 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + nj_unemployment_insurance_base_period_weeks: 20 + nj_unemployment_insurance_base_period_wages: 5_660 + nj_unemployment_insurance_weeks_claimed: 26 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: NJ + output: + # Average weekly wage = 5,660 / 20 = 283; weekly benefit rate = + # floor(0.6 * 283) = 169; weeks = min(26 claimed, 20 base weeks) = 20; + # annual benefit = 169 * 20 = 3,380. + nj_unemployment_insurance: 3_380 + modeled_state_unemployment_compensation: 3_380 + total_unemployment_compensation: 3_380 + tax_unit_unemployment_compensation: 3_380 + taxable_unemployment_compensation: 3_380 + +- name: Case 3, modeled NJ UI counts as SNAP unearned income in a month. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + nj_unemployment_insurance_base_period_weeks: 20 + nj_unemployment_insurance_base_period_wages: 5_660 + nj_unemployment_insurance_weeks_claimed: 26 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: NJ + output: + # 3,380 / 12 = 281.67 per month. + total_unemployment_compensation: 281.67 + snap_unearned_income: 281.67 + # 281.67 - 198 standard deduction = 83.67 -> 84 (no utility allowance). + snap_net_income: 84 + # 291 maximum allotment - ceil(0.3 * 84 = 25.20) = 291 - 26 = 265. + snap: 265 + +- name: Case 4, asymmetric couple with reported UC for one spouse and modeled PA UC for the other. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + unemployment_compensation: 6_000 + person2: + age: 38 + pa_uc_highest_quarter_wages: 10_000 + pa_uc_base_year_wages: 28_000 + pa_uc_credit_weeks: 26 + weeks_unemployed: 26 + pa_uc_gross_weekly_earnings: 0 + tax_units: + tax_unit: + members: [person1, person2] + marital_units: + marital_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: PA + output: + pa_uc: [0, 10_218] + # Each person resolves separately: person1 keeps reported 6,000, + # person2 falls back to modeled 10,218. + total_unemployment_compensation: [6_000, 10_218] + tax_unit_unemployment_compensation: 16_218 + # TAXSIM splits UC by role: primary (head) and spouse. + taxsim_pui: 6_000 + taxsim_ui: 10_218 + +- name: Case 5, asymmetric couple aggregates reported and modeled UC in monthly SNAP income. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + unemployment_compensation: 6_000 + person2: + age: 38 + pa_uc_highest_quarter_wages: 10_000 + pa_uc_base_year_wages: 28_000 + pa_uc_credit_weeks: 26 + weeks_unemployed: 26 + pa_uc_gross_weekly_earnings: 0 + tax_units: + tax_unit: + members: [person1, person2] + marital_units: + marital_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: PA + output: + # 6,000 / 12 = 500 and 10,218 / 12 = 851.50. + snap_unearned_income_person: [500, 851.5] + snap_unearned_income: 1_351.5 + # 1,351.50 - 204 = 1,147.50; shelter = 758 - 1,147.50 / 2 = 184.25; + # net = 1,147.50 - 184.25 = 963.25 -> 963. + snap_net_income: 963 + # 536 maximum allotment - ceil(0.3 * 963 = 288.90) = 536 - 289 = 247. + # Before, only person1's 500 counted and SNAP paid the full 536. + snap: 247 + +- name: Case 6, explicitly reported zero UC still falls back to modeled PA UC. + period: 2025 + absolute_error_margin: 0.01 + input: + age: 35 + state_code: PA + unemployment_compensation: 0 + pa_uc_highest_quarter_wages: 10_000 + pa_uc_base_year_wages: 28_000 + pa_uc_credit_weeks: 26 + weeks_unemployed: 26 + pa_uc_gross_weekly_earnings: 0 + output: + # A reported 0 is treated as not reported; only a reported amount above 0 + # overrides modeled UI. + unemployment_compensation: 0 + total_unemployment_compensation: 10_218 + +- name: Case 7, modeled UT UI is taxable so it adds nothing to UT homeowner/renter relief nontaxable income. + period: 2024 + absolute_error_margin: 0.01 + input: + age: 35 + state_code: UT + ut_ui_base_period_wages: 80_000 + ut_ui_high_quarter_wages: 25_000 + ut_ui_quarters_with_wages: 4 + ut_ui_weeks_unemployed: 26 + ut_ui_gross_weekly_earnings: 0 + ut_ui_weekly_hours_worked: 0 + output: + ut_ui: 19_396 + total_unemployment_compensation: 19_396 + taxable_unemployment_compensation: 19_396 + # Nontaxable UC = max(0, 19,396 - 19,396) = 0. + ut_homeowner_renter_relief_nontaxable_income: 0 + +- name: Case 8, 2020 tuition deduction cap with tax-exempt UC. + period: 2020 + absolute_error_margin: 0.01 + input: + people: + person1: + is_tax_unit_head: true + age: 25 + employment_income: 60_000 + unemployment_compensation: 10_000 + qualified_tuition_expenses: 5_000 + is_eligible_for_american_opportunity_credit: false + tax_units: + tax_unit: + members: [person1] + premium_tax_credit: 0 + households: + household: + members: [person1] + state_code: TX + output: + # The 2020 exclusion (up to 10,200) makes all 10,000 of UC tax-exempt. + tax_exempt_unemployment_compensation: 10_000 + taxable_unemployment_compensation: 0 + # Existing model behavior carried over from main, not the statutory result: + # the local MAGI counts all UC, including the tax-exempt part, giving + # 60,000 + 10,000 = 70,000, inside the 65,000-80,000 band, so the cap is + # 2,000. Excluding tax-exempt UC under IRC 85(c) would give 60,000 and a + # cap of 4,000. Kept to cover the pre-2021 path of this variable. + capped_qualified_tuition_expenses_ald: 2_000 + +- name: Case 9, tuition deduction is zero after its 2021 repeal. + period: 2021 + absolute_error_margin: 0.01 + input: + people: + person1: + is_tax_unit_head: true + age: 25 + employment_income: 60_000 + unemployment_compensation: 10_000 + qualified_tuition_expenses: 5_000 + is_eligible_for_american_opportunity_credit: false + tax_units: + tax_unit: + members: [person1] + premium_tax_credit: 0 + households: + household: + members: [person1] + state_code: TX + output: + capped_qualified_tuition_expenses_ald: 0 + # SS MAGI = 60,000 + 10,000 total UC = 70,000. + taxable_ss_magi: 70_000 + +- name: Case 10, UC receipt exempts an Arkansas adult from the 2018 Medicaid work requirement. + period: 2018 + input: + age: 40 + medicaid_category: ADULT + medicaid_income_level: 0.9 + monthly_hours_worked: 0 + unemployment_compensation: 1_000 + state_code: AR + output: + ar_medicaid_work_requirement_subject: true + ar_medicaid_work_requirement_eligible: true + +- name: Case 11, UC receipt bars Contra Costa County General Assistance. + period: 2024-01 + input: + people: + person1: + age: 30 + is_tax_unit_head_or_spouse: true + immigration_status: CITIZEN + personal_property: 400 + unemployment_compensation: 1_000 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + county: CONTRA_COSTA_COUNTY_CA + output: + ca_cc_general_assistance_eligible_person: false diff --git a/policyengine_us/tests/policy/baseline/household/income/spm_unit/spm_unit_benefits.yaml b/policyengine_us/tests/policy/baseline/household/income/spm_unit/spm_unit_benefits.yaml index 93ecfde2fb4..c6f1535273d 100644 --- a/policyengine_us/tests/policy/baseline/household/income/spm_unit/spm_unit_benefits.yaml +++ b/policyengine_us/tests/policy/baseline/household/income/spm_unit/spm_unit_benefits.yaml @@ -124,3 +124,35 @@ ssi: 11_928 ca_state_supplement: 4_101.72 spm_unit_benefits: 16_029.72 + +- name: Benefits include modeled state unemployment insurance net of the SNAP it reduces. + # Low-income Pennsylvania adult with no reported UC and no earnings. Modeled + # pa_uc = 10,218 feeds total_unemployment_compensation and SNAP unearned + # income (851.50 per month). SNAP is 228 per month for January-September + # (292 maximum - 64) and 265 for October-December (298 maximum - 33), so + # annual snap = 228 * 9 + 265 * 3 = 2,052 + 795 = 2,847. + # spm_unit_benefits = 10,218 + 2,847 = 13,065. Without the modeled UC in SNAP + # income, snap would be 292 * 9 + 298 * 3 = 3,522. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + pa_uc_highest_quarter_wages: 10_000 + pa_uc_base_year_wages: 28_000 + pa_uc_credit_weeks: 26 + weeks_unemployed: 26 + pa_uc_gross_weekly_earnings: 0 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: PA + output: + pa_uc: 10_218 + total_unemployment_compensation: 10_218 + snap: 2_847 + spm_unit_benefits: 13_065 diff --git a/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/capped_qualified_tuition_expenses_ald.py b/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/capped_qualified_tuition_expenses_ald.py index 7270a9cce57..d755ca003ec 100644 --- a/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/capped_qualified_tuition_expenses_ald.py +++ b/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/capped_qualified_tuition_expenses_ald.py @@ -34,17 +34,21 @@ def formula(tax_unit, period, parameters): ) # Build a simple MAGI from non-dependent person-level income sources, # excluding sources that depend on MAGI themselves (taxable SS, UI). + # Total UI stands in for taxable UI, so reforms that drop taxable UI + # from gross income drop it here too. irs = parameters(period).gov.irs gross_income_sources = irs.gross_income.sources person = tax_unit.members not_dependent = ~person("is_tax_unit_dependent", period) - cycle_sources = { - "taxable_social_security", - "taxable_unemployment_compensation", - } - safe_sources = [src for src in gross_income_sources if src not in cycle_sources] - if "taxable_unemployment_compensation" in gross_income_sources: - safe_sources.append("total_unemployment_compensation") + safe_sources = [ + ( + "total_unemployment_compensation" + if src == "taxable_unemployment_compensation" + else src + ) + for src in gross_income_sources + if src != "taxable_social_security" + ] magi = 0 for source in safe_sources: magi += not_dependent * max_(0, add(person, period, [source])) diff --git a/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/irs_gross_income/social_security/taxable_ss_magi.py b/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/irs_gross_income/social_security/taxable_ss_magi.py index 6ca9ee87251..eb623e6bceb 100644 --- a/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/irs_gross_income/social_security/taxable_ss_magi.py +++ b/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/irs_gross_income/social_security/taxable_ss_magi.py @@ -14,19 +14,17 @@ def formula(tax_unit, period, parameters): irs = parameters(period).gov.irs gross_income_sources = irs.gross_income.sources ss_magi = irs.social_security.taxability.income + # Total UI stands in for taxable UI. Reforms which drop the UI + # variable from gross income drop it from SS-related MAGI too. income_sources_without_ss = [ - income_source + ( + "total_unemployment_compensation" + if income_source == "taxable_unemployment_compensation" + else income_source + ) for income_source in gross_income_sources - if income_source - not in [ - "taxable_social_security", - "taxable_unemployment_compensation", - ] + if income_source != "taxable_social_security" ] - if "taxable_unemployment_compensation" in gross_income_sources: - # Reforms which drop the UI variable from gross income should - # trigger SS-related MAGI to drop it too. - income_sources_without_ss.append("total_unemployment_compensation") income_sources_without_ss.append("tax_exempt_interest_income") gross_income = 0 person = tax_unit.members diff --git a/policyengine_us/variables/gov/states/ny/dol/unemployment_insurance/ny_ui.py b/policyengine_us/variables/gov/states/ny/dol/unemployment_insurance/ny_ui.py index 57d0e303ba8..c9254570e51 100644 --- a/policyengine_us/variables/gov/states/ny/dol/unemployment_insurance/ny_ui.py +++ b/policyengine_us/variables/gov/states/ny/dol/unemployment_insurance/ny_ui.py @@ -22,8 +22,8 @@ class ny_ui(Variable): defined_for = "ny_ui_monetarily_eligible" def formula(person, period, parameters): - # ny_ui is deliberately not yet wired into any income aggregate; any - # eventual wiring must not double-count with unemployment_compensation. + # ny_ui feeds income flows through modeled_state_unemployment_compensation; + # total_unemployment_compensation uses it only when no UI is reported. p = parameters(period).gov.states.ny.dol.unemployment_insurance.benefit weekly_benefit_rate = person("ny_ui_weekly_benefit_rate", period) weekly_payable = person("ny_ui_weekly_payable", period) diff --git a/policyengine_us/variables/household/income/person/total_unemployment_compensation.py b/policyengine_us/variables/household/income/person/total_unemployment_compensation.py index 1d65430c02c..c0594345fd0 100644 --- a/policyengine_us/variables/household/income/person/total_unemployment_compensation.py +++ b/policyengine_us/variables/household/income/person/total_unemployment_compensation.py @@ -9,7 +9,11 @@ class total_unemployment_compensation(Variable): documentation = ( "Unemployment compensation used in downstream income flows, using " "the reported (uprated) amount when present and otherwise falling " - "back to the modeled state unemployment insurance programs." + "back to the modeled state unemployment insurance programs. A " + "reported amount above 0 overrides modeled unemployment insurance; a " + "reported 0 is treated as not reported. To suppress modeled " + "unemployment insurance, leave the state unemployment insurance wage " + "and weeks inputs at 0." ) definition_period = YEAR From 3d57cddbe69c7f04ed28e37e39e133ec4f8703b7 Mon Sep 17 00:00:00 2001 From: David Trimmer Date: Thu, 24 Sep 2026 10:20:07 -0400 Subject: [PATCH 3/9] Year-gate the modeled state unemployment insurance programs Sum modeled state UI through a year-gated parameter list so each program counts from its first verified year. Before 2022 the list is empty, so pre-2015 simulations (e.g. the 2010 Alabama SSP cases reached via SSI unearned income) no longer reach state UI parameters that start later. Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01LqCGPgxDukji8Bhs57c5rH --- ...deled_state_unemployment_compensation.yaml | 26 +++++++++++++++++++ ...modeled_state_unemployment_compensation.py | 12 +++------ 2 files changed, 29 insertions(+), 9 deletions(-) create mode 100644 policyengine_us/parameters/gov/states/household/modeled_state_unemployment_compensation.yaml diff --git a/policyengine_us/parameters/gov/states/household/modeled_state_unemployment_compensation.yaml b/policyengine_us/parameters/gov/states/household/modeled_state_unemployment_compensation.yaml new file mode 100644 index 00000000000..af3a6ea93bc --- /dev/null +++ b/policyengine_us/parameters/gov/states/household/modeled_state_unemployment_compensation.yaml @@ -0,0 +1,26 @@ +description: Modeled state unemployment insurance programs that count toward unemployment compensation. +values: + # Year-gated: each program appears from the first year its implementation + # is verified (verified_years in programs.yaml). Extend a program's block + # when its verified years are extended. The empty base also keeps + # simulations of earlier years from reaching state UI parameters that + # start later. + 0000-01-01: [] + 2022-01-01: + - ok_ui + 2024-01-01: + - al_ui + - nj_unemployment_insurance + - ok_ui + - ut_ui + 2025-01-01: + - al_ui + - nj_unemployment_insurance + - ny_ui + - ok_ui + - pa_uc + - ut_ui +metadata: + unit: list + period: year + label: Modeled state unemployment compensation programs diff --git a/policyengine_us/variables/gov/states/modeled_state_unemployment_compensation.py b/policyengine_us/variables/gov/states/modeled_state_unemployment_compensation.py index 6430636bb32..89a4d1a3afc 100644 --- a/policyengine_us/variables/gov/states/modeled_state_unemployment_compensation.py +++ b/policyengine_us/variables/gov/states/modeled_state_unemployment_compensation.py @@ -8,14 +8,8 @@ class modeled_state_unemployment_compensation(Variable): unit = USD documentation = ( "Unemployment compensation computed from the modeled state " - "unemployment insurance programs." + "unemployment insurance programs. Each program counts from the " + "first year its implementation is verified." ) definition_period = YEAR - adds = [ - "al_ui", - "nj_unemployment_insurance", - "ny_ui", - "ok_ui", - "pa_uc", - "ut_ui", - ] + adds = "gov.states.household.modeled_state_unemployment_compensation" From 7e47d925ca34c33ad85cba313207568a3c9b933f Mon Sep 17 00:00:00 2001 From: David Trimmer Date: Tue, 29 Sep 2026 13:17:33 -0400 Subject: [PATCH 4/9] Address review: pin the modeled-UI year gate and pass negative reports through Add year-gate tests for states before and after they enter the modeled-UI list (AL 2023 and 2010, NY 2024, OK 2022, and PA/UT/NJ excluded years), SSI/TANF and taxable-SS-MAGI flow tests, and treat any nonzero reported unemployment compensation (including negative amounts) as reported, as on main. Have Virginia subtract taxable UC, count strike benefits in Hawaii child care, fix a reference comma, and clarify the year-gate docs. Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01LqCGPgxDukji8Bhs57c5rH --- .../state-ui-income-flow-integration.fixed.md | 1 + .../ccap/income/countable_income/sources.yaml | 3 +- ...deled_state_unemployment_compensation.yaml | 12 +- .../tax/income/subtractions/subtractions.yaml | 2 +- .../unemployment_insurance/integration.yaml | 46 ++++++ .../unemployment_insurance/integration.yaml | 25 +++ .../unemployment_insurance/integration.yaml | 47 ++++++ .../integration.yaml | 21 +++ .../unemployment_insurance/integration.yaml | 22 +++ .../total_unemployment_compensation.yaml | 146 +++++++++++++++++- .../variables/contrib/taxsim/taxsim_pui.py | 6 +- .../variables/contrib/taxsim/taxsim_ui.py | 6 +- .../capped_qualified_tuition_expenses_ald.py | 4 +- ...meowner_renter_relief_nontaxable_income.py | 6 +- .../person/total_unemployment_compensation.py | 5 +- 15 files changed, 326 insertions(+), 26 deletions(-) create mode 100644 changelog.d/state-ui-income-flow-integration.fixed.md diff --git a/changelog.d/state-ui-income-flow-integration.fixed.md b/changelog.d/state-ui-income-flow-integration.fixed.md new file mode 100644 index 00000000000..9fdd812ee3f --- /dev/null +++ b/changelog.d/state-ui-income-flow-integration.fixed.md @@ -0,0 +1 @@ +Virginia now subtracts only taxable unemployment compensation (tax year 2020 changes), and Hawaii child care assistance now counts strike benefits. diff --git a/policyengine_us/parameters/gov/states/hi/bessd/ccap/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/hi/bessd/ccap/income/countable_income/sources.yaml index c733afb8bb8..44869e1041a 100644 --- a/policyengine_us/parameters/gov/states/hi/bessd/ccap/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/hi/bessd/ccap/income/countable_income/sources.yaml @@ -19,6 +19,8 @@ values: # (pensions and annuities), not item (7) (allotments). - military_retirement_pay - total_unemployment_compensation + # Strike benefits (item (3)(B)) are not unemployment compensation. + - strike_benefits - workers_compensation - alimony_income - child_support_received @@ -30,7 +32,6 @@ values: # - royalties (item (17)) # - free rent converted to cost compensation (item (19)); # we don't track in-kind rent-for-activity at the moment - # - strike benefits (item (3)(B); captured via unemployment_compensation) # HAR 17-798.2-10(b)(11) counts Hawaii public assistance (TANF), but we do # NOT add `tanf` here to avoid the CCAP<->TANF circular dependency (CCAP # income -> tanf -> TANF dependent-care deduction -> childcare_expenses -> diff --git a/policyengine_us/parameters/gov/states/household/modeled_state_unemployment_compensation.yaml b/policyengine_us/parameters/gov/states/household/modeled_state_unemployment_compensation.yaml index af3a6ea93bc..dcc9097d8cc 100644 --- a/policyengine_us/parameters/gov/states/household/modeled_state_unemployment_compensation.yaml +++ b/policyengine_us/parameters/gov/states/household/modeled_state_unemployment_compensation.yaml @@ -1,10 +1,10 @@ -description: Modeled state unemployment insurance programs that count toward unemployment compensation. +description: Modeled state unemployment insurance programs summed into modeled unemployment compensation, which applies only when no unemployment compensation is reported. values: - # Year-gated: each program appears from the first year its implementation - # is verified (verified_years in programs.yaml). Extend a program's block - # when its verified years are extended. The empty base also keeps - # simulations of earlier years from reaching state UI parameters that - # start later. + # Each block sets a program's START year only (first verified_years year in + # programs.yaml). Lists carry forward, so no end year is enforced. Before its + # start year a program's variable still computes but does not feed + # total_unemployment_compensation. The empty base keeps earlier years from + # reaching state UI parameters that start later. 0000-01-01: [] 2022-01-01: - ok_ui diff --git a/policyengine_us/parameters/gov/states/va/tax/income/subtractions/subtractions.yaml b/policyengine_us/parameters/gov/states/va/tax/income/subtractions/subtractions.yaml index cfbe7af680e..12053febd0b 100644 --- a/policyengine_us/parameters/gov/states/va/tax/income/subtractions/subtractions.yaml +++ b/policyengine_us/parameters/gov/states/va/tax/income/subtractions/subtractions.yaml @@ -8,7 +8,7 @@ values: - va_disability_income_subtraction_person # Certification Number 5 - railroad_benefits # Certification Number 22 - va_national_guard_subtraction_person # Certification Number 28 - - total_unemployment_compensation # Certification Number 37 + - taxable_unemployment_compensation # Certification Number 37; Va. Code § 58.1-322.02(17) - va_federal_state_employees_subtraction_person # Certification Number 39 - va_military_benefit_subtraction_person # Certification Number 60 - va_529_plan_deduction_person # Certification Number 34 diff --git a/policyengine_us/tests/policy/baseline/gov/states/al/dol/unemployment_insurance/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/al/dol/unemployment_insurance/integration.yaml index a7629833204..70ee6c548a0 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/al/dol/unemployment_insurance/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/al/dol/unemployment_insurance/integration.yaml @@ -393,6 +393,8 @@ tax_unit_unemployment_compensation: 3_850 taxable_unemployment_compensation: 3_850 tax_unit_taxable_unemployment_compensation: 3_850 + # 100,000 wages + 3,850 taxable UC. + adjusted_gross_income: 103_850 - name: Case 14, reported UC preserved when present (no state UI inputs). # Reported unemployment_compensation is supplied and no AL UI wage inputs are @@ -437,3 +439,47 @@ # Reported wins; total is 5,000 (not 5,000 + 3,850). total_unemployment_compensation: 5_000 tax_unit_unemployment_compensation: 5_000 + +- name: Case 16, AL UI computes but does not count as UC before its 2024 start year. + # Case 13 inputs in 2023, before al_ui enters the modeled list in 2024. + period: 2023 + absolute_error_margin: 0.01 + input: + age: 35 + state_code: AL + employment_income: 100_000 + is_tax_unit_dependent: false + al_ui_high_quarter_wages: 10_000 + al_ui_second_high_quarter_wages: 10_000 + al_ui_base_period_wages: 40_000 + al_ui_quarters_with_wages: 4 + al_ui_weekly_earnings: 0 + weeks_unemployed: 20 + output: + # UR (2023-01) = 0.023 -> max_weeks = 14; al_ui = 275 * 14 = 3,850. + al_ui: 3_850 + modeled_state_unemployment_compensation: 0 + total_unemployment_compensation: 0 + tax_unit_unemployment_compensation: 0 + taxable_unemployment_compensation: 0 + adjusted_gross_income: 100_000 + +- name: Case 17, modeled UC is zero in an early year before any state UI parameters exist. + # The empty base list keeps 2010 from reaching AL UI parameters, which start + # in 2020. al_ui itself is not asserted: its parameters do not exist in 2010. + period: 2010 + absolute_error_margin: 0.01 + input: + age: 35 + state_code: AL + employment_income: 100_000 + is_tax_unit_dependent: false + al_ui_high_quarter_wages: 10_000 + al_ui_second_high_quarter_wages: 10_000 + al_ui_base_period_wages: 40_000 + al_ui_quarters_with_wages: 4 + al_ui_weekly_earnings: 0 + weeks_unemployed: 20 + output: + modeled_state_unemployment_compensation: 0 + total_unemployment_compensation: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ny/dol/unemployment_insurance/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/ny/dol/unemployment_insurance/integration.yaml index 1828677f567..f56d3f19945 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ny/dol/unemployment_insurance/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ny/dol/unemployment_insurance/integration.yaml @@ -272,6 +272,9 @@ tax_unit_unemployment_compensation: 7_982 taxable_unemployment_compensation: 7_982 tax_unit_taxable_unemployment_compensation: 7_982 + # 100,000 wages + 7,982 taxable UC; NY AGI starts from federal AGI. + adjusted_gross_income: 107_982 + ny_agi: 107_982 - name: Case 10, reported UC preserved when present (no NY UI inputs). period: 2025 @@ -311,3 +314,25 @@ # Reported wins; total is 4,500 (not 4,500 + 7,982). total_unemployment_compensation: 4_500 tax_unit_unemployment_compensation: 4_500 + +- name: Case 12, NY UI computes but does not count as UC before its 2025 start year. + # Case 9 inputs in 2024, before ny_ui enters the modeled list in 2025. + period: 2024 + absolute_error_margin: 0.01 + input: + age: 35 + state_code: NY + employment_income: 100_000 + is_tax_unit_dependent: false + ny_ui_high_quarter_wages: 8_000 + ny_ui_base_period_wages: 28_000 + ny_ui_quarters_with_wages: 4 + weeks_unemployed: 26 + ny_ui_weekly_hours_worked: 0 + ny_ui_gross_weekly_earnings: 0 + output: + ny_ui: 7_982 + modeled_state_unemployment_compensation: 0 + total_unemployment_compensation: 0 + tax_unit_unemployment_compensation: 0 + adjusted_gross_income: 100_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ok/oesc/unemployment_insurance/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/ok/oesc/unemployment_insurance/integration.yaml index 3d1996a506d..2be96027ce4 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ok/oesc/unemployment_insurance/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ok/oesc/unemployment_insurance/integration.yaml @@ -239,6 +239,8 @@ tax_unit_unemployment_compensation: 8_000 taxable_unemployment_compensation: 8_000 tax_unit_taxable_unemployment_compensation: 8_000 + # 100,000 wages + 8,000 taxable UC. + adjusted_gross_income: 108_000 - name: Case 9, reported UC preserved when present (no OK UI inputs). period: 2024 @@ -278,3 +280,48 @@ # Reported wins; total is 3,200 (not 3,200 + 8,000). total_unemployment_compensation: 3_200 tax_unit_unemployment_compensation: 3_200 + +- name: Case 11, OK UI counts as UC in its 2022 start year. + # Case 8 inputs in 2022, the first year ok_ui is in the modeled list. + period: 2022 + absolute_error_margin: 0.01 + input: + age: 35 + state_code: OK + employment_income: 100_000 + is_tax_unit_dependent: false + ok_ui_high_quarter_taxable_wages: 11_500 + ok_ui_high_quarter_total_wages: 11_500 + ok_ui_base_period_taxable_wages: 11_500 + ok_ui_base_period_total_wages: 35_000 + ok_ui_gross_weekly_earnings: 0 + weeks_unemployed: 16 + output: + # WBA = min(floor(11,500 / 23) = 500, 2022 maximum 476) = 476. + # MBA = min(476 * 26, 9,900, 0.4 * 35,000) = 9,900, not binding. + # Annual = 476 * 16 weeks = 7,616. + ok_ui: 7_616 + modeled_state_unemployment_compensation: 7_616 + total_unemployment_compensation: 7_616 + tax_unit_unemployment_compensation: 7_616 + taxable_unemployment_compensation: 7_616 + +- name: Case 12, OK UI does not count as UC before its 2022 start year. + # Case 8 inputs in 2021, when the modeled list is still empty. + period: 2021 + absolute_error_margin: 0.01 + input: + age: 35 + state_code: OK + employment_income: 100_000 + is_tax_unit_dependent: false + ok_ui_high_quarter_taxable_wages: 11_500 + ok_ui_high_quarter_total_wages: 11_500 + ok_ui_base_period_taxable_wages: 11_500 + ok_ui_base_period_total_wages: 35_000 + ok_ui_gross_weekly_earnings: 0 + weeks_unemployed: 16 + output: + ok_ui: 7_616 + modeled_state_unemployment_compensation: 0 + total_unemployment_compensation: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/integration.yaml index d7c5becc519..fbfb8279b5a 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/integration.yaml @@ -285,6 +285,8 @@ tax_unit_unemployment_compensation: 10_218 taxable_unemployment_compensation: 10_218 tax_unit_taxable_unemployment_compensation: 10_218 + # 100,000 wages + 10,218 taxable UC. + adjusted_gross_income: 110_218 spm_unit_benefits: 10_218 household_benefits: 10_218 @@ -327,3 +329,22 @@ total_unemployment_compensation: 6_000 tax_unit_unemployment_compensation: 6_000 spm_unit_benefits: 6_000 + +- name: Case 11, PA UC computes but does not count as UC before its 2025 start year. + # Case 8 inputs in 2024, before pa_uc enters the modeled list in 2025. + period: 2024 + absolute_error_margin: 0.01 + input: + age: 35 + state_code: PA + employment_income: 100_000 + is_tax_unit_dependent: false + pa_uc_highest_quarter_wages: 10_000 + pa_uc_base_year_wages: 28_000 + pa_uc_credit_weeks: 26 + weeks_unemployed: 26 + pa_uc_gross_weekly_earnings: 0 + output: + pa_uc: 10_218 + modeled_state_unemployment_compensation: 0 + total_unemployment_compensation: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ut/dws/unemployment_insurance/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/ut/dws/unemployment_insurance/integration.yaml index 28ae0891c86..6f73df001f4 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ut/dws/unemployment_insurance/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ut/dws/unemployment_insurance/integration.yaml @@ -292,6 +292,8 @@ tax_unit_unemployment_compensation: 19_396 taxable_unemployment_compensation: 19_396 tax_unit_taxable_unemployment_compensation: 19_396 + # 100,000 wages + 19,396 taxable UC. + adjusted_gross_income: 119_396 - name: Case 10, reported UC preserved when present (no UT UI inputs). period: 2024 @@ -331,3 +333,23 @@ # Reported wins; total is 12,000 (not 12,000 + 19,396). total_unemployment_compensation: 12_000 tax_unit_unemployment_compensation: 12_000 + +- name: Case 12, UT UI computes but does not count as UC before its 2024 start year. + # Case 9 inputs in 2023, before ut_ui enters the modeled list in 2024. + period: 2023 + absolute_error_margin: 0.01 + input: + age: 35 + state_code: UT + employment_income: 100_000 + is_tax_unit_dependent: false + ut_ui_base_period_wages: 80_000 + ut_ui_high_quarter_wages: 25_000 + ut_ui_quarters_with_wages: 4 + ut_ui_weeks_unemployed: 26 + ut_ui_gross_weekly_earnings: 0 + ut_ui_weekly_hours_worked: 0 + output: + ut_ui: 19_396 + modeled_state_unemployment_compensation: 0 + total_unemployment_compensation: 0 diff --git a/policyengine_us/tests/policy/baseline/household/income/person/total_unemployment_compensation.yaml b/policyengine_us/tests/policy/baseline/household/income/person/total_unemployment_compensation.yaml index 37a9ebbd8c4..ca1c8e86fe8 100644 --- a/policyengine_us/tests/policy/baseline/household/income/person/total_unemployment_compensation.yaml +++ b/policyengine_us/tests/policy/baseline/household/income/person/total_unemployment_compensation.yaml @@ -1,5 +1,5 @@ # total_unemployment_compensation uses reported unemployment_compensation when it -# is above 0 and otherwise falls back to the modeled state UI programs. These +# is nonzero and otherwise falls back to the modeled state UI programs. These # cases follow modeled UI into means tests (SNAP) and the remaining direct # consumers. PA inputs below give pa_uc = 10,218 per year (see the PA UC # integration tests); a MONTH test period reports YEAR amounts divided by 12. @@ -182,12 +182,15 @@ weeks_unemployed: 26 pa_uc_gross_weekly_earnings: 0 output: - # A reported 0 is treated as not reported; only a reported amount above 0 + # A reported 0 is treated as not reported; only a nonzero reported amount # overrides modeled UI. unemployment_compensation: 0 total_unemployment_compensation: 10_218 -- name: Case 7, modeled UT UI is taxable so it adds nothing to UT homeowner/renter relief nontaxable income. +- name: Case 7, modeled UT UI counts in total and taxable UC. + # Modeled UI is fully taxable, so the + # ut_homeowner_renter_relief_nontaxable_income: 0 assertion below cannot tell + # total UC from reported UC; this case covers total and taxable UC only. period: 2024 absolute_error_margin: 0.01 input: @@ -230,11 +233,10 @@ # The 2020 exclusion (up to 10,200) makes all 10,000 of UC tax-exempt. tax_exempt_unemployment_compensation: 10_000 taxable_unemployment_compensation: 0 - # Existing model behavior carried over from main, not the statutory result: - # the local MAGI counts all UC, including the tax-exempt part, giving - # 60,000 + 10,000 = 70,000, inside the 65,000-80,000 band, so the cap is - # 2,000. Excluding tax-exempt UC under IRC 85(c) would give 60,000 and a - # cap of 4,000. Kept to cover the pre-2021 path of this variable. + # ARPA § 9042(b)(7) (Pub. L. 117-2) added § 85(c) to the + # § 222(b)(2)(C)(i) MAGI definition, so excluded 2020 UC counts: + # MAGI = 60,000 + 10,000 = 70,000, inside the 65,000-80,000 band, so the + # statutory cap is 2,000 (same for § 86(b)(2)(A) SS MAGI). capped_qualified_tuition_expenses_ald: 2_000 - name: Case 9, tuition deduction is zero after its 2021 repeal. @@ -294,3 +296,131 @@ county: CONTRA_COSTA_COUNTY_CA output: ca_cc_general_assistance_eligible_person: false + +- name: Case 12, modeled NY UI counts as SSI unearned income and in federal and NY AGI. + period: 2025 + absolute_error_margin: 0.01 + input: + age: 35 + state_code: NY + ny_ui_high_quarter_wages: 8_000 + ny_ui_base_period_wages: 28_000 + ny_ui_quarters_with_wages: 4 + weeks_unemployed: 26 + ny_ui_weekly_hours_worked: 0 + ny_ui_gross_weekly_earnings: 0 + output: + # NY UI integration inputs give ny_ui = 7,982; with no reported UC and no + # earnings, total UC and all income below are the modeled 7,982. + ny_ui: 7_982 + total_unemployment_compensation: 7_982 + ssi_unearned_income: 7_982 + adjusted_gross_income: 7_982 + ny_agi: 7_982 + +- name: Case 13, modeled NY UI counts as TANF gross unearned income in a month. + period: 2025-01 + absolute_error_margin: 0.01 + input: + age: 35 + state_code: NY + ny_ui_high_quarter_wages: 8_000 + ny_ui_base_period_wages: 28_000 + ny_ui_quarters_with_wages: 4 + weeks_unemployed: 26 + ny_ui_weekly_hours_worked: 0 + ny_ui_gross_weekly_earnings: 0 + output: + # 7,982 / 12 = 665.17 per month. + total_unemployment_compensation: 665.17 + tanf_gross_unearned_income: 665.17 + +- name: Case 14, modeled PA UC counts in Social Security MAGI. + period: 2025 + absolute_error_margin: 0.01 + input: + age: 35 + state_code: PA + social_security_retirement: 20_000 + pa_uc_highest_quarter_wages: 10_000 + pa_uc_base_year_wages: 28_000 + pa_uc_credit_weeks: 26 + weeks_unemployed: 26 + pa_uc_gross_weekly_earnings: 0 + output: + pa_uc: 10_218 + # 26 U.S.C. 86(b)(2): MAGI = AGI before taxable SS = 10,218 of total UC. + taxable_ss_magi: 10_218 + # Provisional income = 10,218 + 20,000 / 2 = 20,218, below the 25,000 + # single base amount, so no benefits are taxable. + taxable_social_security: 0 + +- name: Case 15, a negative reported UC amount passes through instead of modeled PA UC. + period: 2025 + absolute_error_margin: 0.01 + input: + age: 35 + state_code: PA + unemployment_compensation: -1_000 + pa_uc_highest_quarter_wages: 10_000 + pa_uc_base_year_wages: 28_000 + pa_uc_credit_weeks: 26 + weeks_unemployed: 26 + pa_uc_gross_weekly_earnings: 0 + output: + pa_uc: 10_218 + modeled_state_unemployment_compensation: 10_218 + # Any nonzero reported amount overrides modeled UI unchanged, as before + # modeled UI was integrated. + total_unemployment_compensation: -1_000 + +- name: Case 16, Virginia subtracts only taxable UC, so 2020 tax-exempt UC is not subtracted again. + period: 2020 + absolute_error_margin: 0.01 + input: + age: 40 + state_code: VA + employment_income: 50_000 + unemployment_compensation: 5_000 + output: + # The 2020 federal exclusion (up to 10,200) makes all 5,000 of UC + # tax-exempt, so federal AGI is 50,000. + tax_exempt_unemployment_compensation: 5_000 + taxable_unemployment_compensation: 0 + adjusted_gross_income: 50_000 + # Va. Code § 58.1-322.02(17) subtracts UC taxable under IRC 85: 0 here. + va_subtractions: 0 + va_agi: 50_000 + # Taxable = 50,000 - 4,500 standard deduction - 930 exemption = 44,570. + # Tax = 60 + 60 + 600 + 0.0575 * 27,570 = 2,305.28, less 250 of + # nonrefundable credits = 2,055.28 (1,767.78 when all UC was subtracted). + va_income_tax: 2_055.28 + +- name: Case 17, Hawaii CCAP counts strike benefits, which are not unemployment compensation. + period: 2025-01 + absolute_error_margin: 0.01 + input: + age: 35 + state_code: HI + strike_benefits: 12_000 + output: + # Strike benefits do not enter total UC. + total_unemployment_compensation: 0 + # HAR 17-798.3-10(b) counts strike benefits: 12,000 / 12 = 1,000 per month. + hi_ccap_countable_income: 1_000 + +- name: Case 18, modeled NJ UI computes but does not count as UC before its 2024 start year. + period: 2023 + absolute_error_margin: 0.01 + input: + age: 35 + state_code: NJ + nj_unemployment_insurance_base_period_weeks: 20 + nj_unemployment_insurance_base_period_wages: 5_660 + nj_unemployment_insurance_weeks_claimed: 26 + output: + # Case 2 inputs: 169 weekly * 20 weeks = 3,380. + nj_unemployment_insurance: 3_380 + # NJ enters the modeled list in 2024. + modeled_state_unemployment_compensation: 0 + total_unemployment_compensation: 0 diff --git a/policyengine_us/variables/contrib/taxsim/taxsim_pui.py b/policyengine_us/variables/contrib/taxsim/taxsim_pui.py index cad57b42fdb..84d07a01cab 100644 --- a/policyengine_us/variables/contrib/taxsim/taxsim_pui.py +++ b/policyengine_us/variables/contrib/taxsim/taxsim_pui.py @@ -12,5 +12,7 @@ class taxsim_pui(Variable): def formula(tax_unit, period, parameters): person = tax_unit.members is_primary = person("is_tax_unit_head", period) - unemployment_compensation = person("total_unemployment_compensation", period) - return tax_unit.sum(unemployment_compensation * is_primary) + total_unemployment_compensation = person( + "total_unemployment_compensation", period + ) + return tax_unit.sum(total_unemployment_compensation * is_primary) diff --git a/policyengine_us/variables/contrib/taxsim/taxsim_ui.py b/policyengine_us/variables/contrib/taxsim/taxsim_ui.py index 75efacb838a..bb1cd54cba4 100644 --- a/policyengine_us/variables/contrib/taxsim/taxsim_ui.py +++ b/policyengine_us/variables/contrib/taxsim/taxsim_ui.py @@ -12,5 +12,7 @@ class taxsim_ui(Variable): def formula(tax_unit, period, parameters): person = tax_unit.members is_spouse = person("is_tax_unit_spouse", period) - unemployment_compensation = person("total_unemployment_compensation", period) - return tax_unit.sum(unemployment_compensation * is_spouse) + total_unemployment_compensation = person( + "total_unemployment_compensation", period + ) + return tax_unit.sum(total_unemployment_compensation * is_spouse) diff --git a/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/capped_qualified_tuition_expenses_ald.py b/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/capped_qualified_tuition_expenses_ald.py index d755ca003ec..c634698f7e5 100644 --- a/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/capped_qualified_tuition_expenses_ald.py +++ b/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/capped_qualified_tuition_expenses_ald.py @@ -14,9 +14,9 @@ class capped_qualified_tuition_expenses_ald(Variable): "`adjusted_gross_income`." ) reference = ( - "https://www.irs.gov/pub/irs-pdf/f8917.pdf#page=2" + "https://www.irs.gov/pub/irs-pdf/f8917.pdf#page=2", # Law was repealed starting tax year 2021. - "https://irc.bloombergtax.com/public/uscode/doc/irc/section_222" + "https://irc.bloombergtax.com/public/uscode/doc/irc/section_222", ) def formula(tax_unit, period, parameters): diff --git a/policyengine_us/variables/gov/states/ut/tax/property/homeowner_renter_relief/ut_homeowner_renter_relief_nontaxable_income.py b/policyengine_us/variables/gov/states/ut/tax/property/homeowner_renter_relief/ut_homeowner_renter_relief_nontaxable_income.py index e658c62eba4..3ea3d1d381b 100644 --- a/policyengine_us/variables/gov/states/ut/tax/property/homeowner_renter_relief/ut_homeowner_renter_relief_nontaxable_income.py +++ b/policyengine_us/variables/gov/states/ut/tax/property/homeowner_renter_relief/ut_homeowner_renter_relief_nontaxable_income.py @@ -21,13 +21,15 @@ def formula(person, period, parameters): nontaxable_social_security = max_( 0, social_security - ssdi - taxable_social_security ) - unemployment_compensation = person("total_unemployment_compensation", period) + total_unemployment_compensation = person( + "total_unemployment_compensation", period + ) taxable_unemployment_compensation = person( "taxable_unemployment_compensation", period ) nontaxable_unemployment_compensation = max_( 0, - unemployment_compensation - taxable_unemployment_compensation, + total_unemployment_compensation - taxable_unemployment_compensation, ) return ( listed_sources diff --git a/policyengine_us/variables/household/income/person/total_unemployment_compensation.py b/policyengine_us/variables/household/income/person/total_unemployment_compensation.py index c0594345fd0..f6690f6c9f8 100644 --- a/policyengine_us/variables/household/income/person/total_unemployment_compensation.py +++ b/policyengine_us/variables/household/income/person/total_unemployment_compensation.py @@ -10,7 +10,8 @@ class total_unemployment_compensation(Variable): "Unemployment compensation used in downstream income flows, using " "the reported (uprated) amount when present and otherwise falling " "back to the modeled state unemployment insurance programs. A " - "reported amount above 0 overrides modeled unemployment insurance; a " + "reported nonzero amount (including a negative one) overrides " + "modeled unemployment insurance and passes through unchanged; a " "reported 0 is treated as not reported. To suppress modeled " "unemployment insurance, leave the state unemployment insurance wage " "and weeks inputs at 0." @@ -20,4 +21,4 @@ class total_unemployment_compensation(Variable): def formula(person, period, parameters): reported = person("unemployment_compensation", period) modeled = person("modeled_state_unemployment_compensation", period) - return where(reported > 0, reported, modeled) + return where(reported != 0, reported, modeled) From b46b91f5d1faf89b811dade9b37ad732b21c0371 Mon Sep 17 00:00:00 2001 From: David Trimmer Date: Tue, 29 Sep 2026 17:36:37 -0400 Subject: [PATCH 5/9] Count gross unemployment and Social Security in South Carolina TANF The SC TANF unearned income list now reads total_unemployment_compensation and social_security instead of the taxable amounts, per SC DSS TANF Policy Manual Section 7.7 (SSA benefits count at the gross amount; unemployment benefits count in full). Closes #9677 Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01LqCGPgxDukji8Bhs57c5rH --- changelog.d/sc-tanf-gross-ui-ss.fixed.md | 1 + .../gov/states/sc/tanf/income/unearned.yaml | 10 +- .../gov/states/sc/tanf/integration.yaml | 183 +++++++++++++++++- 3 files changed, 190 insertions(+), 4 deletions(-) create mode 100644 changelog.d/sc-tanf-gross-ui-ss.fixed.md diff --git a/changelog.d/sc-tanf-gross-ui-ss.fixed.md b/changelog.d/sc-tanf-gross-ui-ss.fixed.md new file mode 100644 index 00000000000..168081be2d5 --- /dev/null +++ b/changelog.d/sc-tanf-gross-ui-ss.fixed.md @@ -0,0 +1 @@ +South Carolina TANF now counts gross unemployment compensation and gross Social Security as unearned income, instead of only the federally taxable amounts. diff --git a/policyengine_us/parameters/gov/states/sc/tanf/income/unearned.yaml b/policyengine_us/parameters/gov/states/sc/tanf/income/unearned.yaml index 247415c9c25..8e28432b688 100644 --- a/policyengine_us/parameters/gov/states/sc/tanf/income/unearned.yaml +++ b/policyengine_us/parameters/gov/states/sc/tanf/income/unearned.yaml @@ -14,8 +14,10 @@ values: - debt_relief # Decedent income # Estate interest income - - taxable_unemployment_compensation - - taxable_social_security + # Section 7.7 counts unemployment compensation and SSA benefits in + # full (gross), with no carve-out for the federally taxable share. + - total_unemployment_compensation + - social_security - illicit_income - taxable_retirement_distributions - miscellaneous_income @@ -26,3 +28,7 @@ metadata: reference: - title: SC DSS TANF Policy Manual Section 7.1 href: https://dss.sc.gov/media/ojqddxsk/tanf-policy-manual-volume-65.pdf#page=101 + - title: SC DSS TANF Policy Manual Section 7.7, SSA benefits + href: https://dss.sc.gov/media/ojqddxsk/tanf-policy-manual-volume-65.pdf#page=115 + - title: SC DSS TANF Policy Manual Section 7.7, Unemployment compensation benefits (UCB) + href: https://dss.sc.gov/media/ojqddxsk/tanf-policy-manual-volume-65.pdf#page=117 diff --git a/policyengine_us/tests/policy/baseline/gov/states/sc/tanf/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/sc/tanf/integration.yaml index 41aecd45e29..e49cc7c1993 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/sc/tanf/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/sc/tanf/integration.yaml @@ -115,7 +115,7 @@ person1: age: 35 employment_income_before_lsr: 0 - taxable_social_security: 3_600 + social_security: 3_600 person2: age: 8 is_child_dependent: true @@ -129,7 +129,7 @@ state_code: SC output: sc_tanf: 223.20 - # monthly unearned = 3,600/12 = 300 + # monthly unearned = 3,600/12 = 300 (gross Social Security counts) # tanf_fpg for size 2 = 1703.33 # need_standard = 1703.33 * 0.5 = 851.67 # countable_income = 0 (earned) + 300 (unearned) = 300 @@ -222,3 +222,182 @@ sc_tanf: 0 # Both members are undocumented, so no one qualifies as # citizen or legal immigrant -> ineligible + +- name: Case 9, 2020 unemployment compensation below the federal exclusion counts in full. + period: 2020-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + unemployment_compensation: 6_000 + person2: + age: 8 + is_child_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_cash_assets: 500 + households: + household: + members: [person1, person2] + state_code: SC + output: + # 2020 federal exclusion: first 10,200 of UC is tax-exempt, + # so taxable UC = max(6,000 - 10,200, 0) = 0. + taxable_unemployment_compensation: [0, 0] + # Section 7.7 counts gross UC: 6,000 / 12 = 500 per month. + total_unemployment_compensation: [500, 0] + sc_tanf_gross_unearned_income: [500, 0] + sc_tanf_countable_income: 500 + # tanf_fpg for size 2 (2020-01, uses 2019 FPG) = 16,910 / 12 = 1,409.17 + # need_standard = 1,409.17 * 0.5 = 704.58 + # 500 < 704.58 -> countable income eligible + sc_tanf_income_eligible: true + # excess = 704.58 - 500 = 204.58 + # benefit = 204.58 * 0.3372 = 68.99 + # (Counting taxable UC instead gave 704.58 * 0.3372 = 237.59.) + sc_tanf: 68.99 + +- name: Case 10, 2020 unemployment compensation above the federal exclusion counts in full. + period: 2020-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + unemployment_compensation: 12_000 + person2: + age: 8 + is_child_dependent: true + person3: + age: 7 + is_child_dependent: true + person4: + age: 6 + is_child_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + spm_unit_cash_assets: 500 + households: + household: + members: [person1, person2, person3, person4] + state_code: SC + output: + # taxable UC = 12,000 - 10,200 = 1,800 per year = 150 per month. + taxable_unemployment_compensation: [150, 0, 0, 0] + # Gross UC counts: 12,000 / 12 = 1,000 per month. + total_unemployment_compensation: [1_000, 0, 0, 0] + sc_tanf_gross_unearned_income: [1_000, 0, 0, 0] + sc_tanf_countable_income: 1_000 + # tanf_fpg for size 4 (2020-01, uses 2019 FPG) = 25,750 / 12 = 2,145.83 + # need_standard = 2,145.83 * 0.5 = 1,072.92 + # 1,000 < 1,072.92 -> countable income eligible + sc_tanf_income_eligible: true + # excess = 1,072.92 - 1,000 = 72.92 + # benefit = 72.92 * 0.3372 = 24.59 + # (Counting taxable UC instead gave (1,072.92 - 150) * 0.3372 = 311.21.) + sc_tanf: 24.59 + +- name: Case 11, gross Social Security counts when none of it is federally taxable. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + social_security_disability: 6_000 + person2: + age: 8 + is_child_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_cash_assets: 500 + households: + household: + members: [person1, person2] + state_code: SC + output: + # Provisional income = 6,000 * 0.5 = 3,000, below the 25,000 base + # amount, so taxable Social Security = 0. + taxable_social_security: [0, 0] + # Section 7.7 counts the gross SSA benefit: 6,000 / 12 = 500 per month. + social_security: [500, 0] + sc_tanf_gross_unearned_income: [500, 0] + sc_tanf_countable_income: 500 + # tanf_fpg for size 2 (2025-01) = 1,703.33 + # need_standard = 1,703.33 * 0.5 = 851.67 + # 500 < 851.67 -> countable income eligible + sc_tanf_income_eligible: true + # excess = 851.67 - 500 = 351.67 + # benefit = 351.67 * 0.4046 = 142.28 + # (Counting taxable Social Security instead gave 851.67 * 0.4046 = 344.58.) + sc_tanf: 142.28 + +- name: Case 12, gross Social Security above the need standard makes the family ineligible. + period: 2025-01 + input: + people: + person1: + age: 35 + social_security_disability: 12_000 + person2: + age: 8 + is_child_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_cash_assets: 500 + households: + household: + members: [person1, person2] + state_code: SC + output: + # Provisional income = 12,000 * 0.5 = 6,000 < 25,000 -> taxable SS = 0. + taxable_social_security: [0, 0] + # Gross SSA benefit counts: 12,000 / 12 = 1,000 per month. + sc_tanf_countable_income: 1_000 + # need_standard = 851.67; 1,000 >= 851.67 -> not income eligible + sc_tanf_income_eligible: false + # (Counting taxable Social Security instead paid 344.58.) + sc_tanf: 0 + +- name: Case 13, gross Social Security and unemployment compensation both count once. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + social_security_disability: 3_600 + unemployment_compensation: 2_400 + person2: + age: 10 + is_child_dependent: true + person3: + age: 8 + is_child_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_cash_assets: 500 + households: + household: + members: [person1, person2, person3] + state_code: SC + output: + # SS = 3,600 / 12 = 300 per month; taxable SS = 0. + # UC = 2,400 / 12 = 200 per month (fully taxable after 2020). + taxable_social_security: [0, 0, 0] + taxable_unemployment_compensation: [200, 0, 0] + # gross unearned = 300 + 200 = 500 + sc_tanf_gross_unearned_income: [500, 0, 0] + sc_tanf_countable_income: 500 + # tanf_fpg for size 3 (2025-01) = 2,151.67 + # need_standard = 2,151.67 * 0.5 = 1,075.83 + # excess = 1,075.83 - 500 = 575.83 + # benefit = 575.83 * 0.4046 = 232.98 + # (Counting taxable SS instead gave (1,075.83 - 200) * 0.4046 = 354.36.) + sc_tanf: 232.98 From 71325306f76bc9f96f61b68f5ee4ac18c3edc5e0 Mon Sep 17 00:00:00 2001 From: David Trimmer Date: Mon, 5 Oct 2026 11:41:11 -0400 Subject: [PATCH 6/9] Update modeled-UI SNAP tests for main's months-of-receipt UI exemption Main's #9716 limits the SNAP work-registration UI exemption to the months of receipt (26 weeks -> 6 months), so outside those months the PA adults in these cases hit the ABAWD time limit and 7 CFR 273.11(c)(2)(ii) prorates their income. Update the two expectations with the arithmetic; no code change. Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01LqCGPgxDukji8Bhs57c5rH --- .../total_unemployment_compensation.yaml | 25 +++++++++++++------ .../income/spm_unit/spm_unit_benefits.yaml | 18 +++++++------ 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/policyengine_us/tests/policy/baseline/household/income/person/total_unemployment_compensation.yaml b/policyengine_us/tests/policy/baseline/household/income/person/total_unemployment_compensation.yaml index ca1c8e86fe8..ad439790edc 100644 --- a/policyengine_us/tests/policy/baseline/household/income/person/total_unemployment_compensation.yaml +++ b/policyengine_us/tests/policy/baseline/household/income/person/total_unemployment_compensation.yaml @@ -161,13 +161,24 @@ output: # 6,000 / 12 = 500 and 10,218 / 12 = 851.50. snap_unearned_income_person: [500, 851.5] - snap_unearned_income: 1_351.5 - # 1,351.50 - 204 = 1,147.50; shelter = 758 - 1,147.50 / 2 = 184.25; - # net = 1,147.50 - 184.25 = 963.25 -> 963. - snap_net_income: 963 - # 536 maximum allotment - ceil(0.3 * 963 = 288.90) = 536 - 289 = 247. - # Before, only person1's 500 counted and SNAP paid the full 536. - snap: 247 + # 7 CFR 273.7(b)(1)(v) exempts only months of UC receipt. person1 has + # reported UC and no weeks unemployed, so receives in all 12 months. + # person2's 26 weeks give ceil(26 * 12 / 52) = 6 months; as the + # household's second member the block starts in February (February to + # July), so person2 does not receive UC in January. + is_receiving_unemployment_compensation: [true, false] + # Without the exemption, person2 (age 38, no work hours, PA fallback + # county not waived) is ineligible under the ABAWD time limit, so + # 7 CFR 273.11(c)(2)(ii) counts the eligible share of person2's income: + # 1 SNAP unit member / 2 household members = 0.5. + snap_income_counted_share: [1, 0.5] + # 500 + 0.5 * 851.50 = 925.75. + snap_unearned_income: 925.75 + # 925.75 - 204 = 721.75; shelter = 758 - 721.75 / 2 = 397.125; + # net = 721.75 - 397.125 = 324.625 -> 325. + snap_net_income: 325 + # 1-person maximum allotment 292 - ceil(0.3 * 325 = 97.50) = 292 - 98 = 194. + snap: 194 - name: Case 6, explicitly reported zero UC still falls back to modeled PA UC. period: 2025 diff --git a/policyengine_us/tests/policy/baseline/household/income/spm_unit/spm_unit_benefits.yaml b/policyengine_us/tests/policy/baseline/household/income/spm_unit/spm_unit_benefits.yaml index c6f1535273d..736665e9d7d 100644 --- a/policyengine_us/tests/policy/baseline/household/income/spm_unit/spm_unit_benefits.yaml +++ b/policyengine_us/tests/policy/baseline/household/income/spm_unit/spm_unit_benefits.yaml @@ -128,11 +128,14 @@ - name: Benefits include modeled state unemployment insurance net of the SNAP it reduces. # Low-income Pennsylvania adult with no reported UC and no earnings. Modeled # pa_uc = 10,218 feeds total_unemployment_compensation and SNAP unearned - # income (851.50 per month). SNAP is 228 per month for January-September - # (292 maximum - 64) and 265 for October-December (298 maximum - 33), so - # annual snap = 228 * 9 + 265 * 3 = 2,052 + 795 = 2,847. - # spm_unit_benefits = 10,218 + 2,847 = 13,065. Without the modeled UC in SNAP - # income, snap would be 292 * 9 + 298 * 3 = 3,522. + # income (851.50 per month). 7 CFR 273.7(b)(1)(v) exempts only months of UC + # receipt: 26 weeks unemployed give ceil(26 * 12 / 52) = 6 months, starting + # in January for the household's first member. In January-June SNAP is 228 + # per month (292 maximum - ceil(0.3 * 213 net income) = 292 - 64). + # From July the person no longer receives UC and, with no work hours and + # PA's fallback county not waived, is ineligible under the ABAWD time limit, + # so SNAP is 0. Annual snap = 228 * 6 = 1,368. + # spm_unit_benefits = 10,218 + 1,368 = 11,586. period: 2025 absolute_error_margin: 0.01 input: @@ -154,5 +157,6 @@ output: pa_uc: 10_218 total_unemployment_compensation: 10_218 - snap: 2_847 - spm_unit_benefits: 13_065 + unemployment_compensation_months: 6 + snap: 1_368 + spm_unit_benefits: 11_586 From c0fcb2f65ac3e121da11e5200b69659be1557245 Mon Sep 17 00:00:00 2001 From: David Trimmer Date: Mon, 5 Oct 2026 11:41:44 -0400 Subject: [PATCH 7/9] Update modeled-UI SNAP tests for main's months-of-receipt UI exemption Same expectation updates as #9558 (this branch carries #9558's modeled state UI change): main's #9716 limits the SNAP work-registration UI exemption to the months of receipt, so the PA adults hit the ABAWD time limit outside them. No code change. Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01LqCGPgxDukji8Bhs57c5rH --- .../total_unemployment_compensation.yaml | 25 +++++++++++++------ .../income/spm_unit/spm_unit_benefits.yaml | 18 +++++++------ 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/policyengine_us/tests/policy/baseline/household/income/person/total_unemployment_compensation.yaml b/policyengine_us/tests/policy/baseline/household/income/person/total_unemployment_compensation.yaml index ca1c8e86fe8..ad439790edc 100644 --- a/policyengine_us/tests/policy/baseline/household/income/person/total_unemployment_compensation.yaml +++ b/policyengine_us/tests/policy/baseline/household/income/person/total_unemployment_compensation.yaml @@ -161,13 +161,24 @@ output: # 6,000 / 12 = 500 and 10,218 / 12 = 851.50. snap_unearned_income_person: [500, 851.5] - snap_unearned_income: 1_351.5 - # 1,351.50 - 204 = 1,147.50; shelter = 758 - 1,147.50 / 2 = 184.25; - # net = 1,147.50 - 184.25 = 963.25 -> 963. - snap_net_income: 963 - # 536 maximum allotment - ceil(0.3 * 963 = 288.90) = 536 - 289 = 247. - # Before, only person1's 500 counted and SNAP paid the full 536. - snap: 247 + # 7 CFR 273.7(b)(1)(v) exempts only months of UC receipt. person1 has + # reported UC and no weeks unemployed, so receives in all 12 months. + # person2's 26 weeks give ceil(26 * 12 / 52) = 6 months; as the + # household's second member the block starts in February (February to + # July), so person2 does not receive UC in January. + is_receiving_unemployment_compensation: [true, false] + # Without the exemption, person2 (age 38, no work hours, PA fallback + # county not waived) is ineligible under the ABAWD time limit, so + # 7 CFR 273.11(c)(2)(ii) counts the eligible share of person2's income: + # 1 SNAP unit member / 2 household members = 0.5. + snap_income_counted_share: [1, 0.5] + # 500 + 0.5 * 851.50 = 925.75. + snap_unearned_income: 925.75 + # 925.75 - 204 = 721.75; shelter = 758 - 721.75 / 2 = 397.125; + # net = 721.75 - 397.125 = 324.625 -> 325. + snap_net_income: 325 + # 1-person maximum allotment 292 - ceil(0.3 * 325 = 97.50) = 292 - 98 = 194. + snap: 194 - name: Case 6, explicitly reported zero UC still falls back to modeled PA UC. period: 2025 diff --git a/policyengine_us/tests/policy/baseline/household/income/spm_unit/spm_unit_benefits.yaml b/policyengine_us/tests/policy/baseline/household/income/spm_unit/spm_unit_benefits.yaml index c6f1535273d..736665e9d7d 100644 --- a/policyengine_us/tests/policy/baseline/household/income/spm_unit/spm_unit_benefits.yaml +++ b/policyengine_us/tests/policy/baseline/household/income/spm_unit/spm_unit_benefits.yaml @@ -128,11 +128,14 @@ - name: Benefits include modeled state unemployment insurance net of the SNAP it reduces. # Low-income Pennsylvania adult with no reported UC and no earnings. Modeled # pa_uc = 10,218 feeds total_unemployment_compensation and SNAP unearned - # income (851.50 per month). SNAP is 228 per month for January-September - # (292 maximum - 64) and 265 for October-December (298 maximum - 33), so - # annual snap = 228 * 9 + 265 * 3 = 2,052 + 795 = 2,847. - # spm_unit_benefits = 10,218 + 2,847 = 13,065. Without the modeled UC in SNAP - # income, snap would be 292 * 9 + 298 * 3 = 3,522. + # income (851.50 per month). 7 CFR 273.7(b)(1)(v) exempts only months of UC + # receipt: 26 weeks unemployed give ceil(26 * 12 / 52) = 6 months, starting + # in January for the household's first member. In January-June SNAP is 228 + # per month (292 maximum - ceil(0.3 * 213 net income) = 292 - 64). + # From July the person no longer receives UC and, with no work hours and + # PA's fallback county not waived, is ineligible under the ABAWD time limit, + # so SNAP is 0. Annual snap = 228 * 6 = 1,368. + # spm_unit_benefits = 10,218 + 1,368 = 11,586. period: 2025 absolute_error_margin: 0.01 input: @@ -154,5 +157,6 @@ output: pa_uc: 10_218 total_unemployment_compensation: 10_218 - snap: 2_847 - spm_unit_benefits: 13_065 + unemployment_compensation_months: 6 + snap: 1_368 + spm_unit_benefits: 11_586 From 36192aabb31aa86e8341b666b03e9c3860952de1 Mon Sep 17 00:00:00 2001 From: David Trimmer Date: Mon, 12 Oct 2026 22:25:16 -0400 Subject: [PATCH 8/9] List total_unemployment_compensation in the AR line-comment check Main's code-health test pins the AR1000F line for every Arkansas gross income source; the unemployment line (21 from 2018) now reads total_unemployment_compensation. Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01LqCGPgxDukji8Bhs57c5rH --- .../code_health/test_ar_gross_income_source_line_comments.py | 1 + 1 file changed, 1 insertion(+) diff --git a/policyengine_us/tests/code_health/test_ar_gross_income_source_line_comments.py b/policyengine_us/tests/code_health/test_ar_gross_income_source_line_comments.py index 9bcafacd5aa..02beb4bceeb 100644 --- a/policyengine_us/tests/code_health/test_ar_gross_income_source_line_comments.py +++ b/policyengine_us/tests/code_health/test_ar_gross_income_source_line_comments.py @@ -77,6 +77,7 @@ "farm_rent_income": "19", "farm_operations_income": "20", "unemployment_compensation": "21", + "total_unemployment_compensation": "21", "gambling_winnings": "22", } From d79f740f663c85c9672bb0c36e77338a58ac3e99 Mon Sep 17 00:00:00 2001 From: David Trimmer Date: Tue, 13 Oct 2026 10:28:21 -0400 Subject: [PATCH 9/9] Route the remaining unemployment compensation readers through the total Thirteen readers that later merges of main brought in still read the reported-only unemployment_compensation input, so they missed modeled state UI when nothing was reported: - the student loan interest ALD MAGI and the two IRA deduction MAGI formulas (ira_219g_magi, ira_219g_taxable_social_security), which now append total_unemployment_compensation. The total never reaches AGI, so there is no cycle; - ten parameter source lists: NY HEAP, NJ LIHEAP, IN EAP, KS LIEAP, KY LIHEAP, MD MEAP, MO SAB, MS LIHEAP, NC LIEAP and OR LIHEAP. Each reader gets regression cases in its own test file: a modeled-UI case plus a reported-UI control where the state models UI (PA for the federal MAGI formulas, NY, NJ), and a reported-UI control elsewhere. The two IRA variables get new test files named for them. Add a code-health guard that fails when a parameter list entry or a Python string constant names the raw input, with an allowlist for uprating, the TAXSIM generator and the total's own formula. Add a microsimulation guard that modeled state UI is zero on the certified default build in 2025. Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01LqCGPgxDukji8Bhs57c5rH --- .../states/in/ihcda/eap/income/sources.yaml | 2 +- .../dcf/liheap/income/sources/unearned.yaml | 2 +- .../dcbs/liheap/unearned_income_sources.yaml | 2 +- .../md/dhs/meap/income/sources/unearned.yaml | 2 +- .../dss/ssp/sab/income/sources/unearned.yaml | 2 +- .../mdhs/liheap/unearned_income_sources.yaml | 2 +- .../ncdhhs/lieap/unearned_income_sources.yaml | 2 +- .../dca/liheap/income/sources/unearned.yaml | 2 +- .../ny/otda/heap/income/sources/unearned.yaml | 2 +- .../ohcs/liheap/income/sources/unearned.yaml | 2 +- .../test_unemployment_compensation_readers.py | 168 ++++++++++++++++++ .../tests/microsimulation/test_microsim.py | 34 ++++ .../student_loan_interest_ald_magi.yaml | 58 ++++++ .../baseline/gov/irs/ira/ira_219g_magi.yaml | 33 ++++ .../ira/ira_219g_taxable_social_security.yaml | 42 +++++ .../states/in/ihcda/eap/in_eap_income.yaml | 14 ++ .../income/ks_liheap_countable_income.yaml | 25 +++ .../ky/dcbs/liheap/ky_liheap_income.yaml | 15 ++ .../meap/income/md_meap_countable_income.yaml | 16 ++ .../mo/dss/ssp/mo_sab_countable_income.yaml | 20 +++ .../ms/mdhs/liheap/ms_liheap_income.yaml | 22 +++ .../nc/ncdhhs/lieap/nc_lieap_income.yaml | 19 ++ .../nj_liheap_countable_income_person.yaml | 33 ++++ .../heap/income/ny_heap_countable_income.yaml | 32 ++++ .../income/or_liheap_countable_income.yaml | 24 +++ .../ira/ira_219g_magi.py | 2 +- .../ira/ira_219g_taxable_social_security.py | 2 +- .../student_loan_interest_ald_magi.py | 8 +- 28 files changed, 571 insertions(+), 16 deletions(-) create mode 100644 policyengine_us/tests/code_health/test_unemployment_compensation_readers.py create mode 100644 policyengine_us/tests/policy/baseline/gov/irs/ira/ira_219g_magi.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/irs/ira/ira_219g_taxable_social_security.yaml diff --git a/policyengine_us/parameters/gov/states/in/ihcda/eap/income/sources.yaml b/policyengine_us/parameters/gov/states/in/ihcda/eap/income/sources.yaml index b2e1e413598..c55c5d79f33 100644 --- a/policyengine_us/parameters/gov/states/in/ihcda/eap/income/sources.yaml +++ b/policyengine_us/parameters/gov/states/in/ihcda/eap/income/sources.yaml @@ -16,7 +16,7 @@ values: - partnership_s_corp_income - estate_income - farm_rent_income - - unemployment_compensation + - total_unemployment_compensation - strike_benefits - pension_income # Section 6.1 (pages 54-55) counts ongoing pension and retirement payments. diff --git a/policyengine_us/parameters/gov/states/ks/dcf/liheap/income/sources/unearned.yaml b/policyengine_us/parameters/gov/states/ks/dcf/liheap/income/sources/unearned.yaml index c31480fd362..cee09cb98e1 100644 --- a/policyengine_us/parameters/gov/states/ks/dcf/liheap/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/states/ks/dcf/liheap/income/sources/unearned.yaml @@ -1,7 +1,7 @@ description: Kansas uses these unearned income sources to determine gross household income under the Low Income Energy Assistance Program. values: 2024-10-01: - - unemployment_compensation + - total_unemployment_compensation - strike_benefits # SSA benefits are counted gross, including the Medicare deduction. - social_security diff --git a/policyengine_us/parameters/gov/states/ky/dcbs/liheap/unearned_income_sources.yaml b/policyengine_us/parameters/gov/states/ky/dcbs/liheap/unearned_income_sources.yaml index 4a6f6bb9760..fa0e262e0f3 100644 --- a/policyengine_us/parameters/gov/states/ky/dcbs/liheap/unearned_income_sources.yaml +++ b/policyengine_us/parameters/gov/states/ky/dcbs/liheap/unearned_income_sources.yaml @@ -1,7 +1,7 @@ description: Kentucky counts these unearned income sources under the Low Income Home Energy Assistance Program. values: 2024-10-01: - - unemployment_compensation + - total_unemployment_compensation - strike_benefits # Social Security is counted in the formula, gross for FY2025 and net of # the Medicare Part B premium from FY2026 diff --git a/policyengine_us/parameters/gov/states/md/dhs/meap/income/sources/unearned.yaml b/policyengine_us/parameters/gov/states/md/dhs/meap/income/sources/unearned.yaml index 7e6713978b9..03a91cef008 100644 --- a/policyengine_us/parameters/gov/states/md/dhs/meap/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/states/md/dhs/meap/income/sources/unearned.yaml @@ -18,7 +18,7 @@ values: - child_support_received - alimony_income - workers_compensation - - unemployment_compensation + - total_unemployment_compensation - veterans_benefits - strike_benefits - rental_income diff --git a/policyengine_us/parameters/gov/states/mo/dss/ssp/sab/income/sources/unearned.yaml b/policyengine_us/parameters/gov/states/mo/dss/ssp/sab/income/sources/unearned.yaml index 78f9453170b..d0de6a1e2e3 100644 --- a/policyengine_us/parameters/gov/states/mo/dss/ssp/sab/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/states/mo/dss/ssp/sab/income/sources/unearned.yaml @@ -20,7 +20,7 @@ values: - veterans_benefits - survivor_benefits - workers_compensation - - unemployment_compensation + - total_unemployment_compensation - retirement_distributions - railroad_benefits - strike_benefits diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/unearned_income_sources.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/unearned_income_sources.yaml index f4b486eb450..1fcef4033a0 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/unearned_income_sources.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/unearned_income_sources.yaml @@ -1,7 +1,7 @@ description: Mississippi counts these unearned income sources under the Low Income Home Energy Assistance Program. values: 2025-10-01: - - unemployment_compensation + - total_unemployment_compensation - social_security # Rule 6.11 F(3) lists Railroad Retirement benefits. - railroad_benefits diff --git a/policyengine_us/parameters/gov/states/nc/ncdhhs/lieap/unearned_income_sources.yaml b/policyengine_us/parameters/gov/states/nc/ncdhhs/lieap/unearned_income_sources.yaml index da067718336..90a12cec543 100644 --- a/policyengine_us/parameters/gov/states/nc/ncdhhs/lieap/unearned_income_sources.yaml +++ b/policyengine_us/parameters/gov/states/nc/ncdhhs/lieap/unearned_income_sources.yaml @@ -22,7 +22,7 @@ values: # "Veterans" (page 25); plan "Veterans Administration (VA) benefits". - veterans_benefits # "Unemployment" (page 24); plan "Unemployment insurance". - - unemployment_compensation + - total_unemployment_compensation # "Worker's Compensation" (page 26) and "Disability Payments" (page 6). # The plan leaves "Insurance payments made directly to the insured" # unchecked; the model follows the manual. diff --git a/policyengine_us/parameters/gov/states/nj/dca/liheap/income/sources/unearned.yaml b/policyengine_us/parameters/gov/states/nj/dca/liheap/income/sources/unearned.yaml index 57ebb40cfe0..785f8560178 100644 --- a/policyengine_us/parameters/gov/states/nj/dca/liheap/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/states/nj/dca/liheap/income/sources/unearned.yaml @@ -1,7 +1,7 @@ description: New Jersey uses these sources as unearned income under the Low Income Home Energy Assistance Program. values: 2025-10-01: - - unemployment_compensation + - total_unemployment_compensation # The FY2027 plan (1.9, page 6) leaves Strike Pay and General Assistance # unchecked where the FY2026 plan checks them; handbook 2.2 (page 6) counts GA # grants toward the standard and 2.2.3 makes striker households ineligible, diff --git a/policyengine_us/parameters/gov/states/ny/otda/heap/income/sources/unearned.yaml b/policyengine_us/parameters/gov/states/ny/otda/heap/income/sources/unearned.yaml index 95dc3e60e45..0750ab33c66 100644 --- a/policyengine_us/parameters/gov/states/ny/otda/heap/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/states/ny/otda/heap/income/sources/unearned.yaml @@ -4,7 +4,7 @@ values: # Social Security and railroad benefits are counted in the formula, net of the # Medicare Part B premium under D.12(a)(6) and (8). - ssi - - unemployment_compensation + - total_unemployment_compensation - strike_benefits - workers_compensation - disability_benefits diff --git a/policyengine_us/parameters/gov/states/or/ohcs/liheap/income/sources/unearned.yaml b/policyengine_us/parameters/gov/states/or/ohcs/liheap/income/sources/unearned.yaml index 18698f13f7f..1bfc7c4ec32 100644 --- a/policyengine_us/parameters/gov/states/or/ohcs/liheap/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/states/or/ohcs/liheap/income/sources/unearned.yaml @@ -8,7 +8,7 @@ values: - social_security - railroad_benefits - ssi - - unemployment_compensation + - total_unemployment_compensation - workers_compensation - veterans_benefits - pension_income diff --git a/policyengine_us/tests/code_health/test_unemployment_compensation_readers.py b/policyengine_us/tests/code_health/test_unemployment_compensation_readers.py new file mode 100644 index 00000000000..d0b89676d7d --- /dev/null +++ b/policyengine_us/tests/code_health/test_unemployment_compensation_readers.py @@ -0,0 +1,168 @@ +"""Income flows read total_unemployment_compensation, not the raw input. + +`unemployment_compensation` is the reported (uprated) input. +`total_unemployment_compensation` uses that amount when it is nonzero and +otherwise falls back to the modeled state unemployment insurance programs, so +a formula or parameter source list that reads the raw input misses modeled UI. +After the readers moved to the total, later merges of main brought in 13 new +raw readers, so this check fails on any new one. + +Checked: +- Parameter YAML: a block list entry `- unemployment_compensation` or a + flow-style list containing it. Comments are ignored, so commented-out + entries do not count. +- Python in the package (tests excluded): a string constant exactly equal to + "unemployment_compensation". That covers gross-income-source appends, + source lists, `adds`, `add()` and direct entity reads. Dotted parameter + paths, longer variable names and comments are not that constant. + +Allowed: the Python files in ALLOWED_PYTHON_FILES, which need the raw input +itself. The variable's own definition names it as a class, not a string, so it +needs no entry. To add a reader that truly needs the reported-only amount, list +its file there with the reason. + +The check reads text and syntax trees without importing the model. +""" + +import ast +import re +from pathlib import Path + + +PACKAGE = Path(__file__).resolve().parents[2] +PARAMETERS = PACKAGE / "parameters" +TESTS = PACKAGE / "tests" +RAW = "unemployment_compensation" + +ALLOWED_PYTHON_FILES = { + # Input uprating keeps the raw input on the SOI series. + "reforms/ssa/trustees_2025.py": "uprating under the 2025 Trustees reform", + "tools/default_uprating.py": "default input uprating", + # TAXSIM supplies reported unemployment compensation as an input. + "tools/taxsim/generate_taxsim_tests.py": "TAXSIM test generator input", + # The adapter that reads the reported amount and falls back to modeled UI. + "variables/household/income/person/total_unemployment_compensation.py": ( + "total_unemployment_compensation formula" + ), +} + +# A raw entry in a block list (`- unemployment_compensation`) or a flow list +# (`[a, unemployment_compensation]`), after the comment is removed. +YAML_RAW_ENTRY = re.compile( + r"(?:^\s*-\s*|[\[,]\s*)" + RAW + r"\s*(?:$|[\],])", +) + + +def raw_yaml_lines(text: str) -> list[int]: + """Line numbers of uncommented raw list entries in parameter YAML text.""" + lines = [] + for number, line in enumerate(text.splitlines(), start=1): + code = line.split("#", 1)[0] + if YAML_RAW_ENTRY.search(code): + lines.append(number) + return lines + + +def raw_python_lines(source: str, filename: str = "") -> list[int]: + """Line numbers of string constants equal to the raw input name.""" + tree = ast.parse(source, filename=filename) + return sorted( + node.lineno + for node in ast.walk(tree) + if isinstance(node, ast.Constant) and node.value == RAW + ) + + +def package_python_files(): + for path in sorted(PACKAGE.rglob("*.py")): + if TESTS in path.parents: + continue + yield path + + +def test_detectors_flag_raw_readers_and_skip_everything_else(): + assert raw_yaml_lines( + "values:\n" + " 2025-01-01:\n" + " - ssi\n" + " - unemployment_compensation\n" + " - unemployment_compensation # trailing comment\n" + " 2026-01-01: [ssi, unemployment_compensation]\n" + ) == [4, 5, 6] + assert ( + raw_yaml_lines( + "values:\n" + " 2025-01-01:\n" + " - total_unemployment_compensation\n" + " # - unemployment_compensation\n" + " # unemployment_compensation is excluded\n" + " - taxable_unemployment_compensation\n" + " 2026-01-01: [ssi, total_unemployment_compensation]\n" + "metadata:\n" + " parameter: calibration.gov.cbo.unemployment_compensation\n" + ) + == [] + ) + assert raw_python_lines( + 'sources.append("unemployment_compensation")\n' + 'adds = ["employment_income", "unemployment_compensation"]\n' + 'uc = person("unemployment_compensation", period)\n' + ) == [1, 2, 3] + assert ( + raw_python_lines( + "class unemployment_compensation(Variable):\n" + ' uprating = "calibration.gov.irs.soi.unemployment_compensation"\n' + "# unemployment_compensation in a comment\n" + 'uc = person("total_unemployment_compensation", period)\n' + "x = p.unemployment_compensation.agi_reduction\n" + ) + == [] + ) + + +def test_parameter_source_lists_do_not_read_raw_unemployment_compensation(): + violations = [] + for path in sorted(PARAMETERS.rglob("*.yaml")): + text = path.read_text(encoding="utf-8") + if RAW not in text: + continue + for line in raw_yaml_lines(text): + violations.append(f"{path.relative_to(PACKAGE).as_posix()}:{line}") + assert not violations, ( + "List total_unemployment_compensation, not the reported-only " + "unemployment_compensation input, so modeled state unemployment " + "insurance counts. Raw entries:\n" + "\n".join(violations) + ) + + +def test_python_does_not_read_raw_unemployment_compensation(): + violations = [] + for path in package_python_files(): + relative = path.relative_to(PACKAGE).as_posix() + if relative in ALLOWED_PYTHON_FILES: + continue + source = path.read_text(encoding="utf-8") + if RAW not in source: + continue + for line in raw_python_lines(source, filename=str(path)): + violations.append(f"{relative}:{line}") + assert not violations, ( + "Read or append total_unemployment_compensation, not the " + "reported-only unemployment_compensation input, so modeled state " + "unemployment insurance counts. If a reader truly needs the reported " + "amount, add its file to ALLOWED_PYTHON_FILES with the reason. Raw " + "reads:\n" + "\n".join(violations) + ) + + +def test_allowed_python_files_still_read_the_raw_input(): + stale = [ + relative + for relative in ALLOWED_PYTHON_FILES + if not (PACKAGE / relative).exists() + or not raw_python_lines((PACKAGE / relative).read_text(encoding="utf-8")) + ] + assert not stale, ( + "These ALLOWED_PYTHON_FILES entries no longer read the raw " + "unemployment_compensation input; remove them:\n" + "\n".join(stale) + ) diff --git a/policyengine_us/tests/microsimulation/test_microsim.py b/policyengine_us/tests/microsimulation/test_microsim.py index a7ecdfd7eb2..9081b6474ad 100644 --- a/policyengine_us/tests/microsimulation/test_microsim.py +++ b/policyengine_us/tests/microsimulation/test_microsim.py @@ -278,3 +278,37 @@ def test_default_dataset_uses_its_supplied_tax_unit_roles(): f"{variable} disagrees with tax_unit_role_input == {name} for " f"{mismatched} of {role.size} people." ) + + +def test_default_dataset_has_no_modeled_state_unemployment_compensation(): + """Modeled state unemployment insurance is zero on the certified default build. + + `total_unemployment_compensation` falls back to the modeled state + unemployment insurance programs only when no unemployment compensation is + reported. Those programs need wage-history and claim inputs (base-period + wages, high-quarter wages, credit weeks, weeks claimed) that default to 0 + and that `populace_us_2024` does not carry, so routing income flows through + the total leaves population results unchanged. 2025 is checked because its + modeled list holds every program (AL, NJ, NY, OK, PA, UT); earlier years + hold a subset. + + The whole population is checked, with no subsample, because a build that + gains those inputs for a few records would be missed by a sample. Only this + one variable and the person weights are computed. If this fails, the build + now feeds modeled UI into every program that counts unemployment + compensation, and that aggregate effect needs review. + """ + import numpy as np + + from policyengine_us import Microsimulation + + simulation = Microsimulation() # populace_us_2024, full population. + modeled = np.asarray( + simulation.calculate("modeled_state_unemployment_compensation", 2025) + ) + nonzero = int((modeled != 0).sum()) + assert nonzero == 0, ( + f"populace_us_2024 (certified default build), 2025: {nonzero} of " + f"{modeled.size} people have nonzero modeled state unemployment " + f"compensation (unweighted total {modeled.sum():,.0f})." + ) diff --git a/policyengine_us/tests/policy/baseline/gov/irs/income/taxable_income/deductions/student_loan_interest/student_loan_interest_ald_magi.yaml b/policyengine_us/tests/policy/baseline/gov/irs/income/taxable_income/deductions/student_loan_interest/student_loan_interest_ald_magi.yaml index a9e4ef9b198..bbeeaa9f222 100644 --- a/policyengine_us/tests/policy/baseline/gov/irs/income/taxable_income/deductions/student_loan_interest/student_loan_interest_ald_magi.yaml +++ b/policyengine_us/tests/policy/baseline/gov/irs/income/taxable_income/deductions/student_loan_interest/student_loan_interest_ald_magi.yaml @@ -250,3 +250,61 @@ output: # Pub. 970 Worksheet 4-1 lines 5 and 6 take Form 2555 lines 45 and 50. student_loan_interest_ald_magi: 85_000 + +- name: Modeled state unemployment compensation counts in full + period: 2025 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 35 + employment_income: 85_000 + student_loan_interest: 2_500 + student_loan_interest_ald_eligible: true + # PA UC integration inputs: pa_uc = 10,218. + pa_uc_highest_quarter_wages: 10_000 + pa_uc_base_year_wages: 28_000 + pa_uc_credit_weeks: 26 + weeks_unemployed: 26 + pa_uc_gross_weekly_earnings: 0 + tax_units: + tax_unit: + members: [person1] + filing_status: SINGLE + households: + household: + members: [person1] + state_code: PA + output: + # No reported UC, so total UC falls back to the modeled PA UC. + total_unemployment_compensation: 10_218 + # 85,000 + 10,218 = 95,218. + student_loan_interest_ald_magi: 95_218 + # 2025 single phase-out from 85,000 over 15,000: + # 2,500 - 2,500 * (95,218 - 85,000) / 15,000 = 2,500 - 1,703 = 797. + student_loan_interest_ald: 797 + +- name: Reported unemployment compensation counts in full, as the control for modeled UC + period: 2025 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 35 + employment_income: 85_000 + unemployment_compensation: 10_218 + student_loan_interest: 2_500 + student_loan_interest_ald_eligible: true + tax_units: + tax_unit: + members: [person1] + filing_status: SINGLE + households: + household: + members: [person1] + state_code: PA + output: + # Reported UC overrides modeled UC and gives the same MAGI and deduction. + total_unemployment_compensation: 10_218 + student_loan_interest_ald_magi: 95_218 + student_loan_interest_ald: 797 diff --git a/policyengine_us/tests/policy/baseline/gov/irs/ira/ira_219g_magi.yaml b/policyengine_us/tests/policy/baseline/gov/irs/ira/ira_219g_magi.yaml new file mode 100644 index 00000000000..59c78f75eb8 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/irs/ira/ira_219g_magi.yaml @@ -0,0 +1,33 @@ +# 26 U.S.C. 219(g)(3)(A)(ii) figures IRA MAGI without regard to section 85(c), +# so all unemployment compensation counts, reported or modeled. The PA inputs +# below give pa_uc = 10,218 (see the PA UC integration tests). + +- name: Case 1, modeled state unemployment compensation counts in IRA MAGI. + period: 2025 + absolute_error_margin: 0.01 + input: + age: 35 + state_code: PA + employment_income: 80_000 + pa_uc_highest_quarter_wages: 10_000 + pa_uc_base_year_wages: 28_000 + pa_uc_credit_weeks: 26 + weeks_unemployed: 26 + pa_uc_gross_weekly_earnings: 0 + output: + # No reported UC, so total UC falls back to the modeled PA UC. + total_unemployment_compensation: 10_218 + # 80,000 + 10,218 = 90,218. + ira_219g_magi: 90_218 + +- name: Case 2, reported unemployment compensation counts in IRA MAGI, as the control for modeled UC. + period: 2025 + absolute_error_margin: 0.01 + input: + age: 35 + state_code: PA + employment_income: 80_000 + unemployment_compensation: 10_218 + output: + total_unemployment_compensation: 10_218 + ira_219g_magi: 90_218 diff --git a/policyengine_us/tests/policy/baseline/gov/irs/ira/ira_219g_taxable_social_security.yaml b/policyengine_us/tests/policy/baseline/gov/irs/ira/ira_219g_taxable_social_security.yaml new file mode 100644 index 00000000000..d5ad00577ba --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/irs/ira/ira_219g_taxable_social_security.yaml @@ -0,0 +1,42 @@ +# Taxable Social Security figured before the IRA deduction (Pub. 590-A +# Appendix B, Worksheet 1). Its section 86 MAGI counts all unemployment +# compensation, reported or modeled. The PA inputs below give pa_uc = 10,218 +# (see the PA UC integration tests). + +- name: Case 1, modeled state unemployment compensation raises taxable Social Security. + period: 2025 + absolute_error_margin: 0.01 + input: + age: 35 + state_code: PA + employment_income: 20_000 + social_security_retirement: 20_000 + pa_uc_highest_quarter_wages: 10_000 + pa_uc_base_year_wages: 28_000 + pa_uc_credit_weeks: 26 + weeks_unemployed: 26 + pa_uc_gross_weekly_earnings: 0 + output: + # No reported UC, so total UC falls back to the modeled PA UC. + total_unemployment_compensation: 10_218 + # MAGI = 20,000 + 10,218 = 30,218; combined income = 30,218 + 20,000 / 2 + # = 40,218, above the 34,000 single adjusted base amount. + # Bracket = min(0.5 * (40,218 - 25,000) = 7,609, 0.5 * (34,000 - 25,000) + # = 4,500) = 4,500. + # Taxable = min(0.85 * (40,218 - 34,000) + 4,500 = 9,785.30, + # 0.85 * 20,000 = 17,000) = 9,785.30. + # Without UC, combined income of 30,000 would make only 2,500 taxable. + ira_219g_taxable_social_security: 9_785.3 + +- name: Case 2, reported unemployment compensation raises taxable Social Security, as the control for modeled UC. + period: 2025 + absolute_error_margin: 0.01 + input: + age: 35 + state_code: PA + employment_income: 20_000 + social_security_retirement: 20_000 + unemployment_compensation: 10_218 + output: + total_unemployment_compensation: 10_218 + ira_219g_taxable_social_security: 9_785.3 diff --git a/policyengine_us/tests/policy/baseline/gov/states/in/ihcda/eap/in_eap_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/ihcda/eap/in_eap_income.yaml index 7703a961d5b..2b22ed5f356 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/in/ihcda/eap/in_eap_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/in/ihcda/eap/in_eap_income.yaml @@ -188,3 +188,17 @@ output: medicare_part_b_premium: [0, 2_434.8, 0] in_eap_income: [12_000, 24_000, 12_000] + +- name: Case 10, reported unemployment compensation counts as income. + # The source list reads total_unemployment_compensation. Indiana has no + # modeled unemployment insurance program, so the total is the reported + # amount and this control shows reported UC still counts. + period: 2026 + input: + state_code: IN + age: 40 + unemployment_compensation: 6_000 + ssi: 0 + output: + total_unemployment_compensation: 6_000 + in_eap_income: 6_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/income/ks_liheap_countable_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/income/ks_liheap_countable_income.yaml index 9662fb1dd66..e297250172a 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/income/ks_liheap_countable_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/income/ks_liheap_countable_income.yaml @@ -242,3 +242,28 @@ ks_liheap_countable_unearned_income: 7_200 # 0 earned income + 7,200 unearned income = 7,200. ks_liheap_countable_income: 7_200 + +- name: Case 11, reported unemployment compensation is counted as unearned income. + # The unearned source list reads total_unemployment_compensation. Kansas has + # no modeled unemployment insurance program, so the total is the reported + # amount and this control shows reported UC still counts. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + unemployment_compensation: 6_000 + spm_units: + spm_unit: + members: [person1] + ks_tanf: 0 + households: + household: + members: [person1] + state_code: KS + output: + total_unemployment_compensation: 6_000 + ks_liheap_countable_unearned_income: 6_000 + # 0 earned income + 6,000 unearned income = 6,000. + ks_liheap_countable_income: 6_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/liheap/ky_liheap_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/liheap/ky_liheap_income.yaml index 696673bda4b..da472912188 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/liheap/ky_liheap_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/liheap/ky_liheap_income.yaml @@ -204,3 +204,18 @@ output: medicare_part_b_premium: 2_220 ky_liheap_income: 22_700 + +- name: Case 10, reported unemployment compensation is counted as unearned income. + # The unearned source list reads total_unemployment_compensation. Kentucky + # has no modeled unemployment insurance program, so the total is the + # reported amount and this control shows reported UC still counts. + period: 2026 + input: + state_code: KY + age: 40 + unemployment_compensation: 6_000 + ssi: 0 + tanf: 0 + output: + total_unemployment_compensation: 6_000 + ky_liheap_income: 6_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/md/dhs/meap/income/md_meap_countable_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/md/dhs/meap/income/md_meap_countable_income.yaml index a66b8799fa3..1833903921a 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/md/dhs/meap/income/md_meap_countable_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/md/dhs/meap/income/md_meap_countable_income.yaml @@ -103,3 +103,19 @@ # like the earned sources: $33,000 + $0 + $0 = $33,000, and $33,000 + $3,000 = # $36,000. md_meap_countable_income: [33_000, 36_000] + +- name: Case 6, reported unemployment compensation counts as unearned income. + # The unearned source list reads total_unemployment_compensation. Maryland + # has no modeled unemployment insurance program, so the total is the + # reported amount and this control shows reported UC still counts. + period: 2026 + input: + state_code: MD + age: 40 + unemployment_compensation: 6_000 + ssi: 0 + tanf: 0 + output: + total_unemployment_compensation: 6_000 + # COMAR 07.03.21.04D(17) counts unemployment benefits. + md_meap_countable_income: 6_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/mo/dss/ssp/mo_sab_countable_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/mo/dss/ssp/mo_sab_countable_income.yaml index 71000fadf2b..5f200fd0c10 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mo/dss/ssp/mo_sab_countable_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mo/dss/ssp/mo_sab_countable_income.yaml @@ -686,3 +686,23 @@ # § 0410.015.10 lists other need-based assistance programs. # $1,000 Social Security + $500 = $1,500, above the $1,073 standard. mo_sab_countable_income: 1_500 + +- name: Case 38, reported unemployment compensation is unearned income. + # The unearned source list reads total_unemployment_compensation. Missouri + # has no modeled unemployment insurance program, so the total is the + # reported amount and this control shows reported UC still counts. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 50 + unemployment_compensation: 12_000 + households: + household: + members: [person1] + state_code: MO + output: + # 12,000 / 12 = 1,000 a month, counted in full. + total_unemployment_compensation: 1_000 + mo_sab_countable_income: 1_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_income.yaml index 75d007d5117..a2323f7e1c9 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_income.yaml @@ -207,3 +207,25 @@ # Railroad Retirement benefits" as unearned income. # 21,600 Railroad Retirement + 9,600 Social Security = 31,200. ms_liheap_income: 31_200 + +- name: Case 9, reported unemployment compensation counts as unearned income. + # The unearned source list reads total_unemployment_compensation. + # Mississippi has no modeled unemployment insurance program, so the total is + # the reported amount and this control shows reported UC still counts. + period: 2026 + input: + people: + person1: + age: 40 + unemployment_compensation: 6_000 + ssi: 0 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: MS + output: + total_unemployment_compensation: 6_000 + ms_liheap_income: 6_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nc/ncdhhs/lieap/nc_lieap_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/nc/ncdhhs/lieap/nc_lieap_income.yaml index e6a07b8b9a1..690b146bbb4 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/nc/ncdhhs/lieap/nc_lieap_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/nc/ncdhhs/lieap/nc_lieap_income.yaml @@ -323,3 +323,22 @@ nc_lieap_gross_income_person: [13_500, 16_800] nc_lieap_income: [13_500, 16_800] absolute_error_margin: 0.01 + +- name: Case 13, reported unemployment compensation counts as unearned income. + # The unearned source list reads total_unemployment_compensation. North + # Carolina has no modeled unemployment insurance program, so the total is + # the reported amount and this control shows reported UC still counts. + period: 2026 + input: + state_code: NC + age: 40 + unemployment_compensation: 6_000 + ssi: 0 + social_security: 0 + tanf: 0 + childcare_expenses: 0 + output: + total_unemployment_compensation: 6_000 + # "Unemployment" (FNS 300.02 chart, page 24) has no work deduction. + nc_lieap_gross_income_person: 6_000 + absolute_error_margin: 0.01 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/dca/liheap/income/nj_liheap_countable_income_person.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/dca/liheap/income/nj_liheap_countable_income_person.yaml index 0de079349e7..8e50492f0f5 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/nj/dca/liheap/income/nj_liheap_countable_income_person.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/nj/dca/liheap/income/nj_liheap_countable_income_person.yaml @@ -177,3 +177,36 @@ disability_benefits: 1_400 output: nj_liheap_countable_income_person: 10_500 + +- name: Case 7, modeled New Jersey unemployment insurance counts as unearned income. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: NJ + age: 40 + social_security: 0 + ssi: 0 + # Average weekly wage = 10,000 / 20 = 500; weekly benefit rate = + # floor(0.6 * 500) = 300; weeks = min(26 claimed, 20 base weeks) = 20; + # nj_unemployment_insurance = 300 * 20 = 6,000. + nj_unemployment_insurance_base_period_weeks: 20 + nj_unemployment_insurance_base_period_wages: 10_000 + nj_unemployment_insurance_weeks_claimed: 26 + output: + nj_unemployment_insurance: 6_000 + # No reported UC, so total UC falls back to the modeled NJ UI. + total_unemployment_compensation: 6_000 + nj_liheap_countable_income_person: 6_000 + +- name: Case 8, reported unemployment compensation counts as unearned income, as the control for modeled UI. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: NJ + age: 40 + social_security: 0 + ssi: 0 + unemployment_compensation: 6_000 + output: + total_unemployment_compensation: 6_000 + nj_liheap_countable_income_person: 6_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ny/otda/heap/income/ny_heap_countable_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/ny/otda/heap/income/ny_heap_countable_income.yaml index 1b492a2850f..46fbe0227e8 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ny/otda/heap/income/ny_heap_countable_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ny/otda/heap/income/ny_heap_countable_income.yaml @@ -154,3 +154,35 @@ # above the Tier I maximum of 1,695: Utility 400 + 35 for a member aged 60 # or older (Chapter 9 B.3(b)(2), page 49) = 435. ny_heap: 435 + +- name: Case 6, modeled New York unemployment insurance counts as unearned income. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 35 + # NY UI integration inputs: ny_ui = 7,982. + ny_ui_high_quarter_wages: 8_000 + ny_ui_base_period_wages: 28_000 + ny_ui_quarters_with_wages: 4 + weeks_unemployed: 26 + ny_ui_weekly_hours_worked: 0 + ny_ui_gross_weekly_earnings: 0 + ssi: 0 + output: + # No reported UC, so total UC falls back to the modeled NY UI. + total_unemployment_compensation: 7_982 + # D.14(c): floor(7,982 / 12) = 665 a month, annualized 7,980. + ny_heap_countable_income: 7_980 + +- name: Case 7, reported unemployment compensation counts as unearned income, as the control for modeled UI. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 35 + unemployment_compensation: 7_982 + ssi: 0 + output: + total_unemployment_compensation: 7_982 + ny_heap_countable_income: 7_980 diff --git a/policyengine_us/tests/policy/baseline/gov/states/or/ohcs/liheap/income/or_liheap_countable_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/or/ohcs/liheap/income/or_liheap_countable_income.yaml index 8a9c57b5d55..160acda130d 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/or/ohcs/liheap/income/or_liheap_countable_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/or/ohcs/liheap/income/or_liheap_countable_income.yaml @@ -151,3 +151,27 @@ # (page 35 sends landlords to the self-employment form), so the second # member's $6,000 loss does not offset the first member's $6,000 of rent. or_liheap_countable_income: 6_000 + +- name: Case 7, reported unemployment compensation counts as unearned income. + # The unearned source list reads total_unemployment_compensation. Oregon has + # no modeled unemployment insurance program, so the total is the reported + # amount and this control shows reported UC still counts. + period: 2026 + input: + people: + person1: + age: 40 + unemployment_compensation: 6_000 + ssi: 0 + spm_units: + spm_unit: + members: [person1] + tanf: 0 + households: + household: + members: [person1] + state_code: OR + output: + total_unemployment_compensation: 6_000 + # Unemployment insurance is "Considered Income? Yes" (page 48). + or_liheap_countable_income: 6_000 diff --git a/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/ira/ira_219g_magi.py b/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/ira/ira_219g_magi.py index 48cabbaa860..6aa08f7f45e 100644 --- a/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/ira/ira_219g_magi.py +++ b/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/ira/ira_219g_magi.py @@ -21,7 +21,7 @@ def formula(tax_unit, period, parameters): ] if "taxable_unemployment_compensation" in irs.gross_income.sources: # 219(g)(3)(A)(ii): without regard to 85(c). - sources.append("unemployment_compensation") + sources.append("total_unemployment_compensation") person = tax_unit.members not_dependent = ~person("is_tax_unit_dependent", period) gross = 0 diff --git a/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/ira/ira_219g_taxable_social_security.py b/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/ira/ira_219g_taxable_social_security.py index 52ac396a4b6..9bf574bb41c 100644 --- a/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/ira/ira_219g_taxable_social_security.py +++ b/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/ira/ira_219g_taxable_social_security.py @@ -29,7 +29,7 @@ def formula(tax_unit, period, parameters): if s not in ["taxable_social_security", "taxable_unemployment_compensation"] ] if "taxable_unemployment_compensation" in irs.gross_income.sources: - sources.append("unemployment_compensation") + sources.append("total_unemployment_compensation") sources.append("tax_exempt_interest_income") person = tax_unit.members not_dependent = ~person("is_tax_unit_dependent", period) diff --git a/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/student_loan_interest/student_loan_interest_ald_magi.py b/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/student_loan_interest/student_loan_interest_ald_magi.py index 783e272bca5..5fa8a8768cc 100644 --- a/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/student_loan_interest/student_loan_interest_ald_magi.py +++ b/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/student_loan_interest/student_loan_interest_ald_magi.py @@ -30,11 +30,11 @@ def formula(person, period, parameters): if "taxable_unemployment_compensation" in gross_income_sources: # MAGI is determined without regard to section 85(c), so all # unemployment compensation counts, including any amount 85(c) - # excluded for 2020. Reading the untaxed amount also avoids a - # cycle: taxable unemployment compensation depends on AGI, which - # includes this deduction. + # excluded for 2020. Reading the total (reported or modeled) + # amount also avoids a cycle: taxable unemployment compensation + # depends on AGI, which includes this deduction. gross_income_sources.remove("taxable_unemployment_compensation") - gross_income_sources.append("unemployment_compensation") + gross_income_sources.append("total_unemployment_compensation") total_gross_income = 0 for source in gross_income_sources: total_gross_income += not_dependent * max_(0, add(person, period, [source]))