Skip to content

Keep New Hampshire FANF's recipient earned income disregard at 50% - #10251

Open
PavelMakarchuk wants to merge 4 commits into
mainfrom
fix-9984-nh-fanf-recipient-disregard
Open

PavelMakarchuk wants to merge 4 commits into
mainfrom
fix-9984-nh-fanf-recipient-disregard

Conversation

@PavelMakarchuk

@PavelMakarchuk PavelMakarchuk commented Oct 16, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

This PR fixes both defects in #9984 for New Hampshire FANF's earned income disregard (EID). It also makes the income test strict, as the statute says, because the applicant fix makes the equality case matter.

1. Recipients: 50%, not the 75% pilot rate

gov.states.nh.dhhs.fanf.income.earned_income_disregard.recipient_rate changed from 0.5 to 0.75 on 2022-09-01, citing the TANF State Plan's "Cliff Effect Initiative". nh_fanf_countable_earned_income applied that rate to every enrolled unit. The State Plan and DHHS's Cliff Effect Progress Report (March 2023) describe the rate as a voluntary two-year pilot, October 2022 to September 2024. It covered only participants who started or moved to full-time work.

The general rule for recipients is still 50%:

  • He-W 654.13(e) says: "The 50% EID shall be used to determine: (1) The eligibility and the benefit amount for current FANF financial assistance recipients". The consolidated source note ends "ss by #11186, eff 9-20-16", so the rule was not amended for the pilot. New Hampshire readopted He-W 654.13 as #14518, effective 2/25/2026 (Rulemaking Register No. 10, March 12, 2026). The Initial Proposal (Notice 2025-271) keeps the 20% and 50% text and only updates two citations, so 50% holds from 2026 on too.
  • FAM 603.01 gives "50% of gross earned income of current recipients".
  • The NCCP TANF State Profile 2025/2026 for New Hampshire also gives 50%.

The PR removes the 2022-09-01 value, so the rate is 0.5 throughout, and notes that the pilot is not modeled: the inputs cannot identify pilot participants.

Issue example (2025, three people, $1,500/month earnings, enrolled): countable earnings are $750 instead of $375, and nh_fanf is $582.50/month instead of $957.50.

2. Applicants: 20% for the eligibility test only, 50% for the benefit

nh_fanf_countable_earned_income used the 20% applicant rate for both the income test and the benefit of a unit that is not enrolled. The rule uses 20% only for the test:

  • He-W 654.13(c): "The 20% earned income disregard shall be: (1) Used to determine eligibility for applicants of FANF financial assistance in (b) above".
  • He-W 654.13(d): "If a financial assistance applicant is determined eligible after applying the 20% EID as described in (c) above, then the benefit amount shall be determined using a 50% EID as described in (e) below." (e)(3) applies the 50% EID to "The benefit amount for applicants who are determined eligible as described in (d) above".
  • FAM 603.01: "Those applicants who are income eligible for financial assistance using the 20% earned income disregard receive the 50% disregard in place of the 20% in calculating the benefit amount."

Changes:

  • nh_fanf_countable_earned_income (the benefit income) now always uses recipient_rate (50%).
  • New nh_fanf_countable_earned_income_for_eligibility uses applicant_rate (20%) for units that are not enrolled and recipient_rate for enrolled units. New nh_fanf_countable_income_for_eligibility adds unearned income, and nh_fanf_income_eligible reads it. This follows the _for_eligibility pattern of Indiana TANF, Michigan FIP and Minnesota MFIP.
  • is_tanf_enrolled stands in for He-W 654.13(e)(2), receipt in any one of the previous 6 months, so a former recipient who applies again still gets the 20% test. The inputs have no 6-month look-back; the formula comment says so.

Example (January 2024, two people, $1,000/month earnings, not enrolled): the test income is $800, below the $1,022 payment standard, so the unit is eligible. The benefit is 1,022 − 500 = $522 instead of $222.

Both rate parameters now cite He-W 654.13 and the 2026 readoption. The variable no longer cites the State Plan's Cliff Effect page, which does not support the 50% rate.

3. Income test: less than the payment standard

