Skip to content

Add New Hampshire state supplementation for 2026 - #10156

Open
hua7450 wants to merge 6 commits into
mainfrom
nh-ssp-2026
Open

hua7450 wants to merge 6 commits into
mainfrom
nh-ssp-2026

Conversation

@hua7450

@hua7450 hua7450 commented Oct 12, 2026 •

Copy link
Copy Markdown
Collaborator

What and why

Implements New Hampshire State Supplement Program for researched 2026 coverage, with state-specific eligibility, payment rules, and integration into benefit totals and SNAP/HUD income.

Models the 2026 individual and couple need standards, certified community care, state income disregards, resource limit, rounding and grant reduction. State medical decisions, specialized deductions, care placement and no-SNAP grant reductions require explicit inputs. Blind children include full co-resident parental resource excess; certified exceptions and eighteenth-birthday month treatment require a deemed-resource input. Needy essential-person groups use a certified caregiver income/resource budget. The standards of need follow He-W 658.03(e) and 648.04(b): the SSI maximum for the assistance group plus New Hampshire's minimum payment level less the standard disregard, so they move with each SSI cost-of-living increase. The minimum payment levels ($27 individual, $21 two-person, $89 / $149 / $207 / $207 for community residences, enhanced family care and residential care) match SSA's January 1998 and 2011 tables and every New Hampshire January release from 1998 (SR 97-44) to 2026. The three-person standard is the published $1,976 (SR 26-01), which can't be derived from SSA amounts. Conditional resources, sanctions and grandfathered benefits are not modeled.

Qualified aliens follow He-W 616.02 and 8 U.S.C. 1622(b). AAM 305.13 keeps permanent residents out for 5 years "regardless of work history"; the model follows 8 U.S.C. 1622(b)(2), which makes a permanent resident credited with 40 qualifying quarters eligible for any state public benefit (snap_alien_qualifying_quarters, default 0). Aid to the Permanently and Totally Disabled reads is_permanently_and_totally_disabled, an input that defaults to false, so microsimulation pays it only where the dataset sets it.

Parameter backfilling does not establish verified historical coverage.

Related: #9190; historical backdating remains separate. #10226 tracks the reform copies of spm_unit_benefits (such as the Texas rebate's), which this PR leaves unchanged.

References

Additional section and page citations are included alongside the parameters and formulas.

Test plan

  • 73 New Hampshire YAML cases (54 in nh_ssp.yaml, 10 in integration.yaml, 6 in nh_ssp_assistance_group_size.yaml, 3 in nh_ssp_resources_deemed_from_parents.yaml) pass locally after merging main, with the 243 federal SSI cases, the 183 SNAP immigration cases, and the aggregate list integrity and program registry tests (677 passed, 10 skipped).
  • Synthetic national simulation: 153 households, 204 people, all 50 states and DC; finite nonnegative benefit and income aggregates.
  • make format, reference/registry checks, and git diff --check.
  • State changelog fragment.

axiom: He-W 658.03; He-W 648.04; He-W 670.03; SPA NH-26-0001; 8 U.S.C. 1622(b) TheAxiomFoundation/rulespec-us#1769 queued

hua7450 and others added 3 commits October 12, 2026 14:19
…nt and parental resources

- Apply He-W 616.02's five-year entry rule instead of SSI's 40-quarter test
- Pay nothing when the grant is below the $2 minimum (He-W 670.03(a)(4))
- Deem parental resources through the federal pool, which counts stepparents; drop the shared helper
- Couple status from the SSI spouse signal; couple grant reduction independent of member order
- Derive employment expenses and support deductions from existing variables
- Registry placement and comments, SNAP reference title, shorter programs.yaml note, reference locators
- Tests for the immigrant rule, minimum grant, stepparent, spouse earnings and couple cases

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@hua7450
hua7450 marked this pull request as ready for review October 13, 2026 08:14
@DTrim99 DTrim99 mentioned this pull request Oct 13, 2026
4 tasks done
@hua7450
hua7450 requested a review from DTrim99 October 13, 2026 20:37
@DTrim99

DTrim99 commented Oct 14, 2026

Copy link
Copy Markdown
Collaborator

PR Review: Add New Hampshire state supplementation for 2026

PR #10156 (author: hua7450, head 1ce21c3e7b, merge-base 2e9eea7e6e). 39 files (+1,721/−4), 3 commits.

Summary

New Hampshire's optional state supplement is the state-administered adult cash assistance grant: Old Age Assistance (OAA), Aid to the Needy Blind (ANB) and Aid to the Permanently and Totally Disabled (APTD). The grant is the standard of need minus countable income, and countable income includes the federal SSI payment. So the PR rightly models the whole grant rather than a flat add-on, including state-only grants to people with no SSI. It doesn't model the medical-assistance side.

  • Parameters (gov.states.nh.dhhs.ssp, 17 files, all dated 2026-01-01):
    • Standards of need. individual_need is broken down by nh_ssp_living_arrangement: independent 1,008, subsidized community residence 1,070, nonsubsidized community residence 1,130, enhanced family care 1,188, residential care 1,188, NONE 0. couple_need (two-person group) is 1,492, and three_person_need is 1,989, derived under He-W 658.03(e).
    • Disregards. Standard disregards of 13 / 20 / 25. Earned income: aged/disabled $20 flat, half the remainder capped at $30, and an $18 minimum employment expense; blind $85 flat plus half the remainder.
    • Other limits. Resource limit $1,500, minimum grant $2, one-third grant reduction, a 5-year qualified-alien wait, and four statuses exempt from the wait.
  • Variables (12 plus the helper module _nh_ssp_couple.py; all Person):
    • nh_ssp_eligible (MONTH, defined_for = StateCode.NH). It requires: aged, blind, or disabled at 18 or over under nh_ssp_disability_eligible; resources within the limit after adding the spouse's, deemed parental and essential-person resources; the immigration test; an arrangement other than NONE; not incarcerated; and SSI take-up.
    • nh_ssp_countable_income. The assistance-group income under He-W 654.02(c)–(e): per-category earned disregards, earnings combined with a nonapplicant spouse, unearned income plus SSI plus income deemed from a blind child's parents, court-ordered support, essential-person income, and the group-size disregard.
    • nh_ssp. The standard minus countable income, rounded to the dollar and zeroed below $2. It then applies the one-third reduction (an input) and splits a couple's grant between applicant spouses.
    • Supporting variables. nh_ssp_living_arrangement (default independent; a medical treatment facility maps to NONE) and nh_ssp_resources_deemed_from_parents (He-W 652.03(i)). Six more are inputs or adds: essential-person flag, income and resources; employment expenses; other deductions; grant reduction.
  • Aggregates and registry. household_state_benefits (all four year blocks), spm_unit_benefits, SNAP unearned income, HUD unearned income, and a programs.yaml entry (partial, verified_years: '2026').
  • Tests: 54 YAML cases: 41 in nh_ssp.yaml, 10 in integration.yaml and 3 in nh_ssp_resources_deemed_from_parents.yaml.

Most of the 2026 policy content is right:

  • Amounts. All six individual standards and the $1,492 couple standard match CMS-approved SPA NH-26-0001 (effective 1/1/2026), Section D. The derived three-person standard of $1,989 checks: it is the published 2025 standard of $1,934 plus the SSI couple and essential-person COLA increases (+41, +14).
  • Administration. The SPA checks "c. Solely by the state", so no SSA rounding or federal minimum applies.
  • Formula. The grant formula, rounding and $2 minimum follow He-W 670.03. The disregards and employment expenses follow He-W 654.15, 654.16 and 654.18, and the group-size rules follow He-W 658.03 and 654.02. Prior rule versions show the $13 / $20 / $25 disregards, the $18 minimum and the $1,500 limit in force throughout 2026.
  • Tests and CI. All 54 cases pass at the head and check by hand. CI is green, and the branch merges cleanly with main.

One critical item:

  • The immigration test contradicts 8 U.S.C. 1622(b)(2). It shuts out lawful permanent residents with 40 qualifying quarters during the 5-year wait. Federal law makes them eligible for any state public benefit.

Three should-fix items:

  1. The axiom: needed line isn't valid for a staff PR. This is the same item as in the sibling reviews.
  2. Four parameter descriptions are off the house template.
  3. Three new eligibility branches have no test: the medical-facility mapping, incarceration and a non-qualified status.

Critical (must fix)

