From 69ee0cfc88bcbc8aeb5a784c4d6a59091a03464d Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Fri, 16 Oct 2026 16:09:34 -0400 Subject: [PATCH 1/2] Apply Mississippi TANF's $90 work expense, dependent care deduction and $10 minimum Mississippi deducts $90 for work expenses and the actual cost of dependent care from each earner's monthly earnings (MDHS TANF Policy Manual, Volume III, pages 4104 and 6025-6026), and issues no benefit under $10 a month (page 6015; Chapter 15, Table II). Co-Authored-By: Claude Opus 5.5 --- .../fix-10209-ms-tanf-deductions.fixed.md | 1 + .../tanf/income/deductions/work_expense.yaml | 14 ++ .../states/ms/dhs/tanf/minimum_payment.yaml | 14 ++ .../gov/states/ms/dhs/tanf/integration.yaml | 61 ++++++++ .../gov/states/ms/dhs/tanf/ms_tanf.yaml | 17 ++- .../tanf/ms_tanf_countable_earned_income.yaml | 131 ++++++++++++++++++ .../gov/states/ms/dhs/tanf/ms_tanf.py | 7 +- .../tanf/ms_tanf_countable_earned_income.py | 28 ++++ .../ms/dhs/tanf/ms_tanf_countable_income.py | 4 +- 9 files changed, 271 insertions(+), 6 deletions(-) create mode 100644 changelog.d/fix-10209-ms-tanf-deductions.fixed.md create mode 100644 policyengine_us/parameters/gov/states/ms/dhs/tanf/income/deductions/work_expense.yaml create mode 100644 policyengine_us/parameters/gov/states/ms/dhs/tanf/minimum_payment.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/ms/dhs/tanf/ms_tanf_countable_earned_income.yaml create mode 100644 policyengine_us/variables/gov/states/ms/dhs/tanf/ms_tanf_countable_earned_income.py diff --git a/changelog.d/fix-10209-ms-tanf-deductions.fixed.md b/changelog.d/fix-10209-ms-tanf-deductions.fixed.md new file mode 100644 index 00000000000..bf39d9263f8 --- /dev/null +++ b/changelog.d/fix-10209-ms-tanf-deductions.fixed.md @@ -0,0 +1 @@ +Deduct Mississippi TANF's $90 work expense and actual dependent care costs from each earner's earnings, and do not issue benefits under $10 a month. diff --git a/policyengine_us/parameters/gov/states/ms/dhs/tanf/income/deductions/work_expense.yaml b/policyengine_us/parameters/gov/states/ms/dhs/tanf/income/deductions/work_expense.yaml new file mode 100644 index 00000000000..76f51f24227 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/dhs/tanf/income/deductions/work_expense.yaml @@ -0,0 +1,14 @@ +description: Mississippi deducts this amount of monthly work expenses from each earner's earned income under the Temporary Assistance for Needy Families program. + +values: + 2017-01-01: 90 + +metadata: + unit: currency-USD + period: month + label: Mississippi TANF work expense deduction + reference: + - title: MDHS TANF Policy Manual, Volume III, Chapter 4, page 4104 - Earned Income Disregards + href: https://www.mdhs.ms.gov/wp-content/uploads/2019/07/TANF-Manual-Revised_7.19.pdf#page=370 + - title: MDHS TANF Policy Manual, Volume III, Chapter 6, pages 6025-6026 - Budgeting Net Monthly Earned Income + href: https://www.mdhs.ms.gov/wp-content/uploads/2019/07/TANF-Manual-Revised_7.19.pdf#page=469 diff --git a/policyengine_us/parameters/gov/states/ms/dhs/tanf/minimum_payment.yaml b/policyengine_us/parameters/gov/states/ms/dhs/tanf/minimum_payment.yaml new file mode 100644 index 00000000000..ffb71ef216d --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/dhs/tanf/minimum_payment.yaml @@ -0,0 +1,14 @@ +description: Mississippi does not issue Temporary Assistance for Needy Families program payments below this amount. + +values: + 2017-01-01: 10 + +metadata: + unit: currency-USD + period: month + label: Mississippi TANF minimum payment + reference: + - title: MDHS TANF Policy Manual, Volume III, Chapter 6, page 6015 - Minimum Benefit + href: https://www.mdhs.ms.gov/wp-content/uploads/2019/07/TANF-Manual-Revised_7.19.pdf#page=459 + - title: MDHS TANF Policy Manual, Volume III, Chapter 15, page 15001 - Table II, Minimum Payment + href: https://www.mdhs.ms.gov/wp-content/uploads/2019/07/TANF-Manual-Revised_7.19.pdf#page=888 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ms/dhs/tanf/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/ms/dhs/tanf/integration.yaml index 47bb3b586cd..20ff091964f 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ms/dhs/tanf/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ms/dhs/tanf/integration.yaml @@ -304,3 +304,64 @@ # $500 <= $1,522.55 = true ms_tanf_income_eligible: true ms_tanf_eligible: true + +- name: Case 9, parent of two with $200 a month of earnings gets the $90 work expense deduction. + period: 2026 + input: + people: + parent: + age: 30 + employment_income_before_lsr: 2_400 + child1: + age: 5 + is_tax_unit_dependent: true + child2: + age: 2 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [parent, child1, child2] + spm_unit_cash_assets: 0 + tax_units: + tax_unit: + members: [parent, child1, child2] + households: + household: + members: [parent, child1, child2] + state_code: MS + output: + # Monthly countable income: 200 - 90 = 110 + ms_tanf_countable_income: 110 * 12 + # (260 - 110) * 12 = 1_800 + ms_tanf: 1_800 + +- name: Case 10, parent of two with $200 a month of earnings and $50 a month of child care. + period: 2026 + input: + people: + parent: + age: 30 + employment_income_before_lsr: 2_400 + child1: + age: 5 + is_tax_unit_dependent: true + child2: + age: 2 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [parent, child1, child2] + spm_unit_cash_assets: 0 + childcare_expenses: 600 + tax_units: + tax_unit: + members: [parent, child1, child2] + households: + household: + members: [parent, child1, child2] + state_code: MS + output: + # Monthly countable income: 200 - 90 - 50 = 60 + ms_tanf_countable_income: 60 * 12 + # (260 - 60) * 12 = 2_400 + ms_tanf: 2_400 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ms/dhs/tanf/ms_tanf.yaml b/policyengine_us/tests/policy/baseline/gov/states/ms/dhs/tanf/ms_tanf.yaml index efa341c2bc3..95bddcbe684 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ms/dhs/tanf/ms_tanf.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ms/dhs/tanf/ms_tanf.yaml @@ -112,7 +112,7 @@ # $200 - $50 = $150 ms_tanf: 150 -- name: Case 11, high income reduces benefit to near zero. +- name: Case 11, benefit under the $10 minimum payment is not issued. period: 2026-01 input: state_code: MS @@ -120,5 +120,16 @@ ms_tanf_maximum_benefit: 260 ms_tanf_countable_income: 255 output: - # $260 - $255 = $5 - ms_tanf: 5 + # $260 - $255 = $5 < $10 minimum payment + ms_tanf: 0 + +- name: Case 12, benefit equal to the $10 minimum payment is issued. + period: 2026-01 + input: + state_code: MS + ms_tanf_eligible: true + ms_tanf_maximum_benefit: 260 + ms_tanf_countable_income: 250 + output: + # $260 - $250 = $10 >= $10 minimum payment + ms_tanf: 10 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ms/dhs/tanf/ms_tanf_countable_earned_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/ms/dhs/tanf/ms_tanf_countable_earned_income.yaml new file mode 100644 index 00000000000..9f7f847ee14 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ms/dhs/tanf/ms_tanf_countable_earned_income.yaml @@ -0,0 +1,131 @@ +# Mississippi TANF countable earned income +# MDHS TANF Policy Manual, Volume III, pages 6025-6026: deduct from each +# earner's monthly earnings (a) $90 for work expenses, then (b) the actual +# cost of dependent care. + +- name: Case 1, no earnings. + period: 2026-01 + input: + people: + parent: + age: 30 + child: + age: 5 + spm_units: + spm_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: MS + output: + ms_tanf_countable_earned_income: 0 + +- name: Case 2, one earner, $90 work expense deduction. + period: 2026-01 + input: + people: + parent: + age: 30 + employment_income_before_lsr: 2_400 + child: + age: 5 + spm_units: + spm_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: MS + output: + # 2_400 / 12 - 90 = 200 - 90 = 110 + ms_tanf_countable_earned_income: 110 + +- name: Case 3, one earner with child care costs. + period: 2026-01 + input: + people: + parent: + age: 30 + employment_income_before_lsr: 2_400 + child: + age: 5 + spm_units: + spm_unit: + members: [parent, child] + childcare_expenses: 600 + households: + household: + members: [parent, child] + state_code: MS + output: + # 200 - 90 - 600 / 12 = 200 - 90 - 50 = 60 + ms_tanf_countable_earned_income: 60 + +- name: Case 4, two earners each get the $90 deduction. + period: 2026-01 + input: + people: + parent1: + age: 30 + employment_income_before_lsr: 6_000 + parent2: + age: 32 + employment_income_before_lsr: 3_600 + child: + age: 5 + spm_units: + spm_unit: + members: [parent1, parent2, child] + childcare_expenses: 1_200 + households: + household: + members: [parent1, parent2, child] + state_code: MS + output: + # (500 - 90) + (300 - 90) - 1_200 / 12 = 410 + 210 - 100 = 520 + ms_tanf_countable_earned_income: 520 + +- name: Case 5, earnings below $90 are fully deducted. + period: 2026-01 + input: + people: + parent: + age: 30 + employment_income_before_lsr: 720 + child: + age: 5 + spm_units: + spm_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: MS + output: + # max(60 - 90, 0) = 0 + ms_tanf_countable_earned_income: 0 + +- name: Case 6, dependent care above earnings does not reduce unearned income. + period: 2026-01 + input: + people: + parent: + age: 30 + employment_income_before_lsr: 2_400 + alimony_income: 600 + child: + age: 5 + spm_units: + spm_unit: + members: [parent, child] + childcare_expenses: 3_600 + households: + household: + members: [parent, child] + state_code: MS + output: + # max(200 - 90 - 300, 0) = 0 + ms_tanf_countable_earned_income: 0 + # 0 earned + 600 / 12 unearned + ms_tanf_countable_income: 50 diff --git a/policyengine_us/variables/gov/states/ms/dhs/tanf/ms_tanf.py b/policyengine_us/variables/gov/states/ms/dhs/tanf/ms_tanf.py index 923f3ed4ae2..01c4130af80 100644 --- a/policyengine_us/variables/gov/states/ms/dhs/tanf/ms_tanf.py +++ b/policyengine_us/variables/gov/states/ms/dhs/tanf/ms_tanf.py @@ -11,10 +11,15 @@ class ms_tanf(Variable): reference = ( "https://www.mdhs.ms.gov/wp-content/uploads/2018/02/MDHS_TANF-Eligibility-Flyer.pdf", "https://www.law.cornell.edu/regulations/mississippi/Miss-Code-tit-18-pt-19", + "https://www.mdhs.ms.gov/wp-content/uploads/2019/07/TANF-Manual-Revised_7.19.pdf#page=459", ) def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ms.dhs.tanf maximum_benefit = spm_unit("ms_tanf_maximum_benefit", period) countable_income = spm_unit("ms_tanf_countable_income", period) benefit = max_(maximum_benefit - countable_income, 0) - return min_(benefit, maximum_benefit) + benefit = min_(benefit, maximum_benefit) + # MDHS TANF Policy Manual, Volume III, page 6015: no benefit is + # issued when the monthly benefit is less than $10. + return where(benefit >= p.minimum_payment, benefit, 0) diff --git a/policyengine_us/variables/gov/states/ms/dhs/tanf/ms_tanf_countable_earned_income.py b/policyengine_us/variables/gov/states/ms/dhs/tanf/ms_tanf_countable_earned_income.py new file mode 100644 index 00000000000..b9c22b82261 --- /dev/null +++ b/policyengine_us/variables/gov/states/ms/dhs/tanf/ms_tanf_countable_earned_income.py @@ -0,0 +1,28 @@ +from policyengine_us.model_api import * + + +class ms_tanf_countable_earned_income(Variable): + value_type = float + entity = SPMUnit + label = "Mississippi TANF countable earned income" + unit = USD + definition_period = MONTH + defined_for = StateCode.MS + reference = ( + "https://www.mdhs.ms.gov/wp-content/uploads/2019/07/TANF-Manual-Revised_7.19.pdf#page=370", + "https://www.mdhs.ms.gov/wp-content/uploads/2019/07/TANF-Manual-Revised_7.19.pdf#page=469", + ) + + def formula(spm_unit, period, parameters): + # MDHS TANF Policy Manual, Volume III, pages 6025-6026: from the + # monthly earned income of each individual, deduct (a) a standard + # $90 for work expenses and then (b) the actual cost of care for + # each dependent child or incapacitated adult in the budget. + p = parameters(period).gov.states.ms.dhs.tanf.income.deductions + person = spm_unit.members + gross_earned = person("tanf_gross_earned_income", period) + earned_after_work_expense = spm_unit.sum(max_(gross_earned - p.work_expense, 0)) + childcare_expenses = spm_unit("childcare_expenses", period) + adult_care_expenses = add(spm_unit, period, ["care_expenses"]) + dependent_care = childcare_expenses + adult_care_expenses + return max_(earned_after_work_expense - dependent_care, 0) diff --git a/policyengine_us/variables/gov/states/ms/dhs/tanf/ms_tanf_countable_income.py b/policyengine_us/variables/gov/states/ms/dhs/tanf/ms_tanf_countable_income.py index b5eed6bf585..74479470deb 100644 --- a/policyengine_us/variables/gov/states/ms/dhs/tanf/ms_tanf_countable_income.py +++ b/policyengine_us/variables/gov/states/ms/dhs/tanf/ms_tanf_countable_income.py @@ -14,6 +14,6 @@ class ms_tanf_countable_income(Variable): ) # NOTE: Mississippi has 6-month and 3-month total earned income disregards # that cannot be tracked in PolicyEngine. This simplified implementation - # uses gross income without those time-limited disregards. + # does not apply those time-limited disregards. - adds = ["tanf_gross_earned_income", "tanf_gross_unearned_income"] + adds = ["ms_tanf_countable_earned_income", "tanf_gross_unearned_income"] From 9cdc151cd782f3ca9c02196175ed8f5ea1689559 Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Tue, 27 Oct 2026 11:01:17 -0400 Subject: [PATCH 2/2] Address review of Mississippi TANF deductions (#10258) - Point the $90 and dependent care citations at 2019 manual file page 470 (was 469), drop printed page numbers from reference titles, and merge the per-page entries into one entry per source document. - Cite Miss. Admin. Code tit. 18, pt. 13 (2024-12-05) beside the 2019 manual for the deduction, the minimum payment and the benefit. - Document that ms_tanf still pays the maximum less countable income, and give the 60% of the deficit amounts (#10269) in the test comments. - Add tests for the per-earner $90 floor and the care_expenses branch. - Note that dependent care is pooled across earners, and that the special student disregard is not modeled (#10490). Co-Authored-By: Claude Opus 5.5 --- .../tanf/income/deductions/work_expense.yaml | 6 +-- .../states/ms/dhs/tanf/minimum_payment.yaml | 6 +-- .../gov/states/ms/dhs/tanf/integration.yaml | 18 +++++-- .../gov/states/ms/dhs/tanf/ms_tanf.yaml | 12 +++++ .../tanf/ms_tanf_countable_earned_income.yaml | 53 +++++++++++++++++-- .../gov/states/ms/dhs/tanf/ms_tanf.py | 13 ++++- .../tanf/ms_tanf_countable_earned_income.py | 17 +++--- .../ms/dhs/tanf/ms_tanf_countable_income.py | 4 +- 8 files changed, 108 insertions(+), 21 deletions(-) diff --git a/policyengine_us/parameters/gov/states/ms/dhs/tanf/income/deductions/work_expense.yaml b/policyengine_us/parameters/gov/states/ms/dhs/tanf/income/deductions/work_expense.yaml index 76f51f24227..72756691413 100644 --- a/policyengine_us/parameters/gov/states/ms/dhs/tanf/income/deductions/work_expense.yaml +++ b/policyengine_us/parameters/gov/states/ms/dhs/tanf/income/deductions/work_expense.yaml @@ -8,7 +8,7 @@ metadata: period: month label: Mississippi TANF work expense deduction reference: - - title: MDHS TANF Policy Manual, Volume III, Chapter 4, page 4104 - Earned Income Disregards + - title: "MDHS TANF Policy Manual, Volume III (July 2019), Chapter 4 - Earned Income Disregards and Chapter 6 - Budgeting Net Monthly Earned Income #page 370,470" href: https://www.mdhs.ms.gov/wp-content/uploads/2019/07/TANF-Manual-Revised_7.19.pdf#page=370 - - title: MDHS TANF Policy Manual, Volume III, Chapter 6, pages 6025-6026 - Budgeting Net Monthly Earned Income - href: https://www.mdhs.ms.gov/wp-content/uploads/2019/07/TANF-Manual-Revised_7.19.pdf#page=469 + - title: "Miss. Admin. Code tit. 18, pt. 13, TANF Policy Manual, Volume III, Chapter 4 - Earned Income Disregards and Chapter 6 - Budgeting Net Monthly Earned Income #page 362,469" + href: https://www.sos.ms.gov/adminsearch/ACCode/00000330c.pdf#page=362 diff --git a/policyengine_us/parameters/gov/states/ms/dhs/tanf/minimum_payment.yaml b/policyengine_us/parameters/gov/states/ms/dhs/tanf/minimum_payment.yaml index ffb71ef216d..36a1fe23d68 100644 --- a/policyengine_us/parameters/gov/states/ms/dhs/tanf/minimum_payment.yaml +++ b/policyengine_us/parameters/gov/states/ms/dhs/tanf/minimum_payment.yaml @@ -8,7 +8,7 @@ metadata: period: month label: Mississippi TANF minimum payment reference: - - title: MDHS TANF Policy Manual, Volume III, Chapter 6, page 6015 - Minimum Benefit + - title: "MDHS TANF Policy Manual, Volume III (July 2019), Chapter 6 - Minimum Benefit and Chapter 15 - Table II #page 459,888" href: https://www.mdhs.ms.gov/wp-content/uploads/2019/07/TANF-Manual-Revised_7.19.pdf#page=459 - - title: MDHS TANF Policy Manual, Volume III, Chapter 15, page 15001 - Table II, Minimum Payment - href: https://www.mdhs.ms.gov/wp-content/uploads/2019/07/TANF-Manual-Revised_7.19.pdf#page=888 + - title: "Miss. Admin. Code tit. 18, pt. 13, TANF Policy Manual, Volume III, Chapter 6 - Minimum Benefit and Chapter 15 - Table II #page 459,970" + href: https://www.sos.ms.gov/adminsearch/ACCode/00000330c.pdf#page=459 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ms/dhs/tanf/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/ms/dhs/tanf/integration.yaml index 20ff091964f..bddac6bd8d8 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ms/dhs/tanf/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ms/dhs/tanf/integration.yaml @@ -6,7 +6,15 @@ # - Income limits by size: 1=$627, 2=$851, 3=$1,074, 4=$1,298, 5=$1,523 # - Payment standards: First person $200, second $36, each additional $24 # - Resource limit: $2,000 -# - Benefit: Maximum Payment Standard - Countable Income +# - Countable earned income: each earner's earnings less $90, then less +# actual dependent care costs +# - Benefit: Maximum Payment Standard - Countable Income; no benefit under $10 +# +# The benefit formula is PolicyEngine's current one. MDHS pays 60% of the +# deficit (need standard less net income), up to the maximum (Title 18, +# Part 13, Chapter 6, Computing Benefit; Chapter 15, Table II). That change +# is tracked in PolicyEngine/policyengine-us#10269; the Case 9 and Case 10 +# comments give the amounts under the 60% rule. - name: Case 1, single parent with one child, no income, receives maximum benefit. period: 2026-01 @@ -332,7 +340,9 @@ output: # Monthly countable income: 200 - 90 = 110 ms_tanf_countable_income: 110 * 12 - # (260 - 110) * 12 = 1_800 + # PolicyEngine's current formula: (260 - 110) * 12 = 1_800 + # 60% of the deficit (#10269): min(floor(0.6 * (581 - 110)), 260) * 12 + # = min(282, 260) * 12 = 3_120 ms_tanf: 1_800 - name: Case 10, parent of two with $200 a month of earnings and $50 a month of child care. @@ -363,5 +373,7 @@ output: # Monthly countable income: 200 - 90 - 50 = 60 ms_tanf_countable_income: 60 * 12 - # (260 - 60) * 12 = 2_400 + # PolicyEngine's current formula: (260 - 60) * 12 = 2_400 + # 60% of the deficit (#10269): min(floor(0.6 * (581 - 60)), 260) * 12 + # = min(312, 260) * 12 = 3_120 ms_tanf: 2_400 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ms/dhs/tanf/ms_tanf.yaml b/policyengine_us/tests/policy/baseline/gov/states/ms/dhs/tanf/ms_tanf.yaml index 95bddcbe684..5addc16dd24 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ms/dhs/tanf/ms_tanf.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ms/dhs/tanf/ms_tanf.yaml @@ -1,7 +1,14 @@ # Mississippi TANF benefit calculation tests # Benefit = Maximum Payment Standard - Countable Income # If countable income exceeds payment standard, benefit = $0 +# No benefit is issued when the monthly benefit is less than $10 # Must be eligible (ms_tanf_eligible) to receive any benefit +# +# These cases test PolicyEngine's current formula. MDHS pays 60% of the +# deficit (need standard less net income), up to the maximum (Title 18, +# Part 13, Chapter 6, Computing Benefit; Chapter 15, Table II). That change +# is tracked in PolicyEngine/policyengine-us#10269 and will change these +# expectations. - name: Case 1, ineligible household receives zero benefit. period: 2026-01 @@ -121,6 +128,9 @@ ms_tanf_countable_income: 255 output: # $260 - $255 = $5 < $10 minimum payment + # Under the 60% rule (#10269), countable income of 255 for a family of 3 + # gives floor(0.6 * (581 - 255)) = 195; this case would then need + # countable income of 570: floor(0.6 * 11) = 6 < 10. ms_tanf: 0 - name: Case 12, benefit equal to the $10 minimum payment is issued. @@ -132,4 +142,6 @@ ms_tanf_countable_income: 250 output: # $260 - $250 = $10 >= $10 minimum payment + # Under the 60% rule (#10269), this case would need countable income of + # 564: floor(0.6 * 17) = 10. ms_tanf: 10 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ms/dhs/tanf/ms_tanf_countable_earned_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/ms/dhs/tanf/ms_tanf_countable_earned_income.yaml index 9f7f847ee14..b934206d677 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ms/dhs/tanf/ms_tanf_countable_earned_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ms/dhs/tanf/ms_tanf_countable_earned_income.yaml @@ -1,7 +1,7 @@ # Mississippi TANF countable earned income -# MDHS TANF Policy Manual, Volume III, pages 6025-6026: deduct from each -# earner's monthly earnings (a) $90 for work expenses, then (b) the actual -# cost of dependent care. +# MDHS TANF Policy Manual, Volume III, Chapter 6, Budgeting Net Monthly +# Earned Income: deduct from each earner's monthly earnings (a) $90 for work +# expenses, then (b) the actual cost of dependent care. - name: Case 1, no earnings. period: 2026-01 @@ -129,3 +129,50 @@ ms_tanf_countable_earned_income: 0 # 0 earned + 600 / 12 unearned ms_tanf_countable_income: 50 + +- name: Case 7, the $90 deduction is floored for each earner, not for the unit. + period: 2026-01 + input: + people: + parent1: + age: 30 + employment_income_before_lsr: 720 + parent2: + age: 32 + employment_income_before_lsr: 3_600 + child: + age: 5 + spm_units: + spm_unit: + members: [parent1, parent2, child] + households: + household: + members: [parent1, parent2, child] + state_code: MS + output: + # max(60 - 90, 0) + (300 - 90) = 0 + 210 = 210 + # (a floor on the pooled amount would give 360 - 180 = 180) + ms_tanf_countable_earned_income: 210 + +- name: Case 8, care costs for an incapacitated adult are deducted. + period: 2026-01 + input: + people: + parent: + age: 30 + employment_income_before_lsr: 6_000 + spouse: + age: 32 + care_expenses: 1_200 + child: + age: 5 + spm_units: + spm_unit: + members: [parent, spouse, child] + households: + household: + members: [parent, spouse, child] + state_code: MS + output: + # (500 - 90) - 1_200 / 12 = 410 - 100 = 310 + ms_tanf_countable_earned_income: 310 diff --git a/policyengine_us/variables/gov/states/ms/dhs/tanf/ms_tanf.py b/policyengine_us/variables/gov/states/ms/dhs/tanf/ms_tanf.py index 01c4130af80..c91ded8a9ef 100644 --- a/policyengine_us/variables/gov/states/ms/dhs/tanf/ms_tanf.py +++ b/policyengine_us/variables/gov/states/ms/dhs/tanf/ms_tanf.py @@ -11,15 +11,24 @@ class ms_tanf(Variable): reference = ( "https://www.mdhs.ms.gov/wp-content/uploads/2018/02/MDHS_TANF-Eligibility-Flyer.pdf", "https://www.law.cornell.edu/regulations/mississippi/Miss-Code-tit-18-pt-19", + # PDF pages 459, 888 "https://www.mdhs.ms.gov/wp-content/uploads/2019/07/TANF-Manual-Revised_7.19.pdf#page=459", + # PDF pages 459, 970 + "https://www.sos.ms.gov/adminsearch/ACCode/00000330c.pdf#page=459", ) def formula(spm_unit, period, parameters): p = parameters(period).gov.states.ms.dhs.tanf maximum_benefit = spm_unit("ms_tanf_maximum_benefit", period) countable_income = spm_unit("ms_tanf_countable_income", period) + # This pays the maximum benefit less countable income. Title 18, + # Part 13, Chapter 6 (Computing Benefit) and Chapter 15, Table II + # pay 60% of the deficit (need standard less net income), up to the + # maximum benefit. PolicyEngine/policyengine-us#10269 tracks that + # change. benefit = max_(maximum_benefit - countable_income, 0) benefit = min_(benefit, maximum_benefit) - # MDHS TANF Policy Manual, Volume III, page 6015: no benefit is - # issued when the monthly benefit is less than $10. + # MDHS TANF Policy Manual, Volume III, Chapter 6, Minimum Benefit, + # and Chapter 15, Table II: no benefit is issued when the monthly + # benefit is less than $10. return where(benefit >= p.minimum_payment, benefit, 0) diff --git a/policyengine_us/variables/gov/states/ms/dhs/tanf/ms_tanf_countable_earned_income.py b/policyengine_us/variables/gov/states/ms/dhs/tanf/ms_tanf_countable_earned_income.py index b9c22b82261..e044b39dc0e 100644 --- a/policyengine_us/variables/gov/states/ms/dhs/tanf/ms_tanf_countable_earned_income.py +++ b/policyengine_us/variables/gov/states/ms/dhs/tanf/ms_tanf_countable_earned_income.py @@ -9,19 +9,24 @@ class ms_tanf_countable_earned_income(Variable): definition_period = MONTH defined_for = StateCode.MS reference = ( - "https://www.mdhs.ms.gov/wp-content/uploads/2019/07/TANF-Manual-Revised_7.19.pdf#page=370", - "https://www.mdhs.ms.gov/wp-content/uploads/2019/07/TANF-Manual-Revised_7.19.pdf#page=469", + "https://www.mdhs.ms.gov/wp-content/uploads/2019/07/TANF-Manual-Revised_7.19.pdf#page=470", + "https://www.sos.ms.gov/adminsearch/ACCode/00000330c.pdf#page=469", ) def formula(spm_unit, period, parameters): - # MDHS TANF Policy Manual, Volume III, pages 6025-6026: from the - # monthly earned income of each individual, deduct (a) a standard - # $90 for work expenses and then (b) the actual cost of care for - # each dependent child or incapacitated adult in the budget. + # MDHS TANF Policy Manual, Volume III, Chapter 6, Budgeting Net + # Monthly Earned Income: from the monthly earned income of each + # individual, deduct (a) a standard $90 for work expenses and then + # (b) the actual cost of care for each dependent child or + # incapacitated adult in the budget. p = parameters(period).gov.states.ms.dhs.tanf.income.deductions person = spm_unit.members gross_earned = person("tanf_gross_earned_income", period) earned_after_work_expense = spm_unit.sum(max_(gross_earned - p.work_expense, 0)) + # The manual deducts dependent care from the earnings of the + # individual who pays it. PolicyEngine does not record which earner + # pays, so the unit's care costs come off the unit's earnings after + # the per-earner $90. childcare_expenses = spm_unit("childcare_expenses", period) adult_care_expenses = add(spm_unit, period, ["care_expenses"]) dependent_care = childcare_expenses + adult_care_expenses diff --git a/policyengine_us/variables/gov/states/ms/dhs/tanf/ms_tanf_countable_income.py b/policyengine_us/variables/gov/states/ms/dhs/tanf/ms_tanf_countable_income.py index 74479470deb..434f458c7a0 100644 --- a/policyengine_us/variables/gov/states/ms/dhs/tanf/ms_tanf_countable_income.py +++ b/policyengine_us/variables/gov/states/ms/dhs/tanf/ms_tanf_countable_income.py @@ -11,9 +11,11 @@ class ms_tanf_countable_income(Variable): reference = ( "https://www.mdhs.ms.gov/wp-content/uploads/2018/02/MDHS_TANF-Eligibility-Flyer.pdf", "https://www.law.cornell.edu/regulations/mississippi/Miss-Code-tit-18-pt-19", + "https://www.sos.ms.gov/adminsearch/ACCode/00000330c.pdf#page=469", ) # NOTE: Mississippi has 6-month and 3-month total earned income disregards # that cannot be tracked in PolicyEngine. This simplified implementation - # does not apply those time-limited disregards. + # does not apply those time-limited disregards. It also does not apply + # the special student disregard (PolicyEngine/policyengine-us#10490). adds = ["ms_tanf_countable_earned_income", "tanf_gross_unearned_income"]