nh_fanf_income_eligible used <=. RSA 167:79 III(e) says "The assistance group's net income shall be less than the payment standard for the assistance group size", and FAM 611.01 says "If net income is less than the payment standard, the AG is income-eligible". Before this PR the difference had no effect, because the benefit at equality was $0. With the 50% benefit for applicants, an applicant whose 20% test income equals the payment standard would get a positive benefit, so the test is now <.

Tests

  • integration.yaml:
    • Case 16 is the issue example in 2025-01: $750 countable and $582.50 benefit.
    • Case 17: a recipient with $2,700/month earnings has $1,350 countable, which is above the $1,332.50 payment standard, so the unit is ineligible. On main the 25% rate kept it eligible.
    • Applicant Cases 2, 6, 11, 13 and 14 now check both incomes: the 20% test income and the 50% benefit income. Their benefits move from 222, 720, 66, 491 and 222 to 522, 960, 666, 791 and 522.
    • New Case 18: an applicant with $1,500/month fails the 20% test (1,200 > 1,022), although 50% of earnings (750) is below the payment standard.
    • New Case 19: an applicant exactly at the 20% test limit ($1,277.50/month: 1,022 is not less than 1,022) is ineligible.
    • New Case 20: an applicant just below the limit ($1,275/month: 1,020 < 1,022) gets a $384.50 benefit (1,022 − 637.50).
  • Recipient expectations moved from 25% to 50% of earnings: integration.yaml Cases 7, 9, 12 and 15, and nh_fanf_countable_earned_income.yaml Cases 3, 5, 6 and 7.
  • nh_fanf_countable_earned_income.yaml: applicant Cases 2 and 4 now use the 50% benefit rate. Case 6 uses $100/month (50 − 100 → 0), so it reaches the zero floor again.
  • New nh_fanf_countable_earned_income_for_eligibility.yaml (5 cases) and nh_fanf_countable_income_for_eligibility.yaml (1 case).
  • nh_fanf_income_eligible.yaml and nh_fanf_eligible.yaml now set nh_fanf_countable_income_for_eligibility as the input. Case 3 (income equal to the payment standard) is now ineligible. New Case 5 checks that the test reads the eligibility income, not the benefit income.
  • Local results: nh/dhhs/fanf has 79 passed. All 33 NH test files pass with test_batched.py --mode per-subdir. The code-health reference, source-conflict and program-registry tests pass (1,017 passed, 10 skipped).

Fixes #9984

axiom: TheAxiomFoundation/rulespec-us#1945 queued

🤖 Generated with Claude Code

recipient_rate rose to 75% from September 2022, citing the TANF State
Plan's Cliff Effect Initiative. That was a two-year pilot for participants
who started or moved to full-time work. He-W 654.13(e) and FAM 603.01 still
set 50% for current recipients, so the 2022-09-01 value is removed and the
pilot is noted as not modeled.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@PavelMakarchuk
PavelMakarchuk marked this pull request as ready for review October 23, 2026 17:03
@codecov

codecov Bot commented Oct 23, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (909176a) to head (4f594f4).
⚠️ Report is 692 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff            @@
##              main    #10251   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files            4         4           
  Lines           76        54   -22     
  Branches         2         0    -2     
=========================================
- Hits            76        54   -22     
Flag Coverage Δ
unittests 100.00% <100.00%> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

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

DTrim99 commented Oct 26, 2026

Copy link
Copy Markdown
Collaborator

PR Review: Keep New Hampshire FANF's recipient earned income disregard at 50%

Summary

