From b65eb7851178535ede77c9defc1bc43594b495d2 Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 30 Sep 2026 15:44:20 -0400 Subject: [PATCH 1/7] Add Mississippi LIHEAP regular heating assistance --- changelog.d/ms-liheap.added.md | 1 + .../gov/states/ms/mdhs/liheap/adult_age.yaml | 9 +++ .../states/ms/mdhs/liheap/income_bands/1.yaml | 38 +++++++++++++ .../ms/mdhs/liheap/income_bands/10.yaml | 34 +++++++++++ .../ms/mdhs/liheap/income_bands/11.yaml | 34 +++++++++++ .../ms/mdhs/liheap/income_bands/12.yaml | 30 ++++++++++ .../ms/mdhs/liheap/income_bands/13.yaml | 30 ++++++++++ .../ms/mdhs/liheap/income_bands/14.yaml | 30 ++++++++++ .../ms/mdhs/liheap/income_bands/15.yaml | 34 +++++++++++ .../ms/mdhs/liheap/income_bands/16.yaml | 30 ++++++++++ .../ms/mdhs/liheap/income_bands/17.yaml | 30 ++++++++++ .../ms/mdhs/liheap/income_bands/18.yaml | 26 +++++++++ .../ms/mdhs/liheap/income_bands/19.yaml | 26 +++++++++ .../states/ms/mdhs/liheap/income_bands/2.yaml | 38 +++++++++++++ .../ms/mdhs/liheap/income_bands/20.yaml | 22 ++++++++ .../states/ms/mdhs/liheap/income_bands/3.yaml | 38 +++++++++++++ .../states/ms/mdhs/liheap/income_bands/4.yaml | 38 +++++++++++++ .../states/ms/mdhs/liheap/income_bands/5.yaml | 38 +++++++++++++ .../states/ms/mdhs/liheap/income_bands/6.yaml | 38 +++++++++++++ .../states/ms/mdhs/liheap/income_bands/7.yaml | 38 +++++++++++++ .../states/ms/mdhs/liheap/income_bands/8.yaml | 34 +++++++++++ .../states/ms/mdhs/liheap/income_bands/9.yaml | 34 +++++++++++ .../states/ms/mdhs/liheap/income_limit.yaml | 9 +++ .../ms/mdhs/liheap/maximum_payment.yaml | 31 ++++++++++ .../ms/mdhs/liheap/maximum_table_size.yaml | 9 +++ .../ms/mdhs/liheap/payment_reduction.yaml | 31 ++++++++++ .../mdhs/liheap/propane_exception_amount.yaml | 9 +++ .../propane_exception_household_size.yaml | 9 +++ .../liheap/propane_exception_income_band.yaml | 9 +++ .../mdhs/liheap/unearned_income_sources.yaml | 22 ++++++++ policyengine_us/programs.yaml | 9 ++- .../states/ms/mdhs/liheap/integration.yaml | 34 +++++++++++ .../gov/states/ms/mdhs/liheap/ms_liheap.yaml | 56 +++++++++++++++++++ .../ms/mdhs/liheap/ms_liheap_eligible.yaml | 20 +++++++ .../ms/mdhs/liheap/ms_liheap_income.yaml | 53 ++++++++++++++++++ .../mdhs/liheap/ms_liheap_income_limit.yaml | 8 +++ .../gov/states/ms/mdhs/liheap/ms_liheap.py | 48 ++++++++++++++++ .../ms/mdhs/liheap/ms_liheap_eligible.py | 33 +++++++++++ .../mdhs/liheap/ms_liheap_household_size.py | 16 ++++++ .../states/ms/mdhs/liheap/ms_liheap_income.py | 32 +++++++++++ .../ms/mdhs/liheap/ms_liheap_income_limit.py | 28 ++++++++++ 41 files changed, 1135 insertions(+), 1 deletion(-) create mode 100644 changelog.d/ms-liheap.added.md create mode 100644 policyengine_us/parameters/gov/states/ms/mdhs/liheap/adult_age.yaml create mode 100644 policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/1.yaml create mode 100644 policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/10.yaml create mode 100644 policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/11.yaml create mode 100644 policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/12.yaml create mode 100644 policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/13.yaml create mode 100644 policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/14.yaml create mode 100644 policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/15.yaml create mode 100644 policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/16.yaml create mode 100644 policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/17.yaml create mode 100644 policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/18.yaml create mode 100644 policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/19.yaml create mode 100644 policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/2.yaml create mode 100644 policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/20.yaml create mode 100644 policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/3.yaml create mode 100644 policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/4.yaml create mode 100644 policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/5.yaml create mode 100644 policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/6.yaml create mode 100644 policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/7.yaml create mode 100644 policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/8.yaml create mode 100644 policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/9.yaml create mode 100644 policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_limit.yaml create mode 100644 policyengine_us/parameters/gov/states/ms/mdhs/liheap/maximum_payment.yaml create mode 100644 policyengine_us/parameters/gov/states/ms/mdhs/liheap/maximum_table_size.yaml create mode 100644 policyengine_us/parameters/gov/states/ms/mdhs/liheap/payment_reduction.yaml create mode 100644 policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_amount.yaml create mode 100644 policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_household_size.yaml create mode 100644 policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_income_band.yaml create mode 100644 policyengine_us/parameters/gov/states/ms/mdhs/liheap/unearned_income_sources.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/integration.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_income.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_income_limit.yaml create mode 100644 policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap.py create mode 100644 policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_eligible.py create mode 100644 policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_household_size.py create mode 100644 policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_income.py create mode 100644 policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_income_limit.py diff --git a/changelog.d/ms-liheap.added.md b/changelog.d/ms-liheap.added.md new file mode 100644 index 00000000000..dfb3052460f --- /dev/null +++ b/changelog.d/ms-liheap.added.md @@ -0,0 +1 @@ +Add partial FY2026 Mississippi LIHEAP regular heating assistance using existing inputs. diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/adult_age.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/adult_age.yaml new file mode 100644 index 00000000000..fb27cab5073 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/adult_age.yaml @@ -0,0 +1,9 @@ +description: Mississippi counts earned income beginning at this age, except for emancipated minors under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: 18 +metadata: + unit: year + label: Mississippi LIHEAP adult age + reference: + - title: Mississippi LIHEAP Policy Manual, January 2026 revision + href: https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=30,33 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/1.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/1.yaml new file mode 100644 index 00000000000..c097a32b201 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/1.yaml @@ -0,0 +1,38 @@ +description: Mississippi assigns these published heating income bands to a household of 1 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +brackets: + - threshold: + 2025-10-01: -.inf + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 3_913 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 7_825 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 11_738 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 15_650 + amount: + 2025-10-01: 5 + - threshold: + 2025-10-01: 19_563 + amount: + 2025-10-01: 6 + - threshold: + 2025-10-01: 26_740 + amount: + 2025-10-01: 0 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + label: Mississippi LIHEAP income bands for 1 people + reference: + - title: Mississippi FY2026 benefit matrix, household size 1 + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/10.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/10.yaml new file mode 100644 index 00000000000..93fd66a78fd --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/10.yaml @@ -0,0 +1,34 @@ +description: Mississippi assigns these published heating income bands to a household of 10 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +brackets: + - threshold: + 2025-10-01: -.inf + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 16_288 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 35_325 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 48_863 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 65_150 + amount: + 2025-10-01: 5 + - threshold: + 2025-10-01: 72_507 + amount: + 2025-10-01: 0 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + label: Mississippi LIHEAP income bands for 10 people + reference: + - title: Mississippi FY2026 benefit matrix, household size 10 + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=4 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/11.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/11.yaml new file mode 100644 index 00000000000..5b9b07e6715 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/11.yaml @@ -0,0 +1,34 @@ +description: Mississippi assigns these published heating income bands to a household of 11 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +brackets: + - threshold: + 2025-10-01: -.inf + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 17_633 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 17_663 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 35_325 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 52_988 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 75_593 + amount: + 2025-10-01: 0 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + label: Mississippi LIHEAP income bands for 11 people + reference: + - title: Mississippi FY2026 benefit matrix, household size 11 + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=4 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/12.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/12.yaml new file mode 100644 index 00000000000..df7eff75f7e --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/12.yaml @@ -0,0 +1,30 @@ +description: Mississippi assigns these published heating income bands to a household of 12 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +brackets: + - threshold: + 2025-10-01: -.inf + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 19_038 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 38_075 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 57_113 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 77_136 + amount: + 2025-10-01: 0 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + label: Mississippi LIHEAP income bands for 12 people + reference: + - title: Mississippi FY2026 benefit matrix, household size 12 + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=4 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/13.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/13.yaml new file mode 100644 index 00000000000..bea5c1a3286 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/13.yaml @@ -0,0 +1,30 @@ +description: Mississippi assigns these published heating income bands to a household of 13 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +brackets: + - threshold: + 2025-10-01: -.inf + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 20_413 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 40_825 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 61_238 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 78_678 + amount: + 2025-10-01: 0 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + label: Mississippi LIHEAP income bands for 13 people + reference: + - title: Mississippi FY2026 benefit matrix, household size 13 + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=4 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/14.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/14.yaml new file mode 100644 index 00000000000..81fc2bbb4ce --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/14.yaml @@ -0,0 +1,30 @@ +description: Mississippi assigns these published heating income bands to a household of 14 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +brackets: + - threshold: + 2025-10-01: -.inf + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 21_788 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 43_575 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 65_363 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 80_221 + amount: + 2025-10-01: 0 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + label: Mississippi LIHEAP income bands for 14 people + reference: + - title: Mississippi FY2026 benefit matrix, household size 14 + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=5 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/15.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/15.yaml new file mode 100644 index 00000000000..9367d47057f --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/15.yaml @@ -0,0 +1,34 @@ +description: Mississippi assigns these published heating income bands to a household of 15 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +brackets: + - threshold: + 2025-10-01: -.inf + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 23_163 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 46_325 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 68_488 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 69_488 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 81_764 + amount: + 2025-10-01: 0 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + label: Mississippi LIHEAP income bands for 15 people + reference: + - title: Mississippi FY2026 benefit matrix, household size 15 + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=5 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/16.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/16.yaml new file mode 100644 index 00000000000..7f4b7945e65 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/16.yaml @@ -0,0 +1,30 @@ +description: Mississippi assigns these published heating income bands to a household of 16 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +brackets: + - threshold: + 2025-10-01: -.inf + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 24_538 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 49_075 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 73_613 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 83_306 + amount: + 2025-10-01: 0 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + label: Mississippi LIHEAP income bands for 16 people + reference: + - title: Mississippi FY2026 benefit matrix, household size 16 + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=5 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/17.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/17.yaml new file mode 100644 index 00000000000..efa5d34a552 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/17.yaml @@ -0,0 +1,30 @@ +description: Mississippi assigns these published heating income bands to a household of 17 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +brackets: + - threshold: + 2025-10-01: -.inf + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 25_913 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 51_825 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 77_738 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 84_849 + amount: + 2025-10-01: 0 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + label: Mississippi LIHEAP income bands for 17 people + reference: + - title: Mississippi FY2026 benefit matrix, household size 17 + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=5 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/18.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/18.yaml new file mode 100644 index 00000000000..1e42787b79a --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/18.yaml @@ -0,0 +1,26 @@ +description: Mississippi assigns these published heating income bands to a household of 18 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +brackets: + - threshold: + 2025-10-01: -.inf + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 27_288 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 54_575 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 84_849 + amount: + 2025-10-01: 0 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + label: Mississippi LIHEAP income bands for 18 people + reference: + - title: Mississippi FY2026 benefit matrix, household size 18 + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=6 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/19.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/19.yaml new file mode 100644 index 00000000000..124f55148de --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/19.yaml @@ -0,0 +1,26 @@ +description: Mississippi assigns these published heating income bands to a household of 19 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +brackets: + - threshold: + 2025-10-01: -.inf + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 28_663 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 57_325 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 87_935 + amount: + 2025-10-01: 0 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + label: Mississippi LIHEAP income bands for 19 people + reference: + - title: Mississippi FY2026 benefit matrix, household size 19 + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=6 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/2.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/2.yaml new file mode 100644 index 00000000000..5cd7925d912 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/2.yaml @@ -0,0 +1,38 @@ +description: Mississippi assigns these published heating income bands to a household of 2 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +brackets: + - threshold: + 2025-10-01: -.inf + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 5_288 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 10_575 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 15_863 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 21_150 + amount: + 2025-10-01: 5 + - threshold: + 2025-10-01: 26_438 + amount: + 2025-10-01: 6 + - threshold: + 2025-10-01: 34_968 + amount: + 2025-10-01: 0 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + label: Mississippi LIHEAP income bands for 2 people + reference: + - title: Mississippi FY2026 benefit matrix, household size 2 + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/20.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/20.yaml new file mode 100644 index 00000000000..1175dd9433d --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/20.yaml @@ -0,0 +1,22 @@ +description: Mississippi assigns these published heating income bands to a household of 20 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +brackets: + - threshold: + 2025-10-01: -.inf + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 30_038 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 60_075 + amount: + 2025-10-01: 0 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + label: Mississippi LIHEAP income bands for 20 people + reference: + - title: Mississippi FY2026 benefit matrix, household size 20 + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=6 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/3.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/3.yaml new file mode 100644 index 00000000000..da636f18ebf --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/3.yaml @@ -0,0 +1,38 @@ +description: Mississippi assigns these published heating income bands to a household of 3 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +brackets: + - threshold: + 2025-10-01: -.inf + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 6_663 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 13_325 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 19_988 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 26_650 + amount: + 2025-10-01: 5 + - threshold: + 2025-10-01: 31_313 + amount: + 2025-10-01: 6 + - threshold: + 2025-10-01: 43_196 + amount: + 2025-10-01: 0 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + label: Mississippi LIHEAP income bands for 3 people + reference: + - title: Mississippi FY2026 benefit matrix, household size 3 + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/4.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/4.yaml new file mode 100644 index 00000000000..b71c1dc9d2f --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/4.yaml @@ -0,0 +1,38 @@ +description: Mississippi assigns these published heating income bands to a household of 4 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +brackets: + - threshold: + 2025-10-01: -.inf + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 8_038 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 16_075 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 24_113 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 32_150 + amount: + 2025-10-01: 5 + - threshold: + 2025-10-01: 40_188 + amount: + 2025-10-01: 6 + - threshold: + 2025-10-01: 51_424 + amount: + 2025-10-01: 0 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + label: Mississippi LIHEAP income bands for 4 people + reference: + - title: Mississippi FY2026 benefit matrix, household size 4 + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/5.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/5.yaml new file mode 100644 index 00000000000..622fe426b6e --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/5.yaml @@ -0,0 +1,38 @@ +description: Mississippi assigns these published heating income bands to a household of 5 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +brackets: + - threshold: + 2025-10-01: -.inf + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 9_413 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 18_825 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 28_238 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 37_650 + amount: + 2025-10-01: 5 + - threshold: + 2025-10-01: 47_063 + amount: + 2025-10-01: 6 + - threshold: + 2025-10-01: 59_651 + amount: + 2025-10-01: 0 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + label: Mississippi LIHEAP income bands for 5 people + reference: + - title: Mississippi FY2026 benefit matrix, household size 5 + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/6.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/6.yaml new file mode 100644 index 00000000000..a004d4758f5 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/6.yaml @@ -0,0 +1,38 @@ +description: Mississippi assigns these published heating income bands to a household of 6 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +brackets: + - threshold: + 2025-10-01: -.inf + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 10_788 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 21_575 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 32_363 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 43_150 + amount: + 2025-10-01: 5 + - threshold: + 2025-10-01: 53_938 + amount: + 2025-10-01: 6 + - threshold: + 2025-10-01: 67_879 + amount: + 2025-10-01: 0 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + label: Mississippi LIHEAP income bands for 6 people + reference: + - title: Mississippi FY2026 benefit matrix, household size 6 + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/7.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/7.yaml new file mode 100644 index 00000000000..0e1db3ed818 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/7.yaml @@ -0,0 +1,38 @@ +description: Mississippi assigns these published heating income bands to a household of 7 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +brackets: + - threshold: + 2025-10-01: -.inf + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 12_163 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 24_325 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 36_488 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 48_650 + amount: + 2025-10-01: 5 + - threshold: + 2025-10-01: 60_813 + amount: + 2025-10-01: 6 + - threshold: + 2025-10-01: 69_422 + amount: + 2025-10-01: 0 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + label: Mississippi LIHEAP income bands for 7 people + reference: + - title: Mississippi FY2026 benefit matrix, household size 7 + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=3 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/8.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/8.yaml new file mode 100644 index 00000000000..c1a924bb80b --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/8.yaml @@ -0,0 +1,34 @@ +description: Mississippi assigns these published heating income bands to a household of 8 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +brackets: + - threshold: + 2025-10-01: -.inf + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 13_538 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 27_075 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 40_613 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 54_150 + amount: + 2025-10-01: 5 + - threshold: + 2025-10-01: 70_965 + amount: + 2025-10-01: 0 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + label: Mississippi LIHEAP income bands for 8 people + reference: + - title: Mississippi FY2026 benefit matrix, household size 8 + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=3 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/9.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/9.yaml new file mode 100644 index 00000000000..63d1b36dfca --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/9.yaml @@ -0,0 +1,34 @@ +description: Mississippi assigns these published heating income bands to a household of 9 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +brackets: + - threshold: + 2025-10-01: -.inf + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 14_913 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 29_825 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 44_738 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 59_650 + amount: + 2025-10-01: 5 + - threshold: + 2025-10-01: 72_507 + amount: + 2025-10-01: 0 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + label: Mississippi LIHEAP income bands for 9 people + reference: + - title: Mississippi FY2026 benefit matrix, household size 9 + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=3 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_limit.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_limit.yaml new file mode 100644 index 00000000000..6372e689fed --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_limit.yaml @@ -0,0 +1,9 @@ +description: Mississippi limits annual household income to this share of state median income under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: 0.6 +metadata: + unit: /1 + label: Mississippi LIHEAP income limit + reference: + - title: Mississippi LIHEAP Policy Manual, January 2026 revision + href: https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=22,58 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/maximum_payment.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/maximum_payment.yaml new file mode 100644 index 00000000000..339cda26535 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/maximum_payment.yaml @@ -0,0 +1,31 @@ +description: Mississippi sets these first-income-band heating caps by primary heating fuel under the Low Income Home Energy Assistance Program. +UNSPECIFIED: + 2025-10-01: 0 +ELECTRICITY: + 2025-10-01: 1_500 +NATURAL_GAS: + 2025-10-01: 700 +FUEL_OIL: + 2025-10-01: 400 +KEROSENE: + 2025-10-01: 400 +PROPANE: + 2025-10-01: 800 +WOOD: + 2025-10-01: 400 +COAL: + 2025-10-01: 400 +SOLAR: + 2025-10-01: 0 +OTHER: + 2025-10-01: 400 +NONE: + 2025-10-01: 0 +metadata: + unit: currency-USD + label: Mississippi LIHEAP maximum payment + breakdown: + - heating_type + reference: + - title: Mississippi FY2026 benefit matrix, heating caps by fuel and income band + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=1,2,3,4,5,6 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/maximum_table_size.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/maximum_table_size.yaml new file mode 100644 index 00000000000..f719271731c --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/maximum_table_size.yaml @@ -0,0 +1,9 @@ +description: Mississippi publishes heating income bands through this eligible household size under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: 20 +metadata: + unit: person + label: Mississippi LIHEAP maximum table size + reference: + - title: Mississippi LIHEAP Policy Manual, January 2026 revision + href: https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=58,64 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/payment_reduction.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/payment_reduction.yaml new file mode 100644 index 00000000000..285e33e8cba --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/payment_reduction.yaml @@ -0,0 +1,31 @@ +description: Mississippi reduces these heating caps per subsequent published income band by primary fuel under the Low Income Home Energy Assistance Program. +UNSPECIFIED: + 2025-10-01: 0 +ELECTRICITY: + 2025-10-01: 100 +NATURAL_GAS: + 2025-10-01: 50 +FUEL_OIL: + 2025-10-01: 40 +KEROSENE: + 2025-10-01: 40 +PROPANE: + 2025-10-01: 50 +WOOD: + 2025-10-01: 40 +COAL: + 2025-10-01: 40 +SOLAR: + 2025-10-01: 0 +OTHER: + 2025-10-01: 40 +NONE: + 2025-10-01: 0 +metadata: + unit: currency-USD + label: Mississippi LIHEAP payment reduction + breakdown: + - heating_type + reference: + - title: Mississippi FY2026 benefit matrix, heating caps by fuel and income band + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=1,2,3,4,5,6 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_amount.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_amount.yaml new file mode 100644 index 00000000000..bfe8effef0c --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_amount.yaml @@ -0,0 +1,9 @@ +description: Mississippi publishes this propane cap in the exceptional household-size and income-band cell under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: 350 +metadata: + unit: currency-USD + label: Mississippi LIHEAP propane exception amount + reference: + - title: Mississippi LIHEAP Policy Manual, January 2026 revision + href: https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=63 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_household_size.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_household_size.yaml new file mode 100644 index 00000000000..de5baff3342 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_household_size.yaml @@ -0,0 +1,9 @@ +description: Mississippi publishes an exceptional propane cap for this household size under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: 16 +metadata: + unit: person + label: Mississippi LIHEAP propane exception household size + reference: + - title: Mississippi LIHEAP Policy Manual, January 2026 revision + href: https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=63 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_income_band.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_income_band.yaml new file mode 100644 index 00000000000..d2835619bfd --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_income_band.yaml @@ -0,0 +1,9 @@ +description: Mississippi publishes an exceptional propane cap in this income band for the specified household size under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: 4 +metadata: + unit: /1 + label: Mississippi LIHEAP propane exception income band + reference: + - title: Mississippi LIHEAP Policy Manual, January 2026 revision + href: https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=63 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/unearned_income_sources.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/unearned_income_sources.yaml new file mode 100644 index 00000000000..4e6c7d791f6 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/unearned_income_sources.yaml @@ -0,0 +1,22 @@ +description: Mississippi counts these available regular unearned income sources under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: + - unemployment_compensation + - social_security + - ssi + - pension_income + - retirement_distributions + - alimony_income + - veterans_benefits + - workers_compensation + - disability_benefits + - financial_assistance + - dividend_income + - interest_income + - rental_income +metadata: + unit: list + label: Mississippi LIHEAP unearned income sources + reference: + - title: Mississippi LIHEAP Policy Manual, Rules 6.11 C, D, F and J + href: https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=29,30,32,33 diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 81c10bc47b6..e9d1013a4a2 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -802,7 +802,7 @@ programs: category: Benefits agency: HHS status: partial - coverage: OR, DC, Riverside County, MA, IL, TX + coverage: OR, DC, Riverside County, MA, IL, TX, MS state_implementations: - state: OR status: in_progress @@ -823,6 +823,13 @@ programs: name: Illinois LIHEAP full_name: Illinois Low Income Home Energy Assistance Program variable: il_liheap + - state: MS + status: partial + name: Mississippi LIHEAP + full_name: Mississippi Low Income Home Energy Assistance Program + variable: ms_liheap + parameter_prefix: gov.states.ms.mdhs.liheap + notes: FY2026 regular heating only. Uses existing inputs and preserves published matrix anomalies. Unpublished income intervals and household sizes, unspecified heat-in-rent charges, propane delivery rules, prior awards, detailed household/income classifications, and administrative checks remain incomplete. - state: TX status: partial name: Texas CEAP diff --git a/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/integration.yaml new file mode 100644 index 00000000000..2b6aac88518 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/integration.yaml @@ -0,0 +1,34 @@ +- name: Electric heating payment is available only to an eligible Mississippi household + period: 2_026 + input: + state_code: [MS, MS, AL] + age: [40, 40, 40] + employment_income: [0, 26_741, 0] + ssi: [0, 0, 0] + social_security: [0, 0, 0] + heating_type: [ELECTRICITY, ELECTRICITY, ELECTRICITY] + pre_subsidy_electricity_expense: [2_000, 2_000, 2_000] + output: + ms_liheap: [1_500, 0, 0] +- name: All undocumented household receives no payment + period: 2_026 + input: + state_code: MS + age: 40 + immigration_status: UNDOCUMENTED + employment_income: 0 + ssi: 0 + social_security: 0 + heating_type: NATURAL_GAS + gas_expense: 1_000 + output: + ms_liheap_household_size: 0 + ms_liheap: 0 +- name: Years preceding researched coverage have no formula + period: 2_022 + input: + state_code: MS + heating_type: ELECTRICITY + pre_subsidy_electricity_expense: 1_000 + output: + ms_liheap: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap.yaml b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap.yaml new file mode 100644 index 00000000000..ba23b94be36 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap.yaml @@ -0,0 +1,56 @@ +- name: Published one-person income boundaries reduce propane payments + period: 2_026 + input: + state_code: [MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS] + ms_liheap_eligible: [true, true, true, true, true, true, true, true, true, true, true] + ms_liheap_household_size: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + ms_liheap_income: [3_913, 3_914, 7_825, 7_826, 11_738, 11_739, 15_650, 15_651, 19_563, 19_564, 26_740] + heating_type: [PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE] + heating_expense: [2_000, 2_000, 2_000, 2_000, 2_000, 2_000, 2_000, 2_000, 2_000, 2_000, 2_000] + output: + ms_liheap: [800, 750, 750, 700, 700, 650, 650, 600, 600, 550, 550] +- name: Main fuel caps exclude ancillary electricity for other heating fuels + period: 2_026 + input: + state_code: [MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS] + ms_liheap_eligible: [true, true, true, true, true, true, true, true, true, true, true] + ms_liheap_household_size: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + ms_liheap_income: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + heating_type: [ELECTRICITY, NATURAL_GAS, PROPANE, WOOD, COAL, FUEL_OIL, KEROSENE, OTHER, SOLAR, NONE, UNSPECIFIED] + heating_expense: [2_000, 2_000, 2_000, 2_000, 2_000, 2_000, 2_000, 2_000, 2_000, 2_000, 2_000] + output: + ms_liheap: [1_500, 700, 800, 400, 400, 400, 400, 400, 0, 0, 0] +- name: Annual regular heating payment is limited to reported heating bills + period: 2_026 + input: + state_code: [MS, MS, MS, MS, MS] + ms_liheap_eligible: [true, true, true, true, true] + ms_liheap_household_size: [1, 1, 1, 1, 1] + ms_liheap_income: [0, 0, 0, 0, 0] + heating_type: [ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY] + heating_expense: [0, 100, 1_499, 1_500, 1_501] + output: + ms_liheap: [0, 100, 1_499, 1_500, 1_500] +- name: Preserve published size-sixteen propane exception + period: 2_026 + input: + state_code: [MS, MS] + ms_liheap_eligible: [true, true] + ms_liheap_household_size: [16, 16] + ms_liheap_income: [73_613, 73_614] + heating_type: [PROPANE, PROPANE] + heating_expense: [2_000, 2_000] + output: + ms_liheap: [700, 350] +- name: Unpublished income intervals and household sizes have no encoded payment + period: 2_026 + input: + state_code: [MS, MS, MS, MS, MS, MS, MS, MS, MS, MS] + ms_liheap_eligible: [true, true, true, true, true, true, true, true, true, true] + ms_liheap_household_size: [11, 11, 11, 15, 15, 15, 10, 18, 20, 21] + ms_liheap_income: [17_633, 17_634, 17_664, 68_488, 68_489, 69_489, 72_508, 84_850, 60_076, 0] + heating_type: [ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, + ELECTRICITY, ELECTRICITY] + heating_expense: [2_000, 2_000, 2_000, 2_000, 2_000, 2_000, 2_000, 2_000, 2_000, 2_000] + output: + ms_liheap: [1_500, 0, 1_400, 1_300, 0, 1_200, 0, 0, 0, 0] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_eligible.yaml new file mode 100644 index 00000000000..ba90691159a --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_eligible.yaml @@ -0,0 +1,20 @@ +- name: Income at and above the published limit + period: 2_026 + input: + state_code: [MS, MS] + age: [40, 40] + ms_liheap_income: [26_740, 26_741] + heating_expense: [1_000, 1_000] + output: + ms_liheap_eligible: [true, false] +- name: Subsidized heat in rent, independent energy responsibility, and adulthood + period: 2_026 + input: + state_code: [MS, MS, MS, MS, MS] + age: [40, 40, 40, 40, 17] + ms_liheap_income: [0, 0, 0, 0, 0] + heating_expense: [0, 0, 0, 1_000, 1_000] + heat_expense_included_in_rent: [false, true, true, false, false] + receives_housing_assistance: [false, false, true, true, false] + output: + ms_liheap_eligible: [false, true, false, true, false] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_income.yaml new file mode 100644 index 00000000000..02189809f6e --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_income.yaml @@ -0,0 +1,53 @@ +- name: Schedule C net profits and losses count without a second business deduction + period: 2_026 + input: + state_code: [MS, MS, MS] + age: [40, 40, 40] + employment_income: [12_000, 12_000, 12_000] + self_employment_income: [6_000, -6_000, -18_000] + ssi: [0, 0, 0] + social_security: [0, 0, 0] + output: + ms_liheap_income: [18_000, 6_000, 0] +- name: Child support, TANF, and tax refunds are excluded; recurring gifts and interest count + period: 2_026 + input: + state_code: MS + age: 40 + employment_income: 10_000 + child_support_received: 3_000 + tanf: 3_000 + salt_refund_income: 1_000 + financial_assistance: 600 + interest_income: 400 + ssi: 0 + social_security: 0 + output: + ms_liheap_income: 11_000 +- name: Excluded adult income and child unearned income count, while child wages do not + period: 2_026 + input: + people: + adult: + age: 35 + immigration_status: UNDOCUMENTED + employment_income: 12_000 + ssi: 0 + social_security: 0 + child: + age: 15 + employment_income: 6_000 + ssi: 2_400 + social_security: 1_200 + spm_units: + unit: + members: [adult, child] + heating_expense: 1_000 + households: + home: + members: [adult, child] + state_code: MS + output: + ms_liheap_household_size: 1 + ms_liheap_income: 15_600 + ms_liheap_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_income_limit.yaml b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_income_limit.yaml new file mode 100644 index 00000000000..b28eb60f746 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_income_limit.yaml @@ -0,0 +1,8 @@ +- name: Published FY2026 sixty percent SMI limits for all twenty listed household sizes + period: 2_026 + input: + state_code: [MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS] + ms_liheap_household_size: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] + output: + ms_liheap_income_limit: [26_740, 34_968, 43_196, 51_424, 59_651, 67_879, 69_422, 70_965, 72_507, 74_050, 75_593, + 77_136, 78_678, 80_221, 81_764, 83_306, 84_849, 86_392, 87_935, 89_477] diff --git a/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap.py b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap.py new file mode 100644 index 00000000000..6265306edce --- /dev/null +++ b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap.py @@ -0,0 +1,48 @@ +from policyengine_us.model_api import * + + +class ms_liheap(Variable): + value_type = float + entity = SPMUnit + definition_period = YEAR + unit = USD + label = "Mississippi LIHEAP regular heating assistance" + defined_for = "ms_liheap_eligible" + reference = "https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=24,36,37,39,58,59,60,61,62,63,64" + + def formula_2026(spm_unit, period, parameters): + # Coverage starts with the researched FY2026 schedule, not program inception. + p = parameters(period).gov.states.ms.mdhs.liheap + size = spm_unit("ms_liheap_household_size", period) + income = spm_unit("ms_liheap_income", period) + band = 0 + for table_size in range(1, int(p.maximum_table_size) + 1): + band = where( + size == table_size, + p.income_bands[str(table_size)].calc(income, right=True), + band, + ) + fuel = spm_unit("heating_type", period) + types = fuel.possible_values + # Shared cap parameters reproduce the published progression without copying + # dollar amounts for every household size. Preserve the anomalous size-16 + # propane cell; agency clarification is needed before correcting the source. + cap = p.maximum_payment[fuel] - max_(band - 1, 0) * p.payment_reduction[fuel] + exception = ( + (fuel == types.PROPANE) + & (size == p.propane_exception_household_size) + & (band == p.propane_exception_income_band) + ) + cap = where(exception, p.propane_exception_amount, cap) + # Rule 7.8 D gives electric-heating households the total-electric annual cap. + # Only the main heating bill is counted here: no additional cooling/electric + # allowance for a non-electric heating household. Prior awards consuming the + # shared annual cap, per-delivery propane limits, and prepaid-account rules + # are not represented. Annual heating expenses approximate eligible bills. + expense = max_(spm_unit("heating_expense", period), 0) + # Heat in rent with no specified charge receives $100 per intake under 6.4 B; + # charge documentation/intake counts cannot be inferred, so that pathway is + # not modeled. Source gaps (sizes 11/15 and upper ranges for 10/18/20) and + # sizes above 20 also return zero as coverage gaps, not legal ineligibility. + # The table is retained because a smooth FPG formula does not reproduce it. + return where(band > 0, min_(cap, expense), 0) diff --git a/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_eligible.py b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_eligible.py new file mode 100644 index 00000000000..94a8035c939 --- /dev/null +++ b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_eligible.py @@ -0,0 +1,33 @@ +from policyengine_us.model_api import * + + +class ms_liheap_eligible(Variable): + value_type = bool + entity = SPMUnit + definition_period = YEAR + label = "Mississippi LIHEAP regular heating eligibility" + defined_for = StateCode.MS + reference = "https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=22,23,24,29,30,31,32,33" + + def formula_2026(spm_unit, period, parameters): + p = parameters(period).gov.states.ms.mdhs.liheap + size = spm_unit("ms_liheap_household_size", period) + income = spm_unit("ms_liheap_income", period) + limit = spm_unit("ms_liheap_income_limit", period) + has_adult = spm_unit.any(spm_unit.members("age", period) >= p.adult_age) + # Existing inputs do not establish emancipated-minor headship, institutional + # residence, or utility account ownership. A household adult is the modeled + # applicant; children can establish immigration eligibility under Rule 6.3. + responsible = (spm_unit("heating_expense", period) > 0) | spm_unit( + "heat_expense_included_in_rent", period + ) + subsidized = spm_unit( + "receives_housing_assistance", period + ) | spm_unit.household("is_in_public_housing", period) + # Subsidized housing needs separately billed energy (FY2026 plan Section 2). + housing_eligible = ~subsidized | ~spm_unit( + "heat_expense_included_in_rent", period + ) + return ( + (size > 0) & (income <= limit) & has_adult & responsible & housing_eligible + ) diff --git a/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_household_size.py b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_household_size.py new file mode 100644 index 00000000000..4150724788a --- /dev/null +++ b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_household_size.py @@ -0,0 +1,16 @@ +from policyengine_us.model_api import * + + +class ms_liheap_household_size(Variable): + value_type = int + entity = SPMUnit + definition_period = YEAR + label = "Mississippi LIHEAP eligible household size" + defined_for = StateCode.MS + reference = "https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=22,23,24,29,30,31,32,33" + + def formula_2026(spm_unit, period, parameters): + # Rule 6.3 excludes undocumented members from size, not from income. + # SPM units approximate the household; live-in attendants, boarders, and + # their separate energy arrangements cannot be resolved with current inputs. + return add(spm_unit, period, ["is_citizen_or_legal_immigrant"]) diff --git a/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_income.py b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_income.py new file mode 100644 index 00000000000..4bdb4ff855e --- /dev/null +++ b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_income.py @@ -0,0 +1,32 @@ +from policyengine_us.model_api import * + + +class ms_liheap_income(Variable): + value_type = float + entity = SPMUnit + definition_period = YEAR + unit = USD + label = "Mississippi LIHEAP countable annual household income" + defined_for = StateCode.MS + reference = "https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=22,23,24,29,30,31,32,33" + + def formula_2026(spm_unit, period, parameters): + p = parameters(period).gov.states.ms.mdhs.liheap + person = spm_unit.members + adult = person("age", period) >= p.adult_age + # Rule 6.11 I uses Schedule C net profit. Count existing net business + # income (including a Schedule C loss) once, without another business-expense + # deduction. Annual inputs + # approximate the annualized preceding 30 days; pay-frequency changes and + # court-emancipated minors are not identified by existing inputs. + earned = ( + max_(person("employment_income", period), 0) + + person("self_employment_income", period) + ) * adult + # Children's unearned benefits and excluded members' income count in full. + # Medicare withholding is included in SSA. Child support, TANF, refunds, + # foster care, and occasional receipts are excluded. Existing input totals + # cannot isolate recurring versus occasional gifts/rent/interest, or all + # countable insurance proceeds, royalties, jury duty, and recurring prizes. + unearned = max_(add(person, period, p.unearned_income_sources), 0) + return max_(spm_unit.sum(earned + unearned), 0) diff --git a/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_income_limit.py b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_income_limit.py new file mode 100644 index 00000000000..90f2a1d76fb --- /dev/null +++ b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_income_limit.py @@ -0,0 +1,28 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.hhs.hhs_smi import smi + + +class ms_liheap_income_limit(Variable): + value_type = float + entity = SPMUnit + definition_period = YEAR + unit = USD + label = "Mississippi LIHEAP annual income limit" + defined_for = StateCode.MS + reference = "https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=58" + + def formula_2026(spm_unit, period, parameters): + p = parameters(period).gov.states.ms.mdhs.liheap + size = spm_unit("ms_liheap_household_size", period) + state = spm_unit.household("state_code_str", period) + federal = parameters(period).gov.hhs.smi + base = federal.amount[state] + # The published FY2026 limits truncate the four-person 60% SMI amount + # first, then the household-adjusted amount. This reproduces all 20 rows; + # it is a reconciled numerical pattern, not an explicit rounding rule. + amount = ( + smi(size, state, period, parameters) + * np.floor(base * p.income_limit) + / base + ) + return where(size > 0, np.floor(amount), 0) From d9a48471e8c794e3aeca1f619f7734582f014b16 Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 30 Sep 2026 19:59:25 -0400 Subject: [PATCH 2/7] Apply LIHEAP review fixes and shared guideline convention --- policyengine_us/programs.yaml | 3 ++- .../gov/states/ms/mdhs/liheap/integration.yaml | 13 +++++++++++-- .../gov/states/ms/mdhs/liheap/ms_liheap.py | 12 +++++++++--- .../states/ms/mdhs/liheap/ms_liheap_eligible.py | 2 +- .../ms/mdhs/liheap/ms_liheap_household_size.py | 7 ++++--- .../states/ms/mdhs/liheap/ms_liheap_income.py | 16 +++++++++------- .../ms/mdhs/liheap/ms_liheap_income_limit.py | 4 +++- 7 files changed, 39 insertions(+), 18 deletions(-) diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index e9d1013a4a2..fab4f780237 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -829,7 +829,8 @@ programs: full_name: Mississippi Low Income Home Energy Assistance Program variable: ms_liheap parameter_prefix: gov.states.ms.mdhs.liheap - notes: FY2026 regular heating only. Uses existing inputs and preserves published matrix anomalies. Unpublished income intervals and household sizes, unspecified heat-in-rent charges, propane delivery rules, prior awards, detailed household/income classifications, and administrative checks remain incomplete. + verified_years: "2026" + notes: FY2026 regular heating only. Uses existing inputs and preserves published matrix anomalies. Unpublished income intervals and household sizes, unspecified heat-in-rent charges, propane delivery rules, prior awards, detailed household/income classifications, and administrative checks remain incomplete. Earlier results use parameter backfilling and are unverified historical estimates. - state: TX status: partial name: Texas CEAP diff --git a/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/integration.yaml index 2b6aac88518..e0708c59f19 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/integration.yaml @@ -24,11 +24,20 @@ output: ms_liheap_household_size: 0 ms_liheap: 0 -- name: Years preceding researched coverage have no formula +# Backfilling checks the model convention, not verified historical MS policy. +# 2022 uses FY2022 SMI, with the earliest available state benefit matrix. +- name: Parameter backfill uses period-specific SMI for a 2022 estimate period: 2_022 input: state_code: MS + age: 40 + employment_income: 0 + ssi: 0 + social_security: 0 heating_type: ELECTRICITY pre_subsidy_electricity_expense: 1_000 output: - ms_liheap: 0 + ms_liheap: 1_000 + ms_liheap_household_size: 1 + ms_liheap_income_limit: 21_487 + ms_liheap_eligible: true diff --git a/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap.py b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap.py index 6265306edce..bf7637dc083 100644 --- a/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap.py +++ b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap.py @@ -7,14 +7,21 @@ class ms_liheap(Variable): definition_period = YEAR unit = USD label = "Mississippi LIHEAP regular heating assistance" + documentation = ( + "Verified for FY2026. Earlier years use model parameter backfilling " + "and are unverified historical estimates." + ) defined_for = "ms_liheap_eligible" reference = "https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=24,36,37,39,58,59,60,61,62,63,64" - def formula_2026(spm_unit, period, parameters): - # Coverage starts with the researched FY2026 schedule, not program inception. + def formula(spm_unit, period, parameters): p = parameters(period).gov.states.ms.mdhs.liheap size = spm_unit("ms_liheap_household_size", period) income = spm_unit("ms_liheap_income", period) + # Rule 7.8 A directs use of the attached matrix (PDF pp. 59-64). Neither + # the manual nor FY2026 plan section 2.5 defines 25% FPG bands or rounding. + # That numerical pattern is not an authorized replacement: the matrix + # prints $31,313 for size 3, five bands for size 8, and four for size 12. band = 0 for table_size in range(1, int(p.maximum_table_size) + 1): band = where( @@ -44,5 +51,4 @@ def formula_2026(spm_unit, period, parameters): # charge documentation/intake counts cannot be inferred, so that pathway is # not modeled. Source gaps (sizes 11/15 and upper ranges for 10/18/20) and # sizes above 20 also return zero as coverage gaps, not legal ineligibility. - # The table is retained because a smooth FPG formula does not reproduce it. return where(band > 0, min_(cap, expense), 0) diff --git a/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_eligible.py b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_eligible.py index 94a8035c939..0dee867259c 100644 --- a/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_eligible.py +++ b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_eligible.py @@ -9,7 +9,7 @@ class ms_liheap_eligible(Variable): defined_for = StateCode.MS reference = "https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=22,23,24,29,30,31,32,33" - def formula_2026(spm_unit, period, parameters): + def formula(spm_unit, period, parameters): p = parameters(period).gov.states.ms.mdhs.liheap size = spm_unit("ms_liheap_household_size", period) income = spm_unit("ms_liheap_income", period) diff --git a/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_household_size.py b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_household_size.py index 4150724788a..23a7e7c65c8 100644 --- a/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_household_size.py +++ b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_household_size.py @@ -7,10 +7,11 @@ class ms_liheap_household_size(Variable): definition_period = YEAR label = "Mississippi LIHEAP eligible household size" defined_for = StateCode.MS - reference = "https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=22,23,24,29,30,31,32,33" + reference = "https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=23" - def formula_2026(spm_unit, period, parameters): - # Rule 6.3 excludes undocumented members from size, not from income. + def formula(spm_unit, period, parameters): + # Rule 6.3(B)-(C), printed page 22 / PDF page 23, excludes undocumented + # non-applicants from size while including their countable income in full. # SPM units approximate the household; live-in attendants, boarders, and # their separate energy arrangements cannot be resolved with current inputs. return add(spm_unit, period, ["is_citizen_or_legal_immigrant"]) diff --git a/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_income.py b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_income.py index 4bdb4ff855e..c00fc208143 100644 --- a/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_income.py +++ b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_income.py @@ -10,20 +10,22 @@ class ms_liheap_income(Variable): defined_for = StateCode.MS reference = "https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=22,23,24,29,30,31,32,33" - def formula_2026(spm_unit, period, parameters): + def formula(spm_unit, period, parameters): p = parameters(period).gov.states.ms.mdhs.liheap person = spm_unit.members adult = person("age", period) >= p.adult_age - # Rule 6.11 I uses Schedule C net profit. Count existing net business - # income (including a Schedule C loss) once, without another business-expense - # deduction. Annual inputs - # approximate the annualized preceding 30 days; pay-frequency changes and - # court-emancipated minors are not identified by existing inputs. + # Rule 6.11 I(1) specifies Schedule C's Net Profit or (Loss) line / 12. + # Preserve the signed net amount: a loss can offset other household income. + # Do not deduct business expenses again. Annual inputs approximate the + # annualized preceding 30 days; pay-frequency changes and court-emancipated + # minors are not identified by existing inputs. earned = ( max_(person("employment_income", period), 0) + person("self_employment_income", period) ) * adult - # Children's unearned benefits and excluded members' income count in full. + # Rule 6.3(B)-(C) retains non-applicants' countable income without + # headcount proration; Rule 6.11 still controls source/age exclusions. + # Children's unearned benefits count in full. # Medicare withholding is included in SSA. Child support, TANF, refunds, # foster care, and occasional receipts are excluded. Existing input totals # cannot isolate recurring versus occasional gifts/rent/interest, or all diff --git a/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_income_limit.py b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_income_limit.py index 90f2a1d76fb..2ad5cc4259e 100644 --- a/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_income_limit.py +++ b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_income_limit.py @@ -11,7 +11,7 @@ class ms_liheap_income_limit(Variable): defined_for = StateCode.MS reference = "https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=58" - def formula_2026(spm_unit, period, parameters): + def formula(spm_unit, period, parameters): p = parameters(period).gov.states.ms.mdhs.liheap size = spm_unit("ms_liheap_household_size", period) state = spm_unit.household("state_code_str", period) @@ -20,6 +20,8 @@ def formula_2026(spm_unit, period, parameters): # The published FY2026 limits truncate the four-person 60% SMI amount # first, then the household-adjusted amount. This reproduces all 20 rows; # it is a reconciled numerical pattern, not an explicit rounding rule. + # Indiana's size-first truncation raises the FY2026 limits for sizes + # 5 through 20 by $1. Keep this ordering in state code. amount = ( smi(size, state, period, parameters) * np.floor(base * p.income_limit) From fafc5bb388a96309c59cecfb98f37f743649e7f0 Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 30 Sep 2026 23:05:55 -0400 Subject: [PATCH 3/7] Fix issues from review: Mississippi LIHEAP farm income, band tables and tests - Count farm_operations_income with self-employment income (Rule 6.11 C, I) - Remove the terminal zero bracket that duplicated the income limit in 17 income-band tables; keep it where it encodes a published gap - Disclose that the countable unearned list follows the manual where the state plan checklist differs - Add metadata.period to parameters - Add farm income, band-table and end-to-end tests Co-Authored-By: Claude Fable 5.1 --- .../gov/states/ms/mdhs/liheap/adult_age.yaml | 1 + .../states/ms/mdhs/liheap/income_bands/1.yaml | 7 +- .../ms/mdhs/liheap/income_bands/10.yaml | 1 + .../ms/mdhs/liheap/income_bands/11.yaml | 5 +- .../ms/mdhs/liheap/income_bands/12.yaml | 7 +- .../ms/mdhs/liheap/income_bands/13.yaml | 7 +- .../ms/mdhs/liheap/income_bands/14.yaml | 7 +- .../ms/mdhs/liheap/income_bands/15.yaml | 5 +- .../ms/mdhs/liheap/income_bands/16.yaml | 7 +- .../ms/mdhs/liheap/income_bands/17.yaml | 7 +- .../ms/mdhs/liheap/income_bands/18.yaml | 1 + .../ms/mdhs/liheap/income_bands/19.yaml | 7 +- .../states/ms/mdhs/liheap/income_bands/2.yaml | 7 +- .../ms/mdhs/liheap/income_bands/20.yaml | 1 + .../states/ms/mdhs/liheap/income_bands/3.yaml | 7 +- .../states/ms/mdhs/liheap/income_bands/4.yaml | 7 +- .../states/ms/mdhs/liheap/income_bands/5.yaml | 7 +- .../states/ms/mdhs/liheap/income_bands/6.yaml | 7 +- .../states/ms/mdhs/liheap/income_bands/7.yaml | 7 +- .../states/ms/mdhs/liheap/income_bands/8.yaml | 7 +- .../states/ms/mdhs/liheap/income_bands/9.yaml | 7 +- .../states/ms/mdhs/liheap/income_limit.yaml | 1 + .../ms/mdhs/liheap/maximum_payment.yaml | 1 + .../ms/mdhs/liheap/maximum_table_size.yaml | 1 + .../ms/mdhs/liheap/payment_reduction.yaml | 1 + .../mdhs/liheap/propane_exception_amount.yaml | 1 + .../propane_exception_household_size.yaml | 1 + .../liheap/propane_exception_income_band.yaml | 1 + .../mdhs/liheap/unearned_income_sources.yaml | 4 + policyengine_us/programs.yaml | 2 +- .../states/ms/mdhs/liheap/integration.yaml | 74 ++++++++++++ .../gov/states/ms/mdhs/liheap/ms_liheap.yaml | 110 ++++++++++++++++++ .../ms/mdhs/liheap/ms_liheap_eligible.yaml | 2 + .../ms/mdhs/liheap/ms_liheap_income.yaml | 93 +++++++++++++++ .../states/ms/mdhs/liheap/ms_liheap_income.py | 11 +- 35 files changed, 334 insertions(+), 88 deletions(-) diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/adult_age.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/adult_age.yaml index fb27cab5073..da2db1607b9 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/adult_age.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/adult_age.yaml @@ -3,6 +3,7 @@ values: 2025-10-01: 18 metadata: unit: year + period: year label: Mississippi LIHEAP adult age reference: - title: Mississippi LIHEAP Policy Manual, January 2026 revision diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/1.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/1.yaml index c097a32b201..015332635a4 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/1.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/1.yaml @@ -1,4 +1,4 @@ -description: Mississippi assigns these published heating income bands to a household of 1 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +description: Mississippi assigns these published heating income bands to a household of 1 eligible people under the Low Income Home Energy Assistance Program. brackets: - threshold: 2025-10-01: -.inf @@ -24,14 +24,11 @@ brackets: 2025-10-01: 19_563 amount: 2025-10-01: 6 - - threshold: - 2025-10-01: 26_740 - amount: - 2025-10-01: 0 metadata: type: single_amount threshold_unit: currency-USD amount_unit: /1 + period: year label: Mississippi LIHEAP income bands for 1 people reference: - title: Mississippi FY2026 benefit matrix, household size 1 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/10.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/10.yaml index 93fd66a78fd..c7d5c03bb16 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/10.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/10.yaml @@ -28,6 +28,7 @@ metadata: type: single_amount threshold_unit: currency-USD amount_unit: /1 + period: year label: Mississippi LIHEAP income bands for 10 people reference: - title: Mississippi FY2026 benefit matrix, household size 10 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/11.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/11.yaml index 5b9b07e6715..db2489cb244 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/11.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/11.yaml @@ -20,14 +20,11 @@ brackets: 2025-10-01: 52_988 amount: 2025-10-01: 4 - - threshold: - 2025-10-01: 75_593 - amount: - 2025-10-01: 0 metadata: type: single_amount threshold_unit: currency-USD amount_unit: /1 + period: year label: Mississippi LIHEAP income bands for 11 people reference: - title: Mississippi FY2026 benefit matrix, household size 11 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/12.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/12.yaml index df7eff75f7e..7bc98ec93bb 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/12.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/12.yaml @@ -1,4 +1,4 @@ -description: Mississippi assigns these published heating income bands to a household of 12 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +description: Mississippi assigns these published heating income bands to a household of 12 eligible people under the Low Income Home Energy Assistance Program. brackets: - threshold: 2025-10-01: -.inf @@ -16,14 +16,11 @@ brackets: 2025-10-01: 57_113 amount: 2025-10-01: 4 - - threshold: - 2025-10-01: 77_136 - amount: - 2025-10-01: 0 metadata: type: single_amount threshold_unit: currency-USD amount_unit: /1 + period: year label: Mississippi LIHEAP income bands for 12 people reference: - title: Mississippi FY2026 benefit matrix, household size 12 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/13.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/13.yaml index bea5c1a3286..bd0aecadab6 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/13.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/13.yaml @@ -1,4 +1,4 @@ -description: Mississippi assigns these published heating income bands to a household of 13 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +description: Mississippi assigns these published heating income bands to a household of 13 eligible people under the Low Income Home Energy Assistance Program. brackets: - threshold: 2025-10-01: -.inf @@ -16,14 +16,11 @@ brackets: 2025-10-01: 61_238 amount: 2025-10-01: 4 - - threshold: - 2025-10-01: 78_678 - amount: - 2025-10-01: 0 metadata: type: single_amount threshold_unit: currency-USD amount_unit: /1 + period: year label: Mississippi LIHEAP income bands for 13 people reference: - title: Mississippi FY2026 benefit matrix, household size 13 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/14.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/14.yaml index 81fc2bbb4ce..2aa41a5a0ed 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/14.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/14.yaml @@ -1,4 +1,4 @@ -description: Mississippi assigns these published heating income bands to a household of 14 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +description: Mississippi assigns these published heating income bands to a household of 14 eligible people under the Low Income Home Energy Assistance Program. brackets: - threshold: 2025-10-01: -.inf @@ -16,14 +16,11 @@ brackets: 2025-10-01: 65_363 amount: 2025-10-01: 4 - - threshold: - 2025-10-01: 80_221 - amount: - 2025-10-01: 0 metadata: type: single_amount threshold_unit: currency-USD amount_unit: /1 + period: year label: Mississippi LIHEAP income bands for 14 people reference: - title: Mississippi FY2026 benefit matrix, household size 14 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/15.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/15.yaml index 9367d47057f..a35bf14deff 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/15.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/15.yaml @@ -20,14 +20,11 @@ brackets: 2025-10-01: 69_488 amount: 2025-10-01: 4 - - threshold: - 2025-10-01: 81_764 - amount: - 2025-10-01: 0 metadata: type: single_amount threshold_unit: currency-USD amount_unit: /1 + period: year label: Mississippi LIHEAP income bands for 15 people reference: - title: Mississippi FY2026 benefit matrix, household size 15 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/16.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/16.yaml index 7f4b7945e65..90b39ceb40c 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/16.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/16.yaml @@ -1,4 +1,4 @@ -description: Mississippi assigns these published heating income bands to a household of 16 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +description: Mississippi assigns these published heating income bands to a household of 16 eligible people under the Low Income Home Energy Assistance Program. brackets: - threshold: 2025-10-01: -.inf @@ -16,14 +16,11 @@ brackets: 2025-10-01: 73_613 amount: 2025-10-01: 4 - - threshold: - 2025-10-01: 83_306 - amount: - 2025-10-01: 0 metadata: type: single_amount threshold_unit: currency-USD amount_unit: /1 + period: year label: Mississippi LIHEAP income bands for 16 people reference: - title: Mississippi FY2026 benefit matrix, household size 16 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/17.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/17.yaml index efa5d34a552..bfcf4963f3c 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/17.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/17.yaml @@ -1,4 +1,4 @@ -description: Mississippi assigns these published heating income bands to a household of 17 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +description: Mississippi assigns these published heating income bands to a household of 17 eligible people under the Low Income Home Energy Assistance Program. brackets: - threshold: 2025-10-01: -.inf @@ -16,14 +16,11 @@ brackets: 2025-10-01: 77_738 amount: 2025-10-01: 4 - - threshold: - 2025-10-01: 84_849 - amount: - 2025-10-01: 0 metadata: type: single_amount threshold_unit: currency-USD amount_unit: /1 + period: year label: Mississippi LIHEAP income bands for 17 people reference: - title: Mississippi FY2026 benefit matrix, household size 17 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/18.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/18.yaml index 1e42787b79a..7d32777e19e 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/18.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/18.yaml @@ -20,6 +20,7 @@ metadata: type: single_amount threshold_unit: currency-USD amount_unit: /1 + period: year label: Mississippi LIHEAP income bands for 18 people reference: - title: Mississippi FY2026 benefit matrix, household size 18 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/19.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/19.yaml index 124f55148de..72105fb1edc 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/19.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/19.yaml @@ -1,4 +1,4 @@ -description: Mississippi assigns these published heating income bands to a household of 19 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +description: Mississippi assigns these published heating income bands to a household of 19 eligible people under the Low Income Home Energy Assistance Program. brackets: - threshold: 2025-10-01: -.inf @@ -12,14 +12,11 @@ brackets: 2025-10-01: 57_325 amount: 2025-10-01: 3 - - threshold: - 2025-10-01: 87_935 - amount: - 2025-10-01: 0 metadata: type: single_amount threshold_unit: currency-USD amount_unit: /1 + period: year label: Mississippi LIHEAP income bands for 19 people reference: - title: Mississippi FY2026 benefit matrix, household size 19 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/2.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/2.yaml index 5cd7925d912..ab9245ca6c2 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/2.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/2.yaml @@ -1,4 +1,4 @@ -description: Mississippi assigns these published heating income bands to a household of 2 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +description: Mississippi assigns these published heating income bands to a household of 2 eligible people under the Low Income Home Energy Assistance Program. brackets: - threshold: 2025-10-01: -.inf @@ -24,14 +24,11 @@ brackets: 2025-10-01: 26_438 amount: 2025-10-01: 6 - - threshold: - 2025-10-01: 34_968 - amount: - 2025-10-01: 0 metadata: type: single_amount threshold_unit: currency-USD amount_unit: /1 + period: year label: Mississippi LIHEAP income bands for 2 people reference: - title: Mississippi FY2026 benefit matrix, household size 2 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/20.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/20.yaml index 1175dd9433d..b9b62e4c8a2 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/20.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/20.yaml @@ -16,6 +16,7 @@ metadata: type: single_amount threshold_unit: currency-USD amount_unit: /1 + period: year label: Mississippi LIHEAP income bands for 20 people reference: - title: Mississippi FY2026 benefit matrix, household size 20 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/3.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/3.yaml index da636f18ebf..a8c245bf4a5 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/3.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/3.yaml @@ -1,4 +1,4 @@ -description: Mississippi assigns these published heating income bands to a household of 3 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +description: Mississippi assigns these published heating income bands to a household of 3 eligible people under the Low Income Home Energy Assistance Program. brackets: - threshold: 2025-10-01: -.inf @@ -24,14 +24,11 @@ brackets: 2025-10-01: 31_313 amount: 2025-10-01: 6 - - threshold: - 2025-10-01: 43_196 - amount: - 2025-10-01: 0 metadata: type: single_amount threshold_unit: currency-USD amount_unit: /1 + period: year label: Mississippi LIHEAP income bands for 3 people reference: - title: Mississippi FY2026 benefit matrix, household size 3 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/4.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/4.yaml index b71c1dc9d2f..5095ca45a27 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/4.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/4.yaml @@ -1,4 +1,4 @@ -description: Mississippi assigns these published heating income bands to a household of 4 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +description: Mississippi assigns these published heating income bands to a household of 4 eligible people under the Low Income Home Energy Assistance Program. brackets: - threshold: 2025-10-01: -.inf @@ -24,14 +24,11 @@ brackets: 2025-10-01: 40_188 amount: 2025-10-01: 6 - - threshold: - 2025-10-01: 51_424 - amount: - 2025-10-01: 0 metadata: type: single_amount threshold_unit: currency-USD amount_unit: /1 + period: year label: Mississippi LIHEAP income bands for 4 people reference: - title: Mississippi FY2026 benefit matrix, household size 4 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/5.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/5.yaml index 622fe426b6e..7f98d17599e 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/5.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/5.yaml @@ -1,4 +1,4 @@ -description: Mississippi assigns these published heating income bands to a household of 5 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +description: Mississippi assigns these published heating income bands to a household of 5 eligible people under the Low Income Home Energy Assistance Program. brackets: - threshold: 2025-10-01: -.inf @@ -24,14 +24,11 @@ brackets: 2025-10-01: 47_063 amount: 2025-10-01: 6 - - threshold: - 2025-10-01: 59_651 - amount: - 2025-10-01: 0 metadata: type: single_amount threshold_unit: currency-USD amount_unit: /1 + period: year label: Mississippi LIHEAP income bands for 5 people reference: - title: Mississippi FY2026 benefit matrix, household size 5 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/6.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/6.yaml index a004d4758f5..7f0d3230cc2 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/6.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/6.yaml @@ -1,4 +1,4 @@ -description: Mississippi assigns these published heating income bands to a household of 6 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +description: Mississippi assigns these published heating income bands to a household of 6 eligible people under the Low Income Home Energy Assistance Program. brackets: - threshold: 2025-10-01: -.inf @@ -24,14 +24,11 @@ brackets: 2025-10-01: 53_938 amount: 2025-10-01: 6 - - threshold: - 2025-10-01: 67_879 - amount: - 2025-10-01: 0 metadata: type: single_amount threshold_unit: currency-USD amount_unit: /1 + period: year label: Mississippi LIHEAP income bands for 6 people reference: - title: Mississippi FY2026 benefit matrix, household size 6 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/7.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/7.yaml index 0e1db3ed818..0287111e06e 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/7.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/7.yaml @@ -1,4 +1,4 @@ -description: Mississippi assigns these published heating income bands to a household of 7 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +description: Mississippi assigns these published heating income bands to a household of 7 eligible people under the Low Income Home Energy Assistance Program. brackets: - threshold: 2025-10-01: -.inf @@ -24,14 +24,11 @@ brackets: 2025-10-01: 60_813 amount: 2025-10-01: 6 - - threshold: - 2025-10-01: 69_422 - amount: - 2025-10-01: 0 metadata: type: single_amount threshold_unit: currency-USD amount_unit: /1 + period: year label: Mississippi LIHEAP income bands for 7 people reference: - title: Mississippi FY2026 benefit matrix, household size 7 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/8.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/8.yaml index c1a924bb80b..16d560935eb 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/8.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/8.yaml @@ -1,4 +1,4 @@ -description: Mississippi assigns these published heating income bands to a household of 8 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +description: Mississippi assigns these published heating income bands to a household of 8 eligible people under the Low Income Home Energy Assistance Program. brackets: - threshold: 2025-10-01: -.inf @@ -20,14 +20,11 @@ brackets: 2025-10-01: 54_150 amount: 2025-10-01: 5 - - threshold: - 2025-10-01: 70_965 - amount: - 2025-10-01: 0 metadata: type: single_amount threshold_unit: currency-USD amount_unit: /1 + period: year label: Mississippi LIHEAP income bands for 8 people reference: - title: Mississippi FY2026 benefit matrix, household size 8 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/9.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/9.yaml index 63d1b36dfca..98dab067636 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/9.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/9.yaml @@ -1,4 +1,4 @@ -description: Mississippi assigns these published heating income bands to a household of 9 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +description: Mississippi assigns these published heating income bands to a household of 9 eligible people under the Low Income Home Energy Assistance Program. brackets: - threshold: 2025-10-01: -.inf @@ -20,14 +20,11 @@ brackets: 2025-10-01: 59_650 amount: 2025-10-01: 5 - - threshold: - 2025-10-01: 72_507 - amount: - 2025-10-01: 0 metadata: type: single_amount threshold_unit: currency-USD amount_unit: /1 + period: year label: Mississippi LIHEAP income bands for 9 people reference: - title: Mississippi FY2026 benefit matrix, household size 9 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_limit.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_limit.yaml index 6372e689fed..5b412a8f3e8 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_limit.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_limit.yaml @@ -3,6 +3,7 @@ values: 2025-10-01: 0.6 metadata: unit: /1 + period: year label: Mississippi LIHEAP income limit reference: - title: Mississippi LIHEAP Policy Manual, January 2026 revision diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/maximum_payment.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/maximum_payment.yaml index 339cda26535..e4a4ff42fd5 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/maximum_payment.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/maximum_payment.yaml @@ -23,6 +23,7 @@ NONE: 2025-10-01: 0 metadata: unit: currency-USD + period: year label: Mississippi LIHEAP maximum payment breakdown: - heating_type diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/maximum_table_size.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/maximum_table_size.yaml index f719271731c..0db7a6bc0fb 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/maximum_table_size.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/maximum_table_size.yaml @@ -3,6 +3,7 @@ values: 2025-10-01: 20 metadata: unit: person + period: year label: Mississippi LIHEAP maximum table size reference: - title: Mississippi LIHEAP Policy Manual, January 2026 revision diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/payment_reduction.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/payment_reduction.yaml index 285e33e8cba..5d157d4f307 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/payment_reduction.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/payment_reduction.yaml @@ -23,6 +23,7 @@ NONE: 2025-10-01: 0 metadata: unit: currency-USD + period: year label: Mississippi LIHEAP payment reduction breakdown: - heating_type diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_amount.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_amount.yaml index bfe8effef0c..99fdfbce9b2 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_amount.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_amount.yaml @@ -3,6 +3,7 @@ values: 2025-10-01: 350 metadata: unit: currency-USD + period: year label: Mississippi LIHEAP propane exception amount reference: - title: Mississippi LIHEAP Policy Manual, January 2026 revision diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_household_size.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_household_size.yaml index de5baff3342..08631605e82 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_household_size.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_household_size.yaml @@ -3,6 +3,7 @@ values: 2025-10-01: 16 metadata: unit: person + period: year label: Mississippi LIHEAP propane exception household size reference: - title: Mississippi LIHEAP Policy Manual, January 2026 revision diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_income_band.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_income_band.yaml index d2835619bfd..b7aefb70bac 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_income_band.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_income_band.yaml @@ -3,6 +3,7 @@ values: 2025-10-01: 4 metadata: unit: /1 + period: year label: Mississippi LIHEAP propane exception income band reference: - title: Mississippi LIHEAP Policy Manual, January 2026 revision diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/unearned_income_sources.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/unearned_income_sources.yaml index 4e6c7d791f6..f0131562cde 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/unearned_income_sources.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/unearned_income_sources.yaml @@ -10,12 +10,16 @@ values: - veterans_benefits - workers_compensation - disability_benefits + # FY2026 state plan section 1.9 leaves cash gifts, rental income, and + # interest, dividends, or royalties unchecked, while manual Rule 6.11 C(13), + # F(7)-(8) and K(1) count them; the model follows the manual. - financial_assistance - dividend_income - interest_income - rental_income metadata: unit: list + period: year label: Mississippi LIHEAP unearned income sources reference: - title: Mississippi LIHEAP Policy Manual, Rules 6.11 C, D, F and J diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index fab4f780237..cdc87f912ae 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -830,7 +830,7 @@ programs: variable: ms_liheap parameter_prefix: gov.states.ms.mdhs.liheap verified_years: "2026" - notes: FY2026 regular heating only. Uses existing inputs and preserves published matrix anomalies. Unpublished income intervals and household sizes, unspecified heat-in-rent charges, propane delivery rules, prior awards, detailed household/income classifications, and administrative checks remain incomplete. Earlier results use parameter backfilling and are unverified historical estimates. + notes: FY2026 regular heating only. Uses existing inputs and preserves published matrix anomalies. Unpublished income intervals and household sizes, unspecified heat-in-rent charges, propane delivery rules, prior awards, detailed household/income classifications, and administrative checks remain incomplete. FY2026 state plan section 1.9 leaves cash gifts, rental income, and interest, dividends, or royalties unchecked, while manual Rule 6.11 C(13), F(7)-(8) and K(1) count them; the model follows the manual. Earlier results use parameter backfilling and are unverified historical estimates. - state: TX status: partial name: Texas CEAP diff --git a/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/integration.yaml index e0708c59f19..3f3d3e53d4c 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/integration.yaml @@ -41,3 +41,77 @@ ms_liheap_household_size: 1 ms_liheap_income_limit: 21_487 ms_liheap_eligible: true +- name: Case 4, single parent with two children and full-time wages heats with electricity. + period: 2026 + input: + people: + person1: + age: 34 + employment_income: 28_080 + person2: + age: 9 + person3: + age: 6 + spm_units: + spm_unit: + members: [person1, person2, person3] + heating_type: ELECTRICITY + pre_subsidy_electricity_expense: 1_860 + households: + household: + members: [person1, person2, person3] + state_code: MS + output: + # Three citizens are counted. + ms_liheap_household_size: 3 + # Wages: 13.50 an hour * 2,080 hours = 28,080; no unearned income. + ms_liheap_income: 28_080 + # floor(0.6 * 85,708) = 51,424; size-3 share 0.52 + 2 * 0.16 = 0.84; + # floor(0.84 * 51,424) = floor(43,196.16) = 43,196. + ms_liheap_income_limit: 43_196 + # 28,080 <= 43,196, an adult is present and the household pays its heating bill. + ms_liheap_eligible: true + # Electricity bill: 155 a month * 12 = 1,860. + heating_expense: 1_860 + # Size-3 band 5 is 26,651-31,313 (matrix page 1). + # Total-electric cap: 1,500 - 100 * (5 - 1) = 1,100. Payment: min(1,100, 1,860) = 1,100. + ms_liheap: 1_100 +- name: Case 5, mixed-status two-earner family receives its full natural gas bill. + period: 2026 + input: + people: + person1: + age: 38 + employment_income: 24_960 + person2: + age: 36 + immigration_status: UNDOCUMENTED + employment_income: 16_640 + person3: + age: 10 + person4: + age: 7 + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + heating_type: NATURAL_GAS + gas_expense: 420 + households: + household: + members: [person1, person2, person3, person4] + state_code: MS + output: + # Rule 6.3 B-C: the undocumented adult is left out of household size, 4 - 1 = 3. + ms_liheap_household_size: 3 + # Both adults' wages count in full: 12 an hour * 2,080 hours = 24,960, plus + # 16 an hour * 1,040 hours = 16,640. 24,960 + 16,640 = 41,600. + ms_liheap_income: 41_600 + # Size 3, not 4: floor(0.84 * 51,424) = 43,196. + ms_liheap_income_limit: 43_196 + # 41,600 <= 43,196. + ms_liheap_eligible: true + # Natural gas bill: 35 a month * 12 = 420. + heating_expense: 420 + # Size-3 band 6 is 31,314-43,196 (matrix page 1). + # Natural gas cap: 700 - 50 * (6 - 1) = 450. Payment: min(450, 420) = 420. + ms_liheap: 420 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap.yaml b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap.yaml index ba23b94be36..6e250cc84cc 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap.yaml @@ -54,3 +54,113 @@ heating_expense: [2_000, 2_000, 2_000, 2_000, 2_000, 2_000, 2_000, 2_000, 2_000, 2_000] output: ms_liheap: [1_500, 0, 1_400, 1_300, 0, 1_200, 0, 0, 0, 0] +- name: Case 6, published size-three bands keep the 31,313 fifth-band top. + period: 2026 + input: + state_code: [MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS] + ms_liheap_eligible: [true, true, true, true, true, true, true, true, true, true, true] + ms_liheap_household_size: [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3] + ms_liheap_income: [6_663, 6_664, 13_325, 13_326, 19_988, 19_989, 26_650, 26_651, 31_313, 31_314, 43_196] + heating_type: [NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, + NATURAL_GAS, NATURAL_GAS, NATURAL_GAS] + gas_expense: [900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900] + output: + # Matrix page 1 (manual PDF page 59), household size 3: 0-6,663, 6,664-13,325, + # 13,326-19,988, 19,989-26,650, 26,651-31,313, 31,314-43,196. The fifth band + # ends at the printed 31,313 (a 125% poverty guideline step would be 33,313), + # so 31,314 is already band 6. 43,196 is the size-3 income limit. + # Bands: 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6. + # Natural gas cap = 700 - 50 * (band - 1): 700, 650, 600, 550, 500, 450. + # The 900 gas bill exceeds every cap, so each payment equals its cap. + ms_liheap: [700, 650, 650, 600, 600, 550, 550, 500, 500, 450, 450] +- name: Case 7, published size-eight table has five bands through the income limit. + period: 2026 + input: + state_code: [MS, MS, MS, MS, MS, MS, MS, MS, MS, MS] + ms_liheap_eligible: [true, true, true, true, true, true, true, true, true, true] + ms_liheap_household_size: [8, 8, 8, 8, 8, 8, 8, 8, 8, 8] + ms_liheap_income: [13_538, 13_539, 27_075, 27_076, 40_613, 40_614, 54_150, 54_151, 67_689, 70_965] + heating_type: [ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, + ELECTRICITY, ELECTRICITY] + pre_subsidy_electricity_expense: [2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400] + output: + # Matrix page 3 (manual PDF page 61), household size 8: 0-13,538, + # 13,539-27,075, 27,076-40,613, 40,614-54,150, 54,151-70,965. The table prints + # no sixth band: 67,689 (one dollar past a 125% poverty guideline step of + # 67,688) and the 70,965 income limit both stay in band 5. + # Bands: 1, 2, 2, 3, 3, 4, 4, 5, 5, 5. + # Total-electric cap = 1,500 - 100 * (band - 1): 1,500, 1,400, 1,300, 1,200, 1,100. + # The 2,400 electricity bill exceeds every cap, so each payment equals its cap. + ms_liheap: [1_500, 1_400, 1_400, 1_300, 1_300, 1_200, 1_200, 1_100, 1_100, 1_100] +- name: Case 8, published size-twelve table has four bands through the income limit. + period: 2026 + input: + state_code: [MS, MS, MS, MS, MS, MS, MS, MS] + ms_liheap_eligible: [true, true, true, true, true, true, true, true] + ms_liheap_household_size: [12, 12, 12, 12, 12, 12, 12, 12] + ms_liheap_income: [19_038, 19_039, 38_075, 38_076, 57_113, 57_114, 76_151, 77_136] + heating_type: [WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD] + wood_expense: [600, 600, 600, 600, 600, 600, 600, 600] + output: + # Matrix page 4 (manual PDF page 62), household size 12: 0-19,038, + # 19,039-38,075, 38,076-57,113, 57,114-77,136. The table prints no fifth + # band: 76,151 (one dollar past the 76,150 poverty guideline) and the 77,136 + # income limit both stay in band 4. + # Bands: 1, 2, 2, 3, 3, 4, 4, 4. + # Wood cap = 400 - 40 * (band - 1): 400, 360, 320, 280. + # The 600 wood bill exceeds every cap, so each payment equals its cap. + ms_liheap: [400, 360, 360, 320, 320, 280, 280, 280] +- name: Case 9, six-band tables for household sizes two and four through seven. + period: 2026 + input: + state_code: [MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS] + ms_liheap_eligible: [true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, + true, true, true, true] + ms_liheap_household_size: [2, 2, 2, 2, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7] + ms_liheap_income: [5_288, 15_864, 26_438, 34_968, 8_038, 24_114, 40_188, 51_424, 9_413, 28_239, 47_063, 59_651, + 10_788, 32_364, 53_938, 67_879, 12_163, 36_489, 60_813, 69_422] + heating_type: [PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, + PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE] + bottled_gas_expense: [1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200] + output: + # Four incomes per size: the first band top, the fourth band bottom, the + # fifth band top, and the income limit that closes the sixth band. + # Matrix page 1, size 2: 0-5,288; 15,864-21,150; 21,151-26,438; 26,439-34,968. + # Matrix page 2, size 4: 0-8,038; 24,114-32,150; 32,151-40,188; 40,189-51,424. + # Matrix page 2, size 5: 0-9,413; 28,239-37,650; 37,651-47,063; 47,064-59,651. + # Matrix page 2, size 6: 0-10,788; 32,364-43,150; 43,151-53,938; 53,939-67,879. + # Matrix page 3, size 7: 0-12,163; 36,489-48,650; 48,651-60,813; 60,814-69,422. + # Bands for every size: 1, 4, 5, 6. + # Propane cap = 800 - 50 * (band - 1): 800, 650, 600, 550. + # The 1,200 propane bill exceeds every cap, so each payment equals its cap. + ms_liheap: [800, 650, 600, 550, 800, 650, 600, 550, 800, 650, 600, 550, 800, 650, 600, 550, 800, 650, 600, 550] +- name: Case 10, shorter tables for household sizes nine, thirteen, fourteen, seventeen and nineteen. + period: 2026 + input: + state_code: [MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS] + ms_liheap_eligible: [true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, + true, true, true, true] + ms_liheap_household_size: [9, 9, 9, 9, 13, 13, 13, 13, 14, 14, 14, 14, 17, 17, 17, 17, 19, 19, 19, 19] + ms_liheap_income: [14_913, 29_826, 59_650, 72_507, 20_413, 40_826, 61_238, 78_678, 21_788, 43_576, 65_363, 80_221, + 25_913, 51_826, 77_738, 84_849, 28_663, 57_325, 57_326, 87_935] + heating_type: [ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, + ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, + ELECTRICITY, ELECTRICITY, ELECTRICITY] + pre_subsidy_electricity_expense: [2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, + 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400] + output: + # Total-electric cap = 1,500 - 100 * (band - 1): 1,500, 1,400, 1,300, 1,200, 1,100. + # The 2,400 electricity bill exceeds every cap, so each payment equals its cap. + # Matrix page 3, size 9 (five bands): 0-14,913 band 1; 29,826-44,738 band 3; + # 44,739-59,650 band 4; 59,651-72,507 band 5. Bands: 1, 3, 4, 5. + # Matrix page 4, size 13 (four bands): 0-20,413 band 1; 40,826-61,238 band 3; + # 61,239-78,678 band 4. Bands: 1, 3, 3, 4. + # Matrix page 5, size 14 (four bands): 0-21,788 band 1; 43,576-65,363 band 3; + # 65,364-80,221 band 4. Bands: 1, 3, 3, 4. + # Matrix page 5, size 17 (four bands): 0-25,913 band 1; 51,826-77,738 band 3; + # 77,739-84,849 band 4. Bands: 1, 3, 3, 4. + # Matrix page 6, size 19 (three bands): 0-28,663 band 1; 28,664-57,325 band 2; + # 57,326-87,935 band 3. Bands: 1, 2, 3, 3. + ms_liheap: [1_500, 1_300, 1_200, 1_100, 1_500, 1_300, 1_300, 1_200, 1_500, 1_300, 1_300, 1_200, 1_500, 1_300, 1_300, + 1_200, 1_500, 1_400, 1_300, 1_300] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_eligible.yaml index ba90691159a..5825766e1bb 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_eligible.yaml @@ -4,6 +4,7 @@ state_code: [MS, MS] age: [40, 40] ms_liheap_income: [26_740, 26_741] + heating_type: [ELECTRICITY, ELECTRICITY] heating_expense: [1_000, 1_000] output: ms_liheap_eligible: [true, false] @@ -13,6 +14,7 @@ state_code: [MS, MS, MS, MS, MS] age: [40, 40, 40, 40, 17] ms_liheap_income: [0, 0, 0, 0, 0] + heating_type: [ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY] heating_expense: [0, 0, 0, 1_000, 1_000] heat_expense_included_in_rent: [false, true, true, false, false] receives_housing_assistance: [false, false, true, true, false] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_income.yaml index 02189809f6e..81bbec02a64 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_income.yaml @@ -42,6 +42,7 @@ spm_units: unit: members: [adult, child] + heating_type: ELECTRICITY heating_expense: 1_000 households: home: @@ -51,3 +52,95 @@ ms_liheap_household_size: 1 ms_liheap_income: 15_600 ms_liheap_eligible: true +- name: Case 4, three-person household with farm income above the limit is ineligible. + period: 2026 + input: + people: + person1: + age: 45 + farm_operations_income: 48_000 + person2: + age: 43 + person3: + age: 12 + spm_units: + spm_unit: + members: [person1, person2, person3] + heating_type: PROPANE + bottled_gas_expense: 1_200 + households: + household: + members: [person1, person2, person3] + state_code: MS + output: + ms_liheap_household_size: 3 + # Rule 6.11 C(2) and I(1)-(2): Schedule F net farm profit counts with + # self-employment income. 48,000 farm + 0 wages + 0 unearned = 48,000. + ms_liheap_income: 48_000 + # floor(0.6 * 85,708) = 51,424; size-3 share 0.52 + 2 * 0.16 = 0.84; + # floor(0.84 * 51,424) = floor(43,196.16) = 43,196. + ms_liheap_income_limit: 43_196 + # 48,000 > 43,196. + ms_liheap_eligible: false + ms_liheap: 0 +- name: Case 5, three-person household with smaller farm income lands in the fourth band. + period: 2026 + input: + people: + person1: + age: 45 + farm_operations_income: 24_000 + person2: + age: 43 + person3: + age: 12 + spm_units: + spm_unit: + members: [person1, person2, person3] + heating_type: PROPANE + bottled_gas_expense: 1_200 + households: + household: + members: [person1, person2, person3] + state_code: MS + output: + ms_liheap_household_size: 3 + # 24,000 farm + 0 wages + 0 unearned = 24,000. + ms_liheap_income: 24_000 + ms_liheap_income_limit: 43_196 + # 24,000 <= 43,196. + ms_liheap_eligible: true + # Size-3 band 4 is 19,989-26,650 (matrix page 1). + # Propane cap: 800 - 50 * (4 - 1) = 650. Payment: min(650, 1,200) = 650. + ms_liheap: 650 +- name: Case 6, farm loss offsets a spouse's wages. + period: 2026 + input: + people: + person1: + age: 45 + farm_operations_income: -8_000 + person2: + age: 43 + employment_income: 30_000 + person3: + age: 12 + spm_units: + spm_unit: + members: [person1, person2, person3] + heating_type: PROPANE + bottled_gas_expense: 1_200 + households: + household: + members: [person1, person2, person3] + state_code: MS + output: + ms_liheap_household_size: 3 + # Rule 6.11 I(1) uses the net profit or (loss) line, so the signed farm + # result is counted: 30,000 wages - 8,000 farm loss = 22,000. + ms_liheap_income: 22_000 + ms_liheap_income_limit: 43_196 + ms_liheap_eligible: true + # Size-3 band 4 is 19,989-26,650 (wages alone, 30,000, would be band 5). + # Propane cap: 800 - 50 * (4 - 1) = 650. Payment: min(650, 1,200) = 650. + ms_liheap: 650 diff --git a/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_income.py b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_income.py index c00fc208143..d5b9295c6b0 100644 --- a/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_income.py +++ b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_income.py @@ -15,14 +15,17 @@ def formula(spm_unit, period, parameters): person = spm_unit.members adult = person("age", period) >= p.adult_age # Rule 6.11 I(1) specifies Schedule C's Net Profit or (Loss) line / 12. + # Rule 6.11 C(2) counts self-employment income and I(2) uses a farmer as + # its example, so farm operations income is counted the same signed way. # Preserve the signed net amount: a loss can offset other household income. # Do not deduct business expenses again. Annual inputs approximate the # annualized preceding 30 days; pay-frequency changes and court-emancipated # minors are not identified by existing inputs. - earned = ( - max_(person("employment_income", period), 0) - + person("self_employment_income", period) - ) * adult + self_employment = add( + person, period, ["self_employment_income", "farm_operations_income"] + ) + wages = max_(person("employment_income", period), 0) + earned = (wages + self_employment) * adult # Rule 6.3(B)-(C) retains non-applicants' countable income without # headcount proration; Rule 6.11 still controls source/age exclusions. # Children's unearned benefits count in full. From bfaeb8570d218aa6a86f34d3a30f1398297e0f42 Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 30 Sep 2026 23:51:01 -0400 Subject: [PATCH 4/7] Use ordinary_dividend_income in Mississippi LIHEAP income sources Replace the deprecated dividend_income alias. Results are unchanged because the alias only adds ordinary_dividend_income. Co-Authored-By: Claude Fable 5.1 --- .../gov/states/ms/mdhs/liheap/unearned_income_sources.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/unearned_income_sources.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/unearned_income_sources.yaml index f0131562cde..4daec824194 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/unearned_income_sources.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/unearned_income_sources.yaml @@ -14,7 +14,7 @@ values: # interest, dividends, or royalties unchecked, while manual Rule 6.11 C(13), # F(7)-(8) and K(1) count them; the model follows the manual. - financial_assistance - - dividend_income + - ordinary_dividend_income - interest_income - rental_income metadata: From 45304bc1ceea4b730d0c76364e7073510a0d54b3 Mon Sep 17 00:00:00 2001 From: Ziming Date: Thu, 1 Oct 2026 01:26:39 -0400 Subject: [PATCH 5/7] Count SSTB income in Mississippi LIHEAP --- .../ms/mdhs/liheap/ms_liheap_income.yaml | 22 ++++++++++++++++++- .../states/ms/mdhs/liheap/ms_liheap_income.py | 8 ++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_income.yaml index 81bbec02a64..484337c1338 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_income.yaml @@ -4,7 +4,8 @@ state_code: [MS, MS, MS] age: [40, 40, 40] employment_income: [12_000, 12_000, 12_000] - self_employment_income: [6_000, -6_000, -18_000] + self_employment_income: [4_000, -4_000, -12_000] + sstb_self_employment_income: [2_000, -2_000, -6_000] ssi: [0, 0, 0] social_security: [0, 0, 0] output: @@ -37,6 +38,7 @@ child: age: 15 employment_income: 6_000 + sstb_self_employment_income: 2_000 ssi: 2_400 social_security: 1_200 spm_units: @@ -113,6 +115,24 @@ # Size-3 band 4 is 19,989-26,650 (matrix page 1). # Propane cap: 800 - 50 * (4 - 1) = 650. Payment: min(650, 1,200) = 650. ms_liheap: 650 + +- name: Service business profits above the income limit prevent a heating award + # Rule 6.11 C(2) and I(1): existing net business profits count regardless + # of whether the business is a specified service trade or business. + period: 2026 + input: + state_code: MS + age: 40 + sstb_self_employment_income: 60_000 + ssi: 0 + social_security: 0 + heating_type: NATURAL_GAS + gas_expense: 1_000 + output: + ms_liheap_income: 60_000 + # floor(floor(85,708 * 0.6) * 0.52) = 26,740 < 60,000. + ms_liheap_eligible: false + ms_liheap: 0 - name: Case 6, farm loss offsets a spouse's wages. period: 2026 input: diff --git a/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_income.py b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_income.py index d5b9295c6b0..af5db55f9bb 100644 --- a/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_income.py +++ b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_income.py @@ -22,7 +22,13 @@ def formula(spm_unit, period, parameters): # annualized preceding 30 days; pay-frequency changes and court-emancipated # minors are not identified by existing inputs. self_employment = add( - person, period, ["self_employment_income", "farm_operations_income"] + person, + period, + [ + "self_employment_income", + "sstb_self_employment_income", + "farm_operations_income", + ], ) wages = max_(person("employment_income", period), 0) earned = (wages + self_employment) * adult From b7885ff92ab55cdc82fe95cd905a4c2473817a48 Mon Sep 17 00:00:00 2001 From: Ziming Date: Thu, 1 Oct 2026 17:43:29 -0400 Subject: [PATCH 6/7] Shorten the Mississippi LIHEAP registry note Co-Authored-By: Claude Fable 5.1 --- policyengine_us/programs.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index cdc87f912ae..c74656b0f85 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -830,7 +830,7 @@ programs: variable: ms_liheap parameter_prefix: gov.states.ms.mdhs.liheap verified_years: "2026" - notes: FY2026 regular heating only. Uses existing inputs and preserves published matrix anomalies. Unpublished income intervals and household sizes, unspecified heat-in-rent charges, propane delivery rules, prior awards, detailed household/income classifications, and administrative checks remain incomplete. FY2026 state plan section 1.9 leaves cash gifts, rental income, and interest, dividends, or royalties unchecked, while manual Rule 6.11 C(13), F(7)-(8) and K(1) count them; the model follows the manual. Earlier results use parameter backfilling and are unverified historical estimates. + notes: FY2026 regular heating only, using the published income bands as printed. Crisis and cooling assistance are out of scope. - state: TX status: partial name: Texas CEAP From 6a6a756310d50935c41d344cac03541859b096df Mon Sep 17 00:00:00 2001 From: Ziming Date: Fri, 2 Oct 2026 12:35:31 -0400 Subject: [PATCH 7/7] Address Mississippi LIHEAP review Pay the electric column to households not heated by electricity, in addition to the main heating fuel column (Rule 7.8 D), and accept any energy bill as responsibility (Rule 6.1 A). Count Railroad Retirement benefits. Compute the income limit without a division round trip. Use single-page references that name the rule, add FY2026 plan and matrix references, fix test periods and names, make household size a plain sum, rewrite descriptions and labels, and add boundary tests for the remaining band tables, the propane exception and the housing branches. Co-Authored-By: Claude Fable 5.1 --- changelog.d/ms-liheap.added.md | 2 +- .../gov/states/ms/mdhs/liheap/adult_age.yaml | 6 +- .../mdhs/liheap/electric_maximum_payment.yaml | 12 + .../liheap/electric_payment_reduction.yaml | 10 + .../states/ms/mdhs/liheap/income_bands/1.yaml | 6 +- .../ms/mdhs/liheap/income_bands/10.yaml | 9 +- .../ms/mdhs/liheap/income_bands/11.yaml | 8 +- .../ms/mdhs/liheap/income_bands/12.yaml | 6 +- .../ms/mdhs/liheap/income_bands/13.yaml | 6 +- .../ms/mdhs/liheap/income_bands/14.yaml | 6 +- .../ms/mdhs/liheap/income_bands/15.yaml | 8 +- .../ms/mdhs/liheap/income_bands/16.yaml | 6 +- .../ms/mdhs/liheap/income_bands/17.yaml | 6 +- .../ms/mdhs/liheap/income_bands/18.yaml | 8 +- .../ms/mdhs/liheap/income_bands/19.yaml | 6 +- .../states/ms/mdhs/liheap/income_bands/2.yaml | 6 +- .../ms/mdhs/liheap/income_bands/20.yaml | 8 +- .../states/ms/mdhs/liheap/income_bands/3.yaml | 6 +- .../states/ms/mdhs/liheap/income_bands/4.yaml | 6 +- .../states/ms/mdhs/liheap/income_bands/5.yaml | 6 +- .../states/ms/mdhs/liheap/income_bands/6.yaml | 6 +- .../states/ms/mdhs/liheap/income_bands/7.yaml | 6 +- .../states/ms/mdhs/liheap/income_bands/8.yaml | 6 +- .../states/ms/mdhs/liheap/income_bands/9.yaml | 6 +- .../states/ms/mdhs/liheap/income_limit.yaml | 6 +- .../ms/mdhs/liheap/maximum_payment.yaml | 8 +- .../ms/mdhs/liheap/maximum_table_size.yaml | 6 +- .../ms/mdhs/liheap/payment_reduction.yaml | 6 +- .../mdhs/liheap/propane_exception_amount.yaml | 6 +- .../propane_exception_household_size.yaml | 6 +- .../liheap/propane_exception_income_band.yaml | 6 +- .../mdhs/liheap/unearned_income_sources.yaml | 10 +- policyengine_us/programs.yaml | 4 +- .../states/ms/mdhs/liheap/integration.yaml | 71 +++++- .../gov/states/ms/mdhs/liheap/ms_liheap.yaml | 235 +++++++++++++++++- .../ms/mdhs/liheap/ms_liheap_eligible.yaml | 52 +++- .../ms/mdhs/liheap/ms_liheap_income.yaml | 77 ++++-- .../mdhs/liheap/ms_liheap_income_limit.yaml | 16 +- .../gov/states/ms/mdhs/liheap/ms_liheap.py | 77 ++++-- .../ms/mdhs/liheap/ms_liheap_eligible.py | 31 ++- .../mdhs/liheap/ms_liheap_household_size.py | 24 +- .../states/ms/mdhs/liheap/ms_liheap_income.py | 18 +- .../ms/mdhs/liheap/ms_liheap_income_limit.py | 23 +- 43 files changed, 661 insertions(+), 182 deletions(-) create mode 100644 policyengine_us/parameters/gov/states/ms/mdhs/liheap/electric_maximum_payment.yaml create mode 100644 policyengine_us/parameters/gov/states/ms/mdhs/liheap/electric_payment_reduction.yaml diff --git a/changelog.d/ms-liheap.added.md b/changelog.d/ms-liheap.added.md index dfb3052460f..f936aebcc95 100644 --- a/changelog.d/ms-liheap.added.md +++ b/changelog.d/ms-liheap.added.md @@ -1 +1 @@ -Add partial FY2026 Mississippi LIHEAP regular heating assistance using existing inputs. +Add Mississippi LIHEAP regular assistance for heating fuel and electric bills (FY2026). diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/adult_age.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/adult_age.yaml index da2db1607b9..ad903737266 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/adult_age.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/adult_age.yaml @@ -1,4 +1,4 @@ -description: Mississippi counts earned income beginning at this age, except for emancipated minors under the Low Income Home Energy Assistance Program. +description: Mississippi sets this minimum age for the applicant and for counting earned income under the Low Income Home Energy Assistance Program. values: 2025-10-01: 18 metadata: @@ -6,5 +6,5 @@ metadata: period: year label: Mississippi LIHEAP adult age reference: - - title: Mississippi LIHEAP Policy Manual, January 2026 revision - href: https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=30,33 + - title: Mississippi LIHEAP Policy Manual, Rule 6.1 D, Rule 6.11 D(3) and Rule 6.11 J(1), pages 22, 30 and 33 + href: https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=22 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/electric_maximum_payment.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/electric_maximum_payment.yaml new file mode 100644 index 00000000000..4699b6dff86 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/electric_maximum_payment.yaml @@ -0,0 +1,12 @@ +description: Mississippi provides this amount as the first income band electric bill cap to households whose main heating fuel is not electricity under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: 700 +metadata: + unit: currency-USD + period: year + label: Mississippi LIHEAP first income band electric bill cap + reference: + - title: Mississippi FY2026 benefit matrix, Electric column, pages 1-6 + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=1 + - title: Mississippi LIHEAP Policy Manual, Rule 7.8 C and D, page 39 + href: https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=39 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/electric_payment_reduction.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/electric_payment_reduction.yaml new file mode 100644 index 00000000000..b258ba23af8 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/electric_payment_reduction.yaml @@ -0,0 +1,10 @@ +description: Mississippi reduces the electric bill cap by this amount for each income band above the first under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: 50 +metadata: + unit: currency-USD + period: year + label: Mississippi LIHEAP electric bill cap reduction + reference: + - title: Mississippi FY2026 benefit matrix, Electric column, pages 1-6 + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/1.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/1.yaml index 015332635a4..34baccdb899 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/1.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/1.yaml @@ -1,4 +1,4 @@ -description: Mississippi assigns these published heating income bands to a household of 1 eligible people under the Low Income Home Energy Assistance Program. +description: Mississippi sets these income bands for an eligible household of 1 member under the Low Income Home Energy Assistance Program. brackets: - threshold: 2025-10-01: -.inf @@ -29,7 +29,7 @@ metadata: threshold_unit: currency-USD amount_unit: /1 period: year - label: Mississippi LIHEAP income bands for 1 people + label: Mississippi LIHEAP income bands for household size 1 reference: - - title: Mississippi FY2026 benefit matrix, household size 1 + - title: Mississippi FY2026 benefit matrix, household size 1, page 1 href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/10.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/10.yaml index c7d5c03bb16..3257118f8ba 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/10.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/10.yaml @@ -1,4 +1,4 @@ -description: Mississippi assigns these published heating income bands to a household of 10 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +description: Mississippi sets these income bands for an eligible household of 10 members under the Low Income Home Energy Assistance Program. brackets: - threshold: 2025-10-01: -.inf @@ -8,6 +8,7 @@ brackets: 2025-10-01: 16_288 amount: 2025-10-01: 2 + # The matrix prints 35,325 as the second-band top; encoded as published. - threshold: 2025-10-01: 35_325 amount: @@ -20,6 +21,8 @@ brackets: 2025-10-01: 65_150 amount: 2025-10-01: 5 + # The matrix prints no band above 72,507, below the size-10 income limit of + # 74,050. Zero denotes an interval not covered by the published matrix. - threshold: 2025-10-01: 72_507 amount: @@ -29,7 +32,7 @@ metadata: threshold_unit: currency-USD amount_unit: /1 period: year - label: Mississippi LIHEAP income bands for 10 people + label: Mississippi LIHEAP income bands for household size 10 reference: - - title: Mississippi FY2026 benefit matrix, household size 10 + - title: Mississippi FY2026 benefit matrix, household size 10, page 4 href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=4 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/11.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/11.yaml index db2489cb244..a5a02d09b42 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/11.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/11.yaml @@ -1,9 +1,11 @@ -description: Mississippi assigns these published heating income bands to a household of 11 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +description: Mississippi sets these income bands for an eligible household of 11 members under the Low Income Home Energy Assistance Program. brackets: - threshold: 2025-10-01: -.inf amount: 2025-10-01: 1 + # The matrix prints 0-17,633 and then 17,664-35,325. Zero denotes the interval + # 17,634-17,663, which the published matrix does not cover. - threshold: 2025-10-01: 17_633 amount: @@ -25,7 +27,7 @@ metadata: threshold_unit: currency-USD amount_unit: /1 period: year - label: Mississippi LIHEAP income bands for 11 people + label: Mississippi LIHEAP income bands for household size 11 reference: - - title: Mississippi FY2026 benefit matrix, household size 11 + - title: Mississippi FY2026 benefit matrix, household size 11, page 4 href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=4 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/12.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/12.yaml index 7bc98ec93bb..a0c44226c2a 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/12.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/12.yaml @@ -1,4 +1,4 @@ -description: Mississippi assigns these published heating income bands to a household of 12 eligible people under the Low Income Home Energy Assistance Program. +description: Mississippi sets these income bands for an eligible household of 12 members under the Low Income Home Energy Assistance Program. brackets: - threshold: 2025-10-01: -.inf @@ -21,7 +21,7 @@ metadata: threshold_unit: currency-USD amount_unit: /1 period: year - label: Mississippi LIHEAP income bands for 12 people + label: Mississippi LIHEAP income bands for household size 12 reference: - - title: Mississippi FY2026 benefit matrix, household size 12 + - title: Mississippi FY2026 benefit matrix, household size 12, page 4 href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=4 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/13.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/13.yaml index bd0aecadab6..25b0f02ca66 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/13.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/13.yaml @@ -1,4 +1,4 @@ -description: Mississippi assigns these published heating income bands to a household of 13 eligible people under the Low Income Home Energy Assistance Program. +description: Mississippi sets these income bands for an eligible household of 13 members under the Low Income Home Energy Assistance Program. brackets: - threshold: 2025-10-01: -.inf @@ -21,7 +21,7 @@ metadata: threshold_unit: currency-USD amount_unit: /1 period: year - label: Mississippi LIHEAP income bands for 13 people + label: Mississippi LIHEAP income bands for household size 13 reference: - - title: Mississippi FY2026 benefit matrix, household size 13 + - title: Mississippi FY2026 benefit matrix, household size 13, page 4 href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=4 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/14.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/14.yaml index 2aa41a5a0ed..838f275d896 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/14.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/14.yaml @@ -1,4 +1,4 @@ -description: Mississippi assigns these published heating income bands to a household of 14 eligible people under the Low Income Home Energy Assistance Program. +description: Mississippi sets these income bands for an eligible household of 14 members under the Low Income Home Energy Assistance Program. brackets: - threshold: 2025-10-01: -.inf @@ -21,7 +21,7 @@ metadata: threshold_unit: currency-USD amount_unit: /1 period: year - label: Mississippi LIHEAP income bands for 14 people + label: Mississippi LIHEAP income bands for household size 14 reference: - - title: Mississippi FY2026 benefit matrix, household size 14 + - title: Mississippi FY2026 benefit matrix, household size 14, page 5 href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=5 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/15.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/15.yaml index a35bf14deff..c02c154492f 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/15.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/15.yaml @@ -1,4 +1,4 @@ -description: Mississippi assigns these published heating income bands to a household of 15 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +description: Mississippi sets these income bands for an eligible household of 15 members under the Low Income Home Energy Assistance Program. brackets: - threshold: 2025-10-01: -.inf @@ -12,6 +12,8 @@ brackets: 2025-10-01: 46_325 amount: 2025-10-01: 3 + # The matrix prints 46,326-68,488 and then 69,489-81,764. Zero denotes the + # interval 68,489-69,488, which the published matrix does not cover. - threshold: 2025-10-01: 68_488 amount: @@ -25,7 +27,7 @@ metadata: threshold_unit: currency-USD amount_unit: /1 period: year - label: Mississippi LIHEAP income bands for 15 people + label: Mississippi LIHEAP income bands for household size 15 reference: - - title: Mississippi FY2026 benefit matrix, household size 15 + - title: Mississippi FY2026 benefit matrix, household size 15, page 5 href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=5 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/16.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/16.yaml index 90b39ceb40c..0cd023f94ce 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/16.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/16.yaml @@ -1,4 +1,4 @@ -description: Mississippi assigns these published heating income bands to a household of 16 eligible people under the Low Income Home Energy Assistance Program. +description: Mississippi sets these income bands for an eligible household of 16 members under the Low Income Home Energy Assistance Program. brackets: - threshold: 2025-10-01: -.inf @@ -21,7 +21,7 @@ metadata: threshold_unit: currency-USD amount_unit: /1 period: year - label: Mississippi LIHEAP income bands for 16 people + label: Mississippi LIHEAP income bands for household size 16 reference: - - title: Mississippi FY2026 benefit matrix, household size 16 + - title: Mississippi FY2026 benefit matrix, household size 16, page 5 href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=5 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/17.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/17.yaml index bfcf4963f3c..5ab41153e0e 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/17.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/17.yaml @@ -1,4 +1,4 @@ -description: Mississippi assigns these published heating income bands to a household of 17 eligible people under the Low Income Home Energy Assistance Program. +description: Mississippi sets these income bands for an eligible household of 17 members under the Low Income Home Energy Assistance Program. brackets: - threshold: 2025-10-01: -.inf @@ -21,7 +21,7 @@ metadata: threshold_unit: currency-USD amount_unit: /1 period: year - label: Mississippi LIHEAP income bands for 17 people + label: Mississippi LIHEAP income bands for household size 17 reference: - - title: Mississippi FY2026 benefit matrix, household size 17 + - title: Mississippi FY2026 benefit matrix, household size 17, page 5 href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=5 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/18.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/18.yaml index 7d32777e19e..4b8efb61438 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/18.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/18.yaml @@ -1,4 +1,4 @@ -description: Mississippi assigns these published heating income bands to a household of 18 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +description: Mississippi sets these income bands for an eligible household of 18 members under the Low Income Home Energy Assistance Program. brackets: - threshold: 2025-10-01: -.inf @@ -12,6 +12,8 @@ brackets: 2025-10-01: 54_575 amount: 2025-10-01: 3 + # The matrix prints no band above 84,849, below the size-18 income limit of + # 86,392. Zero denotes an interval not covered by the published matrix. - threshold: 2025-10-01: 84_849 amount: @@ -21,7 +23,7 @@ metadata: threshold_unit: currency-USD amount_unit: /1 period: year - label: Mississippi LIHEAP income bands for 18 people + label: Mississippi LIHEAP income bands for household size 18 reference: - - title: Mississippi FY2026 benefit matrix, household size 18 + - title: Mississippi FY2026 benefit matrix, household size 18, page 6 href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=6 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/19.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/19.yaml index 72105fb1edc..7a1b37c021f 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/19.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/19.yaml @@ -1,4 +1,4 @@ -description: Mississippi assigns these published heating income bands to a household of 19 eligible people under the Low Income Home Energy Assistance Program. +description: Mississippi sets these income bands for an eligible household of 19 members under the Low Income Home Energy Assistance Program. brackets: - threshold: 2025-10-01: -.inf @@ -17,7 +17,7 @@ metadata: threshold_unit: currency-USD amount_unit: /1 period: year - label: Mississippi LIHEAP income bands for 19 people + label: Mississippi LIHEAP income bands for household size 19 reference: - - title: Mississippi FY2026 benefit matrix, household size 19 + - title: Mississippi FY2026 benefit matrix, household size 19, page 6 href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=6 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/2.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/2.yaml index ab9245ca6c2..fe18e9696f1 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/2.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/2.yaml @@ -1,4 +1,4 @@ -description: Mississippi assigns these published heating income bands to a household of 2 eligible people under the Low Income Home Energy Assistance Program. +description: Mississippi sets these income bands for an eligible household of 2 members under the Low Income Home Energy Assistance Program. brackets: - threshold: 2025-10-01: -.inf @@ -29,7 +29,7 @@ metadata: threshold_unit: currency-USD amount_unit: /1 period: year - label: Mississippi LIHEAP income bands for 2 people + label: Mississippi LIHEAP income bands for household size 2 reference: - - title: Mississippi FY2026 benefit matrix, household size 2 + - title: Mississippi FY2026 benefit matrix, household size 2, page 1 href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/20.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/20.yaml index b9b62e4c8a2..b46ae5383ce 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/20.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/20.yaml @@ -1,4 +1,4 @@ -description: Mississippi assigns these published heating income bands to a household of 20 eligible people under the Low Income Home Energy Assistance Program; zero denotes an interval not covered by the published matrix. +description: Mississippi sets these income bands for an eligible household of 20 members under the Low Income Home Energy Assistance Program. brackets: - threshold: 2025-10-01: -.inf @@ -8,6 +8,8 @@ brackets: 2025-10-01: 30_038 amount: 2025-10-01: 2 + # The matrix prints no band above 60,075, below the size-20 income limit of + # 89,477. Zero denotes an interval not covered by the published matrix. - threshold: 2025-10-01: 60_075 amount: @@ -17,7 +19,7 @@ metadata: threshold_unit: currency-USD amount_unit: /1 period: year - label: Mississippi LIHEAP income bands for 20 people + label: Mississippi LIHEAP income bands for household size 20 reference: - - title: Mississippi FY2026 benefit matrix, household size 20 + - title: Mississippi FY2026 benefit matrix, household size 20, page 6 href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=6 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/3.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/3.yaml index a8c245bf4a5..b845fde9748 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/3.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/3.yaml @@ -1,4 +1,4 @@ -description: Mississippi assigns these published heating income bands to a household of 3 eligible people under the Low Income Home Energy Assistance Program. +description: Mississippi sets these income bands for an eligible household of 3 members under the Low Income Home Energy Assistance Program. brackets: - threshold: 2025-10-01: -.inf @@ -29,7 +29,7 @@ metadata: threshold_unit: currency-USD amount_unit: /1 period: year - label: Mississippi LIHEAP income bands for 3 people + label: Mississippi LIHEAP income bands for household size 3 reference: - - title: Mississippi FY2026 benefit matrix, household size 3 + - title: Mississippi FY2026 benefit matrix, household size 3, page 1 href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/4.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/4.yaml index 5095ca45a27..46a9725d958 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/4.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/4.yaml @@ -1,4 +1,4 @@ -description: Mississippi assigns these published heating income bands to a household of 4 eligible people under the Low Income Home Energy Assistance Program. +description: Mississippi sets these income bands for an eligible household of 4 members under the Low Income Home Energy Assistance Program. brackets: - threshold: 2025-10-01: -.inf @@ -29,7 +29,7 @@ metadata: threshold_unit: currency-USD amount_unit: /1 period: year - label: Mississippi LIHEAP income bands for 4 people + label: Mississippi LIHEAP income bands for household size 4 reference: - - title: Mississippi FY2026 benefit matrix, household size 4 + - title: Mississippi FY2026 benefit matrix, household size 4, page 2 href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/5.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/5.yaml index 7f98d17599e..f1ffedad8cb 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/5.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/5.yaml @@ -1,4 +1,4 @@ -description: Mississippi assigns these published heating income bands to a household of 5 eligible people under the Low Income Home Energy Assistance Program. +description: Mississippi sets these income bands for an eligible household of 5 members under the Low Income Home Energy Assistance Program. brackets: - threshold: 2025-10-01: -.inf @@ -29,7 +29,7 @@ metadata: threshold_unit: currency-USD amount_unit: /1 period: year - label: Mississippi LIHEAP income bands for 5 people + label: Mississippi LIHEAP income bands for household size 5 reference: - - title: Mississippi FY2026 benefit matrix, household size 5 + - title: Mississippi FY2026 benefit matrix, household size 5, page 2 href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/6.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/6.yaml index 7f0d3230cc2..9463ab1b905 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/6.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/6.yaml @@ -1,4 +1,4 @@ -description: Mississippi assigns these published heating income bands to a household of 6 eligible people under the Low Income Home Energy Assistance Program. +description: Mississippi sets these income bands for an eligible household of 6 members under the Low Income Home Energy Assistance Program. brackets: - threshold: 2025-10-01: -.inf @@ -29,7 +29,7 @@ metadata: threshold_unit: currency-USD amount_unit: /1 period: year - label: Mississippi LIHEAP income bands for 6 people + label: Mississippi LIHEAP income bands for household size 6 reference: - - title: Mississippi FY2026 benefit matrix, household size 6 + - title: Mississippi FY2026 benefit matrix, household size 6, page 2 href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/7.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/7.yaml index 0287111e06e..14efe15e894 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/7.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/7.yaml @@ -1,4 +1,4 @@ -description: Mississippi assigns these published heating income bands to a household of 7 eligible people under the Low Income Home Energy Assistance Program. +description: Mississippi sets these income bands for an eligible household of 7 members under the Low Income Home Energy Assistance Program. brackets: - threshold: 2025-10-01: -.inf @@ -29,7 +29,7 @@ metadata: threshold_unit: currency-USD amount_unit: /1 period: year - label: Mississippi LIHEAP income bands for 7 people + label: Mississippi LIHEAP income bands for household size 7 reference: - - title: Mississippi FY2026 benefit matrix, household size 7 + - title: Mississippi FY2026 benefit matrix, household size 7, page 3 href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=3 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/8.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/8.yaml index 16d560935eb..9326a495dd5 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/8.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/8.yaml @@ -1,4 +1,4 @@ -description: Mississippi assigns these published heating income bands to a household of 8 eligible people under the Low Income Home Energy Assistance Program. +description: Mississippi sets these income bands for an eligible household of 8 members under the Low Income Home Energy Assistance Program. brackets: - threshold: 2025-10-01: -.inf @@ -25,7 +25,7 @@ metadata: threshold_unit: currency-USD amount_unit: /1 period: year - label: Mississippi LIHEAP income bands for 8 people + label: Mississippi LIHEAP income bands for household size 8 reference: - - title: Mississippi FY2026 benefit matrix, household size 8 + - title: Mississippi FY2026 benefit matrix, household size 8, page 3 href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=3 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/9.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/9.yaml index 98dab067636..bd7940fbef4 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/9.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/9.yaml @@ -1,4 +1,4 @@ -description: Mississippi assigns these published heating income bands to a household of 9 eligible people under the Low Income Home Energy Assistance Program. +description: Mississippi sets these income bands for an eligible household of 9 members under the Low Income Home Energy Assistance Program. brackets: - threshold: 2025-10-01: -.inf @@ -25,7 +25,7 @@ metadata: threshold_unit: currency-USD amount_unit: /1 period: year - label: Mississippi LIHEAP income bands for 9 people + label: Mississippi LIHEAP income bands for household size 9 reference: - - title: Mississippi FY2026 benefit matrix, household size 9 + - title: Mississippi FY2026 benefit matrix, household size 9, page 3 href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=3 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_limit.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_limit.yaml index 5b412a8f3e8..c76a64678b7 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_limit.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_limit.yaml @@ -6,5 +6,7 @@ metadata: period: year label: Mississippi LIHEAP income limit reference: - - title: Mississippi LIHEAP Policy Manual, January 2026 revision - href: https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=22,58 + - title: Mississippi LIHEAP Policy Manual, Rule 6.1 C and Appendix 60% State Median Income table, pages 22 and 58 + href: https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=22 + - title: Mississippi FY2026 LIHEAP State Plan, Section 2.1, page 8 + href: https://liheapch.acf.gov/docs/2026/state-plans/MS_Plan_2026.pdf#page=8 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/maximum_payment.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/maximum_payment.yaml index e4a4ff42fd5..cad1daf39a1 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/maximum_payment.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/maximum_payment.yaml @@ -15,6 +15,8 @@ WOOD: 2025-10-01: 400 COAL: 2025-10-01: 400 +# The matrix has no column for solar or no heating. These homes receive the +# Electric column only. SOLAR: 2025-10-01: 0 OTHER: @@ -24,9 +26,9 @@ NONE: metadata: unit: currency-USD period: year - label: Mississippi LIHEAP maximum payment + label: Mississippi LIHEAP first income band heating cap breakdown: - heating_type reference: - - title: Mississippi FY2026 benefit matrix, heating caps by fuel and income band - href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=1,2,3,4,5,6 + - title: Mississippi FY2026 benefit matrix, Propane, Natural Gas, Wood/Other Fuel and Total Electric columns, pages 1-6 + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/maximum_table_size.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/maximum_table_size.yaml index 0db7a6bc0fb..ce89220dcf9 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/maximum_table_size.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/maximum_table_size.yaml @@ -1,4 +1,4 @@ -description: Mississippi publishes heating income bands through this eligible household size under the Low Income Home Energy Assistance Program. +description: Mississippi provides benefit matrix income bands through this household size under the Low Income Home Energy Assistance Program. values: 2025-10-01: 20 metadata: @@ -6,5 +6,5 @@ metadata: period: year label: Mississippi LIHEAP maximum table size reference: - - title: Mississippi LIHEAP Policy Manual, January 2026 revision - href: https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=58,64 + - title: Mississippi LIHEAP Policy Manual, Appendix 60% State Median Income table and benefit matrix for household size 20, pages 58 and 64 + href: https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=58 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/payment_reduction.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/payment_reduction.yaml index 5d157d4f307..f5dfc097bf6 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/payment_reduction.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/payment_reduction.yaml @@ -1,4 +1,4 @@ -description: Mississippi reduces these heating caps per subsequent published income band by primary fuel under the Low Income Home Energy Assistance Program. +description: Mississippi reduces the heating cap by this amount for each income band above the first, by primary heating fuel, under the Low Income Home Energy Assistance Program. UNSPECIFIED: 2025-10-01: 0 ELECTRICITY: @@ -28,5 +28,5 @@ metadata: breakdown: - heating_type reference: - - title: Mississippi FY2026 benefit matrix, heating caps by fuel and income band - href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=1,2,3,4,5,6 + - title: Mississippi FY2026 benefit matrix, Propane, Natural Gas, Wood/Other Fuel and Total Electric columns, pages 1-6 + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_amount.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_amount.yaml index 99fdfbce9b2..22e48b9a5fe 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_amount.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_amount.yaml @@ -1,4 +1,4 @@ -description: Mississippi publishes this propane cap in the exceptional household-size and income-band cell under the Low Income Home Energy Assistance Program. +description: Mississippi sets this propane cap for the household size and income band of the propane exception under the Low Income Home Energy Assistance Program. values: 2025-10-01: 350 metadata: @@ -6,5 +6,7 @@ metadata: period: year label: Mississippi LIHEAP propane exception amount reference: - - title: Mississippi LIHEAP Policy Manual, January 2026 revision + - title: Mississippi LIHEAP Policy Manual, Appendix benefit matrix, household size 16, page 63 href: https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=63 + - title: Mississippi FY2026 benefit matrix, household size 16, page 5 + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=5 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_household_size.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_household_size.yaml index 08631605e82..9307191ee90 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_household_size.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_household_size.yaml @@ -1,4 +1,4 @@ -description: Mississippi publishes an exceptional propane cap for this household size under the Low Income Home Energy Assistance Program. +description: Mississippi uses a separate propane cap for this household size under the Low Income Home Energy Assistance Program. values: 2025-10-01: 16 metadata: @@ -6,5 +6,7 @@ metadata: period: year label: Mississippi LIHEAP propane exception household size reference: - - title: Mississippi LIHEAP Policy Manual, January 2026 revision + - title: Mississippi LIHEAP Policy Manual, Appendix benefit matrix, household size 16, page 63 href: https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=63 + - title: Mississippi FY2026 benefit matrix, household size 16, page 5 + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=5 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_income_band.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_income_band.yaml index b7aefb70bac..ec3afd44890 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_income_band.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_income_band.yaml @@ -1,4 +1,4 @@ -description: Mississippi publishes an exceptional propane cap in this income band for the specified household size under the Low Income Home Energy Assistance Program. +description: Mississippi uses a separate propane cap in this income band for the propane exception household size under the Low Income Home Energy Assistance Program. values: 2025-10-01: 4 metadata: @@ -6,5 +6,7 @@ metadata: period: year label: Mississippi LIHEAP propane exception income band reference: - - title: Mississippi LIHEAP Policy Manual, January 2026 revision + - title: Mississippi LIHEAP Policy Manual, Appendix benefit matrix, household size 16, page 63 href: https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=63 + - title: Mississippi FY2026 benefit matrix, household size 16, page 5 + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/MS_BenefitMatrix_Heat-Cool_2026.pdf#page=5 diff --git a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/unearned_income_sources.yaml b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/unearned_income_sources.yaml index 4daec824194..f4b486eb450 100644 --- a/policyengine_us/parameters/gov/states/ms/mdhs/liheap/unearned_income_sources.yaml +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/unearned_income_sources.yaml @@ -1,8 +1,10 @@ -description: Mississippi counts these available regular unearned income sources under the Low Income Home Energy Assistance Program. +description: Mississippi counts these unearned income sources under the Low Income Home Energy Assistance Program. values: 2025-10-01: - unemployment_compensation - social_security + # Rule 6.11 F(3) lists Railroad Retirement benefits. + - railroad_benefits - ssi - pension_income - retirement_distributions @@ -22,5 +24,7 @@ metadata: period: year label: Mississippi LIHEAP unearned income sources reference: - - title: Mississippi LIHEAP Policy Manual, Rules 6.11 C, D, F and J - href: https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=29,30,32,33 + - title: Mississippi LIHEAP Policy Manual, Rule 6.11 C, D, F, J and K, pages 29-33 + href: https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=29 + - title: Mississippi FY2026 LIHEAP State Plan, Section 1.9, pages 5-6 + href: https://liheapch.acf.gov/docs/2026/state-plans/MS_Plan_2026.pdf#page=5 diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index c74656b0f85..029db2ddd1a 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -802,7 +802,7 @@ programs: category: Benefits agency: HHS status: partial - coverage: OR, DC, Riverside County, MA, IL, TX, MS + coverage: OR, DC, Riverside County, MA, IL, MS, TX state_implementations: - state: OR status: in_progress @@ -830,7 +830,7 @@ programs: variable: ms_liheap parameter_prefix: gov.states.ms.mdhs.liheap verified_years: "2026" - notes: FY2026 regular heating only, using the published income bands as printed. Crisis and cooling assistance are out of scope. + notes: FY2026 regular assistance for heating fuel and electric bills, using the published matrix as printed. Crisis assistance and energy equipment are out of scope. - state: TX status: partial name: Texas CEAP diff --git a/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/integration.yaml index 3f3d3e53d4c..a9a6c461f94 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/integration.yaml @@ -1,5 +1,5 @@ -- name: Electric heating payment is available only to an eligible Mississippi household - period: 2_026 +- name: Case 1, electric heating payment goes only to an income-eligible Mississippi household. + period: 2026 input: state_code: [MS, MS, AL] age: [40, 40, 40] @@ -9,9 +9,14 @@ heating_type: [ELECTRICITY, ELECTRICITY, ELECTRICITY] pre_subsidy_electricity_expense: [2_000, 2_000, 2_000] output: + # Manual PDF page 58: the one-person 60% state median income limit is 26,740. + # Household 1 has no income. Matrix page 1, household size 1, first band, + # Total Electric 1,500: min(1,500, 2,000) = 1,500. + # Household 2 earns 26,741, one dollar over the limit: 0. + # Household 3 lives in Alabama: 0. ms_liheap: [1_500, 0, 0] -- name: All undocumented household receives no payment - period: 2_026 +- name: Case 2, a household with no documented member receives no payment. + period: 2026 input: state_code: MS age: 40 @@ -22,12 +27,18 @@ heating_type: NATURAL_GAS gas_expense: 1_000 output: + # Rule 6.3 A (manual PDF page 23): an undocumented head of household who is + # the only member is denied. No documented member is counted. ms_liheap_household_size: 0 + # No income limit applies to a household of size 0. + ms_liheap_income_limit: 0 + ms_liheap_eligible: false ms_liheap: 0 -# Backfilling checks the model convention, not verified historical MS policy. -# 2022 uses FY2022 SMI, with the earliest available state benefit matrix. -- name: Parameter backfill uses period-specific SMI for a 2022 estimate - period: 2_022 +# Backfilling checks the model convention, not verified historical Mississippi +# policy. 2022 uses the federal fiscal year 2022 state median income with the +# FY2026 benefit matrix values backfilled. +- name: Case 3, parameter backfill uses the 2022 state median income. + period: 2022 input: state_code: MS age: 40 @@ -37,8 +48,13 @@ heating_type: ELECTRICITY pre_subsidy_electricity_expense: 1_000 output: + # FY2026 matrix page 1, household size 1, first band, Total Electric 1,500: + # min(1,500, 1,000) = 1,000. ms_liheap: 1_000 ms_liheap_household_size: 1 + # Federal fiscal year 2022 Mississippi state median income for four people: + # 68,871. floor(0.6 * 68,871) = floor(41,322.6) = 41,322; one-person share + # 0.52; floor(0.52 * 41,322) = floor(21,487.44) = 21,487. ms_liheap_income_limit: 21_487 ms_liheap_eligible: true - name: Case 4, single parent with two children and full-time wages heats with electricity. @@ -115,3 +131,42 @@ # Size-3 band 6 is 31,314-43,196 (matrix page 1). # Natural gas cap: 700 - 50 * (6 - 1) = 450. Payment: min(450, 420) = 420. ms_liheap: 420 +- name: Case 6, retired couple heating with propane receives the propane and electric columns. + period: 2026 + input: + people: + person1: + age: 70 + # 1,100 a month in Social Security retirement benefits. + social_security_retirement: 13_200 + ssi: 0 + person2: + age: 68 + # 900 a month in Social Security retirement benefits. + social_security_retirement: 10_800 + ssi: 0 + spm_units: + spm_unit: + members: [person1, person2] + heating_type: PROPANE + bottled_gas_expense: 1_000 + pre_subsidy_electricity_expense: 1_300 + households: + household: + members: [person1, person2] + state_code: MS + output: + ms_liheap_household_size: 2 + # 13,200 + 10,800 = 24,000. + ms_liheap_income: 24_000 + # floor(0.6 * 85,708) = 51,424; size-2 share 0.52 + 0.16 = 0.68; + # floor(0.68 * 51,424) = 34,968. + ms_liheap_income_limit: 34_968 + ms_liheap_eligible: true + # Propane bill for the year. + heating_expense: 1_000 + # Size-2 band 5 is 21,151-26,438 (matrix page 1): Propane 600, Electric 500, + # Maximum Benefit 1,100. + # Propane: min(600, 1,000) = 600. Electric: min(500, 1,300) = 500. + # Rule 7.8 D: 600 + 500 = 1,100. + ms_liheap: 1_100 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap.yaml b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap.yaml index 6e250cc84cc..e940bc034f8 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap.yaml @@ -1,5 +1,5 @@ -- name: Published one-person income boundaries reduce propane payments - period: 2_026 +- name: Case 1, published one-person income boundaries reduce propane payments. + period: 2026 input: state_code: [MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS] ms_liheap_eligible: [true, true, true, true, true, true, true, true, true, true, true] @@ -8,9 +8,15 @@ heating_type: [PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE] heating_expense: [2_000, 2_000, 2_000, 2_000, 2_000, 2_000, 2_000, 2_000, 2_000, 2_000, 2_000] output: + # Matrix page 1 (manual PDF page 59), household size 1: 0-3,913, 3,914-7,825, + # 7,826-11,738, 11,739-15,650, 15,651-19,563, 19,564-26,740. 26,740 is the + # size-1 income limit. + # Bands: 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6. + # Propane column: 800, 750, 700, 650, 600, 550. + # The 2,000 propane bill exceeds every cap, so each payment equals its cap. ms_liheap: [800, 750, 750, 700, 700, 650, 650, 600, 600, 550, 550] -- name: Main fuel caps exclude ancillary electricity for other heating fuels - period: 2_026 +- name: Case 2, main fuel caps by heating fuel when no separate electric bill is reported. + period: 2026 input: state_code: [MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS] ms_liheap_eligible: [true, true, true, true, true, true, true, true, true, true, true] @@ -19,9 +25,15 @@ heating_type: [ELECTRICITY, NATURAL_GAS, PROPANE, WOOD, COAL, FUEL_OIL, KEROSENE, OTHER, SOLAR, NONE, UNSPECIFIED] heating_expense: [2_000, 2_000, 2_000, 2_000, 2_000, 2_000, 2_000, 2_000, 2_000, 2_000, 2_000] output: + # Matrix page 1, household size 1, first band: Total Electric 1,500, Natural + # Gas 700, Propane 800, Wood/Other Fuel 400. Coal, fuel oil, kerosene and + # other fuels use the Wood/Other Fuel column. + # The matrix has no column for solar, no heating or an unreported fuel, and + # no electric bill is entered, so those three households receive 0. + # The 2,000 heating bill exceeds every cap, so each payment equals its cap. ms_liheap: [1_500, 700, 800, 400, 400, 400, 400, 400, 0, 0, 0] -- name: Annual regular heating payment is limited to reported heating bills - period: 2_026 +- name: Case 3, payment is limited to the reported heating bill. + period: 2026 input: state_code: [MS, MS, MS, MS, MS] ms_liheap_eligible: [true, true, true, true, true] @@ -30,9 +42,13 @@ heating_type: [ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY] heating_expense: [0, 100, 1_499, 1_500, 1_501] output: + # Rule 7.4 A (manual PDF page 36) pays the amount of the bill and Rule 7.8 C + # (page 39) caps it by energy type. Matrix page 1, household size 1, first + # band, Total Electric 1,500: min(1,500, bill) for bills of 0, 100, 1,499, + # 1,500 and 1,501. ms_liheap: [0, 100, 1_499, 1_500, 1_500] -- name: Preserve published size-sixteen propane exception - period: 2_026 +- name: Case 4, published size-sixteen propane cap in the fourth band. + period: 2026 input: state_code: [MS, MS] ms_liheap_eligible: [true, true] @@ -41,9 +57,13 @@ heating_type: [PROPANE, PROPANE] heating_expense: [2_000, 2_000] output: + # Matrix page 5 (manual PDF page 63), household size 16: 49,076-73,613 is + # band 3 with Propane 700; 73,614-83,306 is band 4, where the matrix prints + # Propane 350. + # The 2,000 propane bill exceeds both caps. ms_liheap: [700, 350] -- name: Unpublished income intervals and household sizes have no encoded payment - period: 2_026 +- name: Case 5, unpublished income intervals and household sizes have no payment. + period: 2026 input: state_code: [MS, MS, MS, MS, MS, MS, MS, MS, MS, MS] ms_liheap_eligible: [true, true, true, true, true, true, true, true, true, true] @@ -53,6 +73,15 @@ ELECTRICITY, ELECTRICITY] heating_expense: [2_000, 2_000, 2_000, 2_000, 2_000, 2_000, 2_000, 2_000, 2_000, 2_000] output: + # Matrix page 4, household size 11: 0-17,633 is band 1 and 17,664-35,325 is + # band 2, so 17,634 falls in no band. + # Matrix page 5, household size 15: 46,326-68,488 is band 3 and + # 69,489-81,764 is band 4, so 68,489 falls in no band. + # Matrix pages 4 and 6: the last printed bands end at 72,507 for size 10, + # 84,849 for size 18 and 60,075 for size 20, so one dollar more falls in no + # band. The matrix prints no table for household size 21. + # Total Electric column: 1,500, 1,400, 1,300, 1,200. + # The 2,000 electricity bill exceeds every cap. ms_liheap: [1_500, 0, 1_400, 1_300, 0, 1_200, 0, 0, 0, 0] - name: Case 6, published size-three bands keep the 31,313 fifth-band top. period: 2026 @@ -164,3 +193,189 @@ # 57,326-87,935 band 3. Bands: 1, 2, 3, 3. ms_liheap: [1_500, 1_300, 1_200, 1_100, 1_500, 1_300, 1_300, 1_200, 1_500, 1_300, 1_300, 1_200, 1_500, 1_300, 1_300, 1_200, 1_500, 1_400, 1_300, 1_300] +- name: Case 11, households not heated by electricity also receive the electric column. + period: 2026 + input: + state_code: [MS, MS, MS, MS, MS, MS, MS, MS, MS] + ms_liheap_eligible: [true, true, true, true, true, true, true, true, true] + ms_liheap_household_size: [1, 1, 1, 1, 1, 1, 1, 1, 1] + ms_liheap_income: [0, 0, 0, 0, 0, 0, 0, 0, 0] + heating_type: [NATURAL_GAS, PROPANE, WOOD, ELECTRICITY, NATURAL_GAS, SOLAR, NONE, UNSPECIFIED, UNSPECIFIED] + gas_expense: [2_000, 0, 0, 0, 300, 0, 0, 0, 0] + bottled_gas_expense: [0, 2_000, 0, 0, 0, 0, 0, 0, 0] + wood_expense: [0, 0, 2_000, 0, 0, 0, 0, 0, 0] + pre_subsidy_electricity_expense: [1_000, 1_000, 1_000, 2_000, 200, 1_000, 1_000, 1_000, 1_000] + heat_expense_included_in_rent: [false, false, false, false, false, false, false, false, true] + output: + # Rule 7.8 D (manual PDF page 39): a total electric household receives the + # Total Electric column; "all other households may receive a total of the + # electric column and the main heating source column that is used." + # Matrix page 1, household size 1, first band: Propane 800, Electric 700, + # Natural Gas 700, Wood/Other Fuel 400, Maximum Benefit 1,500, Total + # Electric 1,500. + # Household 1, natural gas: min(700, 2,000) + min(700, 1,000) = 1,400. + # Household 2, propane: 800 + 700 = 1,500, the Maximum Benefit. + # Household 3, wood: 400 + 700 = 1,100. + # Household 4, total electric: min(1,500, 2,000) = 1,500, with no second + # payment. + # Household 5, natural gas with small bills: 300 + 200 = 500. + # Households 6 and 7, solar and no heating: no fuel column, so only the + # electric column: min(700, 1,000) = 700. + # Household 8, fuel not reported: no payment. + # Household 9, heat in rent with an unknown fuel: the electric column for + # its own electric bill, 700. + ms_liheap: [1_400, 1_500, 1_100, 1_500, 500, 700, 700, 0, 700] +- name: Case 12, the electric column steps down with the natural gas column across the one-person income bands. + period: 2026 + input: + state_code: [MS, MS, MS, MS, MS, MS] + ms_liheap_eligible: [true, true, true, true, true, true] + ms_liheap_household_size: [1, 1, 1, 1, 1, 1] + ms_liheap_income: [3_913, 3_914, 7_826, 14_500, 15_651, 26_740] + heating_type: [NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS] + gas_expense: [2_000, 2_000, 2_000, 2_000, 2_000, 2_000] + pre_subsidy_electricity_expense: [1_000, 1_000, 1_000, 1_000, 1_000, 1_000] + output: + # Matrix page 1, household size 1. Natural Gas and Electric columns by + # band: 700/700, 650/650, 600/600, 550/550, 500/500, 450/450. + # 14,500 is the household in the manual's Rule 7.8 C example, which lists + # natural gas 550 and electric 550 for it. + # Both bills exceed every cap, so each payment is the two caps combined. + ms_liheap: [1_400, 1_300, 1_200, 1_100, 1_000, 900] +- name: Case 13, published size-ten bands keep the 35,325 second-band top. + period: 2026 + input: + state_code: [MS, MS, MS, MS, MS, MS, MS, MS, MS] + ms_liheap_eligible: [true, true, true, true, true, true, true, true, true] + ms_liheap_household_size: [10, 10, 10, 10, 10, 10, 10, 10, 10] + ms_liheap_income: [16_288, 16_289, 35_325, 35_326, 48_863, 48_864, 65_150, 65_151, 72_507] + heating_type: [NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, + NATURAL_GAS] + gas_expense: [900, 900, 900, 900, 900, 900, 900, 900, 900] + output: + # Matrix page 4 (manual PDF page 62), household size 10: 0-16,288, + # 16,289-35,325, 35,326-48,863, 48,864-65,150, 65,151-72,507. The second + # band ends at the printed 35,325 (half of the 65,150 poverty guideline + # would be 32,575), so 35,325 is still band 2 and 35,326 is band 3. + # Bands: 1, 2, 2, 3, 3, 4, 4, 5, 5. + # Natural Gas column: 700, 650, 600, 550, 500. + # The 900 gas bill exceeds every cap and no electric bill is entered, so + # each payment equals the Natural Gas cap. + ms_liheap: [700, 650, 650, 600, 600, 550, 550, 500, 500] +- name: Case 14, published tables for household sizes eighteen and twenty. + period: 2026 + input: + state_code: [MS, MS, MS, MS, MS, MS, MS, MS] + ms_liheap_eligible: [true, true, true, true, true, true, true, true] + ms_liheap_household_size: [18, 18, 18, 18, 18, 20, 20, 20] + ms_liheap_income: [27_288, 27_289, 54_575, 54_576, 84_849, 30_038, 30_039, 60_075] + heating_type: [PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE] + bottled_gas_expense: [1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200] + output: + # Matrix page 6 (manual PDF page 64). Household size 18 prints three bands: + # 0-27,288, 27,289-54,575, 54,576-84,849. Household size 20 prints two: + # 0-30,038, 30,039-60,075. + # Bands: 1, 2, 2, 3, 3 for size 18 and 1, 2, 2 for size 20. + # Propane column: 800, 750, 700. + # The 1,200 propane bill exceeds every cap and no electric bill is entered, + # so each payment equals the Propane cap. + ms_liheap: [800, 750, 750, 700, 700, 800, 750, 750] +- name: Case 15, published size-eleven bands two through four and the unprinted interval. + period: 2026 + input: + state_code: [MS, MS, MS, MS, MS, MS] + ms_liheap_eligible: [true, true, true, true, true, true] + ms_liheap_household_size: [11, 11, 11, 11, 11, 11] + ms_liheap_income: [17_663, 35_325, 35_326, 52_988, 52_989, 75_593] + heating_type: [WOOD, WOOD, WOOD, WOOD, WOOD, WOOD] + wood_expense: [600, 600, 600, 600, 600, 600] + output: + # Matrix page 4 (manual PDF page 62), household size 11: 0-17,633, + # 17,664-35,325, 35,326-52,988, 52,989-75,593. No band is printed for + # 17,634-17,663, so 17,663, the last dollar of that interval, has no + # payment. 75,593 is the size-11 income limit. + # Bands: none, 2, 3, 3, 4, 4. + # Wood/Other Fuel column: 400, 360, 320, 280. + # The 600 wood bill exceeds every cap and no electric bill is entered, so + # each payment equals the Wood/Other Fuel cap. + ms_liheap: [0, 360, 320, 320, 280, 280] +- name: Case 16, published bands for household sizes fifteen and sixteen. + period: 2026 + input: + state_code: [MS, MS, MS, MS, MS, MS, MS, MS, MS, MS] + ms_liheap_eligible: [true, true, true, true, true, true, true, true, true, true] + ms_liheap_household_size: [15, 15, 15, 15, 15, 15, 16, 16, 16, 16] + ms_liheap_income: [23_163, 23_164, 46_325, 46_326, 69_488, 81_764, 24_538, 24_539, 49_075, 49_076] + heating_type: [ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, + ELECTRICITY, ELECTRICITY] + pre_subsidy_electricity_expense: [2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400] + output: + # Matrix page 5 (manual PDF page 63). Household size 15: 0-23,163, + # 23,164-46,325, 46,326-68,488, 69,489-81,764. No band is printed for + # 68,489-69,488, so 69,488, the last dollar of that interval, has no + # payment. 81,764 is the size-15 income limit. + # Household size 16: 0-24,538, 24,539-49,075, 49,076-73,613, 73,614-83,306. + # Bands: 1, 2, 2, 3, none, 4 for size 15 and 1, 2, 2, 3 for size 16. + # Total Electric column: 1,500, 1,400, 1,300, 1,200. + # The 2,400 electricity bill exceeds every cap, so each payment equals its cap. + ms_liheap: [1_500, 1_400, 1_400, 1_300, 0, 1_200, 1_500, 1_400, 1_400, 1_300] +- name: Case 17, the size-sixteen propane cap does not apply to other fuels or household sizes. + period: 2026 + input: + state_code: [MS, MS, MS, MS] + ms_liheap_eligible: [true, true, true, true] + ms_liheap_household_size: [16, 16, 15, 17] + ms_liheap_income: [78_000, 78_000, 75_000, 80_000] + heating_type: [NATURAL_GAS, ELECTRICITY, PROPANE, PROPANE] + gas_expense: [900, 0, 0, 0] + pre_subsidy_electricity_expense: [0, 2_400, 0, 0] + bottled_gas_expense: [0, 0, 1_200, 1_200] + output: + # Matrix page 5 (manual PDF page 63), fourth band of each table. + # Household size 16, 73,614-83,306: Propane 350, Natural Gas 550, Total + # Electric 1,200. Household size 15, 69,489-81,764: Propane 650. Household + # size 17, 77,739-84,849: Propane 650. + # Household 1, natural gas: min(550, 900) = 550. + # Household 2, total electric: min(1,200, 2,400) = 1,200. + # Households 3 and 4, propane at sizes 15 and 17: min(650, 1,200) = 650. + ms_liheap: [550, 1_200, 650, 650] +- name: Case 18, a credit balance on the main fuel account does not reduce the payment. + period: 2026 + input: + state_code: [MS, MS] + ms_liheap_eligible: [true, true] + ms_liheap_household_size: [1, 1] + ms_liheap_income: [0, 0] + heating_type: [NATURAL_GAS, NATURAL_GAS] + gas_expense: [-150, -150] + pre_subsidy_electricity_expense: [0, 600] + output: + # Rule 7.4 C (manual PDF page 36): "Electric and natural gas bills should + # not be paid if there is a credit balance." A negative gas bill is a credit + # balance, so the natural gas payment is 0 rather than -150. + # Household 1 has no electric bill: 0. + # Household 2 has an electric bill of 50 a month. Matrix page 1, household + # size 1, first band, Electric 700: min(700, 600) = 600, with nothing + # deducted for the gas credit. + ms_liheap: [0, 600] +- name: Case 19, heat included in rent receives no heating column payment. + period: 2026 + input: + state_code: [MS, MS] + ms_liheap_eligible: [true, true] + ms_liheap_household_size: [1, 1] + ms_liheap_income: [0, 0] + heating_type: [NATURAL_GAS, NATURAL_GAS] + gas_expense: [0, 0] + heat_expense_included_in_rent: [true, true] + pre_subsidy_electricity_expense: [0, 540] + output: + # Rule 6.4 A-B (manual PDF page 24) pays the energy charge itemized in the + # lease, or $100 per intake up to the matrix amount when no amount is + # itemized. Neither the itemized charge nor the number of intakes is an + # input, so a household with no gas bill of its own receives 0 from the + # Natural Gas column. + # Household 1 has no electric bill either: 0. + # Household 2 pays its own electric bill of 45 a month. Matrix page 1, + # household size 1, first band, Electric 700: min(700, 540) = 540. + ms_liheap: [0, 540] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_eligible.yaml index 5825766e1bb..f2a24f109ae 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_eligible.yaml @@ -1,5 +1,5 @@ -- name: Income at and above the published limit - period: 2_026 +- name: Case 1, income at and one dollar above the one-person limit. + period: 2026 input: state_code: [MS, MS] age: [40, 40] @@ -7,9 +7,11 @@ heating_type: [ELECTRICITY, ELECTRICITY] heating_expense: [1_000, 1_000] output: + # Rule 6.1 C (manual PDF page 22): income at or below the 60% state median + # income guideline, which is 26,740 for one person (page 58). ms_liheap_eligible: [true, false] -- name: Subsidized heat in rent, independent energy responsibility, and adulthood - period: 2_026 +- name: Case 2, subsidized heat in rent, energy responsibility and applicant age. + period: 2026 input: state_code: [MS, MS, MS, MS, MS] age: [40, 40, 40, 40, 17] @@ -19,4 +21,46 @@ heat_expense_included_in_rent: [false, true, true, false, false] receives_housing_assistance: [false, false, true, true, false] output: + # Rule 6.1 A and D (manual PDF page 22). + # Household 1 has no energy bill and no heat in rent: not eligible. + # Household 2 has heat included in rent and no housing subsidy: eligible. + # Household 3 receives housing assistance and its heat is in the rent, so + # energy is not billed separately: not eligible. + # Household 4 receives housing assistance and pays its own heating bill: + # eligible. + # Household 5 has a 17-year-old as its only member: not eligible. ms_liheap_eligible: [false, true, false, true, false] +- name: Case 3, an electric bill alone establishes energy responsibility. + period: 2026 + input: + state_code: [MS, MS] + age: [40, 40] + ms_liheap_income: [0, 0] + heating_type: [NATURAL_GAS, NATURAL_GAS] + gas_expense: [0, 0] + pre_subsidy_electricity_expense: [900, 0] + output: + # Rule 6.1 A (manual PDF page 22): an obligation to pay an energy bill. + # Household 1 heats with natural gas, has no gas bill and pays an electric + # bill: eligible. Household 2 has no energy bill: not eligible. + ms_liheap_eligible: [true, false] +- name: Case 4, public housing residents need separately billed energy. + period: 2026 + input: + state_code: [MS, MS] + age: [40, 40] + ms_liheap_income: [0, 0] + heating_type: [NATURAL_GAS, UNSPECIFIED] + gas_expense: [720, 0] + heat_expense_included_in_rent: [false, true] + is_in_public_housing: [true, true] + output: + # Rule 6.1 A (manual PDF page 22) accepts "subsidized housing where the + # energy cost is billed separate from rent"; the FY2026 plan (page 9) names + # public or subsidized housing residents whose rent includes utilities and + # who are not billed separately for energy. + # Household 1 lives in public housing and pays its own gas bill of 60 a + # month: eligible. + # Household 2 lives in public housing with heat included in the rent and no + # energy bill of its own: not eligible. + ms_liheap_eligible: [true, false] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_income.yaml index 484337c1338..75d007d5117 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_income.yaml @@ -1,5 +1,5 @@ -- name: Schedule C net profits and losses count without a second business deduction - period: 2_026 +- name: Case 1, Schedule C net profits and losses count without a second business deduction. + period: 2026 input: state_code: [MS, MS, MS] age: [40, 40, 40] @@ -9,9 +9,14 @@ ssi: [0, 0, 0] social_security: [0, 0, 0] output: + # Rule 6.11 I(1) (manual PDF page 32) counts the Schedule C net profit or + # (loss) line. + # Household 1: 12,000 wages + 4,000 + 2,000 net profit = 18,000. + # Household 2: 12,000 wages - 4,000 - 2,000 net loss = 6,000. + # Household 3: 12,000 wages - 12,000 - 6,000 net loss = -6,000, counted as 0. ms_liheap_income: [18_000, 6_000, 0] -- name: Child support, TANF, and tax refunds are excluded; recurring gifts and interest count - period: 2_026 +- name: Case 2, child support, TANF and tax refunds are excluded while gifts and interest count. + period: 2026 input: state_code: MS age: 40 @@ -24,35 +29,46 @@ ssi: 0 social_security: 0 output: + # Rule 6.11 D(7), D(8) and D(11) (manual PDF page 30) exempt TANF, child + # support and tax refunds. Rule 6.11 C(13) (page 29) counts money given to + # the household and Rule 6.11 F(7) (page 32) counts interest. + # 10,000 wages + 600 gifts + 400 interest = 11,000. ms_liheap_income: 11_000 -- name: Excluded adult income and child unearned income count, while child wages do not - period: 2_026 +- name: Case 3, an undocumented adult's wages and a child's unearned income count while the child's earnings do not. + period: 2026 input: people: - adult: + person1: age: 35 immigration_status: UNDOCUMENTED employment_income: 12_000 ssi: 0 social_security: 0 - child: + person2: age: 15 employment_income: 6_000 sstb_self_employment_income: 2_000 ssi: 2_400 social_security: 1_200 spm_units: - unit: - members: [adult, child] + spm_unit: + members: [person1, person2] heating_type: ELECTRICITY heating_expense: 1_000 households: - home: - members: [adult, child] + household: + members: [person1, person2] state_code: MS output: + # Rule 6.3 B-C (manual PDF page 23): the undocumented adult is left out of + # household size, 2 - 1 = 1, and the adult's income still counts. ms_liheap_household_size: 1 + # Rule 6.11 J(2) (page 33): the child's SSI and Social Security "must be + # included and is listed under the parent or legal guardian". Rule 6.11 + # D(3) and J(1) exclude the child's 6,000 wages and 2,000 business income. + # 12,000 adult wages + 2,400 SSI + 1,200 Social Security = 15,600. ms_liheap_income: 15_600 + # 15,600 is at or below the one-person limit of 26,740 (page 58). ms_liheap_eligible: true - name: Case 4, three-person household with farm income above the limit is ineligible. period: 2026 @@ -115,10 +131,7 @@ # Size-3 band 4 is 19,989-26,650 (matrix page 1). # Propane cap: 800 - 50 * (4 - 1) = 650. Payment: min(650, 1,200) = 650. ms_liheap: 650 - -- name: Service business profits above the income limit prevent a heating award - # Rule 6.11 C(2) and I(1): existing net business profits count regardless - # of whether the business is a specified service trade or business. +- name: Case 6, service business profits above the income limit prevent a heating award. period: 2026 input: state_code: MS @@ -129,11 +142,13 @@ heating_type: NATURAL_GAS gas_expense: 1_000 output: + # Rule 6.11 C(2) and I(1): net business profits count regardless of whether + # the business is a specified service trade or business. ms_liheap_income: 60_000 # floor(floor(85,708 * 0.6) * 0.52) = 26,740 < 60,000. ms_liheap_eligible: false ms_liheap: 0 -- name: Case 6, farm loss offsets a spouse's wages. +- name: Case 7, farm loss offsets a spouse's wages. period: 2026 input: people: @@ -164,3 +179,31 @@ # Size-3 band 4 is 19,989-26,650 (wages alone, 30,000, would be band 5). # Propane cap: 800 - 50 * (4 - 1) = 650. Payment: min(650, 1,200) = 650. ms_liheap: 650 +- name: Case 8, Railroad Retirement benefits count with Social Security. + period: 2026 + input: + people: + person1: + age: 67 + # 1,800 a month from a Railroad Retirement annuity. + railroad_benefits: 21_600 + ssi: 0 + person2: + age: 66 + # 800 a month in Social Security retirement benefits. + social_security_retirement: 9_600 + ssi: 0 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MS + output: + # Both members are citizens and are counted. + ms_liheap_household_size: 2 + # Rule 6.11 F(3) (manual PDF page 31) lists "Social Security benefits, + # Railroad Retirement benefits" as unearned income. + # 21,600 Railroad Retirement + 9,600 Social Security = 31,200. + ms_liheap_income: 31_200 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_income_limit.yaml b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_income_limit.yaml index b28eb60f746..5a61db457dd 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_income_limit.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_income_limit.yaml @@ -1,8 +1,20 @@ -- name: Published FY2026 sixty percent SMI limits for all twenty listed household sizes - period: 2_026 +- name: Case 1, published FY2026 sixty percent state median income limits for household sizes one through twenty. + period: 2026 input: state_code: [MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS, MS] ms_liheap_household_size: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] output: + # Manual PDF page 58, Appendix table, "60% State Median Income" column for + # household sizes 1 through 20, effective 10/1/2025. ms_liheap_income_limit: [26_740, 34_968, 43_196, 51_424, 59_651, 67_879, 69_422, 70_965, 72_507, 74_050, 75_593, 77_136, 78_678, 80_221, 81_764, 83_306, 84_849, 86_392, 87_935, 89_477] +- name: Case 2, a household with no documented member has no income limit. + period: 2026 + input: + state_code: MS + ms_liheap_household_size: 0 + output: + # Rule 6.3 A (manual PDF page 23) denies a household with no documented + # member, and the Appendix table (page 58) starts at household size 1, so + # no limit applies to size 0. + ms_liheap_income_limit: 0 diff --git a/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap.py b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap.py index bf7637dc083..61dd8b2c50e 100644 --- a/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap.py +++ b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap.py @@ -6,22 +6,28 @@ class ms_liheap(Variable): entity = SPMUnit definition_period = YEAR unit = USD - label = "Mississippi LIHEAP regular heating assistance" + label = "Mississippi LIHEAP regular energy assistance" documentation = ( - "Verified for FY2026. Earlier years use model parameter backfilling " - "and are unverified historical estimates." + "Regular assistance with the main heating fuel bill and, for homes not " + "heated by electricity, the electric bill. Verified for FY2026. Earlier " + "years use model parameter backfilling and are unverified historical " + "estimates." ) defined_for = "ms_liheap_eligible" - reference = "https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=24,36,37,39,58,59,60,61,62,63,64" + reference = ( + # Rule 7.4 A (page 36), Rule 7.8 A-D (page 39) and the Appendix benefit + # matrix (pages 59-64). + "https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=39", + ) def formula(spm_unit, period, parameters): p = parameters(period).gov.states.ms.mdhs.liheap size = spm_unit("ms_liheap_household_size", period) income = spm_unit("ms_liheap_income", period) - # Rule 7.8 A directs use of the attached matrix (PDF pp. 59-64). Neither - # the manual nor FY2026 plan section 2.5 defines 25% FPG bands or rounding. - # That numerical pattern is not an authorized replacement: the matrix - # prints $31,313 for size 3, five bands for size 8, and four for size 12. + # Rule 7.8 A pays from the attached matrix (manual PDF pages 59-64). The + # income bands are encoded as published: the matrix prints a $31,313 + # fifth-band top for size 3, a $35,325 second-band top for size 10, five + # bands for size 8 and four for size 12. band = 0 for table_size in range(1, int(p.maximum_table_size) + 1): band = where( @@ -31,24 +37,47 @@ def formula(spm_unit, period, parameters): ) fuel = spm_unit("heating_type", period) types = fuel.possible_values - # Shared cap parameters reproduce the published progression without copying - # dollar amounts for every household size. Preserve the anomalous size-16 - # propane cell; agency clarification is needed before correcting the source. - cap = p.maximum_payment[fuel] - max_(band - 1, 0) * p.payment_reduction[fuel] + reductions = max_(band - 1, 0) + # Each column steps down by a fixed amount per income band, so a + # first-band cap and a reduction per fuel reproduce the published cells. + # The one exception is propane at size 16, band 4: the matrix prints + # $350; encoded as published. + fuel_cap = p.maximum_payment[fuel] - reductions * p.payment_reduction[fuel] exception = ( (fuel == types.PROPANE) & (size == p.propane_exception_household_size) & (band == p.propane_exception_income_band) ) - cap = where(exception, p.propane_exception_amount, cap) - # Rule 7.8 D gives electric-heating households the total-electric annual cap. - # Only the main heating bill is counted here: no additional cooling/electric - # allowance for a non-electric heating household. Prior awards consuming the - # shared annual cap, per-delivery propane limits, and prepaid-account rules - # are not represented. Annual heating expenses approximate eligible bills. - expense = max_(spm_unit("heating_expense", period), 0) - # Heat in rent with no specified charge receives $100 per intake under 6.4 B; - # charge documentation/intake counts cannot be inferred, so that pathway is - # not modeled. Source gaps (sizes 11/15 and upper ranges for 10/18/20) and - # sizes above 20 also return zero as coverage gaps, not legal ineligibility. - return where(band > 0, min_(cap, expense), 0) + fuel_cap = where(exception, p.propane_exception_amount, fuel_cap) + # Rule 7.4 A pays the amount of the bill and Rule 7.8 C caps it by energy + # type. Annual expenses approximate the bills presented during the program + # year; prior awards, per-delivery propane limits, and prepaid-account + # rules are not represented. + heating_payment = min_(fuel_cap, max_(spm_unit("heating_expense", period), 0)) + # Rule 7.8 D: a total electric household receives the Total Electric + # column, which is its fuel cap above. "All other households may receive + # a total of the electric column and the main heating source column that + # is used." The two caps together never exceed the Maximum Benefit column, + # which equals the propane and electric columns combined. heating_type + # ELECTRICITY stands for a total electric household. SOLAR and NONE have + # no fuel column in the matrix, so they receive the electric column only. + # An unspecified fuel is paid only when heat is included in rent. + heat_in_rent = spm_unit("heat_expense_included_in_rent", period) + receives_electric_column = (fuel != types.ELECTRICITY) & ( + (fuel != types.UNSPECIFIED) | heat_in_rent + ) + electric_cap = ( + p.electric_maximum_payment - reductions * p.electric_payment_reduction + ) + electricity = max_(spm_unit("pre_subsidy_electricity_expense", period), 0) + electric_payment = where( + receives_electric_column, min_(electric_cap, electricity), 0 + ) + # A household with heat included in rent is eligible but receives $0 for + # the heating column: Rule 6.4 A (manual PDF page 24) pays the energy + # charge itemized in the lease and Rule 6.4 B pays $100 per intake up to + # the matrix amount, and neither the itemized charge nor the number of + # intakes is an input. + # Source gaps (sizes 11/15 and upper ranges for 10/18/20) and sizes above + # 20 also return zero as coverage gaps, not legal ineligibility. + return where(band > 0, heating_payment + electric_payment, 0) diff --git a/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_eligible.py b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_eligible.py index 0dee867259c..968a281af7c 100644 --- a/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_eligible.py +++ b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_eligible.py @@ -5,9 +5,14 @@ class ms_liheap_eligible(Variable): value_type = bool entity = SPMUnit definition_period = YEAR - label = "Mississippi LIHEAP regular heating eligibility" + label = "Mississippi LIHEAP regular energy assistance eligibility" defined_for = StateCode.MS - reference = "https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=22,23,24,29,30,31,32,33" + reference = ( + # Rule 6.1 A-D (page 22), Rule 6.3 (page 23) and Rule 6.4 (page 24). + "https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=22", + # Section 2.3, explanations of policies (page 9). + "https://liheapch.acf.gov/docs/2026/state-plans/MS_Plan_2026.pdf#page=9", + ) def formula(spm_unit, period, parameters): p = parameters(period).gov.states.ms.mdhs.liheap @@ -18,16 +23,26 @@ def formula(spm_unit, period, parameters): # Existing inputs do not establish emancipated-minor headship, institutional # residence, or utility account ownership. A household adult is the modeled # applicant; children can establish immigration eligibility under Rule 6.3. - responsible = (spm_unit("heating_expense", period) > 0) | spm_unit( - "heat_expense_included_in_rent", period + # Rule 6.1 A requires an obligation to pay an energy bill: the main heating + # fuel, electricity, or energy included in the rent. + heat_in_rent = spm_unit("heat_expense_included_in_rent", period) + responsible = ( + (spm_unit("heating_expense", period) > 0) + | (spm_unit("pre_subsidy_electricity_expense", period) > 0) + | heat_in_rent ) subsidized = spm_unit( "receives_housing_assistance", period ) | spm_unit.household("is_in_public_housing", period) - # Subsidized housing needs separately billed energy (FY2026 plan Section 2). - housing_eligible = ~subsidized | ~spm_unit( - "heat_expense_included_in_rent", period - ) + # Rule 6.1 A accepts a bill paid directly to a utility, "subsidized + # housing where the energy cost is billed separate from rent", or + # landlord evidence that the utility is "an undesignated portion of the + # rent". The FY2026 plan (page 9) names public or subsidized housing + # residents whose rent includes utilities and who are not billed + # separately for energy, in an incomplete sentence. Both are read as: + # subsidized housing qualifies only with separately billed energy, and + # the landlord-evidence route is for unsubsidized renters. + housing_eligible = ~subsidized | ~heat_in_rent return ( (size > 0) & (income <= limit) & has_adult & responsible & housing_eligible ) diff --git a/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_household_size.py b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_household_size.py index 23a7e7c65c8..22c40df68f9 100644 --- a/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_household_size.py +++ b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_household_size.py @@ -6,12 +6,20 @@ class ms_liheap_household_size(Variable): entity = SPMUnit definition_period = YEAR label = "Mississippi LIHEAP eligible household size" + documentation = ( + "Number of documented household members. Rule 6.3 B-C leave an " + "undocumented member out of household size while still counting that " + "member's income. Rule 6.1 B requires the applicant to be a U.S. citizen " + "or legal permanent resident, and Rule 6.3 C refers to the other " + "members' satisfactory immigration status without defining it, so " + "citizens and the qualified noncitizens of 8 U.S.C. 1641 are counted as " + "documented. The SPM unit approximates the household: live-in " + "attendants, boarders and their separate energy arrangements are not " + "identified." + ) defined_for = StateCode.MS - reference = "https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=23" - - def formula(spm_unit, period, parameters): - # Rule 6.3(B)-(C), printed page 22 / PDF page 23, excludes undocumented - # non-applicants from size while including their countable income in full. - # SPM units approximate the household; live-in attendants, boarders, and - # their separate energy arrangements cannot be resolved with current inputs. - return add(spm_unit, period, ["is_citizen_or_legal_immigrant"]) + reference = ( + # Rule 6.1 B (page 22) and Rule 6.3 A-C (page 23). + "https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=22", + ) + adds = ["is_citizen_or_legal_immigrant"] diff --git a/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_income.py b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_income.py index af5db55f9bb..df17dadec21 100644 --- a/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_income.py +++ b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_income.py @@ -8,7 +8,10 @@ class ms_liheap_income(Variable): unit = USD label = "Mississippi LIHEAP countable annual household income" defined_for = StateCode.MS - reference = "https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=22,23,24,29,30,31,32,33" + reference = ( + # Rule 6.3 B-C (page 23) and Rule 6.11 A-K (pages 29-33). + "https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=29", + ) def formula(spm_unit, period, parameters): p = parameters(period).gov.states.ms.mdhs.liheap @@ -17,7 +20,9 @@ def formula(spm_unit, period, parameters): # Rule 6.11 I(1) specifies Schedule C's Net Profit or (Loss) line / 12. # Rule 6.11 C(2) counts self-employment income and I(2) uses a farmer as # its example, so farm operations income is counted the same signed way. - # Preserve the signed net amount: a loss can offset other household income. + # Rule 6.11 I(1) does not say whether a loss is floored at zero. The + # signed amount is counted, so a business or farm loss offsets wages + # and other members' income, and the household total is floored at zero. # Do not deduct business expenses again. Annual inputs approximate the # annualized preceding 30 days; pay-frequency changes and court-emancipated # minors are not identified by existing inputs. @@ -32,9 +37,12 @@ def formula(spm_unit, period, parameters): ) wages = max_(person("employment_income", period), 0) earned = (wages + self_employment) * adult - # Rule 6.3(B)-(C) retains non-applicants' countable income without - # headcount proration; Rule 6.11 still controls source/age exclusions. - # Children's unearned benefits count in full. + # Rule 6.3 B-C leave undocumented members out of household size and + # count their income. Rule 6.11 J(2) says a minor's Social Security or + # SSI "must be included and is listed under the parent or legal + # guardian in the household", so a minor's unearned income is counted + # as the adult's line in every household, including one whose head is + # undocumented. Rule 6.11 D(3) and J(1) exclude a minor's earnings. # Medicare withholding is included in SSA. Child support, TANF, refunds, # foster care, and occasional receipts are excluded. Existing input totals # cannot isolate recurring versus occasional gifts/rent/interest, or all diff --git a/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_income_limit.py b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_income_limit.py index 2ad5cc4259e..8e13d27724f 100644 --- a/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_income_limit.py +++ b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_income_limit.py @@ -1,5 +1,4 @@ from policyengine_us.model_api import * -from policyengine_us.variables.gov.hhs.hhs_smi import smi class ms_liheap_income_limit(Variable): @@ -9,22 +8,26 @@ class ms_liheap_income_limit(Variable): unit = USD label = "Mississippi LIHEAP annual income limit" defined_for = StateCode.MS - reference = "https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=58" + reference = ( + # Rule 6.1 C (page 22) and the Appendix 60% State Median Income table + # (page 58). + "https://www.sos.ms.gov/adminsearch/ACCode/00000693c.pdf#page=58", + ) def formula(spm_unit, period, parameters): p = parameters(period).gov.states.ms.mdhs.liheap size = spm_unit("ms_liheap_household_size", period) state = spm_unit.household("state_code_str", period) federal = parameters(period).gov.hhs.smi - base = federal.amount[state] # The published FY2026 limits truncate the four-person 60% SMI amount # first, then the household-adjusted amount. This reproduces all 20 rows; # it is a reconciled numerical pattern, not an explicit rounding rule. - # Indiana's size-first truncation raises the FY2026 limits for sizes - # 5 through 20 by $1. Keep this ordering in state code. - amount = ( - smi(size, state, period, parameters) - * np.floor(base * p.income_limit) - / base + four_person_limit = np.floor(federal.amount[state] * p.income_limit) + adjustment = federal.household_size_adjustment + threshold = federal.additional_person_threshold + size_share = ( + adjustment.first_person + + adjustment.second_to_sixth_person * clip(size - 1, 0, threshold - 1) + + adjustment.additional_person * max_(size - threshold, 0) ) - return where(size > 0, np.floor(amount), 0) + return where(size > 0, np.floor(four_person_limit * size_share), 0)