1. Lawful permanent residents with 40 qualifying quarters are kept out during the 5-year wait, which federal law forbids for a state public benefit.

  • Where:
    • policyengine_us/variables/gov/states/nh/dhhs/ssp/nh_ssp_eligible.py:46-60. The comment reads: "AAM 305.13 applies the wait to permanent residents regardless of work history, so SSI's 40-quarter rule does not apply." The code allows only citizen | exempt | waited.
    • tests/.../nh/dhhs/ssp/nh_ssp.yaml:624-636 (Case 38) pins a permanent resident with "Default 40 qualifying quarters" and 2 years since entry as nh_ssp_eligible: false.
  • The federal rule. 8 U.S.C. 1622:
    • (a) lets a State "determine the eligibility for any State public benefits of an alien who is a qualified alien", but only "except as provided in subsection (b)".
    • (b): "Qualified aliens under this subsection shall be eligible for any State public benefits." (b)(2) covers "An alien who— (A) is lawfully admitted to the United States for permanent residence ...; and (B)(i) has worked 40 qualifying quarters of coverage ... or can be credited with such qualifying quarters as provided under section 1645 of this title, and (ii) ... did not receive any Federal means-tested public benefit ... during any such period."
    • The subsection imposes no waiting period.
  • It is a state public benefit.
    • 8 U.S.C. 1621(c)(1)(B) defines one as "any retirement, welfare, health, disability ... or any other similar benefit for which payments or assistance are provided to an individual ... by an agency of a State ... or by appropriated funds of a State".
    • The SPA (p. 13) shows the supplement is administered "Solely by the state" and paid "in cash on a regular basis".
  • The state rule doesn't settle it. He-W 616.02(a) imposes the 5-year wait on qualified aliens entering on or after August 22, 1996. It is silent on both the refugee and the 40-quarter exceptions, yet the PR already takes the refugee exception (1622(b)(1)) from the manual.
    • The DHHS manual pages (AAM 305.11 and 305.13) returned HTTP 403 from here, so I couldn't read the passage the code comment relies on.
    • Whatever the manual says, the federal statute controls who must be eligible for a state-funded benefit.
  • Probe at the head (2026-01). A permanent resident aged 70, 2 years since entry, with ssi_qualifying_quarters_earnings: 40, gets SSI 994, nh_ssp_eligible false and nh_ssp 0.
    • Under 1622(b)(2) the person is eligible, so nh_ssp is 1,008 − (994 − 13) = 27 with the model's SSI.
    • The federal SSI side is outside this PR.
  • Fix:
    • Add a 40-quarter exception for permanent residents. Follow the SNAP waiting-period pattern, using an explicit credited-quarters input that defaults to 0. snap_alien_qualifying_quarters documents itself as "the same legal count" under 8 U.S.C. 1645, so it could be reused, or add an NH input. Don't reuse ssi_qualifying_quarters_earnings, which defaults to 40 and would exempt every permanent resident.
    • Rewrite the code comment, and cite 8 U.S.C. 1622(b) in immigration/exempt_statuses.yaml and nh_ssp_eligible.py.
    • Keep Case 38 (with no quarters supplied it stays 0) but correct its comment. Add a case with 40 quarters supplied and 2 years since entry, expecting nh_ssp_eligible: true and nh_ssp: 27.

Should address

1. axiom: needed isn't valid here, and this PR adds a program.

  • Where: the last line of the PR body, axiom: needed.
  • The rule. main's CLAUDE.md, "Axiom Parity (required for policy changes)", requires one of encoded-correct, encoded, queued or n/a: <reason>.
    • needed is reserved for external contributors who can't complete the Axiom work, and the author is PolicyEngine staff.
    • CONTRIBUTING.md#axiom-parity covers "a new program", and none of the n/a grounds applies.
  • Nothing to point to yet.
    • On rulespec-us main, us-nh/ holds only policies/cms/ (CHIP and Medicaid levels), policies/income_tax/ and regulations/he-w-700/ (He-W 704, 709, 722 and 742.02, all SNAP). There is no He-W 600 module.
    • Issue searches for "New Hampshire supplement", "New Hampshire SSP", "He-W 654", "He-W 658", "He-W 670", "Old Age Assistance", "APTD", "RSA 167", "NH-26-0001" and "New Hampshire state supplementation" find nothing relevant.
  • Precedent.
  • Fix: file a dispatch-ready pe-parity issue on the Add AMT parameters for 2020-2023 #1467 / DC CDCC #1708 model, then add a line such as axiom: He-W 658.03; He-W 670.03; SPA NH-26-0001 TheAxiomFoundation/rulespec-us#NNNN queued. The issue needs:
    • Module paths, following the existing us-nh/regulations/he-w-700/He-W 704/04.yaml layout:
      • us-nh/regulations/he-w-600/He-W 654/ for 02, 15, 16, 18 and 20
      • us-nh/regulations/he-w-600/He-W 656/06.yaml, He-W 658/03.yaml, He-W 670/03.yaml, He-W 616/02.yaml and He-W 652/03.yaml
      • us-nh/policies/cms/spa-nh-26-0001/optional-state-supplement-income-standards.yaml for the six standards and $1,492
      • us-nh/statutes/167/167-6.yaml for the categorical tests
    • Corpus citations, plus the blocker if a source isn't in the corpus yet.
    • Verbatim law: the passages quoted under Verified correct.
    • Required outputs (Person, monthly):
      • The Money parameters.
      • A Judgment for eligibility: aged 65, blind, or disabled aged 18–64 with the 48-month duration; resources ≤ $1,500; qualified-alien rules including 8 U.S.C. 1622(b); not in a facility excluded from independent living.
      • A Money output: the standard of need for the arrangement and group size, minus net income under He-W 654.02, rounded half up, zero below $2, and reduced by one-third under He-W 670.03(c).
    • Companion tests from the same sources:
      • SSI-only aged individual living independently: 1,008 − (994 − 13) = 27.
      • Residential care: 1,188 − 981 = 207.
      • Applicant couple: 1,492 − (1,491 − 20) = 21.
      • Individual with a nonapplicant spouse and no other income: 1,492 − (994 − 20) = 518.
      • A $1 grant: 0 (670.03(a)(4)).
      • The one-third reduction: 27 becomes 18.
      • Resources of $1,501: 0 (656.06(b)).

2. Four parameter descriptions are off the house template.

  • Where (line 1 of each file under parameters/gov/states/nh/dhhs/ssp/):
    • disabled_minimum_age.yaml: "New Hampshire requires disabled applicants to have reached this age for adult category cash assistance."
    • individual_need.yaml: "New Hampshire sets these monthly adult assistance standards of need for an individual in each living arrangement."
    • three_person_disregard.yaml: "New Hampshire deducts this standard amount for an adult, spouse and needy essential person."
    • three_person_need.yaml: two sentences, the second embedding the derivation and dollar figures ("The 2026 value is calculated under He-W 658.03(e): the published 2025 standard of $1,934 plus ...").
  • The template: "one sentence, spell the program out fully (no acronyms), [State] [verb] ... under the [Full Program Name] program."
    • None of the four has the "under the ... program" clause.
    • The other 13 files follow it, for example couple_need.yaml: "... under the adult category financial assistance program."
  • Fix:
    • disabled_minimum_age.yaml: "New Hampshire sets this age as the minimum for disabled applicants under the adult category financial assistance program."
    • individual_need.yaml: "New Hampshire sets this monthly standard of need for a one-person assistance group in each living arrangement under the adult category financial assistance program."
    • three_person_disregard.yaml: "New Hampshire deducts this amount from the income of a three-person assistance group under the adult category financial assistance program."
    • three_person_need.yaml: "New Hampshire sets this standard of need for a three-person independent-living assistance group under the adult category financial assistance program." Move the derivation into a YAML comment above the value.

3. Three new eligibility branches have no test.

  • Where:
    • nh_ssp_living_arrangement.py:28-33. The variable's only formula maps ssi_lives_in_medical_treatment_facility to NONE, but no case sets that input. Case 23 supplies NONE directly.
    • nh_ssp_eligible.py:66, ~person("is_incarcerated", period). No case sets is_incarcerated.
    • nh_ssp_eligible.py:58-60, the is_citizen_or_legal_immigrant gate. Cases 37–39 cover a permanent resident and a refugee, but none covers a non-qualified status.
  • Why it matters. Each is a separate branch of new logic, and removing any of them would pass the suite.
  • Probes at the head (2026-01, age 70):
    • Medical facility with Medicaid paying the majority: arrangement NONE, SSI 30, nh_ssp 0.
    • Incarcerated: nh_ssp 0.
    • UNDOCUMENTED: SSI 0 and nh_ssp 0.
  • Fix: add these three cases to nh_ssp.yaml.