The PR deletes the 2022-09-01: 0.75 value from recipient_rate, so every enrolled New Hampshire FANF unit gets the 50% earned income disregard in every year. It also:

  • replaces the State Plan "Cliff Effect Initiative" reference with He-W 654.13(e) and the current FAM 603.01 page;

  • rewrites the formula comment to say the pilot isn't modeled;

  • moves eight recipient expectations from 25% to 50% of earnings;

  • adds two 2025 cases.

  • Law. The fix is right. He-W 654.13(e) gives 50% "for current FANF financial assistance recipients". The 75% (and 100%) disregard was a voluntary pilot for participants who started or moved to full-time work. It never entered the rule. New Hampshire readopted He-W 654.13 on 2026-02-25 (document #14518) with the 20% and 50% text unchanged, so 50% is the rule for every year the PR covers, including 2026.

  • What was wrong. From September 2022, main applied the pilot's 75% to every enrolled unit. is_tanf_enrolled defaults to reported TANF receipt, so in microsimulation the 75% reached every New Hampshire unit that reports TANF.

  • Order of operations. The order is EID, then child care, then unearned income is added. This matches He-W 654.02(b), whose 2026 readoption is editorial.

  • Code. The rate is a scalar parameter chosen by where on a boolean, so the formula is vectorized. No state-gated variable is used as a parameter key, so NH Add New Hampshire state supplementation for 2026 #10156 doesn't apply.

  • Tests. I hand-checked 14 expectations, and all are correct.

  • Problems. Two things need fixing:

    • Fixes #9984 would close the only issue that tracks the related applicant-benefit defect (He-W 654.13(d)), and an edited test comment restates the wrong applicant amount.
    • The axiom: line is missing.

    The suggestions cover a test name that no longer fits, citing the 2026 readoption, and leftover references.

Critical (must fix)

None.

Should address

1. Keep the applicant-benefit defect tracked, and don't restate it as intended in the edited comment.

nh_fanf_countable_earned_income.py:29 uses the 20% applicant rate for both the income test and the benefit of a unit that isn't enrolled. The rule uses 20% only for the test:

  • He-W 654.13(d) says: "If a financial assistance applicant is determined eligible after applying the 20% EID as described in (c) above, then the benefit amount shall be determined using a 50% EID as described in (e) below". (e)(3) applies the 50% EID to "The benefit amount for applicants who are determined eligible as described in (d) above".
  • FAM 603.01 says: "Those applicants who are income eligible for financial assistance using the 20% earned income disregard receive the 50% disregard in place of the 20% in calculating the benefit amount."
  • The 2026 readoption keeps (d) and (e) word for word (Initial Proposal, Notice 2025-271).

Example: integration Cases 2 and 14 (January 2024, two people, $1,000 a month, not enrolled). The test is 800 ≤ 1,022, so the unit is eligible, and the benefit should be 1,022 − 500 = 522, not 222. Case 13 would be 1,291 − 500 = 791, not 491. Case 11 would be 1,291 − (1,000 − 375) = 666, not 66.

The body says this defect "is not changed here", which is a fair scope choice. Two things still need fixing:

Fix, either way:

  • (a) Implement (d) here. Keep the 20% rate only for the income test of units that aren't enrolled. Compute countable income for the benefit with the 50% rate for every eligible unit. One way:

    • nh_fanf_countable_earned_income always uses recipient_rate;
    • a new applicant-test income variable uses applicant_rate;
    • nh_fanf_income_eligible reads the new variable when the unit isn't enrolled.

    The applicant benefit cases (integration 2, 6, 11, 13 and 14) would change as above.

  • (b) Open a separate issue for He-W 654.13(d), and for (e)(2), the 6-month look-back that is_tanf_enrolled only approximates. Then do both of these:

2. Add the axiom: line to the PR body.

The body has no axiom line in any format, and Pavel is staff, so the line is required and axiom: needed isn't available. encoded-correct isn't available either:

Recommended line. File a dispatch-ready pe-parity issue and use axiom: TheAxiomFoundation/rulespec-us#<n> queued. The issue should have:

  • Module. us-nh/regulations/he-w-600/He-W 654/13.yaml, following California CARE Eligibility #1769's path style. Record the corpus prerequisite: ingest He-W 600 (shared with California CARE Eligibility #1769). That is the blocker.

  • Law. The verbatim text of He-W 654.13(a)–(e) as readopted by #14518 (eff. 2026-02-25), plus He-W 654.02(b)(2)–(5) for the order.

  • Required outputs. The EID rate for eligibility and for the benefit, by applicant status:

    • a new applicant: 20% for eligibility, 50% for the benefit;
    • a recipient, or an applicant who received FANF in the previous 6 months: 50% for both.

    Also net earned income.

  • Companion cases. Take them from the rule text, not PolicyEngine output:

    • a recipient with $1,500 of gross monthly earnings → EID $750, net earned income $750;
    • a new applicant with $1,000 → $800 counted for eligibility and $500 for the benefit.

    Note the applicant-benefit gap (Should 1) so the encoder doesn't copy PolicyEngine's current output.

Suggestions

  1. Case 6 no longer tests its name. nh_fanf_countable_earned_income.yaml:85 is named "child care deduction exceeds income, capped at zero". With the 50% rate, its inputs give 100 − 100 = 0, an equality case like Case 7. The file no longer reaches the zero floor (integration Case 12 still does: 100 − 200 → 0). Set employment_income_before_lsr: 1_200 ($100 a month: 50 − 100 → 0) to keep the name true.
  2. Cite the 2026 readoption. The consolidated He-W 600 page still ends He-W 654.13's source note at "ss by #11186, eff 9-20-16". The Rulemaking Register lists #14518, "He-W 654.13 … Earned Income Disregard (EID) and Employment Expense Disregard (EED) for Financial Assistance to Needy Families (FANF)", effective 2/25/2026 and expiring 2/25/2036 (FP 2025-271), in No. 10, March 12, 2026.
    • Notice 2025-271 says the readoption only updates "two citations" (PDF p. 1). The fiscal impact statement says "There is no difference in cost between the proposed rule and the existing rule" (p. 2).
    • Adding the Initial Proposal as a reference, or a sentence in the body, shows the 50% rate holds from 2026 on. It also brings the body's "the rule was not amended" point up to date.
  3. Leftover references.
    • nh_fanf_countable_earned_income.py:14 still cites tanf-state-plan.pdf#page=29 (the Cliff Effect section). The parameter no longer cites that page, and it doesn't support the 50% rate. Drop it, or keep it with a # documents the unmodeled pilot comment.
    • applicant_rate.yaml could cite He-W 654.13(b) next to FAM 603.01, as recipient_rate.yaml now cites (e).

Verified correct

  • Rule. He-W 654.13:

    • (a): an EID "shall be subtracted from gross earned income for each applicant or recipient";
    • (b): "For applicants who have not received FANF financial assistance in any one of the previous 6 months, the EID shall be 20% of the individual's monthly gross earned income";
    • (e): "The 50% EID shall be used to determine: (1) The eligibility and the benefit amount for current FANF financial assistance recipients; (2) … applicants who have received FANF financial assistance in any one of the previous 6 months".

    The 1997-02-01 start matches the rule's "ss by Add enhanced multi-agent system for autonomous PR reviews #6446, eff 2-1-97". The 2026 readoption (#14518) keeps this text (Suggestion 2).

  • Statute. The statute doesn't set the disregard; the rules do:

    • RSA 167:79 lists the eligibility conditions, including III(e): "The assistance group's net income shall be less than the payment standard for the assistance group size".
    • RSA 167:80 II: "The department shall establish income limits for applicant and participant assistance groups by rules adopted pursuant to RSA 541-A".
    • RSA 167:77-g sets the payment standard at 60% of the poverty guidelines.

    (nh_fanf_income_eligible uses <=. That is pre-existing and doesn't change nh_fanf, because the benefit is $0 at equality.)

  • Manual. FAM 603.01: "50% of gross earned income of current recipients, or of applicants who have received FANF assistance within the 6 month period prior to application". The DHHS site returns 403 to automated requests, so I read this text through search excerpts. It matches the issue's quote.

  • The pilot. The TANF State Plan says: "Participants are eligible for a 75% TANF earned income disregard when starting a new full-time position or current employment increase to full time". It adds a 100% disregard for high-demand jobs with medical benefits "during the two-year pilot. The pilot was implemented in September 2022". DHHS reports give the planned end as September 30, 2024. That is a measure for a subgroup, not a change to the recipient rule. No input identifies participants who started full-time work, so leaving the pilot out is reasonable and documented. (The State Plan and progress report PDFs return 403, so these quotes come from search excerpts and the issue.)

  • Order of operations. He-W 654.02(b): "(2) … the earned income disregard (EID), as specified in He-W 654.13, shall be computed and subtracted from gross earned income; (3) From the remaining amount in (2) above, the child/dependent care disregard … shall be subtracted …; (5) The countable gross unearned income … shall be added". The formula and nh_fanf_countable_income follow that order. The 2026 readoption of He-W 654.02 (Notice 2026-114, eff. 10-17-26) only spells out acronyms and edits wording.

  • Years. The rate is 0.5 from 1997-02-01 with no breakpoint. The 2024-01 and 2025-01 cases fall inside the window that used to get 75%, so they pin the fix.

  • Code.

  • Hand-checked expectations (14). Payment standards are 60% of the poverty guideline divided by 12: 20,440 → 1,022, 25,820 → 1,291 and 26,650 → 1,332.50.

    • nh_fanf_countable_earned_income.yaml:
      • Case 2 (applicant control): 1,000 × 0.8 = 800.
      • Case 3: 1,000 × 0.5 = 500.
      • Case 5: 2,000 × 0.5 = 1,000. Full time (≥ 377), age 3 → cap 200, and the expenses are 300 a month, so 1,000 − 200 = 800.
      • Case 6: 200 × 0.5 = 100. Part time → cap 100, and the expenses are 200, so 100 − 100 = 0.
      • Case 7: $400 ≥ 377 is full time → cap 200 (expenses 300). 400 × 0.5 = 200, so 200 − 200 = 0.
    • integration.yaml:
      • Case 7: 1,022 − 500 = 522.
      • Case 9: 1,000 − 200 = 800, and the benefit is 1,022 − 800 = 222.
      • Case 12: 100 − 2 × 100 → 0, and the benefit is 1,291 (the expenses of 400 exceed the 200 cap).
      • Case 15: 522.
      • Case 16: standard 1,332.50, countable 750, eligible, and the benefit is 582.50.
      • Case 17: 1,350 > 1,332.50 → ineligible, 0. On main, 675 kept the unit eligible.
      • Case 14 (applicant control): 222 as coded, but see Should 1.
      • Case 11 (control): 1,600 − 375 = 1,225, so the benefit is 66.
      • Case 13 (control): 800, so the benefit is 491.

    All periods are January, so the non-January month period with YEAR inputs doesn't arise.

  • PR body. The issue example (750 against 375 countable; 582.50 against 957.50) is right. So is "7 of these cases fail" on main: integration 7, 9, 15, 16 and 17, plus countable earned income 3 and 5. Cases 6, 7 and 12 give 0 under either rate.

  • Source-conflict ratchet (Tie source-conflict markers to the register shared with Axiom #10287).

  • Changelog. changelog.d/fix-9984-nh-fanf-recipient-disregard.fixed.md is a top-level fragment with the fixed type.

  • Partner tests. No files under tests/policy/baseline/partners/** are touched, and Household API Partners passes.

Axiom line assessment

There is no axiom: line in any format, which is a SHOULD (Should 2). rulespec-us has no He-W 600 or FANF module, and He-W 600 still needs corpus ingest (recorded in rulespec-us#1769), so encoded-correct isn't available. The recommended line is a new dispatch-ready pe-parity issue for He-W 654.13, marked queued, with the ingest recorded as the blocker.

CI status

All 29 checks pass at 40fb4b0bb9 (gh pr checks 10251; the workflow run on that SHA was created 2026-10-23 18:41 UTC). That includes the four Baseline states shards, Household API Partners, PR validation, Quick Feedback and both codecov checks. None is pending or failing.

Branch status

The branch is 2 commits ahead of main (the change on 2026-10-16 and a merge of main on 2026-10-23) and 46 behind. git merge-tree --write-tree PolicyEngine/main 40fb4b0bb9 merges cleanly. Main hasn't changed any New Hampshire FANF file since the merge base. Its only change to test_source_conflicts.py edits unrelated KNOWN_UNMARKED rows. No other open PR touches NH FANF (#10343, NH LIHEAP, uses different files).

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.

The law checks out: He-W 654.13(e) sets 50% for recipients, the 75% was a 2022-2024 pilot that never entered the rule, and the 2026 readoption keeps 20%/50%; all 14 expectations hand-check. Two should-address items: (1) 'Fixes #9984' would close the only tracker of the applicant-benefit defect (He-W 654.13(d) uses 50% for the benefit, so Case 14 should be 522, not 222), so fix it here or file an issue and reword; (2) there's no axiom line, so please file a pe-parity issue for He-W 654.13 and mark it queued. Three suggestions. Full report in the comment above.

He-W 654.13(c) limits the 20% earned income disregard to the
eligibility test of applicants who have not received FANF in the
previous 6 months; (d) and (e)(3) compute the benefit of an applicant
who passes that test with the 50% disregard. The model used 20% for
both the test and the benefit.

- nh_fanf_countable_earned_income (benefit) now always uses the 50%
  rate.
- New nh_fanf_countable_earned_income_for_eligibility and
  nh_fanf_countable_income_for_eligibility keep the 20% rate for the
  test of units that are not enrolled; nh_fanf_income_eligible reads
  them.
- Cite He-W 654.13(b)-(e) and the 2026 readoption (#14518, Notice
  2025-271) in both rate parameters; drop the State Plan Cliff Effect
  page from the variable references.
- Applicant integration cases 2, 6, 11, 13 and 14 move to the 50%
  benefit; add cases 18 (applicant fails the 20% test) and 19
  (applicant at the test limit). Countable earned income Case 6 uses
  $100/month so it reaches the zero floor again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
RSA 167:79 III(e) says the assistance group's net income "shall be
less than the payment standard", and FAM 611.01 and He-W 670.03(b)(1)
use the same comparison. The `<=` had no effect while the benefit at
equality was $0, but with the 50% applicant benefit an applicant whose
20% test income equals the payment standard would get a positive
benefit.

- nh_fanf_income_eligible uses `<` and cites RSA 167:79 and FAM 611.01.
- The eligibility income variables cite FAM 611.01, which describes
  the 20% applicant test and the 50% grant computation.
- nh_fanf_income_eligible.yaml Case 3 (equal) is now ineligible.
- Integration Case 19 (applicant at the limit) is ineligible; new
  Case 20 (just below the limit) gets the 50% benefit, 384.50.

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

Copy link
Copy Markdown
Collaborator Author

@DTrim99 thank you for the review. Each item and what I did:

Should address

1. Applicant benefit (He-W 654.13(d)): fixed here, option (a), in 7ca71f1.

  • nh_fanf_countable_earned_income (the benefit income) now always uses recipient_rate (50%), per He-W 654.13(d) and (e)(3).
  • New nh_fanf_countable_earned_income_for_eligibility uses applicant_rate (20%) for units that are not enrolled and recipient_rate for enrolled units, per (b), (c) and (e)(1). New nh_fanf_countable_income_for_eligibility adds unearned income, and nh_fanf_income_eligible reads it. The names follow the _for_eligibility variables of Indiana TANF, Michigan FIP and Minnesota MFIP. FAM 611.01 describes the same two steps ("Applicant Eligibility Test", then "Grant Amount and Financial Assistance Recipient Eligibility Computation"), so it is now a reference too.
  • The applicant cases moved as you computed: integration Cases 2 and 14 → 522, Case 13 → 791, Case 11 → 666, and Case 6 → 960 (1,560 − (400 + 200)). Each applicant case now asserts both incomes (the 20% test income and the 50% benefit income).
  • New integration Case 18: an applicant with $1,500/month fails the 20% test (1,200 > 1,022), although 50% of earnings (750) is below the payment standard.
  • Fixes #9984 is now accurate, because the PR fixes both defects that New Hampshire FANF: recipient_rate gives every recipient the 75% Cliff Effect pilot disregard from September 2022; He-W 654.13(e) and FAM 603.01 set 50% #9984 describes.
  • The Case 15 comment now reads 1,022 - 500 = 522, the same benefit as Case 14's applicant (He-W 654.13(d)-(e)).
  • (e)(2), the 6-month look-back: documented, no new issue. No input or dataset field gives receipt in any one of the previous 6 months, so is_tanf_enrolled still stands in for it. The formula comment in nh_fanf_countable_earned_income_for_eligibility says that a former recipient who applies again gets the 20% test. rulespec-us#1945 records it as a gap (its companion case 3) so that the encoder keeps the look-back as an input. I can file a policyengine-us issue for it if you want one.

One consequence I fixed with it (in 4f594f4): the income test is now strict <. You noted that <= was harmless because the benefit at equality was $0. With the 50% applicant benefit that stops being true: an applicant whose 20% test income equals the payment standard would get a positive benefit (for example $1,277.50/month: 1,022 for the test, 638.75 for the benefit, so $383.25). RSA 167:79 III(e) ("shall be less than the payment standard"), He-W 670.03(b)(1) ("the net income amount is less than the payment standard") and FAM 611.01 ("If net income is less than the payment standard, the AG is income-eligible") agree, so there is no source conflict. nh_fanf_income_eligible.yaml Case 3 (equal) is now ineligible. New integration Case 19 ($1,277.50) is ineligible, and Case 20 ($1,275/month: 1,020 < 1,022) gets 1,022 − 637.50 = 384.50.

2. axiom: line: fixed. I filed TheAxiomFoundation/rulespec-us#1945 (pe-parity), and the PR body now ends with axiom: TheAxiomFoundation/rulespec-us#1945 queued. The issue has:

  • Module: us-nh/regulations/he-w-600/He-W 654/13.yaml, in California CARE Eligibility #1769's path style.
  • Corpus: He-W 600 is in no axiom-corpus manifest and needs ingest, which is shared with California CARE Eligibility #1769 and recorded as the first blocker. FAM 603.01 is already in the corpus (us-nh/manual/dhhs/fam/603-01-earned-income-disregards-eid-fam).
  • Law: He-W 654.13(a)-(f) verbatim, with the #14518 readoption (eff. 2/25/2026), He-W 654.02(b)(1)-(4) for the order, and FAM 603.01.
  • Required outputs: the EID rate for eligibility and for the benefit, by applicant status, and earned income after the EID.
  • Companion cases: six rows from the rule text, not PolicyEngine output, among them your two (a recipient with $1,500 → 750 and 750; a new applicant with $1,000 → 800 for eligibility and 500 for the benefit), plus a re-applicant within 6 months, one after 7 months, $0 and $2,700.
  • Warning: do not copy PolicyEngine main output (the 75% pilot rate and the 20% applicant benefit).

Suggestions

  1. Case 6 name: fixed in 7ca71f1. nh_fanf_countable_earned_income.yaml Case 6 uses employment_income_before_lsr: 1_200 ($100/month: 50 − 100 → 0), so it reaches the zero floor again. New nh_fanf_countable_earned_income_for_eligibility.yaml Case 5 also checks the floor for an applicant (80 − 100 → 0).
  2. 2026 readoption: fixed in 7ca71f1. Both applicant_rate.yaml and recipient_rate.yaml cite the Initial Proposal, Notice 2025-271 (a one-page PDF with the 20% and 50% text) and Rulemaking Register No. 10, March 12, 2026, file page 6, which lists #14518 with effective date 2/25/2026 and expiry 2/25/2036. The PR body now says that the 50% rate holds from 2026 on.
  3. Leftover references: fixed in 7ca71f1. nh_fanf_countable_earned_income.py no longer cites tanf-state-plan.pdf#page=29. Its comment still explains the unmodeled pilot. It now cites the current FAM 603.01 page. applicant_rate.yaml cites He-W 654.13(b)-(c) and the current FAM 603.01 page.

Commits and tests

  • 7ca71f1: He-W 654.13(d) applicant benefit, the new eligibility variables, references, and suggestions 1-3.
  • 4f594f4: strict income test (RSA 167:79 III(e)), Cases 19-20, and FAM 611.01 references.

Local results: nh/dhhs/fanf has 79 passed. All 33 NH test files pass with test_batched.py --mode per-subdir. The code-health reference, source-conflict and program-registry tests pass. No partner contract test is touched.

Out of scope, for a later PR: nh_fanf_resources_eligible also uses <=, and RSA 167:79 III(f) says countable resources "shall be less than the allowable resource limit". I did not check the He-W 656 wording, so I left it unchanged.

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.

New Hampshire FANF: recipient_rate gives every recipient the 75% Cliff Effect pilot disregard from September 2022; He-W 654.13(e) and FAM 603.01 set 50%

2 participants