From b8c817b25e473a3125a5345b8c0e003d44ea21db Mon Sep 17 00:00:00 2001 From: Ziming Date: Mon, 12 Oct 2026 14:37:47 -0400 Subject: [PATCH 1/4] Add Wisconsin state supplementation for 2026 --- changelog.d/wi-ssp-2026.added.md | 1 + .../household/household_state_benefits.yaml | 4 + .../hud/annual_income/sources/unearned.yaml | 10 +- .../gov/states/wi/dhs/ssp/amount/couple.yaml | 11 + .../states/wi/dhs/ssp/amount/individual.yaml | 12 + .../amount/ineligible_spouse_independent.yaml | 12 + .../ineligible_spouse_other_household.yaml | 12 + .../wi/dhs/ssp/cts/additional_child.yaml | 10 + .../wi/dhs/ssp/cts/area_i_counties.yaml | 29 + .../wi/dhs/ssp/cts/care_other_limit.yaml | 10 + .../states/wi/dhs/ssp/cts/care_young_age.yaml | 9 + .../wi/dhs/ssp/cts/care_young_limit.yaml | 10 + .../states/wi/dhs/ssp/cts/earned_flat.yaml | 10 + .../wi/dhs/ssp/cts/earned_fraction.yaml | 10 + .../states/wi/dhs/ssp/cts/first_child.yaml | 10 + .../states/wi/dhs/ssp/cts/gross/area_1.yaml | 60 + .../states/wi/dhs/ssp/cts/gross/area_2.yaml | 60 + .../wi/dhs/ssp/cts/gross_additional.yaml | 11 + .../wi/dhs/ssp/cts/gross_pregnant/area_1.yaml | 60 + .../wi/dhs/ssp/cts/gross_pregnant/area_2.yaml | 60 + .../wi/dhs/ssp/cts/maximum_table_size.yaml | 9 + .../wi/dhs/ssp/cts/minor_age_limit.yaml | 9 + .../gov/states/wi/dhs/ssp/cts/net/area_1.yaml | 60 + .../gov/states/wi/dhs/ssp/cts/net/area_2.yaml | 60 + .../states/wi/dhs/ssp/cts/pregnancy_net.yaml | 10 + .../states/wi/dhs/ssp/cts/resource_limit.yaml | 9 + .../wi/dhs/ssp/cts/student_age_limit.yaml | 9 + .../wi/dhs/ssp/cts/student_hours_limit.yaml | 9 + .../states/wi/dhs/ssp/cts/work_expense.yaml | 10 + .../dhs/ssp/exceptional_expense/couple.yaml | 12 + .../ssp/exceptional_expense/individual.yaml | 12 + .../usda/snap/income/sources/unearned.yaml | 13 +- policyengine_us/programs.yaml | 23 + .../wi/dcf/works/wi_works_eligible.yaml | 120 +- .../gov/states/wi/dhs/ssp/integration.yaml | 245 +++ .../gov/states/wi/dhs/ssp/wi_cts.yaml | 1460 +++++++++++++++++ .../gov/states/wi/dhs/ssp/wi_ssp.yaml | 167 ++ .../wi/dhs/ssp/wi_ssp_countable_for_hud.yaml | 796 +++++++++ .../works/eligibility/wi_works_eligible.py | 12 +- .../gov/states/wi/dhs/ssp/_wi_cts.py | 85 + .../variables/gov/states/wi/dhs/ssp/wi_cts.py | 52 + .../ssp/wi_cts_additional_flat_disregard.py | 9 + .../wi_cts_additional_fraction_disregard.py | 9 + .../gov/states/wi/dhs/ssp/wi_cts_area_i.py | 15 + ...ts_buening_large_group_net_income_limit.py | 11 + .../wi/dhs/ssp/wi_cts_buening_member.py | 15 + .../wi/dhs/ssp/wi_cts_child_eligible.py | 33 + .../wi/dhs/ssp/wi_cts_child_excluded.py | 9 + .../wi/dhs/ssp/wi_cts_countable_resources.py | 15 + .../ssp/wi_cts_dependent_care_deduction.py | 20 + .../wi/dhs/ssp/wi_cts_dependent_child.py | 24 + .../wi/dhs/ssp/wi_cts_graduates_before_19.py | 9 + .../states/wi/dhs/ssp/wi_cts_gross_income.py | 18 + .../wi_cts_large_group_net_income_limit.py | 11 + .../states/wi/dhs/ssp/wi_cts_net_income.py | 41 + .../ssp/wi_cts_nonfinancially_ineligible.py | 10 + .../wi/dhs/ssp/wi_cts_part_time_student.py | 9 + .../gov/states/wi/dhs/ssp/wi_cts_payee.py | 25 + .../wi/dhs/ssp/wi_cts_received_recently.py | 9 + .../states/wi/dhs/ssp/wi_cts_sfu_member.py | 15 + .../ssp/wi_cts_state_only_ssi_recipient.py | 9 + .../gov/states/wi/dhs/ssp/wi_ssi_e.py | 32 + .../wi/dhs/ssp/wi_ssi_e_caregiver_id.py | 18 + .../states/wi/dhs/ssp/wi_ssi_e_certified.py | 10 + .../wi/dhs/ssp/wi_ssi_e_for_home_care.py | 17 + .../variables/gov/states/wi/dhs/ssp/wi_ssp.py | 12 + .../wi/dhs/ssp/wi_ssp_countable_for_hud.py | 47 + .../wi/dhs/ssp/wi_ssp_countable_for_snap.py | 14 + .../gov/states/wi/dhs/ssp/wi_ssp_eligible.py | 24 + .../ssp/wi_ssp_institutional_continuation.py | 10 + .../gov/states/wi/dhs/ssp/wi_ssp_regular.py | 35 + .../income/spm_unit/spm_unit_benefits.py | 1 + 72 files changed, 4115 insertions(+), 14 deletions(-) create mode 100644 changelog.d/wi-ssp-2026.added.md create mode 100644 policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/couple.yaml create mode 100644 policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/individual.yaml create mode 100644 policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/ineligible_spouse_independent.yaml create mode 100644 policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/ineligible_spouse_other_household.yaml create mode 100644 policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/additional_child.yaml create mode 100644 policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/area_i_counties.yaml create mode 100644 policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_other_limit.yaml create mode 100644 policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_young_age.yaml create mode 100644 policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_young_limit.yaml create mode 100644 policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/earned_flat.yaml create mode 100644 policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/earned_fraction.yaml create mode 100644 policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/first_child.yaml create mode 100644 policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross/area_1.yaml create mode 100644 policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross/area_2.yaml create mode 100644 policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_additional.yaml create mode 100644 policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_pregnant/area_1.yaml create mode 100644 policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_pregnant/area_2.yaml create mode 100644 policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/maximum_table_size.yaml create mode 100644 policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/minor_age_limit.yaml create mode 100644 policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/net/area_1.yaml create mode 100644 policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/net/area_2.yaml create mode 100644 policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/pregnancy_net.yaml create mode 100644 policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/resource_limit.yaml create mode 100644 policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/student_age_limit.yaml create mode 100644 policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/student_hours_limit.yaml create mode 100644 policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/work_expense.yaml create mode 100644 policyengine_us/parameters/gov/states/wi/dhs/ssp/exceptional_expense/couple.yaml create mode 100644 policyengine_us/parameters/gov/states/wi/dhs/ssp/exceptional_expense/individual.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/integration.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_cts.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_ssp.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_ssp_countable_for_hud.yaml create mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/_wi_cts.py create mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts.py create mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_additional_flat_disregard.py create mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_additional_fraction_disregard.py create mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_area_i.py create mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_buening_large_group_net_income_limit.py create mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_buening_member.py create mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_child_eligible.py create mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_child_excluded.py create mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_countable_resources.py create mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_dependent_care_deduction.py create mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_dependent_child.py create mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_graduates_before_19.py create mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_gross_income.py create mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_large_group_net_income_limit.py create mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_net_income.py create mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_nonfinancially_ineligible.py create mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_part_time_student.py create mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_payee.py create mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_received_recently.py create mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_sfu_member.py create mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_state_only_ssi_recipient.py create mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssi_e.py create mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssi_e_caregiver_id.py create mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssi_e_certified.py create mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssi_e_for_home_care.py create mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp.py create mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_countable_for_hud.py create mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_countable_for_snap.py create mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_eligible.py create mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_institutional_continuation.py create mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_regular.py diff --git a/changelog.d/wi-ssp-2026.added.md b/changelog.d/wi-ssp-2026.added.md new file mode 100644 index 00000000000..8285a0a2057 --- /dev/null +++ b/changelog.d/wi-ssp-2026.added.md @@ -0,0 +1 @@ +Add Wisconsin Caretaker Supplement eligibility, income tests and child benefit payments. Add Wisconsin State SSI Supplement and certified exceptional-expense payments, including the May 2026 rate increase. diff --git a/policyengine_us/parameters/gov/household/household_state_benefits.yaml b/policyengine_us/parameters/gov/household/household_state_benefits.yaml index d2cbd6ba2d4..d76b5cfacf0 100644 --- a/policyengine_us/parameters/gov/household/household_state_benefits.yaml +++ b/policyengine_us/parameters/gov/household/household_state_benefits.yaml @@ -78,6 +78,7 @@ values: # DC benefits - dc_ossp # Kansas benefits + - wi_ssp - ks_sspp # Hawaii benefits - hi_oss @@ -176,6 +177,7 @@ values: # DC benefits - dc_ossp # Kansas benefits + - wi_ssp - ks_sspp # Hawaii benefits - hi_oss @@ -279,6 +281,7 @@ values: - dc_ossp - dc_child_care_subsidies # Kansas benefits + - wi_ssp - ks_sspp # Hawaii benefits - hi_oss @@ -382,6 +385,7 @@ values: - dc_ossp - dc_child_care_subsidies # Kansas benefits + - wi_ssp - ks_sspp # Hawaii benefits - hi_oss 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..0f6111647fa 100644 --- a/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml @@ -19,6 +19,8 @@ values: - strike_benefits - social_security - ssi + # Exclude only SSI-E meeting the assisted-home care conditions. + - wi_ssp_countable_for_hud - general_assistance - unemployment_compensation - child_support_received @@ -34,5 +36,11 @@ metadata: period: year label: HUD unearned income sources reference: - - title: 24 CFR § 5.609(a)(1), (a)(2) + - title: 24 CFR § 5.609(a)(1), (a)(2), (b)(6), (b)(19) href: https://www.law.cornell.edu/cfr/text/24/5.609 + - title: Wisconsin SSI-E Handbook, 4.1.1 Subsidized Housing + href: https://www.dhs.wisconsin.gov/publications/p20679-26-01.pdf#page=24 + - title: HUD Notice PIH 2023-27, Attachment G.11, Income Received for the Care of Family Members with Disabilities + href: https://www.hud.gov/sites/dfiles/OCHCO/documents/2023-27pihn.pdf#page=81 + - title: 'HUD Notice PIH 2024-38, IV.B.1, Mandatory Deductions and Exclusions #page 3-4' + href: https://www.hud.gov/sites/dfiles/OCHCO/documents/2024-38pihn.pdf#page=3 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/couple.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/couple.yaml new file mode 100644 index 00000000000..45be8473333 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/couple.yaml @@ -0,0 +1,11 @@ +description: Wisconsin provides this monthly amount couple payment under its State SSI Supplement program. +values: + '2026-01-01': 132.05 + '2026-05-01': 145.26 +metadata: + unit: currency-USD + period: month + label: Wisconsin SSI amount couple + reference: + - title: Wisconsin DMS Operations Memo 26-12, SSI state payment increase, table page 2 + href: https://www.dhs.wisconsin.gov/dms/memos/ops/dms-ops-2026-12.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/individual.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/individual.yaml new file mode 100644 index 00000000000..1dd125b4d7e --- /dev/null +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/individual.yaml @@ -0,0 +1,12 @@ +description: Wisconsin provides this monthly amount individual payment under its State SSI Supplement + program. +values: + '2026-01-01': 83.78 + '2026-05-01': 92.16 +metadata: + unit: currency-USD + period: month + label: Wisconsin SSI amount individual + reference: + - title: Wisconsin DMS Operations Memo 26-12, SSI state payment increase, table page 2 + href: https://www.dhs.wisconsin.gov/dms/memos/ops/dms-ops-2026-12.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/ineligible_spouse_independent.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/ineligible_spouse_independent.yaml new file mode 100644 index 00000000000..6874802915f --- /dev/null +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/ineligible_spouse_independent.yaml @@ -0,0 +1,12 @@ +description: Wisconsin provides this monthly amount ineligible spouse independent payment under its State + SSI Supplement program. +values: + '2026-01-01': 130.43 + '2026-05-01': 143.47 +metadata: + unit: currency-USD + period: month + label: Wisconsin SSI amount ineligible spouse independent + reference: + - title: Wisconsin DMS Operations Memo 26-12, SSI state payment increase, table page 2 + href: https://www.dhs.wisconsin.gov/dms/memos/ops/dms-ops-2026-12.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/ineligible_spouse_other_household.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/ineligible_spouse_other_household.yaml new file mode 100644 index 00000000000..413075bc7b5 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/ineligible_spouse_other_household.yaml @@ -0,0 +1,12 @@ +description: Wisconsin provides this monthly amount ineligible spouse other household payment under its + State SSI Supplement program. +values: + '2026-01-01': 135.05 + '2026-05-01': 148.56 +metadata: + unit: currency-USD + period: month + label: Wisconsin SSI amount ineligible spouse other household + reference: + - title: Wisconsin DMS Operations Memo 26-12, SSI state payment increase, table page 2 + href: https://www.dhs.wisconsin.gov/dms/memos/ops/dms-ops-2026-12.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/additional_child.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/additional_child.yaml new file mode 100644 index 00000000000..5627a8e5f8f --- /dev/null +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/additional_child.yaml @@ -0,0 +1,10 @@ +description: Wisconsin uses this amount as its Caretaker Supplement additional eligible child benefit. +values: + '2026-01-01': 165 +metadata: + unit: currency-USD + label: Wisconsin CTS additional eligible child benefit + reference: + - title: Caretaker Supplement Handbook, sections 3 and 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + period: month diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/area_i_counties.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/area_i_counties.yaml new file mode 100644 index 00000000000..f9b1bedf9c9 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/area_i_counties.yaml @@ -0,0 +1,29 @@ +description: Wisconsin uses Area I Caretaker Supplement income limits in these counties. +values: + '2026-01-01': + - BROWN_COUNTY_WI + - DANE_COUNTY_WI + - DODGE_COUNTY_WI + - DUNN_COUNTY_WI + - EAU_CLAIRE_COUNTY_WI + - FOND_DU_LAC_COUNTY_WI + - KENOSHA_COUNTY_WI + - LA_CROSSE_COUNTY_WI + - MARATHON_COUNTY_WI + - MANITOWOC_COUNTY_WI + - MILWAUKEE_COUNTY_WI + - OUTAGAMIE_COUNTY_WI + - OZAUKEE_COUNTY_WI + - RACINE_COUNTY_WI + - ROCK_COUNTY_WI + - ST_CROIX_COUNTY_WI + - SHEBOYGAN_COUNTY_WI + - WASHINGTON_COUNTY_WI + - WAUKESHA_COUNTY_WI + - WINNEBAGO_COUNTY_WI +metadata: + unit: list + label: Wisconsin CTS Area I counties + reference: + - title: Caretaker Supplement Handbook, 5.2.3 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_other_limit.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_other_limit.yaml new file mode 100644 index 00000000000..17c5afe6618 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_other_limit.yaml @@ -0,0 +1,10 @@ +description: Wisconsin uses this amount as its Caretaker Supplement older child care deduction limit. +values: + '2026-01-01': 175 +metadata: + unit: currency-USD + label: Wisconsin CTS older child care deduction limit + reference: + - title: Caretaker Supplement Handbook, sections 3 and 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + period: month diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_young_age.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_young_age.yaml new file mode 100644 index 00000000000..ee61b21dce7 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_young_age.yaml @@ -0,0 +1,9 @@ +description: Wisconsin uses this amount as its Caretaker Supplement young child care age limit. +values: + '2026-01-01': 2 +metadata: + unit: year + label: Wisconsin CTS young child care age limit + reference: + - title: Caretaker Supplement Handbook, sections 3 and 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_young_limit.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_young_limit.yaml new file mode 100644 index 00000000000..a949aadb959 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_young_limit.yaml @@ -0,0 +1,10 @@ +description: Wisconsin uses this amount as its Caretaker Supplement young child care deduction limit. +values: + '2026-01-01': 200 +metadata: + unit: currency-USD + label: Wisconsin CTS young child care deduction limit + reference: + - title: Caretaker Supplement Handbook, sections 3 and 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + period: month diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/earned_flat.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/earned_flat.yaml new file mode 100644 index 00000000000..b537654f804 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/earned_flat.yaml @@ -0,0 +1,10 @@ +description: Wisconsin uses this amount as its Caretaker Supplement additional flat earned income disregard. +values: + '2026-01-01': 30 +metadata: + unit: currency-USD + label: Wisconsin CTS additional flat earned income disregard + reference: + - title: Caretaker Supplement Handbook, sections 3 and 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + period: month diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/earned_fraction.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/earned_fraction.yaml new file mode 100644 index 00000000000..2e7088951ae --- /dev/null +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/earned_fraction.yaml @@ -0,0 +1,10 @@ +description: Wisconsin uses this amount as its Caretaker Supplement additional earned income disregard + fraction. +values: + '2026-01-01': 0.3333333333333333 +metadata: + unit: /1 + label: Wisconsin CTS additional earned income disregard fraction + reference: + - title: Caretaker Supplement Handbook, sections 3 and 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/first_child.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/first_child.yaml new file mode 100644 index 00000000000..90c4742b02a --- /dev/null +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/first_child.yaml @@ -0,0 +1,10 @@ +description: Wisconsin uses this amount as its Caretaker Supplement first eligible child benefit. +values: + '2026-01-01': 275 +metadata: + unit: currency-USD + label: Wisconsin CTS first eligible child benefit + reference: + - title: Caretaker Supplement Handbook, sections 3 and 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + period: month diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross/area_1.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross/area_1.yaml new file mode 100644 index 00000000000..d3d300a4f58 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross/area_1.yaml @@ -0,0 +1,60 @@ +description: Wisconsin sets these Caretaker Supplement gross income limits for Area 1. +metadata: + unit: currency-USD + period: month + label: Wisconsin CTS Area 1 gross limits + type: single_amount + threshold_unit: person + amount_unit: currency-USD + reference: + - title: Caretaker Supplement Handbook, 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf +brackets: +- threshold: + '2026-01-01': 1 + amount: + '2026-01-01': 576 +- threshold: + '2026-01-01': 2 + amount: + '2026-01-01': 1018 +- threshold: + '2026-01-01': 3 + amount: + '2026-01-01': 1197 +- threshold: + '2026-01-01': 4 + amount: + '2026-01-01': 1429 +- threshold: + '2026-01-01': 5 + amount: + '2026-01-01': 1640 +- threshold: + '2026-01-01': 6 + amount: + '2026-01-01': 1773 +- threshold: + '2026-01-01': 7 + amount: + '2026-01-01': 1919 +- threshold: + '2026-01-01': 8 + amount: + '2026-01-01': 2034 +- threshold: + '2026-01-01': 9 + amount: + '2026-01-01': 2130 +- threshold: + '2026-01-01': 10 + amount: + '2026-01-01': 2182 +- threshold: + '2026-01-01': 11 + amount: + '2026-01-01': 2228 +- threshold: + '2026-01-01': 12 + amount: + '2026-01-01': 2274 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross/area_2.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross/area_2.yaml new file mode 100644 index 00000000000..845ab8cb62a --- /dev/null +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross/area_2.yaml @@ -0,0 +1,60 @@ +description: Wisconsin sets these Caretaker Supplement gross income limits for Area 2. +metadata: + unit: currency-USD + period: month + label: Wisconsin CTS Area 2 gross limits + type: single_amount + threshold_unit: person + amount_unit: currency-USD + reference: + - title: Caretaker Supplement Handbook, 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf +brackets: +- threshold: + '2026-01-01': 1 + amount: + '2026-01-01': 557 +- threshold: + '2026-01-01': 2 + amount: + '2026-01-01': 987 +- threshold: + '2026-01-01': 3 + amount: + '2026-01-01': 1159 +- threshold: + '2026-01-01': 4 + amount: + '2026-01-01': 1386 +- threshold: + '2026-01-01': 5 + amount: + '2026-01-01': 1593 +- threshold: + '2026-01-01': 6 + amount: + '2026-01-01': 1719 +- threshold: + '2026-01-01': 7 + amount: + '2026-01-01': 1863 +- threshold: + '2026-01-01': 8 + amount: + '2026-01-01': 1976 +- threshold: + '2026-01-01': 9 + amount: + '2026-01-01': 2067 +- threshold: + '2026-01-01': 10 + amount: + '2026-01-01': 2115 +- threshold: + '2026-01-01': 11 + amount: + '2026-01-01': 2161 +- threshold: + '2026-01-01': 12 + amount: + '2026-01-01': 2208 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_additional.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_additional.yaml new file mode 100644 index 00000000000..7aae2134b01 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_additional.yaml @@ -0,0 +1,11 @@ +description: Wisconsin uses this amount as its Caretaker Supplement gross income limit increase beyond + the table. +values: + '2026-01-01': 25 +metadata: + unit: currency-USD + label: Wisconsin CTS gross income limit increase beyond the table + reference: + - title: Caretaker Supplement Handbook, sections 3 and 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + period: month diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_pregnant/area_1.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_pregnant/area_1.yaml new file mode 100644 index 00000000000..4b647671b69 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_pregnant/area_1.yaml @@ -0,0 +1,60 @@ +description: Wisconsin sets these Caretaker Supplement gross pregnant income limits for Area 1. +metadata: + unit: currency-USD + period: month + label: Wisconsin CTS Area 1 gross_pregnant limits + type: single_amount + threshold_unit: person + amount_unit: currency-USD + reference: + - title: Caretaker Supplement Handbook, 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf +brackets: +- threshold: + '2026-01-01': 1 + amount: + '2026-01-01': 707 +- threshold: + '2026-01-01': 2 + amount: + '2026-01-01': 1149 +- threshold: + '2026-01-01': 3 + amount: + '2026-01-01': 1329 +- threshold: + '2026-01-01': 4 + amount: + '2026-01-01': 1560 +- threshold: + '2026-01-01': 5 + amount: + '2026-01-01': 1771 +- threshold: + '2026-01-01': 6 + amount: + '2026-01-01': 1904 +- threshold: + '2026-01-01': 7 + amount: + '2026-01-01': 2050 +- threshold: + '2026-01-01': 8 + amount: + '2026-01-01': 2165 +- threshold: + '2026-01-01': 9 + amount: + '2026-01-01': 2261 +- threshold: + '2026-01-01': 10 + amount: + '2026-01-01': 2313 +- threshold: + '2026-01-01': 11 + amount: + '2026-01-01': 2359 +- threshold: + '2026-01-01': 12 + amount: + '2026-01-01': 2405 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_pregnant/area_2.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_pregnant/area_2.yaml new file mode 100644 index 00000000000..5d043ceadeb --- /dev/null +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_pregnant/area_2.yaml @@ -0,0 +1,60 @@ +description: Wisconsin sets these Caretaker Supplement gross pregnant income limits for Area 2. +metadata: + unit: currency-USD + period: month + label: Wisconsin CTS Area 2 gross_pregnant limits + type: single_amount + threshold_unit: person + amount_unit: currency-USD + reference: + - title: Caretaker Supplement Handbook, 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf +brackets: +- threshold: + '2026-01-01': 1 + amount: + '2026-01-01': 689 +- threshold: + '2026-01-01': 2 + amount: + '2026-01-01': 1118 +- threshold: + '2026-01-01': 3 + amount: + '2026-01-01': 1290 +- threshold: + '2026-01-01': 4 + amount: + '2026-01-01': 1517 +- threshold: + '2026-01-01': 5 + amount: + '2026-01-01': 1725 +- threshold: + '2026-01-01': 6 + amount: + '2026-01-01': 1850 +- threshold: + '2026-01-01': 7 + amount: + '2026-01-01': 1995 +- threshold: + '2026-01-01': 8 + amount: + '2026-01-01': 2108 +- threshold: + '2026-01-01': 9 + amount: + '2026-01-01': 2198 +- threshold: + '2026-01-01': 10 + amount: + '2026-01-01': 2246 +- threshold: + '2026-01-01': 11 + amount: + '2026-01-01': 2293 +- threshold: + '2026-01-01': 12 + amount: + '2026-01-01': 2339 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/maximum_table_size.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/maximum_table_size.yaml new file mode 100644 index 00000000000..686d4fecb4f --- /dev/null +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/maximum_table_size.yaml @@ -0,0 +1,9 @@ +description: Wisconsin publishes Caretaker Supplement income limits up to this group size. +values: + '2026-01-01': 12 +metadata: + unit: person + label: Wisconsin CTS last published income table size + reference: + - title: Caretaker Supplement Handbook, 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/minor_age_limit.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/minor_age_limit.yaml new file mode 100644 index 00000000000..582248cd86a --- /dev/null +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/minor_age_limit.yaml @@ -0,0 +1,9 @@ +description: Wisconsin uses this amount as its Caretaker Supplement minor age limit. +values: + '2026-01-01': 18 +metadata: + unit: year + label: Wisconsin CTS minor age limit + reference: + - title: Caretaker Supplement Handbook, sections 3 and 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/net/area_1.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/net/area_1.yaml new file mode 100644 index 00000000000..18e3b4f95f1 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/net/area_1.yaml @@ -0,0 +1,60 @@ +description: Wisconsin sets these Caretaker Supplement net income limits for Area 1. +metadata: + unit: currency-USD + period: month + label: Wisconsin CTS Area 1 net limits + type: single_amount + threshold_unit: person + amount_unit: currency-USD + reference: + - title: Caretaker Supplement Handbook, 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf +brackets: +- threshold: + '2026-01-01': 1 + amount: + '2026-01-01': 311 +- threshold: + '2026-01-01': 2 + amount: + '2026-01-01': 550 +- threshold: + '2026-01-01': 3 + amount: + '2026-01-01': 647 +- threshold: + '2026-01-01': 4 + amount: + '2026-01-01': 772 +- threshold: + '2026-01-01': 5 + amount: + '2026-01-01': 886 +- threshold: + '2026-01-01': 6 + amount: + '2026-01-01': 958 +- threshold: + '2026-01-01': 7 + amount: + '2026-01-01': 1037 +- threshold: + '2026-01-01': 8 + amount: + '2026-01-01': 1099 +- threshold: + '2026-01-01': 9 + amount: + '2026-01-01': 1151 +- threshold: + '2026-01-01': 10 + amount: + '2026-01-01': 1179 +- threshold: + '2026-01-01': 11 + amount: + '2026-01-01': 1204 +- threshold: + '2026-01-01': 12 + amount: + '2026-01-01': 1229 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/net/area_2.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/net/area_2.yaml new file mode 100644 index 00000000000..45b30d79c5a --- /dev/null +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/net/area_2.yaml @@ -0,0 +1,60 @@ +description: Wisconsin sets these Caretaker Supplement net income limits for Area 2. +metadata: + unit: currency-USD + period: month + label: Wisconsin CTS Area 2 net limits + type: single_amount + threshold_unit: person + amount_unit: currency-USD + reference: + - title: Caretaker Supplement Handbook, 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf +brackets: +- threshold: + '2026-01-01': 1 + amount: + '2026-01-01': 301 +- threshold: + '2026-01-01': 2 + amount: + '2026-01-01': 533 +- threshold: + '2026-01-01': 3 + amount: + '2026-01-01': 626 +- threshold: + '2026-01-01': 4 + amount: + '2026-01-01': 749 +- threshold: + '2026-01-01': 5 + amount: + '2026-01-01': 861 +- threshold: + '2026-01-01': 6 + amount: + '2026-01-01': 929 +- threshold: + '2026-01-01': 7 + amount: + '2026-01-01': 1007 +- threshold: + '2026-01-01': 8 + amount: + '2026-01-01': 1068 +- threshold: + '2026-01-01': 9 + amount: + '2026-01-01': 1117 +- threshold: + '2026-01-01': 10 + amount: + '2026-01-01': 1143 +- threshold: + '2026-01-01': 11 + amount: + '2026-01-01': 1168 +- threshold: + '2026-01-01': 12 + amount: + '2026-01-01': 1193 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/pregnancy_net.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/pregnancy_net.yaml new file mode 100644 index 00000000000..0931c6edceb --- /dev/null +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/pregnancy_net.yaml @@ -0,0 +1,10 @@ +description: Wisconsin uses this amount as its Caretaker Supplement net income limit increase per pregnancy. +values: + '2026-01-01': 71 +metadata: + unit: currency-USD + label: Wisconsin CTS net income limit increase per pregnancy + reference: + - title: Caretaker Supplement Handbook, sections 3 and 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + period: month diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/resource_limit.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/resource_limit.yaml new file mode 100644 index 00000000000..a82b231aaab --- /dev/null +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/resource_limit.yaml @@ -0,0 +1,9 @@ +description: Wisconsin uses this amount as its Caretaker Supplement resource limit. +values: + '2026-01-01': 1000 +metadata: + unit: currency-USD + label: Wisconsin CTS resource limit + reference: + - title: Caretaker Supplement Handbook, sections 3 and 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/student_age_limit.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/student_age_limit.yaml new file mode 100644 index 00000000000..b87f31865e9 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/student_age_limit.yaml @@ -0,0 +1,9 @@ +description: Wisconsin uses this amount as its Caretaker Supplement dependent student age limit. +values: + '2026-01-01': 19 +metadata: + unit: year + label: Wisconsin CTS dependent student age limit + reference: + - title: Caretaker Supplement Handbook, sections 3 and 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/student_hours_limit.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/student_hours_limit.yaml new file mode 100644 index 00000000000..39c4b39987b --- /dev/null +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/student_hours_limit.yaml @@ -0,0 +1,9 @@ +description: Wisconsin uses this amount as its Caretaker Supplement part-time student weekly work limit. +values: + '2026-01-01': 30 +metadata: + unit: hour + label: Wisconsin CTS part-time student weekly work limit + reference: + - title: Caretaker Supplement Handbook, sections 3 and 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/work_expense.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/work_expense.yaml new file mode 100644 index 00000000000..1b217048e2a --- /dev/null +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/work_expense.yaml @@ -0,0 +1,10 @@ +description: Wisconsin uses this amount as its Caretaker Supplement work expense deduction. +values: + '2026-01-01': 90 +metadata: + unit: currency-USD + label: Wisconsin CTS work expense deduction + reference: + - title: Caretaker Supplement Handbook, sections 3 and 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + period: month diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/exceptional_expense/couple.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/exceptional_expense/couple.yaml new file mode 100644 index 00000000000..51b7c704cf7 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/exceptional_expense/couple.yaml @@ -0,0 +1,12 @@ +description: Wisconsin provides this monthly exceptional expense couple payment under its State SSI Supplement + program. +values: + '2026-01-01': 345.36 + '2026-05-01': 379.9 +metadata: + unit: currency-USD + period: month + label: Wisconsin SSI exceptional expense couple + reference: + - title: Wisconsin DMS Operations Memo 26-12, SSI state payment increase, table page 2 + href: https://www.dhs.wisconsin.gov/dms/memos/ops/dms-ops-2026-12.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/exceptional_expense/individual.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/exceptional_expense/individual.yaml new file mode 100644 index 00000000000..7b28ef92f00 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/exceptional_expense/individual.yaml @@ -0,0 +1,12 @@ +description: Wisconsin provides this monthly exceptional expense individual payment under its State SSI + Supplement program. +values: + '2026-01-01': 95.99 + '2026-05-01': 105.59 +metadata: + unit: currency-USD + period: month + label: Wisconsin SSI exceptional expense individual + reference: + - title: Wisconsin DMS Operations Memo 26-12, SSI state payment increase, table page 2 + href: https://www.dhs.wisconsin.gov/dms/memos/ops/dms-ops-2026-12.pdf#page=2 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 6f94d3d09b2..9f869554ffd 100644 --- a/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml @@ -16,9 +16,9 @@ values: # exempts public assistance vendor payments only for medical assistance, # child care, energy assistance, migrant emergency assistance, housing # authority housing assistance, and emergency or special assistance that - # is not the normal grant. None of the supplements below fall in those - # categories, so each counts, whether paid to the recipient or to a - # facility on the recipient's behalf. + # is not the normal grant. Countable components below exclude medical + # reimbursements and state-specific exempt payments; ordinary cash and + # room-and-board supplements count even when paid to a provider. - ak_ssp - al_ssp # co_oap has an annual definition period; policyengine-core's @@ -36,6 +36,7 @@ values: - hi_oss - id_aabd - in_ssp + - wi_ssp_countable_for_snap - ks_sspp - ky_ssp - la_oss @@ -95,9 +96,7 @@ values: metadata: reference: - - title: 7 CFR 273.9(b)(2) - href: https://www.law.cornell.edu/cfr/text/7/273.9#b_2 - - title: 7 CFR 273.9(c)(1) - href: https://www.law.cornell.edu/cfr/text/7/273.9#c_1 + - title: 7 CFR 273.9(b)(2) and (c)(1), (5) + href: https://www.law.cornell.edu/cfr/text/7/273.9 - title: POMS SI 01401.001 General Information about State Supplementation href: https://secure.ssa.gov/poms.nsf/lnx/0501401001 diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 05cb1d13747..94bd93cbbc4 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -1090,6 +1090,29 @@ programs: tracks. Unmodeled paths: grandfathered medically-needy-in-medical- institution recipients per WAC 388-478-0055(2)(b); DDA-determined / PVL track per (2)(f); and foster child in BRS per (2)(g). + - state: WI + status: partial + name: Wisconsin SSP + full_name: Wisconsin State SSI Supplement + variable: wi_ssp + parameter_prefix: gov.states.wi.dhs.ssp + verified_years: "2026" + notes: >- + Models regular supplements and certified SSI-E payments, including + the May 2026 increase. Temporary institutional continuation and + county SSI-E certification require explicit inputs. HUD excludes SSI-E + only for certified home-care payments to a disabled person's caregiver + in the same assisted SPM unit; purpose and caregiver identity require + inputs. Within-year changes of caregiver require separate scenarios. + Grandfathered state-only SSI payments are not modeled. The continuing + April 2026 award receives a known 10 percent May increase, but the + references do not resolve how new SSI-E certification adds to or + offsets the protected award (Wis. Stat. 49.77(2)(a)3 and (3s)(d), + SSI Administration Handbook 3.1). Caretaker Supplement includes + target-child filing units, Buening tests and published income limits + through size 12; larger groups require agency-verified net limits. + Complex family composition, specialized assets, deductions and + procedural exclusions require explicit inputs. - id: social_security name: Social Security diff --git a/policyengine_us/tests/policy/baseline/gov/states/wi/dcf/works/wi_works_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/wi/dcf/works/wi_works_eligible.yaml index 79e77ff7c3b..59c7fbb8a01 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/wi/dcf/works/wi_works_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/wi/dcf/works/wi_works_eligible.yaml @@ -8,7 +8,6 @@ wi_works_resources_eligible: true output: wi_works_eligible: true - - name: Case 2, not eligible due to demographic. period: 2025-01 input: @@ -19,7 +18,6 @@ wi_works_resources_eligible: true output: wi_works_eligible: false - - name: Case 3, not eligible due to citizenship. period: 2025-01 input: @@ -30,7 +28,6 @@ wi_works_resources_eligible: true output: wi_works_eligible: false - - name: Case 4, not eligible due to income. period: 2025-01 input: @@ -41,7 +38,6 @@ wi_works_resources_eligible: true output: wi_works_eligible: false - - name: Case 5, not eligible due to resources. period: 2025-01 input: @@ -52,10 +48,124 @@ wi_works_resources_eligible: false output: wi_works_eligible: false - - name: Case 6, non-Wisconsin state. period: 2025-01 input: state_code: CA output: wi_works_eligible: false +- name: SSI parent cannot receive W-2 for the same month + period: 2026-01 + input: + people: + parent: + age: 35 + ssi: 994 + person_id: 1 + child: + age: 8 + ssi: 0 + person_id: 2 + parent_1_id: 1 + spm_units: + unit: + members: + - parent + - child + wi_works_income_eligible: true + wi_works_resources_eligible: true + households: + household: + members: + - parent + - child + state_code: WI + marital_units: + parent: + members: + - parent + child: + members: + - child + output: + wi_works_eligible: false +- name: Child SSI does not exclude a non-SSI W-2 parent + period: 2026-01 + input: + people: + parent: + age: 35 + ssi: 0 + person_id: 1 + child: + age: 8 + ssi: 994 + person_id: 2 + parent_1_id: 1 + spm_units: + unit: + members: + - parent + - child + wi_works_income_eligible: true + wi_works_resources_eligible: true + households: + household: + members: + - parent + - child + state_code: WI + marital_units: + parent: + members: + - parent + child: + members: + - child + output: + wi_works_eligible: true +- name: SSI parent does not exclude a non-SSI co-parent from W-2 + period: 2026-01 + input: + people: + parent: + age: 35 + ssi: 994 + person_id: 1 + child: + age: 8 + ssi: 0 + person_id: 2 + parent_1_id: 1 + parent_2_id: 3 + coparent: + person_id: 3 + age: 35 + ssi: 0 + spm_units: + unit: + members: + - parent + - child + - coparent + wi_works_income_eligible: true + wi_works_resources_eligible: true + households: + household: + members: + - parent + - child + - coparent + state_code: WI + marital_units: + parent: + members: + - parent + child: + members: + - child + coparent: + members: + - coparent + output: + wi_works_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/integration.yaml new file mode 100644 index 00000000000..4a977187cd5 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/integration.yaml @@ -0,0 +1,245 @@ +- name: Case 1, eligible couple. + period: 2026-05 + absolute_error_margin: 0.01 + input: + people: + first: + age: + 2026: 65 + wi_ssi_e_certified: false + second: + age: + 2026: 65 + wi_ssi_e_certified: false + marital_units: + couple: + members: + - first + - second + tax_units: + unit: + members: + - first + - second + households: + household: + members: + - first + - second + state_code: + 2026: WI + output: + wi_ssp: + - 72.63 + - 72.63 +- name: Case 2, one eligible spouse. + period: 2026-05 + absolute_error_margin: 0.01 + input: + people: + first: + age: + 2026: 65 + wi_ssi_e_certified: false + second: + age: + 2026: 40 + wi_ssi_e_certified: false + marital_units: + couple: + members: + - first + - second + tax_units: + unit: + members: + - first + - second + households: + household: + members: + - first + - second + state_code: + 2026: WI + output: + wi_ssp: + - 143.47 + - 0 +- name: Case 3, one eligible spouse in another household. + period: 2026-05 + absolute_error_margin: 0.01 + input: + people: + first: + age: + 2026: 65 + wi_ssi_e_certified: false + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + second: + age: + 2026: 40 + wi_ssi_e_certified: false + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + marital_units: + couple: + members: + - first + - second + tax_units: + unit: + members: + - first + - second + households: + household: + members: + - first + - second + state_code: + 2026: WI + output: + wi_ssp: + - 148.56 + - 0 +- name: Case 4, both spouses certified. + period: 2026-05 + absolute_error_margin: 0.01 + input: + people: + first: + age: + 2026: 65 + wi_ssi_e_certified: true + second: + age: + 2026: 65 + wi_ssi_e_certified: true + marital_units: + couple: + members: + - first + - second + tax_units: + unit: + members: + - first + - second + households: + household: + members: + - first + - second + state_code: + 2026: WI + output: + wi_ssp: + - 262.58 + - 262.58 +- name: Case 5, one spouse certified. + period: 2026-05 + absolute_error_margin: 0.01 + input: + people: + first: + age: + 2026: 65 + wi_ssi_e_certified: true + second: + age: + 2026: 65 + wi_ssi_e_certified: false + marital_units: + couple: + members: + - first + - second + tax_units: + unit: + members: + - first + - second + households: + household: + members: + - first + - second + state_code: + 2026: WI + output: + wi_ssp: + - 178.22 + - 72.63 +- name: Case 6, annual benefits and SNAP income include both rates. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: + 2026: WI + age: + 2026: 65 + output: + wi_ssp: 1072.4 + household_state_benefits: 1072.4 + snap_unearned_income: 13000.4 +- name: Caretaker Supplement is included once in annual state and SNAP income + period: '2026' + absolute_error_margin: 0.01 + input: + people: + parent: + age: 40 + person_id: 1 + meets_ssi_disability_criteria: true + child: + age: 8 + person_id: 2 + parent_1_id: 1 + families: + unit: + members: + - parent + - child + households: + home: + members: + - parent + - child + state_code: WI + county: DANE_COUNTY_WI + marital_units: + parent: + members: + - parent + child: + members: + - child + spm_units: + spm: + members: + - parent + - child + output: + wi_cts: + - 3300 + - 0 + wi_ssp: + - 4372.4 + - 0 + snap_unearned_income: 16300.4 +- name: Wisconsin excludes SSI-E from FoodShare but counts it for HUD + period: '2026' + absolute_error_margin: 0.01 + input: + state_code: WI + age: 65 + wi_ssi_e_certified: true + output: + wi_ssp: 2301.08 + wi_ssi_e: 1228.68 + snap_unearned_income: 13000.4 + hud_unearned_income: 14229.08 diff --git a/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_cts.yaml b/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_cts.yaml new file mode 100644 index 00000000000..48ad44bf1f7 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_cts.yaml @@ -0,0 +1,1460 @@ +- name: One non-SSI child receives the first-child amount + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 40 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + child0: + age: 8 + person_id: 2 + parent_1_id: 1 + families: + unit: + members: &id001 + - parent + - child0 + households: + home: + members: *id001 + state_code: WI + county: DANE_COUNTY_WI + marital_units: + parent: + members: + - parent + child0: + members: + - child0 + output: + wi_cts: + - 275 + - 0 +- name: Three eligible children use first and subsequent rates + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 40 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + child0: + age: 8 + person_id: 2 + parent_1_id: 1 + child1: + age: 9 + person_id: 3 + parent_1_id: 1 + child2: + age: 10 + person_id: 4 + parent_1_id: 1 + families: + unit: + members: &id002 + - parent + - child0 + - child1 + - child2 + households: + home: + members: *id002 + state_code: WI + county: DANE_COUNTY_WI + marital_units: + parent: + members: + - parent + child0: + members: + - child0 + child1: + members: + - child1 + child2: + members: + - child2 + output: + wi_cts: + - 605 + - 0 + - 0 + - 0 +- name: A child receiving SSI is excluded + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 40 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + child0: + age: 8 + person_id: 2 + parent_1_id: 1 + ssi: 100 + families: + unit: + members: &id003 + - parent + - child0 + households: + home: + members: *id003 + state_code: WI + county: DANE_COUNTY_WI + marital_units: + parent: + members: + - parent + child0: + members: + - child0 + output: + wi_cts: + - 0 + - 0 +- name: SSDI alone does not make the parent eligible + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 40 + person_id: 1 + ssi: 0 + wi_ssp_regular: 0 + social_security_disability: 12000 + child0: + age: 8 + person_id: 2 + parent_1_id: 1 + families: + unit: + members: &id004 + - parent + - child0 + households: + home: + members: *id004 + state_code: WI + county: DANE_COUNTY_WI + marital_units: + parent: + members: + - parent + child0: + members: + - child0 + output: + wi_cts: + - 0 + - 0 +- name: Verified grandfathered state-only SSI parent can qualify + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 40 + person_id: 1 + ssi: 0 + wi_ssp_regular: 0 + wi_cts_state_only_ssi_recipient: true + child0: + age: 8 + person_id: 2 + parent_1_id: 1 + families: + unit: + members: &id005 + - parent + - child0 + households: + home: + members: *id005 + state_code: WI + county: DANE_COUNTY_WI + marital_units: + parent: + members: + - parent + child0: + members: + - child0 + output: + wi_cts: + - 275 + - 0 +- name: Age 18 needs graduation certification + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 40 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + child0: + age: 18 + person_id: 2 + parent_1_id: 1 + is_in_secondary_school: true + families: + unit: + members: &id006 + - parent + - child0 + households: + home: + members: *id006 + state_code: WI + county: DANE_COUNTY_WI + marital_units: + parent: + members: + - parent + child0: + members: + - child0 + output: + wi_cts: + - 0 + - 0 +- name: Age 18 enrolled and graduating before 19 + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 40 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + child0: + age: 18 + person_id: 2 + parent_1_id: 1 + is_in_secondary_school: true + wi_cts_graduates_before_19: true + families: + unit: + members: &id007 + - parent + - child0 + households: + home: + members: *id007 + state_code: WI + county: DANE_COUNTY_WI + marital_units: + parent: + members: + - parent + child0: + members: + - child0 + output: + wi_cts: + - 275 + - 0 +- name: Age 19 is ineligible + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 40 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + child0: + age: 19 + person_id: 2 + parent_1_id: 1 + is_in_secondary_school: true + wi_cts_graduates_before_19: true + families: + unit: + members: &id008 + - parent + - child0 + households: + home: + members: *id008 + state_code: WI + county: DANE_COUNTY_WI + marital_units: + parent: + members: + - parent + child0: + members: + - child0 + output: + wi_cts: + - 0 + - 0 +- name: Child support is excluded from both tests + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 40 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + child0: + age: 8 + person_id: 2 + parent_1_id: 1 + child_support_received: 24000 + families: + unit: + members: &id009 + - parent + - child0 + households: + home: + members: *id009 + state_code: WI + county: DANE_COUNTY_WI + marital_units: + parent: + members: + - parent + child0: + members: + - child0 + output: + wi_cts: + - 275 + - 0 +- name: Income at the Area I net limit + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 40 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + child0: + age: 8 + person_id: 2 + parent_1_id: 1 + social_security_survivors: 3732 + families: + unit: + members: &id010 + - parent + - child0 + households: + home: + members: *id010 + state_code: WI + county: DANE_COUNTY_WI + marital_units: + parent: + members: + - parent + child0: + members: + - child0 + output: + wi_cts: + - 275 + - 0 +- name: Income above the Area I net limit + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 40 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + child0: + age: 8 + person_id: 2 + parent_1_id: 1 + social_security_survivors: 3744 + families: + unit: + members: &id011 + - parent + - child0 + households: + home: + members: *id011 + state_code: WI + county: DANE_COUNTY_WI + marital_units: + parent: + members: + - parent + child0: + members: + - child0 + output: + wi_cts: + - 0 + - 0 +- name: Same income exceeds Area II net limit + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 40 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + child0: + age: 8 + person_id: 2 + parent_1_id: 1 + social_security_survivors: 3660 + families: + unit: + members: &id012 + - parent + - child0 + households: + home: + members: *id012 + state_code: WI + county: ADAMS_COUNTY_WI + marital_units: + parent: + members: + - parent + child0: + members: + - child0 + output: + wi_cts: + - 0 + - 0 +- name: Income and resources belonging to SSI people are excluded + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 40 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + employment_income: 120000 + ssi_countable_resources: 100000 + child0: + age: 8 + person_id: 2 + parent_1_id: 1 + families: + unit: + members: &id013 + - parent + - child0 + households: + home: + members: *id013 + state_code: WI + county: DANE_COUNTY_WI + marital_units: + parent: + members: + - parent + child0: + members: + - child0 + output: + wi_cts: + - 275 + - 0 +- name: Non-SSI resources at the limit + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 40 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + child0: + age: 8 + person_id: 2 + parent_1_id: 1 + wi_cts_countable_resources: 1000 + families: + unit: + members: &id014 + - parent + - child0 + households: + home: + members: *id014 + state_code: WI + county: DANE_COUNTY_WI + marital_units: + parent: + members: + - parent + child0: + members: + - child0 + output: + wi_cts: + - 275 + - 0 +- name: Non-SSI resources above the limit + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 40 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + child0: + age: 8 + person_id: 2 + parent_1_id: 1 + wi_cts_countable_resources: 1001 + families: + unit: + members: &id015 + - parent + - child0 + households: + home: + members: *id015 + state_code: WI + county: DANE_COUNTY_WI + marital_units: + parent: + members: + - parent + child0: + members: + - child0 + output: + wi_cts: + - 0 + - 0 +- name: New applicant earnings receive the 90 dollar work deduction + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 40 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + child0: + age: 8 + person_id: 2 + parent_1_id: 1 + employment_income: 4812 + families: + unit: + members: &id016 + - parent + - child0 + households: + home: + members: *id016 + state_code: WI + county: DANE_COUNTY_WI + marital_units: + parent: + members: + - parent + child0: + members: + - child0 + output: + wi_cts: + - 275 + - 0 +- name: New applicant just above net earnings limit + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 40 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + child0: + age: 8 + person_id: 2 + parent_1_id: 1 + employment_income: 4824 + families: + unit: + members: &id017 + - parent + - child0 + households: + home: + members: *id017 + state_code: WI + county: DANE_COUNTY_WI + marital_units: + parent: + members: + - parent + child0: + members: + - child0 + output: + wi_cts: + - 0 + - 0 +- name: Continuing minor full-time student earnings are exempt only in net test + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 40 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + child0: + age: 8 + person_id: 2 + parent_1_id: 1 + employment_income: 6912 + is_full_time_student: true + wi_cts_received_recently: true + families: + unit: + members: &id018 + - parent + - child0 + households: + home: + members: *id018 + state_code: WI + county: DANE_COUNTY_WI + marital_units: + parent: + members: + - parent + child0: + members: + - child0 + output: + wi_cts: + - 275 + - 0 +- name: Continuing student fails gross test despite net exemption + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 40 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + child0: + age: 8 + person_id: 2 + parent_1_id: 1 + employment_income: 6924 + is_full_time_student: true + wi_cts_received_recently: true + families: + unit: + members: &id019 + - parent + - child0 + households: + home: + members: *id019 + state_code: WI + county: DANE_COUNTY_WI + marital_units: + parent: + members: + - parent + child0: + members: + - child0 + output: + wi_cts: + - 0 + - 0 +- name: Continuing nonschool minor receives 30 and one-third deduction + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 40 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + child0: + age: 8 + person_id: 2 + parent_1_id: 1 + employment_income: 6840 + wi_cts_received_recently: true + is_full_time_student: false + families: + unit: + members: &id020 + - parent + - child0 + households: + home: + members: *id020 + state_code: WI + county: DANE_COUNTY_WI + marital_units: + parent: + members: + - parent + child0: + members: + - child0 + output: + wi_cts: + - 275 + - 0 +- name: Two co-resident parents must both receive state SSI + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 40 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + child0: + age: 8 + person_id: 2 + parent_1_id: 1 + parent_2_id: 20 + other: + age: 40 + person_id: 20 + families: + unit: + members: &id021 + - parent + - child0 + - other + households: + home: + members: *id021 + state_code: WI + county: DANE_COUNTY_WI + marital_units: + parent: + members: + - parent + child0: + members: + - child0 + other: + members: + - other + output: + wi_cts: + - 0 + - 0 + - 0 +- name: Two SSI parents share one child award through the designated payee + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 40 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + child0: + age: 8 + person_id: 2 + parent_1_id: 1 + parent_2_id: 20 + other: + age: 40 + person_id: 20 + ssi: 745.5 + wi_ssp_regular: 66.03 + families: + unit: + members: &id022 + - parent + - child0 + - other + households: + home: + members: *id022 + state_code: WI + county: DANE_COUNTY_WI + marital_units: + parent: + members: + - parent + child0: + members: + - child0 + other: + members: + - other + output: + wi_cts: + - 275 + - 0 + - 0 +- name: Outside Wisconsin + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 40 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + child0: + age: 8 + person_id: 2 + parent_1_id: 1 + families: + unit: + members: &id023 + - parent + - child0 + households: + home: + members: *id023 + state_code: IL + county: DANE_COUNTY_WI + marital_units: + parent: + members: + - parent + child0: + members: + - child0 + output: + wi_cts: + - 0 + - 0 +- name: Undocumented child + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 40 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + child0: + age: 8 + person_id: 2 + parent_1_id: 1 + immigration_status: UNDOCUMENTED + families: + unit: + members: &id024 + - parent + - child0 + households: + home: + members: *id024 + state_code: WI + county: DANE_COUNTY_WI + marital_units: + parent: + members: + - parent + child0: + members: + - child0 + output: + wi_cts: + - 0 + - 0 +- name: Permanent resident child is not subject to SSI five-year rules + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 40 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + child0: + age: 8 + person_id: 2 + parent_1_id: 1 + immigration_status: LEGAL_PERMANENT_RESIDENT + families: + unit: + members: &id025 + - parent + - child0 + households: + home: + members: *id025 + state_code: WI + county: DANE_COUNTY_WI + marital_units: + parent: + members: + - parent + child0: + members: + - child0 + output: + wi_cts: + - 275 + - 0 +- name: Handbook Buening example with co-parent income 700 + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 40 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + child0: + age: 10 + person_id: 2 + parent_1_id: 1 + social_security_survivors: 0 + child1: + age: 8 + person_id: 3 + parent_1_id: 1 + parent_2_id: 20 + other: + age: 40 + person_id: 20 + unemployment_compensation: 8400 + families: + unit: + members: &id026 + - parent + - child0 + - child1 + - other + households: + home: + members: *id026 + state_code: WI + county: DANE_COUNTY_WI + marital_units: + parent: + members: + - parent + child0: + members: + - child0 + child1: + members: + - child1 + other: + members: + - other + output: + wi_cts: + - 275 + - 0 + - 0 + - 0 +- name: Handbook Buening example with co-parent income 500 + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 40 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + child0: + age: 10 + person_id: 2 + parent_1_id: 1 + social_security_survivors: 2400 + child1: + age: 8 + person_id: 3 + parent_1_id: 1 + parent_2_id: 20 + other: + age: 40 + person_id: 20 + unemployment_compensation: 6000 + families: + unit: + members: &id027 + - parent + - child0 + - child1 + - other + households: + home: + members: *id027 + state_code: WI + county: DANE_COUNTY_WI + marital_units: + parent: + members: + - parent + child0: + members: + - child0 + child1: + members: + - child1 + other: + members: + - other + output: + wi_cts: + - 0 + - 0 + - 0 + - 0 +- name: Dependent care paid for a sibling reduces the whole group net income + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 40 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + child0: + age: 8 + person_id: 2 + parent_1_id: 1 + employment_income: 8400 + child1: + age: 9 + person_id: 3 + parent_1_id: 1 + pre_subsidy_childcare_expenses: 2400 + families: + unit: + members: + - parent + - child0 + - child1 + households: + home: + members: + - parent + - child0 + - child1 + state_code: WI + county: DANE_COUNTY_WI + marital_units: + parent: + members: + - parent + child0: + members: + - child0 + child1: + members: + - child1 + output: + wi_cts: + - 440 + - 0 + - 0 +- name: Child-support noncooperation excludes the entire family + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 40 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + child0: + age: 8 + person_id: 2 + parent_1_id: 1 + families: + unit: + members: &id028 + - parent + - child0 + wi_cts_nonfinancially_ineligible: true + households: + home: + members: *id028 + state_code: WI + county: DANE_COUNTY_WI + marital_units: + parent: + members: + - parent + child0: + members: + - child0 + output: + wi_cts: + - 0 + - 0 +- name: Annual CTS resource balance above the limit remains ineligible + period: '2026' + absolute_error_margin: 0.01 + input: + people: + parent: + age: 40 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + child0: + age: 8 + person_id: 2 + parent_1_id: 1 + wi_cts_countable_resources: 1001 + families: + unit: + members: &id029 + - parent + - child0 + households: + home: + members: *id029 + state_code: WI + county: DANE_COUNTY_WI + marital_units: + parent: + members: + - parent + child0: + members: + - child0 + output: + wi_cts: + - 0 + - 0 +- name: Large CTS group requires a verified net income limit + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 40 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + child0: + age: 8 + person_id: 2 + parent_1_id: 1 + child1: + age: 9 + person_id: 3 + parent_1_id: 1 + child2: + age: 10 + person_id: 4 + parent_1_id: 1 + child3: + age: 11 + person_id: 5 + parent_1_id: 1 + child4: + age: 12 + person_id: 6 + parent_1_id: 1 + child5: + age: 13 + person_id: 7 + parent_1_id: 1 + child6: + age: 14 + person_id: 8 + parent_1_id: 1 + child7: + age: 15 + person_id: 9 + parent_1_id: 1 + child8: + age: 8 + person_id: 10 + parent_1_id: 1 + child9: + age: 9 + person_id: 11 + parent_1_id: 1 + child10: + age: 10 + person_id: 12 + parent_1_id: 1 + child11: + age: 11 + person_id: 13 + parent_1_id: 1 + child12: + age: 12 + person_id: 14 + parent_1_id: 1 + families: + unit: + members: &id030 + - parent + - child0 + - child1 + - child2 + - child3 + - child4 + - child5 + - child6 + - child7 + - child8 + - child9 + - child10 + - child11 + - child12 + households: + home: + members: *id030 + state_code: WI + county: DANE_COUNTY_WI + marital_units: + parent: + members: + - parent + child0: + members: + - child0 + child1: + members: + - child1 + child2: + members: + - child2 + child3: + members: + - child3 + child4: + members: + - child4 + child5: + members: + - child5 + child6: + members: + - child6 + child7: + members: + - child7 + child8: + members: + - child8 + child9: + members: + - child9 + child10: + members: + - child10 + child11: + members: + - child11 + child12: + members: + - child12 + output: + wi_cts: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 +- name: Agency-verified CTS limit supports a thirteen-child group + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 40 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + child0: + age: 8 + person_id: 2 + parent_1_id: 1 + child1: + age: 9 + person_id: 3 + parent_1_id: 1 + child2: + age: 10 + person_id: 4 + parent_1_id: 1 + child3: + age: 11 + person_id: 5 + parent_1_id: 1 + child4: + age: 12 + person_id: 6 + parent_1_id: 1 + child5: + age: 13 + person_id: 7 + parent_1_id: 1 + child6: + age: 14 + person_id: 8 + parent_1_id: 1 + child7: + age: 15 + person_id: 9 + parent_1_id: 1 + child8: + age: 8 + person_id: 10 + parent_1_id: 1 + child9: + age: 9 + person_id: 11 + parent_1_id: 1 + child10: + age: 10 + person_id: 12 + parent_1_id: 1 + child11: + age: 11 + person_id: 13 + parent_1_id: 1 + child12: + age: 12 + person_id: 14 + parent_1_id: 1 + families: + unit: + members: &id031 + - parent + - child0 + - child1 + - child2 + - child3 + - child4 + - child5 + - child6 + - child7 + - child8 + - child9 + - child10 + - child11 + - child12 + wi_cts_large_group_net_income_limit: 1254 + households: + home: + members: *id031 + state_code: WI + county: DANE_COUNTY_WI + marital_units: + parent: + members: + - parent + child0: + members: + - child0 + child1: + members: + - child1 + child2: + members: + - child2 + child3: + members: + - child3 + child4: + members: + - child4 + child5: + members: + - child5 + child6: + members: + - child6 + child7: + members: + - child7 + child8: + members: + - child8 + child9: + members: + - child9 + child10: + members: + - child10 + child11: + members: + - child11 + child12: + members: + - child12 + output: + wi_cts: + - 2255 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_ssp.yaml b/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_ssp.yaml new file mode 100644 index 00000000000..7cb9990e21a --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_ssp.yaml @@ -0,0 +1,167 @@ +- name: Case 1, January rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: WI + age: + 2026: 65 + output: + wi_ssp: 83.78 +- name: Case 2, April retains old rate. + period: 2026-04 + absolute_error_margin: 0.01 + input: + state_code: + 2026: WI + age: + 2026: 65 + output: + wi_ssp: 83.78 +- name: Case 3, May new rate. + period: 2026-05 + absolute_error_margin: 0.01 + input: + state_code: + 2026: WI + age: + 2026: 65 + output: + wi_ssp: 92.16 +- name: Case 4, December new rate. + period: 2026-12 + absolute_error_margin: 0.01 + input: + state_code: + 2026: WI + age: + 2026: 65 + output: + wi_ssp: 92.16 +- name: Case 5, annual amount spans rate change. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: + 2026: WI + age: + 2026: 65 + output: + wi_ssp: 1072.4 +- name: Case 6, other household retains flat individual rate. + period: 2026-05 + absolute_error_margin: 0.01 + input: + state_code: + 2026: WI + age: + 2026: 65 + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + output: + wi_ssp: 92.16 +- name: Case 7, small SSI payment gets full state amount. + period: 2026-05 + absolute_error_margin: 0.01 + input: + state_code: + 2026: WI + age: + 2026: 65 + social_security_retirement: + 2026: 12156 + output: + wi_ssp: 92.16 +- name: Case 8, no federal payment no new state eligibility. + period: 2026-05 + absolute_error_margin: 0.01 + input: + state_code: + 2026: WI + age: + 2026: 65 + social_security_retirement: + 2026: 12168 + output: + wi_ssp: 0 +- name: Case 9, certified exceptional expense supplement before increase. + period: 2026-04 + absolute_error_margin: 0.01 + input: + state_code: + 2026: WI + age: + 2026: 65 + wi_ssi_e_certified: true + output: + wi_ssp: 179.77 +- name: Case 10, certified exceptional expense supplement after increase. + period: 2026-05 + absolute_error_margin: 0.01 + input: + state_code: + 2026: WI + age: + 2026: 65 + wi_ssi_e_certified: true + output: + wi_ssp: 197.75 +- name: Case 11, long term medical institution excluded. + period: 2026-05 + absolute_error_margin: 0.01 + input: + state_code: + 2026: WI + age: + 2026: 65 + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + output: + wi_ssp: 0 +- name: Case 12, authorized institutional continuation. + period: 2026-05 + absolute_error_margin: 0.01 + input: + state_code: + 2026: WI + age: + 2026: 65 + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + wi_ssp_institutional_continuation: true + output: + wi_ssp: 92.16 +- name: Case 13, incarceration excludes payment. + period: 2026-05 + absolute_error_margin: 0.01 + input: + state_code: + 2026: WI + age: + 2026: 65 + is_incarcerated: true + output: + wi_ssp: 0 +- name: Case 14, outside Wisconsin. + period: 2026-05 + absolute_error_margin: 0.01 + input: + state_code: + 2026: MN + age: + 2026: 65 + output: + wi_ssp: 0 +- name: Case 15, excess resources. + period: 2026-05 + absolute_error_margin: 0.01 + input: + state_code: + 2026: WI + age: + 2026: 65 + ssi_countable_resources: + 2026: 2001 + output: + wi_ssp: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_ssp_countable_for_hud.yaml b/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_ssp_countable_for_hud.yaml new file mode 100644 index 00000000000..5e211cde12e --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_ssp_countable_for_hud.yaml @@ -0,0 +1,796 @@ +# HUD PIH 2023-27 G.11 and PIH 2024-38 IV.B.1 exclude qualifying assisted-home care. +# Positive home-care flags certify that county-approved adult-child care enables continued residence. +# Annual SSI-E = 4*95.99 + 8*105.59 = 1228.68; regular SSI remains counted. +# https://www.hud.gov/sites/dfiles/OCHCO/documents/2023-27pihn.pdf#page=81 +- name: Case 1, qualifying caregiver in the assisted SPM unit need not share the Census family. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 50 + person_id: 1 + is_disabled: true + meets_ssi_disability_criteria: true + is_household_head: true + pre_subsidy_rent: 12000 + wi_ssi_e_certified: true + wi_ssi_e_for_home_care: true + wi_ssi_e_caregiver_id: 2 + person2: + age: 30 + person_id: 2 + parent_1_id: 1 + is_household_head: false + marital_units: + unit1: + members: + - person1 + unit2: + members: + - person2 + tax_units: + unit1: + members: + - person1 + unit2: + members: + - person2 + families: + family1: + members: + - person1 + family2: + members: + - person2 + spm_units: + unit: + members: + - person1 + - person2 + receives_housing_assistance: true + households: + home: + members: + - person1 + - person2 + state_code: WI + county_fips: '55079' + bedrooms: 2 + tenant_pays_utilities: false + output: + wi_ssi_e: + - 1228.68 + - 0 + wi_ssp_countable_for_hud: + - 1072.4 + - 0 + hud_annual_income: 13000.4 + housing_assistance: 8264.88 +- name: Case 2, default unverified home-care qualification keeps SSI-E countable. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 50 + person_id: 1 + is_disabled: true + meets_ssi_disability_criteria: true + is_household_head: true + pre_subsidy_rent: 12000 + wi_ssi_e_certified: true + wi_ssi_e_for_home_care: false + wi_ssi_e_caregiver_id: 2 + person2: + age: 30 + person_id: 2 + parent_1_id: 1 + is_household_head: false + marital_units: + unit1: + members: + - person1 + unit2: + members: + - person2 + tax_units: + unit1: + members: + - person1 + unit2: + members: + - person2 + families: + family1: + members: + - person1 + family2: + members: + - person2 + spm_units: + unit: + members: + - person1 + - person2 + receives_housing_assistance: true + households: + home: + members: + - person1 + - person2 + state_code: WI + county_fips: '55079' + bedrooms: 2 + tenant_pays_utilities: false + output: + wi_ssp_countable_for_hud: + - 2301.08 + - 0 + hud_annual_income: 14229.08 + housing_assistance: 7896.28 +- name: Case 3, unidentified caregiver keeps SSI-E countable. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 50 + person_id: 1 + is_disabled: true + meets_ssi_disability_criteria: true + is_household_head: true + pre_subsidy_rent: 12000 + wi_ssi_e_certified: true + wi_ssi_e_for_home_care: true + wi_ssi_e_caregiver_id: 0 + person2: + age: 30 + person_id: 2 + parent_1_id: 1 + is_household_head: false + marital_units: + unit1: + members: + - person1 + unit2: + members: + - person2 + tax_units: + unit1: + members: + - person1 + unit2: + members: + - person2 + families: + family1: + members: + - person1 + family2: + members: + - person2 + spm_units: + unit: + members: + - person1 + - person2 + receives_housing_assistance: true + households: + home: + members: + - person1 + - person2 + state_code: WI + county_fips: '55079' + bedrooms: 2 + tenant_pays_utilities: false + output: + wi_ssp_countable_for_hud: + - 2301.08 + - 0 +- name: Case 4, a recipient cannot name themselves as the caregiver. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 50 + person_id: 1 + is_disabled: true + meets_ssi_disability_criteria: true + is_household_head: true + pre_subsidy_rent: 12000 + wi_ssi_e_certified: true + wi_ssi_e_for_home_care: true + wi_ssi_e_caregiver_id: 1 + person2: + age: 30 + person_id: 2 + parent_1_id: 1 + is_household_head: false + marital_units: + unit1: + members: + - person1 + unit2: + members: + - person2 + tax_units: + unit1: + members: + - person1 + unit2: + members: + - person2 + families: + family1: + members: + - person1 + family2: + members: + - person2 + spm_units: + unit: + members: + - person1 + - person2 + receives_housing_assistance: true + households: + home: + members: + - person1 + - person2 + state_code: WI + county_fips: '55079' + bedrooms: 2 + tenant_pays_utilities: false + output: + wi_ssp_countable_for_hud: + - 2301.08 + - 0 +- name: Case 5, age-only eligibility does not establish the HUD disability exclusion. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 65 + person_id: 1 + is_disabled: false + meets_ssi_disability_criteria: false + is_household_head: true + pre_subsidy_rent: 12000 + wi_ssi_e_certified: true + wi_ssi_e_for_home_care: true + wi_ssi_e_caregiver_id: 2 + person2: + age: 30 + person_id: 2 + parent_1_id: 1 + is_household_head: false + marital_units: + unit1: + members: + - person1 + unit2: + members: + - person2 + tax_units: + unit1: + members: + - person1 + unit2: + members: + - person2 + families: + family1: + members: + - person1 + family2: + members: + - person2 + spm_units: + unit: + members: + - person1 + - person2 + receives_housing_assistance: true + households: + home: + members: + - person1 + - person2 + state_code: WI + county_fips: '55079' + bedrooms: 2 + tenant_pays_utilities: false + output: + wi_ssp_countable_for_hud: + - 2301.08 + - 0 +- name: Case 6, caregiver in another SPM unit does not qualify despite shared address. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 50 + person_id: 1 + is_disabled: true + meets_ssi_disability_criteria: true + is_household_head: true + pre_subsidy_rent: 12000 + wi_ssi_e_certified: true + wi_ssi_e_for_home_care: true + wi_ssi_e_caregiver_id: 2 + person2: + age: 30 + person_id: 2 + parent_1_id: 1 + is_household_head: false + marital_units: + unit1: + members: + - person1 + unit2: + members: + - person2 + tax_units: + unit1: + members: + - person1 + unit2: + members: + - person2 + families: + family1: + members: + - person1 + family2: + members: + - person2 + spm_units: + unit1: + members: + - person1 + receives_housing_assistance: true + unit2: + members: + - person2 + households: + home: + members: + - person1 + - person2 + state_code: WI + county_fips: '55079' + bedrooms: 2 + tenant_pays_utilities: false + output: + wi_ssp_countable_for_hud: + - 2301.08 + - 0 +- name: Case 7, caregiver outside the assisted household does not qualify. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 50 + person_id: 1 + is_disabled: true + meets_ssi_disability_criteria: true + is_household_head: true + pre_subsidy_rent: 12000 + wi_ssi_e_certified: true + wi_ssi_e_for_home_care: true + wi_ssi_e_caregiver_id: 2 + person2: + age: 30 + person_id: 2 + parent_1_id: 1 + is_household_head: false + marital_units: + unit1: + members: + - person1 + unit2: + members: + - person2 + tax_units: + unit1: + members: + - person1 + unit2: + members: + - person2 + families: + family1: + members: + - person1 + family2: + members: + - person2 + spm_units: + unit: + members: + - person1 + - person2 + receives_housing_assistance: true + households: + home: + members: + - person1 + state_code: WI + county_fips: '55079' + bedrooms: 2 + tenant_pays_utilities: false + other: + members: + - person2 + state_code: WI + county_fips: '55079' + output: + wi_ssp_countable_for_hud: + - 2301.08 + - 0 +- name: Case 8, a medical-facility month keeps continued SSI-E countable. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 50 + person_id: 1 + is_disabled: true + meets_ssi_disability_criteria: true + is_household_head: true + pre_subsidy_rent: 12000 + wi_ssi_e_certified: true + wi_ssi_e_for_home_care: true + wi_ssi_e_caregiver_id: 2 + ssi_lives_in_medical_treatment_facility: + 2026-05: true + ssi_medicaid_pays_majority_of_care: + 2026-05: true + wi_ssp_institutional_continuation: + 2026-05: true + person2: + age: 30 + person_id: 2 + parent_1_id: 1 + is_household_head: false + marital_units: + unit1: + members: + - person1 + unit2: + members: + - person2 + tax_units: + unit1: + members: + - person1 + unit2: + members: + - person2 + families: + family1: + members: + - person1 + family2: + members: + - person2 + spm_units: + unit: + members: + - person1 + - person2 + receives_housing_assistance: true + households: + home: + members: + - person1 + - person2 + state_code: WI + county_fips: '55079' + bedrooms: 2 + tenant_pays_utilities: false + output: + wi_ssi_e: + 2026-05: + - 105.59 + - 0 + wi_ssp_countable_for_hud: + 2026-05: + - 197.75 + - 0 +- name: Case 9, an annual caregiver identifier preserves the exclusion across the May rate + change. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 50 + person_id: 1 + is_disabled: true + meets_ssi_disability_criteria: true + is_household_head: true + pre_subsidy_rent: 12000 + wi_ssi_e_certified: true + wi_ssi_e_for_home_care: true + wi_ssi_e_caregiver_id: 2 + person2: + age: 30 + person_id: 2 + parent_1_id: 1 + is_household_head: false + marital_units: + unit1: + members: + - person1 + unit2: + members: + - person2 + tax_units: + unit1: + members: + - person1 + unit2: + members: + - person2 + families: + family1: + members: + - person1 + family2: + members: + - person2 + spm_units: + unit: + members: + - person1 + - person2 + receives_housing_assistance: true + households: + home: + members: + - person1 + - person2 + state_code: WI + county_fips: '55079' + bedrooms: 2 + tenant_pays_utilities: false + output: + wi_ssp_countable_for_hud: + 2026-04: + - 83.78 + - 0 + 2026-05: + - 92.16 + - 0 +- name: Case 10, home-care inputs cannot exclude regular SSI when no SSI-E is awarded. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 50 + person_id: 1 + is_disabled: true + meets_ssi_disability_criteria: true + is_household_head: true + pre_subsidy_rent: 12000 + wi_ssi_e_certified: false + wi_ssi_e_for_home_care: true + wi_ssi_e_caregiver_id: 2 + person2: + age: 30 + person_id: 2 + parent_1_id: 1 + is_household_head: false + marital_units: + unit1: + members: + - person1 + unit2: + members: + - person2 + tax_units: + unit1: + members: + - person1 + unit2: + members: + - person2 + families: + family1: + members: + - person1 + family2: + members: + - person2 + spm_units: + unit: + members: + - person1 + - person2 + receives_housing_assistance: true + households: + home: + members: + - person1 + - person2 + state_code: WI + county_fips: '55079' + bedrooms: 2 + tenant_pays_utilities: false + output: + wi_ssi_e: + - 0 + - 0 + wi_ssp_countable_for_hud: + - 1072.4 + - 0 +- name: Case 11, duplicate caregiver identifiers cannot establish a unique caregiver. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 50 + person_id: 1 + is_disabled: true + meets_ssi_disability_criteria: true + is_household_head: true + pre_subsidy_rent: 12000 + wi_ssi_e_certified: true + wi_ssi_e_for_home_care: true + wi_ssi_e_caregiver_id: 2 + person2: + age: 30 + person_id: 2 + parent_1_id: 1 + is_household_head: false + person3: + age: 31 + person_id: 2 + is_household_head: false + marital_units: + unit1: + members: + - person1 + unit2: + members: + - person2 + third: + members: + - person3 + tax_units: + unit1: + members: + - person1 + unit2: + members: + - person2 + third: + members: + - person3 + families: + family1: + members: + - person1 + family2: + members: + - person2 + third: + members: + - person3 + spm_units: + unit: + members: + - person1 + - person2 + - person3 + receives_housing_assistance: true + households: + home: + members: + - person1 + - person2 + - person3 + state_code: WI + county_fips: '55079' + bedrooms: 2 + tenant_pays_utilities: false + output: + wi_ssp_countable_for_hud: + - 2301.08 + - 0 + - 0 + +- name: Case 12, qualifying SSI-E exclusion leaves the derived caretaker supplement countable. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 50 + person_id: 1 + is_disabled: true + meets_ssi_disability_criteria: true + is_household_head: true + pre_subsidy_rent: 12000 + wi_ssi_e_certified: true + wi_ssi_e_for_home_care: true + wi_ssi_e_caregiver_id: 2 + person2: + age: 30 + person_id: 2 + parent_1_id: 1 + is_household_head: false + person3: + age: 8 + person_id: 3 + parent_1_id: 1 + is_household_head: false + marital_units: + unit1: + members: + - person1 + unit2: + members: + - person2 + child: + members: + - person3 + tax_units: + unit1: + members: + - person1 + unit2: + members: + - person2 + child: + members: + - person3 + families: + family1: + members: + - person1 + - person3 + family2: + members: + - person2 + spm_units: + unit: + members: + - person1 + - person2 + - person3 + receives_housing_assistance: true + households: + home: + members: + - person1 + - person2 + - person3 + state_code: WI + county_fips: '55079' + bedrooms: 2 + tenant_pays_utilities: false + output: + wi_cts: + - 3300 + - 0 + - 0 + wi_ssp_countable_for_hud: + - 4372.4 + - 0 + - 0 + hud_unearned_income: + - 16300.4 + - 0 + - 0 diff --git a/policyengine_us/variables/gov/states/wi/dcf/works/eligibility/wi_works_eligible.py b/policyengine_us/variables/gov/states/wi/dcf/works/eligibility/wi_works_eligible.py index 0f62fc2d6f8..57f8da8756c 100644 --- a/policyengine_us/variables/gov/states/wi/dcf/works/eligibility/wi_works_eligible.py +++ b/policyengine_us/variables/gov/states/wi/dcf/works/eligibility/wi_works_eligible.py @@ -8,6 +8,7 @@ class wi_works_eligible(Variable): definition_period = MONTH reference = ( "https://docs.legis.wisconsin.gov/statutes/statutes/49/iii/145", + "https://dcf.wisconsin.gov/manuals/w-2-manual/Production/02/2.02.1_List_of_Criteria.htm", "https://docs.legis.wisconsin.gov/code/admin_code/dcf/101_199/101/09", ) defined_for = StateCode.WI @@ -19,4 +20,13 @@ def formula(spm_unit, period, parameters): citizenship = spm_unit.any(is_qualified) income = spm_unit("wi_works_income_eligible", period) resources = spm_unit("wi_works_resources_eligible", period) - return demographic & citizenship & income & resources + parent = person("is_parent", period.this_year) + ssi_recipient = (person("ssi", period) > 0) | person( + "wi_cts_state_only_ssi_recipient", period + ) + # SSI receipt excludes the applicant, not an otherwise eligible + # co-parent or a household merely containing a child on SSI. + all_parents_on_ssi = spm_unit.any(parent & ssi_recipient) & ~spm_unit.any( + parent & ~ssi_recipient + ) + return demographic & citizenship & income & resources & ~all_parents_on_ssi diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/_wi_cts.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/_wi_cts.py new file mode 100644 index 00000000000..ec7d2c01a93 --- /dev/null +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/_wi_cts.py @@ -0,0 +1,85 @@ +import numpy as np +from policyengine_us.variables.household.demographic.person._parent_links import ( + co_resident_parent_indices, + household_has_parent_ids, +) + + +def cts_relationships(person, period): + first, second = co_resident_parent_indices(person, period.this_year) + linked = household_has_parent_ids(person, period.this_year) + receipt = (person("wi_ssp_regular", period) > 0) | person( + "wi_cts_state_only_ssi_recipient", period + ) + parents = (first >= 0).astype(int) + (second >= 0) + ssi_parents = ((first >= 0) & receipt[first]).astype(int) + ( + (second >= 0) & receipt[second] + ) + is_parent = person("is_parent", period.this_year) + parents = np.where(linked, parents, person.family.sum(is_parent)) + ssi_parents = np.where(linked, ssi_parents, person.family.sum(is_parent & receipt)) + return first, second, linked, receipt, parents, ssi_parents + + +def cts_filing_unit(person, period): + first, second, linked, receipt, parents, ssi_parents = cts_relationships( + person, period + ) + child = person("wi_cts_dependent_child", period) + on_ssi = (person("ssi", period) > 0) | receipt + candidate = child & ~on_ssi & (ssi_parents > 0) + common = candidate & (parents > 1) + candidate = np.where(person.family.any(common), common, candidate) + age = person("age", period.this_year) + oldest = person.family.max(np.where(candidate, age, -1)) + target = candidate & (age == oldest) + # Selecting both tied oldest siblings is harmless: their union determines + # the same filing unit for ordinary twin/sibling configurations. + target_first = person.family.max(np.where(target, first, -1)) + target_second = person.family.max(np.where(target, second, -1)) + siblings = child & ( + ((first >= 0) & ((first == target_first) | (first == target_second))) + | ((second >= 0) & ((second == target_first) | (second == target_second))) + ) + parent_rows = np.concatenate((first[siblings], second[siblings])) + parent_mask = np.bincount(parent_rows[parent_rows >= 0], minlength=person.count) > 0 + member = (siblings | parent_mask) & ~on_ssi + fallback = (child | person("is_parent", period.this_year)) & ~on_ssi + member = np.where(linked, member, fallback) + non_ssi_parent = parent_mask & ~on_ssi + related_to_non_ssi = ((first >= 0) & non_ssi_parent[first]) | ( + (second >= 0) & non_ssi_parent[second] + ) + subgroup = member & (non_ssi_parent | related_to_non_ssi) + return member, np.where(linked, subgroup, False) + + +def cts_income_limits(person, period, parameters, members, buening=False): + p = parameters(period).gov.states.wi.dhs.ssp.cts + size = person.family.sum(members) + area_i = person("wi_cts_area_i", period) + pregnant = person.family.sum(members & person("is_pregnant", period.this_year)) + gross = np.where(area_i, p.gross.area_1.calc(size), p.gross.area_2.calc(size)) + pregnancy_gross = np.where( + area_i, p.gross_pregnant.area_1.calc(size), p.gross_pregnant.area_2.calc(size) + ) + gross = np.where( + pregnant > 0, + pregnancy_gross + np.maximum(pregnant - 1, 0) * p.pregnancy_net, + gross, + ) + gross = gross + np.maximum(size - p.maximum_table_size, 0) * p.gross_additional + net = ( + np.where(area_i, p.net.area_1.calc(size), p.net.area_2.calc(size)) + + pregnant * p.pregnancy_net + ) + limit_name = ( + "wi_cts_buening_large_group_net_income_limit" + if buening + else "wi_cts_large_group_net_income_limit" + ) + verified_limit = person.family(limit_name, period) + table_covers_group = size <= p.maximum_table_size + net = np.where(table_covers_group, net, verified_limit) + known = table_covers_group | (verified_limit > 0) + return gross, net, known diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts.py new file mode 100644 index 00000000000..3d7368d6250 --- /dev/null +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts.py @@ -0,0 +1,52 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.wi.dhs.ssp._wi_cts import cts_income_limits + + +class wi_cts(Variable): + value_type = float + entity = Person + label = "Wisconsin Caretaker Supplement" + definition_period = MONTH + unit = USD + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" + defined_for = StateCode.WI + + def formula(person, period, parameters): + p = parameters(period).gov.states.wi.dhs.ssp.cts + members = person("wi_cts_sfu_member", period) + subgroup = members & person("wi_cts_buening_member", period) + gross = person("wi_cts_gross_income", period) + net = person("wi_cts_net_income", period) + deductions = max_(person("wi_cts_dependent_care_deduction", period), 0) + max_( + person("child_support_expense", period), 0 + ) + assets = max_(person("wi_cts_countable_resources", period), 0) + sub_gross, sub_net, sub_known = cts_income_limits( + person, period, parameters, subgroup, buening=True + ) + needy = ( + (person.family.sum(subgroup * gross) <= sub_gross) + & (max_(person.family.sum(subgroup * (net - deductions)), 0) <= sub_net) + & (person.family.sum(subgroup * assets) <= p.resource_limit) + ) + members = members & ~(subgroup & ~needy) + gross_limit, net_limit, known = cts_income_limits( + person, period, parameters, members + ) + financially_eligible = ( + (person.family.sum(members * gross) <= gross_limit) + & (max_(person.family.sum(members * (net - deductions)), 0) <= net_limit) + & (person.family.sum(members * assets) <= p.resource_limit) + ) + children = person.family.sum(members & person("wi_cts_child_eligible", period)) + amount = (children > 0) * p.first_child + max_( + children - 1, 0 + ) * p.additional_child + return ( + amount + * financially_eligible + * known + * sub_known + * ~person.family("wi_cts_nonfinancially_ineligible", period) + * person("wi_cts_payee", period) + ) diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_additional_flat_disregard.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_additional_flat_disregard.py new file mode 100644 index 00000000000..a8a44d4586b --- /dev/null +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_additional_flat_disregard.py @@ -0,0 +1,9 @@ +from policyengine_us.model_api import * + + +class wi_cts_additional_flat_disregard(Variable): + value_type = bool + entity = Person + label = "Wisconsin CTS additional 30 dollar earnings disregard applies" + definition_period = MONTH + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_additional_fraction_disregard.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_additional_fraction_disregard.py new file mode 100644 index 00000000000..24171ea31e4 --- /dev/null +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_additional_fraction_disregard.py @@ -0,0 +1,9 @@ +from policyengine_us.model_api import * + + +class wi_cts_additional_fraction_disregard(Variable): + value_type = bool + entity = Person + label = "Wisconsin CTS additional one-third earnings disregard applies" + definition_period = MONTH + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_area_i.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_area_i.py new file mode 100644 index 00000000000..3f3d8954746 --- /dev/null +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_area_i.py @@ -0,0 +1,15 @@ +from policyengine_us.model_api import * + + +class wi_cts_area_i(Variable): + value_type = bool + entity = Person + label = "Wisconsin CTS uses Area I income limits" + definition_period = MONTH + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" + documentation = "Override to true for the Oneida Tribe and qualifying Winnebago Tribe members on tax-free land in La Crosse or Marathon counties under Handbook 5.2.3." + + def formula(person, period, parameters): + p = parameters(period).gov.states.wi.dhs.ssp.cts + county = person.household("county", period.this_year).decode_to_str() + return np.isin(county, p.area_i_counties) diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_buening_large_group_net_income_limit.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_buening_large_group_net_income_limit.py new file mode 100644 index 00000000000..3898f583f83 --- /dev/null +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_buening_large_group_net_income_limit.py @@ -0,0 +1,11 @@ +from policyengine_us.model_api import * + + +class wi_cts_buening_large_group_net_income_limit(Variable): + value_type = float + entity = Family + label = "Wisconsin CTS agency-verified large Buening subgroup net income limit" + definition_period = MONTH + unit = USD + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" + documentation = "Supply the agency-verified monthly net income limit, including any pregnancy allowance, when the Buening subgroup has more than twelve people. The handbook publishes net limits only through size twelve. Zero means no verified limit has been supplied; the model cannot establish entitlement for that group." diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_buening_member.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_buening_member.py new file mode 100644 index 00000000000..3411ee0d609 --- /dev/null +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_buening_member.py @@ -0,0 +1,15 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.wi.dhs.ssp._wi_cts import cts_filing_unit + + +class wi_cts_buening_member(Variable): + value_type = bool + entity = Person + label = "Wisconsin CTS non-SSI co-parent subgroup member" + definition_period = MONTH + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" + documentation = "The non-SSI co-parent and children whose needs must be tested separately under Buening. Parent links identify ordinary two-parent blended families; override for more complex configurations or when links are absent." + + def formula(person, period, parameters): + _, subgroup = cts_filing_unit(person, period) + return subgroup diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_child_eligible.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_child_eligible.py new file mode 100644 index 00000000000..6524ef9c736 --- /dev/null +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_child_eligible.py @@ -0,0 +1,33 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.wi.dhs.ssp._wi_cts import cts_relationships + + +class wi_cts_child_eligible(Variable): + value_type = bool + entity = Person + label = "Wisconsin CTS nonfinancially eligible child" + definition_period = MONTH + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" + documentation = "Override for verified PRUCOL or other lawful statuses absent from the immigration enum, and certified Huber Law childcare release. Both co-resident natural/adoptive parents must receive Wisconsin state SSI." + + def formula(person, period, parameters): + _, _, _, _, parents, ssi_parents = cts_relationships(person, period) + status = person("immigration_status", period.this_year) + s = status.possible_values + immigration = ( + (status == s.CITIZEN) + | (status == s.LEGAL_PERMANENT_RESIDENT) + | (status == s.REFUGEE) + | (status == s.ASYLEE) + | (status == s.CUBAN_HAITIAN_ENTRANT) + | (status == s.DEPORTATION_WITHHELD) + | (status == s.CONDITIONAL_ENTRANT) + ) + return ( + person("wi_cts_dependent_child", period) + & (person("ssi", period) == 0) + & (ssi_parents > 0) + & (parents == ssi_parents) + & immigration + & ~person("is_incarcerated", period) + ) diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_child_excluded.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_child_excluded.py new file mode 100644 index 00000000000..af00679d33a --- /dev/null +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_child_excluded.py @@ -0,0 +1,9 @@ +from policyengine_us.model_api import * + + +class wi_cts_child_excluded(Variable): + value_type = bool + entity = Person + label = "Wisconsin CTS child excluded by a nonfinancial condition" + definition_period = MONTH + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_countable_resources.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_countable_resources.py new file mode 100644 index 00000000000..bbfd3e45ca7 --- /dev/null +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_countable_resources.py @@ -0,0 +1,15 @@ +from policyengine_us.model_api import * + + +class wi_cts_countable_resources(Variable): + value_type = float + entity = Person + label = "Wisconsin CTS individual countable resources" + definition_period = MONTH + unit = USD + quantity_type = STOCK + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" + documentation = "Default covers modeled SSI liquid resources. Override with the CTS asset budget when it differs: include retirement assets, life insurance, nonhome real estate and vehicle equity after the $1,500 exemption for one vehicle; exclude the home, approved burial assets, student loans and protected tax refunds. SSI recipients are excluded at the group calculation." + + def formula(person, period, parameters): + return person("ssi_countable_resources", period.this_year) diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_dependent_care_deduction.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_dependent_care_deduction.py new file mode 100644 index 00000000000..36db28171ad --- /dev/null +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_dependent_care_deduction.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class wi_cts_dependent_care_deduction(Variable): + value_type = float + entity = Person + label = "Wisconsin CTS allowed dependent care deduction" + definition_period = MONTH + unit = USD + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" + documentation = "Childcare cost per care recipient. Override with verified work-related care costs or incapacitated-adult care, subject to Handbook 3.2.1.2.3 limits." + + def formula(person, period, parameters): + p = parameters(period).gov.states.wi.dhs.ssp.cts + limit = where( + person("age", period.this_year) < p.care_young_age, + p.care_young_limit, + p.care_other_limit, + ) + return min_(max_(person("pre_subsidy_childcare_expenses", period), 0), limit) diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_dependent_child.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_dependent_child.py new file mode 100644 index 00000000000..9de78bbea93 --- /dev/null +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_dependent_child.py @@ -0,0 +1,24 @@ +from policyengine_us.model_api import * + + +class wi_cts_dependent_child(Variable): + value_type = bool + entity = Person + label = "Wisconsin CTS dependent child" + definition_period = MONTH + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" + documentation = "Requires a natural or adopted child. Override or set child_excluded for divorced minors or nonqualifying step/other relationships; annulled marriages do not exclude a minor." + + def formula(person, period, parameters): + p = parameters(period).gov.states.wi.dhs.ssp.cts + age = person("age", period.this_year) + older_student = ( + (age < p.student_age_limit) + & person("is_in_secondary_school", period.this_year) + & person("wi_cts_graduates_before_19", period) + ) + return ( + ((age < p.minor_age_limit) | older_student) + & (person.marital_unit.nb_persons() == 1) + & ~person("wi_cts_child_excluded", period) + ) diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_graduates_before_19.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_graduates_before_19.py new file mode 100644 index 00000000000..ab6d3bbbde7 --- /dev/null +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_graduates_before_19.py @@ -0,0 +1,9 @@ +from policyengine_us.model_api import * + + +class wi_cts_graduates_before_19(Variable): + value_type = bool + entity = Person + label = "Wisconsin CTS student expected to graduate before age 19" + definition_period = MONTH + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_gross_income.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_gross_income.py new file mode 100644 index 00000000000..99abf689f2f --- /dev/null +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_gross_income.py @@ -0,0 +1,18 @@ +from policyengine_us.model_api import * + + +class wi_cts_gross_income(Variable): + value_type = float + entity = Person + label = "Wisconsin CTS individual gross countable income" + definition_period = MONTH + unit = USD + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" + documentation = "All child support is excluded. Override for income sources or deeming absent from the modeled SSI cash-income sources. SSI recipients are excluded from the filing unit." + + def formula(person, period, parameters): + return max_(person("ssi_earned_income", period), 0) + max_( + person("ssi_unearned_income", period) + - person("child_support_received", period), + 0, + ) diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_large_group_net_income_limit.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_large_group_net_income_limit.py new file mode 100644 index 00000000000..99413d804a0 --- /dev/null +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_large_group_net_income_limit.py @@ -0,0 +1,11 @@ +from policyengine_us.model_api import * + + +class wi_cts_large_group_net_income_limit(Variable): + value_type = float + entity = Family + label = "Wisconsin CTS agency-verified large assistance group net income limit" + definition_period = MONTH + unit = USD + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" + documentation = "Supply the agency-verified monthly net income limit, including any pregnancy allowance, when the assistance group has more than twelve people. The handbook publishes net limits only through size twelve. Zero means no verified limit has been supplied; the model cannot establish entitlement for that group." diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_net_income.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_net_income.py new file mode 100644 index 00000000000..1183ff8f2b2 --- /dev/null +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_net_income.py @@ -0,0 +1,41 @@ +from policyengine_us.model_api import * + + +class wi_cts_net_income(Variable): + value_type = float + entity = Person + label = "Wisconsin CTS individual net countable income" + definition_period = MONTH + unit = USD + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" + + def formula(person, period, parameters): + p = parameters(period).gov.states.wi.dhs.ssp.cts + earned = max_(person("ssi_earned_income", period), 0) + unearned = max_(person("wi_cts_gross_income", period) - earned, 0) + continuing_minor = ( + person("age", period.this_year) < p.minor_age_limit + ) & person("wi_cts_received_recently", period) + exempt = continuing_minor & ( + person("is_full_time_student", period.this_year) + | ( + person("wi_cts_part_time_student", period) + & ( + person("weekly_hours_worked", period.this_year) + < p.student_hours_limit + ) + ) + ) + flat = ( + continuing_minor + | person("wi_cts_additional_flat_disregard", period) + | person("wi_cts_additional_fraction_disregard", period) + ) + fraction = continuing_minor | person( + "wi_cts_additional_fraction_disregard", period + ) + earned = max_(earned - p.work_expense - flat * p.earned_flat, 0) * ( + 1 - fraction * p.earned_fraction + ) + earned = where(exempt, 0, earned) + return earned + unearned diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_nonfinancially_ineligible.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_nonfinancially_ineligible.py new file mode 100644 index 00000000000..f87ecb05a2d --- /dev/null +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_nonfinancially_ineligible.py @@ -0,0 +1,10 @@ +from policyengine_us.model_api import * + + +class wi_cts_nonfinancially_ineligible(Variable): + value_type = bool + entity = Family + label = "Wisconsin CTS family fails a procedural requirement" + definition_period = MONTH + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" + documentation = "Includes unresolved child-support noncooperation without good cause, disqualifying divestment or lump-sum ineligibility, simultaneous W-2 participation, SSI fully recouped, or unverified residence/custody/SSN requirements. Child-specific kinship care or relationship exclusions use wi_cts_child_excluded." diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_part_time_student.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_part_time_student.py new file mode 100644 index 00000000000..d9f79c0a899 --- /dev/null +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_part_time_student.py @@ -0,0 +1,9 @@ +from policyengine_us.model_api import * + + +class wi_cts_part_time_student(Variable): + value_type = bool + entity = Person + label = "Wisconsin CTS child attends school part time" + definition_period = MONTH + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_payee.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_payee.py new file mode 100644 index 00000000000..d67278c0b86 --- /dev/null +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_payee.py @@ -0,0 +1,25 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.wi.dhs.ssp._wi_cts import cts_relationships + + +class wi_cts_payee(Variable): + value_type = bool + entity = Person + label = "Wisconsin CTS designated SSI parent payee" + definition_period = MONTH + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" + documentation = "One SSI parent receives the child award. Defaults to the first eligible parent in the family; override the agency-designated payee if different." + + def formula(person, period, parameters): + first, second, linked, receipt, _, _ = cts_relationships(person, period) + child = person("wi_cts_child_eligible", period) + parent_rows = np.concatenate((first[child], second[child])) + parent_mask = ( + np.bincount(parent_rows[parent_rows >= 0], minlength=person.count) > 0 + ) + candidate = ( + where(linked, parent_mask, person("is_parent", period.this_year)) & receipt + ) + index = np.arange(person.count) + first_payee = person.family.min(where(candidate, index, person.count)) + return candidate & (index == first_payee) diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_received_recently.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_received_recently.py new file mode 100644 index 00000000000..438751aa02a --- /dev/null +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_received_recently.py @@ -0,0 +1,9 @@ +from policyengine_us.model_api import * + + +class wi_cts_received_recently(Variable): + value_type = bool + entity = Person + label = "Wisconsin CTS received in one of the previous four months" + definition_period = MONTH + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_sfu_member.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_sfu_member.py new file mode 100644 index 00000000000..87e392a963b --- /dev/null +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_sfu_member.py @@ -0,0 +1,15 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.wi.dhs.ssp._wi_cts import cts_filing_unit + + +class wi_cts_sfu_member(Variable): + value_type = bool + entity = Person + label = "Wisconsin CTS standard filing unit member before Buening" + definition_period = MONTH + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" + documentation = "Uses co-resident parent IDs to form the target-child sibling and parent group. Without parent links the family is treated as one nuclear family. Override for multigeneration, step-parent or other complex filing units; parent IDs do not distinguish natural/adoptive from step relationships." + + def formula(person, period, parameters): + members, _ = cts_filing_unit(person, period) + return members diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_state_only_ssi_recipient.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_state_only_ssi_recipient.py new file mode 100644 index 00000000000..b5083c8e8e8 --- /dev/null +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_state_only_ssi_recipient.py @@ -0,0 +1,9 @@ +from policyengine_us.model_api import * + + +class wi_cts_state_only_ssi_recipient(Variable): + value_type = bool + entity = Person + label = "Wisconsin CTS parent receives grandfathered state-only SSI" + definition_period = MONTH + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssi_e.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssi_e.py new file mode 100644 index 00000000000..c85d4426ff6 --- /dev/null +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssi_e.py @@ -0,0 +1,32 @@ +from policyengine_us.model_api import * + + +class wi_ssi_e(Variable): + value_type = float + entity = Person + label = "Wisconsin SSI Exceptional Expense Supplement" + definition_period = MONTH + unit = USD + defined_for = "wi_ssp_eligible" + reference = ( + "https://www.dhs.wisconsin.gov/dms/memos/ops/dms-ops-2026-12.pdf#page=2", + "https://docs.legis.wisconsin.gov/statutes/statutes/49.pdf#page=140", + "https://www.emhandbooks.wisconsin.gov/ssi-admin/3/3.1_state-only_ssi_recipients.htm", + "https://www.dhs.wisconsin.gov/publications/p20679-26-01.pdf#page=6", + ) + + # Grandfathered state-only awards remain outside this formula. Memo + # 2026-12 establishes a 10% increase to an existing April 2026 award. + # The references are unclear about a NEW SSI-E certification: whether + # to add E to the protected regular award or recompute a combined + # income budget, and how any historical floor or cap carries forward. + # Wis. Stat. 49.77(2)(a)3, (3s), (5) and Handbook 3.1 establish eligibility + # and payment standards, but do not specify that calculation sequence. + + def formula(person, period, parameters): + p = parameters(period).gov.states.wi.dhs.ssp.exceptional_expense + certified = person("wi_ssi_e_certified", period) & person( + "wi_ssp_eligible", period + ) + both = person.marital_unit.sum(certified) == 2 + return certified * where(both, p.couple / 2, p.individual) diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssi_e_caregiver_id.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssi_e_caregiver_id.py new file mode 100644 index 00000000000..a29f2d35b15 --- /dev/null +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssi_e_caregiver_id.py @@ -0,0 +1,18 @@ +from policyengine_us.model_api import * + + +class wi_ssi_e_caregiver_id(Variable): + value_type = int + entity = Person + label = "Person ID of the Wisconsin SSI-E home caregiver" + definition_period = YEAR + quantity_type = STOCK + default_value = 0 + reference = ( + "https://www.hud.gov/sites/dfiles/OCHCO/documents/2023-27pihn.pdf#page=81" + ) + # Nonzero person_id of the family member providing the qualifying home care. Zero + # means unknown. The caregiver must be a different person in the same household and + # assisted SPM unit (the HUD family). Use distinct person IDs within the household. + # This annual identifier is read without division in monthly calculations, like + # parent IDs. Within-year changes of caregiver require separate scenarios. diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssi_e_certified.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssi_e_certified.py new file mode 100644 index 00000000000..af3e21337dd --- /dev/null +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssi_e_certified.py @@ -0,0 +1,10 @@ +from policyengine_us.model_api import * + + +class wi_ssi_e_certified(Variable): + value_type = bool + entity = Person + label = "Certified for Wisconsin SSI Exceptional Expense Supplement" + documentation = "County certification is effective in the requested month and ongoing SSI-E care requirements are met. Certification incorporates care needs, costs, approved placement or in-home services, and household support availability." + definition_period = MONTH + reference = "https://www.dhs.wisconsin.gov/publications/p20679-26-01.pdf" diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssi_e_for_home_care.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssi_e_for_home_care.py new file mode 100644 index 00000000000..789849e518b --- /dev/null +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssi_e_for_home_care.py @@ -0,0 +1,17 @@ +from policyengine_us.model_api import * + + +class wi_ssi_e_for_home_care(Variable): + value_type = bool + entity = Person + label = "Wisconsin SSI-E pays for care in the assisted home" + definition_period = MONTH + reference = ( + "https://www.hud.gov/sites/dfiles/OCHCO/documents/2023-27pihn.pdf#page=81", + "https://www.dhs.wisconsin.gov/publications/p20679-26-01.pdf#page=13", + ) + # The certified SSI-E payment funds care enabling this disabled person to remain in + # the family's assisted natural home. False for a substitute-care or facility award, + # or care for someone outside the assisted family. Certification alone does not + # establish this purpose. Identify the co-resident family caregiver with + # wi_ssi_e_caregiver_id. diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp.py new file mode 100644 index 00000000000..f16a34df54d --- /dev/null +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp.py @@ -0,0 +1,12 @@ +from policyengine_us.model_api import * + + +class wi_ssp(Variable): + value_type = float + entity = Person + label = "Wisconsin State SSI Supplement" + definition_period = MONTH + unit = USD + defined_for = StateCode.WI + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" + adds = ["wi_ssp_regular", "wi_ssi_e", "wi_cts"] diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_countable_for_hud.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_countable_for_hud.py new file mode 100644 index 00000000000..8545adfaf26 --- /dev/null +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_countable_for_hud.py @@ -0,0 +1,47 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.household.demographic.person._parent_links import ( + household_member_indices, +) + + +class wi_ssp_countable_for_hud(Variable): + value_type = float + entity = Person + label = "Wisconsin SSI supplement countable for HUD" + definition_period = MONTH + unit = USD + defined_for = StateCode.WI + reference = ( + "https://www.law.cornell.edu/cfr/text/24/5.609", + "https://www.hud.gov/sites/dfiles/OCHCO/documents/2023-27pihn.pdf#page=81", + "https://www.hud.gov/sites/dfiles/OCHCO/documents/2024-38pihn.pdf#page=3", + ) + + def formula(person, period, parameters): + caregiver_id = person("wi_ssi_e_caregiver_id", period.this_year) + person_id = person("person_id", period.this_year) + own_row = np.arange(person.count) + hud_family = person.spm_unit.reference_entity.members_entity_id + matches = np.zeros(person.count, dtype=int) + family_caregiver = np.zeros(person.count, dtype=bool) + for member in household_member_indices(person): + named = ( + (member >= 0) + & (caregiver_id != 0) + & (caregiver_id == person_id[member]) + ) + matches = matches + named + family_caregiver = family_caregiver | ( + named & (member != own_row) & (hud_family[member] == hud_family) + ) + disabled = person("is_disabled", period.this_year) | person( + "is_blind", period.this_year + ) + qualifies = ( + disabled + & person("wi_ssi_e_for_home_care", period) + & ~person("ssi_lives_in_medical_treatment_facility", period) + & (matches == 1) + & family_caregiver + ) + return person("wi_ssp", period) - qualifies * person("wi_ssi_e", period) diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_countable_for_snap.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_countable_for_snap.py new file mode 100644 index 00000000000..27a4ed3e7b0 --- /dev/null +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_countable_for_snap.py @@ -0,0 +1,14 @@ +from policyengine_us.model_api import * + + +class wi_ssp_countable_for_snap(Variable): + value_type = float + entity = Person + label = "Wisconsin state SSI supplements countable for FoodShare" + definition_period = MONTH + unit = USD + reference = "https://www.emhandbooks.wisconsin.gov/fsh/policy_files/4/43/4.3.4.htm" + # The current FoodShare income manual explicitly excludes SSI-E. + # The SSI-E handbook's older FoodShare discussion says otherwise; + # use the administering program's current, specific income rule. + adds = ["wi_ssp_regular", "wi_cts"] diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_eligible.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_eligible.py new file mode 100644 index 00000000000..b0a49dc4e1d --- /dev/null +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_eligible.py @@ -0,0 +1,24 @@ +from policyengine_us.model_api import * + + +class wi_ssp_eligible(Variable): + value_type = bool + entity = Person + label = "Eligible for Wisconsin State SSI Supplement" + definition_period = MONTH + defined_for = StateCode.WI + reference = "https://www.emhandbooks.wisconsin.gov/ssi-admin/2/2.1_federal_and_state_ssi_recipients.htm" + + def formula(person, period, parameters): + # This models federal-linked recipients. Grandfathered state-only + # recipients can qualify without federal SSI; their protected award + # and unresolved new SSI-E certification budget are documented in + # wi_ssi_e rather than inferred from the ordinary payment schedule. + institutional = person("ssi_lives_in_medical_treatment_facility", period) + continuation = person("wi_ssp_institutional_continuation", period) + incarcerated = person("is_incarcerated", period) + return ( + (person("ssi", period) > 0) + & ~incarcerated + & (~institutional | continuation) + ) diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_institutional_continuation.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_institutional_continuation.py new file mode 100644 index 00000000000..d2a44eb39cb --- /dev/null +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_institutional_continuation.py @@ -0,0 +1,10 @@ +from policyengine_us.model_api import * + + +class wi_ssp_institutional_continuation(Variable): + value_type = bool + entity = Person + label = "Wisconsin SSP temporary institutional continuation" + documentation = "State payment remains authorized during a temporary institutional stay. The continuation ends with the first month following the 90th day in a nursing home." + definition_period = MONTH + reference = "https://www.emhandbooks.wisconsin.gov/ssi-admin/2/2.1_federal_and_state_ssi_recipients.htm" diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_regular.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_regular.py new file mode 100644 index 00000000000..a9a3fa02dfd --- /dev/null +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_regular.py @@ -0,0 +1,35 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.ssa.ssi.eligibility.status.ssi_federal_living_arrangement import ( + SSIFederalLivingArrangement, +) + + +class wi_ssp_regular(Variable): + value_type = float + entity = Person + label = "Wisconsin basic state SSI supplement" + definition_period = MONTH + unit = USD + defined_for = "wi_ssp_eligible" + reference = "https://www.dhs.wisconsin.gov/dms/memos/ops/dms-ops-2026-12.pdf" + + def formula(person, period, parameters): + p = parameters(period).gov.states.wi.dhs.ssp + eligible = person("wi_ssp_eligible", period) + eligible_couple = person.marital_unit.sum(eligible) == 2 + has_spouse = person.marital_unit.nb_persons() == 2 + arrangement = person("ssi_federal_living_arrangement", period) + other_household = ( + arrangement == SSIFederalLivingArrangement.ANOTHER_PERSONS_HOUSEHOLD + ) + with_ineligible_spouse = where( + other_household, + p.amount.ineligible_spouse_other_household, + p.amount.ineligible_spouse_independent, + ) + base = select( + [eligible_couple, has_spouse], + [p.amount.couple / 2, with_ineligible_spouse], + default=p.amount.individual, + ) + return base 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..f1833319692 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 @@ -22,6 +22,7 @@ def formula(spm_unit, period, parameters): "ky_ssp", # Kentucky benefits "de_ssp", # Delaware benefits "fl_oss", + "wi_ssp", "ks_sspp", # Kansas benefits "hi_oss", "la_oss", # Louisiana benefits From f987350e11cc4ca6031e8995b988c2f9e1fed718 Mon Sep 17 00:00:00 2001 From: Ziming Date: Tue, 13 Oct 2026 01:06:45 -0400 Subject: [PATCH 2/4] Normalize Wisconsin SSP parameter and test formatting --- .../household/household_state_benefits.yaml | 1 + .../hud/annual_income/sources/unearned.yaml | 3 +- .../gov/states/wi/dhs/ssp/amount/couple.yaml | 9 +- .../states/wi/dhs/ssp/amount/individual.yaml | 12 +- .../amount/ineligible_spouse_independent.yaml | 12 +- .../ineligible_spouse_other_household.yaml | 12 +- .../wi/dhs/ssp/cts/additional_child.yaml | 9 +- .../wi/dhs/ssp/cts/area_i_counties.yaml | 47 +- .../wi/dhs/ssp/cts/care_other_limit.yaml | 9 +- .../states/wi/dhs/ssp/cts/care_young_age.yaml | 7 +- .../wi/dhs/ssp/cts/care_young_limit.yaml | 9 +- .../states/wi/dhs/ssp/cts/earned_flat.yaml | 9 +- .../wi/dhs/ssp/cts/earned_fraction.yaml | 10 +- .../states/wi/dhs/ssp/cts/first_child.yaml | 9 +- .../states/wi/dhs/ssp/cts/gross/area_1.yaml | 102 +- .../states/wi/dhs/ssp/cts/gross/area_2.yaml | 102 +- .../wi/dhs/ssp/cts/gross_additional.yaml | 12 +- .../wi/dhs/ssp/cts/gross_pregnant/area_1.yaml | 102 +- .../wi/dhs/ssp/cts/gross_pregnant/area_2.yaml | 102 +- .../wi/dhs/ssp/cts/maximum_table_size.yaml | 7 +- .../wi/dhs/ssp/cts/minor_age_limit.yaml | 7 +- .../gov/states/wi/dhs/ssp/cts/net/area_1.yaml | 102 +- .../gov/states/wi/dhs/ssp/cts/net/area_2.yaml | 102 +- .../states/wi/dhs/ssp/cts/pregnancy_net.yaml | 9 +- .../states/wi/dhs/ssp/cts/resource_limit.yaml | 7 +- .../wi/dhs/ssp/cts/student_age_limit.yaml | 7 +- .../wi/dhs/ssp/cts/student_hours_limit.yaml | 7 +- .../states/wi/dhs/ssp/cts/work_expense.yaml | 9 +- .../dhs/ssp/exceptional_expense/couple.yaml | 12 +- .../ssp/exceptional_expense/individual.yaml | 12 +- .../wi/dcf/works/wi_works_eligible.yaml | 95 +- .../gov/states/wi/dhs/ssp/integration.yaml | 171 +-- .../gov/states/wi/dhs/ssp/wi_cts.yaml | 1177 +++++++---------- .../gov/states/wi/dhs/ssp/wi_ssp.yaml | 22 +- .../wi/dhs/ssp/wi_ssp_countable_for_hud.yaml | 533 +++----- 35 files changed, 1210 insertions(+), 1647 deletions(-) diff --git a/policyengine_us/parameters/gov/household/household_state_benefits.yaml b/policyengine_us/parameters/gov/household/household_state_benefits.yaml index d76b5cfacf0..d5acb9b2c45 100644 --- a/policyengine_us/parameters/gov/household/household_state_benefits.yaml +++ b/policyengine_us/parameters/gov/household/household_state_benefits.yaml @@ -405,6 +405,7 @@ values: - nj_property_tax_relief # New York benefits - ny_child_care_subsidies + metadata: unit: list period: year 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 0f6111647fa..f695d420862 100644 --- a/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml @@ -31,6 +31,7 @@ values: - disability_benefits - survivor_benefits - financial_assistance + metadata: unit: list period: year @@ -42,5 +43,5 @@ metadata: href: https://www.dhs.wisconsin.gov/publications/p20679-26-01.pdf#page=24 - title: HUD Notice PIH 2023-27, Attachment G.11, Income Received for the Care of Family Members with Disabilities href: https://www.hud.gov/sites/dfiles/OCHCO/documents/2023-27pihn.pdf#page=81 - - title: 'HUD Notice PIH 2024-38, IV.B.1, Mandatory Deductions and Exclusions #page 3-4' + - title: "HUD Notice PIH 2024-38, IV.B.1, Mandatory Deductions and Exclusions #page 3-4" href: https://www.hud.gov/sites/dfiles/OCHCO/documents/2024-38pihn.pdf#page=3 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/couple.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/couple.yaml index 45be8473333..d5c78030d75 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/couple.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/couple.yaml @@ -1,11 +1,12 @@ description: Wisconsin provides this monthly amount couple payment under its State SSI Supplement program. values: - '2026-01-01': 132.05 - '2026-05-01': 145.26 + 2026-01-01: 132.05 + 2026-05-01: 145.26 + metadata: unit: currency-USD period: month label: Wisconsin SSI amount couple reference: - - title: Wisconsin DMS Operations Memo 26-12, SSI state payment increase, table page 2 - href: https://www.dhs.wisconsin.gov/dms/memos/ops/dms-ops-2026-12.pdf#page=2 + - title: Wisconsin DMS Operations Memo 26-12, SSI state payment increase, table page 2 + href: https://www.dhs.wisconsin.gov/dms/memos/ops/dms-ops-2026-12.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/individual.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/individual.yaml index 1dd125b4d7e..2caf0989628 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/individual.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/individual.yaml @@ -1,12 +1,12 @@ -description: Wisconsin provides this monthly amount individual payment under its State SSI Supplement - program. +description: Wisconsin provides this monthly amount individual payment under its State SSI Supplement program. values: - '2026-01-01': 83.78 - '2026-05-01': 92.16 + 2026-01-01: 83.78 + 2026-05-01: 92.16 + metadata: unit: currency-USD period: month label: Wisconsin SSI amount individual reference: - - title: Wisconsin DMS Operations Memo 26-12, SSI state payment increase, table page 2 - href: https://www.dhs.wisconsin.gov/dms/memos/ops/dms-ops-2026-12.pdf#page=2 + - title: Wisconsin DMS Operations Memo 26-12, SSI state payment increase, table page 2 + href: https://www.dhs.wisconsin.gov/dms/memos/ops/dms-ops-2026-12.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/ineligible_spouse_independent.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/ineligible_spouse_independent.yaml index 6874802915f..03d598f2b6c 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/ineligible_spouse_independent.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/ineligible_spouse_independent.yaml @@ -1,12 +1,12 @@ -description: Wisconsin provides this monthly amount ineligible spouse independent payment under its State - SSI Supplement program. +description: Wisconsin provides this monthly amount ineligible spouse independent payment under its State SSI Supplement program. values: - '2026-01-01': 130.43 - '2026-05-01': 143.47 + 2026-01-01: 130.43 + 2026-05-01: 143.47 + metadata: unit: currency-USD period: month label: Wisconsin SSI amount ineligible spouse independent reference: - - title: Wisconsin DMS Operations Memo 26-12, SSI state payment increase, table page 2 - href: https://www.dhs.wisconsin.gov/dms/memos/ops/dms-ops-2026-12.pdf#page=2 + - title: Wisconsin DMS Operations Memo 26-12, SSI state payment increase, table page 2 + href: https://www.dhs.wisconsin.gov/dms/memos/ops/dms-ops-2026-12.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/ineligible_spouse_other_household.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/ineligible_spouse_other_household.yaml index 413075bc7b5..1d8dd1b2128 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/ineligible_spouse_other_household.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/ineligible_spouse_other_household.yaml @@ -1,12 +1,12 @@ -description: Wisconsin provides this monthly amount ineligible spouse other household payment under its - State SSI Supplement program. +description: Wisconsin provides this monthly amount ineligible spouse other household payment under its State SSI Supplement program. values: - '2026-01-01': 135.05 - '2026-05-01': 148.56 + 2026-01-01: 135.05 + 2026-05-01: 148.56 + metadata: unit: currency-USD period: month label: Wisconsin SSI amount ineligible spouse other household reference: - - title: Wisconsin DMS Operations Memo 26-12, SSI state payment increase, table page 2 - href: https://www.dhs.wisconsin.gov/dms/memos/ops/dms-ops-2026-12.pdf#page=2 + - title: Wisconsin DMS Operations Memo 26-12, SSI state payment increase, table page 2 + href: https://www.dhs.wisconsin.gov/dms/memos/ops/dms-ops-2026-12.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/additional_child.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/additional_child.yaml index 5627a8e5f8f..3bb0c76085d 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/additional_child.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/additional_child.yaml @@ -1,10 +1,11 @@ description: Wisconsin uses this amount as its Caretaker Supplement additional eligible child benefit. values: - '2026-01-01': 165 + 2026-01-01: 165 + metadata: unit: currency-USD + period: month label: Wisconsin CTS additional eligible child benefit reference: - - title: Caretaker Supplement Handbook, sections 3 and 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf - period: month + - title: Caretaker Supplement Handbook, sections 3 and 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/area_i_counties.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/area_i_counties.yaml index f9b1bedf9c9..6a4c53ce716 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/area_i_counties.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/area_i_counties.yaml @@ -1,29 +1,30 @@ description: Wisconsin uses Area I Caretaker Supplement income limits in these counties. values: - '2026-01-01': - - BROWN_COUNTY_WI - - DANE_COUNTY_WI - - DODGE_COUNTY_WI - - DUNN_COUNTY_WI - - EAU_CLAIRE_COUNTY_WI - - FOND_DU_LAC_COUNTY_WI - - KENOSHA_COUNTY_WI - - LA_CROSSE_COUNTY_WI - - MARATHON_COUNTY_WI - - MANITOWOC_COUNTY_WI - - MILWAUKEE_COUNTY_WI - - OUTAGAMIE_COUNTY_WI - - OZAUKEE_COUNTY_WI - - RACINE_COUNTY_WI - - ROCK_COUNTY_WI - - ST_CROIX_COUNTY_WI - - SHEBOYGAN_COUNTY_WI - - WASHINGTON_COUNTY_WI - - WAUKESHA_COUNTY_WI - - WINNEBAGO_COUNTY_WI + 2026-01-01: + - BROWN_COUNTY_WI + - DANE_COUNTY_WI + - DODGE_COUNTY_WI + - DUNN_COUNTY_WI + - EAU_CLAIRE_COUNTY_WI + - FOND_DU_LAC_COUNTY_WI + - KENOSHA_COUNTY_WI + - LA_CROSSE_COUNTY_WI + - MARATHON_COUNTY_WI + - MANITOWOC_COUNTY_WI + - MILWAUKEE_COUNTY_WI + - OUTAGAMIE_COUNTY_WI + - OZAUKEE_COUNTY_WI + - RACINE_COUNTY_WI + - ROCK_COUNTY_WI + - ST_CROIX_COUNTY_WI + - SHEBOYGAN_COUNTY_WI + - WASHINGTON_COUNTY_WI + - WAUKESHA_COUNTY_WI + - WINNEBAGO_COUNTY_WI + metadata: unit: list label: Wisconsin CTS Area I counties reference: - - title: Caretaker Supplement Handbook, 5.2.3 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + - title: Caretaker Supplement Handbook, 5.2.3 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_other_limit.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_other_limit.yaml index 17c5afe6618..3e36f6f471a 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_other_limit.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_other_limit.yaml @@ -1,10 +1,11 @@ description: Wisconsin uses this amount as its Caretaker Supplement older child care deduction limit. values: - '2026-01-01': 175 + 2026-01-01: 175 + metadata: unit: currency-USD + period: month label: Wisconsin CTS older child care deduction limit reference: - - title: Caretaker Supplement Handbook, sections 3 and 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf - period: month + - title: Caretaker Supplement Handbook, sections 3 and 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_young_age.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_young_age.yaml index ee61b21dce7..6e196465596 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_young_age.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_young_age.yaml @@ -1,9 +1,10 @@ description: Wisconsin uses this amount as its Caretaker Supplement young child care age limit. values: - '2026-01-01': 2 + 2026-01-01: 2 + metadata: unit: year label: Wisconsin CTS young child care age limit reference: - - title: Caretaker Supplement Handbook, sections 3 and 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + - title: Caretaker Supplement Handbook, sections 3 and 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_young_limit.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_young_limit.yaml index a949aadb959..5a7bf8af2d8 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_young_limit.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_young_limit.yaml @@ -1,10 +1,11 @@ description: Wisconsin uses this amount as its Caretaker Supplement young child care deduction limit. values: - '2026-01-01': 200 + 2026-01-01: 200 + metadata: unit: currency-USD + period: month label: Wisconsin CTS young child care deduction limit reference: - - title: Caretaker Supplement Handbook, sections 3 and 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf - period: month + - title: Caretaker Supplement Handbook, sections 3 and 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/earned_flat.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/earned_flat.yaml index b537654f804..a2fa961bd8f 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/earned_flat.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/earned_flat.yaml @@ -1,10 +1,11 @@ description: Wisconsin uses this amount as its Caretaker Supplement additional flat earned income disregard. values: - '2026-01-01': 30 + 2026-01-01: 30 + metadata: unit: currency-USD + period: month label: Wisconsin CTS additional flat earned income disregard reference: - - title: Caretaker Supplement Handbook, sections 3 and 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf - period: month + - title: Caretaker Supplement Handbook, sections 3 and 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/earned_fraction.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/earned_fraction.yaml index 2e7088951ae..85aff23aadc 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/earned_fraction.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/earned_fraction.yaml @@ -1,10 +1,10 @@ -description: Wisconsin uses this amount as its Caretaker Supplement additional earned income disregard - fraction. +description: Wisconsin uses this amount as its Caretaker Supplement additional earned income disregard fraction. values: - '2026-01-01': 0.3333333333333333 + 2026-01-01: 0.3333333333333333 + metadata: unit: /1 label: Wisconsin CTS additional earned income disregard fraction reference: - - title: Caretaker Supplement Handbook, sections 3 and 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + - title: Caretaker Supplement Handbook, sections 3 and 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/first_child.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/first_child.yaml index 90c4742b02a..41493250902 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/first_child.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/first_child.yaml @@ -1,10 +1,11 @@ description: Wisconsin uses this amount as its Caretaker Supplement first eligible child benefit. values: - '2026-01-01': 275 + 2026-01-01: 275 + metadata: unit: currency-USD + period: month label: Wisconsin CTS first eligible child benefit reference: - - title: Caretaker Supplement Handbook, sections 3 and 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf - period: month + - title: Caretaker Supplement Handbook, sections 3 and 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross/area_1.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross/area_1.yaml index d3d300a4f58..0963c5a7a94 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross/area_1.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross/area_1.yaml @@ -1,4 +1,5 @@ description: Wisconsin sets these Caretaker Supplement gross income limits for Area 1. + metadata: unit: currency-USD period: month @@ -7,54 +8,55 @@ metadata: threshold_unit: person amount_unit: currency-USD reference: - - title: Caretaker Supplement Handbook, 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + - title: Caretaker Supplement Handbook, 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + brackets: -- threshold: - '2026-01-01': 1 - amount: - '2026-01-01': 576 -- threshold: - '2026-01-01': 2 - amount: - '2026-01-01': 1018 -- threshold: - '2026-01-01': 3 - amount: - '2026-01-01': 1197 -- threshold: - '2026-01-01': 4 - amount: - '2026-01-01': 1429 -- threshold: - '2026-01-01': 5 - amount: - '2026-01-01': 1640 -- threshold: - '2026-01-01': 6 - amount: - '2026-01-01': 1773 -- threshold: - '2026-01-01': 7 - amount: - '2026-01-01': 1919 -- threshold: - '2026-01-01': 8 - amount: - '2026-01-01': 2034 -- threshold: - '2026-01-01': 9 - amount: - '2026-01-01': 2130 -- threshold: - '2026-01-01': 10 - amount: - '2026-01-01': 2182 -- threshold: - '2026-01-01': 11 - amount: - '2026-01-01': 2228 -- threshold: - '2026-01-01': 12 - amount: - '2026-01-01': 2274 + - threshold: + 2026-01-01: 1 + amount: + 2026-01-01: 576 + - threshold: + 2026-01-01: 2 + amount: + 2026-01-01: 1_018 + - threshold: + 2026-01-01: 3 + amount: + 2026-01-01: 1_197 + - threshold: + 2026-01-01: 4 + amount: + 2026-01-01: 1_429 + - threshold: + 2026-01-01: 5 + amount: + 2026-01-01: 1_640 + - threshold: + 2026-01-01: 6 + amount: + 2026-01-01: 1_773 + - threshold: + 2026-01-01: 7 + amount: + 2026-01-01: 1_919 + - threshold: + 2026-01-01: 8 + amount: + 2026-01-01: 2_034 + - threshold: + 2026-01-01: 9 + amount: + 2026-01-01: 2_130 + - threshold: + 2026-01-01: 10 + amount: + 2026-01-01: 2_182 + - threshold: + 2026-01-01: 11 + amount: + 2026-01-01: 2_228 + - threshold: + 2026-01-01: 12 + amount: + 2026-01-01: 2_274 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross/area_2.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross/area_2.yaml index 845ab8cb62a..57229a9f298 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross/area_2.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross/area_2.yaml @@ -1,4 +1,5 @@ description: Wisconsin sets these Caretaker Supplement gross income limits for Area 2. + metadata: unit: currency-USD period: month @@ -7,54 +8,55 @@ metadata: threshold_unit: person amount_unit: currency-USD reference: - - title: Caretaker Supplement Handbook, 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + - title: Caretaker Supplement Handbook, 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + brackets: -- threshold: - '2026-01-01': 1 - amount: - '2026-01-01': 557 -- threshold: - '2026-01-01': 2 - amount: - '2026-01-01': 987 -- threshold: - '2026-01-01': 3 - amount: - '2026-01-01': 1159 -- threshold: - '2026-01-01': 4 - amount: - '2026-01-01': 1386 -- threshold: - '2026-01-01': 5 - amount: - '2026-01-01': 1593 -- threshold: - '2026-01-01': 6 - amount: - '2026-01-01': 1719 -- threshold: - '2026-01-01': 7 - amount: - '2026-01-01': 1863 -- threshold: - '2026-01-01': 8 - amount: - '2026-01-01': 1976 -- threshold: - '2026-01-01': 9 - amount: - '2026-01-01': 2067 -- threshold: - '2026-01-01': 10 - amount: - '2026-01-01': 2115 -- threshold: - '2026-01-01': 11 - amount: - '2026-01-01': 2161 -- threshold: - '2026-01-01': 12 - amount: - '2026-01-01': 2208 + - threshold: + 2026-01-01: 1 + amount: + 2026-01-01: 557 + - threshold: + 2026-01-01: 2 + amount: + 2026-01-01: 987 + - threshold: + 2026-01-01: 3 + amount: + 2026-01-01: 1_159 + - threshold: + 2026-01-01: 4 + amount: + 2026-01-01: 1_386 + - threshold: + 2026-01-01: 5 + amount: + 2026-01-01: 1_593 + - threshold: + 2026-01-01: 6 + amount: + 2026-01-01: 1_719 + - threshold: + 2026-01-01: 7 + amount: + 2026-01-01: 1_863 + - threshold: + 2026-01-01: 8 + amount: + 2026-01-01: 1_976 + - threshold: + 2026-01-01: 9 + amount: + 2026-01-01: 2_067 + - threshold: + 2026-01-01: 10 + amount: + 2026-01-01: 2_115 + - threshold: + 2026-01-01: 11 + amount: + 2026-01-01: 2_161 + - threshold: + 2026-01-01: 12 + amount: + 2026-01-01: 2_208 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_additional.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_additional.yaml index 7aae2134b01..7785f1f8c09 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_additional.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_additional.yaml @@ -1,11 +1,11 @@ -description: Wisconsin uses this amount as its Caretaker Supplement gross income limit increase beyond - the table. +description: Wisconsin uses this amount as its Caretaker Supplement gross income limit increase beyond the table. values: - '2026-01-01': 25 + 2026-01-01: 25 + metadata: unit: currency-USD + period: month label: Wisconsin CTS gross income limit increase beyond the table reference: - - title: Caretaker Supplement Handbook, sections 3 and 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf - period: month + - title: Caretaker Supplement Handbook, sections 3 and 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_pregnant/area_1.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_pregnant/area_1.yaml index 4b647671b69..e14acf03099 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_pregnant/area_1.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_pregnant/area_1.yaml @@ -1,4 +1,5 @@ description: Wisconsin sets these Caretaker Supplement gross pregnant income limits for Area 1. + metadata: unit: currency-USD period: month @@ -7,54 +8,55 @@ metadata: threshold_unit: person amount_unit: currency-USD reference: - - title: Caretaker Supplement Handbook, 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + - title: Caretaker Supplement Handbook, 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + brackets: -- threshold: - '2026-01-01': 1 - amount: - '2026-01-01': 707 -- threshold: - '2026-01-01': 2 - amount: - '2026-01-01': 1149 -- threshold: - '2026-01-01': 3 - amount: - '2026-01-01': 1329 -- threshold: - '2026-01-01': 4 - amount: - '2026-01-01': 1560 -- threshold: - '2026-01-01': 5 - amount: - '2026-01-01': 1771 -- threshold: - '2026-01-01': 6 - amount: - '2026-01-01': 1904 -- threshold: - '2026-01-01': 7 - amount: - '2026-01-01': 2050 -- threshold: - '2026-01-01': 8 - amount: - '2026-01-01': 2165 -- threshold: - '2026-01-01': 9 - amount: - '2026-01-01': 2261 -- threshold: - '2026-01-01': 10 - amount: - '2026-01-01': 2313 -- threshold: - '2026-01-01': 11 - amount: - '2026-01-01': 2359 -- threshold: - '2026-01-01': 12 - amount: - '2026-01-01': 2405 + - threshold: + 2026-01-01: 1 + amount: + 2026-01-01: 707 + - threshold: + 2026-01-01: 2 + amount: + 2026-01-01: 1_149 + - threshold: + 2026-01-01: 3 + amount: + 2026-01-01: 1_329 + - threshold: + 2026-01-01: 4 + amount: + 2026-01-01: 1_560 + - threshold: + 2026-01-01: 5 + amount: + 2026-01-01: 1_771 + - threshold: + 2026-01-01: 6 + amount: + 2026-01-01: 1_904 + - threshold: + 2026-01-01: 7 + amount: + 2026-01-01: 2_050 + - threshold: + 2026-01-01: 8 + amount: + 2026-01-01: 2_165 + - threshold: + 2026-01-01: 9 + amount: + 2026-01-01: 2_261 + - threshold: + 2026-01-01: 10 + amount: + 2026-01-01: 2_313 + - threshold: + 2026-01-01: 11 + amount: + 2026-01-01: 2_359 + - threshold: + 2026-01-01: 12 + amount: + 2026-01-01: 2_405 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_pregnant/area_2.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_pregnant/area_2.yaml index 5d043ceadeb..6863ea9d48e 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_pregnant/area_2.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_pregnant/area_2.yaml @@ -1,4 +1,5 @@ description: Wisconsin sets these Caretaker Supplement gross pregnant income limits for Area 2. + metadata: unit: currency-USD period: month @@ -7,54 +8,55 @@ metadata: threshold_unit: person amount_unit: currency-USD reference: - - title: Caretaker Supplement Handbook, 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + - title: Caretaker Supplement Handbook, 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + brackets: -- threshold: - '2026-01-01': 1 - amount: - '2026-01-01': 689 -- threshold: - '2026-01-01': 2 - amount: - '2026-01-01': 1118 -- threshold: - '2026-01-01': 3 - amount: - '2026-01-01': 1290 -- threshold: - '2026-01-01': 4 - amount: - '2026-01-01': 1517 -- threshold: - '2026-01-01': 5 - amount: - '2026-01-01': 1725 -- threshold: - '2026-01-01': 6 - amount: - '2026-01-01': 1850 -- threshold: - '2026-01-01': 7 - amount: - '2026-01-01': 1995 -- threshold: - '2026-01-01': 8 - amount: - '2026-01-01': 2108 -- threshold: - '2026-01-01': 9 - amount: - '2026-01-01': 2198 -- threshold: - '2026-01-01': 10 - amount: - '2026-01-01': 2246 -- threshold: - '2026-01-01': 11 - amount: - '2026-01-01': 2293 -- threshold: - '2026-01-01': 12 - amount: - '2026-01-01': 2339 + - threshold: + 2026-01-01: 1 + amount: + 2026-01-01: 689 + - threshold: + 2026-01-01: 2 + amount: + 2026-01-01: 1_118 + - threshold: + 2026-01-01: 3 + amount: + 2026-01-01: 1_290 + - threshold: + 2026-01-01: 4 + amount: + 2026-01-01: 1_517 + - threshold: + 2026-01-01: 5 + amount: + 2026-01-01: 1_725 + - threshold: + 2026-01-01: 6 + amount: + 2026-01-01: 1_850 + - threshold: + 2026-01-01: 7 + amount: + 2026-01-01: 1_995 + - threshold: + 2026-01-01: 8 + amount: + 2026-01-01: 2_108 + - threshold: + 2026-01-01: 9 + amount: + 2026-01-01: 2_198 + - threshold: + 2026-01-01: 10 + amount: + 2026-01-01: 2_246 + - threshold: + 2026-01-01: 11 + amount: + 2026-01-01: 2_293 + - threshold: + 2026-01-01: 12 + amount: + 2026-01-01: 2_339 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/maximum_table_size.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/maximum_table_size.yaml index 686d4fecb4f..2396cadb75b 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/maximum_table_size.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/maximum_table_size.yaml @@ -1,9 +1,10 @@ description: Wisconsin publishes Caretaker Supplement income limits up to this group size. values: - '2026-01-01': 12 + 2026-01-01: 12 + metadata: unit: person label: Wisconsin CTS last published income table size reference: - - title: Caretaker Supplement Handbook, 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + - title: Caretaker Supplement Handbook, 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/minor_age_limit.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/minor_age_limit.yaml index 582248cd86a..0bd79ca7da9 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/minor_age_limit.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/minor_age_limit.yaml @@ -1,9 +1,10 @@ description: Wisconsin uses this amount as its Caretaker Supplement minor age limit. values: - '2026-01-01': 18 + 2026-01-01: 18 + metadata: unit: year label: Wisconsin CTS minor age limit reference: - - title: Caretaker Supplement Handbook, sections 3 and 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + - title: Caretaker Supplement Handbook, sections 3 and 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/net/area_1.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/net/area_1.yaml index 18e3b4f95f1..3346c1caad4 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/net/area_1.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/net/area_1.yaml @@ -1,4 +1,5 @@ description: Wisconsin sets these Caretaker Supplement net income limits for Area 1. + metadata: unit: currency-USD period: month @@ -7,54 +8,55 @@ metadata: threshold_unit: person amount_unit: currency-USD reference: - - title: Caretaker Supplement Handbook, 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + - title: Caretaker Supplement Handbook, 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + brackets: -- threshold: - '2026-01-01': 1 - amount: - '2026-01-01': 311 -- threshold: - '2026-01-01': 2 - amount: - '2026-01-01': 550 -- threshold: - '2026-01-01': 3 - amount: - '2026-01-01': 647 -- threshold: - '2026-01-01': 4 - amount: - '2026-01-01': 772 -- threshold: - '2026-01-01': 5 - amount: - '2026-01-01': 886 -- threshold: - '2026-01-01': 6 - amount: - '2026-01-01': 958 -- threshold: - '2026-01-01': 7 - amount: - '2026-01-01': 1037 -- threshold: - '2026-01-01': 8 - amount: - '2026-01-01': 1099 -- threshold: - '2026-01-01': 9 - amount: - '2026-01-01': 1151 -- threshold: - '2026-01-01': 10 - amount: - '2026-01-01': 1179 -- threshold: - '2026-01-01': 11 - amount: - '2026-01-01': 1204 -- threshold: - '2026-01-01': 12 - amount: - '2026-01-01': 1229 + - threshold: + 2026-01-01: 1 + amount: + 2026-01-01: 311 + - threshold: + 2026-01-01: 2 + amount: + 2026-01-01: 550 + - threshold: + 2026-01-01: 3 + amount: + 2026-01-01: 647 + - threshold: + 2026-01-01: 4 + amount: + 2026-01-01: 772 + - threshold: + 2026-01-01: 5 + amount: + 2026-01-01: 886 + - threshold: + 2026-01-01: 6 + amount: + 2026-01-01: 958 + - threshold: + 2026-01-01: 7 + amount: + 2026-01-01: 1_037 + - threshold: + 2026-01-01: 8 + amount: + 2026-01-01: 1_099 + - threshold: + 2026-01-01: 9 + amount: + 2026-01-01: 1_151 + - threshold: + 2026-01-01: 10 + amount: + 2026-01-01: 1_179 + - threshold: + 2026-01-01: 11 + amount: + 2026-01-01: 1_204 + - threshold: + 2026-01-01: 12 + amount: + 2026-01-01: 1_229 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/net/area_2.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/net/area_2.yaml index 45b30d79c5a..8362837133c 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/net/area_2.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/net/area_2.yaml @@ -1,4 +1,5 @@ description: Wisconsin sets these Caretaker Supplement net income limits for Area 2. + metadata: unit: currency-USD period: month @@ -7,54 +8,55 @@ metadata: threshold_unit: person amount_unit: currency-USD reference: - - title: Caretaker Supplement Handbook, 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + - title: Caretaker Supplement Handbook, 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + brackets: -- threshold: - '2026-01-01': 1 - amount: - '2026-01-01': 301 -- threshold: - '2026-01-01': 2 - amount: - '2026-01-01': 533 -- threshold: - '2026-01-01': 3 - amount: - '2026-01-01': 626 -- threshold: - '2026-01-01': 4 - amount: - '2026-01-01': 749 -- threshold: - '2026-01-01': 5 - amount: - '2026-01-01': 861 -- threshold: - '2026-01-01': 6 - amount: - '2026-01-01': 929 -- threshold: - '2026-01-01': 7 - amount: - '2026-01-01': 1007 -- threshold: - '2026-01-01': 8 - amount: - '2026-01-01': 1068 -- threshold: - '2026-01-01': 9 - amount: - '2026-01-01': 1117 -- threshold: - '2026-01-01': 10 - amount: - '2026-01-01': 1143 -- threshold: - '2026-01-01': 11 - amount: - '2026-01-01': 1168 -- threshold: - '2026-01-01': 12 - amount: - '2026-01-01': 1193 + - threshold: + 2026-01-01: 1 + amount: + 2026-01-01: 301 + - threshold: + 2026-01-01: 2 + amount: + 2026-01-01: 533 + - threshold: + 2026-01-01: 3 + amount: + 2026-01-01: 626 + - threshold: + 2026-01-01: 4 + amount: + 2026-01-01: 749 + - threshold: + 2026-01-01: 5 + amount: + 2026-01-01: 861 + - threshold: + 2026-01-01: 6 + amount: + 2026-01-01: 929 + - threshold: + 2026-01-01: 7 + amount: + 2026-01-01: 1_007 + - threshold: + 2026-01-01: 8 + amount: + 2026-01-01: 1_068 + - threshold: + 2026-01-01: 9 + amount: + 2026-01-01: 1_117 + - threshold: + 2026-01-01: 10 + amount: + 2026-01-01: 1_143 + - threshold: + 2026-01-01: 11 + amount: + 2026-01-01: 1_168 + - threshold: + 2026-01-01: 12 + amount: + 2026-01-01: 1_193 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/pregnancy_net.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/pregnancy_net.yaml index 0931c6edceb..30aff77a040 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/pregnancy_net.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/pregnancy_net.yaml @@ -1,10 +1,11 @@ description: Wisconsin uses this amount as its Caretaker Supplement net income limit increase per pregnancy. values: - '2026-01-01': 71 + 2026-01-01: 71 + metadata: unit: currency-USD + period: month label: Wisconsin CTS net income limit increase per pregnancy reference: - - title: Caretaker Supplement Handbook, sections 3 and 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf - period: month + - title: Caretaker Supplement Handbook, sections 3 and 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/resource_limit.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/resource_limit.yaml index a82b231aaab..68c45a2b688 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/resource_limit.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/resource_limit.yaml @@ -1,9 +1,10 @@ description: Wisconsin uses this amount as its Caretaker Supplement resource limit. values: - '2026-01-01': 1000 + 2026-01-01: 1_000 + metadata: unit: currency-USD label: Wisconsin CTS resource limit reference: - - title: Caretaker Supplement Handbook, sections 3 and 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + - title: Caretaker Supplement Handbook, sections 3 and 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/student_age_limit.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/student_age_limit.yaml index b87f31865e9..3e3a5e9ed97 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/student_age_limit.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/student_age_limit.yaml @@ -1,9 +1,10 @@ description: Wisconsin uses this amount as its Caretaker Supplement dependent student age limit. values: - '2026-01-01': 19 + 2026-01-01: 19 + metadata: unit: year label: Wisconsin CTS dependent student age limit reference: - - title: Caretaker Supplement Handbook, sections 3 and 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + - title: Caretaker Supplement Handbook, sections 3 and 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/student_hours_limit.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/student_hours_limit.yaml index 39c4b39987b..35f68d54ff9 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/student_hours_limit.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/student_hours_limit.yaml @@ -1,9 +1,10 @@ description: Wisconsin uses this amount as its Caretaker Supplement part-time student weekly work limit. values: - '2026-01-01': 30 + 2026-01-01: 30 + metadata: unit: hour label: Wisconsin CTS part-time student weekly work limit reference: - - title: Caretaker Supplement Handbook, sections 3 and 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + - title: Caretaker Supplement Handbook, sections 3 and 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/work_expense.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/work_expense.yaml index 1b217048e2a..eb25f78b461 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/work_expense.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/work_expense.yaml @@ -1,10 +1,11 @@ description: Wisconsin uses this amount as its Caretaker Supplement work expense deduction. values: - '2026-01-01': 90 + 2026-01-01: 90 + metadata: unit: currency-USD + period: month label: Wisconsin CTS work expense deduction reference: - - title: Caretaker Supplement Handbook, sections 3 and 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf - period: month + - title: Caretaker Supplement Handbook, sections 3 and 5.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/exceptional_expense/couple.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/exceptional_expense/couple.yaml index 51b7c704cf7..ad2353bf6b0 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/exceptional_expense/couple.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/exceptional_expense/couple.yaml @@ -1,12 +1,12 @@ -description: Wisconsin provides this monthly exceptional expense couple payment under its State SSI Supplement - program. +description: Wisconsin provides this monthly exceptional expense couple payment under its State SSI Supplement program. values: - '2026-01-01': 345.36 - '2026-05-01': 379.9 + 2026-01-01: 345.36 + 2026-05-01: 379.9 + metadata: unit: currency-USD period: month label: Wisconsin SSI exceptional expense couple reference: - - title: Wisconsin DMS Operations Memo 26-12, SSI state payment increase, table page 2 - href: https://www.dhs.wisconsin.gov/dms/memos/ops/dms-ops-2026-12.pdf#page=2 + - title: Wisconsin DMS Operations Memo 26-12, SSI state payment increase, table page 2 + href: https://www.dhs.wisconsin.gov/dms/memos/ops/dms-ops-2026-12.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/exceptional_expense/individual.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/exceptional_expense/individual.yaml index 7b28ef92f00..5817915afe7 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/exceptional_expense/individual.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/exceptional_expense/individual.yaml @@ -1,12 +1,12 @@ -description: Wisconsin provides this monthly exceptional expense individual payment under its State SSI - Supplement program. +description: Wisconsin provides this monthly exceptional expense individual payment under its State SSI Supplement program. values: - '2026-01-01': 95.99 - '2026-05-01': 105.59 + 2026-01-01: 95.99 + 2026-05-01: 105.59 + metadata: unit: currency-USD period: month label: Wisconsin SSI exceptional expense individual reference: - - title: Wisconsin DMS Operations Memo 26-12, SSI state payment increase, table page 2 - href: https://www.dhs.wisconsin.gov/dms/memos/ops/dms-ops-2026-12.pdf#page=2 + - title: Wisconsin DMS Operations Memo 26-12, SSI state payment increase, table page 2 + href: https://www.dhs.wisconsin.gov/dms/memos/ops/dms-ops-2026-12.pdf#page=2 diff --git a/policyengine_us/tests/policy/baseline/gov/states/wi/dcf/works/wi_works_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/wi/dcf/works/wi_works_eligible.yaml index 59c7fbb8a01..f5ee55407c5 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/wi/dcf/works/wi_works_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/wi/dcf/works/wi_works_eligible.yaml @@ -8,6 +8,7 @@ wi_works_resources_eligible: true output: wi_works_eligible: true + - name: Case 2, not eligible due to demographic. period: 2025-01 input: @@ -18,6 +19,7 @@ wi_works_resources_eligible: true output: wi_works_eligible: false + - name: Case 3, not eligible due to citizenship. period: 2025-01 input: @@ -28,6 +30,7 @@ wi_works_resources_eligible: true output: wi_works_eligible: false + - name: Case 4, not eligible due to income. period: 2025-01 input: @@ -38,6 +41,7 @@ wi_works_resources_eligible: true output: wi_works_eligible: false + - name: Case 5, not eligible due to resources. period: 2025-01 input: @@ -48,124 +52,107 @@ wi_works_resources_eligible: false output: wi_works_eligible: false + - name: Case 6, non-Wisconsin state. period: 2025-01 input: state_code: CA output: wi_works_eligible: false -- name: SSI parent cannot receive W-2 for the same month + +- name: Case 7, SSI parent cannot receive W-2 for the same month. period: 2026-01 input: people: - parent: + person1: age: 35 ssi: 994 person_id: 1 - child: + person2: age: 8 ssi: 0 person_id: 2 parent_1_id: 1 + marital_units: + parent: + members: [person1] + child: + members: [person2] spm_units: unit: - members: - - parent - - child + members: [person1, person2] wi_works_income_eligible: true wi_works_resources_eligible: true households: household: - members: - - parent - - child + members: [person1, person2] state_code: WI - marital_units: - parent: - members: - - parent - child: - members: - - child output: wi_works_eligible: false -- name: Child SSI does not exclude a non-SSI W-2 parent + +- name: Case 8, Child SSI does not exclude a non-SSI W-2 parent. period: 2026-01 input: people: - parent: + person1: age: 35 ssi: 0 person_id: 1 - child: + person2: age: 8 ssi: 994 person_id: 2 parent_1_id: 1 + marital_units: + parent: + members: [person1] + child: + members: [person2] spm_units: unit: - members: - - parent - - child + members: [person1, person2] wi_works_income_eligible: true wi_works_resources_eligible: true households: household: - members: - - parent - - child + members: [person1, person2] state_code: WI - marital_units: - parent: - members: - - parent - child: - members: - - child output: wi_works_eligible: true -- name: SSI parent does not exclude a non-SSI co-parent from W-2 + +- name: Case 9, SSI parent does not exclude a non-SSI co-parent from W-2. period: 2026-01 input: people: - parent: + person1: age: 35 ssi: 994 person_id: 1 - child: + person2: age: 8 ssi: 0 person_id: 2 parent_1_id: 1 parent_2_id: 3 - coparent: + person3: person_id: 3 age: 35 ssi: 0 + marital_units: + parent: + members: [person1] + child: + members: [person2] + coparent: + members: [person3] spm_units: unit: - members: - - parent - - child - - coparent + members: [person1, person2, person3] wi_works_income_eligible: true wi_works_resources_eligible: true households: household: - members: - - parent - - child - - coparent + members: [person1, person2, person3] state_code: WI - marital_units: - parent: - members: - - parent - child: - members: - - child - coparent: - members: - - coparent output: wi_works_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/integration.yaml index 4a977187cd5..ee3c47c1b9c 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/integration.yaml @@ -3,82 +3,68 @@ absolute_error_margin: 0.01 input: people: - first: + person1: age: 2026: 65 wi_ssi_e_certified: false - second: + person2: age: 2026: 65 wi_ssi_e_certified: false marital_units: couple: - members: - - first - - second + members: [person1, person2] tax_units: unit: - members: - - first - - second + members: [person1, person2] households: household: - members: - - first - - second + members: [person1, person2] state_code: 2026: WI output: - wi_ssp: - - 72.63 - - 72.63 + wi_ssp: [72.63, 72.63] + - name: Case 2, one eligible spouse. period: 2026-05 absolute_error_margin: 0.01 input: people: - first: + person1: age: 2026: 65 wi_ssi_e_certified: false - second: + person2: age: 2026: 40 wi_ssi_e_certified: false marital_units: couple: - members: - - first - - second + members: [person1, person2] tax_units: unit: - members: - - first - - second + members: [person1, person2] households: household: - members: - - first - - second + members: [person1, person2] state_code: 2026: WI output: - wi_ssp: - - 143.47 - - 0 + wi_ssp: [143.47, 0] + - name: Case 3, one eligible spouse in another household. period: 2026-05 absolute_error_margin: 0.01 input: people: - first: + person1: age: 2026: 65 wi_ssi_e_certified: false ssi_lives_in_another_persons_household: true ssi_receives_shelter_from_others_in_household: true ssi_others_pay_all_meals: true - second: + person2: age: 2026: 40 wi_ssi_e_certified: false @@ -87,93 +73,72 @@ ssi_others_pay_all_meals: true marital_units: couple: - members: - - first - - second + members: [person1, person2] tax_units: unit: - members: - - first - - second + members: [person1, person2] households: household: - members: - - first - - second + members: [person1, person2] state_code: 2026: WI output: - wi_ssp: - - 148.56 - - 0 + wi_ssp: [148.56, 0] + - name: Case 4, both spouses certified. period: 2026-05 absolute_error_margin: 0.01 input: people: - first: + person1: age: 2026: 65 wi_ssi_e_certified: true - second: + person2: age: 2026: 65 wi_ssi_e_certified: true marital_units: couple: - members: - - first - - second + members: [person1, person2] tax_units: unit: - members: - - first - - second + members: [person1, person2] households: household: - members: - - first - - second + members: [person1, person2] state_code: 2026: WI output: - wi_ssp: - - 262.58 - - 262.58 + wi_ssp: [262.58, 262.58] + - name: Case 5, one spouse certified. period: 2026-05 absolute_error_margin: 0.01 input: people: - first: + person1: age: 2026: 65 wi_ssi_e_certified: true - second: + person2: age: 2026: 65 wi_ssi_e_certified: false marital_units: couple: - members: - - first - - second + members: [person1, person2] tax_units: unit: - members: - - first - - second + members: [person1, person2] households: household: - members: - - first - - second + members: [person1, person2] state_code: 2026: WI output: - wi_ssp: - - 178.22 - - 72.63 + wi_ssp: [178.22, 72.63] + - name: Case 6, annual benefits and SNAP income include both rates. period: 2026 absolute_error_margin: 0.01 @@ -183,63 +148,53 @@ age: 2026: 65 output: - wi_ssp: 1072.4 - household_state_benefits: 1072.4 - snap_unearned_income: 13000.4 -- name: Caretaker Supplement is included once in annual state and SNAP income - period: '2026' + wi_ssp: 1_072.4 + household_state_benefits: 1_072.4 + snap_unearned_income: 13_000.4 + +- name: Case 7, Caretaker Supplement is included once in annual state and SNAP income. + period: 2026 absolute_error_margin: 0.01 input: people: - parent: + person1: age: 40 person_id: 1 meets_ssi_disability_criteria: true - child: + person2: age: 8 person_id: 2 parent_1_id: 1 + marital_units: + parent: + members: [person1] + child: + members: [person2] families: unit: - members: - - parent - - child + members: [person1, person2] + spm_units: + spm: + members: [person1, person2] households: home: - members: - - parent - - child + members: [person1, person2] state_code: WI county: DANE_COUNTY_WI - marital_units: - parent: - members: - - parent - child: - members: - - child - spm_units: - spm: - members: - - parent - - child output: - wi_cts: - - 3300 - - 0 - wi_ssp: - - 4372.4 - - 0 - snap_unearned_income: 16300.4 -- name: Wisconsin excludes SSI-E from FoodShare but counts it for HUD - period: '2026' + wi_cts: [3_300, 0] + wi_ssp: [4_372.4, 0] + snap_unearned_income: 16_300.4 + +- name: Case 8, Wisconsin excludes SSI-E from FoodShare but counts it for HUD. + period: 2026 absolute_error_margin: 0.01 input: state_code: WI age: 65 wi_ssi_e_certified: true output: - wi_ssp: 2301.08 - wi_ssi_e: 1228.68 - snap_unearned_income: 13000.4 - hud_unearned_income: 14229.08 + wi_ssp: 2_301.08 + wi_ssi_e: 1_228.68 + snap_unearned_income: 13_000.4 + hud_unearned_income: 14_229.08 diff --git a/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_cts.yaml b/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_cts.yaml index 48ad44bf1f7..34c029e1b82 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_cts.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_cts.yaml @@ -1,1460 +1,1197 @@ -- name: One non-SSI child receives the first-child amount +- name: Case 1, One non-SSI child receives the first-child amount. period: 2026-01 absolute_error_margin: 0.01 input: people: - parent: + person1: age: 40 person_id: 1 ssi: 994 wi_ssp_regular: 83.78 - child0: + person2: age: 8 person_id: 2 parent_1_id: 1 + marital_units: + parent: + members: [person1] + child0: + members: [person2] families: unit: - members: &id001 - - parent - - child0 + members: &id001 [person1, person2] households: home: members: *id001 state_code: WI county: DANE_COUNTY_WI - marital_units: - parent: - members: - - parent - child0: - members: - - child0 output: - wi_cts: - - 275 - - 0 -- name: Three eligible children use first and subsequent rates + wi_cts: [275, 0] + +- name: Case 2, Three eligible children use first and subsequent rates. period: 2026-01 absolute_error_margin: 0.01 input: people: - parent: + person1: age: 40 person_id: 1 ssi: 994 wi_ssp_regular: 83.78 - child0: + person2: age: 8 person_id: 2 parent_1_id: 1 - child1: + person3: age: 9 person_id: 3 parent_1_id: 1 - child2: + person4: age: 10 person_id: 4 parent_1_id: 1 + marital_units: + parent: + members: [person1] + child0: + members: [person2] + child1: + members: [person3] + child2: + members: [person4] families: unit: - members: &id002 - - parent - - child0 - - child1 - - child2 + members: &id002 [person1, person2, person3, person4] households: home: members: *id002 state_code: WI county: DANE_COUNTY_WI - marital_units: - parent: - members: - - parent - child0: - members: - - child0 - child1: - members: - - child1 - child2: - members: - - child2 output: - wi_cts: - - 605 - - 0 - - 0 - - 0 -- name: A child receiving SSI is excluded + wi_cts: [605, 0, 0, 0] + +- name: Case 3, A child receiving SSI is excluded. period: 2026-01 absolute_error_margin: 0.01 input: people: - parent: + person1: age: 40 person_id: 1 ssi: 994 wi_ssp_regular: 83.78 - child0: + person2: age: 8 person_id: 2 parent_1_id: 1 ssi: 100 + marital_units: + parent: + members: [person1] + child0: + members: [person2] families: unit: - members: &id003 - - parent - - child0 + members: &id003 [person1, person2] households: home: members: *id003 state_code: WI county: DANE_COUNTY_WI - marital_units: - parent: - members: - - parent - child0: - members: - - child0 output: - wi_cts: - - 0 - - 0 -- name: SSDI alone does not make the parent eligible + wi_cts: [0, 0] + +- name: Case 4, SSDI alone does not make the parent eligible. period: 2026-01 absolute_error_margin: 0.01 input: people: - parent: + person1: age: 40 person_id: 1 ssi: 0 wi_ssp_regular: 0 - social_security_disability: 12000 - child0: + social_security_disability: 12_000 + person2: age: 8 person_id: 2 parent_1_id: 1 + marital_units: + parent: + members: [person1] + child0: + members: [person2] families: unit: - members: &id004 - - parent - - child0 + members: &id004 [person1, person2] households: home: members: *id004 state_code: WI county: DANE_COUNTY_WI - marital_units: - parent: - members: - - parent - child0: - members: - - child0 output: - wi_cts: - - 0 - - 0 -- name: Verified grandfathered state-only SSI parent can qualify + wi_cts: [0, 0] + +- name: Case 5, Verified grandfathered state-only SSI parent can qualify. period: 2026-01 absolute_error_margin: 0.01 input: people: - parent: + person1: age: 40 person_id: 1 ssi: 0 wi_ssp_regular: 0 wi_cts_state_only_ssi_recipient: true - child0: + person2: age: 8 person_id: 2 parent_1_id: 1 + marital_units: + parent: + members: [person1] + child0: + members: [person2] families: unit: - members: &id005 - - parent - - child0 + members: &id005 [person1, person2] households: home: members: *id005 state_code: WI county: DANE_COUNTY_WI - marital_units: - parent: - members: - - parent - child0: - members: - - child0 output: - wi_cts: - - 275 - - 0 -- name: Age 18 needs graduation certification + wi_cts: [275, 0] + +- name: Case 6, Age 18 needs graduation certification. period: 2026-01 absolute_error_margin: 0.01 input: people: - parent: + person1: age: 40 person_id: 1 ssi: 994 wi_ssp_regular: 83.78 - child0: + person2: age: 18 person_id: 2 parent_1_id: 1 is_in_secondary_school: true + marital_units: + parent: + members: [person1] + child0: + members: [person2] families: unit: - members: &id006 - - parent - - child0 + members: &id006 [person1, person2] households: home: members: *id006 state_code: WI county: DANE_COUNTY_WI - marital_units: - parent: - members: - - parent - child0: - members: - - child0 output: - wi_cts: - - 0 - - 0 -- name: Age 18 enrolled and graduating before 19 + wi_cts: [0, 0] + +- name: Case 7, Age 18 enrolled and graduating before 19. period: 2026-01 absolute_error_margin: 0.01 input: people: - parent: + person1: age: 40 person_id: 1 ssi: 994 wi_ssp_regular: 83.78 - child0: + person2: age: 18 person_id: 2 parent_1_id: 1 is_in_secondary_school: true wi_cts_graduates_before_19: true + marital_units: + parent: + members: [person1] + child0: + members: [person2] families: unit: - members: &id007 - - parent - - child0 + members: &id007 [person1, person2] households: home: members: *id007 state_code: WI county: DANE_COUNTY_WI - marital_units: - parent: - members: - - parent - child0: - members: - - child0 output: - wi_cts: - - 275 - - 0 -- name: Age 19 is ineligible + wi_cts: [275, 0] + +- name: Case 8, Age 19 is ineligible. period: 2026-01 absolute_error_margin: 0.01 input: people: - parent: + person1: age: 40 person_id: 1 ssi: 994 wi_ssp_regular: 83.78 - child0: + person2: age: 19 person_id: 2 parent_1_id: 1 is_in_secondary_school: true wi_cts_graduates_before_19: true + marital_units: + parent: + members: [person1] + child0: + members: [person2] families: unit: - members: &id008 - - parent - - child0 + members: &id008 [person1, person2] households: home: members: *id008 state_code: WI county: DANE_COUNTY_WI - marital_units: - parent: - members: - - parent - child0: - members: - - child0 output: - wi_cts: - - 0 - - 0 -- name: Child support is excluded from both tests + wi_cts: [0, 0] + +- name: Case 9, Child support is excluded from both tests. period: 2026-01 absolute_error_margin: 0.01 input: people: - parent: + person1: age: 40 person_id: 1 ssi: 994 wi_ssp_regular: 83.78 - child0: + person2: age: 8 person_id: 2 parent_1_id: 1 - child_support_received: 24000 + child_support_received: 24_000 + marital_units: + parent: + members: [person1] + child0: + members: [person2] families: unit: - members: &id009 - - parent - - child0 + members: &id009 [person1, person2] households: home: members: *id009 state_code: WI county: DANE_COUNTY_WI - marital_units: - parent: - members: - - parent - child0: - members: - - child0 output: - wi_cts: - - 275 - - 0 -- name: Income at the Area I net limit + wi_cts: [275, 0] + +- name: Case 10, Income at the Area I net limit. period: 2026-01 absolute_error_margin: 0.01 input: people: - parent: + person1: age: 40 person_id: 1 ssi: 994 wi_ssp_regular: 83.78 - child0: + person2: age: 8 person_id: 2 parent_1_id: 1 - social_security_survivors: 3732 + social_security_survivors: 3_732 + marital_units: + parent: + members: [person1] + child0: + members: [person2] families: unit: - members: &id010 - - parent - - child0 + members: &id010 [person1, person2] households: home: members: *id010 state_code: WI county: DANE_COUNTY_WI - marital_units: - parent: - members: - - parent - child0: - members: - - child0 output: - wi_cts: - - 275 - - 0 -- name: Income above the Area I net limit + wi_cts: [275, 0] + +- name: Case 11, Income above the Area I net limit. period: 2026-01 absolute_error_margin: 0.01 input: people: - parent: + person1: age: 40 person_id: 1 ssi: 994 wi_ssp_regular: 83.78 - child0: + person2: age: 8 person_id: 2 parent_1_id: 1 - social_security_survivors: 3744 + social_security_survivors: 3_744 + marital_units: + parent: + members: [person1] + child0: + members: [person2] families: unit: - members: &id011 - - parent - - child0 + members: &id011 [person1, person2] households: home: members: *id011 state_code: WI county: DANE_COUNTY_WI - marital_units: - parent: - members: - - parent - child0: - members: - - child0 output: - wi_cts: - - 0 - - 0 -- name: Same income exceeds Area II net limit + wi_cts: [0, 0] + +- name: Case 12, Same income exceeds Area II net limit. period: 2026-01 absolute_error_margin: 0.01 input: people: - parent: + person1: age: 40 person_id: 1 ssi: 994 wi_ssp_regular: 83.78 - child0: + person2: age: 8 person_id: 2 parent_1_id: 1 - social_security_survivors: 3660 + social_security_survivors: 3_660 + marital_units: + parent: + members: [person1] + child0: + members: [person2] families: unit: - members: &id012 - - parent - - child0 + members: &id012 [person1, person2] households: home: members: *id012 state_code: WI county: ADAMS_COUNTY_WI - marital_units: - parent: - members: - - parent - child0: - members: - - child0 output: - wi_cts: - - 0 - - 0 -- name: Income and resources belonging to SSI people are excluded + wi_cts: [0, 0] + +- name: Case 13, Income and resources belonging to SSI people are excluded. period: 2026-01 absolute_error_margin: 0.01 input: people: - parent: + person1: age: 40 person_id: 1 ssi: 994 wi_ssp_regular: 83.78 - employment_income: 120000 - ssi_countable_resources: 100000 - child0: + employment_income: 120_000 + ssi_countable_resources: 100_000 + person2: age: 8 person_id: 2 parent_1_id: 1 + marital_units: + parent: + members: [person1] + child0: + members: [person2] families: unit: - members: &id013 - - parent - - child0 + members: &id013 [person1, person2] households: home: members: *id013 state_code: WI county: DANE_COUNTY_WI - marital_units: - parent: - members: - - parent - child0: - members: - - child0 output: - wi_cts: - - 275 - - 0 -- name: Non-SSI resources at the limit + wi_cts: [275, 0] + +- name: Case 14, Non-SSI resources at the limit. period: 2026-01 absolute_error_margin: 0.01 input: people: - parent: + person1: age: 40 person_id: 1 ssi: 994 wi_ssp_regular: 83.78 - child0: + person2: age: 8 person_id: 2 parent_1_id: 1 - wi_cts_countable_resources: 1000 + wi_cts_countable_resources: 1_000 + marital_units: + parent: + members: [person1] + child0: + members: [person2] families: unit: - members: &id014 - - parent - - child0 + members: &id014 [person1, person2] households: home: members: *id014 state_code: WI county: DANE_COUNTY_WI - marital_units: - parent: - members: - - parent - child0: - members: - - child0 output: - wi_cts: - - 275 - - 0 -- name: Non-SSI resources above the limit + wi_cts: [275, 0] + +- name: Case 15, Non-SSI resources above the limit. period: 2026-01 absolute_error_margin: 0.01 input: people: - parent: + person1: age: 40 person_id: 1 ssi: 994 wi_ssp_regular: 83.78 - child0: + person2: age: 8 person_id: 2 parent_1_id: 1 - wi_cts_countable_resources: 1001 + wi_cts_countable_resources: 1_001 + marital_units: + parent: + members: [person1] + child0: + members: [person2] families: unit: - members: &id015 - - parent - - child0 + members: &id015 [person1, person2] households: home: members: *id015 state_code: WI county: DANE_COUNTY_WI - marital_units: - parent: - members: - - parent - child0: - members: - - child0 output: - wi_cts: - - 0 - - 0 -- name: New applicant earnings receive the 90 dollar work deduction + wi_cts: [0, 0] + +- name: Case 16, New applicant earnings receive the 90 dollar work deduction. period: 2026-01 absolute_error_margin: 0.01 input: people: - parent: + person1: age: 40 person_id: 1 ssi: 994 wi_ssp_regular: 83.78 - child0: + person2: age: 8 person_id: 2 parent_1_id: 1 - employment_income: 4812 + employment_income: 4_812 + marital_units: + parent: + members: [person1] + child0: + members: [person2] families: unit: - members: &id016 - - parent - - child0 + members: &id016 [person1, person2] households: home: members: *id016 state_code: WI county: DANE_COUNTY_WI - marital_units: - parent: - members: - - parent - child0: - members: - - child0 output: - wi_cts: - - 275 - - 0 -- name: New applicant just above net earnings limit + wi_cts: [275, 0] + +- name: Case 17, New applicant just above net earnings limit. period: 2026-01 absolute_error_margin: 0.01 input: people: - parent: + person1: age: 40 person_id: 1 ssi: 994 wi_ssp_regular: 83.78 - child0: + person2: age: 8 person_id: 2 parent_1_id: 1 - employment_income: 4824 + employment_income: 4_824 + marital_units: + parent: + members: [person1] + child0: + members: [person2] families: unit: - members: &id017 - - parent - - child0 + members: &id017 [person1, person2] households: home: members: *id017 state_code: WI county: DANE_COUNTY_WI - marital_units: - parent: - members: - - parent - child0: - members: - - child0 output: - wi_cts: - - 0 - - 0 -- name: Continuing minor full-time student earnings are exempt only in net test + wi_cts: [0, 0] + +- name: Case 18, Continuing minor full-time student earnings are exempt only in net test. period: 2026-01 absolute_error_margin: 0.01 input: people: - parent: + person1: age: 40 person_id: 1 ssi: 994 wi_ssp_regular: 83.78 - child0: + person2: age: 8 person_id: 2 parent_1_id: 1 - employment_income: 6912 + employment_income: 6_912 is_full_time_student: true wi_cts_received_recently: true + marital_units: + parent: + members: [person1] + child0: + members: [person2] families: unit: - members: &id018 - - parent - - child0 + members: &id018 [person1, person2] households: home: members: *id018 state_code: WI county: DANE_COUNTY_WI - marital_units: - parent: - members: - - parent - child0: - members: - - child0 output: - wi_cts: - - 275 - - 0 -- name: Continuing student fails gross test despite net exemption + wi_cts: [275, 0] + +- name: Case 19, Continuing student fails gross test despite net exemption. period: 2026-01 absolute_error_margin: 0.01 input: people: - parent: + person1: age: 40 person_id: 1 ssi: 994 wi_ssp_regular: 83.78 - child0: + person2: age: 8 person_id: 2 parent_1_id: 1 - employment_income: 6924 + employment_income: 6_924 is_full_time_student: true wi_cts_received_recently: true + marital_units: + parent: + members: [person1] + child0: + members: [person2] families: unit: - members: &id019 - - parent - - child0 + members: &id019 [person1, person2] households: home: members: *id019 state_code: WI county: DANE_COUNTY_WI - marital_units: - parent: - members: - - parent - child0: - members: - - child0 output: - wi_cts: - - 0 - - 0 -- name: Continuing nonschool minor receives 30 and one-third deduction + wi_cts: [0, 0] + +- name: Case 20, Continuing nonschool minor receives 30 and one-third deduction. period: 2026-01 absolute_error_margin: 0.01 input: people: - parent: + person1: age: 40 person_id: 1 ssi: 994 wi_ssp_regular: 83.78 - child0: + person2: age: 8 person_id: 2 parent_1_id: 1 - employment_income: 6840 + employment_income: 6_840 wi_cts_received_recently: true is_full_time_student: false + marital_units: + parent: + members: [person1] + child0: + members: [person2] families: unit: - members: &id020 - - parent - - child0 + members: &id020 [person1, person2] households: home: members: *id020 state_code: WI county: DANE_COUNTY_WI - marital_units: - parent: - members: - - parent - child0: - members: - - child0 output: - wi_cts: - - 275 - - 0 -- name: Two co-resident parents must both receive state SSI + wi_cts: [275, 0] + +- name: Case 21, Two co-resident parents must both receive state SSI. period: 2026-01 absolute_error_margin: 0.01 input: people: - parent: + person1: age: 40 person_id: 1 ssi: 994 wi_ssp_regular: 83.78 - child0: + person2: age: 8 person_id: 2 parent_1_id: 1 parent_2_id: 20 - other: + person3: age: 40 person_id: 20 + marital_units: + parent: + members: [person1] + child0: + members: [person2] + other: + members: [person3] families: unit: - members: &id021 - - parent - - child0 - - other + members: &id021 [person1, person2, person3] households: home: members: *id021 state_code: WI county: DANE_COUNTY_WI - marital_units: - parent: - members: - - parent - child0: - members: - - child0 - other: - members: - - other output: - wi_cts: - - 0 - - 0 - - 0 -- name: Two SSI parents share one child award through the designated payee + wi_cts: [0, 0, 0] + +- name: Case 22, Two SSI parents share one child award through the designated payee. period: 2026-01 absolute_error_margin: 0.01 input: people: - parent: + person1: age: 40 person_id: 1 ssi: 994 wi_ssp_regular: 83.78 - child0: + person2: age: 8 person_id: 2 parent_1_id: 1 parent_2_id: 20 - other: + person3: age: 40 person_id: 20 ssi: 745.5 wi_ssp_regular: 66.03 + marital_units: + parent: + members: [person1] + child0: + members: [person2] + other: + members: [person3] families: unit: - members: &id022 - - parent - - child0 - - other + members: &id022 [person1, person2, person3] households: home: members: *id022 state_code: WI county: DANE_COUNTY_WI - marital_units: - parent: - members: - - parent - child0: - members: - - child0 - other: - members: - - other output: - wi_cts: - - 275 - - 0 - - 0 -- name: Outside Wisconsin + wi_cts: [275, 0, 0] + +- name: Case 23, Outside Wisconsin. period: 2026-01 absolute_error_margin: 0.01 input: people: - parent: + person1: age: 40 person_id: 1 ssi: 994 wi_ssp_regular: 83.78 - child0: + person2: age: 8 person_id: 2 parent_1_id: 1 + marital_units: + parent: + members: [person1] + child0: + members: [person2] families: unit: - members: &id023 - - parent - - child0 + members: &id023 [person1, person2] households: home: members: *id023 state_code: IL county: DANE_COUNTY_WI - marital_units: - parent: - members: - - parent - child0: - members: - - child0 output: - wi_cts: - - 0 - - 0 -- name: Undocumented child + wi_cts: [0, 0] + +- name: Case 24, Undocumented child. period: 2026-01 absolute_error_margin: 0.01 input: people: - parent: + person1: age: 40 person_id: 1 ssi: 994 wi_ssp_regular: 83.78 - child0: + person2: age: 8 person_id: 2 parent_1_id: 1 immigration_status: UNDOCUMENTED + marital_units: + parent: + members: [person1] + child0: + members: [person2] families: unit: - members: &id024 - - parent - - child0 + members: &id024 [person1, person2] households: home: members: *id024 state_code: WI county: DANE_COUNTY_WI - marital_units: - parent: - members: - - parent - child0: - members: - - child0 output: - wi_cts: - - 0 - - 0 -- name: Permanent resident child is not subject to SSI five-year rules + wi_cts: [0, 0] + +- name: Case 25, Permanent resident child is not subject to SSI five-year rules. period: 2026-01 absolute_error_margin: 0.01 input: people: - parent: + person1: age: 40 person_id: 1 ssi: 994 wi_ssp_regular: 83.78 - child0: + person2: age: 8 person_id: 2 parent_1_id: 1 immigration_status: LEGAL_PERMANENT_RESIDENT + marital_units: + parent: + members: [person1] + child0: + members: [person2] families: unit: - members: &id025 - - parent - - child0 + members: &id025 [person1, person2] households: home: members: *id025 state_code: WI county: DANE_COUNTY_WI - marital_units: - parent: - members: - - parent - child0: - members: - - child0 output: - wi_cts: - - 275 - - 0 -- name: Handbook Buening example with co-parent income 700 + wi_cts: [275, 0] + +- name: Case 26, Handbook Buening example with co-parent income 700. period: 2026-01 absolute_error_margin: 0.01 input: people: - parent: + person1: age: 40 person_id: 1 ssi: 994 wi_ssp_regular: 83.78 - child0: + person2: age: 10 person_id: 2 parent_1_id: 1 social_security_survivors: 0 - child1: + person3: age: 8 person_id: 3 parent_1_id: 1 parent_2_id: 20 - other: + person4: age: 40 person_id: 20 - unemployment_compensation: 8400 + unemployment_compensation: 8_400 + marital_units: + parent: + members: [person1] + child0: + members: [person2] + child1: + members: [person3] + other: + members: [person4] families: unit: - members: &id026 - - parent - - child0 - - child1 - - other + members: &id026 [person1, person2, person3, person4] households: home: members: *id026 state_code: WI county: DANE_COUNTY_WI - marital_units: - parent: - members: - - parent - child0: - members: - - child0 - child1: - members: - - child1 - other: - members: - - other output: - wi_cts: - - 275 - - 0 - - 0 - - 0 -- name: Handbook Buening example with co-parent income 500 + wi_cts: [275, 0, 0, 0] + +- name: Case 27, Handbook Buening example with co-parent income 500. period: 2026-01 absolute_error_margin: 0.01 input: people: - parent: + person1: age: 40 person_id: 1 ssi: 994 wi_ssp_regular: 83.78 - child0: + person2: age: 10 person_id: 2 parent_1_id: 1 - social_security_survivors: 2400 - child1: + social_security_survivors: 2_400 + person3: age: 8 person_id: 3 parent_1_id: 1 parent_2_id: 20 - other: + person4: age: 40 person_id: 20 - unemployment_compensation: 6000 + unemployment_compensation: 6_000 + marital_units: + parent: + members: [person1] + child0: + members: [person2] + child1: + members: [person3] + other: + members: [person4] families: unit: - members: &id027 - - parent - - child0 - - child1 - - other + members: &id027 [person1, person2, person3, person4] households: home: members: *id027 state_code: WI county: DANE_COUNTY_WI - marital_units: - parent: - members: - - parent - child0: - members: - - child0 - child1: - members: - - child1 - other: - members: - - other output: - wi_cts: - - 0 - - 0 - - 0 - - 0 -- name: Dependent care paid for a sibling reduces the whole group net income + wi_cts: [0, 0, 0, 0] + +- name: Case 28, Dependent care paid for a sibling reduces the whole group net income. period: 2026-01 absolute_error_margin: 0.01 input: people: - parent: + person1: age: 40 person_id: 1 ssi: 994 wi_ssp_regular: 83.78 - child0: + person2: age: 8 person_id: 2 parent_1_id: 1 - employment_income: 8400 - child1: + employment_income: 8_400 + person3: age: 9 person_id: 3 parent_1_id: 1 - pre_subsidy_childcare_expenses: 2400 + pre_subsidy_childcare_expenses: 2_400 + marital_units: + parent: + members: [person1] + child0: + members: [person2] + child1: + members: [person3] families: unit: - members: - - parent - - child0 - - child1 + members: [person1, person2, person3] households: home: - members: - - parent - - child0 - - child1 + members: [person1, person2, person3] state_code: WI county: DANE_COUNTY_WI - marital_units: - parent: - members: - - parent - child0: - members: - - child0 - child1: - members: - - child1 output: - wi_cts: - - 440 - - 0 - - 0 -- name: Child-support noncooperation excludes the entire family + wi_cts: [440, 0, 0] + +- name: Case 29, Child-support noncooperation excludes the entire family. period: 2026-01 absolute_error_margin: 0.01 input: people: - parent: + person1: age: 40 person_id: 1 ssi: 994 wi_ssp_regular: 83.78 - child0: + person2: age: 8 person_id: 2 parent_1_id: 1 + marital_units: + parent: + members: [person1] + child0: + members: [person2] families: unit: - members: &id028 - - parent - - child0 + members: &id028 [person1, person2] wi_cts_nonfinancially_ineligible: true households: home: members: *id028 state_code: WI county: DANE_COUNTY_WI - marital_units: - parent: - members: - - parent - child0: - members: - - child0 output: - wi_cts: - - 0 - - 0 -- name: Annual CTS resource balance above the limit remains ineligible - period: '2026' + wi_cts: [0, 0] + +- name: Case 30, Annual CTS resource balance above the limit remains ineligible. + period: 2026 absolute_error_margin: 0.01 input: people: - parent: + person1: age: 40 person_id: 1 ssi: 994 wi_ssp_regular: 83.78 - child0: + person2: age: 8 person_id: 2 parent_1_id: 1 - wi_cts_countable_resources: 1001 + wi_cts_countable_resources: 1_001 + marital_units: + parent: + members: [person1] + child0: + members: [person2] families: unit: - members: &id029 - - parent - - child0 + members: &id029 [person1, person2] households: home: members: *id029 state_code: WI county: DANE_COUNTY_WI - marital_units: - parent: - members: - - parent - child0: - members: - - child0 output: - wi_cts: - - 0 - - 0 -- name: Large CTS group requires a verified net income limit + wi_cts: [0, 0] + +- name: Case 31, Large CTS group requires a verified net income limit. period: 2026-01 absolute_error_margin: 0.01 input: people: - parent: + person1: age: 40 person_id: 1 ssi: 994 wi_ssp_regular: 83.78 - child0: + person2: age: 8 person_id: 2 parent_1_id: 1 - child1: + person3: age: 9 person_id: 3 parent_1_id: 1 - child2: + person4: age: 10 person_id: 4 parent_1_id: 1 - child3: + person5: age: 11 person_id: 5 parent_1_id: 1 - child4: + person6: age: 12 person_id: 6 parent_1_id: 1 - child5: + person7: age: 13 person_id: 7 parent_1_id: 1 - child6: + person8: age: 14 person_id: 8 parent_1_id: 1 - child7: + person9: age: 15 person_id: 9 parent_1_id: 1 - child8: + person10: age: 8 person_id: 10 parent_1_id: 1 - child9: + person11: age: 9 person_id: 11 parent_1_id: 1 - child10: + person12: age: 10 person_id: 12 parent_1_id: 1 - child11: + person13: age: 11 person_id: 13 parent_1_id: 1 - child12: + person14: age: 12 person_id: 14 parent_1_id: 1 - families: - unit: - members: &id030 - - parent - - child0 - - child1 - - child2 - - child3 - - child4 - - child5 - - child6 - - child7 - - child8 - - child9 - - child10 - - child11 - - child12 - households: - home: - members: *id030 - state_code: WI - county: DANE_COUNTY_WI marital_units: parent: - members: - - parent + members: [person1] child0: - members: - - child0 + members: [person2] child1: - members: - - child1 + members: [person3] child2: - members: - - child2 + members: [person4] child3: - members: - - child3 + members: [person5] child4: - members: - - child4 + members: [person6] child5: - members: - - child5 + members: [person7] child6: - members: - - child6 + members: [person8] child7: - members: - - child7 + members: [person9] child8: - members: - - child8 + members: [person10] child9: - members: - - child9 + members: [person11] child10: - members: - - child10 + members: [person12] child11: - members: - - child11 + members: [person13] child12: - members: - - child12 + members: [person14] + families: + unit: + members: &id030 [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10, person11, person12, person13, person14] + households: + home: + members: *id030 + state_code: WI + county: DANE_COUNTY_WI output: - wi_cts: - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 -- name: Agency-verified CTS limit supports a thirteen-child group + wi_cts: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + +- name: Case 32, Agency-verified CTS limit supports a thirteen-child group. period: 2026-01 absolute_error_margin: 0.01 input: people: - parent: + person1: age: 40 person_id: 1 ssi: 994 wi_ssp_regular: 83.78 - child0: + person2: age: 8 person_id: 2 parent_1_id: 1 - child1: + person3: age: 9 person_id: 3 parent_1_id: 1 - child2: + person4: age: 10 person_id: 4 parent_1_id: 1 - child3: + person5: age: 11 person_id: 5 parent_1_id: 1 - child4: + person6: age: 12 person_id: 6 parent_1_id: 1 - child5: + person7: age: 13 person_id: 7 parent_1_id: 1 - child6: + person8: age: 14 person_id: 8 parent_1_id: 1 - child7: + person9: age: 15 person_id: 9 parent_1_id: 1 - child8: + person10: age: 8 person_id: 10 parent_1_id: 1 - child9: + person11: age: 9 person_id: 11 parent_1_id: 1 - child10: + person12: age: 10 person_id: 12 parent_1_id: 1 - child11: + person13: age: 11 person_id: 13 parent_1_id: 1 - child12: + person14: age: 12 person_id: 14 parent_1_id: 1 - families: - unit: - members: &id031 - - parent - - child0 - - child1 - - child2 - - child3 - - child4 - - child5 - - child6 - - child7 - - child8 - - child9 - - child10 - - child11 - - child12 - wi_cts_large_group_net_income_limit: 1254 - households: - home: - members: *id031 - state_code: WI - county: DANE_COUNTY_WI marital_units: parent: - members: - - parent + members: [person1] child0: - members: - - child0 + members: [person2] child1: - members: - - child1 + members: [person3] child2: - members: - - child2 + members: [person4] child3: - members: - - child3 + members: [person5] child4: - members: - - child4 + members: [person6] child5: - members: - - child5 + members: [person7] child6: - members: - - child6 + members: [person8] child7: - members: - - child7 + members: [person9] child8: - members: - - child8 + members: [person10] child9: - members: - - child9 + members: [person11] child10: - members: - - child10 + members: [person12] child11: - members: - - child11 + members: [person13] child12: - members: - - child12 + members: [person14] + families: + unit: + members: &id031 [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10, person11, person12, person13, person14] + wi_cts_large_group_net_income_limit: 1_254 + households: + home: + members: *id031 + state_code: WI + county: DANE_COUNTY_WI output: - wi_cts: - - 2255 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 + wi_cts: [2_255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] diff --git a/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_ssp.yaml b/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_ssp.yaml index 7cb9990e21a..95729b90cba 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_ssp.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_ssp.yaml @@ -8,6 +8,7 @@ 2026: 65 output: wi_ssp: 83.78 + - name: Case 2, April retains old rate. period: 2026-04 absolute_error_margin: 0.01 @@ -18,6 +19,7 @@ 2026: 65 output: wi_ssp: 83.78 + - name: Case 3, May new rate. period: 2026-05 absolute_error_margin: 0.01 @@ -28,6 +30,7 @@ 2026: 65 output: wi_ssp: 92.16 + - name: Case 4, December new rate. period: 2026-12 absolute_error_margin: 0.01 @@ -38,6 +41,7 @@ 2026: 65 output: wi_ssp: 92.16 + - name: Case 5, annual amount spans rate change. period: 2026 absolute_error_margin: 0.01 @@ -47,7 +51,8 @@ age: 2026: 65 output: - wi_ssp: 1072.4 + wi_ssp: 1_072.4 + - name: Case 6, other household retains flat individual rate. period: 2026-05 absolute_error_margin: 0.01 @@ -61,6 +66,7 @@ ssi_others_pay_all_meals: true output: wi_ssp: 92.16 + - name: Case 7, small SSI payment gets full state amount. period: 2026-05 absolute_error_margin: 0.01 @@ -70,9 +76,10 @@ age: 2026: 65 social_security_retirement: - 2026: 12156 + 2026: 12_156 output: wi_ssp: 92.16 + - name: Case 8, no federal payment no new state eligibility. period: 2026-05 absolute_error_margin: 0.01 @@ -82,9 +89,10 @@ age: 2026: 65 social_security_retirement: - 2026: 12168 + 2026: 12_168 output: wi_ssp: 0 + - name: Case 9, certified exceptional expense supplement before increase. period: 2026-04 absolute_error_margin: 0.01 @@ -96,6 +104,7 @@ wi_ssi_e_certified: true output: wi_ssp: 179.77 + - name: Case 10, certified exceptional expense supplement after increase. period: 2026-05 absolute_error_margin: 0.01 @@ -107,6 +116,7 @@ wi_ssi_e_certified: true output: wi_ssp: 197.75 + - name: Case 11, long term medical institution excluded. period: 2026-05 absolute_error_margin: 0.01 @@ -119,6 +129,7 @@ ssi_medicaid_pays_majority_of_care: true output: wi_ssp: 0 + - name: Case 12, authorized institutional continuation. period: 2026-05 absolute_error_margin: 0.01 @@ -132,6 +143,7 @@ wi_ssp_institutional_continuation: true output: wi_ssp: 92.16 + - name: Case 13, incarceration excludes payment. period: 2026-05 absolute_error_margin: 0.01 @@ -143,6 +155,7 @@ is_incarcerated: true output: wi_ssp: 0 + - name: Case 14, outside Wisconsin. period: 2026-05 absolute_error_margin: 0.01 @@ -153,6 +166,7 @@ 2026: 65 output: wi_ssp: 0 + - name: Case 15, excess resources. period: 2026-05 absolute_error_margin: 0.01 @@ -162,6 +176,6 @@ age: 2026: 65 ssi_countable_resources: - 2026: 2001 + 2026: 2_001 output: wi_ssp: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_ssp_countable_for_hud.yaml b/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_ssp_countable_for_hud.yaml index 5e211cde12e..a5b69481825 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_ssp_countable_for_hud.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_ssp_countable_for_hud.yaml @@ -13,7 +13,7 @@ is_disabled: true meets_ssi_disability_criteria: true is_household_head: true - pre_subsidy_rent: 12000 + pre_subsidy_rent: 12_000 wi_ssi_e_certified: true wi_ssi_e_for_home_care: true wi_ssi_e_caregiver_id: 2 @@ -24,49 +24,36 @@ is_household_head: false marital_units: unit1: - members: - - person1 + members: [person1] unit2: - members: - - person2 - tax_units: - unit1: - members: - - person1 - unit2: - members: - - person2 + members: [person2] families: family1: - members: - - person1 + members: [person1] family2: - members: - - person2 + members: [person2] + tax_units: + unit1: + members: [person1] + unit2: + members: [person2] spm_units: unit: - members: - - person1 - - person2 + members: [person1, person2] receives_housing_assistance: true households: home: - members: - - person1 - - person2 + members: [person1, person2] state_code: WI county_fips: '55079' bedrooms: 2 tenant_pays_utilities: false output: - wi_ssi_e: - - 1228.68 - - 0 - wi_ssp_countable_for_hud: - - 1072.4 - - 0 - hud_annual_income: 13000.4 - housing_assistance: 8264.88 + wi_ssi_e: [1_228.68, 0] + wi_ssp_countable_for_hud: [1_072.4, 0] + hud_annual_income: 13_000.4 + housing_assistance: 8_264.88 + - name: Case 2, default unverified home-care qualification keeps SSI-E countable. period: 2026 absolute_error_margin: 0.01 @@ -78,7 +65,7 @@ is_disabled: true meets_ssi_disability_criteria: true is_household_head: true - pre_subsidy_rent: 12000 + pre_subsidy_rent: 12_000 wi_ssi_e_certified: true wi_ssi_e_for_home_care: false wi_ssi_e_caregiver_id: 2 @@ -89,46 +76,35 @@ is_household_head: false marital_units: unit1: - members: - - person1 - unit2: - members: - - person2 - tax_units: - unit1: - members: - - person1 + members: [person1] unit2: - members: - - person2 + members: [person2] families: family1: - members: - - person1 + members: [person1] family2: - members: - - person2 + members: [person2] + tax_units: + unit1: + members: [person1] + unit2: + members: [person2] spm_units: unit: - members: - - person1 - - person2 + members: [person1, person2] receives_housing_assistance: true households: home: - members: - - person1 - - person2 + members: [person1, person2] state_code: WI county_fips: '55079' bedrooms: 2 tenant_pays_utilities: false output: - wi_ssp_countable_for_hud: - - 2301.08 - - 0 - hud_annual_income: 14229.08 - housing_assistance: 7896.28 + wi_ssp_countable_for_hud: [2_301.08, 0] + hud_annual_income: 14_229.08 + housing_assistance: 7_896.28 + - name: Case 3, unidentified caregiver keeps SSI-E countable. period: 2026 absolute_error_margin: 0.01 @@ -140,7 +116,7 @@ is_disabled: true meets_ssi_disability_criteria: true is_household_head: true - pre_subsidy_rent: 12000 + pre_subsidy_rent: 12_000 wi_ssi_e_certified: true wi_ssi_e_for_home_care: true wi_ssi_e_caregiver_id: 0 @@ -151,44 +127,33 @@ is_household_head: false marital_units: unit1: - members: - - person1 - unit2: - members: - - person2 - tax_units: - unit1: - members: - - person1 + members: [person1] unit2: - members: - - person2 + members: [person2] families: family1: - members: - - person1 + members: [person1] family2: - members: - - person2 + members: [person2] + tax_units: + unit1: + members: [person1] + unit2: + members: [person2] spm_units: unit: - members: - - person1 - - person2 + members: [person1, person2] receives_housing_assistance: true households: home: - members: - - person1 - - person2 + members: [person1, person2] state_code: WI county_fips: '55079' bedrooms: 2 tenant_pays_utilities: false output: - wi_ssp_countable_for_hud: - - 2301.08 - - 0 + wi_ssp_countable_for_hud: [2_301.08, 0] + - name: Case 4, a recipient cannot name themselves as the caregiver. period: 2026 absolute_error_margin: 0.01 @@ -200,7 +165,7 @@ is_disabled: true meets_ssi_disability_criteria: true is_household_head: true - pre_subsidy_rent: 12000 + pre_subsidy_rent: 12_000 wi_ssi_e_certified: true wi_ssi_e_for_home_care: true wi_ssi_e_caregiver_id: 1 @@ -211,44 +176,33 @@ is_household_head: false marital_units: unit1: - members: - - person1 + members: [person1] unit2: - members: - - person2 - tax_units: - unit1: - members: - - person1 - unit2: - members: - - person2 + members: [person2] families: family1: - members: - - person1 + members: [person1] family2: - members: - - person2 + members: [person2] + tax_units: + unit1: + members: [person1] + unit2: + members: [person2] spm_units: unit: - members: - - person1 - - person2 + members: [person1, person2] receives_housing_assistance: true households: home: - members: - - person1 - - person2 + members: [person1, person2] state_code: WI county_fips: '55079' bedrooms: 2 tenant_pays_utilities: false output: - wi_ssp_countable_for_hud: - - 2301.08 - - 0 + wi_ssp_countable_for_hud: [2_301.08, 0] + - name: Case 5, age-only eligibility does not establish the HUD disability exclusion. period: 2026 absolute_error_margin: 0.01 @@ -260,7 +214,7 @@ is_disabled: false meets_ssi_disability_criteria: false is_household_head: true - pre_subsidy_rent: 12000 + pre_subsidy_rent: 12_000 wi_ssi_e_certified: true wi_ssi_e_for_home_care: true wi_ssi_e_caregiver_id: 2 @@ -271,44 +225,33 @@ is_household_head: false marital_units: unit1: - members: - - person1 - unit2: - members: - - person2 - tax_units: - unit1: - members: - - person1 + members: [person1] unit2: - members: - - person2 + members: [person2] families: family1: - members: - - person1 + members: [person1] family2: - members: - - person2 + members: [person2] + tax_units: + unit1: + members: [person1] + unit2: + members: [person2] spm_units: unit: - members: - - person1 - - person2 + members: [person1, person2] receives_housing_assistance: true households: home: - members: - - person1 - - person2 + members: [person1, person2] state_code: WI county_fips: '55079' bedrooms: 2 tenant_pays_utilities: false output: - wi_ssp_countable_for_hud: - - 2301.08 - - 0 + wi_ssp_countable_for_hud: [2_301.08, 0] + - name: Case 6, caregiver in another SPM unit does not qualify despite shared address. period: 2026 absolute_error_margin: 0.01 @@ -320,7 +263,7 @@ is_disabled: true meets_ssi_disability_criteria: true is_household_head: true - pre_subsidy_rent: 12000 + pre_subsidy_rent: 12_000 wi_ssi_e_certified: true wi_ssi_e_for_home_care: true wi_ssi_e_caregiver_id: 2 @@ -331,46 +274,35 @@ is_household_head: false marital_units: unit1: - members: - - person1 - unit2: - members: - - person2 - tax_units: - unit1: - members: - - person1 + members: [person1] unit2: - members: - - person2 + members: [person2] families: family1: - members: - - person1 + members: [person1] family2: - members: - - person2 + members: [person2] + tax_units: + unit1: + members: [person1] + unit2: + members: [person2] spm_units: unit1: - members: - - person1 + members: [person1] receives_housing_assistance: true unit2: - members: - - person2 + members: [person2] households: home: - members: - - person1 - - person2 + members: [person1, person2] state_code: WI county_fips: '55079' bedrooms: 2 tenant_pays_utilities: false output: - wi_ssp_countable_for_hud: - - 2301.08 - - 0 + wi_ssp_countable_for_hud: [2_301.08, 0] + - name: Case 7, caregiver outside the assisted household does not qualify. period: 2026 absolute_error_margin: 0.01 @@ -382,7 +314,7 @@ is_disabled: true meets_ssi_disability_criteria: true is_household_head: true - pre_subsidy_rent: 12000 + pre_subsidy_rent: 12_000 wi_ssi_e_certified: true wi_ssi_e_for_home_care: true wi_ssi_e_caregiver_id: 2 @@ -393,48 +325,37 @@ is_household_head: false marital_units: unit1: - members: - - person1 + members: [person1] unit2: - members: - - person2 - tax_units: - unit1: - members: - - person1 - unit2: - members: - - person2 + members: [person2] families: family1: - members: - - person1 + members: [person1] family2: - members: - - person2 + members: [person2] + tax_units: + unit1: + members: [person1] + unit2: + members: [person2] spm_units: unit: - members: - - person1 - - person2 + members: [person1, person2] receives_housing_assistance: true households: home: - members: - - person1 + members: [person1] state_code: WI county_fips: '55079' bedrooms: 2 tenant_pays_utilities: false other: - members: - - person2 + members: [person2] state_code: WI county_fips: '55079' output: - wi_ssp_countable_for_hud: - - 2301.08 - - 0 + wi_ssp_countable_for_hud: [2_301.08, 0] + - name: Case 8, a medical-facility month keeps continued SSI-E countable. period: 2026 absolute_error_margin: 0.01 @@ -446,7 +367,7 @@ is_disabled: true meets_ssi_disability_criteria: true is_household_head: true - pre_subsidy_rent: 12000 + pre_subsidy_rent: 12_000 wi_ssi_e_certified: true wi_ssi_e_for_home_care: true wi_ssi_e_caregiver_id: 2 @@ -463,51 +384,37 @@ is_household_head: false marital_units: unit1: - members: - - person1 - unit2: - members: - - person2 - tax_units: - unit1: - members: - - person1 + members: [person1] unit2: - members: - - person2 + members: [person2] families: family1: - members: - - person1 + members: [person1] family2: - members: - - person2 + members: [person2] + tax_units: + unit1: + members: [person1] + unit2: + members: [person2] spm_units: unit: - members: - - person1 - - person2 + members: [person1, person2] receives_housing_assistance: true households: home: - members: - - person1 - - person2 + members: [person1, person2] state_code: WI county_fips: '55079' bedrooms: 2 tenant_pays_utilities: false output: wi_ssi_e: - 2026-05: - - 105.59 - - 0 + 2026-05: [105.59, 0] wi_ssp_countable_for_hud: - 2026-05: - - 197.75 - - 0 -- name: Case 9, an annual caregiver identifier preserves the exclusion across the May rate - change. + 2026-05: [197.75, 0] + +- name: Case 9, an annual caregiver identifier preserves the exclusion across the May rate change. period: 2026 absolute_error_margin: 0.01 input: @@ -518,7 +425,7 @@ is_disabled: true meets_ssi_disability_criteria: true is_household_head: true - pre_subsidy_rent: 12000 + pre_subsidy_rent: 12_000 wi_ssi_e_certified: true wi_ssi_e_for_home_care: true wi_ssi_e_caregiver_id: 2 @@ -529,48 +436,35 @@ is_household_head: false marital_units: unit1: - members: - - person1 - unit2: - members: - - person2 - tax_units: - unit1: - members: - - person1 + members: [person1] unit2: - members: - - person2 + members: [person2] families: family1: - members: - - person1 + members: [person1] family2: - members: - - person2 + members: [person2] + tax_units: + unit1: + members: [person1] + unit2: + members: [person2] spm_units: unit: - members: - - person1 - - person2 + members: [person1, person2] receives_housing_assistance: true households: home: - members: - - person1 - - person2 + members: [person1, person2] state_code: WI county_fips: '55079' bedrooms: 2 tenant_pays_utilities: false output: wi_ssp_countable_for_hud: - 2026-04: - - 83.78 - - 0 - 2026-05: - - 92.16 - - 0 + 2026-04: [83.78, 0] + 2026-05: [92.16, 0] + - name: Case 10, home-care inputs cannot exclude regular SSI when no SSI-E is awarded. period: 2026 absolute_error_margin: 0.01 @@ -582,7 +476,7 @@ is_disabled: true meets_ssi_disability_criteria: true is_household_head: true - pre_subsidy_rent: 12000 + pre_subsidy_rent: 12_000 wi_ssi_e_certified: false wi_ssi_e_for_home_care: true wi_ssi_e_caregiver_id: 2 @@ -593,47 +487,34 @@ is_household_head: false marital_units: unit1: - members: - - person1 - unit2: - members: - - person2 - tax_units: - unit1: - members: - - person1 + members: [person1] unit2: - members: - - person2 + members: [person2] families: family1: - members: - - person1 + members: [person1] family2: - members: - - person2 + members: [person2] + tax_units: + unit1: + members: [person1] + unit2: + members: [person2] spm_units: unit: - members: - - person1 - - person2 + members: [person1, person2] receives_housing_assistance: true households: home: - members: - - person1 - - person2 + members: [person1, person2] state_code: WI county_fips: '55079' bedrooms: 2 tenant_pays_utilities: false output: - wi_ssi_e: - - 0 - - 0 - wi_ssp_countable_for_hud: - - 1072.4 - - 0 + wi_ssi_e: [0, 0] + wi_ssp_countable_for_hud: [1_072.4, 0] + - name: Case 11, duplicate caregiver identifiers cannot establish a unique caregiver. period: 2026 absolute_error_margin: 0.01 @@ -645,7 +526,7 @@ is_disabled: true meets_ssi_disability_criteria: true is_household_head: true - pre_subsidy_rent: 12000 + pre_subsidy_rent: 12_000 wi_ssi_e_certified: true wi_ssi_e_for_home_care: true wi_ssi_e_caregiver_id: 2 @@ -660,56 +541,40 @@ is_household_head: false marital_units: unit1: - members: - - person1 - unit2: - members: - - person2 - third: - members: - - person3 - tax_units: - unit1: - members: - - person1 + members: [person1] unit2: - members: - - person2 + members: [person2] third: - members: - - person3 + members: [person3] families: family1: - members: - - person1 + members: [person1] family2: - members: - - person2 + members: [person2] + third: + members: [person3] + tax_units: + unit1: + members: [person1] + unit2: + members: [person2] third: - members: - - person3 + members: [person3] spm_units: unit: - members: - - person1 - - person2 - - person3 + members: [person1, person2, person3] receives_housing_assistance: true households: home: - members: - - person1 - - person2 - - person3 + members: [person1, person2, person3] state_code: WI county_fips: '55079' bedrooms: 2 tenant_pays_utilities: false output: - wi_ssp_countable_for_hud: - - 2301.08 - - 0 - - 0 + wi_ssp_countable_for_hud: [2_301.08, 0, 0 + +] - name: Case 12, qualifying SSI-E exclusion leaves the derived caretaker supplement countable. period: 2026 @@ -722,7 +587,7 @@ is_disabled: true meets_ssi_disability_criteria: true is_household_head: true - pre_subsidy_rent: 12000 + pre_subsidy_rent: 12_000 wi_ssi_e_certified: true wi_ssi_e_for_home_care: true wi_ssi_e_caregiver_id: 2 @@ -738,59 +603,35 @@ is_household_head: false marital_units: unit1: - members: - - person1 + members: [person1] unit2: - members: - - person2 + members: [person2] child: - members: - - person3 + members: [person3] + families: + family1: + members: [person1, person3] + family2: + members: [person2] tax_units: unit1: - members: - - person1 + members: [person1] unit2: - members: - - person2 + members: [person2] child: - members: - - person3 - families: - family1: - members: - - person1 - - person3 - family2: - members: - - person2 + members: [person3] spm_units: unit: - members: - - person1 - - person2 - - person3 + members: [person1, person2, person3] receives_housing_assistance: true households: home: - members: - - person1 - - person2 - - person3 + members: [person1, person2, person3] state_code: WI county_fips: '55079' bedrooms: 2 tenant_pays_utilities: false output: - wi_cts: - - 3300 - - 0 - - 0 - wi_ssp_countable_for_hud: - - 4372.4 - - 0 - - 0 - hud_unearned_income: - - 16300.4 - - 0 - - 0 + wi_cts: [3_300, 0, 0] + wi_ssp_countable_for_hud: [4_372.4, 0, 0] + hud_unearned_income: [16_300.4, 0, 0] From 139139fbe9e93cd63bd7d47677f455903a92e856 Mon Sep 17 00:00:00 2001 From: Ziming Date: Tue, 13 Oct 2026 03:16:19 -0400 Subject: [PATCH 3/4] Fix issues from review: Wisconsin SSP spouse rate, HUD exclusion and Caretaker Supplement groups - Pay the one-eligible-spouse rate only with an SSI-ineligible spouse - HUD SSI-E exclusion uses the HUD disability test (plus blindness); one boolean caregiver input - Receipt gates use (ssi > 0) | receives_ssi in SSP, CTS and W-2; drop the state-only SSI input - CTS: one group per SSI parent, co-parent filing unit fix, paroled children eligible, no marital-unit proxy - Remove the redundant large-group input; SSI-E not payable in household of another - Registry placement and comments, SNAP title, HUD metadata revert, programs.yaml note, references - Tests for each fix; realistic households Co-Authored-By: Claude Opus 5.5 --- .../household/household_state_benefits.yaml | 12 +- .../hud/annual_income/sources/unearned.yaml | 8 +- .../gov/states/wi/dhs/ssp/amount/couple.yaml | 6 +- .../states/wi/dhs/ssp/amount/individual.yaml | 6 +- .../amount/ineligible_spouse_independent.yaml | 6 +- .../ineligible_spouse_other_household.yaml | 6 +- .../wi/dhs/ssp/cts/additional_child.yaml | 6 +- .../wi/dhs/ssp/cts/area_i_counties.yaml | 4 +- .../wi/dhs/ssp/cts/care_other_limit.yaml | 4 +- .../states/wi/dhs/ssp/cts/care_young_age.yaml | 4 +- .../wi/dhs/ssp/cts/care_young_limit.yaml | 4 +- .../states/wi/dhs/ssp/cts/earned_flat.yaml | 4 +- .../wi/dhs/ssp/cts/earned_fraction.yaml | 4 +- .../cts/eligible_immigration_statuses.yaml | 21 + .../states/wi/dhs/ssp/cts/first_child.yaml | 6 +- .../states/wi/dhs/ssp/cts/gross/area_1.yaml | 4 +- .../states/wi/dhs/ssp/cts/gross/area_2.yaml | 4 +- .../wi/dhs/ssp/cts/gross_additional.yaml | 4 +- .../wi/dhs/ssp/cts/gross_pregnant/area_1.yaml | 6 +- .../wi/dhs/ssp/cts/gross_pregnant/area_2.yaml | 6 +- .../wi/dhs/ssp/cts/maximum_table_size.yaml | 10 - .../wi/dhs/ssp/cts/minor_age_limit.yaml | 4 +- .../gov/states/wi/dhs/ssp/cts/net/area_1.yaml | 4 +- .../gov/states/wi/dhs/ssp/cts/net/area_2.yaml | 4 +- ...ancy_net.yaml => pregnancy_allowance.yaml} | 8 +- .../states/wi/dhs/ssp/cts/resource_limit.yaml | 4 +- .../wi/dhs/ssp/cts/student_age_limit.yaml | 4 +- .../wi/dhs/ssp/cts/student_hours_limit.yaml | 4 +- .../states/wi/dhs/ssp/cts/work_expense.yaml | 4 +- .../dhs/ssp/exceptional_expense/couple.yaml | 6 +- .../ssp/exceptional_expense/individual.yaml | 6 +- .../usda/snap/income/sources/unearned.yaml | 10 +- policyengine_us/programs.yaml | 18 +- .../wi/dcf/works/wi_works_eligible.yaml | 71 ++ .../gov/states/wi/dhs/ssp/integration.yaml | 70 ++ .../gov/states/wi/dhs/ssp/wi_cts.yaml | 830 ++++++++++++++++-- .../gov/states/wi/dhs/ssp/wi_ssp.yaml | 52 +- .../wi/dhs/ssp/wi_ssp_countable_for_hud.yaml | 124 ++- .../works/eligibility/wi_works_eligible.py | 36 +- .../gov/states/wi/dhs/ssp/_wi_cts.py | 173 ++-- .../variables/gov/states/wi/dhs/ssp/wi_cts.py | 49 +- .../ssp/wi_cts_additional_flat_disregard.py | 4 +- .../wi_cts_additional_fraction_disregard.py | 2 +- .../gov/states/wi/dhs/ssp/wi_cts_area_i.py | 2 +- ...ts_buening_large_group_net_income_limit.py | 11 - .../wi/dhs/ssp/wi_cts_buening_member.py | 5 +- .../wi/dhs/ssp/wi_cts_caretaker_children.py | 41 + .../wi/dhs/ssp/wi_cts_child_eligible.py | 28 +- .../wi/dhs/ssp/wi_cts_child_excluded.py | 3 +- .../wi/dhs/ssp/wi_cts_countable_resources.py | 5 +- .../ssp/wi_cts_dependent_care_deduction.py | 2 +- .../wi/dhs/ssp/wi_cts_dependent_child.py | 11 +- .../wi/dhs/ssp/wi_cts_graduates_before_19.py | 2 +- .../states/wi/dhs/ssp/wi_cts_gross_income.py | 3 +- .../wi_cts_large_group_net_income_limit.py | 4 +- .../states/wi/dhs/ssp/wi_cts_net_income.py | 2 +- .../ssp/wi_cts_nonfinancially_ineligible.py | 3 +- .../wi/dhs/ssp/wi_cts_part_time_student.py | 2 +- .../gov/states/wi/dhs/ssp/wi_cts_payee.py | 25 - .../wi/dhs/ssp/wi_cts_received_recently.py | 2 +- .../states/wi/dhs/ssp/wi_cts_sfu_member.py | 9 +- .../ssp/wi_cts_state_only_ssi_recipient.py | 9 - .../gov/states/wi/dhs/ssp/wi_ssi_e.py | 21 +- .../wi/dhs/ssp/wi_ssi_e_caregiver_id.py | 18 - .../states/wi/dhs/ssp/wi_ssi_e_certified.py | 3 +- .../wi/dhs/ssp/wi_ssi_e_for_home_care.py | 12 +- .../variables/gov/states/wi/dhs/ssp/wi_ssp.py | 5 +- .../wi/dhs/ssp/wi_ssp_countable_for_hud.py | 38 +- .../gov/states/wi/dhs/ssp/wi_ssp_eligible.py | 12 +- .../gov/states/wi/dhs/ssp/wi_ssp_regular.py | 15 +- .../income/spm_unit/spm_unit_benefits.py | 2 +- 71 files changed, 1453 insertions(+), 464 deletions(-) create mode 100644 policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/eligible_immigration_statuses.yaml delete mode 100644 policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/maximum_table_size.yaml rename policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/{pregnancy_net.yaml => pregnancy_allowance.yaml} (53%) delete mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_buening_large_group_net_income_limit.py create mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_caretaker_children.py delete mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_payee.py delete mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_state_only_ssi_recipient.py delete mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssi_e_caregiver_id.py diff --git a/policyengine_us/parameters/gov/household/household_state_benefits.yaml b/policyengine_us/parameters/gov/household/household_state_benefits.yaml index d5acb9b2c45..a784dd18915 100644 --- a/policyengine_us/parameters/gov/household/household_state_benefits.yaml +++ b/policyengine_us/parameters/gov/household/household_state_benefits.yaml @@ -73,12 +73,13 @@ values: - tx_ssi_state_supplement # Virginia benefits - va_child_care_subsidies + # Wisconsin benefits + - wi_ssp # Massachusetts benefits - ma_eaedc # DC benefits - dc_ossp # Kansas benefits - - wi_ssp - ks_sspp # Hawaii benefits - hi_oss @@ -168,6 +169,8 @@ values: - va_child_care_subsidies # West Virginia benefits - wv_child_care_subsidies + # Wisconsin benefits + - wi_ssp # North Carolina benefits - nc_child_care_subsidies # South Carolina benefits @@ -177,7 +180,6 @@ values: # DC benefits - dc_ossp # Kansas benefits - - wi_ssp - ks_sspp # Hawaii benefits - hi_oss @@ -271,6 +273,8 @@ values: - va_child_care_subsidies # West Virginia benefits - wv_child_care_subsidies + # Wisconsin benefits + - wi_ssp # North Carolina benefits - nc_child_care_subsidies # South Carolina benefits @@ -281,7 +285,6 @@ values: - dc_ossp - dc_child_care_subsidies # Kansas benefits - - wi_ssp - ks_sspp # Hawaii benefits - hi_oss @@ -375,6 +378,8 @@ values: - va_child_care_subsidies # West Virginia benefits - wv_child_care_subsidies + # Wisconsin benefits + - wi_ssp # North Carolina benefits - nc_child_care_subsidies # South Carolina benefits @@ -385,7 +390,6 @@ values: - dc_ossp - dc_child_care_subsidies # Kansas benefits - - wi_ssp - ks_sspp # Hawaii benefits - hi_oss 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 f695d420862..166c0a1c04c 100644 --- a/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml @@ -37,11 +37,5 @@ metadata: period: year label: HUD unearned income sources reference: - - title: 24 CFR § 5.609(a)(1), (a)(2), (b)(6), (b)(19) + - title: 24 CFR § 5.609(a)(1), (a)(2) href: https://www.law.cornell.edu/cfr/text/24/5.609 - - title: Wisconsin SSI-E Handbook, 4.1.1 Subsidized Housing - href: https://www.dhs.wisconsin.gov/publications/p20679-26-01.pdf#page=24 - - title: HUD Notice PIH 2023-27, Attachment G.11, Income Received for the Care of Family Members with Disabilities - href: https://www.hud.gov/sites/dfiles/OCHCO/documents/2023-27pihn.pdf#page=81 - - title: "HUD Notice PIH 2024-38, IV.B.1, Mandatory Deductions and Exclusions #page 3-4" - href: https://www.hud.gov/sites/dfiles/OCHCO/documents/2024-38pihn.pdf#page=3 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/couple.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/couple.yaml index d5c78030d75..4e4fbe96728 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/couple.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/couple.yaml @@ -1,4 +1,4 @@ -description: Wisconsin provides this monthly amount couple payment under its State SSI Supplement program. +description: Wisconsin provides this amount as the payment per couple under the State Supplementary Payment program. values: 2026-01-01: 132.05 2026-05-01: 145.26 @@ -6,7 +6,7 @@ values: metadata: unit: currency-USD period: month - label: Wisconsin SSI amount couple + label: Wisconsin SSP payment amount per couple reference: - - title: Wisconsin DMS Operations Memo 26-12, SSI state payment increase, table page 2 + - title: Wisconsin DMS Operations Memo 26-12, Increase to SSI State Supplementary Payments href: https://www.dhs.wisconsin.gov/dms/memos/ops/dms-ops-2026-12.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/individual.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/individual.yaml index 2caf0989628..ba8e1a65333 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/individual.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/individual.yaml @@ -1,4 +1,4 @@ -description: Wisconsin provides this monthly amount individual payment under its State SSI Supplement program. +description: Wisconsin provides this amount as the individual payment under the State Supplementary Payment program. values: 2026-01-01: 83.78 2026-05-01: 92.16 @@ -6,7 +6,7 @@ values: metadata: unit: currency-USD period: month - label: Wisconsin SSI amount individual + label: Wisconsin SSP individual payment amount reference: - - title: Wisconsin DMS Operations Memo 26-12, SSI state payment increase, table page 2 + - title: Wisconsin DMS Operations Memo 26-12, Increase to SSI State Supplementary Payments href: https://www.dhs.wisconsin.gov/dms/memos/ops/dms-ops-2026-12.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/ineligible_spouse_independent.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/ineligible_spouse_independent.yaml index 03d598f2b6c..aff674c9ae4 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/ineligible_spouse_independent.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/ineligible_spouse_independent.yaml @@ -1,4 +1,4 @@ -description: Wisconsin provides this monthly amount ineligible spouse independent payment under its State SSI Supplement program. +description: Wisconsin provides this amount to a recipient living independently with an ineligible spouse under the State Supplementary Payment program. values: 2026-01-01: 130.43 2026-05-01: 143.47 @@ -6,7 +6,7 @@ values: metadata: unit: currency-USD period: month - label: Wisconsin SSI amount ineligible spouse independent + label: Wisconsin SSP payment amount with an ineligible spouse living independently reference: - - title: Wisconsin DMS Operations Memo 26-12, SSI state payment increase, table page 2 + - title: Wisconsin DMS Operations Memo 26-12, Increase to SSI State Supplementary Payments href: https://www.dhs.wisconsin.gov/dms/memos/ops/dms-ops-2026-12.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/ineligible_spouse_other_household.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/ineligible_spouse_other_household.yaml index 1d8dd1b2128..1605e5e5d6a 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/ineligible_spouse_other_household.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/amount/ineligible_spouse_other_household.yaml @@ -1,4 +1,4 @@ -description: Wisconsin provides this monthly amount ineligible spouse other household payment under its State SSI Supplement program. +description: Wisconsin provides this amount to a recipient with an ineligible spouse in another household under the State Supplementary Payment program. values: 2026-01-01: 135.05 2026-05-01: 148.56 @@ -6,7 +6,7 @@ values: metadata: unit: currency-USD period: month - label: Wisconsin SSI amount ineligible spouse other household + label: Wisconsin SSP payment amount with an ineligible spouse in another person's household reference: - - title: Wisconsin DMS Operations Memo 26-12, SSI state payment increase, table page 2 + - title: Wisconsin DMS Operations Memo 26-12, Increase to SSI State Supplementary Payments href: https://www.dhs.wisconsin.gov/dms/memos/ops/dms-ops-2026-12.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/additional_child.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/additional_child.yaml index 3bb0c76085d..48b649767d8 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/additional_child.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/additional_child.yaml @@ -7,5 +7,7 @@ metadata: period: month label: Wisconsin CTS additional eligible child benefit reference: - - title: Caretaker Supplement Handbook, sections 3 and 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + - title: Wis. Stat. 49.775(4) + href: https://docs.legis.wisconsin.gov/document/statutes/49.775 + - title: Caretaker Supplement Handbook 5.2.6 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=65 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/area_i_counties.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/area_i_counties.yaml index 6a4c53ce716..3ab8dd53f54 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/area_i_counties.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/area_i_counties.yaml @@ -26,5 +26,5 @@ metadata: unit: list label: Wisconsin CTS Area I counties reference: - - title: Caretaker Supplement Handbook, 5.2.3 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + - title: Caretaker Supplement Handbook 5.2.3 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=63 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_other_limit.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_other_limit.yaml index 3e36f6f471a..c8bd26e176b 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_other_limit.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_other_limit.yaml @@ -7,5 +7,5 @@ metadata: period: month label: Wisconsin CTS older child care deduction limit reference: - - title: Caretaker Supplement Handbook, sections 3 and 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + - title: Caretaker Supplement Handbook 3.2.1.2.3 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=31 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_young_age.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_young_age.yaml index 6e196465596..460b6063516 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_young_age.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_young_age.yaml @@ -6,5 +6,5 @@ metadata: unit: year label: Wisconsin CTS young child care age limit reference: - - title: Caretaker Supplement Handbook, sections 3 and 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + - title: Caretaker Supplement Handbook 3.2.1.2.3 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=31 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_young_limit.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_young_limit.yaml index 5a7bf8af2d8..4e89dfb7562 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_young_limit.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_young_limit.yaml @@ -7,5 +7,5 @@ metadata: period: month label: Wisconsin CTS young child care deduction limit reference: - - title: Caretaker Supplement Handbook, sections 3 and 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + - title: Caretaker Supplement Handbook 3.2.1.2.3 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=31 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/earned_flat.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/earned_flat.yaml index a2fa961bd8f..1dde618c3dc 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/earned_flat.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/earned_flat.yaml @@ -7,5 +7,5 @@ metadata: period: month label: Wisconsin CTS additional flat earned income disregard reference: - - title: Caretaker Supplement Handbook, sections 3 and 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + - title: Caretaker Supplement Handbook 3.2.1.2.3 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=31 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/earned_fraction.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/earned_fraction.yaml index 85aff23aadc..adfad42c710 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/earned_fraction.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/earned_fraction.yaml @@ -6,5 +6,5 @@ metadata: unit: /1 label: Wisconsin CTS additional earned income disregard fraction reference: - - title: Caretaker Supplement Handbook, sections 3 and 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + - title: Caretaker Supplement Handbook 3.2.1.2.3 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=31 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/eligible_immigration_statuses.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/eligible_immigration_statuses.yaml new file mode 100644 index 00000000000..4aee497a995 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/eligible_immigration_statuses.yaml @@ -0,0 +1,21 @@ +description: Wisconsin limits eligibility to these immigration statuses under the Caretaker Supplement program. +values: + # PAROLED_ONE_YEAR is parole under 8 USC 1182(d)(5), one of the lawful + # presence grounds that Handbook 3.1.4 item 2 lists. + 2026-01-01: + - CITIZEN + - LEGAL_PERMANENT_RESIDENT + - REFUGEE + - ASYLEE + - CUBAN_HAITIAN_ENTRANT + - DEPORTATION_WITHHELD + - CONDITIONAL_ENTRANT + - PAROLED_ONE_YEAR + +metadata: + unit: list + period: year + label: Wisconsin CTS eligible immigration statuses + reference: + - title: "Caretaker Supplement Handbook 3.1.4 #page 19-20" + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=19 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/first_child.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/first_child.yaml index 41493250902..e911ba5c67b 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/first_child.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/first_child.yaml @@ -7,5 +7,7 @@ metadata: period: month label: Wisconsin CTS first eligible child benefit reference: - - title: Caretaker Supplement Handbook, sections 3 and 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + - title: Wis. Stat. 49.775(4) + href: https://docs.legis.wisconsin.gov/document/statutes/49.775 + - title: Caretaker Supplement Handbook 5.2.6 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=65 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross/area_1.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross/area_1.yaml index 0963c5a7a94..f573837acd8 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross/area_1.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross/area_1.yaml @@ -8,8 +8,8 @@ metadata: threshold_unit: person amount_unit: currency-USD reference: - - title: Caretaker Supplement Handbook, 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + - title: Caretaker Supplement Handbook 5.2.1 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=62 brackets: - threshold: diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross/area_2.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross/area_2.yaml index 57229a9f298..0fe2cd2c100 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross/area_2.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross/area_2.yaml @@ -8,8 +8,8 @@ metadata: threshold_unit: person amount_unit: currency-USD reference: - - title: Caretaker Supplement Handbook, 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + - title: Caretaker Supplement Handbook 5.2.1 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=62 brackets: - threshold: diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_additional.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_additional.yaml index 7785f1f8c09..bd092ac6a37 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_additional.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_additional.yaml @@ -7,5 +7,5 @@ metadata: period: month label: Wisconsin CTS gross income limit increase beyond the table reference: - - title: Caretaker Supplement Handbook, sections 3 and 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + - title: "Caretaker Supplement Handbook 5.2.1 and 5.2.2 #page 62-63" + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=62 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_pregnant/area_1.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_pregnant/area_1.yaml index e14acf03099..a846c2cc1bc 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_pregnant/area_1.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_pregnant/area_1.yaml @@ -3,13 +3,13 @@ description: Wisconsin sets these Caretaker Supplement gross pregnant income lim metadata: unit: currency-USD period: month - label: Wisconsin CTS Area 1 gross_pregnant limits + label: Wisconsin CTS Area 1 gross income limits with pregnancy allowance type: single_amount threshold_unit: person amount_unit: currency-USD reference: - - title: Caretaker Supplement Handbook, 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + - title: "Caretaker Supplement Handbook 5.2.2 #page 62-63" + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=62 brackets: - threshold: diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_pregnant/area_2.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_pregnant/area_2.yaml index 6863ea9d48e..82e3b6ab60e 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_pregnant/area_2.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_pregnant/area_2.yaml @@ -3,13 +3,13 @@ description: Wisconsin sets these Caretaker Supplement gross pregnant income lim metadata: unit: currency-USD period: month - label: Wisconsin CTS Area 2 gross_pregnant limits + label: Wisconsin CTS Area 2 gross income limits with pregnancy allowance type: single_amount threshold_unit: person amount_unit: currency-USD reference: - - title: Caretaker Supplement Handbook, 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + - title: "Caretaker Supplement Handbook 5.2.2 #page 62-63" + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=62 brackets: - threshold: diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/maximum_table_size.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/maximum_table_size.yaml deleted file mode 100644 index 2396cadb75b..00000000000 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/maximum_table_size.yaml +++ /dev/null @@ -1,10 +0,0 @@ -description: Wisconsin publishes Caretaker Supplement income limits up to this group size. -values: - 2026-01-01: 12 - -metadata: - unit: person - label: Wisconsin CTS last published income table size - reference: - - title: Caretaker Supplement Handbook, 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/minor_age_limit.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/minor_age_limit.yaml index 0bd79ca7da9..d1caf37de54 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/minor_age_limit.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/minor_age_limit.yaml @@ -6,5 +6,5 @@ metadata: unit: year label: Wisconsin CTS minor age limit reference: - - title: Caretaker Supplement Handbook, sections 3 and 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + - title: Caretaker Supplement Handbook 3.1.10 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=21 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/net/area_1.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/net/area_1.yaml index 3346c1caad4..714dda299da 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/net/area_1.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/net/area_1.yaml @@ -8,8 +8,8 @@ metadata: threshold_unit: person amount_unit: currency-USD reference: - - title: Caretaker Supplement Handbook, 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + - title: Caretaker Supplement Handbook 5.2.4 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=64 brackets: - threshold: diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/net/area_2.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/net/area_2.yaml index 8362837133c..b084a885c69 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/net/area_2.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/net/area_2.yaml @@ -8,8 +8,8 @@ metadata: threshold_unit: person amount_unit: currency-USD reference: - - title: Caretaker Supplement Handbook, 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + - title: Caretaker Supplement Handbook 5.2.4 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=64 brackets: - threshold: diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/pregnancy_net.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/pregnancy_allowance.yaml similarity index 53% rename from policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/pregnancy_net.yaml rename to policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/pregnancy_allowance.yaml index 30aff77a040..e3a53eacdd7 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/pregnancy_net.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/pregnancy_allowance.yaml @@ -1,11 +1,11 @@ -description: Wisconsin uses this amount as its Caretaker Supplement net income limit increase per pregnancy. +description: Wisconsin uses this amount as its Caretaker Supplement income limit allowance for each pregnant woman. values: 2026-01-01: 71 metadata: unit: currency-USD period: month - label: Wisconsin CTS net income limit increase per pregnancy + label: Wisconsin CTS pregnancy allowance reference: - - title: Caretaker Supplement Handbook, sections 3 and 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + - title: "Caretaker Supplement Handbook 5.2.2 and 5.2.5 #page 63-65" + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=63 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/resource_limit.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/resource_limit.yaml index 68c45a2b688..7f21806708b 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/resource_limit.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/resource_limit.yaml @@ -6,5 +6,5 @@ metadata: unit: currency-USD label: Wisconsin CTS resource limit reference: - - title: Caretaker Supplement Handbook, sections 3 and 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + - title: Caretaker Supplement Handbook 3.2.2 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=31 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/student_age_limit.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/student_age_limit.yaml index 3e3a5e9ed97..e4564dd49f8 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/student_age_limit.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/student_age_limit.yaml @@ -6,5 +6,5 @@ metadata: unit: year label: Wisconsin CTS dependent student age limit reference: - - title: Caretaker Supplement Handbook, sections 3 and 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + - title: Caretaker Supplement Handbook 3.1.10 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=21 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/student_hours_limit.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/student_hours_limit.yaml index 35f68d54ff9..50b6970e7e8 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/student_hours_limit.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/student_hours_limit.yaml @@ -6,5 +6,5 @@ metadata: unit: hour label: Wisconsin CTS part-time student weekly work limit reference: - - title: Caretaker Supplement Handbook, sections 3 and 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + - title: Caretaker Supplement Handbook 3.2.1.2.3 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=31 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/work_expense.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/work_expense.yaml index eb25f78b461..124068421bb 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/work_expense.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/work_expense.yaml @@ -7,5 +7,5 @@ metadata: period: month label: Wisconsin CTS work expense deduction reference: - - title: Caretaker Supplement Handbook, sections 3 and 5.2 - href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf + - title: Caretaker Supplement Handbook 3.2.1.2.3 + href: https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=31 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/exceptional_expense/couple.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/exceptional_expense/couple.yaml index ad2353bf6b0..bbc7cd8637d 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/exceptional_expense/couple.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/exceptional_expense/couple.yaml @@ -1,4 +1,4 @@ -description: Wisconsin provides this monthly exceptional expense couple payment under its State SSI Supplement program. +description: Wisconsin provides this amount as the exceptional expense supplement per couple under the State Supplementary Payment program. values: 2026-01-01: 345.36 2026-05-01: 379.9 @@ -6,7 +6,7 @@ values: metadata: unit: currency-USD period: month - label: Wisconsin SSI exceptional expense couple + label: Wisconsin SSP exceptional expense supplement amount per couple reference: - - title: Wisconsin DMS Operations Memo 26-12, SSI state payment increase, table page 2 + - title: Wisconsin DMS Operations Memo 26-12, Increase to SSI State Supplementary Payments href: https://www.dhs.wisconsin.gov/dms/memos/ops/dms-ops-2026-12.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/exceptional_expense/individual.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/exceptional_expense/individual.yaml index 5817915afe7..45d7b4bd535 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/exceptional_expense/individual.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/exceptional_expense/individual.yaml @@ -1,4 +1,4 @@ -description: Wisconsin provides this monthly exceptional expense individual payment under its State SSI Supplement program. +description: Wisconsin provides this amount as the individual exceptional expense supplement under the State Supplementary Payment program. values: 2026-01-01: 95.99 2026-05-01: 105.59 @@ -6,7 +6,7 @@ values: metadata: unit: currency-USD period: month - label: Wisconsin SSI exceptional expense individual + label: Wisconsin SSP individual exceptional expense supplement amount reference: - - title: Wisconsin DMS Operations Memo 26-12, SSI state payment increase, table page 2 + - title: Wisconsin DMS Operations Memo 26-12, Increase to SSI State Supplementary Payments href: https://www.dhs.wisconsin.gov/dms/memos/ops/dms-ops-2026-12.pdf#page=2 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 9f869554ffd..56a6f2aafca 100644 --- a/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml @@ -16,9 +16,9 @@ values: # exempts public assistance vendor payments only for medical assistance, # child care, energy assistance, migrant emergency assistance, housing # authority housing assistance, and emergency or special assistance that - # is not the normal grant. Countable components below exclude medical - # reimbursements and state-specific exempt payments; ordinary cash and - # room-and-board supplements count even when paid to a provider. + # is not the normal grant. None of the supplements below fall in those + # categories, so each counts, whether paid to the recipient or to a + # facility on the recipient's behalf. - ak_ssp - al_ssp # co_oap has an annual definition period; policyengine-core's @@ -36,7 +36,6 @@ values: - hi_oss - id_aabd - in_ssp - - wi_ssp_countable_for_snap - ks_sspp - ky_ssp - la_oss @@ -51,6 +50,7 @@ values: - sc_ssi_state_supplement - tx_ssi_state_supplement - wa_ssp + - wi_ssp_countable_for_snap # Listed elsewhere: ca_state_supplement is an SPM unit variable with no # person-level counterpart. policyengine-core projects a group value onto # every member, so listing it here would count it once per person in the @@ -96,7 +96,7 @@ values: metadata: reference: - - title: 7 CFR 273.9(b)(2) and (c)(1), (5) + - title: 7 CFR 273.9(b)(2) and (c)(1) href: https://www.law.cornell.edu/cfr/text/7/273.9 - title: POMS SI 01401.001 General Information about State Supplementation href: https://secure.ssa.gov/poms.nsf/lnx/0501401001 diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 94bd93cbbc4..bf63d2cf0f5 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -1098,21 +1098,9 @@ programs: parameter_prefix: gov.states.wi.dhs.ssp verified_years: "2026" notes: >- - Models regular supplements and certified SSI-E payments, including - the May 2026 increase. Temporary institutional continuation and - county SSI-E certification require explicit inputs. HUD excludes SSI-E - only for certified home-care payments to a disabled person's caregiver - in the same assisted SPM unit; purpose and caregiver identity require - inputs. Within-year changes of caregiver require separate scenarios. - Grandfathered state-only SSI payments are not modeled. The continuing - April 2026 award receives a known 10 percent May increase, but the - references do not resolve how new SSI-E certification adds to or - offsets the protected award (Wis. Stat. 49.77(2)(a)3 and (3s)(d), - SSI Administration Handbook 3.1). Caretaker Supplement includes - target-child filing units, Buening tests and published income limits - through size 12; larger groups require agency-verified net limits. - Complex family composition, specialized assets, deductions and - procedural exclusions require explicit inputs. + Models 2026 regular State SSI Supplement, certified Exceptional + Expense (SSI-E) and Caretaker Supplement payments, including the May + 2026 increase. Grandfathered state-only SSI recipients are not modeled. - id: social_security name: Social Security diff --git a/policyengine_us/tests/policy/baseline/gov/states/wi/dcf/works/wi_works_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/wi/dcf/works/wi_works_eligible.yaml index f5ee55407c5..e697725808d 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/wi/dcf/works/wi_works_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/wi/dcf/works/wi_works_eligible.yaml @@ -156,3 +156,74 @@ state_code: WI output: wi_works_eligible: true + +- name: Case 10, Parent reported to receive SSI cannot receive W-2 even when modeled SSI is zero. + period: 2026-01 + input: + people: + person1: + age: 35 + ssi: 0 + receives_ssi: true + person_id: 1 + person2: + age: 8 + ssi: 0 + person_id: 2 + parent_1_id: 1 + marital_units: + parent: + members: [person1] + child: + members: [person2] + spm_units: + unit: + members: [person1, person2] + wi_works_income_eligible: true + wi_works_resources_eligible: true + households: + household: + members: [person1, person2] + state_code: WI + output: + # The only custodial parent receives SSI through receives_ssi. + wi_works_eligible: false + +- name: Case 11, Non-SSI grandparent is not a custodial parent of the SSI mother's child. + period: 2026-01 + input: + people: + person1: + age: 30 + ssi: 994 + person_id: 1 + parent_1_id: 3 + person2: + age: 8 + ssi: 0 + person_id: 2 + parent_1_id: 1 + person3: + age: 58 + ssi: 0 + person_id: 3 + marital_units: + parent: + members: [person1] + child: + members: [person2] + grandparent: + members: [person3] + spm_units: + unit: + members: [person1, person2, person3] + wi_works_income_eligible: true + wi_works_resources_eligible: true + households: + household: + members: [person1, person2, person3] + state_code: WI + output: + # The grandmother is the parent of an adult, not a custodial parent of + # a dependent child; the only custodial parent receives SSI. + wi_works_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/integration.yaml index ee3c47c1b9c..1ac871013c2 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/integration.yaml @@ -198,3 +198,73 @@ wi_ssi_e: 1_228.68 snap_unearned_income: 13_000.4 hud_unearned_income: 14_229.08 + +- name: Case 9, spouse in a Medicaid nursing home past 90 days leaves the other spouse on the individual rate. + period: 2026-05 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 70 + person2: + age: + 2026: 70 + # Medicaid-paid nursing home stay without an authorized continuation. + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + marital_units: + couple: + members: [person1, person2] + tax_units: + unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: + 2026: WI + output: + # One spouse in a medical facility: benefits are computed separately + # (20 CFR 416.414(b)(3)). + ssi_couple_computation_applies: [false, false] + # person1 gets the individual FBR, 994; person2 gets the facility rate, 30. + ssi: [994, 30] + # person2's facility stay excludes them from the state payment. + wi_ssp_eligible: [true, false] + # Both spouses are aged, so neither is an SSI-ineligible spouse; one + # state-eligible spouse without an ineligible spouse gets the individual + # rate, 92.16, not the 143.47 ineligible-spouse rate. + wi_ssp_regular: [92.16, 0] + wi_ssi_e: [0, 0] + wi_cts: [0, 0] + wi_ssp: [92.16, 0] + +- name: Case 10, SPM-unit benefits include SSI, the regular supplement and SSI-E. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: WI + age: 70 + wi_ssi_e_certified: true + # The household does not take up FoodShare, so the benefit total holds + # SSI and the state supplement only. + takes_up_snap_if_eligible: false + output: + # 994 * 12 = 11,928. + ssi: 11_928 + # 4 * 83.78 + 8 * 92.16 = 335.12 + 737.28 = 1,072.40. + wi_ssp_regular: 1_072.4 + # 4 * 95.99 + 8 * 105.59 = 383.96 + 844.72 = 1,228.68. + wi_ssi_e: 1_228.68 + # No children, so no Caretaker Supplement. + wi_cts: 0 + # 1,072.40 + 1,228.68 = 2,301.08. + wi_ssp: 2_301.08 + household_state_benefits: 2_301.08 + # FoodShare counts the regular supplement but not SSI-E: + # 11,928 + 1,072.40 = 13,000.40. + snap_unearned_income: 13_000.4 + snap: 0 + # 11,928 SSI + 2,301.08 state supplement = 14,229.08. + spm_unit_benefits: 14_229.08 diff --git a/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_cts.yaml b/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_cts.yaml index 34c029e1b82..f6066dc6475 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_cts.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_cts.yaml @@ -19,10 +19,10 @@ members: [person2] families: unit: - members: &id001 [person1, person2] + members: [person1, person2] households: home: - members: *id001 + members: [person1, person2] state_code: WI county: DANE_COUNTY_WI output: @@ -61,10 +61,10 @@ members: [person4] families: unit: - members: &id002 [person1, person2, person3, person4] + members: [person1, person2, person3, person4] households: home: - members: *id002 + members: [person1, person2, person3, person4] state_code: WI county: DANE_COUNTY_WI output: @@ -92,10 +92,10 @@ members: [person2] families: unit: - members: &id003 [person1, person2] + members: [person1, person2] households: home: - members: *id003 + members: [person1, person2] state_code: WI county: DANE_COUNTY_WI output: @@ -123,16 +123,16 @@ members: [person2] families: unit: - members: &id004 [person1, person2] + members: [person1, person2] households: home: - members: *id004 + members: [person1, person2] state_code: WI county: DANE_COUNTY_WI output: wi_cts: [0, 0] -- name: Case 5, Verified grandfathered state-only SSI parent can qualify. +- name: Case 5, Parent reported to receive SSI with modeled SSI of zero can qualify. period: 2026-01 absolute_error_margin: 0.01 input: @@ -140,9 +140,9 @@ person1: age: 40 person_id: 1 + is_disabled: true ssi: 0 - wi_ssp_regular: 0 - wi_cts_state_only_ssi_recipient: true + receives_ssi: true person2: age: 8 person_id: 2 @@ -154,13 +154,17 @@ members: [person2] families: unit: - members: &id005 [person1, person2] + members: [person1, person2] households: home: - members: *id005 + members: [person1, person2] state_code: WI county: DANE_COUNTY_WI output: + # receives_ssi makes the parent wi_ssp_eligible; alone in the + # marital unit, the parent gets the January 2026 individual rate of $83.78. + wi_ssp_regular: [83.78, 0] + # wi_ssp_regular > 0, so the parent is a CTS parent: one child = $275. wi_cts: [275, 0] - name: Case 6, Age 18 needs graduation certification. @@ -185,10 +189,10 @@ members: [person2] families: unit: - members: &id006 [person1, person2] + members: [person1, person2] households: home: - members: *id006 + members: [person1, person2] state_code: WI county: DANE_COUNTY_WI output: @@ -217,10 +221,10 @@ members: [person2] families: unit: - members: &id007 [person1, person2] + members: [person1, person2] households: home: - members: *id007 + members: [person1, person2] state_code: WI county: DANE_COUNTY_WI output: @@ -249,10 +253,10 @@ members: [person2] families: unit: - members: &id008 [person1, person2] + members: [person1, person2] households: home: - members: *id008 + members: [person1, person2] state_code: WI county: DANE_COUNTY_WI output: @@ -280,10 +284,10 @@ members: [person2] families: unit: - members: &id009 [person1, person2] + members: [person1, person2] households: home: - members: *id009 + members: [person1, person2] state_code: WI county: DANE_COUNTY_WI output: @@ -311,10 +315,10 @@ members: [person2] families: unit: - members: &id010 [person1, person2] + members: [person1, person2] households: home: - members: *id010 + members: [person1, person2] state_code: WI county: DANE_COUNTY_WI output: @@ -342,16 +346,16 @@ members: [person2] families: unit: - members: &id011 [person1, person2] + members: [person1, person2] households: home: - members: *id011 + members: [person1, person2] state_code: WI county: DANE_COUNTY_WI output: wi_cts: [0, 0] -- name: Case 12, Same income exceeds Area II net limit. +- name: Case 12, Income between the Area II and Area I net limits fails in Area II. period: 2026-01 absolute_error_margin: 0.01 input: @@ -373,10 +377,10 @@ members: [person2] families: unit: - members: &id012 [person1, person2] + members: [person1, person2] households: home: - members: *id012 + members: [person1, person2] state_code: WI county: ADAMS_COUNTY_WI output: @@ -390,10 +394,14 @@ person1: age: 40 person_id: 1 - ssi: 994 + # 20 hours a week at the $7.25 minimum wage: 7.25 * 20 * 52 = 7,540, + # or 628.33 a month. SSI countable earnings = (628.33 - 20 - 65) / 2 + # = 271.67, so SSI = 994 - 271.67 = 722.33. + ssi: 722.33 wi_ssp_regular: 83.78 - employment_income: 120_000 - ssi_countable_resources: 100_000 + employment_income: 7_540 + # Below the $2,000 SSI resource limit, above the $1,000 CTS limit. + ssi_countable_resources: 1_500 person2: age: 8 person_id: 2 @@ -405,13 +413,16 @@ members: [person2] families: unit: - members: &id013 [person1, person2] + members: [person1, person2] households: home: - members: *id013 + members: [person1, person2] state_code: WI county: DANE_COUNTY_WI output: + # The SSI parent is outside the group, so the $628.33 of monthly wages + # (above the $311 size-1 net limit) and $1,500 of resources (above the + # $1,000 limit) are not counted: the child alone has $0, so $275. wi_cts: [275, 0] - name: Case 14, Non-SSI resources at the limit. @@ -436,10 +447,10 @@ members: [person2] families: unit: - members: &id014 [person1, person2] + members: [person1, person2] households: home: - members: *id014 + members: [person1, person2] state_code: WI county: DANE_COUNTY_WI output: @@ -467,10 +478,10 @@ members: [person2] families: unit: - members: &id015 [person1, person2] + members: [person1, person2] households: home: - members: *id015 + members: [person1, person2] state_code: WI county: DANE_COUNTY_WI output: @@ -487,7 +498,7 @@ ssi: 994 wi_ssp_regular: 83.78 person2: - age: 8 + age: 16 person_id: 2 parent_1_id: 1 employment_income: 4_812 @@ -498,13 +509,15 @@ members: [person2] families: unit: - members: &id016 [person1, person2] + members: [person1, person2] households: home: - members: *id016 + members: [person1, person2] state_code: WI county: DANE_COUNTY_WI output: + # 4,812 / 12 = 401 a month; gross 401 <= 576 (size 1, Area I); + # net 401 - 90 = 311 <= 311 net limit (threshold edge), so $275. wi_cts: [275, 0] - name: Case 17, New applicant just above net earnings limit. @@ -518,7 +531,7 @@ ssi: 994 wi_ssp_regular: 83.78 person2: - age: 8 + age: 16 person_id: 2 parent_1_id: 1 employment_income: 4_824 @@ -529,13 +542,14 @@ members: [person2] families: unit: - members: &id017 [person1, person2] + members: [person1, person2] households: home: - members: *id017 + members: [person1, person2] state_code: WI county: DANE_COUNTY_WI output: + # 4,824 / 12 = 402 a month; net 402 - 90 = 312 > 311 (threshold edge). wi_cts: [0, 0] - name: Case 18, Continuing minor full-time student earnings are exempt only in net test. @@ -549,7 +563,7 @@ ssi: 994 wi_ssp_regular: 83.78 person2: - age: 8 + age: 16 person_id: 2 parent_1_id: 1 employment_income: 6_912 @@ -562,13 +576,16 @@ members: [person2] families: unit: - members: &id018 [person1, person2] + members: [person1, person2] households: home: - members: *id018 + members: [person1, person2] state_code: WI county: DANE_COUNTY_WI output: + # 6,912 / 12 = 576 a month; gross 576 <= 576 (threshold edge); a + # continuing full-time student's earnings are exempt in the net + # test, so net 0 <= 311 and the benefit is $275. wi_cts: [275, 0] - name: Case 19, Continuing student fails gross test despite net exemption. @@ -582,7 +599,7 @@ ssi: 994 wi_ssp_regular: 83.78 person2: - age: 8 + age: 16 person_id: 2 parent_1_id: 1 employment_income: 6_924 @@ -595,13 +612,14 @@ members: [person2] families: unit: - members: &id019 [person1, person2] + members: [person1, person2] households: home: - members: *id019 + members: [person1, person2] state_code: WI county: DANE_COUNTY_WI output: + # 6,924 / 12 = 577 a month > 576 gross limit (threshold edge). wi_cts: [0, 0] - name: Case 20, Continuing nonschool minor receives 30 and one-third deduction. @@ -615,7 +633,7 @@ ssi: 994 wi_ssp_regular: 83.78 person2: - age: 8 + age: 17 person_id: 2 parent_1_id: 1 employment_income: 6_840 @@ -628,13 +646,16 @@ members: [person2] families: unit: - members: &id020 [person1, person2] + members: [person1, person2] households: home: - members: *id020 + members: [person1, person2] state_code: WI county: DANE_COUNTY_WI output: + # 6,840 / 12 = 570 a month; gross 570 <= 576; a continuing minor + # not in school gets $90, $30 and one-third: + # (570 - 90 - 30) * 2 / 3 = 300 <= 311, so $275. wi_cts: [275, 0] - name: Case 21, Two co-resident parents must both receive state SSI. @@ -664,16 +685,16 @@ members: [person3] families: unit: - members: &id021 [person1, person2, person3] + members: [person1, person2, person3] households: home: - members: *id021 + members: [person1, person2, person3] state_code: WI county: DANE_COUNTY_WI output: wi_cts: [0, 0, 0] -- name: Case 22, Two SSI parents share one child award through the designated payee. +- name: Case 22, Two unmarried SSI parents tie on one child, so the lower person_id parent is the caretaker. period: 2026-01 absolute_error_margin: 0.01 input: @@ -702,10 +723,10 @@ members: [person3] families: unit: - members: &id022 [person1, person2, person3] + members: [person1, person2, person3] households: home: - members: *id022 + members: [person1, person2, person3] state_code: WI county: DANE_COUNTY_WI output: @@ -732,10 +753,10 @@ members: [person2] families: unit: - members: &id023 [person1, person2] + members: [person1, person2] households: home: - members: *id023 + members: [person1, person2] state_code: IL county: DANE_COUNTY_WI output: @@ -763,10 +784,10 @@ members: [person2] families: unit: - members: &id024 [person1, person2] + members: [person1, person2] households: home: - members: *id024 + members: [person1, person2] state_code: WI county: DANE_COUNTY_WI output: @@ -794,10 +815,10 @@ members: [person2] families: unit: - members: &id025 [person1, person2] + members: [person1, person2] households: home: - members: *id025 + members: [person1, person2] state_code: WI county: DANE_COUNTY_WI output: @@ -838,10 +859,10 @@ members: [person4] families: unit: - members: &id026 [person1, person2, person3, person4] + members: [person1, person2, person3, person4] households: home: - members: *id026 + members: [person1, person2, person3, person4] state_code: WI county: DANE_COUNTY_WI output: @@ -882,10 +903,10 @@ members: [person4] families: unit: - members: &id027 [person1, person2, person3, person4] + members: [person1, person2, person3, person4] households: home: - members: *id027 + members: [person1, person2, person3, person4] state_code: WI county: DANE_COUNTY_WI output: @@ -902,7 +923,7 @@ ssi: 994 wi_ssp_regular: 83.78 person2: - age: 8 + age: 16 person_id: 2 parent_1_id: 1 employment_income: 8_400 @@ -927,6 +948,9 @@ state_code: WI county: DANE_COUNTY_WI output: + # Teen earns 8,400 / 12 = 700 a month: gross 700 <= 1,018 (size 2). + # Net 700 - 90 = 610; the 9-year-old's care 2,400 / 12 = 200 is capped + # at $175, so 610 - 175 = 435 <= 550 and two children get 275 + 165. wi_cts: [440, 0, 0] - name: Case 29, Child-support noncooperation excludes the entire family. @@ -950,11 +974,11 @@ members: [person2] families: unit: - members: &id028 [person1, person2] + members: [person1, person2] wi_cts_nonfinancially_ineligible: true households: home: - members: *id028 + members: [person1, person2] state_code: WI county: DANE_COUNTY_WI output: @@ -982,10 +1006,10 @@ members: [person2] families: unit: - members: &id029 [person1, person2] + members: [person1, person2] households: home: - members: *id029 + members: [person1, person2] state_code: WI county: DANE_COUNTY_WI output: @@ -1084,10 +1108,10 @@ members: [person14] families: unit: - members: &id030 [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10, person11, person12, person13, person14] + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10, person11, person12, person13, person14] households: home: - members: *id030 + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10, person11, person12, person13, person14] state_code: WI county: DANE_COUNTY_WI output: @@ -1186,12 +1210,666 @@ members: [person14] families: unit: - members: &id031 [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10, person11, person12, person13, person14] + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10, person11, person12, person13, person14] wi_cts_large_group_net_income_limit: 1_254 households: home: - members: *id031 + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10, person11, person12, person13, person14] state_code: WI county: DANE_COUNTY_WI output: wi_cts: [2_255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + +- name: Case 33, Handbook Scenario 4 unmarried SSI caretakers with own children and a child in common. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 38 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + person2: + age: 36 + person_id: 2 + ssi: 994 + wi_ssp_regular: 83.78 + person3: + age: 12 + person_id: 3 + parent_1_id: 1 + person4: + age: 6 + person_id: 4 + parent_1_id: 1 + parent_2_id: 2 + person5: + age: 10 + person_id: 5 + parent_1_id: 2 + marital_units: + parent: + members: [person1] + other: + members: [person2] + child0: + members: [person3] + child1: + members: [person4] + child2: + members: [person5] + families: + unit: + members: [person1, person2, person3, person4, person5] + households: + home: + members: [person1, person2, person3, person4, person5] + state_code: WI + county: DANE_COUNTY_WI + output: + # The child in common links all three children into one filing unit + # (size 3, no income). Each caretaker has two eligible children, so the + # child in common goes to the lower person_id: person1 cares for + # persons 3 and 4, person2 for person 5. + wi_cts_caretaker_children: [2, 1, 0, 0, 0] + # Handbook Scenario 4: 275 + 165 = 440 to person1 and 275 to person2, + # 715 in total. + wi_cts: [440, 275, 0, 0, 0] + +- name: Case 34, Handbook Scenario 5 married SSI caretakers with own children and a child in common. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 38 + person_id: 1 + # SSI couple: 1,491 / 2 = 745.50 each; SSP couple: 132.05 / 2. + ssi: 745.5 + wi_ssp_regular: 66.025 + person2: + age: 36 + person_id: 2 + ssi: 745.5 + wi_ssp_regular: 66.025 + person3: + age: 12 + person_id: 3 + parent_1_id: 1 + person4: + age: 6 + person_id: 4 + parent_1_id: 1 + parent_2_id: 2 + person5: + age: 10 + person_id: 5 + parent_1_id: 2 + marital_units: + parents: + members: [person1, person2] + child0: + members: [person3] + child1: + members: [person4] + child2: + members: [person5] + families: + unit: + members: [person1, person2, person3, person4, person5] + households: + home: + members: [person1, person2, person3, person4, person5] + state_code: WI + county: DANE_COUNTY_WI + output: + # Marriage does not change the groups: two children each, the tie goes + # to the lower person_id. + wi_cts_caretaker_children: [2, 1, 0, 0, 0] + # Handbook Scenario 5: 275 + 165 = 440 and 275, 715 in total. + wi_cts: [440, 275, 0, 0, 0] + +- name: Case 35, Tie for a child in common goes to the lower person ID whatever the member order. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 36 + person_id: 2 + ssi: 994 + wi_ssp_regular: 83.78 + person2: + age: 38 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + person3: + age: 6 + person_id: 4 + parent_1_id: 2 + parent_2_id: 1 + person4: + age: 10 + person_id: 5 + parent_1_id: 2 + person5: + age: 12 + person_id: 3 + parent_1_id: 1 + marital_units: + parent: + members: [person1] + other: + members: [person2] + child0: + members: [person3] + child1: + members: [person4] + child2: + members: [person5] + families: + unit: + members: [person1, person2, person3, person4, person5] + households: + home: + members: [person1, person2, person3, person4, person5] + state_code: WI + county: DANE_COUNTY_WI + output: + # Case 33 with the rows and parent slots reversed: each caretaker has + # two eligible children, and person2 (person_id 1) is listed second and + # in the child's second parent slot, yet still takes the child in common. + wi_cts_caretaker_children: [1, 2, 0, 0, 0] + # 275 to person1; 275 + 165 = 440 to person2. + wi_cts: [275, 440, 0, 0, 0] + +- name: Case 36, Handbook Scenario 7 married parents whose only child in common receives SSI. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 38 + person_id: 1 + ssi: 745.5 + wi_ssp_regular: 66.025 + person2: + age: 36 + person_id: 2 + ssi: 745.5 + wi_ssp_regular: 66.025 + person3: + age: 12 + person_id: 3 + parent_1_id: 1 + person4: + age: 6 + person_id: 4 + parent_1_id: 1 + parent_2_id: 2 + is_disabled: true + ssi: 994 + person5: + age: 10 + person_id: 5 + parent_1_id: 2 + marital_units: + parents: + members: [person1, person2] + child0: + members: [person3] + child1: + members: [person4] + child2: + members: [person5] + families: + unit: + members: [person1, person2, person3, person4, person5] + households: + home: + members: [person1, person2, person3, person4, person5] + state_code: WI + county: DANE_COUNTY_WI + output: + # The SSI child breaks the link, so persons 3 and 5 form two separate + # one-child filing units and the SSI child is in neither. + wi_cts_sfu_member: [false, false, true, false, true] + wi_cts_caretaker_children: [1, 1, 0, 0, 0] + # Handbook Scenario 7: two payments of $275. + wi_cts: [275, 275, 0, 0, 0] + +- name: Case 37, Handbook Scenario 8 unmarried parents whose only child in common receives SSI. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 38 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + person2: + age: 36 + person_id: 2 + ssi: 994 + wi_ssp_regular: 83.78 + person3: + age: 12 + person_id: 3 + parent_1_id: 1 + person4: + age: 6 + person_id: 4 + parent_1_id: 1 + parent_2_id: 2 + is_disabled: true + ssi: 994 + person5: + age: 10 + person_id: 5 + parent_1_id: 2 + marital_units: + parent: + members: [person1] + other: + members: [person2] + child0: + members: [person3] + child1: + members: [person4] + child2: + members: [person5] + families: + unit: + members: [person1, person2, person3, person4, person5] + households: + home: + members: [person1, person2, person3, person4, person5] + state_code: WI + county: DANE_COUNTY_WI + output: + # Two separate one-child units, one per SSI parent. + wi_cts_caretaker_children: [1, 1, 0, 0, 0] + # Handbook Scenario 8: one $275 payment in each case. + wi_cts: [275, 275, 0, 0, 0] + +- name: Case 38, SSI child in common does not pull the non-SSI co-parent into the filing unit. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + person2: + age: 16 + person_id: 2 + parent_1_id: 1 + # 16 hours a week at the $7.25 minimum wage: 7.25 * 16 * 52 = 6,032. + employment_income: 6_032 + person3: + age: 42 + person_id: 3 + person4: + age: 4 + person_id: 4 + parent_1_id: 1 + parent_2_id: 3 + is_disabled: true + ssi: 994 + marital_units: + parent: + members: [person1] + other: + members: [person3] + child0: + members: [person2] + child1: + members: [person4] + families: + unit: + members: [person1, person2, person3, person4] + households: + home: + members: [person1, person2, person3, person4] + state_code: WI + county: DANE_COUNTY_WI + output: + # The partner is linked to the teen only through the SSI child, who + # breaks the link (Handbook 3.3.1), so the teen is tested alone. + wi_cts_sfu_member: [false, true, false, false] + # 6,032 / 12 = 502.67 a month: gross 502.67 <= 576, but net + # 502.67 - 90 = 412.67 > 311 (size 1, Area I), so $0. + wi_cts: [0, 0, 0, 0] + +- name: Case 39, Paroled child of an SSI parent is eligible. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + person2: + age: 8 + person_id: 2 + parent_1_id: 1 + immigration_status: PAROLED_ONE_YEAR + marital_units: + parent: + members: [person1] + child0: + members: [person2] + families: + unit: + members: [person1, person2] + households: + home: + members: [person1, person2] + state_code: WI + county: DANE_COUNTY_WI + output: + # Parole under 8 USC 1182(d)(5) is lawful presence under Handbook + # 3.1.4, so the child counts: one child = $275. + wi_cts: [275, 0] + +- name: Case 40, Omitting marital units does not exclude the child. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + person2: + age: 8 + person_id: 2 + parent_1_id: 1 + families: + unit: + members: [person1, person2] + households: + home: + members: [person1, person2] + state_code: WI + county: DANE_COUNTY_WI + output: + # Both people fall into one default marital unit; only + # wi_cts_child_excluded marks a married minor, so one child = $275. + wi_cts: [275, 0] + +- name: Case 41, Pregnancy allowance raises the gross income limit for a pregnant teen. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + person2: + age: 17 + person_id: 2 + parent_1_id: 1 + is_pregnant: true + is_full_time_student: true + wi_cts_received_recently: true + # 20 hours a week at the $7.25 minimum wage: 7.25 * 20 * 52 = 7,540. + employment_income: 7_540 + marital_units: + parent: + members: [person1] + child0: + members: [person2] + families: + unit: + members: [person1, person2] + households: + home: + members: [person1, person2] + state_code: WI + county: DANE_COUNTY_WI + output: + # 7,540 / 12 = 628.33 a month counts in the gross test. + wi_cts_gross_income: [0, 628.33] + # A continuing full-time student's earnings are exempt in the net test. + wi_cts_net_income: [0, 0] + # Gross 628.33 exceeds the 576 regular limit but not the 707 pregnancy + # limit (size 1, Area I); net 0 <= 311 + 71 = 382, so $275. + wi_cts: [275, 0] + +- name: Case 42, Without parent IDs the family SSI parent receives the award for its children. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 34 + ssi: 994 + wi_ssp_regular: 83.78 + own_children_in_household: 2 + person2: + age: 9 + person3: + age: 5 + marital_units: + parent: + members: [person1] + child0: + members: [person2] + child1: + members: [person3] + families: + unit: + members: [person1, person2, person3] + households: + home: + members: [person1, person2, person3] + state_code: WI + county: MILWAUKEE_COUNTY_WI + output: + # No parent links, as in microsimulation: the family is one filing unit, + # its only parent (own_children_in_household) receives SSP, and the + # parent receives the award for both children. + wi_cts_sfu_member: [false, true, true] + wi_cts_caretaker_children: [2, 0, 0] + # 275 + 165 = 440. + wi_cts: [440, 0, 0] + +- name: Case 43, Additional flat disregard alone subtracts 30 dollars after the work expense. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + person2: + age: 18 + person_id: 2 + parent_1_id: 1 + is_in_secondary_school: true + wi_cts_graduates_before_19: true + wi_cts_additional_flat_disregard: true + # 20 hours a week at the $7.25 minimum wage: 7.25 * 20 * 52 = 7,540. + employment_income: 7_540 + person3: + age: 14 + person_id: 3 + parent_1_id: 1 + marital_units: + parent: + members: [person1] + child0: + members: [person2] + child1: + members: [person3] + families: + unit: + members: [person1, person2, person3] + households: + home: + members: [person1, person2, person3] + state_code: WI + county: DANE_COUNTY_WI + output: + # The 18-year-old senior is past the one-third months but still gets + # $30: 7,540 / 12 = 628.33; 628.33 - 90 - 30 = 508.33. + wi_cts_net_income: [0, 508.33, 0] + # Size 2: gross 628.33 <= 1,018 and net 508.33 <= 550, so 275 + 165. + wi_cts: [440, 0, 0] + +- name: Case 44, Continuing part-time student working under 30 hours has exempt earnings. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 42 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + person2: + age: 16 + person_id: 2 + parent_1_id: 1 + is_full_time_student: false + wi_cts_part_time_student: true + wi_cts_received_recently: true + weekly_hours_worked: 20 + # 20 hours a week at the $7.25 minimum wage: 7.25 * 20 * 52 = 7,540. + employment_income: 7_540 + person3: + age: 11 + person_id: 3 + parent_1_id: 1 + marital_units: + parent: + members: [person1] + child0: + members: [person2] + child1: + members: [person3] + families: + unit: + members: [person1, person2, person3] + households: + home: + members: [person1, person2, person3] + state_code: WI + county: DANE_COUNTY_WI + output: + # 7,540 / 12 = 628.33 a month counts in the gross test. + wi_cts_gross_income: [0, 628.33, 0] + # 20 hours < 30, so a continuing part-time student's earnings are exempt. + wi_cts_net_income: [0, 0, 0] + # Size 2: gross 628.33 <= 1,018 and net 0 <= 550, so 275 + 165. + wi_cts: [440, 0, 0] + +- name: Case 45, Infant care deduction is capped at 200 dollars in an Area II county. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 38 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + person2: + age: 17 + person_id: 2 + parent_1_id: 1 + # 20 hours a week at the $7.25 minimum wage: 7.25 * 20 * 52 = 7,540. + employment_income: 7_540 + person3: + age: 1 + person_id: 3 + parent_1_id: 1 + # Part-time infant care at $600 a month. + pre_subsidy_childcare_expenses: 7_200 + marital_units: + parent: + members: [person1] + child0: + members: [person2] + child1: + members: [person3] + families: + unit: + members: [person1, person2, person3] + households: + home: + members: [person1, person2, person3] + state_code: WI + county: WOOD_COUNTY_WI + output: + # 7,200 / 12 = 600 a month, capped at $200 for a child under 2. + wi_cts_dependent_care_deduction: [0, 0, 200] + # New applicant teen: 7,540 / 12 = 628.33; 628.33 - 90 = 538.33. + wi_cts_net_income: [0, 538.33, 0] + # Area II size 2: gross 628.33 <= 987; net 538.33 - 200 = 338.33 <= 533, + # so 275 + 165 = 440. + wi_cts: [440, 0, 0] + +- name: Case 46, Child support the co-parent pays outside the home lowers the Buening group net income. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + person_id: 1 + ssi: 994 + wi_ssp_regular: 83.78 + person2: + age: 10 + person_id: 2 + parent_1_id: 1 + social_security_survivors: 2_400 + person3: + age: 8 + person_id: 3 + parent_1_id: 1 + parent_2_id: 20 + person4: + age: 40 + person_id: 20 + unemployment_compensation: 6_000 + # $85 a month for a child living elsewhere: 17% of his $500, the + # Wisconsin one-child percentage standard. + child_support_expense: 1_020 + marital_units: + parent: + members: [person1] + child0: + members: [person2] + child1: + members: [person3] + other: + members: [person4] + families: + unit: + members: [person1, person2, person3, person4] + households: + home: + members: [person1, person2, person3, person4] + state_code: WI + county: DANE_COUNTY_WI + output: + # Handbook 3.3.1 Example 2 (Case 27) plus the support Dan pays. + # Tim and Dan: gross 500 <= 1,018; net 500 - 85 = 415 <= 550, so they + # stay in the group. Group of 3: gross 200 + 500 = 700 <= 1,197; net + # 700 - 85 = 615 <= 647, so Mary gets $275 for Jill. + wi_cts: [275, 0, 0, 0] diff --git a/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_ssp.yaml b/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_ssp.yaml index 95729b90cba..0cf5e95ac13 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_ssp.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_ssp.yaml @@ -75,9 +75,15 @@ 2026: WI age: 2026: 65 - social_security_retirement: - 2026: 12_156 + # Divorced-spouse benefit at SSA's August 2026 average for spouses of retired + # workers, $986.70 a month (Monthly Statistical Snapshot, Table 2): + # 986.70 * 12 = 11,840.40. + social_security_dependents: + 2026: 11_840.4 output: + # SSI = 994 - (986.70 - 20) = 27.30. + ssi: 27.3 + # Any federal SSI payment brings the full individual rate. wi_ssp: 92.16 - name: Case 8, no federal payment no new state eligibility. @@ -88,9 +94,13 @@ 2026: WI age: 2026: 65 + # SSA's August 2026 average retired-worker benefit, $2,087.52 a month + # (Monthly Statistical Snapshot, Table 2): 2,087.52 * 12 = 25,050.24. social_security_retirement: - 2026: 12_168 + 2026: 25_050.24 output: + # Countable 2,087.52 - 20 = 2,067.52 exceeds the 994 FBR, so SSI is 0. + ssi: 0 wi_ssp: 0 - name: Case 9, certified exceptional expense supplement before increase. @@ -179,3 +189,39 @@ 2026: 2_001 output: wi_ssp: 0 + +- name: Case 16, reported SSI receipt qualifies when modeled SSI is zero. + period: 2026-05 + absolute_error_margin: 0.01 + input: + state_code: + 2026: WI + # No aged, blind or disability input, so the model computes no SSI. + age: + 2026: 45 + receives_ssi: true + output: + ssi: 0 + wi_ssp_eligible: true + # Individual rate from May 2026. + wi_ssp: 92.16 + +- name: Case 17, certified SSI-E recipient in the household of another gets no SSI-E. + period: 2026-05 + absolute_error_margin: 0.01 + input: + state_code: + 2026: WI + age: + 2026: 65 + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + wi_ssi_e_certified: true + output: + # One-third reduction: 994 * (1 - 1/3) = 662.67. + ssi: 662.67 + # P-20679 3.1.1: the household-of-another arrangement bars SSI-E. + wi_ssi_e: 0 + # Regular individual rate only. + wi_ssp: 92.16 diff --git a/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_ssp_countable_for_hud.yaml b/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_ssp_countable_for_hud.yaml index a5b69481825..93fab22cf17 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_ssp_countable_for_hud.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_ssp_countable_for_hud.yaml @@ -1,8 +1,8 @@ # HUD PIH 2023-27 G.11 and PIH 2024-38 IV.B.1 exclude qualifying assisted-home care. -# Positive home-care flags certify that county-approved adult-child care enables continued residence. +# wi_ssi_e_for_home_care is true when the SSI-E pays an assisted-family member's care that enables continued residence. # Annual SSI-E = 4*95.99 + 8*105.59 = 1228.68; regular SSI remains counted. # https://www.hud.gov/sites/dfiles/OCHCO/documents/2023-27pihn.pdf#page=81 -- name: Case 1, qualifying caregiver in the assisted SPM unit need not share the Census family. +- name: Case 1, SSI-E paying an adult child in the assisted unit for home care is excluded. period: 2026 absolute_error_margin: 0.01 input: @@ -16,7 +16,6 @@ pre_subsidy_rent: 12_000 wi_ssi_e_certified: true wi_ssi_e_for_home_care: true - wi_ssi_e_caregiver_id: 2 person2: age: 30 person_id: 2 @@ -68,7 +67,6 @@ pre_subsidy_rent: 12_000 wi_ssi_e_certified: true wi_ssi_e_for_home_care: false - wi_ssi_e_caregiver_id: 2 person2: age: 30 person_id: 2 @@ -105,7 +103,7 @@ hud_annual_income: 14_229.08 housing_assistance: 7_896.28 -- name: Case 3, unidentified caregiver keeps SSI-E countable. +- name: Case 3, blindness establishes the HUD disability for the home-care exclusion. period: 2026 absolute_error_margin: 0.01 input: @@ -113,13 +111,11 @@ person1: age: 50 person_id: 1 - is_disabled: true - meets_ssi_disability_criteria: true + is_blind: true is_household_head: true pre_subsidy_rent: 12_000 wi_ssi_e_certified: true wi_ssi_e_for_home_care: true - wi_ssi_e_caregiver_id: 0 person2: age: 30 person_id: 2 @@ -152,23 +148,26 @@ bedrooms: 2 tenant_pays_utilities: false output: - wi_ssp_countable_for_hud: [2_301.08, 0] + # Blindness passes the HUD disability test: 2,301.08 - 1,228.68 SSI-E = 1,072.40. + wi_ssp_countable_for_hud: [1_072.4, 0] -- name: Case 4, a recipient cannot name themselves as the caregiver. +- name: Case 4, Social Security disability benefits establish the HUD disability for an aged recipient. period: 2026 absolute_error_margin: 0.01 input: people: person1: - age: 50 + # Aged SSI recipient still on SSDI before full retirement age. + age: 66 person_id: 1 - is_disabled: true - meets_ssi_disability_criteria: true is_household_head: true pre_subsidy_rent: 12_000 + # Wisconsin average Social Security benefit of disabled workers who also + # receive SSI, $698.90 a month (SSA SSI Annual Statistical Report 2024, + # Table 16): 698.90 * 12 = 8,386.80. + social_security_disability: 8_386.8 wi_ssi_e_certified: true wi_ssi_e_for_home_care: true - wi_ssi_e_caregiver_id: 1 person2: age: 30 person_id: 2 @@ -201,7 +200,10 @@ bedrooms: 2 tenant_pays_utilities: false output: - wi_ssp_countable_for_hud: [2_301.08, 0] + # SSI = 994 - (698.90 - 20) = 315.10 a month; 315.10 * 12 = 3,781.20. + ssi: [3_781.2, 0] + # SSDI receipt passes the HUD disability test: 2,301.08 - 1,228.68 = 1,072.40. + wi_ssp_countable_for_hud: [1_072.4, 0] - name: Case 5, age-only eligibility does not establish the HUD disability exclusion. period: 2026 @@ -217,7 +219,6 @@ pre_subsidy_rent: 12_000 wi_ssi_e_certified: true wi_ssi_e_for_home_care: true - wi_ssi_e_caregiver_id: 2 person2: age: 30 person_id: 2 @@ -252,7 +253,7 @@ output: wi_ssp_countable_for_hud: [2_301.08, 0] -- name: Case 6, caregiver in another SPM unit does not qualify despite shared address. +- name: Case 6, care by a co-resident outside the assisted SPM unit keeps SSI-E countable. period: 2026 absolute_error_margin: 0.01 input: @@ -265,8 +266,8 @@ is_household_head: true pre_subsidy_rent: 12_000 wi_ssi_e_certified: true - wi_ssi_e_for_home_care: true - wi_ssi_e_caregiver_id: 2 + # The caregiver is not a member of the assisted family. + wi_ssi_e_for_home_care: false person2: age: 30 person_id: 2 @@ -303,7 +304,7 @@ output: wi_ssp_countable_for_hud: [2_301.08, 0] -- name: Case 7, caregiver outside the assisted household does not qualify. +- name: Case 7, care by an adult child living in another household keeps SSI-E countable. period: 2026 absolute_error_margin: 0.01 input: @@ -316,8 +317,8 @@ is_household_head: true pre_subsidy_rent: 12_000 wi_ssi_e_certified: true - wi_ssi_e_for_home_care: true - wi_ssi_e_caregiver_id: 2 + # The caregiver lives outside the assisted unit. + wi_ssi_e_for_home_care: false person2: age: 30 person_id: 2 @@ -340,8 +341,10 @@ members: [person2] spm_units: unit: - members: [person1, person2] + members: [person1] receives_housing_assistance: true + other: + members: [person2] households: home: members: [person1] @@ -370,7 +373,6 @@ pre_subsidy_rent: 12_000 wi_ssi_e_certified: true wi_ssi_e_for_home_care: true - wi_ssi_e_caregiver_id: 2 ssi_lives_in_medical_treatment_facility: 2026-05: true ssi_medicaid_pays_majority_of_care: @@ -414,7 +416,7 @@ wi_ssp_countable_for_hud: 2026-05: [197.75, 0] -- name: Case 9, an annual caregiver identifier preserves the exclusion across the May rate change. +- name: Case 9, the home-care exclusion holds across the May rate change. period: 2026 absolute_error_margin: 0.01 input: @@ -428,7 +430,6 @@ pre_subsidy_rent: 12_000 wi_ssi_e_certified: true wi_ssi_e_for_home_care: true - wi_ssi_e_caregiver_id: 2 person2: age: 30 person_id: 2 @@ -479,7 +480,6 @@ pre_subsidy_rent: 12_000 wi_ssi_e_certified: false wi_ssi_e_for_home_care: true - wi_ssi_e_caregiver_id: 2 person2: age: 30 person_id: 2 @@ -515,7 +515,7 @@ wi_ssi_e: [0, 0] wi_ssp_countable_for_hud: [1_072.4, 0] -- name: Case 11, duplicate caregiver identifiers cannot establish a unique caregiver. +- name: Case 11, with two adult children in the assisted unit only the recipient's SSI-E is excluded. period: 2026 absolute_error_margin: 0.01 input: @@ -529,7 +529,6 @@ pre_subsidy_rent: 12_000 wi_ssi_e_certified: true wi_ssi_e_for_home_care: true - wi_ssi_e_caregiver_id: 2 person2: age: 30 person_id: 2 @@ -537,7 +536,8 @@ is_household_head: false person3: age: 31 - person_id: 2 + person_id: 3 + parent_1_id: 1 is_household_head: false marital_units: unit1: @@ -572,9 +572,8 @@ bedrooms: 2 tenant_pays_utilities: false output: - wi_ssp_countable_for_hud: [2_301.08, 0, 0 - -] + # 2,301.08 - 1,228.68 SSI-E = 1,072.40; the adult children have no supplement. + wi_ssp_countable_for_hud: [1_072.4, 0, 0] - name: Case 12, qualifying SSI-E exclusion leaves the derived caretaker supplement countable. period: 2026 @@ -590,7 +589,6 @@ pre_subsidy_rent: 12_000 wi_ssi_e_certified: true wi_ssi_e_for_home_care: true - wi_ssi_e_caregiver_id: 2 person2: age: 30 person_id: 2 @@ -635,3 +633,61 @@ wi_cts: [3_300, 0, 0] wi_ssp_countable_for_hud: [4_372.4, 0, 0] hud_unearned_income: [16_300.4, 0, 0] + +- name: Case 13, SSI disability criteria alone establish the HUD disability for the home-care exclusion. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 50 + person_id: 1 + # SSI-disabled through the SSI criteria, with no is_disabled input. + meets_ssi_disability_criteria: true + is_household_head: true + pre_subsidy_rent: 12_000 + wi_ssi_e_certified: true + wi_ssi_e_for_home_care: true + person2: + age: 30 + person_id: 2 + parent_1_id: 1 + is_household_head: false + marital_units: + unit1: + members: [person1] + unit2: + members: [person2] + families: + family1: + members: [person1] + family2: + members: [person2] + tax_units: + unit1: + members: [person1] + unit2: + members: [person2] + spm_units: + unit: + members: [person1, person2] + receives_housing_assistance: true + households: + home: + members: [person1, person2] + state_code: WI + county_fips: '55079' + bedrooms: 2 + tenant_pays_utilities: false + output: + # Meets the SSI disability criteria with no earnings, so no SGA. + is_ssi_disabled: [true, false] + # 4 * 95.99 + 8 * 105.59 = 1,228.68. + wi_ssi_e: [1_228.68, 0] + # 1,072.40 regular + 1,228.68 SSI-E - 1,228.68 excluded = 1,072.40. + wi_ssp_countable_for_hud: [1_072.4, 0] + # 994 * 12 = 11,928 SSI + 1,072.40 = 13,000.40. + hud_annual_income: 13_000.4 + # TTP = 0.3 * (13,000.40 - 550 elderly/disabled deduction) = 3,735.12; + # assistance = 12,000 rent - 3,735.12 = 8,264.88. + housing_assistance: 8_264.88 diff --git a/policyengine_us/variables/gov/states/wi/dcf/works/eligibility/wi_works_eligible.py b/policyengine_us/variables/gov/states/wi/dcf/works/eligibility/wi_works_eligible.py index 57f8da8756c..c30c717c431 100644 --- a/policyengine_us/variables/gov/states/wi/dcf/works/eligibility/wi_works_eligible.py +++ b/policyengine_us/variables/gov/states/wi/dcf/works/eligibility/wi_works_eligible.py @@ -1,4 +1,8 @@ from policyengine_us.model_api import * +from policyengine_us.variables.household.demographic.person._parent_links import ( + co_resident_parent_indices, + household_has_parent_ids, +) class wi_works_eligible(Variable): @@ -20,13 +24,33 @@ def formula(spm_unit, period, parameters): citizenship = spm_unit.any(is_qualified) income = spm_unit("wi_works_income_eligible", period) resources = spm_unit("wi_works_resources_eligible", period) - parent = person("is_parent", period.this_year) - ssi_recipient = (person("ssi", period) > 0) | person( - "wi_cts_state_only_ssi_recipient", period + # Wis. Stat. 49.145(2)(a) and (i): the applicant is a custodial parent + # who does not receive SSI. Grandfathered state-only SSI recipients + # are not modeled. + ssi_recipient = (person("ssi", period) > 0) | person("receives_ssi", period) + dependent_child = person("is_person_demographic_tanf_eligible", period) + unit = spm_unit.members_entity_id + custodial = np.zeros(person.count, dtype=bool) + for parent in co_resident_parent_indices(person, period.this_year): + rows = dependent_child & (parent >= 0) & (unit[parent] == unit) + custodial = custodial | ( + np.bincount(parent[rows], minlength=person.count) > 0 + ) + # Without parent links every parent in the unit counts as custodial. + custodial = where( + household_has_parent_ids(person, period.this_year), + custodial, + person("is_parent", period.this_year), ) # SSI receipt excludes the applicant, not an otherwise eligible # co-parent or a household merely containing a child on SSI. - all_parents_on_ssi = spm_unit.any(parent & ssi_recipient) & ~spm_unit.any( - parent & ~ssi_recipient + all_custodial_parents_on_ssi = spm_unit.any( + custodial & ssi_recipient + ) & ~spm_unit.any(custodial & ~ssi_recipient) + return ( + demographic + & citizenship + & income + & resources + & ~all_custodial_parents_on_ssi ) - return demographic & citizenship & income & resources & ~all_parents_on_ssi diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/_wi_cts.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/_wi_cts.py index ec7d2c01a93..8b30b94b6f8 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/_wi_cts.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/_wi_cts.py @@ -1,85 +1,142 @@ -import numpy as np +from policyengine_us.model_api import * from policyengine_us.variables.household.demographic.person._parent_links import ( co_resident_parent_indices, household_has_parent_ids, ) +def cts_ssi_recipient(person, period): + return (person("ssi", period) > 0) | person("receives_ssi", period) + + def cts_relationships(person, period): first, second = co_resident_parent_indices(person, period.this_year) linked = household_has_parent_ids(person, period.this_year) - receipt = (person("wi_ssp_regular", period) > 0) | person( - "wi_cts_state_only_ssi_recipient", period - ) + # Handbook 3.1.3: a CTS parent receives the Wisconsin state SSI payment. + # Grandfathered state-only SSI recipients are not modeled. + receipt = person("wi_ssp_regular", period) > 0 parents = (first >= 0).astype(int) + (second >= 0) ssi_parents = ((first >= 0) & receipt[first]).astype(int) + ( (second >= 0) & receipt[second] ) is_parent = person("is_parent", period.this_year) - parents = np.where(linked, parents, person.family.sum(is_parent)) - ssi_parents = np.where(linked, ssi_parents, person.family.sum(is_parent & receipt)) + parents = where(linked, parents, person.family.sum(is_parent)) + ssi_parents = where(linked, ssi_parents, person.family.sum(is_parent & receipt)) return first, second, linked, receipt, parents, ssi_parents -def cts_filing_unit(person, period): - first, second, linked, receipt, parents, ssi_parents = cts_relationships( - person, period +def cts_unit_sum(unit, values): + """Total of values over each person's filing unit; 0 outside any unit.""" + in_unit = unit >= 0 + totals = np.bincount( + unit[in_unit], + weights=np.asarray(values, dtype=float)[in_unit], + minlength=unit.size, ) - child = person("wi_cts_dependent_child", period) - on_ssi = (person("ssi", period) > 0) | receipt - candidate = child & ~on_ssi & (ssi_parents > 0) - common = candidate & (parents > 1) - candidate = np.where(person.family.any(common), common, candidate) - age = person("age", period.this_year) - oldest = person.family.max(np.where(candidate, age, -1)) - target = candidate & (age == oldest) - # Selecting both tied oldest siblings is harmless: their union determines - # the same filing unit for ordinary twin/sibling configurations. - target_first = person.family.max(np.where(target, first, -1)) - target_second = person.family.max(np.where(target, second, -1)) - siblings = child & ( - ((first >= 0) & ((first == target_first) | (first == target_second))) - | ((second >= 0) & ((second == target_first) | (second == target_second))) - ) - parent_rows = np.concatenate((first[siblings], second[siblings])) - parent_mask = np.bincount(parent_rows[parent_rows >= 0], minlength=person.count) > 0 - member = (siblings | parent_mask) & ~on_ssi - fallback = (child | person("is_parent", period.this_year)) & ~on_ssi - member = np.where(linked, member, fallback) - non_ssi_parent = parent_mask & ~on_ssi - related_to_non_ssi = ((first >= 0) & non_ssi_parent[first]) | ( - (second >= 0) & non_ssi_parent[second] - ) - subgroup = member & (non_ssi_parent | related_to_non_ssi) - return member, np.where(linked, subgroup, False) + return where(in_unit, totals[max_(unit, 0)], 0) + + +def _lowest_child_unit(unit, first, second, child, count): + """Lowest unit key among each parent's co-resident children (count if none).""" + lowest = np.full(count, count) + for parent in (first, second): + rows = child & (parent >= 0) + np.minimum.at(lowest, parent[rows], unit[rows]) + return lowest -def cts_income_limits(person, period, parameters, members, buening=False): +def cts_filing_unit(person, period): + """Each person's standard filing unit key (-1 if none), members and Buening subgroup. + + Handbook 3.1.1 and 3.2.1.2.1 (#page=18, #page=30): non-SSI dependent + children who share a co-resident parent belong to one unit with their + parents, so a unit holds a target child's full and half siblings and + their parents; half-sibling links are followed transitively. An SSI + child does not link its siblings (5.4.1 Scenarios 7 and 8, #page=71). A + unit forms only around a child with an SSI parent. Without parent links + each family is one unit. + """ + first, second, linked, _, _, ssi_parents = cts_relationships(person, period) + count = person.count + index = np.arange(count) + on_ssi = cts_ssi_recipient(person, period) + child = person("wi_cts_dependent_child", period) & ~on_ssi + # Give every child the lowest key reachable through shared parents. + unit = where(child, index, count) + while True: + parent_unit = _lowest_child_unit(unit, first, second, child, count) + joined = unit + for parent in (first, second): + joined = where( + child & (parent >= 0), min_(joined, parent_unit[parent]), joined + ) + if np.array_equal(joined, unit): + break + unit = joined + parent = parent_unit < count + unit = where(child, unit, where(parent, parent_unit, -1)) + unit = where(linked, unit, person.family.min(index)).astype(int) + target = child & (ssi_parents > 0) + unit = where(cts_unit_sum(unit, target) > 0, unit, -1) + parent = where(linked, parent, person("is_parent", period.this_year)) + member = (child | parent) & ~on_ssi & (unit >= 0) + # Handbook 3.3.1 (#page=33): the non-SSI co-parent and the children + # related to them are tested separately under Buening. + co_parent = linked & member & ~child + related = ((first >= 0) & co_parent[first]) | ((second >= 0) & co_parent[second]) + return unit, member, member & (co_parent | related) + + +def cts_financial_test(person, period, parameters, unit, group, large_group_limit): + """Whether each person's unit group passes the income and asset tests. + + Also returns whether the group's net income limit is known: the + published tables end at one size, and a larger group needs a verified + limit (large_group_limit, 0 when none). + """ p = parameters(period).gov.states.wi.dhs.ssp.cts - size = person.family.sum(members) + size = cts_unit_sum(unit, group) + pregnant = cts_unit_sum(unit, group & person("is_pregnant", period.this_year)) area_i = person("wi_cts_area_i", period) - pregnant = person.family.sum(members & person("is_pregnant", period.this_year)) - gross = np.where(area_i, p.gross.area_1.calc(size), p.gross.area_2.calc(size)) - pregnancy_gross = np.where( - area_i, p.gross_pregnant.area_1.calc(size), p.gross_pregnant.area_2.calc(size) + gross_limit = where(area_i, p.gross.area_1.calc(size), p.gross.area_2.calc(size)) + pregnancy_gross_limit = where( + area_i, + p.gross_pregnant.area_1.calc(size), + p.gross_pregnant.area_2.calc(size), ) - gross = np.where( + # The pregnancy table includes one allowance; each further pregnant + # woman adds another (Handbook 5.2.2). + gross_limit = where( pregnant > 0, - pregnancy_gross + np.maximum(pregnant - 1, 0) * p.pregnancy_net, - gross, + pregnancy_gross_limit + max_(pregnant - 1, 0) * p.pregnancy_allowance, + gross_limit, + ) + # The gross, pregnancy and net tables all end at the same group size. + table_size = p.net.area_1.thresholds[-1] + gross_limit = gross_limit + max_(size - table_size, 0) * p.gross_additional + published = size <= table_size + net_limit = where( + published, + where(area_i, p.net.area_1.calc(size), p.net.area_2.calc(size)) + + pregnant * p.pregnancy_allowance, + large_group_limit, + ) + gross = cts_unit_sum(unit, group * person("wi_cts_gross_income", period)) + net = cts_unit_sum( + unit, + group + * ( + person("wi_cts_net_income", period) + - person("wi_cts_dependent_care_deduction", period) + - max_(person("child_support_expense", period), 0) + ), ) - gross = gross + np.maximum(size - p.maximum_table_size, 0) * p.gross_additional - net = ( - np.where(area_i, p.net.area_1.calc(size), p.net.area_2.calc(size)) - + pregnant * p.pregnancy_net + assets = cts_unit_sum( + unit, group * max_(person("wi_cts_countable_resources", period), 0) ) - limit_name = ( - "wi_cts_buening_large_group_net_income_limit" - if buening - else "wi_cts_large_group_net_income_limit" + eligible = ( + (gross <= gross_limit) + & (max_(net, 0) <= net_limit) + & (assets <= p.resource_limit) ) - verified_limit = person.family(limit_name, period) - table_covers_group = size <= p.maximum_table_size - net = np.where(table_covers_group, net, verified_limit) - known = table_covers_group | (verified_limit > 0) - return gross, net, known + return eligible, published | (large_group_limit > 0) diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts.py index 3d7368d6250..9e737e79905 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts.py @@ -1,5 +1,8 @@ from policyengine_us.model_api import * -from policyengine_us.variables.gov.states.wi.dhs.ssp._wi_cts import cts_income_limits +from policyengine_us.variables.gov.states.wi.dhs.ssp._wi_cts import ( + cts_filing_unit, + cts_financial_test, +) class wi_cts(Variable): @@ -8,37 +11,34 @@ class wi_cts(Variable): label = "Wisconsin Caretaker Supplement" definition_period = MONTH unit = USD - reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" + reference = ( + "https://docs.legis.wisconsin.gov/document/statutes/49.775", + # PDF pages 30-34, 65 + "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=30", + ) defined_for = StateCode.WI def formula(person, period, parameters): p = parameters(period).gov.states.wi.dhs.ssp.cts + unit, _, _ = cts_filing_unit(person, period) members = person("wi_cts_sfu_member", period) subgroup = members & person("wi_cts_buening_member", period) - gross = person("wi_cts_gross_income", period) - net = person("wi_cts_net_income", period) - deductions = max_(person("wi_cts_dependent_care_deduction", period), 0) + max_( - person("child_support_expense", period), 0 - ) - assets = max_(person("wi_cts_countable_resources", period), 0) - sub_gross, sub_net, sub_known = cts_income_limits( - person, period, parameters, subgroup, buening=True - ) - needy = ( - (person.family.sum(subgroup * gross) <= sub_gross) - & (max_(person.family.sum(subgroup * (net - deductions)), 0) <= sub_net) - & (person.family.sum(subgroup * assets) <= p.resource_limit) + # Buening keeps the co-parent group in the unit only when it is needy. + needy, subgroup_known = cts_financial_test( + person, period, parameters, unit, subgroup, 0 ) members = members & ~(subgroup & ~needy) - gross_limit, net_limit, known = cts_income_limits( - person, period, parameters, members - ) - financially_eligible = ( - (person.family.sum(members * gross) <= gross_limit) - & (max_(person.family.sum(members * (net - deductions)), 0) <= net_limit) - & (person.family.sum(members * assets) <= p.resource_limit) + financially_eligible, known = cts_financial_test( + person, + period, + parameters, + unit, + members, + person.family("wi_cts_large_group_net_income_limit", period), ) - children = person.family.sum(members & person("wi_cts_child_eligible", period)) + # Each SSI caretaker's payment covers their own assistance group, and + # the caretaker shares the filing unit of those children. + children = person("wi_cts_caretaker_children", period) amount = (children > 0) * p.first_child + max_( children - 1, 0 ) * p.additional_child @@ -46,7 +46,6 @@ def formula(person, period, parameters): amount * financially_eligible * known - * sub_known + * subgroup_known * ~person.family("wi_cts_nonfinancially_ineligible", period) - * person("wi_cts_payee", period) ) diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_additional_flat_disregard.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_additional_flat_disregard.py index a8a44d4586b..046b9fdd965 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_additional_flat_disregard.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_additional_flat_disregard.py @@ -4,6 +4,6 @@ class wi_cts_additional_flat_disregard(Variable): value_type = bool entity = Person - label = "Wisconsin CTS additional 30 dollar earnings disregard applies" + label = "Wisconsin CTS additional flat earnings disregard applies" definition_period = MONTH - reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=31" diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_additional_fraction_disregard.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_additional_fraction_disregard.py index 24171ea31e4..3653abeeaa3 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_additional_fraction_disregard.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_additional_fraction_disregard.py @@ -6,4 +6,4 @@ class wi_cts_additional_fraction_disregard(Variable): entity = Person label = "Wisconsin CTS additional one-third earnings disregard applies" definition_period = MONTH - reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=31" diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_area_i.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_area_i.py index 3f3d8954746..00ad5dd82ab 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_area_i.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_area_i.py @@ -6,7 +6,7 @@ class wi_cts_area_i(Variable): entity = Person label = "Wisconsin CTS uses Area I income limits" definition_period = MONTH - reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=63" documentation = "Override to true for the Oneida Tribe and qualifying Winnebago Tribe members on tax-free land in La Crosse or Marathon counties under Handbook 5.2.3." def formula(person, period, parameters): diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_buening_large_group_net_income_limit.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_buening_large_group_net_income_limit.py deleted file mode 100644 index 3898f583f83..00000000000 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_buening_large_group_net_income_limit.py +++ /dev/null @@ -1,11 +0,0 @@ -from policyengine_us.model_api import * - - -class wi_cts_buening_large_group_net_income_limit(Variable): - value_type = float - entity = Family - label = "Wisconsin CTS agency-verified large Buening subgroup net income limit" - definition_period = MONTH - unit = USD - reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" - documentation = "Supply the agency-verified monthly net income limit, including any pregnancy allowance, when the Buening subgroup has more than twelve people. The handbook publishes net limits only through size twelve. Zero means no verified limit has been supplied; the model cannot establish entitlement for that group." diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_buening_member.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_buening_member.py index 3411ee0d609..666fa13e679 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_buening_member.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_buening_member.py @@ -7,9 +7,10 @@ class wi_cts_buening_member(Variable): entity = Person label = "Wisconsin CTS non-SSI co-parent subgroup member" definition_period = MONTH - reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" + # PDF pages 33-34 + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=33" documentation = "The non-SSI co-parent and children whose needs must be tested separately under Buening. Parent links identify ordinary two-parent blended families; override for more complex configurations or when links are absent." def formula(person, period, parameters): - _, subgroup = cts_filing_unit(person, period) + _, _, subgroup = cts_filing_unit(person, period) return subgroup diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_caretaker_children.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_caretaker_children.py new file mode 100644 index 00000000000..43eb4a95d33 --- /dev/null +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_caretaker_children.py @@ -0,0 +1,41 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.wi.dhs.ssp._wi_cts import cts_relationships + + +class wi_cts_caretaker_children(Variable): + value_type = int + entity = Person + label = "Wisconsin CTS eligible children in this SSI parent's assistance group" + definition_period = MONTH + reference = ( + "https://docs.legis.wisconsin.gov/document/statutes/49.775", + # PDF pages 20, 68-71 + "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=20", + ) + documentation = "Each eligible child counts for one co-resident SSI parent. A child in common counts for the parent with more eligible children, and ties go to the lower person_id. Without parent links one SSI parent per family receives the award. Override with the agency's caretaker coding when it differs." + + def formula(person, period, parameters): + first, second, linked, receipt, _, _ = cts_relationships(person, period) + child = person("wi_cts_child_eligible", period) & person( + "wi_cts_sfu_member", period + ) + count = person.count + own_children = np.zeros(count) + for parent in (first, second): + rows = child & (parent >= 0) + own_children = own_children + np.bincount(parent[rows], minlength=count) + # Wis. Stat. 49.775(3) pays once for a child in common, and Handbook + # 3.1.8 codes one parent as caring for it. Scenarios 3 to 6 give it to + # the parent with the most children. + person_id = person("person_id", period.this_year) + first_cares = (own_children[first] > own_children[second]) | ( + (own_children[first] == own_children[second]) + & (person_id[first] < person_id[second]) + ) + caretaker = where((second < 0) | ((first >= 0) & first_cares), first, second) + rows = child & (caretaker >= 0) + linked_children = np.bincount(caretaker[rows], minlength=count) + candidate = person("is_parent", period.this_year) & receipt + index = np.arange(count) + payee = candidate & (index == person.family.min(where(candidate, index, count))) + return where(linked, linked_children, payee * person.family.sum(child)) diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_child_eligible.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_child_eligible.py index 6524ef9c736..335ad2e0cd6 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_child_eligible.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_child_eligible.py @@ -1,5 +1,8 @@ from policyengine_us.model_api import * -from policyengine_us.variables.gov.states.wi.dhs.ssp._wi_cts import cts_relationships +from policyengine_us.variables.gov.states.wi.dhs.ssp._wi_cts import ( + cts_relationships, + cts_ssi_recipient, +) class wi_cts_child_eligible(Variable): @@ -7,27 +10,22 @@ class wi_cts_child_eligible(Variable): entity = Person label = "Wisconsin CTS nonfinancially eligible child" definition_period = MONTH - reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" + reference = ( + "https://docs.legis.wisconsin.gov/document/statutes/49.775", + # PDF pages 19-20 + "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=19", + ) documentation = "Override for verified PRUCOL or other lawful statuses absent from the immigration enum, and certified Huber Law childcare release. Both co-resident natural/adoptive parents must receive Wisconsin state SSI." def formula(person, period, parameters): + p = parameters(period).gov.states.wi.dhs.ssp.cts _, _, _, _, parents, ssi_parents = cts_relationships(person, period) - status = person("immigration_status", period.this_year) - s = status.possible_values - immigration = ( - (status == s.CITIZEN) - | (status == s.LEGAL_PERMANENT_RESIDENT) - | (status == s.REFUGEE) - | (status == s.ASYLEE) - | (status == s.CUBAN_HAITIAN_ENTRANT) - | (status == s.DEPORTATION_WITHHELD) - | (status == s.CONDITIONAL_ENTRANT) - ) + status = person("immigration_status", period.this_year).decode_to_str() return ( person("wi_cts_dependent_child", period) - & (person("ssi", period) == 0) + & ~cts_ssi_recipient(person, period) & (ssi_parents > 0) & (parents == ssi_parents) - & immigration + & np.isin(status, p.eligible_immigration_statuses) & ~person("is_incarcerated", period) ) diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_child_excluded.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_child_excluded.py index af00679d33a..53144a093fc 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_child_excluded.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_child_excluded.py @@ -6,4 +6,5 @@ class wi_cts_child_excluded(Variable): entity = Person label = "Wisconsin CTS child excluded by a nonfinancial condition" definition_period = MONTH - reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=18" + documentation = "Set for a currently married or divorced minor, a step or other nonqualifying relationship, or a child-specific exclusion such as kinship care." diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_countable_resources.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_countable_resources.py index bbfd3e45ca7..d76ae2de509 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_countable_resources.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_countable_resources.py @@ -8,8 +8,9 @@ class wi_cts_countable_resources(Variable): definition_period = MONTH unit = USD quantity_type = STOCK - reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" - documentation = "Default covers modeled SSI liquid resources. Override with the CTS asset budget when it differs: include retirement assets, life insurance, nonhome real estate and vehicle equity after the $1,500 exemption for one vehicle; exclude the home, approved burial assets, student loans and protected tax refunds. SSI recipients are excluded at the group calculation." + # PDF pages 31-32 + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=31" + documentation = "Default covers modeled SSI liquid resources. Override with the CTS asset budget when it differs: include retirement assets, life insurance, nonhome real estate and vehicle equity after the one-vehicle equity exemption; exclude the home, approved burial assets, student loans and protected tax refunds. SSI recipients are excluded at the group calculation." def formula(person, period, parameters): return person("ssi_countable_resources", period.this_year) diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_dependent_care_deduction.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_dependent_care_deduction.py index 36db28171ad..82638d70a12 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_dependent_care_deduction.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_dependent_care_deduction.py @@ -7,7 +7,7 @@ class wi_cts_dependent_care_deduction(Variable): label = "Wisconsin CTS allowed dependent care deduction" definition_period = MONTH unit = USD - reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=31" documentation = "Childcare cost per care recipient. Override with verified work-related care costs or incapacitated-adult care, subject to Handbook 3.2.1.2.3 limits." def formula(person, period, parameters): diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_dependent_child.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_dependent_child.py index 9de78bbea93..c1a9cbcfadf 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_dependent_child.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_dependent_child.py @@ -6,8 +6,9 @@ class wi_cts_dependent_child(Variable): entity = Person label = "Wisconsin CTS dependent child" definition_period = MONTH - reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" - documentation = "Requires a natural or adopted child. Override or set child_excluded for divorced minors or nonqualifying step/other relationships; annulled marriages do not exclude a minor." + # PDF pages 18, 21 + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=18" + documentation = "Requires a natural or adopted child. Set wi_cts_child_excluded for married or divorced minors or nonqualifying step/other relationships; annulled marriages do not exclude a minor." def formula(person, period, parameters): p = parameters(period).gov.states.wi.dhs.ssp.cts @@ -17,8 +18,6 @@ def formula(person, period, parameters): & person("is_in_secondary_school", period.this_year) & person("wi_cts_graduates_before_19", period) ) - return ( - ((age < p.minor_age_limit) | older_student) - & (person.marital_unit.nb_persons() == 1) - & ~person("wi_cts_child_excluded", period) + return ((age < p.minor_age_limit) | older_student) & ~person( + "wi_cts_child_excluded", period ) diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_graduates_before_19.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_graduates_before_19.py index ab6d3bbbde7..06307dc03ac 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_graduates_before_19.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_graduates_before_19.py @@ -6,4 +6,4 @@ class wi_cts_graduates_before_19(Variable): entity = Person label = "Wisconsin CTS student expected to graduate before age 19" definition_period = MONTH - reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=21" diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_gross_income.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_gross_income.py index 99abf689f2f..e6e613194c9 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_gross_income.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_gross_income.py @@ -7,7 +7,8 @@ class wi_cts_gross_income(Variable): label = "Wisconsin CTS individual gross countable income" definition_period = MONTH unit = USD - reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" + # PDF pages 30-31 + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=30" documentation = "All child support is excluded. Override for income sources or deeming absent from the modeled SSI cash-income sources. SSI recipients are excluded from the filing unit." def formula(person, period, parameters): diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_large_group_net_income_limit.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_large_group_net_income_limit.py index 99413d804a0..33c9a0b23c1 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_large_group_net_income_limit.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_large_group_net_income_limit.py @@ -7,5 +7,5 @@ class wi_cts_large_group_net_income_limit(Variable): label = "Wisconsin CTS agency-verified large assistance group net income limit" definition_period = MONTH unit = USD - reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" - documentation = "Supply the agency-verified monthly net income limit, including any pregnancy allowance, when the assistance group has more than twelve people. The handbook publishes net limits only through size twelve. Zero means no verified limit has been supplied; the model cannot establish entitlement for that group." + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=64" + documentation = "Supply the agency-verified monthly net income limit, including any pregnancy allowance, for a filing unit larger than the published net income table. Zero means no verified limit has been supplied; the model cannot establish entitlement for that unit. A Buening subgroup larger than the table is likewise treated as unknown." diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_net_income.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_net_income.py index 1183ff8f2b2..ccc355ed109 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_net_income.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_net_income.py @@ -7,7 +7,7 @@ class wi_cts_net_income(Variable): label = "Wisconsin CTS individual net countable income" definition_period = MONTH unit = USD - reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=31" def formula(person, period, parameters): p = parameters(period).gov.states.wi.dhs.ssp.cts diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_nonfinancially_ineligible.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_nonfinancially_ineligible.py index f87ecb05a2d..9f837210c82 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_nonfinancially_ineligible.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_nonfinancially_ineligible.py @@ -6,5 +6,6 @@ class wi_cts_nonfinancially_ineligible(Variable): entity = Family label = "Wisconsin CTS family fails a procedural requirement" definition_period = MONTH - reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" + # PDF pages 22-28, 32 + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=22" documentation = "Includes unresolved child-support noncooperation without good cause, disqualifying divestment or lump-sum ineligibility, simultaneous W-2 participation, SSI fully recouped, or unverified residence/custody/SSN requirements. Child-specific kinship care or relationship exclusions use wi_cts_child_excluded." diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_part_time_student.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_part_time_student.py index d9f79c0a899..48ceabbdccd 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_part_time_student.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_part_time_student.py @@ -6,4 +6,4 @@ class wi_cts_part_time_student(Variable): entity = Person label = "Wisconsin CTS child attends school part time" definition_period = MONTH - reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=31" diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_payee.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_payee.py deleted file mode 100644 index d67278c0b86..00000000000 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_payee.py +++ /dev/null @@ -1,25 +0,0 @@ -from policyengine_us.model_api import * -from policyengine_us.variables.gov.states.wi.dhs.ssp._wi_cts import cts_relationships - - -class wi_cts_payee(Variable): - value_type = bool - entity = Person - label = "Wisconsin CTS designated SSI parent payee" - definition_period = MONTH - reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" - documentation = "One SSI parent receives the child award. Defaults to the first eligible parent in the family; override the agency-designated payee if different." - - def formula(person, period, parameters): - first, second, linked, receipt, _, _ = cts_relationships(person, period) - child = person("wi_cts_child_eligible", period) - parent_rows = np.concatenate((first[child], second[child])) - parent_mask = ( - np.bincount(parent_rows[parent_rows >= 0], minlength=person.count) > 0 - ) - candidate = ( - where(linked, parent_mask, person("is_parent", period.this_year)) & receipt - ) - index = np.arange(person.count) - first_payee = person.family.min(where(candidate, index, person.count)) - return candidate & (index == first_payee) diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_received_recently.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_received_recently.py index 438751aa02a..09d734da155 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_received_recently.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_received_recently.py @@ -6,4 +6,4 @@ class wi_cts_received_recently(Variable): entity = Person label = "Wisconsin CTS received in one of the previous four months" definition_period = MONTH - reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=31" diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_sfu_member.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_sfu_member.py index 87e392a963b..fb5b6e3eb38 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_sfu_member.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_sfu_member.py @@ -7,9 +7,10 @@ class wi_cts_sfu_member(Variable): entity = Person label = "Wisconsin CTS standard filing unit member before Buening" definition_period = MONTH - reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" - documentation = "Uses co-resident parent IDs to form the target-child sibling and parent group. Without parent links the family is treated as one nuclear family. Override for multigeneration, step-parent or other complex filing units; parent IDs do not distinguish natural/adoptive from step relationships." + # PDF pages 18, 30, 68-75 + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=18" + documentation = "Co-resident parent IDs group non-SSI dependent children who share a parent, with those parents, into separate filing units; an SSI child does not link its siblings. Without parent links the family is treated as one nuclear family. Override to remove a person from their unit, for example a step-parent: parent IDs do not distinguish natural or adoptive parents from step-parents. A person outside every unit cannot be added." def formula(person, period, parameters): - members, _ = cts_filing_unit(person, period) - return members + _, member, _ = cts_filing_unit(person, period) + return member diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_state_only_ssi_recipient.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_state_only_ssi_recipient.py deleted file mode 100644 index b5083c8e8e8..00000000000 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_state_only_ssi_recipient.py +++ /dev/null @@ -1,9 +0,0 @@ -from policyengine_us.model_api import * - - -class wi_cts_state_only_ssi_recipient(Variable): - value_type = bool - entity = Person - label = "Wisconsin CTS parent receives grandfathered state-only SSI" - definition_period = MONTH - reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssi_e.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssi_e.py index c85d4426ff6..b011abddf89 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssi_e.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssi_e.py @@ -10,13 +10,14 @@ class wi_ssi_e(Variable): defined_for = "wi_ssp_eligible" reference = ( "https://www.dhs.wisconsin.gov/dms/memos/ops/dms-ops-2026-12.pdf#page=2", - "https://docs.legis.wisconsin.gov/statutes/statutes/49.pdf#page=140", + "https://docs.legis.wisconsin.gov/document/statutes/49.77", "https://www.emhandbooks.wisconsin.gov/ssi-admin/3/3.1_state-only_ssi_recipients.htm", - "https://www.dhs.wisconsin.gov/publications/p20679-26-01.pdf#page=6", + # PDF pages 10, 13, 18 + "https://www.dhs.wisconsin.gov/publications/p20679-26-01.pdf#page=10", ) - # Grandfathered state-only awards remain outside this formula. Memo - # 2026-12 establishes a 10% increase to an existing April 2026 award. + # Grandfathered state-only awards remain outside this formula. DMS Operations + # Memo 26-12 establishes a 10% increase to an existing April 2026 award. # The references are unclear about a NEW SSI-E certification: whether # to add E to the protected regular award or recompute a combined # income budget, and how any historical floor or cap carries forward. @@ -25,8 +26,16 @@ class wi_ssi_e(Variable): def formula(person, period, parameters): p = parameters(period).gov.states.wi.dhs.ssp.exceptional_expense - certified = person("wi_ssi_e_certified", period) & person( - "wi_ssp_eligible", period + # Recipients in the "household of another" (one-third reduction) + # arrangement are not eligible for SSI-E (P-20679 3.1.1). + arrangement = person("ssi_federal_living_arrangement", period) + household_of_another = ( + arrangement == arrangement.possible_values.ANOTHER_PERSONS_HOUSEHOLD + ) + certified = ( + person("wi_ssi_e_certified", period) + & person("wi_ssp_eligible", period) + & ~household_of_another ) both = person.marital_unit.sum(certified) == 2 return certified * where(both, p.couple / 2, p.individual) diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssi_e_caregiver_id.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssi_e_caregiver_id.py deleted file mode 100644 index a29f2d35b15..00000000000 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssi_e_caregiver_id.py +++ /dev/null @@ -1,18 +0,0 @@ -from policyengine_us.model_api import * - - -class wi_ssi_e_caregiver_id(Variable): - value_type = int - entity = Person - label = "Person ID of the Wisconsin SSI-E home caregiver" - definition_period = YEAR - quantity_type = STOCK - default_value = 0 - reference = ( - "https://www.hud.gov/sites/dfiles/OCHCO/documents/2023-27pihn.pdf#page=81" - ) - # Nonzero person_id of the family member providing the qualifying home care. Zero - # means unknown. The caregiver must be a different person in the same household and - # assisted SPM unit (the HUD family). Use distinct person IDs within the household. - # This annual identifier is read without division in monthly calculations, like - # parent IDs. Within-year changes of caregiver require separate scenarios. diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssi_e_certified.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssi_e_certified.py index af3e21337dd..15d60b1c2e4 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssi_e_certified.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssi_e_certified.py @@ -7,4 +7,5 @@ class wi_ssi_e_certified(Variable): label = "Certified for Wisconsin SSI Exceptional Expense Supplement" documentation = "County certification is effective in the requested month and ongoing SSI-E care requirements are met. Certification incorporates care needs, costs, approved placement or in-home services, and household support availability." definition_period = MONTH - reference = "https://www.dhs.wisconsin.gov/publications/p20679-26-01.pdf" + # PDF pages 7, 13 + reference = "https://www.dhs.wisconsin.gov/publications/p20679-26-01.pdf#page=7" diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssi_e_for_home_care.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssi_e_for_home_care.py index 789849e518b..4ed4dae509d 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssi_e_for_home_care.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssi_e_for_home_care.py @@ -4,14 +4,14 @@ class wi_ssi_e_for_home_care(Variable): value_type = bool entity = Person - label = "Wisconsin SSI-E pays for care in the assisted home" + label = "Wisconsin SSI-E pays for family-member care in the assisted home" definition_period = MONTH reference = ( + "https://www.law.cornell.edu/cfr/text/24/5.609", "https://www.hud.gov/sites/dfiles/OCHCO/documents/2023-27pihn.pdf#page=81", "https://www.dhs.wisconsin.gov/publications/p20679-26-01.pdf#page=13", ) - # The certified SSI-E payment funds care enabling this disabled person to remain in - # the family's assisted natural home. False for a substitute-care or facility award, - # or care for someone outside the assisted family. Certification alone does not - # establish this purpose. Identify the co-resident family caregiver with - # wi_ssi_e_caregiver_id. + # The certified SSI-E payment funds care, provided by a member of the assisted + # family, that enables this disabled person to remain in the family's assisted + # unit (24 CFR 5.609(b)(19)). False for a substitute-care or facility award, care + # by someone outside the assisted family, or certification alone. diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp.py index f16a34df54d..9b56ef8c5df 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp.py @@ -8,5 +8,8 @@ class wi_ssp(Variable): definition_period = MONTH unit = USD defined_for = StateCode.WI - reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf" + reference = ( + "https://www.emhandbooks.wisconsin.gov/ssi-admin/2/2.1_federal_and_state_ssi_recipients.htm", + "https://www.dhs.wisconsin.gov/dms/memos/ops/dms-ops-2026-12.pdf#page=2", + ) adds = ["wi_ssp_regular", "wi_ssi_e", "wi_cts"] diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_countable_for_hud.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_countable_for_hud.py index 8545adfaf26..bbee18bf5c5 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_countable_for_hud.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_countable_for_hud.py @@ -1,7 +1,4 @@ from policyengine_us.model_api import * -from policyengine_us.variables.household.demographic.person._parent_links import ( - household_member_indices, -) class wi_ssp_countable_for_hud(Variable): @@ -13,35 +10,26 @@ class wi_ssp_countable_for_hud(Variable): defined_for = StateCode.WI reference = ( "https://www.law.cornell.edu/cfr/text/24/5.609", + "https://www.dhs.wisconsin.gov/publications/p20679-26-01.pdf#page=24", "https://www.hud.gov/sites/dfiles/OCHCO/documents/2023-27pihn.pdf#page=81", + # PDF pages 3-4 "https://www.hud.gov/sites/dfiles/OCHCO/documents/2024-38pihn.pdf#page=3", ) def formula(person, period, parameters): - caregiver_id = person("wi_ssi_e_caregiver_id", period.this_year) - person_id = person("person_id", period.this_year) - own_row = np.arange(person.count) - hud_family = person.spm_unit.reference_entity.members_entity_id - matches = np.zeros(person.count, dtype=int) - family_caregiver = np.zeros(person.count, dtype=bool) - for member in household_member_indices(person): - named = ( - (member >= 0) - & (caregiver_id != 0) - & (caregiver_id == person_id[member]) - ) - matches = matches + named - family_caregiver = family_caregiver | ( - named & (member != own_row) & (hud_family[member] == hud_family) - ) - disabled = person("is_disabled", period.this_year) | person( - "is_blind", period.this_year + # Source conflict: SSI-E Handbook 4.1.1 counts SSI-E; 24 CFR 5.609(b)(19) + # governs. + # HUD person with disabilities (42 U.S.C. 1437a(b)(3)(E)), as in + # is_hud_elderly_disabled_family, plus blindness. + disabled = ( + person("is_disabled", period.this_year) + | person("is_ssi_disabled", period.this_year) + | (person("social_security_disability", period) > 0) + | person("is_blind", period.this_year) ) - qualifies = ( + excluded = ( disabled & person("wi_ssi_e_for_home_care", period) & ~person("ssi_lives_in_medical_treatment_facility", period) - & (matches == 1) - & family_caregiver ) - return person("wi_ssp", period) - qualifies * person("wi_ssi_e", period) + return person("wi_ssp", period) - excluded * person("wi_ssi_e", period) diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_eligible.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_eligible.py index b0a49dc4e1d..2dae649a7c3 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_eligible.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_eligible.py @@ -7,18 +7,18 @@ class wi_ssp_eligible(Variable): label = "Eligible for Wisconsin State SSI Supplement" definition_period = MONTH defined_for = StateCode.WI - reference = "https://www.emhandbooks.wisconsin.gov/ssi-admin/2/2.1_federal_and_state_ssi_recipients.htm" + reference = ( + "https://docs.legis.wisconsin.gov/document/statutes/49.77", + "https://www.emhandbooks.wisconsin.gov/ssi-admin/2/2.1_federal_and_state_ssi_recipients.htm", + ) def formula(person, period, parameters): # This models federal-linked recipients. Grandfathered state-only # recipients can qualify without federal SSI; their protected award # and unresolved new SSI-E certification budget are documented in # wi_ssi_e rather than inferred from the ordinary payment schedule. + receives_ssi = (person("ssi", period) > 0) | person("receives_ssi", period) institutional = person("ssi_lives_in_medical_treatment_facility", period) continuation = person("wi_ssp_institutional_continuation", period) incarcerated = person("is_incarcerated", period) - return ( - (person("ssi", period) > 0) - & ~incarcerated - & (~institutional | continuation) - ) + return receives_ssi & ~incarcerated & (~institutional | continuation) diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_regular.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_regular.py index a9a3fa02dfd..33bc63b0c1e 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_regular.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_regular.py @@ -11,13 +11,19 @@ class wi_ssp_regular(Variable): definition_period = MONTH unit = USD defined_for = "wi_ssp_eligible" - reference = "https://www.dhs.wisconsin.gov/dms/memos/ops/dms-ops-2026-12.pdf" + reference = "https://www.dhs.wisconsin.gov/dms/memos/ops/dms-ops-2026-12.pdf#page=2" def formula(person, period, parameters): p = parameters(period).gov.states.wi.dhs.ssp eligible = person("wi_ssp_eligible", period) eligible_couple = person.marital_unit.sum(eligible) == 2 - has_spouse = person.marital_unit.nb_persons() == 2 + # The one-eligible-spouse rate requires an SSI-ineligible spouse. A spouse + # who is SSI-eligible but excluded from the state payment leaves the + # recipient on the individual rate. + ineligible_spouse = person("is_ssi_ineligible_spouse", period.this_year) + has_ineligible_spouse = ( + person.marital_unit.sum(ineligible_spouse) - ineligible_spouse + ) > 0 arrangement = person("ssi_federal_living_arrangement", period) other_household = ( arrangement == SSIFederalLivingArrangement.ANOTHER_PERSONS_HOUSEHOLD @@ -27,9 +33,8 @@ def formula(person, period, parameters): p.amount.ineligible_spouse_other_household, p.amount.ineligible_spouse_independent, ) - base = select( - [eligible_couple, has_spouse], + return select( + [eligible_couple, has_ineligible_spouse], [p.amount.couple / 2, with_ineligible_spouse], default=p.amount.individual, ) - return base 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 f1833319692..3f119ea39ef 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 @@ -22,7 +22,7 @@ def formula(spm_unit, period, parameters): "ky_ssp", # Kentucky benefits "de_ssp", # Delaware benefits "fl_oss", - "wi_ssp", + "wi_ssp", # Wisconsin benefits "ks_sspp", # Kansas benefits "hi_oss", "la_oss", # Louisiana benefits From 0e2793d08fc07be3ad0a99ddf944d74c8c2943f6 Mon Sep 17 00:00:00 2001 From: Ziming Date: Thu, 15 Oct 2026 19:24:23 -0400 Subject: [PATCH 4/4] Address review: Wisconsin CTS descriptions, inputs, care cap and tests Co-Authored-By: Claude Opus 5.5 --- changelog.d/wi-ssp-2026.fixed.md | 1 + .../wi/dhs/ssp/cts/additional_child.yaml | 2 +- .../wi/dhs/ssp/cts/area_i_counties.yaml | 2 +- .../wi/dhs/ssp/cts/care_other_limit.yaml | 2 +- .../states/wi/dhs/ssp/cts/care_young_age.yaml | 2 +- .../wi/dhs/ssp/cts/care_young_limit.yaml | 2 +- .../states/wi/dhs/ssp/cts/earned_flat.yaml | 2 +- .../wi/dhs/ssp/cts/earned_fraction.yaml | 2 +- .../states/wi/dhs/ssp/cts/first_child.yaml | 2 +- .../states/wi/dhs/ssp/cts/gross/area_1.yaml | 4 +- .../states/wi/dhs/ssp/cts/gross/area_2.yaml | 4 +- .../wi/dhs/ssp/cts/gross_additional.yaml | 2 +- .../wi/dhs/ssp/cts/gross_pregnant/area_1.yaml | 4 +- .../wi/dhs/ssp/cts/gross_pregnant/area_2.yaml | 4 +- .../wi/dhs/ssp/cts/minor_age_limit.yaml | 2 +- .../gov/states/wi/dhs/ssp/cts/net/area_1.yaml | 4 +- .../gov/states/wi/dhs/ssp/cts/net/area_2.yaml | 4 +- .../wi/dhs/ssp/cts/pregnancy_allowance.yaml | 2 +- .../states/wi/dhs/ssp/cts/resource_limit.yaml | 2 +- .../wi/dhs/ssp/cts/student_age_limit.yaml | 2 +- .../wi/dhs/ssp/cts/student_hours_limit.yaml | 2 +- .../states/wi/dhs/ssp/cts/work_expense.yaml | 2 +- policyengine_us/programs.yaml | 4 +- .../wi/dcf/works/wi_works_eligible.yaml | 62 +++ .../gov/states/wi/dhs/ssp/wi_cts.yaml | 426 +++++++++++++++--- .../gov/states/wi/dhs/ssp/_wi_cts.py | 28 +- .../gov/states/wi/dhs/ssp/wi_cts_area_i.py | 5 +- .../wi/dhs/ssp/wi_cts_buening_member.py | 2 +- .../wi/dhs/ssp/wi_cts_caretaker_children.py | 2 +- .../wi/dhs/ssp/wi_cts_child_eligible.py | 7 +- .../dhs/ssp/wi_cts_countable_earned_income.py | 39 ++ .../wi/dhs/ssp/wi_cts_countable_resources.py | 6 +- .../ssp/wi_cts_dependent_care_deduction.py | 8 +- .../states/wi/dhs/ssp/wi_cts_gross_income.py | 2 +- .../states/wi/dhs/ssp/wi_cts_net_income.py | 28 +- .../ssp/wi_cts_other_countable_resources.py | 14 + ...cts_other_qualifying_immigration_status.py | 12 + .../states/wi/dhs/ssp/wi_cts_sfu_member.py | 2 +- .../states/wi/dhs/ssp/wi_cts_tribal_area_i.py | 11 + .../wi/dhs/ssp/wi_ssp_countable_for_snap.py | 1 + .../gov/states/wi/dhs/ssp/wi_ssp_regular.py | 5 +- 41 files changed, 583 insertions(+), 136 deletions(-) create mode 100644 changelog.d/wi-ssp-2026.fixed.md create mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_countable_earned_income.py create mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_other_countable_resources.py create mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_other_qualifying_immigration_status.py create mode 100644 policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_tribal_area_i.py diff --git a/changelog.d/wi-ssp-2026.fixed.md b/changelog.d/wi-ssp-2026.fixed.md new file mode 100644 index 00000000000..2797f23e6da --- /dev/null +++ b/changelog.d/wi-ssp-2026.fixed.md @@ -0,0 +1 @@ +Make Wisconsin Works (W-2) units ineligible when every custodial parent receives SSI, under Wis. Stat. 49.145(2)(i); a custodial parent not on SSI can still qualify. diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/additional_child.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/additional_child.yaml index 48b649767d8..9f9d42d0bd7 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/additional_child.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/additional_child.yaml @@ -1,4 +1,4 @@ -description: Wisconsin uses this amount as its Caretaker Supplement additional eligible child benefit. +description: Wisconsin provides this amount as the monthly payment for each additional eligible child under the Caretaker Supplement program. values: 2026-01-01: 165 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/area_i_counties.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/area_i_counties.yaml index 3ab8dd53f54..a252539a97c 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/area_i_counties.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/area_i_counties.yaml @@ -1,4 +1,4 @@ -description: Wisconsin uses Area I Caretaker Supplement income limits in these counties. +description: Wisconsin applies the Area I income limits in these counties under the Caretaker Supplement program. values: 2026-01-01: - BROWN_COUNTY_WI diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_other_limit.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_other_limit.yaml index c8bd26e176b..b43dd2974fd 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_other_limit.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_other_limit.yaml @@ -1,4 +1,4 @@ -description: Wisconsin uses this amount as its Caretaker Supplement older child care deduction limit. +description: Wisconsin limits the dependent care deduction to this monthly amount for each older child and each incapacitated adult under the Caretaker Supplement program. values: 2026-01-01: 175 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_young_age.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_young_age.yaml index 460b6063516..799f27f4f1a 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_young_age.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_young_age.yaml @@ -1,4 +1,4 @@ -description: Wisconsin uses this amount as its Caretaker Supplement young child care age limit. +description: Wisconsin applies the higher dependent care deduction to children below this age under the Caretaker Supplement program. values: 2026-01-01: 2 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_young_limit.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_young_limit.yaml index 4e89dfb7562..f5fa63dfb27 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_young_limit.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/care_young_limit.yaml @@ -1,4 +1,4 @@ -description: Wisconsin uses this amount as its Caretaker Supplement young child care deduction limit. +description: Wisconsin limits the dependent care deduction to this monthly amount for each young child under the Caretaker Supplement program. values: 2026-01-01: 200 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/earned_flat.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/earned_flat.yaml index 1dde618c3dc..629d34646b2 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/earned_flat.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/earned_flat.yaml @@ -1,4 +1,4 @@ -description: Wisconsin uses this amount as its Caretaker Supplement additional flat earned income disregard. +description: Wisconsin disregards this amount of monthly earned income, after the work expense deduction, under the Caretaker Supplement program. values: 2026-01-01: 30 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/earned_fraction.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/earned_fraction.yaml index adfad42c710..17417d37cf9 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/earned_fraction.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/earned_fraction.yaml @@ -1,4 +1,4 @@ -description: Wisconsin uses this amount as its Caretaker Supplement additional earned income disregard fraction. +description: Wisconsin disregards this share of remaining earned income under the Caretaker Supplement program. values: 2026-01-01: 0.3333333333333333 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/first_child.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/first_child.yaml index e911ba5c67b..32ea86d3a84 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/first_child.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/first_child.yaml @@ -1,4 +1,4 @@ -description: Wisconsin uses this amount as its Caretaker Supplement first eligible child benefit. +description: Wisconsin provides this amount as the monthly payment for the first eligible child under the Caretaker Supplement program. values: 2026-01-01: 275 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross/area_1.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross/area_1.yaml index f573837acd8..b777800e0bf 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross/area_1.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross/area_1.yaml @@ -1,9 +1,9 @@ -description: Wisconsin sets these Caretaker Supplement gross income limits for Area 1. +description: Wisconsin limits monthly gross income to these amounts by assistance group size in Area I counties under the Caretaker Supplement program. metadata: unit: currency-USD period: month - label: Wisconsin CTS Area 1 gross limits + label: Wisconsin CTS Area I gross income limits type: single_amount threshold_unit: person amount_unit: currency-USD diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross/area_2.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross/area_2.yaml index 0fe2cd2c100..09d041e2151 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross/area_2.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross/area_2.yaml @@ -1,9 +1,9 @@ -description: Wisconsin sets these Caretaker Supplement gross income limits for Area 2. +description: Wisconsin limits monthly gross income to these amounts by assistance group size in Area II counties under the Caretaker Supplement program. metadata: unit: currency-USD period: month - label: Wisconsin CTS Area 2 gross limits + label: Wisconsin CTS Area II gross income limits type: single_amount threshold_unit: person amount_unit: currency-USD diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_additional.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_additional.yaml index bd092ac6a37..2ec92ae4b77 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_additional.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_additional.yaml @@ -1,4 +1,4 @@ -description: Wisconsin uses this amount as its Caretaker Supplement gross income limit increase beyond the table. +description: Wisconsin raises the gross income limit by this amount for each person beyond the largest group size in the income tables under the Caretaker Supplement program. values: 2026-01-01: 25 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_pregnant/area_1.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_pregnant/area_1.yaml index a846c2cc1bc..0192aff269e 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_pregnant/area_1.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_pregnant/area_1.yaml @@ -1,9 +1,9 @@ -description: Wisconsin sets these Caretaker Supplement gross pregnant income limits for Area 1. +description: Wisconsin limits the monthly gross income of an assistance group with a pregnant woman to these amounts, which include one pregnancy allowance, by group size in Area I counties under the Caretaker Supplement program. metadata: unit: currency-USD period: month - label: Wisconsin CTS Area 1 gross income limits with pregnancy allowance + label: Wisconsin CTS Area I gross income limits with pregnancy allowance type: single_amount threshold_unit: person amount_unit: currency-USD diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_pregnant/area_2.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_pregnant/area_2.yaml index 82e3b6ab60e..34f7761d913 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_pregnant/area_2.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/gross_pregnant/area_2.yaml @@ -1,9 +1,9 @@ -description: Wisconsin sets these Caretaker Supplement gross pregnant income limits for Area 2. +description: Wisconsin limits the monthly gross income of an assistance group with a pregnant woman to these amounts, which include one pregnancy allowance, by group size in Area II counties under the Caretaker Supplement program. metadata: unit: currency-USD period: month - label: Wisconsin CTS Area 2 gross income limits with pregnancy allowance + label: Wisconsin CTS Area II gross income limits with pregnancy allowance type: single_amount threshold_unit: person amount_unit: currency-USD diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/minor_age_limit.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/minor_age_limit.yaml index d1caf37de54..f824b99c3a5 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/minor_age_limit.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/minor_age_limit.yaml @@ -1,4 +1,4 @@ -description: Wisconsin uses this amount as its Caretaker Supplement minor age limit. +description: Wisconsin treats children younger than this age as minors under the Caretaker Supplement program. values: 2026-01-01: 18 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/net/area_1.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/net/area_1.yaml index 714dda299da..a8c0579e1d6 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/net/area_1.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/net/area_1.yaml @@ -1,9 +1,9 @@ -description: Wisconsin sets these Caretaker Supplement net income limits for Area 1. +description: Wisconsin limits monthly net income (the assistance standard) to these amounts by assistance group size in Area I counties under the Caretaker Supplement program. metadata: unit: currency-USD period: month - label: Wisconsin CTS Area 1 net limits + label: Wisconsin CTS Area I net income limits type: single_amount threshold_unit: person amount_unit: currency-USD diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/net/area_2.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/net/area_2.yaml index b084a885c69..e866b52fe9a 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/net/area_2.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/net/area_2.yaml @@ -1,9 +1,9 @@ -description: Wisconsin sets these Caretaker Supplement net income limits for Area 2. +description: Wisconsin limits monthly net income (the assistance standard) to these amounts by assistance group size in Area II counties under the Caretaker Supplement program. metadata: unit: currency-USD period: month - label: Wisconsin CTS Area 2 net limits + label: Wisconsin CTS Area II net income limits type: single_amount threshold_unit: person amount_unit: currency-USD diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/pregnancy_allowance.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/pregnancy_allowance.yaml index e3a53eacdd7..3a1fbcf1b77 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/pregnancy_allowance.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/pregnancy_allowance.yaml @@ -1,4 +1,4 @@ -description: Wisconsin uses this amount as its Caretaker Supplement income limit allowance for each pregnant woman. +description: Wisconsin raises the net income limit by this amount for each pregnant woman, and the gross income limit for each pregnant woman after the first, under the Caretaker Supplement program. values: 2026-01-01: 71 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/resource_limit.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/resource_limit.yaml index 7f21806708b..fd10803782c 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/resource_limit.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/resource_limit.yaml @@ -1,4 +1,4 @@ -description: Wisconsin uses this amount as its Caretaker Supplement resource limit. +description: Wisconsin limits the countable assets of the assistance group to this amount under the Caretaker Supplement program. values: 2026-01-01: 1_000 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/student_age_limit.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/student_age_limit.yaml index e4564dd49f8..ea75ea2daee 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/student_age_limit.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/student_age_limit.yaml @@ -1,4 +1,4 @@ -description: Wisconsin uses this amount as its Caretaker Supplement dependent student age limit. +description: Wisconsin counts a high school student who is expected to graduate before this age as a dependent child under the Caretaker Supplement program. values: 2026-01-01: 19 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/student_hours_limit.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/student_hours_limit.yaml index 50b6970e7e8..1f09a6d006c 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/student_hours_limit.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/student_hours_limit.yaml @@ -1,4 +1,4 @@ -description: Wisconsin uses this amount as its Caretaker Supplement part-time student weekly work limit. +description: Wisconsin exempts a continuing part-time student's earnings when weekly work hours are below this number under the Caretaker Supplement program. values: 2026-01-01: 30 diff --git a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/work_expense.yaml b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/work_expense.yaml index 124068421bb..ca884ad4540 100644 --- a/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/work_expense.yaml +++ b/policyengine_us/parameters/gov/states/wi/dhs/ssp/cts/work_expense.yaml @@ -1,4 +1,4 @@ -description: Wisconsin uses this amount as its Caretaker Supplement work expense deduction. +description: Wisconsin deducts this amount from the monthly earned income of each employed or self-employed person under the Caretaker Supplement program. values: 2026-01-01: 90 diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index bf63d2cf0f5..345077ff9a2 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -1100,7 +1100,9 @@ programs: notes: >- Models 2026 regular State SSI Supplement, certified Exceptional Expense (SSI-E) and Caretaker Supplement payments, including the May - 2026 increase. Grandfathered state-only SSI recipients are not modeled. + 2026 regular and SSI-E rate increase. Grandfathered state-only SSI recipients are not modeled; + without parent IDs the Caretaker Supplement pays one SSI parent per + family, and groups over 12 need a supplied net income limit. - id: social_security name: Social Security diff --git a/policyengine_us/tests/policy/baseline/gov/states/wi/dcf/works/wi_works_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/wi/dcf/works/wi_works_eligible.yaml index e697725808d..9c07a3758da 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/wi/dcf/works/wi_works_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/wi/dcf/works/wi_works_eligible.yaml @@ -227,3 +227,65 @@ # The grandmother is the parent of an adult, not a custodial parent of # a dependent child; the only custodial parent receives SSI. wi_works_eligible: false + +- name: Case 12, Without parent IDs a parent on SSI cannot receive W-2. + period: 2026-01 + input: + people: + person1: + age: 30 + is_disabled: true + ssi: 994 + own_children_in_household: 1 + person2: + age: 3 + ssi: 0 + marital_units: + parent: + members: [person1] + child: + members: [person2] + spm_units: + unit: + members: [person1, person2] + wi_works_income_eligible: true + wi_works_resources_eligible: true + households: + household: + members: [person1, person2] + state_code: WI + output: + # No member has a parent ID, as in microsimulation, so every parent + # (own_children_in_household > 0) counts as custodial. The only + # custodial parent receives SSI (Wis. Stat. 49.145(2)(i)). + wi_works_eligible: false + +- name: Case 13, Without parent IDs a parent not on SSI remains W-2 eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + ssi: 0 + own_children_in_household: 1 + person2: + age: 3 + ssi: 0 + marital_units: + parent: + members: [person1] + child: + members: [person2] + spm_units: + unit: + members: [person1, person2] + wi_works_income_eligible: true + wi_works_resources_eligible: true + households: + household: + members: [person1, person2] + state_code: WI + output: + # The same fallback parent does not receive SSI, so the exclusion + # does not apply. + wi_works_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_cts.yaml b/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_cts.yaml index f6066dc6475..79ba6e6d362 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_cts.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/wi/dhs/ssp/wi_cts.yaml @@ -7,7 +7,6 @@ age: 40 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 8 person_id: 2 @@ -37,7 +36,6 @@ age: 40 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 8 person_id: 2 @@ -79,7 +77,6 @@ age: 40 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 8 person_id: 2 @@ -110,7 +107,6 @@ age: 40 person_id: 1 ssi: 0 - wi_ssp_regular: 0 social_security_disability: 12_000 person2: age: 8 @@ -176,7 +172,6 @@ age: 40 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 18 person_id: 2 @@ -207,7 +202,6 @@ age: 40 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 18 person_id: 2 @@ -239,7 +233,6 @@ age: 40 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 19 person_id: 2 @@ -271,7 +264,6 @@ age: 40 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 8 person_id: 2 @@ -302,7 +294,6 @@ age: 40 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 8 person_id: 2 @@ -333,7 +324,6 @@ age: 40 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 8 person_id: 2 @@ -364,7 +354,6 @@ age: 40 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 8 person_id: 2 @@ -398,7 +387,6 @@ # or 628.33 a month. SSI countable earnings = (628.33 - 20 - 65) / 2 # = 271.67, so SSI = 994 - 271.67 = 722.33. ssi: 722.33 - wi_ssp_regular: 83.78 employment_income: 7_540 # Below the $2,000 SSI resource limit, above the $1,000 CTS limit. ssi_countable_resources: 1_500 @@ -434,12 +422,11 @@ age: 40 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 8 person_id: 2 parent_1_id: 1 - wi_cts_countable_resources: 1_000 + bank_account_assets: 1_000 marital_units: parent: members: [person1] @@ -465,12 +452,11 @@ age: 40 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 8 person_id: 2 parent_1_id: 1 - wi_cts_countable_resources: 1_001 + bank_account_assets: 1_001 marital_units: parent: members: [person1] @@ -496,7 +482,6 @@ age: 40 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 16 person_id: 2 @@ -529,7 +514,6 @@ age: 40 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 16 person_id: 2 @@ -561,7 +545,6 @@ age: 40 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 16 person_id: 2 @@ -597,7 +580,6 @@ age: 40 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 16 person_id: 2 @@ -631,7 +613,6 @@ age: 40 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 17 person_id: 2 @@ -667,7 +648,6 @@ age: 40 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 8 person_id: 2 @@ -703,7 +683,6 @@ age: 40 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 8 person_id: 2 @@ -712,8 +691,7 @@ person3: age: 40 person_id: 20 - ssi: 745.5 - wi_ssp_regular: 66.03 + ssi: 994 marital_units: parent: members: [person1] @@ -741,7 +719,6 @@ age: 40 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 8 person_id: 2 @@ -771,7 +748,6 @@ age: 40 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 8 person_id: 2 @@ -802,7 +778,6 @@ age: 40 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 8 person_id: 2 @@ -833,7 +808,6 @@ age: 40 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 10 person_id: 2 @@ -877,7 +851,6 @@ age: 40 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 10 person_id: 2 @@ -921,7 +894,6 @@ age: 40 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 16 person_id: 2 @@ -962,7 +934,6 @@ age: 40 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 8 person_id: 2 @@ -993,12 +964,11 @@ age: 40 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 8 person_id: 2 parent_1_id: 1 - wi_cts_countable_resources: 1_001 + bank_account_assets: 1_001 marital_units: parent: members: [person1] @@ -1024,7 +994,6 @@ age: 40 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 8 person_id: 2 @@ -1126,7 +1095,6 @@ age: 40 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 8 person_id: 2 @@ -1229,12 +1197,10 @@ age: 38 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 36 person_id: 2 ssi: 994 - wi_ssp_regular: 83.78 person3: age: 12 person_id: 3 @@ -1285,14 +1251,12 @@ person1: age: 38 person_id: 1 - # SSI couple: 1,491 / 2 = 745.50 each; SSP couple: 132.05 / 2. + # SSI couple: 1,491 / 2 = 745.50 each. ssi: 745.5 - wi_ssp_regular: 66.025 person2: age: 36 person_id: 2 ssi: 745.5 - wi_ssp_regular: 66.025 person3: age: 12 person_id: 3 @@ -1339,12 +1303,10 @@ age: 36 person_id: 2 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 38 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person3: age: 6 person_id: 4 @@ -1394,12 +1356,10 @@ age: 38 person_id: 1 ssi: 745.5 - wi_ssp_regular: 66.025 person2: age: 36 person_id: 2 ssi: 745.5 - wi_ssp_regular: 66.025 person3: age: 12 person_id: 3 @@ -1449,12 +1409,10 @@ age: 38 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 36 person_id: 2 ssi: 994 - wi_ssp_regular: 83.78 person3: age: 12 person_id: 3 @@ -1504,7 +1462,6 @@ age: 40 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 16 person_id: 2 @@ -1555,7 +1512,6 @@ age: 40 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 8 person_id: 2 @@ -1588,7 +1544,6 @@ age: 40 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 8 person_id: 2 @@ -1615,7 +1570,6 @@ age: 40 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 17 person_id: 2 @@ -1655,7 +1609,6 @@ person1: age: 34 ssi: 994 - wi_ssp_regular: 83.78 own_children_in_household: 2 person2: age: 9 @@ -1694,7 +1647,6 @@ age: 45 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 18 person_id: 2 @@ -1739,7 +1691,6 @@ age: 42 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 16 person_id: 2 @@ -1786,7 +1737,6 @@ age: 38 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 17 person_id: 2 @@ -1832,7 +1782,6 @@ age: 40 person_id: 1 ssi: 994 - wi_ssp_regular: 83.78 person2: age: 10 person_id: 2 @@ -1873,3 +1822,368 @@ # stay in the group. Group of 3: gross 200 + 500 = 700 <= 1,197; net # 700 - 85 = 615 <= 647, so Mary gets $275 for Jill. wi_cts: [275, 0, 0, 0] + +- name: Case 47, Incarcerated child of an SSI parent is not eligible. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + person_id: 1 + ssi: 994 + person2: + age: 16 + person_id: 2 + parent_1_id: 1 + is_incarcerated: true + marital_units: + parent: + members: [person1] + child0: + members: [person2] + families: + unit: + members: [person1, person2] + households: + home: + members: [person1, person2] + state_code: WI + county: DANE_COUNTY_WI + output: + # Handbook 3.1.6: a person incarcerated in jail or prison is not in a + # CTS qualified living arrangement. Without is_incarcerated the parent + # would receive $275 for this child, as in Case 1. + wi_cts_child_eligible: [false, false] + wi_cts: [0, 0] + # The parent keeps the January 2026 individual rate only. + wi_ssp: [83.78, 0] + +- name: Case 48, Additional one-third disregard input gives an 18-year-old senior 30 dollars and one-third. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + person_id: 1 + ssi: 994 + person2: + age: 18 + person_id: 2 + parent_1_id: 1 + is_in_secondary_school: true + wi_cts_graduates_before_19: true + wi_cts_additional_fraction_disregard: true + # 20 hours a week at the $7.25 minimum wage: 7.25 * 20 * 52 = 7,540. + employment_income: 7_540 + person3: + age: 14 + person_id: 3 + parent_1_id: 1 + marital_units: + parent: + members: [person1] + child0: + members: [person2] + child1: + members: [person3] + families: + unit: + members: [person1, person2, person3] + households: + home: + members: [person1, person2, person3] + state_code: WI + county: DANE_COUNTY_WI + output: + # An 18-year-old is not a continuing minor, so only the input applies + # $30 and one-third: 7,540 / 12 = 628.33; + # (628.33 - 90 - 30) * (1 - 1/3) = 508.33 * 2 / 3 = 338.89. + wi_cts_net_income: [0, 338.89, 0] + # Size 2: gross 628.33 <= 1,018 and net 338.89 <= 550, so 275 + 165. + wi_cts: [440, 0, 0] + # 83.78 + 440 = 523.78. + wi_ssp: [523.78, 0, 0] + +- name: Case 49, Dependent care deduction cannot reduce unearned income when no one in the group works. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + person_id: 1 + ssi: 994 + person2: + age: 10 + person_id: 2 + parent_1_id: 1 + # 600 a month. + social_security_survivors: 7_200 + person3: + age: 1 + person_id: 3 + parent_1_id: 1 + # 600 a month. + pre_subsidy_childcare_expenses: 7_200 + marital_units: + parent: + members: [person1] + child0: + members: [person2] + child1: + members: [person3] + families: + unit: + members: [person1, person2, person3] + households: + home: + members: [person1, person2, person3] + state_code: WI + county: DANE_COUNTY_WI + output: + wi_cts_dependent_care_deduction: [0, 0, 200] + wi_cts_net_income: [0, 600, 0] + # Size 2, Area I: gross 600 <= 1,018. No earned income absorbs the care + # deduction (45 CFR 233.20(a)(11)(i)(D)), so net 600 > 550. + wi_cts: [0, 0, 0] + +- name: Case 50, Tribal Area I input for one household leaves the other household's area unchanged. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + person_id: 1 + ssi: 994 + person2: + age: 16 + person_id: 2 + parent_1_id: 1 + person3: + age: 40 + person_id: 3 + ssi: 994 + person4: + age: 16 + person_id: 4 + parent_1_id: 3 + marital_units: + parent1: + members: [person1] + child1: + members: [person2] + parent2: + members: [person3] + child2: + members: [person4] + families: + family1: + members: [person1, person2] + family2: + members: [person3, person4] + spm_units: + unit1: + members: [person1, person2] + unit2: + members: [person3, person4] + tax_units: + tax_unit1: + members: [person1, person2] + tax_unit2: + members: [person3, person4] + households: + home1: + members: [person1, person2] + state_code: WI + county: PORTAGE_COUNTY_WI + wi_cts_tribal_area_i: true + home2: + members: [person3, person4] + state_code: WI + county: MILWAUKEE_COUNTY_WI + output: + # Portage is Area II, so home1 needs the tribal input; Milwaukee is an + # Area I county by formula. + wi_cts_area_i: [true, true, true, true] + wi_cts: [275, 0, 275, 0] + +- name: Case 51, Other qualifying status for one child does not reset a citizen sibling or another family. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + person_id: 1 + ssi: 994 + person2: + age: 10 + person_id: 2 + parent_1_id: 1 + immigration_status: UNDOCUMENTED + wi_cts_other_qualifying_immigration_status: true + person3: + age: 6 + person_id: 3 + parent_1_id: 1 + person4: + age: 40 + person_id: 4 + ssi: 994 + person5: + age: 8 + person_id: 5 + parent_1_id: 4 + marital_units: + parent1: + members: [person1] + child1: + members: [person2] + child2: + members: [person3] + parent2: + members: [person4] + child3: + members: [person5] + families: + family1: + members: [person1, person2, person3] + family2: + members: [person4, person5] + spm_units: + unit1: + members: [person1, person2, person3] + unit2: + members: [person4, person5] + tax_units: + tax_unit1: + members: [person1, person2, person3] + tax_unit2: + members: [person4, person5] + households: + home1: + members: [person1, person2, person3] + state_code: WI + county: DANE_COUNTY_WI + home2: + members: [person4, person5] + state_code: WI + county: DANE_COUNTY_WI + output: + # The enum has no PRUCOL value. This child has approved PRUCOL evidence + # (Handbook 3.1.4 item 4), for example an indefinite stay of + # deportation, so the input makes the child eligible; the citizen + # sibling and the second family keep the formula. + wi_cts_child_eligible: [false, true, true, false, true] + # 275 + 165 = 440 for the first family; 275 for the second. + wi_cts: [440, 0, 0, 275, 0] + +- name: Case 52, Other countable resources for one child do not reset another family's bank balance. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + person_id: 1 + ssi: 994 + person2: + age: 8 + person_id: 2 + parent_1_id: 1 + wi_cts_other_countable_resources: 500 + person3: + age: 40 + person_id: 3 + ssi: 994 + person4: + age: 8 + person_id: 4 + parent_1_id: 3 + bank_account_assets: 1_500 + marital_units: + parent1: + members: [person1] + child1: + members: [person2] + parent2: + members: [person3] + child2: + members: [person4] + families: + family1: + members: [person1, person2] + family2: + members: [person3, person4] + spm_units: + unit1: + members: [person1, person2] + unit2: + members: [person3, person4] + tax_units: + tax_unit1: + members: [person1, person2] + tax_unit2: + members: [person3, person4] + households: + home1: + members: [person1, person2] + state_code: WI + county: DANE_COUNTY_WI + home2: + members: [person3, person4] + state_code: WI + county: DANE_COUNTY_WI + output: + # 500 <= 1,000 for the first family; the second family's 1,500 bank + # balance still exceeds the 1,000 limit (Handbook 3.2.2). + wi_cts_countable_resources: [0, 500, 0, 1_500] + wi_cts: [275, 0, 0, 0] + +- name: Case 53, Dependent care deduction is limited to the earned income left after the 90 dollar disregard. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + person_id: 1 + ssi: 994 + person2: + age: 17 + person_id: 2 + parent_1_id: 1 + # 5 hours a week at the $7.25 minimum wage: 7.25 * 5 * 52 = 1,885. + employment_income: 1_885 + person3: + age: 1 + person_id: 3 + parent_1_id: 1 + # 600 a month each. + social_security_survivors: 7_200 + pre_subsidy_childcare_expenses: 7_200 + marital_units: + parent: + members: [person1] + child0: + members: [person2] + child1: + members: [person3] + families: + unit: + members: [person1, person2, person3] + households: + home: + members: [person1, person2, person3] + state_code: WI + county: DANE_COUNTY_WI + output: + wi_cts_dependent_care_deduction: [0, 0, 200] + wi_cts_net_income: [0, 67.08, 600] + # 157.08 - 90 = 67.08 earned income is left, so care is capped at 67.08: + # net 67.08 + 600 - 67.08 = 600 > 550. An uncapped $200 would give + # 467.08 and pay 440. + wi_cts: [0, 0, 0] diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/_wi_cts.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/_wi_cts.py index 8b30b94b6f8..a51f196536b 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/_wi_cts.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/_wi_cts.py @@ -19,6 +19,10 @@ def cts_relationships(person, period): ssi_parents = ((first >= 0) & receipt[first]).astype(int) + ( (second >= 0) & receipt[second] ) + # Without parent IDs (as in microsimulation) every is_parent member of the + # family, from own_children_in_household, is a parent of every child: a + # family with any non-SSI parent has no eligible child, and one SSI parent + # receives the whole award. is_parent = person("is_parent", period.this_year) parents = where(linked, parents, person.family.sum(is_parent)) ssi_parents = where(linked, ssi_parents, person.family.sum(is_parent & receipt)) @@ -121,16 +125,22 @@ def cts_financial_test(person, period, parameters, unit, group, large_group_limi + pregnant * p.pregnancy_allowance, large_group_limit, ) - gross = cts_unit_sum(unit, group * person("wi_cts_gross_income", period)) - net = cts_unit_sum( - unit, - group - * ( - person("wi_cts_net_income", period) - - person("wi_cts_dependent_care_deduction", period) - - max_(person("child_support_expense", period), 0) - ), + income = person("wi_cts_gross_income", period) + gross = cts_unit_sum(unit, group * income) + net_income = person("wi_cts_net_income", period) + # AFDC disregards dependent care from earned income, after the other + # disregards (42 USC 602(a)(8)(A)(iii) as amended in 1988; 45 CFR + # 233.20(a)(11)(i)(D)), so the group's care deduction is capped at its + # earned income left after the $90, $30 and one-third disregards. AFDC + # took the care disregard from each earner's own earned income; the model + # pools the group's remaining earnings because it does not know who pays + # for care. + care = min_( + cts_unit_sum(unit, group * person("wi_cts_dependent_care_deduction", period)), + cts_unit_sum(unit, group * person("wi_cts_countable_earned_income", period)), ) + support_paid = max_(person("child_support_expense", period), 0) + net = cts_unit_sum(unit, group * (net_income - support_paid)) - care assets = cts_unit_sum( unit, group * max_(person("wi_cts_countable_resources", period), 0) ) diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_area_i.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_area_i.py index 00ad5dd82ab..d24fe5465bf 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_area_i.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_area_i.py @@ -7,9 +7,10 @@ class wi_cts_area_i(Variable): label = "Wisconsin CTS uses Area I income limits" definition_period = MONTH reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=63" - documentation = "Override to true for the Oneida Tribe and qualifying Winnebago Tribe members on tax-free land in La Crosse or Marathon counties under Handbook 5.2.3." def formula(person, period, parameters): p = parameters(period).gov.states.wi.dhs.ssp.cts county = person.household("county", period.this_year).decode_to_str() - return np.isin(county, p.area_i_counties) + return np.isin(county, p.area_i_counties) | person.household( + "wi_cts_tribal_area_i", period + ) diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_buening_member.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_buening_member.py index 666fa13e679..2958ed56ea0 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_buening_member.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_buening_member.py @@ -9,7 +9,7 @@ class wi_cts_buening_member(Variable): definition_period = MONTH # PDF pages 33-34 reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=33" - documentation = "The non-SSI co-parent and children whose needs must be tested separately under Buening. Parent links identify ordinary two-parent blended families; override for more complex configurations or when links are absent." + documentation = "The non-SSI co-parent and children whose needs must be tested separately under Buening. Requires parent IDs." def formula(person, period, parameters): _, _, subgroup = cts_filing_unit(person, period) diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_caretaker_children.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_caretaker_children.py index 43eb4a95d33..f284c052f60 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_caretaker_children.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_caretaker_children.py @@ -12,7 +12,7 @@ class wi_cts_caretaker_children(Variable): # PDF pages 20, 68-71 "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=20", ) - documentation = "Each eligible child counts for one co-resident SSI parent. A child in common counts for the parent with more eligible children, and ties go to the lower person_id. Without parent links one SSI parent per family receives the award. Override with the agency's caretaker coding when it differs." + documentation = "Each eligible child counts for one co-resident SSI parent. A child in common counts for the parent with more eligible children, and ties go to the lower person_id. Without parent links one SSI parent per family receives the award." def formula(person, period, parameters): first, second, linked, receipt, _, _ = cts_relationships(person, period) diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_child_eligible.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_child_eligible.py index 335ad2e0cd6..e9dc0ce725e 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_child_eligible.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_child_eligible.py @@ -15,7 +15,7 @@ class wi_cts_child_eligible(Variable): # PDF pages 19-20 "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=19", ) - documentation = "Override for verified PRUCOL or other lawful statuses absent from the immigration enum, and certified Huber Law childcare release. Both co-resident natural/adoptive parents must receive Wisconsin state SSI." + documentation = "Both co-resident parents named by parent IDs must receive Wisconsin state SSI. The Huber Law childcare-release exception (Handbook 3.1.6) is not modeled." def formula(person, period, parameters): p = parameters(period).gov.states.wi.dhs.ssp.cts @@ -26,6 +26,9 @@ def formula(person, period, parameters): & ~cts_ssi_recipient(person, period) & (ssi_parents > 0) & (parents == ssi_parents) - & np.isin(status, p.eligible_immigration_statuses) + & ( + np.isin(status, p.eligible_immigration_statuses) + | person("wi_cts_other_qualifying_immigration_status", period) + ) & ~person("is_incarcerated", period) ) diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_countable_earned_income.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_countable_earned_income.py new file mode 100644 index 00000000000..a61933bb35a --- /dev/null +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_countable_earned_income.py @@ -0,0 +1,39 @@ +from policyengine_us.model_api import * + + +class wi_cts_countable_earned_income(Variable): + value_type = float + entity = Person + label = "Wisconsin CTS individual countable earned income" + definition_period = MONTH + unit = USD + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=31" + + def formula(person, period, parameters): + p = parameters(period).gov.states.wi.dhs.ssp.cts + earned = max_(person("ssi_earned_income", period), 0) + continuing_minor = ( + person("age", period.this_year) < p.minor_age_limit + ) & person("wi_cts_received_recently", period) + exempt = continuing_minor & ( + person("is_full_time_student", period.this_year) + | ( + person("wi_cts_part_time_student", period) + & ( + person("weekly_hours_worked", period.this_year) + < p.student_hours_limit + ) + ) + ) + flat = ( + continuing_minor + | person("wi_cts_additional_flat_disregard", period) + | person("wi_cts_additional_fraction_disregard", period) + ) + fraction = continuing_minor | person( + "wi_cts_additional_fraction_disregard", period + ) + earned = max_(earned - p.work_expense - flat * p.earned_flat, 0) * ( + 1 - fraction * p.earned_fraction + ) + return where(exempt, 0, earned) diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_countable_resources.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_countable_resources.py index d76ae2de509..78afc327f6d 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_countable_resources.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_countable_resources.py @@ -10,7 +10,9 @@ class wi_cts_countable_resources(Variable): quantity_type = STOCK # PDF pages 31-32 reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=31" - documentation = "Default covers modeled SSI liquid resources. Override with the CTS asset budget when it differs: include retirement assets, life insurance, nonhome real estate and vehicle equity after the one-vehicle equity exemption; exclude the home, approved burial assets, student loans and protected tax refunds. SSI recipients are excluded at the group calculation." + documentation = "SSI countable resources plus other CTS countable resources. SSI recipients are excluded at the group calculation." def formula(person, period, parameters): - return person("ssi_countable_resources", period.this_year) + return person("ssi_countable_resources", period.this_year) + person( + "wi_cts_other_countable_resources", period + ) diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_dependent_care_deduction.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_dependent_care_deduction.py index 82638d70a12..ed479820bc5 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_dependent_care_deduction.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_dependent_care_deduction.py @@ -7,8 +7,12 @@ class wi_cts_dependent_care_deduction(Variable): label = "Wisconsin CTS allowed dependent care deduction" definition_period = MONTH unit = USD - reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=31" - documentation = "Childcare cost per care recipient. Override with verified work-related care costs or incapacitated-adult care, subject to Handbook 3.2.1.2.3 limits." + reference = ( + "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=31", + "https://www.govinfo.gov/content/pkg/CFR-1997-title45-vol2/pdf/CFR-1997-title45-vol2-sec233-20.pdf#page=14", + "https://www.govinfo.gov/content/pkg/STATUTE-102/pdf/STATUTE-102-Pg2343.pdf#page=55", + ) + documentation = "Childcare cost per care recipient, subject to the Handbook 3.2.1.2.3 limits. Incapacitated-adult care and the work-related condition are not modeled. The net income test deducts the group's total only from its earned income left after the $90, $30 and one-third disregards. AFDC took the care disregard from each earner's own earned income; the model pools the group's remaining earnings because it does not know who pays for care." def formula(person, period, parameters): p = parameters(period).gov.states.wi.dhs.ssp.cts diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_gross_income.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_gross_income.py index e6e613194c9..caa84a3826f 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_gross_income.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_gross_income.py @@ -9,7 +9,7 @@ class wi_cts_gross_income(Variable): unit = USD # PDF pages 30-31 reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=30" - documentation = "All child support is excluded. Override for income sources or deeming absent from the modeled SSI cash-income sources. SSI recipients are excluded from the filing unit." + documentation = "All child support is excluded. Income sources outside the SSI cash-income sources are not counted. SSI recipients are excluded from the filing unit." def formula(person, period, parameters): return max_(person("ssi_earned_income", period), 0) + max_( diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_net_income.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_net_income.py index ccc355ed109..56775a083a9 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_net_income.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_net_income.py @@ -10,32 +10,6 @@ class wi_cts_net_income(Variable): reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=31" def formula(person, period, parameters): - p = parameters(period).gov.states.wi.dhs.ssp.cts earned = max_(person("ssi_earned_income", period), 0) unearned = max_(person("wi_cts_gross_income", period) - earned, 0) - continuing_minor = ( - person("age", period.this_year) < p.minor_age_limit - ) & person("wi_cts_received_recently", period) - exempt = continuing_minor & ( - person("is_full_time_student", period.this_year) - | ( - person("wi_cts_part_time_student", period) - & ( - person("weekly_hours_worked", period.this_year) - < p.student_hours_limit - ) - ) - ) - flat = ( - continuing_minor - | person("wi_cts_additional_flat_disregard", period) - | person("wi_cts_additional_fraction_disregard", period) - ) - fraction = continuing_minor | person( - "wi_cts_additional_fraction_disregard", period - ) - earned = max_(earned - p.work_expense - flat * p.earned_flat, 0) * ( - 1 - fraction * p.earned_fraction - ) - earned = where(exempt, 0, earned) - return earned + unearned + return person("wi_cts_countable_earned_income", period) + unearned diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_other_countable_resources.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_other_countable_resources.py new file mode 100644 index 00000000000..35fd9fa621e --- /dev/null +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_other_countable_resources.py @@ -0,0 +1,14 @@ +from policyengine_us.model_api import * + + +class wi_cts_other_countable_resources(Variable): + value_type = float + entity = Person + label = "Wisconsin CTS countable resources outside SSI countable resources" + definition_period = MONTH + unit = USD + quantity_type = STOCK + defined_for = StateCode.WI + # PDF pages 31-32 + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=31" + documentation = "Handbook 3.2.2 countable assets that SSI countable resources omit, such as the cash value of life insurance, loan proceeds available for living expenses, the equity value of non-home real property, and vehicle equity above the disregarded first $1,500 of one vehicle." diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_other_qualifying_immigration_status.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_other_qualifying_immigration_status.py new file mode 100644 index 00000000000..545874ef6d5 --- /dev/null +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_other_qualifying_immigration_status.py @@ -0,0 +1,12 @@ +from policyengine_us.model_api import * + + +class wi_cts_other_qualifying_immigration_status(Variable): + value_type = bool + entity = Person + label = "Wisconsin CTS child has another qualifying immigration status" + definition_period = MONTH + defined_for = StateCode.WI + # PDF pages 19-20 + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=19" + documentation = "True for a child with qualifying lawful temporary resident status or verified PRUCOL status under Handbook 3.1.4 items 3 and 4 that the immigration status input does not identify. Temporary protected status alone does not qualify (8 U.S.C. 1254a(f)(1))." diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_sfu_member.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_sfu_member.py index fb5b6e3eb38..f23828585f0 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_sfu_member.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_sfu_member.py @@ -9,7 +9,7 @@ class wi_cts_sfu_member(Variable): definition_period = MONTH # PDF pages 18, 30, 68-75 reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=18" - documentation = "Co-resident parent IDs group non-SSI dependent children who share a parent, with those parents, into separate filing units; an SSI child does not link its siblings. Without parent links the family is treated as one nuclear family. Override to remove a person from their unit, for example a step-parent: parent IDs do not distinguish natural or adoptive parents from step-parents. A person outside every unit cannot be added." + documentation = "Co-resident parent IDs group non-SSI dependent children who share a parent, with those parents, into separate filing units; an SSI child does not link its siblings. Without parent links the family is treated as one nuclear family. Parent IDs do not distinguish step-parents, whom Handbook 3.1.1 excludes; a step-parent named in a child's parent IDs is treated as a parent." def formula(person, period, parameters): _, member, _ = cts_filing_unit(person, period) diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_tribal_area_i.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_tribal_area_i.py new file mode 100644 index 00000000000..098a168ca9b --- /dev/null +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_cts_tribal_area_i.py @@ -0,0 +1,11 @@ +from policyengine_us.model_api import * + + +class wi_cts_tribal_area_i(Variable): + value_type = bool + entity = Household + label = "Wisconsin CTS tribal household in Area I" + definition_period = MONTH + defined_for = StateCode.WI + reference = "https://www.dhs.wisconsin.gov/publications/p23131-25-01.pdf#page=63" + documentation = "True for an Oneida Tribe household outside the listed Area I counties, which Handbook 5.2.3 places in Area I. Winnebago Tribe households on tax-free land in La Crosse or Marathon counties already use Area I through the county list." diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_countable_for_snap.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_countable_for_snap.py index 27a4ed3e7b0..426404630f2 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_countable_for_snap.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_countable_for_snap.py @@ -7,6 +7,7 @@ class wi_ssp_countable_for_snap(Variable): label = "Wisconsin state SSI supplements countable for FoodShare" definition_period = MONTH unit = USD + defined_for = StateCode.WI reference = "https://www.emhandbooks.wisconsin.gov/fsh/policy_files/4/43/4.3.4.htm" # The current FoodShare income manual explicitly excludes SSI-E. # The SSI-E handbook's older FoodShare discussion says otherwise; diff --git a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_regular.py b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_regular.py index 33bc63b0c1e..05b9a4b6fcc 100644 --- a/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_regular.py +++ b/policyengine_us/variables/gov/states/wi/dhs/ssp/wi_ssp_regular.py @@ -1,7 +1,4 @@ from policyengine_us.model_api import * -from policyengine_us.variables.gov.ssa.ssi.eligibility.status.ssi_federal_living_arrangement import ( - SSIFederalLivingArrangement, -) class wi_ssp_regular(Variable): @@ -26,7 +23,7 @@ def formula(person, period, parameters): ) > 0 arrangement = person("ssi_federal_living_arrangement", period) other_household = ( - arrangement == SSIFederalLivingArrangement.ANOTHER_PERSONS_HOUSEHOLD + arrangement == arrangement.possible_values.ANOTHER_PERSONS_HOUSEHOLD ) with_ineligible_spouse = where( other_household,