Suggestions

  1. The standards leak back to 2015 and freeze after 2026 (the historical deferral is documented in the PR body).
    • The leak. Every standard is dated only 2026-01-01. Probe at the head, an SSI-only aged single in January:

      Year SSI nh_ssp
      2015 733 288
      2020 783 238
      2024 943 78
      2025 967 54
    • The 2025 law. The DHHS Medicaid Budget Briefing Book, p. 23: "Effective January 1,2025 the Standard of Need for OAA, APTD, ANB is":

      • group size 1: $981; size 2: $1,451; size 3: $1,934
      • residential care facility: $1,161
      • community residence: $1,043 subsidized, $1,103 non-subsidized, $1,161 enhanced family care
      • So the 2025 grant is 981 − 954 = 27, and the model gives double that.
    • The freeze. He-W 658.03(e) recomputes the independent-living standards at every SSI COLA. The 2025→2026 changes equal the COLA exactly: +27 on every individual row, +41 for two people, +55 for three.

      • With the standards frozen, the 2027 probe gives SSI 1,021.83 and nh_ssp 0, because 1,021.83 − 13 = 1,008.83 exceeds the frozen 1,008. 2028 also gives 0.
      • So independent-living grants disappear from January 2027, and care grants shrink by the COLA each year. The PR body doesn't mention this.
    • Fix:

      • Add 2025-01-01 rows from the Briefing Book.
      • Express each standard as a fixed amount above the SSI rate it tracks, so that COLAs flow through. Both years fit:
        • individual independent: the individual FBR + 14
        • care rows: the individual FBR + 76, 136, 194 and 194
        • two people: the individual FBR + the essential-person increment (equivalently the couple FBR + 1)
        • three people: the couple FBR + the essential-person increment
      • That needs an essential-person increment parameter. POMS SI 02001.020 A.11 gives "Essential Person Increment $472.00 $484.00 $498.00" for 2024–2026.
      • The non-standard parameters are fine further back. The $13 / $20 / $25 disregards (#11042, 2016), the $18 minimum (#12015, 2016), the $1,500 limit (#11186, 2016) and the $2 minimum (#13308, 2021) all appear in the prior versions on LII.
  2. The Texas rebate reform's copy of spm_unit_benefits now omits nh_ssp.
    • Where: policyengine_us/reforms/states/tx/rebate/tx_rebate.py:53-127 redefines spm_unit_benefits with a hard-coded list. It already lacks ca_state_supplement, and after this PR it also lacks nh_ssp.
    • Probe at the head: an NH aged SSI-only single in 2026 has spm_unit_benefits of 12,930 at baseline and 12,606 under the reform, a drop of exactly the $324 nh_ssp.
      • 2027 shows no gap only because the frozen standards make nh_ssp 0 that year (Suggestion 1).
    • Fix: insert "nh_ssp", # New Hampshire benefits after "fl_oss", at line 65, as spm_unit_benefits.py does. Add ca_state_supplement while there, consistent with Add Wyoming state supplementation for 2026 #10174.
  3. Households under the federal one-third reduction get the state grant without its own one-third reduction.
    • Probe at the head (2026-01):
      • An SSI recipient flagged as living in another's household, receiving shelter, with others paying all meals, gets SSI 662.67. nh_ssp is then 358, from 1,008 − (662.67 − 13) = 358.33, because the state grant backfills the federal reduction.
      • With nh_ssp_grant_reduction_applies set, it is 239.
    • The state reduction. He-W 670.03(c)(1) reduces the grant by one-third when the recipient "Resides with others in an independent living arrangement" and "a. Does not have any food expenses; b. Does not have any residence expenses ...; and c. Does not receive Supplemental Nutritional Assistance Program (SNAP) benefits".
      • The first two conditions mirror the federal one-third reduction inputs. Only SNAP receipt differs, and the PR keeps the flag explicit to avoid a SNAP cycle.
    • Fix: pin this household in nh_ssp.yaml and document that it gets 358 when on SNAP and 239 when not. Or default the flag from the three federal one-third-reduction inputs combined with an input-level (not computed) SNAP-receipt flag.
  4. APTD is dormant in microsimulation.
    • Why. nh_ssp_disability_eligible requires is_permanently_and_totally_disabled. That variable is an input with no formula and a False default, so unless the dataset sets it, the disabled path pays nothing.
    • Who it covers. Only OAA and ANB are then modeled. APTD covers ages 18–64 under RSA 167:6 VI, which requires federal disability "except that the minimum required duration of the impairment shall be 48 months".
    • The PR documents the explicit-input design.
    • Fix: say this in the programs.yaml notes. Or default the state decision from SSI disability receipt, with the 48-month assumption written down.
  5. Pin the minimum-grant ordering.
    • What the code does. nh_ssp.py:36-42 applies the $2 floor before the one-third reduction. Probe: countable income of 1,006 gives a grant of 2, and with the reduction it pays 1.
    • The rule. He-W 670.03(a)(4) sets "The minimum authorized grant amount shall be $2.00 per month, after rounding", and (c) reduces "The adult category grant pursuant to (a) above". Whether the floor applies again after the reduction isn't stated.
    • Fix: add a comment stating the reading, and add this case.
  6. Collapse the group-size logic.
    • The independent / spouse / essential block is repeated in nh_ssp.py:23-30, nh_ssp_countable_income.py:20-27 and nh_ssp_eligible.py:29-36.
    • He-W 658.03(a) ("a fixed amount based on AG size") and 654.16(b) are both keyed by group size.
    • Fix: add an nh_ssp_assistance_group_size variable (1, 2 or 3). Key one standard-of-need parameter and one disregard parameter by size, replacing single_ / couple_ / three_person_ files.
  7. Optional boundary cases and wiring assertion.
    • Boundary cases:
      • a grant of exactly $2 (paid)
      • a remainder of $0.49 (rounds down)
      • APTD at exactly 18
      • a permanent resident at exactly 5 years with 0 quarters. Probe: SSI 0, nh_ssp 1,008.
      • a mixed ANB/OAA applicant couple (654.15(d)–(e))
      • an ANB applicant with a nonapplicant spouse (654.02(e))
    • Wiring. Integration Case 6 asserts household_state_benefits, SNAP and HUD unearned income but not spm_unit_benefits (12,930 at the head, including the $324).
  8. Polish.
    • Blank lines. The PR adds a stray blank line before metadata: in household_state_benefits.yaml (line 412) and in hud/annual_income/sources/unearned.yaml (line 33). Neither relates to New Hampshire.
    • Case count. The PR body says "46 source-based YAML cases". The PR has 54 (41 + 10 + 3).
    • Changelog. changelog.d/nh-ssp-2026.added.md reads as two merged entries, with the essential-person sentence first. One sentence, such as "Add New Hampshire's adult category state supplement (OAA, ANB and APTD) for 2026.", is enough.
    • Reference subsections:
      • earned/minimum_employment_expenses.yaml should cite He-W 654.18(b).
      • minimum_payment.yaml should cite 670.03(a)(4).
      • earned/disregard_fraction.yaml should cite 654.15(b) and (f)(2).
      • three_person_need.yaml cites SSA's SSI.html for the essential-person increase. That page returned 403 here, so add POMS SI 02001.020, which shows $484 and $498.
    • Rule cross-reference. He-W 652.03(j) points to "He-W 656.06(c)", which doesn't exist. The PR rightly uses 656.06(b) ($1,500), and a one-line comment would save the next reader the search.
    • defined_for. nh_ssp_disability_eligible, nh_ssp_employment_expenses and nh_ssp_living_arrangement have no defined_for = StateCode.NH. They are harmless because they aren't list members, but gating them is consistent with the other NH variables.

Verified correct

  • Statute. RSA 167:6:
    • I: "a person shall be eligible for old age assistance who is 65 years of age and a resident of this state".
    • IV: aid to the needy blind for one "whose vision with correcting glasses is so defective as to prevent the performance of ordinary activities for which eyesight is essential". There is no age limit, so a blind child qualifies (Case 19).
    • VI: APTD for one "between the ages of 18 and 64 years of age inclusive", federally disabled "except that the minimum required duration of the impairment shall be 48 months". Eligibility is "conditioned upon the person filing an application ... for any federal cash benefits". That supports the 18 minimum (Case 20), the P&T proxy (Cases 17–18) and the SSI take-up gate (Case 22).
  • Standards and administration. SPA NH-26-0001, approved April 13, 2026, "with an effective date(s) of January 01, 2026" (p. 2):
    • Administration. C.1 checks "c. Solely by the state" (p. 13). C.2: payments are "Equal to the difference between the individual's countable income and the income standard used to determine eligibility for supplement" (p. 13).
    • The D.1 table (p. 14): "Subsidized Community Residence Individual $1070.00", "Non-Subsidized Community Residence Individual $1130.00", "Enhanced Family Care Individual $1188.00", "Independent Living Individual $1008.00 ... Couple $1492.00". Page 15 adds "Residential Care Individual $1188.00".
    • Section E (p. 16): the care-category couple amounts are "entered as the individual amount doubled; however, there is technically no value for these as we always would consider individuals in these living arrangements as a household of 1". That supports one-person groups in care (Case 28, integration Case 4).
  • The three-person standard.
    • He-W 658.03(e) recomputes the standards "When SSI benefits change due to a cost of living increase".
    • 2025 was $1,934 (Briefing Book p. 23), which equals the 2025 couple FBR plus the essential-person increment (1,450 + 484).
    • POMS SI 02001.020 A.11 gives the couple FBR as $1,450 and $1,491 and the essential-person increment as $484 and $498 for 2025 and 2026. So 1,934 + 41 + 14 = 1,989, as the PR derives.
    • The SPA's $1,492 equals 994 + 498.
  • Group size. He-W 658.03(b): "Adult category individuals shall be treated as an AG size of one ... except when an adult category individual lives with: (1) A spouse or a needy essential person ... in an independent living arrangement, eligibility shall be determined as an AG of 2; or (2) A spouse and a needy essential person ..., ... an AG of 3."
    • That matches nh_ssp_spouse (independent only), and integration Cases 2, 7 and 8.
    • He-W 601.05(t) defines "Nonapplicant spouse" as one "Not applying for nor receiving OAA, ANB, or APTD", which supports including a nonapplicant spouse's needs (integration Case 2: 518).
  • Disregards.
    • He-W 654.16(b): "$13.00" for one; "$20.00 for an individual and applicant or nonapplicant spouse, or an individual and a needy essential person"; "$25.00 for an individual and applicant or nonapplicant spouse and a needy essential person".
    • He-W 654.15(b), ANB: "the first $85.00 of each individual's monthly gross earned income plus one half of the remaining amount".
    • He-W 654.15(f), APTD/OAA: "The first $20.00 ... Plus one half of the remaining amount up to $30; For a sum total ... not to exceed $50; and Less an employment expense disregard".
    • He-W 654.18(b): "a minimum flat rate of $18 per month, or actual verified expenses if higher than $18 per month". (c)(1) lists "Social security taxes", so the FICA adds with the $18 floor is right (Case 14, integration Case 5).
    • 2026 coverage. 654.18 was replaced effective 7-17-26, but the prior text (#12015, effective 10/25/2016, LII) also says $18. The prior 654.16 (#11042, 2016) also says $13 / $20 / $25. So the 2026-01-01 values hold for all of 2026.
  • Income computation. He-W 654.02:
    • (c) per-person disregards summed for applicant spouses (integration Case 5).
    • (d) and (e): "The countable gross earned incomes of the applicant and nonapplicant spouse shall be combined", then one category disregard (integration Case 9).
    • Unearned income of "all AG members" is added, then the standard disregard and He-W 654.20 deductions are subtracted.
    • 654.20(a)(1) deducts "any court-ordered payments ... Child support; Alimony" (Case 15).
  • Resources. He-W 656.06(b): "The resource limit for adult category financial assistance shall be $1,500" (Cases 6–7, integration Case 3).
  • Grant. He-W 670.03(a):
    • "the difference between the 2 amounts shall equal the grant"
    • rounding: "$0.49 or less ... rounded down ... $0.50 or more ... rounded up"
    • "The minimum authorized grant amount shall be $2.00 per month, after rounding" (Cases 10–12)
    • (c)'s one-third reduction is a state determination left as an input; the reasons are in Suggestion 3.
  • Blind children. He-W 652.03:
    • (f)–(g) deem parental income using the 20 CFR 416.1165 allocations, which matches ssi_unearned_income_deemed_from_ineligible_parent (integration Case 10: 890.10).
    • (i): the "parent or parents countable resources that exceed the resource limits described in 20 CFR 416.1205(c)". There is no division between siblings, so each child gets the full excess (Case 36).
    • (q): "Parental deeming ... shall end as of the month following the month in which the child turns 18", which the PR leaves to an override input.
    • He-W 601.06(b): "Parent includes the biological, adoptive, or stepparent" (deemed-resources Case 3).
  • Qualified aliens. He-W 616.02(a)(2): "a period of 5 years has elapsed since the date of the alien's entry". The refugee, asylee, Cuban/Haitian entrant and withholding exemptions match 8 U.S.C. 1622(b)(1). The 40-quarter gap is Critical 1.
  • Kept out of SSI income. 20 CFR 416.1124(c)(2) excludes "Assistance based on need which is wholly funded by a State". nh_ssp isn't in the SSI income sources, so there is no circularity. It holds only state money, so summing it with ssi in the aggregates doesn't double-count.
  • Counted for SNAP and HUD. 7 CFR 273.9(b)(2)(i) counts "other assistance programs based on need". The SNAP reference consolidation and the HUD addition match the batch.
  • Code:
    • Vectorized throughout (where, max_, min_, np.isin, index lookups).
    • No hard-coded policy values; the + 0.5 is the rounding mechanic.
    • Periods are correct:
      • YEAR flows (ssi_earned_income, ssi_unearned_income, FICA, support payments) use period, so they are divided by 12.
      • YEAR stocks and flags (age, blindness, resources, immigration, take-up) use period.this_year.
      • Resource stocks stay undivided (deemed-resources Cases 1–2).
    • List guard. nh_ssp → nh_ssp_eligible → StateCode.NH, so test_members_are_state_gated passes. It is in all four household_state_benefits blocks (2023–2026).
    • Callers. nh_ssp is referenced only in the lists this PR edits.
  • Hand checks: all 54 expectations. The 2026 FBR is $994 for an individual and $1,491 for a couple.
    • Cases 1–5: 1,008 / 1,070 / 1,130 / 1,188 / 1,188 − 981 = 27 / 89 / 149 / 207 / 207.
    • Case 8: $20 of Social Security is fully excluded federally, so SSI is 994. NH: 20 + 994 − 13 = 1,001, so 7.
    • Case 9: $1,018 of Social Security means no SSI. NH: 1,018 − 13 = 1,005, so 3.
    • Case 12: SSI = 994 − (100 − 85) ÷ 2 = 986.50. NH: 100 − 20 − 30 − 18 = 32, so 32 + 986.50 − 13 = 1,005.50, and 2.50 rounds to 3.
    • Case 13 (blind): (100 − 85) × 0.5 = 7.50, so 7.50 + 986.50 − 13 = 981, giving 27.
    • Case 14: SSI 879.42; FICA 24.03; 314.17 − 20 − 30 − 24.03 = 240.13; 240.13 + 879.42 − 13 = 1,106.55; 81.45 rounds to 81.
    • Case 15: 994 − 13 − 50 = 931, giving 77.
    • Case 16: 27 × 2/3 = 18.
    • Cases 24, 25 and 30: 1,492 − 974 = 518; −100 gives 418; with $518 of essential-person income, 0.
    • Cases 26–27: 1,501 gives 0; 1,500 gives 518.
    • Cases 33–34: 3,500 − 2,000 = 1,500, so 1,500 is within the limit and the child gets 27; 1,500.01 gives 0.
    • Case 36: (5,500 − 3,000) = 2,500 per child, over 1,500, so all 0.
    • Case 37: no SSI (0 quarters), past the 5-year wait, so 1,008.
    • Case 41: 21 × 2/3 = 14, so 7 each.
    • Integration:
      • Case 1: 21 ÷ 2 = 10.50 each.
      • Case 5: SSI 1,491 − (200 − 85) ÷ 2 = 1,433.50, so 716.75 each. NH: 32 + 32 + 1,433.50 − 20 = 1,477.50, and 14.50 rounds to 15, giving 7.50 each.
      • Case 6: 12 × 27 = 324; SNAP and HUD unearned income are 11,928 + 324 = 12,252.
      • Case 7: 1,989 − 1,466 = 523, so 261.50 each.
      • Case 8: 1,989 − 969 = 1,020.
      • Case 9: SSI 902.57. NH: 1,261.87 − 50 − 96.53 = 1,115.33, plus 902.57, minus 20 = 1,997.90, which is over 1,492, so 0.
      • Case 10: 890.10 + 123.90 − 13 = 1,001, giving 7.
  • Changelog: changelog.d/nh-ssp-2026.added.md is top-level and typed added.
  • Registry:
    • The programs.yaml entry sits under ssi_state_supplement.state_implementations, after WA, with the batch's fields.
    • partial fits the unmodeled conditional resources, sanctions and grandfathered cases.
    • parameter_prefix resolves.

Batch checks

  1. Axiom line: SHOULD (Should 1). axiom: needed is invalid for a staff PR. rulespec-us has no He-W 600 module and no New Hampshire supplement issue, so a dispatch-ready pe-parity issue and a queued line are needed.
  2. Parameter descriptions: SHOULD (Should 2). Four of 17 files are off-template: disabled_minimum_age, individual_need, three_person_disregard and three_person_need. The other 13 have the "under the adult category financial assistance program" clause.
  3. Backdating: SUGGESTION (Suggestion 1).
    • The 2026 standards leak back: the grant is 54 in 2025 against 27 under the $981 standard, and 288 in 2015.
    • Frozen standards also zero out independent-living grants from 2027 (He-W 658.03(e) moves them with each COLA).
    • The PR claims only 2026 and documents the historical deferral. The disregard, expense, resource and minimum amounts match the prior rule versions.
  4. tx_rebate.py copy: SUGGESTION (Suggestion 2). It omits nh_ssp, cutting spm_unit_benefits by $324 in 2026. ca_state_supplement is still missing too.
  5. Aggregate wiring: pass. spm_unit_benefits, all four household_state_benefits blocks, HUD unearned, SNAP unearned and programs.yaml are present. nh_ssp holds only state amounts, so there is no double count with ssi.
  6. Income attribution: pass, with items.
    • Pinned: couples as one group with the grant split; separate per-person disregards for applicant spouses; earnings combined with a nonapplicant spouse; the nonapplicant spouse's needs counted; essential persons (AG 2 and 3); care residents as one-person groups; blind-child parental income and resource deeming; the parent/adult-child default unit (Case 40).
    • Unpinned: households under the federal one-third reduction (Suggestion 3) and the $2 floor before the reduction (Suggestion 5).
    • The immigration test contradicts 8 U.S.C. 1622(b)(2) (Critical 1).
  7. Sibling conflicts (branch note): trial merges with Add Wyoming state supplementation for 2026 #10174, Add New York state supplementation for 2026 #10158 and Add Vermont state supplementation for 2026 #10171 each conflict in HUD unearned, programs.yaml and spm_unit_benefits.py. This PR doesn't use the shared _ssi_state_supplement helper, which is right because New Hampshire is state-administered.
  8. CI: all 26 checks pass on head 1ce21c3e7b, with no failing job. The Rest job ran 1h26m51s, close to the 90-minute cap, as on the siblings.
  9. State law first: done.
    • Read: RSA 167:6.
    • He-W rules: 601.05–601.06, 616.02, 652.03, 654.02, 654.15, 654.16, 654.18, 654.20, 656.06, 658.03 and 670.03, current text plus the LII prior versions of 654.16, 654.18, 656.06 and 670.03.
    • Other sources: SPA NH-26-0001 (pp. 2, 13–16), the DHHS Budget Briefing Book p. 23, POMS SI 02001.020, and 8 U.S.C. 1621 and 1622. The AAM pages returned 403.
    • Every 2026 amount by arrangement and group size, the state administration and the January 1, 2026 effective date check out. All 54 expectations check by hand.

Axiom line assessment

Invalid (Should 1).

CI status

All 26 checks pass (gh pr checks 10156). Three "skipping" entries belong to the superseded run 38359240026.

  • The run. Run 38367900837 (pull_request, 2026-10-13 08:14 UTC) on head 1ce21c3e7b, conclusion success.
  • Partner tests. The PR touches none, and the Household API Partners job passes.
  • Local run. The three new test files at the head with policyengine-core 3.33.3: 54 passed. (The head requires core ≥ 3.32.8; core 3.26 can't import it.)

Branch status

Verdict: REQUEST_CHANGES

@DTrim99 DTrim99 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Modeling New Hampshire's full state-administered OAA/ANB/APTD grant is right for NH, all standards match SPA NH-26-0001, the He-W rules are encoded correctly, and all 54 cases check by hand. One critical (details in the comment above): nh_ssp_eligible refuses permanent residents with 40 qualifying quarters during the five-year wait, but 8 U.S.C. 1622(b)(2) makes them eligible for any state public benefit (probe: SSI 994, nh_ssp 0, should be 27). Add the exception with a 0-default quarters input and a test. Three should items: the axiom line ('needed' isn't valid for staff), four off-template descriptions, and untested branches (medical facility, incarceration, non-qualified status).

hua7450 and others added 3 commits October 14, 2026 15:35
…tandards and tests

- Follow 8 U.S.C. 1622(b)(2): a permanent resident credited with 40 qualifying
  quarters is exempt from the 5-year wait; document the conflict with AAM 305.13.
- Compute the standards of need as the SSI maximum plus the minimum payment level
  less the standard disregard (He-W 658.03(e), 648.04(b)), so they follow each
  SSI COLA; correct the three-person standard to the published $1,976.
- Add nh_ssp_assistance_group_size and key the standard disregard by group size.
- Add cases for untested branches, the one-third reduction, boundaries, mixed
  and nonapplicant-spouse couples, and the 2027 COLA pass-through; fix
  descriptions, references, defined_for gates and the changelog.

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

hua7450 commented Oct 14, 2026

Copy link
Copy Markdown
Collaborator Author

Thanks, David. The fixes are in 3972ca1 and a71c7cd, with a merge of main (6a258eb) between them.

Critical 1 (permanent residents with 40 quarters): fixed, and the model now follows 8 U.S.C. 1622(b)(2).

  • AAM 305.13, current page, says the opposite. It keeps "lawfully admitted permanent residents regardless of work history" out for 5 years, and its reference list omits 1622. That conflict is written up as a NOTE in nh_ssp_eligible.py.
  • The exception reads snap_alien_qualifying_quarters (default 0) against a new 40-quarter parameter citing 1622(b)(2) and 1645. exempt_statuses.yaml now also cites 1622(b)(1).
  • Case 38 keeps $0, because no quarters are supplied. New Case 51 has 40 quarters and is 2 years past entry, and pays $1,008, not $27. 8 U.S.C. 1613(a) bars federal SSI for those 5 years, with no 40-quarter exception, so federal SSI is $0. The model's SSI doesn't apply that bar (the SNAP waiting-period variable already documents this), so the case sets ssi: 0.

Should 1 (Axiom line): filed TheAxiomFoundation/rulespec-us#1769 (pe-parity). It has:

  • the module paths and corpus citations;
  • verbatim RSA 167:6, He-W 600, SPA NH-26-0001, SR 26-01, AAM 305.13 and 8 U.S.C. 1613, 1621 and 1622;
  • the required outputs;
  • companion tests mapped to the cases.

The axiom line now points to it.

Should 2 (descriptions):

  • disabled_minimum_age.yaml and three_person_need.yaml now follow the template, and the derivation in three_person_need.yaml is a comment.
  • The other two files are gone (see Suggestion 6).

Should 3 (untested branches): new Cases 42–44 cover:

  • a Medicaid-majority medical facility: arrangement NONE, SSI 30, nh_ssp 0;
  • incarceration: 0;
  • UNDOCUMENTED: SSI 0, nh_ssp 0.

Suggestion 1 (frozen standards): fixed for future years; history stays out of scope.

  • The standards are now the SSI maximum for the group plus New Hampshire's minimum payment level, less the standard disregard. That follows He-W 658.03(e) for independent living and He-W 648.04(b) for the care arrangements. They now move with every COLA.
  • The minimum payment levels are $27, $21 and $89, $149, $207, $207. They are SSA's published state supplementation amounts in the January 1998 and 2011 State Assistance Programs tables, and they match every NH January release from 1998 (SR 97-44) to 2026. So they are dated 1998.
  • Cases 52–54 show the 2027 pass-through: $27, $207 and $21, whatever the 2027 rate is.
  • The two-person standard is the couple rate + $1, not the individual rate + the essential person increment. That formula misses 2024's published $1,416 by $1.
  • One correction from this: the three-person standard is NH's published $1,976 (SR 26-01; AAM 601 Table A), not $1,989.
    • The Briefing Book's $1,934 is the SSI maximum for that group; NH's 2025 standard was $1,922.
    • It can't be derived from SSA amounts, because SR 26-01 gives that group's SSI maximum as $1,988 against SSA's $1,989. It stays a dated value.
    • Integration Cases 7 and 8 now expect $255 each and $1,007.

Suggestion 2 (Texas rebate copy): filed #10226 to keep one spm_unit_benefits list that reforms append to. That also fixes California and the Tlaib copies; this PR leaves tx_rebate.py unchanged.

Suggestion 3 (federal one-third reduction): Cases 45 and 46 pin the household:

  • 358 without the state flag, and 239 with nh_ssp_grant_reduction_applies;
  • the case comment says why the flag stays an input: He-W 670.03(c) also requires no SNAP receipt.

Suggestion 4 (APTD in microsimulation): a NOTE in nh_ssp_disability_eligible and the PR body say APTD pays only where the dataset sets is_permanently_and_totally_disabled. The programs.yaml note stays short.

Suggestion 5 (minimum grant ordering): nh_ssp.py now states the reading: the $2 minimum applies before the one-third reduction, so a reduced grant can be $1. I didn't add a case, because it needs an income tuned to exactly $1,006.

Suggestion 6 (group size):

  • added nh_ssp_assistance_group_size (6 cases);
  • one standard_disregard parameter keyed by group size replaces the three disregard files;
  • the three variables read the group size instead of repeating the block.

Suggestion 7 (boundaries and wiring):

  • Added:
    • APTD at exactly 18 (27);
    • a permanent resident at exactly 5 years (1,008);
    • a blind and aged applicant couple with earnings (10.50 each);
    • a blind applicant whose nonapplicant spouse works (21). Both earnings cases use the New Hampshire OEWS cashier median.
  • Integration Case 6: now asserts spm_unit_benefits of 12,930.
  • Skipped: the exact-$2 and $0.49 cases, because they need tuned incomes.

Suggestion 8 (polish):

  • Done:
    • the changelog is one sentence;
    • references cite 654.18(b), 670.03(a)(4), 654.15(b) and (f)(2), and POMS SI 02001.020;
    • a comment notes He-W 652.03(j)'s reference to a nonexistent 656.06(c);
    • defined_for = StateCode.NH on the three variables;
    • the PR body gives the case count.
  • I kept the blank lines before metadata:; they come from our formatting pass and are harmless.

On the merged head, these pass locally: the 73 New Hampshire cases, 243 federal SSI cases, 183 SNAP immigration cases, and the aggregate list integrity and program registry tests (677 passed, 10 skipped).

@hua7450
hua7450 requested a review from DTrim99 October 14, 2026 20:01
@DTrim99

DTrim99 commented Oct 15, 2026

Copy link
Copy Markdown
Collaborator

PR Review (round 2): Add New Hampshire state supplementation for 2026

PR #10156 (author: hua7450). This round reviews head a71c7cde73; round 1 reviewed 1ce21c3e7b. Three commits landed in between:

  • the review-response commit 3972ca11f9 (28 files, +519/−124);
  • a merge of main at 8ae01aa3cb (6a258eb18d), whose tree is identical to an automatic merge, so it has no hand edits;
  • a71c7cde73, which adds the January 1998 release to the minimum payment level citations (comments and references only).

Summary

Ziming fixed the round-1 critical and all three should items, and fixed or documented most suggestions. The 2026 amounts, including the corrected $1,976 three-person standard, check against SR 26-01 and AAM 601 Table A, and all 73 cases pass. The COLA-linked standards follow He-W 658.03(e) and 648.04(b).

The group-size refactor (round-1 Suggestion 6) introduced a new critical. People outside New Hampshire now get group size 0, and standard_disregard[0] doesn't exist, so any simulation that mixes an eligible New Hampshire resident with anyone from another state crashes. That is the cause of all nine CI failures, and it breaks national microsimulation.

Separately, round 1 missed 8 U.S.C. 1624, which may support AAM 305.13's rule for permanent residents. That is now a documentation suggestion, not a request to change behavior.

Round-1 findings status

Finding Status Evidence
Critical 1: permanent residents with 40 qualifying quarters were kept out during the 5-year wait, against 8 U.S.C. 1622(b)(2) Fixed (as requested; see Suggestion 1 for a statute round 1 missed) Code. nh_ssp_eligible.py:61-71 adds credited_permanent_resident: a LEGAL_PERMANENT_RESIDENT with snap_alien_qualifying_quarters ≥ the new immigration/permanent_resident_qualifying_quarters.yaml (40; cites 1622(b)(2) and 1645). That input is YEAR, defaults to 0 and nets out post-1996 quarters with federal means-tested benefits, which is the 1622(b)(2)(B)(ii) condition and the input round 1 suggested. exempt_statuses.yaml now cites 1622(b)(1). Documentation. The NOTE at lines 49-56 records the conflict with AAM 305.13. The quoted text ("lawfully admitted permanent residents regardless of work history") matches the AAM page, which cites "8 USC 1611-1613" and not 1622. Tests. Case 38's comment is corrected. New Case 51 (40 quarters, 2 years since entry) expects eligible and $1,008, not round 1's $27, and that is right: 8 U.S.C. 1613(a) bars federal SSI for 5 years whatever the quarters (POMS SI 00502.100 B: "cannot be eligible based on having 40 QQs for a 5-year period"), so SSI is 0. Round 1's $27 assumed the model's SSI, which ignores that bar; the case supplies ssi: 0.
Should 1: axiom: needed isn't valid for a staff PR that adds a program Fixed The PR body now reads axiom: He-W 658.03; He-W 648.04; He-W 670.03; SPA NH-26-0001; 8 U.S.C. 1622(b) TheAxiomFoundation/rulespec-us#1769 queued. #1769 is open, labelled pe-parity, dispatch-ready and consistent with the head. See the Axiom line assessment.
Should 2: four parameter descriptions are off-template Fixed disabled_minimum_age.yaml and three_person_need.yaml now use the wording round 1 proposed, and the derivation is a comment. individual_need.yaml and three_person_disregard.yaml are deleted. Their replacements (minimum_payment_level/one_person.yaml, standard_disregard.yaml) and the new two_person.yaml and permanent_resident_qualifying_quarters.yaml all end "under the adult category financial assistance program".
Should 3: three new eligibility branches had no test Fixed Each new case pins its branch, so removing the branch now fails a test: Case 42 (nh_ssp.yaml:707): ssi_lives_in_medical_treatment_facility with Medicaid paying most of the cost gives arrangement NONE, SSI 30, ineligible, 0. Case 43 (:722): is_incarcerated gives 0. Case 44 (:733): UNDOCUMENTED gives SSI 0, ineligible, 0. years_since_us_entry defaults to 5, so Case 44 pins the is_citizen_or_legal_immigrant gate, not the wait.
Suggestion 1: standards leaked back to 2015 and froze after 2026 Mostly fixed The one- and two-person and care standards are now the SSI maximum plus a minimum payment level less the standard disregard (nh_ssp.py:27-39), dated 1998. They reproduce the 2025 Budget Briefing Book standards (981, 1,451, 1,043, 1,103, 1,161, 1,161), so the 2025 grant to an SSI-only single is 27, not 54. They move with each COLA (Cases 52-54, 2027). Still the case: the three-person standard stays a dated 1,976 (corrected from 1,989), so it reads 1,976 in 2025 and freezes from 2027. See Suggestion 2.
Suggestion 2: the spm_unit_benefits copy in tx_rebate.py omits nh_ssp Declined with a reason (deferred to #10226) Reason: Ziming filed #10226 (open) to keep one shared list that reforms append to; it lists #10156 among the PRs that rely on it. Still the case: at the head, tx_rebate.py still goes from "fl_oss" (line 65) to "ks_sspp" (line 66), so an NH recipient loses the $324 a year of SPM resources under the Texas-only reform until #10226 lands. This matches the sibling SSP PRs.
Suggestion 3: the federal one-third-reduction household gets the state grant without the state reduction Fixed Case 45 (:745) pins 358 without the flag, and Case 46 (:762) pins 239 with nh_ssp_grant_reduction_applies. The comment says the flag stays an input because He-W 670.03(c)(1)c. also requires no SNAP receipt.
Suggestion 4: APTD is dormant in microsimulation Fixed (documented) A NOTE at nh_ssp_disability_eligible.py:17-20 and the PR body say APTD pays only where the dataset sets is_permanently_and_totally_disabled. The programs.yaml note is unchanged, which is acceptable.
Suggestion 5: pin the minimum-grant ordering Comment added; case declined nh_ssp.py:44-46 states the reading: the $2 floor applies before the one-third reduction, so a reduced $2 grant pays $1. Ziming skipped the case because "it needs an income tuned to exactly $1,006". That reason doesn't hold: Case 10 already sets nh_ssp_countable_income directly. See Suggestion 3.
Suggestion 6: collapse the group-size logic Fixed, but it causes new Critical 1 nh_ssp_assistance_group_size (6 cases) and a size-keyed standard_disregard replace the repeated blocks and three files. essential = size > 1 + couple reproduces round 1's flag, and all 73 cases pass. Because the new variable is NH-gated with an integer default of 0, though, standard_disregard[size] fails for everyone outside New Hampshire.
Suggestion 7: optional boundary cases and a wiring assertion Mostly fixed Added: Case 47 (APTD at exactly 18, 27), Case 48 (permanent resident at exactly 5 years, 1,008), Case 49 (mixed ANB/OAA applicant couple, 10.50 each), Case 50 (ANB applicant with a working nonapplicant spouse, 21), and spm_unit_benefits: 12_930 in integration Case 6 (integration.yaml:165). Skipped: the exact-$2 and $0.49 cases, for the same "tuned incomes" reason as Suggestion 5 (see Suggestion 3).
Suggestion 8: polish Fixed except the blank lines (declined with a reason) Done: a one-sentence changelog; subsection citations (654.18(b), 670.03(a)(4), 654.15(b) and (f)(2)); the He-W 652.03(j) cross-reference comment; defined_for = StateCode.NH on the three variables; the case count (73 = 54 + 10 + 6 + 3). The three_person_need.yaml SSI.html citation is moot now that the file no longer derives from the essential-person increment. Blank lines: the ones before metadata: stay. Ziming calls them a harmless artifact of his formatting pass, and every sibling PR has them, so this is accepted, as in #10174 and #10001.

New findings

Critical (must fix)

1. CI fails: any simulation that mixes an eligible New Hampshire resident with someone from another state raises ParameterNotFoundError.

  • Where:

    • nh_ssp_assistance_group_size.py:9-13: value_type = int and defined_for = StateCode.NH, with no default_value. So everyone outside New Hampshire gets 0.
    • nh_ssp.py:31 and nh_ssp_countable_income.py:68: disregard = p.standard_disregard[size].
    • standard_disregard.yaml has keys 1, 2 and 3 only.
  • Why it fails.

    • policyengine-core runs a variable's formula over the whole population whenever at least one person passes its defined_for. It masks the result afterwards with np.where(mask, array, default_value) in Simulation._calculate, and skips the formula only when nobody passes.
    • So once anyone in the simulation is NH-eligible, nh_ssp evaluates standard_disregard[0] for every non-NH person.
    • Round 1 used scalar single_, couple_ and three_person_disregard parameters and indexed only by living arrangement, whose masked default (INDEPENDENT) is a valid key. The refactor introduced the integer index.
  • Not a missing parameter or a period gap. The missing key is always 0, in every failing year (2024, 2026 and 2028). standard_disregard exists, and its 2026-01-01 values carry back.

  • CI evidence (run 38626899185 on a71c7cde73). Nine tests in three jobs fail with the same error, raised from nh_ssp.py:31: "The parameter 'gov.states.nh.dhhs.ssp.standard_disregard.0' was not found in the -01-01 tax and benefit system".

    • Microsimulation (4):
      • test_future_dated_reform_zero_impact_before_start and test_or_ctc_zero_from_2029 (2028);
      • test_default_dataset_allocates_no_housing_share_to_an_unclassified_unit and test_legacy_enhanced_cps_allocates_no_housing_share_to_an_unclassified_unit (2024).
    • Rest (Python, shard-1 + variables) (4): test_no_formula_writes_into_a_cached_array for all four parameter sets: baseline, crfb_surtax, ut_dependent_exemption and basic_income (2026).
    • Rest (Python + variables) (1): core/test_dependent_elsewhere_head_spouse_swap_invariance.py::test_every_state_with_a_claimed_spouse (2026).
    • The trace goes from household_benefits through SNAP and HUD income to hud_countable_unearned_income, which lists nh_ssp.
  • Reproduced locally at the head (policyengine-core 3.32.29):

    Population (2026-01) Result
    One aged NH SSI recipient alone nh_ssp 27
    One aged Massachusetts resident alone nh_ssp 0
    Both in one simulation nh_ssp, nh_ssp_countable_income, spm_unit_benefits and household_net_income all raise the error; nh_ssp_assistance_group_size is [1, 0]
    A 30-year-old NH resident plus the Massachusetts resident Runs, because nobody is NH-eligible and core skips nh_ssp. This is why every single-household YAML case passes.

    A two-household YAML case (NH and Massachusetts, each person with their own units) fails with the same error.

  • Impact.

    • Every national run breaks: household_net_income, spm_unit_benefits, SNAP and HUD all reach nh_ssp.
    • The test plan's "Synthetic national simulation: 153 households, 204 people, all 50 states and DC" can't have included an eligible New Hampshire resident at this head, since any such population fails.
  • Fix:

    • The variable. Add default_value = 1 to nh_ssp_assistance_group_size, or drop its defined_for; its inputs are all safe outside New Hampshire. I patched each change in locally:

      • the NH + Massachusetts simulation gives nh_ssp [27, 0];
      • the NH unit's spm_unit_benefits is 12,930, matching integration Case 6;
      • 2027 also gives [27, 0].
    • A regression case. Add a two-state case so the New Hampshire YAML suite catches this. Give each person their own units, so the default units don't pair them as spouses:

      - name: Case 55, a New Hampshire resident and a Massachusetts resident in one simulation.
        period: 2026-01
        absolute_error_margin: 0.01
        input:
          people:
            person1: {age: 70}
            person2: {age: 70}
          tax_units: {tax_unit1: {members: [person1]}, tax_unit2: {members: [person2]}}
          spm_units: {spm_unit1: {members: [person1]}, spm_unit2: {members: [person2]}}
          families: {family1: {members: [person1]}, family2: {members: [person2]}}
          marital_units: {marital_unit1: {members: [person1]}, marital_unit2: {members: [person2]}}
          households:
            nh_home: {members: [person1], state_code: NH}
            ma_home: {members: [person2], state_code: MA}
        output:
          nh_ssp: [27, 0]
    • The test plan. Re-run the synthetic national simulation with an eligible New Hampshire resident, and update that line of the test plan.

Should address

None.

Suggestions

1. Round 1 missed 8 U.S.C. 1624, which may support AAM 305.13. Name it in the NOTE and in #1769.

  • The provision. 8 U.S.C. 1624 (IIRIRA §553, enacted after PRWORA's 1622):
    • (a): "Subject to subsection (b) and notwithstanding any other provision of law, a State or political subdivision of a State is authorized to prohibit or otherwise limit or restrict the eligibility of aliens or classes of aliens for programs of general cash public assistance furnished under the law of the State or a political subdivision of a State."
    • (b): only "to the extent that any prohibitions, limitations, or restrictions imposed by a State ... are not more restrictive than the prohibitions, limitations, or restrictions imposed under comparable Federal programs."
  • Why it matters.
    • SSI, the comparable federal program, also bars a 40-quarter permanent resident for 5 years after entry (1613(a); POMS SI 00502.100 B). So AAM 305.13's rule is no more restrictive than SSI.
    • If New Hampshire's adult categories count as "programs of general cash public assistance", 1624 authorizes that rule notwithstanding 1622(b)(2). In that case Case 51's $1,008 is a grant New Hampshire may lawfully withhold.
  • Why it's unsettled.
    • The statute doesn't define the term. "General" may refer to general assistance, which would leave out categorical aid such as OAA, ANB and APTD (which New Hampshire registers as an optional state supplement).
    • I found no court decision or federal guidance applying 1624 to a state supplement.
    • Neither New Hampshire source invokes 1624. AAM 305.13 cites "8 USC 1611-1613", and He-W 616.02's authority note cites only 8 USC 1641(b) among the federal alien provisions.
    • The SPA doesn't settle it either. It defines the Medicaid group for supplement recipients (A.2 points to New Hampshire's 209(b) mandatory group) and says nothing about alien eligibility for the grant.
  • Reach. The question arises only when a user supplies snap_alien_qualifying_quarters of 40 or more for a permanent resident within 5 years of entry. The input defaults to 0, so microsimulation is unaffected.
  • Fix:
    • Either reading is acceptable here, and I'm not asking for a change of behavior. Round 1 treated 1622(b)(2) as settling the question, and with 1624 in play it doesn't.
    • The NOTE says "The model follows the federal statute", which reads as if federal law points one way. Add a sentence there and to California CARE Eligibility #1769's "Interpretations and gaps", for example: "AAM 305.13 may rest on 8 U.S.C. 1624, which lets a State restrict aliens' eligibility for general cash public assistance if no more restrictive than comparable Federal programs; SSI bars these permanent residents for 5 years (1613(a)). Whether the adult categories are general cash public assistance is unsettled."

2. The three-person standard could follow the COLA too.

  • Where: three_person_need.yaml:3-8 holds 1,976 from 2026-01-01. Its NOTE says it "needs a new value each January".
  • The rule covers it. He-W 658.03(e)(1) applies the method to "the SSI maximum benefit amount for AG sizes of one, 2, or 3 individuals". SR 26-01 states that maximum as "$1,988 for a couple and needy essential person (from $1,934)", and $1,976 = 1,988 + 13 − 25.
  • A pattern that fits both known years. $1,988 = 2 × $994 and $1,934 = 2 × $967. The couple rate plus the essential-person increment fits only 2025 (1,450 + 484 = 1,934, but 1,491 + 498 = 1,989).
  • What freezing costs. The frozen value drifts by about twice the individual COLA each year, roughly $55 a month at 2.8%. It also reads 1,976 in 2025, where 2 × 967 − 12 = 1,922, the 2025 value Ziming reports.
  • Fix: check a year where the two candidates differ: 2024 gives 2 × 943 = 1,886 against 1,415 + 472 = 1,887. If New Hampshire's release used twice the individual rate, compute the standard as 2 × FBR + 13 − 25 and drop the dated value. Otherwise the NOTE covers it.

3. The skipped boundary cases don't need tuned incomes.

  • Case 10 already sets nh_ssp_countable_income directly (1,007 gives 0). The same pattern gives:
    • 1,006: nh_ssp 2, so an exact $2 grant is paid;
    • 1,006 with nh_ssp_grant_reduction_applies: 1. This pins the ordering documented at nh_ssp.py:44-46;
    • 1,005.51: 2, since $2.49 rounds down (He-W 670.03(a)(3)a.).
  • A permanent resident with 39 quarters, 2 years after entry, gives ineligible and 0. That pins the 40-quarter threshold.
  • All four are optional.

Verified

  • The 2026 standards. The PR's formula reproduces every published 2026 amount:

    Arrangement Formula Standard
    Independent living, one person 994 + 27 − 13 1,008
    Subsidized community residence 994 + 89 − 13 1,070
    Non-subsidized community residence 994 + 149 − 13 1,130
    Enhanced family care 994 + 207 − 13 1,188
    Residential care 994 + 207 − 13 1,188
    Independent living, two people 1,491 + 21 − 20 1,492
    • Sources: SR 26-01 ("The 2026 Adult Standards of Need (SON) for OAA, ANB, and APTD individuals increased as follows: ... 1 $1,008 ... 2 $1,492 ... 3 $1,976"; residential care $1,188; community residence $1,070, $1,130 and $1,188), AAM 601 Table A ("SR 26-01 Dated 01/26") and SPA NH-26-0001 D.1. I read SR 26-01 and AAM 601 Table A from the axiom-corpus copies, because dhhs.nh.gov blocks automated clients.
    • The three-person standard. Round 1 was wrong to verify $1,989. It treated the Briefing Book's 2025 $1,934 as New Hampshire's standard, but SR 26-01 lists $1,934 as the 2025 SSI maximum for that group. The published 2026 standard is $1,976. Integration Cases 7 and 8 now expect 255 each (1,976 − 1,466 = 510) and 1,007 (1,976 − 969).
  • The COLA mechanism matches the rule.

    • Independent living. He-W 658.03 (#13761, eff 9-28-23), (e): "When SSI benefits change due to a cost of living increase", the standard is the SSI maximum for the AG size (less excluded flat-rate increases) plus "the minimum payment level" less "the adult standard disregard". (c) ties the level to 42 USC 1382g.
    • Care. He-W 648.04(b) (#13537, eff 1-26-23): "(1) Subtracting the adult standard disregard ... from the current maximum supplemental security income (SSI) payment level; and (2) Adding the figure in (b)(1) above to the appropriate minimum state supplemental payment level".
    • Practice. SR 26-01 says the COLA is "Passed along in NH via formula-based updates to the adult Standards of Need", effective January 1.
    • What the PR does. It reads gov.ssa.ssi.amount, so the standards move every January. Any excluded flat-rate amounts are already netted into the levels, which are back-computed from the published standards.
    • Pass-through. Cases 52-54 show it: in 2027 an SSI-only grant stays 27, 207 and 21, because the standard and countable income both move by the COLA.
    • Earlier years. The levels also reproduce the 2025 Briefing Book standards (967 + 14 = 981; 1,450 + 1 = 1,451; 967 + 76, 136 and 194 = 1,043, 1,103 and 1,161). I couldn't open SSA's 1998 and 2011 State Assistance Programs tables or the archived SR 97-44 (ssa.gov and the Wayback Machine block this machine), so the 1998-2024 claim rests on Ziming's reading. The PR claims only 2026.
  • The SPA's administration choice. Rendered page 13 shows C.1 "c. Solely by the state" selected. The OCR text layer misreads the radio buttons, but the page image is clear.

  • New expectations, checked by hand. The 2026 FBRs are $994 for an individual and $1,491 for a couple.

    • Case 45: 994 × 2/3 = 662.67. 662.67 − 13 = 649.67, and 1,008 − 649.67 = 358.33, which rounds to 358.
    • Case 46: 358 × 2/3 = 238.67, which rounds to 239.
    • Case 47: at 18 with the P&T flag, SSI is 994, so 1,008 − 981 = 27.
    • Case 48: 0 quarters means SSI 0. 5 ≥ 5 years, so eligible: 1,008.
    • Case 49:
      • Wages: $8,460.40 / 12 = $705.03 a month.
      • SSI: (705.03 − 20 − 65) / 2 = 310.02, so (1,491 − 310.02) / 2 = 590.49 each.
      • NH: the blind member's (705.03 − 85) / 2 = 310.02 (He-W 654.15(b) and (d)-(e)). 310.02 + 1,180.98 − 20 = 1,471, and 1,492 − 1,471 = 21, so 10.50 each.
    • Case 50:
      • Wages: $16,920.80 / 12 = $1,410.07, above $497, so SSI deems the spouse's income.
      • SSI: (1,410.07 − 20 − 65) / 2 = 662.53, so 1,491 − 662.53 = 828.47.
      • NH: the combined earnings get the ANB disregard: (1,410.07 − 85) / 2 = 662.53. 662.53 + 828.47 − 20 = 1,471, giving 21.
      • He-W 654.02(e)(2) cites "654.15(c)", but (c) is only the extra ANB employment-plan amount, so applying (b) is the right reading.
    • Case 51: SSI is supplied as 0, so countable income is 0 and the grant is 1,008.
    • Cases 52-54: (FBR + 27 − 13) − (FBR − 13) = 27; (FBR + 207 − 13) − (FBR − 13) = 207; (couple FBR + 21 − 20) − (couple FBR − 20) = 21, which is 10.50 each.
    • Cases 42-44: shown in the status table.
    • Group-size Cases 1-6: 1, 2, [2, 2], [3, 3], [1, 1] and 1, per He-W 658.03(b), 648.02(c) and SPA Section E.
    • Integration Case 6: 11,928 + 324 + 678 = 12,930. The $678 of SNAP is the model's own figure, and my probe gives the same 12,930.
    • The wage inputs. Cases 49 and 50 use a BLS OEWS cashier median that I couldn't confirm, since BLS blocks automated requests. The expected values follow from the inputs either way.
  • The refactor preserves round 1's results. essential = size > 1 + couple in nh_ssp_countable_income and nh_ssp_eligible reproduces the old essential-person flag, and standard_disregard[size] reproduces the 13 / 20 / 25 mapping. Every round-1 expectation is unchanged except integration Cases 7 and 8 (the $1,976 correction).

  • The main merge. Of 59 new commits, two touch SSI inputs that nh_ssp_countable_income reads:

    No New Hampshire case sets either input. ssi_countable_resources and _ssi_spouses.py are unchanged.

  • Wiring at the head is the same as round 1:

    • all four household_state_benefits blocks;
    • HUD unearned income and SNAP unearned income;
    • spm_unit_benefits.py;
    • programs.yaml (partial, verified_years: '2026').

    nh_ssp is still not an SSI income source (20 CFR 416.1124(c)(2)), so there is no circularity or double count.

  • Tests:

    • Locally (policyengine-core 3.32.29): the four New Hampshire files at the head pass, 73 of 73.
    • In CI: Quick Feedback ran the same files: 10, 54, 6 and 3 passed.

Axiom line assessment

Valid: axiom: He-W 658.03; He-W 648.04; He-W 670.03; SPA NH-26-0001; 8 U.S.C. 1622(b) TheAxiomFoundation/rulespec-us#1769 queued.

  • Issue state.
    • The PR author filed California CARE Eligibility #1769 on 2026-10-14. It is open, labelled pe-parity, and the only rulespec-us issue with "New Hampshire" in its title.
    • rulespec-us main (172bf04e4d) still has no He-W 600 module: us-nh/ holds only policies/cms, policies/income_tax and regulations/he-w-700. So queued is the right form.
  • Dispatch-ready on the Add AMT parameters for 2020-2023 #1467 model. It has the same sections as Add SSDI Into MO Pension/SS/SSD Part C Formula #1766, which round 2 of Add Wyoming state supplementation for 2026 #10174 accepted.
    • Module paths: 13 rows, from us-nh/statutes/167/167-6.yaml and us-nh/regulations/he-w-600/He-W 658/03.yaml to us-nh/policies/dhhs/adult-assistance-manual/601-table-a-income-limits.yaml and us/statutes/8/1622.yaml.
    • Corpus citations. The ones it gives exist on axiom-corpus main: SR 26-01 block-1, AAM 601 Table A block-2, AAM 305.11 and 305.13 block-1, and the SPA document. He-W 600, RSA 167:6 and 8 U.S.C. 1621-1622 are marked "needs ingest", which is the recorded blocker.
    • Verbatim law. I checked these quotes against the sources:
      • He-W 616.02(a), 648.04, 654.15, 654.16(b) and 658.03, against the official He-W 600 page;
      • SR 26-01, AAM 305.13 and AAM 601 Table A, against the corpus copies;
      • 8 U.S.C. 1622, against LII.
    • Required outputs: 10 rows: category, qualified-alien test, AG size, resource test, standard of need, standard disregard, earned income disregard, AG net income, one-third reduction and grant.
    • Companion tests A-L take their expected values from the rules and FBRs, not from PolicyEngine output. Each maps to a PR case: A → Case 1 and integration Case 6; B → Case 5; C → integration Case 1; D → integration Case 2; E → Case 10; F → Case 16; G → Case 7; H → Case 51; I → integration Case 7; J → Case 12; K → Case 13; L → Case 15.
  • Matches the head: the variable and parameter names, the 54 / 10 / 6 / 3 case counts, $1,976, the COLA formula and the 1622(b)(2) override.
  • Gap. Its first "Interpretations and gaps" bullet says "Federal law controls" without mentioning 8 U.S.C. 1624 (Suggestion 1). The Critical 1 fix doesn't change anything the issue describes.

CI status

24 pass, 3 fail (gh pr checks 10156; run 38626899185 on head a71c7cde73, pull_request, 2026-10-14).

  • The three failures are caused by the PR (Critical 1), not by infrastructure. Nine tests fail with the same standard_disregard.0 error:
    • Python tests: Microsimulation (4)
    • Rest (Python, shard-1 + variables) (4)
    • Rest (Python + variables) (1)
  • Passed:
    • PR validation, and Package and compatibility;
    • Quick Feedback, which ran the four New Hampshire files;
    • all 11 Baseline shards and all 9 Contrib shards;
    • Household API Partners.
  • Partner tests: the PR touches none.

Branch status

Verdict: REQUEST_CHANGES

@DTrim99 DTrim99 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Requesting changes for 1 critical item; details in the round-2 report above. All round-1 findings are fixed. rulespec-us#1769 is open, pe-parity and ready for the encoder. The COLA-linked standards follow He-W 658.03(e) and 648.04(b), and 73 of 73 tests pass. Critical 1 is the CI failure: nh_ssp_assistance_group_size is NH-gated with an int default of 0, so p.standard_disregard[size] (nh_ssp.py:31, nh_ssp_countable_income.py:68) looks up the nonexistent key 0 for non-NH people. This happens in any simulation that includes an eligible NH resident. It fails 9 tests across the Microsimulation and Rest jobs, breaks national runs, and reproduces locally with NH + MA households. Fix: set default_value = 1 or drop the defined_for (both checked: [27, 0]), and add a two-state YAML case so it stays pinned. Three optional suggestions are in the report (8 U.S.C. 1624, the three-person standard following the COLA, and direct countable-income cases).

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.

2 participants