Skip to content

Count military retirement in KS, MS, NC, NJ and NY LIHEAP income - #10409

Open
PavelMakarchuk wants to merge 2 commits into
mainfrom
liheap-military-retirement-ks-ms-nc-nj-ny
Open

PavelMakarchuk wants to merge 2 commits into
mainfrom
liheap-military-retirement-ks-ms-nc-nj-ny

Conversation

@PavelMakarchuk

@PavelMakarchuk PavelMakarchuk commented Oct 23, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

Five LIHEAP unearned income lists name no military retirement input at all, so a 70-year-old whose only income is $24,000 of military retirement pay, or a military Survivor Benefit Plan (SBP) annuity, has $0 of countable income. Each list counts pension_income, but that adds only taxable_pension_income and tax_exempt_pension_income; military retirement pay is the separate input military_retirement_pay, and an SBP annuity is military_retirement_pay_survivors. military_retirement_income adds both.

This PR adds military_retirement_income to the five lists, with a comment that cites each program's rule:

  • ks/dcf/liheap/income/sources/unearned.yaml
  • ms/mdhs/liheap/unearned_income_sources.yaml
  • nc/ncdhhs/lieap/unearned_income_sources.yaml
  • nj/dca/liheap/income/sources/unearned.yaml
  • ny/otda/heap/income/sources/unearned.yaml

This is item G3 from DTrim99's review of #10317. #10317 switched the lists that named military_retirement_pay and added test_military_retirement_readers.py; that guard cannot catch a list that names neither input. The gap predates #10182. survivor_benefits does not include military_retirement_pay_survivors, so nothing is counted twice.

Rule check for each list

All five FY2026 state plans check "Retirement / pension benefits" in item 1.9 (PDF page 6). Each manual counts pensions or annuities, and no exclusion covers military retired pay or an SBP annuity.

Program Rule
KS LIEAP KEESM 13360 counts "most other income"; 13361 says "Only the following incomes are exempt", and its list has no military retirement or survivor annuity item (it exempts combat pay and named VA payments only).
MS LIHEAP Manual Rule 6.11 C(8) counts "Retirement benefits" (PDF p. 29); F defines unearned income as "all income that is not earned" and lists "Private pensions and annuities" and "civil service annuities ... retirement benefits" (F(2)-(3), PDF p. 31). The D exemptions (PDF pp. 29-30) do not cover them.
NC LIEAP EP-300.09 A (p. 10) takes the income types from FNS 300. The FNS 300.02 chart counts as unearned "Retirement Benefits" from plans set up by "the government or other institutions" (p. 18), "Pensions" (p. 16) and "Annuities" (p. 3). The "Military Pay" row (p. 13) covers active-duty pay items only.
NJ LIHEAP Handbook 2.3.D (FY2026 and FY2027, PDF p. 8) and N.J.A.C. 5:49-2.3(d) count "benefits and pensions, annuities". Handbook 2.3.E.10 (PDF p. 9) excludes "Veteran's benefits"; the plan words that excluded item as "Veterans Administration (VA) benefits" (1.9, PDF p. 7). The Department of Defense, not the VA, pays military retired pay and SBP annuities, so the exclusion does not reach them.
NY HEAP HEAP Manual Chapter 8 D.12(a)(13) counts "Pensions" and (14) "Payments from insurance and annuities" (PDF p. 38); (38) counts all other income not excluded (p. 39). The D.13 exclusions (pp. 39-40) do not cover them.

The NJ row is the one reading a reviewer may want to check: it treats the handbook's veterans' benefits exclusion as limited to VA benefits, as the state plan words it.

Tests

One new case per state, each with two one-person households aged 70: $24,000 military retirement pay and a $9,600 SBP annuity ($800 a month).

File Case Expected
ks/dcf/liheap/income/ks_liheap_countable_income.yaml 12 24,000 and 9,600
ms/mdhs/liheap/ms_liheap_income.yaml 10 24,000 and 9,600
nc/ncdhhs/lieap/nc_lieap_income.yaml 14 gross 24,000 and 9,600; after the $85 a month medical deduction for age 60+, 22,980 and 8,580
nj/dca/liheap/income/nj_liheap_countable_income_person.yaml 9 24,000 and 9,600 (household total too)
ny/otda/heap/income/ny_heap_countable_income.yaml 8 24,000 and 9,600
  • All five new cases fail with the lists on main (5 failed, 48 passed in the five files).
  • With the change: 334 passed in the five LIHEAP folders (KS 133, MS 45, NC 52, NJ 47, NY 57).
  • test_military_retirement_readers.py and test_source_conflicts.py: 107 passed. test_aggregate_list_integrity.py, test_parameter_yaml_keys.py, test_reference_urls.py and test_no_group_variables_in_person_adds.py: 98 passed.
  • No partner contract test reads these programs with military retirement inputs.

Not changed here

  • The KS and MS lists also have no survivor_benefits, although KEESM 13360 and MS Rule 6.11 F count non-Social-Security survivor payments. That is a separate input and a separate gap.

Axiom

axiom: TheAxiomFoundation/rulespec-us#1469, #1467, #1466, #1481 and #1480 queued

These are the queued pe-parity issues for KS, MS, NC, NJ and NY LIHEAP; rulespec-us has no module for any of them yet. Each issue now has a note that adds military retirement income to the request, with the verbatim rule text, the output change, these companion cases and a review_finding addendum: KS, MS, NC, NJ, NY. For NC, rulespec-us already encodes the FNS 300.02 Annuities, Pensions and Retirement Benefits rows (fns-300-sources-of-income/page-3, page-16, page-18).

🤖 Generated with Claude Code

PavelMakarchuk and others added 2 commits October 23, 2026 12:52
The five LIHEAP unearned income lists named neither military retirement
input, so a household whose only income was military retirement pay or a
Survivor Benefit Plan annuity had $0 of countable income. Each program's
rule counts retirement and pension benefits (state plan item 1.9) and its
manual counts pensions and annuities with no exclusion for these payments,
so add military_retirement_income to each list and test both inputs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant