diff --git a/changelog.d/ms-liheap.added.md b/changelog.d/ms-liheap.added.md new file mode 100644 index 00000000000..f936aebcc95 --- /dev/null +++ b/changelog.d/ms-liheap.added.md @@ -0,0 +1 @@ +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 new file mode 100644 index 00000000000..ad903737266 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/adult_age.yaml @@ -0,0 +1,10 @@ +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: + unit: year + period: year + label: Mississippi LIHEAP adult age + reference: + - 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 new file mode 100644 index 00000000000..34baccdb899 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/1.yaml @@ -0,0 +1,35 @@ +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 + 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 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + period: year + label: Mississippi LIHEAP income bands for household size 1 + reference: + - 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 new file mode 100644 index 00000000000..3257118f8ba --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/10.yaml @@ -0,0 +1,38 @@ +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 + amount: + 2025-10-01: 1 + - threshold: + 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: + 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 + # 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: + 2025-10-01: 0 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + period: year + label: Mississippi LIHEAP income bands for household size 10 + reference: + - 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 new file mode 100644 index 00000000000..a5a02d09b42 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/11.yaml @@ -0,0 +1,33 @@ +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: + 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 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + period: year + label: Mississippi LIHEAP income bands for household size 11 + reference: + - 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 new file mode 100644 index 00000000000..a0c44226c2a --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/12.yaml @@ -0,0 +1,27 @@ +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 + 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 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + period: year + label: Mississippi LIHEAP income bands for household size 12 + reference: + - 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 new file mode 100644 index 00000000000..25b0f02ca66 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/13.yaml @@ -0,0 +1,27 @@ +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 + 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 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + period: year + label: Mississippi LIHEAP income bands for household size 13 + reference: + - 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 new file mode 100644 index 00000000000..838f275d896 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/14.yaml @@ -0,0 +1,27 @@ +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 + 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 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + period: year + label: Mississippi LIHEAP income bands for household size 14 + reference: + - 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 new file mode 100644 index 00000000000..c02c154492f --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/15.yaml @@ -0,0 +1,33 @@ +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 + 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 + # 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: + 2025-10-01: 0 + - threshold: + 2025-10-01: 69_488 + amount: + 2025-10-01: 4 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + period: year + label: Mississippi LIHEAP income bands for household size 15 + reference: + - 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 new file mode 100644 index 00000000000..0cd023f94ce --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/16.yaml @@ -0,0 +1,27 @@ +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 + 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 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + period: year + label: Mississippi LIHEAP income bands for household size 16 + reference: + - 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 new file mode 100644 index 00000000000..5ab41153e0e --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/17.yaml @@ -0,0 +1,27 @@ +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 + 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 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + period: year + label: Mississippi LIHEAP income bands for household size 17 + reference: + - 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 new file mode 100644 index 00000000000..4b8efb61438 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/18.yaml @@ -0,0 +1,29 @@ +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 + 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 + # 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: + 2025-10-01: 0 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + period: year + label: Mississippi LIHEAP income bands for household size 18 + reference: + - 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 new file mode 100644 index 00000000000..7a1b37c021f --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/19.yaml @@ -0,0 +1,23 @@ +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 + 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 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + period: year + label: Mississippi LIHEAP income bands for household size 19 + reference: + - 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 new file mode 100644 index 00000000000..fe18e9696f1 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/2.yaml @@ -0,0 +1,35 @@ +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 + 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 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + period: year + label: Mississippi LIHEAP income bands for household size 2 + reference: + - 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 new file mode 100644 index 00000000000..b46ae5383ce --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/20.yaml @@ -0,0 +1,25 @@ +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 + amount: + 2025-10-01: 1 + - threshold: + 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: + 2025-10-01: 0 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + period: year + label: Mississippi LIHEAP income bands for household size 20 + reference: + - 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 new file mode 100644 index 00000000000..b845fde9748 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/3.yaml @@ -0,0 +1,35 @@ +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 + 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 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + period: year + label: Mississippi LIHEAP income bands for household size 3 + reference: + - 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 new file mode 100644 index 00000000000..46a9725d958 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/4.yaml @@ -0,0 +1,35 @@ +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 + 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 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + period: year + label: Mississippi LIHEAP income bands for household size 4 + reference: + - 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 new file mode 100644 index 00000000000..f1ffedad8cb --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/5.yaml @@ -0,0 +1,35 @@ +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 + 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 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + period: year + label: Mississippi LIHEAP income bands for household size 5 + reference: + - 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 new file mode 100644 index 00000000000..9463ab1b905 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/6.yaml @@ -0,0 +1,35 @@ +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 + 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 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + period: year + label: Mississippi LIHEAP income bands for household size 6 + reference: + - 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 new file mode 100644 index 00000000000..14efe15e894 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/7.yaml @@ -0,0 +1,35 @@ +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 + 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 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + period: year + label: Mississippi LIHEAP income bands for household size 7 + reference: + - 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 new file mode 100644 index 00000000000..9326a495dd5 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/8.yaml @@ -0,0 +1,31 @@ +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 + 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 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + period: year + label: Mississippi LIHEAP income bands for household size 8 + reference: + - 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 new file mode 100644 index 00000000000..bd7940fbef4 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_bands/9.yaml @@ -0,0 +1,31 @@ +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 + 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 +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + period: year + label: Mississippi LIHEAP income bands for household size 9 + reference: + - 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 new file mode 100644 index 00000000000..c76a64678b7 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/income_limit.yaml @@ -0,0 +1,12 @@ +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 + period: year + label: Mississippi LIHEAP income limit + reference: + - 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 new file mode 100644 index 00000000000..cad1daf39a1 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/maximum_payment.yaml @@ -0,0 +1,34 @@ +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 +# The matrix has no column for solar or no heating. These homes receive the +# Electric column only. +SOLAR: + 2025-10-01: 0 +OTHER: + 2025-10-01: 400 +NONE: + 2025-10-01: 0 +metadata: + unit: currency-USD + period: year + label: Mississippi LIHEAP first income band heating cap + breakdown: + - heating_type + reference: + - 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 new file mode 100644 index 00000000000..ce89220dcf9 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/maximum_table_size.yaml @@ -0,0 +1,10 @@ +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: + unit: person + period: year + label: Mississippi LIHEAP maximum table size + reference: + - 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 new file mode 100644 index 00000000000..f5dfc097bf6 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/payment_reduction.yaml @@ -0,0 +1,32 @@ +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: + 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 + period: year + label: Mississippi LIHEAP payment reduction + breakdown: + - heating_type + reference: + - 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 new file mode 100644 index 00000000000..22e48b9a5fe --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_amount.yaml @@ -0,0 +1,12 @@ +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: + unit: currency-USD + period: year + label: Mississippi LIHEAP propane exception amount + reference: + - 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 new file mode 100644 index 00000000000..9307191ee90 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_household_size.yaml @@ -0,0 +1,12 @@ +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: + unit: person + period: year + label: Mississippi LIHEAP propane exception household size + reference: + - 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 new file mode 100644 index 00000000000..ec3afd44890 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/propane_exception_income_band.yaml @@ -0,0 +1,12 @@ +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: + unit: /1 + period: year + label: Mississippi LIHEAP propane exception income band + reference: + - 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 new file mode 100644 index 00000000000..f4b486eb450 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/mdhs/liheap/unearned_income_sources.yaml @@ -0,0 +1,30 @@ +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 + - alimony_income + - 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 + - ordinary_dividend_income + - interest_income + - rental_income +metadata: + unit: list + period: year + label: Mississippi LIHEAP unearned income sources + reference: + - 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 f1829ab2688..756dc2c4988 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, KS, TX + coverage: OR, DC, Riverside County, MA, IL, KS, MS, TX state_implementations: - state: OR status: in_progress @@ -831,6 +831,14 @@ programs: parameter_prefix: gov.states.ks.dcf.liheap verified_years: "2025-2026" notes: FY2025-FY2026 regular heating only. The FY2026 $130 minimum comes from the plan's estimated benefit levels; crisis, cooling and weatherization assistance are out of scope. + - 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 + verified_years: "2026" + 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 new file mode 100644 index 00000000000..a9a6c461f94 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/integration.yaml @@ -0,0 +1,172 @@ +- 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] + 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: + # 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: Case 2, a household with no documented member receives no payment. + period: 2026 + 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: + # 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 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 + employment_income: 0 + ssi: 0 + social_security: 0 + 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. + 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 +- 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 new file mode 100644 index 00000000000..e940bc034f8 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap.yaml @@ -0,0 +1,381 @@ +- 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] + 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: + # 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: 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] + 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: + # 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: 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] + 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: + # 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: Case 4, published size-sixteen propane cap in the fourth band. + period: 2026 + 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: + # 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: 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] + 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: + # 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 + 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] +- 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 new file mode 100644 index 00000000000..f2a24f109ae --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_eligible.yaml @@ -0,0 +1,66 @@ +- name: Case 1, income at and one dollar above the one-person limit. + period: 2026 + input: + 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: + # 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: 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] + 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] + 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 new file mode 100644 index 00000000000..75d007d5117 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_income.yaml @@ -0,0 +1,209 @@ +- 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] + employment_income: [12_000, 12_000, 12_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: + # 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: Case 2, child support, TANF and tax refunds are excluded while gifts and interest count. + period: 2026 + 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: + # 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: 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: + person1: + age: 35 + immigration_status: UNDOCUMENTED + employment_income: 12_000 + ssi: 0 + social_security: 0 + person2: + age: 15 + employment_income: 6_000 + sstb_self_employment_income: 2_000 + ssi: 2_400 + social_security: 1_200 + spm_units: + spm_unit: + members: [person1, person2] + heating_type: ELECTRICITY + heating_expense: 1_000 + households: + 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 + 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, service business profits above the income limit prevent a heating award. + 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: + # 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 7, 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 +- 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 new file mode 100644 index 00000000000..5a61db457dd --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ms/mdhs/liheap/ms_liheap_income_limit.yaml @@ -0,0 +1,20 @@ +- 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 new file mode 100644 index 00000000000..61dd8b2c50e --- /dev/null +++ b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap.py @@ -0,0 +1,83 @@ +from policyengine_us.model_api import * + + +class ms_liheap(Variable): + value_type = float + entity = SPMUnit + definition_period = YEAR + unit = USD + label = "Mississippi LIHEAP regular energy assistance" + documentation = ( + "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 = ( + # 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 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( + size == table_size, + p.income_bands[str(table_size)].calc(income, right=True), + band, + ) + fuel = spm_unit("heating_type", period) + types = fuel.possible_values + 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) + ) + 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 new file mode 100644 index 00000000000..968a281af7c --- /dev/null +++ b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_eligible.py @@ -0,0 +1,48 @@ +from policyengine_us.model_api import * + + +class ms_liheap_eligible(Variable): + value_type = bool + entity = SPMUnit + definition_period = YEAR + label = "Mississippi LIHEAP regular energy assistance eligibility" + defined_for = StateCode.MS + 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 + 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. + # 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) + # 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 new file mode 100644 index 00000000000..22c40df68f9 --- /dev/null +++ b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_household_size.py @@ -0,0 +1,25 @@ +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" + 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 = ( + # 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 new file mode 100644 index 00000000000..df17dadec21 --- /dev/null +++ b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_income.py @@ -0,0 +1,51 @@ +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 = ( + # 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 + 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. + # 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. + self_employment = add( + person, + period, + [ + "self_employment_income", + "sstb_self_employment_income", + "farm_operations_income", + ], + ) + wages = max_(person("employment_income", period), 0) + earned = (wages + self_employment) * adult + # 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 + # 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..8e13d27724f --- /dev/null +++ b/policyengine_us/variables/gov/states/ms/mdhs/liheap/ms_liheap_income_limit.py @@ -0,0 +1,33 @@ +from policyengine_us.model_api import * + + +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 = ( + # 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 + # 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. + 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(four_person_limit * size_share), 0)