Skip to content

Fix New Hampshire FANF earned income disregards (50% for recipients and every benefit, 20% only for the applicant test) and require net income below the payment standard - #10251

Merged
PavelMakarchuk merged 7 commits into
mainfrom
fix-9984-nh-fanf-recipient-disregard
Oct 27, 2026
Merged

PavelMakarchuk merged 7 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 (7fc213a).
⚠️ Report is 712 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.

@DTrim99

DTrim99 commented Oct 27, 2026

Copy link
Copy Markdown
Collaborator

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

Summary

Since round 1 (40fb4b0bb9), Pavel pushed two commits and a clean merge of main. The head is fcc84b6035.

  • 7ca71f1 takes option (a) from round 1 and implements He-W 654.13(d):
    • nh_fanf_countable_earned_income (the benefit income) now always uses the 50% recipient_rate.
    • New nh_fanf_countable_earned_income_for_eligibility uses 20% for units that aren't enrolled and 50% for enrolled units.
    • New nh_fanf_countable_income_for_eligibility adds unearned income, and nh_fanf_income_eligible reads it.
    • The commit also takes all three suggestions.
  • 4f594f4 makes the income test strict (<), as RSA 167:79 III(e) requires. Round 1 noted that <= did no harm only because the benefit at equality was $0. Once applicant benefits use the 50% rate, that no longer holds, so the change is needed.

Both round-1 Should items are fixed:

  • Fixes #9984 is now accurate, because the PR fixes both defects the issue describes.
  • The body carries axiom: TheAxiomFoundation/rulespec-us#1945 queued. That issue is open, labelled pe-parity and dispatch-ready.

Law. I checked the new structure against He-W 654.13(b)–(e) as consolidated and as readopted by #14518. I also checked He-W 654.02(b), He-W 670.03(b)(1), RSA 167:79 III(e) and FAM 611.01. They agree, so no source conflict needs recording.

Tests. I hand-checked every new or changed expectation, and all match the rule arithmetic. Quick Feedback ran the whole NH FANF test folder at this head on CI, including both new files, and it passed. A local run of the seven NH FANF test files also passed (51 cases).

CI. One check fails: Rest (Python shard 3), on test_social_security_input_state_machine (NameError: name 'operator' is not defined). Main's own run at the same base fails the same way, so it isn't caused by this PR. Six checks were still pending at the last check.

Open items. Three suggestions, none blocking:

  • He-W 670.03(b) rounds the FANF grant down to whole dollars and sets a $10 minimum. This gap is pre-existing in nh_fanf.py, which the PR doesn't touch.
  • Five test comments still say <=.
  • The PR title no longer covers everything the PR does.

Prior findings

Finding Status Evidence
Should 1: the applicant-benefit defect (He-W 654.13(d)) would lose its only tracker, and the Case 15 comment restated the wrong amount Fixed (option (a)) nh_fanf_countable_earned_income.py computes gross_earned * (1 - p.recipient_rate) for every unit. nh_fanf_countable_earned_income_for_eligibility.py keeps where(is_enrolled, p.recipient_rate, p.applicant_rate) for the test only. nh_fanf_income_eligible.py reads nh_fanf_countable_income_for_eligibility. Applicant integration Cases 2, 6, 11, 13 and 14 move to 522, 960, 666, 791 and 522, which are the round-1 figures plus Case 6 (1,560 − (400 + 200)). The defect is fixed in this PR, so Fixes #9984 no longer drops a tracked defect. The Case 15 comment now reads "the same benefit as Case 14's applicant (He-W 654.13(d)-(e))".
Should 1, sub-item: the (e)(2) 6-month look-back that is_tanf_enrolled only approximates Declined with reason (accepted) No input or dataset field records FANF receipt in the previous 6 months. The new formula's comment says that "a former recipient who applies again gets the 20% rate here". rulespec-us#1945 records the gap (its companion case 3) so the encoder keeps the look-back as its own input. Round 1 asked for a separate issue only under option (b), so documenting it is enough. Pavel offered a policyengine-us issue if wanted. That's optional.
Should 2: no axiom: line Fixed The body ends axiom: TheAxiomFoundation/rulespec-us#1945 queued. See "Axiom line assessment" below.
Suggestion 1: Case 6 no longer tested its name Fixed nh_fanf_countable_earned_income.yaml Case 6 now uses employment_income_before_lsr: 1_200 ($100 a month). That is part-time, so the age-3 cap is $100, and the expenses are $200 a month, so 50 − 100 → 0. New eligibility Case 5 checks the same floor for an applicant: 80 − 100 → 0.
Suggestion 2: cite the 2026 readoption Fixed Both rate parameters now cite two documents, and I opened both. The Initial Proposal, Notice 2025-271 is one page with the (a)–(f) text unchanged ("(b) … the EID shall be 20% …"; "(e) The 50% EID shall be used to determine: (1) … current FANF financial assistance recipients"). Rulemaking Register No. 10, file page 6 lists "14518 He-W 654.13 (FP 2025-271) … 2/25/2026 … 2/25/2036". The body says 50% holds from 2026 on.
Suggestion 3: leftover references Fixed nh_fanf_countable_earned_income.py no longer cites tanf-state-plan.pdf#page=29. It cites He-W 600 and the current FAM 603.01 page, and its comment still explains the pilot that isn't modeled. applicant_rate.yaml cites "He-W 654.13(b)-(c)" and the current FAM 603.01 page. The old FAM-A link is retitled "…, SR 97-03".

New findings

Critical (must fix)

None.

Should address

None.

Suggestions

1. The FANF grant isn't rounded down to whole dollars and has no $10 minimum (He-W 670.03(b)). This is pre-existing, so a follow-up issue is enough.

He-W 670.03(b) says:

(1) If the assistance group is found eligible and the net income amount is less than the payment standard, the difference between the 2 amounts shall equal the FANF grant amount; (2) The grant shall be a monthly dollar amount; (3) If the grant amount ends in: a. $0.01-$.99, it shall be rounded down to the nearest dollar … (5) No payment shall be made if the amount of the FANF grant before any adjustments is less than $10 …

nh_fanf.py returns min_(max_(payment_standard - countable_income, 0), payment_standard) with no floor and no minimum. Two expectations pin unrounded amounts:

  • New integration Case 20 expects 384.50. Under (b)(3) the grant is $384.
  • Case 16 (round 1) expects 582.50, where the grant is $582.

The $10 minimum matters only for recipients whose net income is within $10 of the payment standard. An applicant who passes the 20% test now gets at least about 37.5% of the payment standard.

The PR doesn't touch the grant formula, so this isn't a blocker. Either:

  • open a policyengine-us issue for He-W 670.03(b)(3)–(5), or
  • fix it here with a floor and a minimum_grant parameter of $10, and move Cases 16 and 20 to 582 and 384.

Separately, rulespec-us#1945's optional integration row gives the Case 20 benefit as "384.50". Under He-W 670.03(b)(3) that is $384. It's worth correcting there, or dropping the dollar amount, so the companion check follows the rule text.

2. Five test comments still say <=.

The test is now strict, but these comments in integration.yaml still read <=:

  • line 53 (Case 2): "800 <= 1,022";
  • line 159 (Case 6): "840 <= 1,560";
  • line 307 (Case 11): "1,225 <= 1,291";
  • line 371 (Case 13): "800 <= 1,291";
  • line 399 (Case 14): "800 <= 1,022".

The values are all strictly below the standard, so the results are right. Change them to < to match RSA 167:79 III(e) and Cases 19 and 20.

3. Retitle the PR.

The title describes only the recipient fix. The PR now also:

  • computes every applicant's benefit with the 50% disregard (He-W 654.13(d));
  • makes the income test strict (RSA 167:79 III(e)).

The squash commit takes the title. One option: "Fix New Hampshire FANF earned income disregards (50% for recipients and every benefit, 20% only for the applicant test) and require net income below the payment standard."

Verified

  • He-W 654.13 (consolidated He-W 600 page, and the same text in the #14518 Initial Proposal):

    • (b): "For applicants who have not received FANF financial assistance in any one of the previous 6 months, the EID shall be 20%".
    • (c)(1): the 20% EID is "Used to determine eligibility for applicants".
    • (d): "If a financial assistance applicant is determined eligible after applying the 20% EID … the benefit amount shall be determined using a 50% EID".
    • (e)(1)–(3): 50% for "The eligibility and the benefit amount for current FANF financial assistance recipients", for applicants with receipt in the previous 6 months, and for "The benefit amount for applicants who are determined eligible as described in (d)".

    The code follows this:

    • The test uses 20% for units that aren't enrolled and 50% for enrolled units.
    • The benefit uses 50% for every eligible unit.
    • is_tanf_enrolled stands in for (e)(2), and the code says so.
  • Order of operations (He-W 654.02(b)): "(2) … the earned income disregard (EID) … 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". Both new variables apply the EID, then the child care disregard, then floor at 0 (654.02(a)). Unearned income is added in nh_fanf_countable_income_for_eligibility, per (b)(5).

  • Strict income test. Three sources say "less than":

    • RSA 167:79 III(e): "The assistance group's net income shall be less than the payment standard for the assistance group size".
    • He-W 670.03(b)(1): "If the assistance group is found eligible and the net income amount is less than the payment standard".
    • FAM 611.01, read through search excerpts because the DHHS site returns 403: "if net income is less than the payment standard, the AG is income-eligible". It describes the applicant test with the 20% disregard for those without receipt in the previous 6 months.

    He-W 654.02(b)(8) only says net income "shall be compared to" the payment standard. The sources agree, so there is nothing for the source-conflict register.

  • Strict test and benefits. The < test changes a result only at exact equality.

    • Before the PR, a unit at equality got $0 anyway.
    • With the 50% applicant benefit, a new applicant at equality would otherwise get a positive benefit. At $1,277.50 a month, the test gives 1,022 and the benefit 1,022 − 638.75 = 383.25. Case 19 pins this.
  • Hand-checked expectations. I checked every new or changed one. Payment standards: 0.6 × 20,440 / 12 = 1,022; 0.6 × 25,820 / 12 = 1,291; 0.6 × 31,200 / 12 = 1,560 (2024); 0.6 × 26,650 / 12 = 1,332.50 (2025).

    • integration.yaml:
      • Case 2: test 1,000 × 0.8 = 800 (earned and total), below 1,022. Benefit income 500, so 1,022 − 500 = 522.
      • Case 3: 3,000 × 0.8 = 2,400, which is above 1,022, so ineligible and 0.
      • Case 6: test 640 + 200 = 840, below 1,560. Benefit income 400 + 200 = 600, so the benefit is 960.
      • Case 11: child care min(500, 200 + 175) = 375. Test 1,600 − 375 = 1,225, below 1,291. Benefit income 1,000 − 375 = 625, so the benefit is 666.
      • Case 13: test 800, benefit income 500, benefit 791.
      • Case 14: 800, 500, 522.
      • Case 15 (enrolled): test 500, benefit income 500, benefit 522.
      • Case 17 (enrolled): test 2,700 × 0.5 = 1,350, which is above 1,332.50, so ineligible and 0.
      • Case 18: test 1,500 × 0.8 = 1,200, which is above 1,022, so ineligible. The benefit income of 750 is still computed, and nh_fanf is 0.
      • Case 19: 15,330 / 12 = 1,277.50 and × 0.8 = 1,022, not below 1,022, so ineligible and 0.
      • Case 20: 15,300 / 12 = 1,275 and × 0.8 = 1,020, below 1,022. Benefit income 637.50, so the benefit is 384.50 (He-W 670.03 rounding aside, Suggestion 1).
    • nh_fanf_countable_earned_income.yaml:
      • Case 2: 1,000 × 0.5 = 500.
      • Case 4: 2,000 × 0.5 = 1,000, and the full-time age-3 cap is 200 against expenses of 300, so 800.
      • Case 6: 0 (above).
    • nh_fanf_countable_earned_income_for_eligibility.yaml:
      • Case 1: 0.
      • Case 2: 800.
      • Case 3: 500.
      • Case 4: 1,600 − 200 = 1,400.
      • Case 5: 80 − 100 → 0.
    • nh_fanf_countable_income_for_eligibility.yaml: 640 + 200 = 840.
    • nh_fanf_income_eligible.yaml:
      • Case 3: 753 is not below 753, so false.
      • Case 5: test income 800 is above 753, so false, although the benefit income of 500 is below it.
    • nh_fanf_eligible.yaml: Cases 5–8 only rename the input to nh_fanf_countable_income_for_eligibility: 0, and their outputs are unchanged.

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

  • Code patterns.

    • Both new variables are float, use StateCode.NH, read MONTH periods and choose rates with where on a boolean, so they are vectorized.
    • No hard-coded values.
    • No new state-gated int or enum variable is used as a parameter or breakdown key, so the NH Add New Hampshire state supplementation for 2026 #10156 pattern doesn't apply. is_tanf_enrolled is a federal boolean used only in where.
    • The new variables follow the _for_eligibility naming of Indiana TANF, Michigan FIP and Minnesota MFIP.
  • Callers. At the head:

    • Outside the NH FANF folder, nothing reads nh_fanf_countable_earned_income, nh_fanf_countable_income or the two new variables.
    • Inside it, nh_fanf still reads the benefit income, and nh_fanf_income_eligible reads the eligibility income.
    • No test outside the folder references nh_fanf*.
  • Main-side guards. I checked them statically. The branch is 0 behind, so the head is the merged tree.

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

    • I matched every comment line in the PR's changed variable and parameter files at the head against CONFLICT_COMMENT_RE, and none matches.
    • No NH file is in KNOWN_UNMARKED.
    • The test YAMLs are outside the scanned roots.
    • PR validation passed at this head.
  • Changelog. changelog.d/fix-9984-nh-fanf-recipient-disregard.fixed.md is top-level with type fixed. It now covers all three changes.

  • References. Each new reference opens the cited text:

    • He-W 600 (HTML, no anchor);
    • the one-page Initial Proposal (#page=1);
    • Register No. 10 file page 6, which lists #14518;
    • the current FAM 603.01 page;
    • RSA 167:79;
    • FAM 611.01 (403 to automated requests; text confirmed through search excerpts).

    There are no page lists in hrefs and no page text in titles.

  • PR body.

  • Partner tests. No file under policyengine_us/tests/policy/baseline/partners/** changed, and Household API Partners passes.

Axiom line assessment

axiom: TheAxiomFoundation/rulespec-us#1945 queued is valid. Issue #1945 was created 2026-10-27 and is OPEN with the pe-parity label. It is dispatch-ready on the rulespec-us#1467 model:

  • Module path: us-nh/regulations/he-w-600/He-W 654/13.yaml.
  • Corpus status: He-W 600 is in no manifest and needs ingest, shared with California CARE Eligibility #1769. FAM 603.01 is already in the corpus.
  • Law: the verbatim text of He-W 654.13(a)–(f), He-W 654.02(b)(1)–(4) and FAM 603.01, with the #14518 readoption.
  • Required outputs: the eligibility and benefit EID rates and amounts by applicant status, each mapped to the PE variables.
  • Companion tests: six cases from the rule text, including the round-1 pair (a recipient with $1,500 → 750 and 750; a new applicant with $1,000 → 800 for eligibility and 500 for the benefit) and the 3-month and 7-month re-applicants.
  • Warning and gaps: it warns against copying PolicyEngine main output, and lists the gaps (the 6-month look-back, per individual versus per AG, the pilot, the EED).
  • Blockers: He-W 600 ingest, and an encoder run that has no approval yet. That satisfies the queued condition.

It matches the head:

  • It describes the current variables, parameters, the strict < test and the test counts (5, 7, 5 and 20).
  • It names head 4f594f46e0. The only later commit is the clean merge of main, which leaves all NH files unchanged (empty diff).
  • The strict income test (RSA 167:79 III(e)) appears as an optional integration check, not a module. That's reasonable, since rulespec-us has no RSA 167 module that the change could leave wrong.

The only fix needed is that row's 384.50, which should be 384 (Suggestion 1).

CI status

Status at the last gh pr checks 10251 (run 40551602312 on fcc84b6035, 17:57 UTC): 19 pass, 1 fails, 6 pending.

Passed (19):

  • Quick Feedback (Selective Tests + Coverage). Its log shows the whole NH FANF folder passing at this head, including both new test files: integration 20/20, nh_fanf_countable_earned_income_for_eligibility 5/5, nh_fanf_income_eligible 5/5 and nh_fanf_eligible 8/8.
  • Baseline: states-shard-1, states-shard-3, household, irs, reform, rest-a, rest-b, ssa-usda and contrib-hhs.
  • Household API Partners.
  • PR validation (lock, guard tests, lint, changelog).
  • Package and compatibility.
  • Rest Python shards 4 and 6, and Plan Rest Python shards.
  • codecov/patch and codecov/project.

Failed (1): Rest (Python shard 3). This is main-caused, so it's a CI note, not a finding. The job log shows 1 failed, 1945 passed. The one failure is policyengine_us/tests/core/test_social_security_input_state_machine.py::TestSocialSecurityInputStateMachine::runTest, raised in policyengine-core's simulation_builder.py:347: "NameError: name 'operator' is not defined". Main's own push run 40546990445 at the same commit (4c65c821, this branch's merge base) fails identically. The PR doesn't touch that test or any Social Security input. The "Check Rest Python shards" aggregator will fail with it for the same reason.

The earlier known failure, test_mt_state_agi_invariants, doesn't appear: the branch includes its fix, #10496.

Pending (6):

  • Baseline states-shard-2 and states-shard-4
  • Microsimulation
  • Rest Python shards 1, 2 and 5

The NH FANF tests have already passed in Quick Feedback and locally (51 cases).

Branch status

The branch is 3 commits on top of round 1 (two fixes and a merge of main) and 0 behind main. Main is 4c65c82191, which is the merge base.

Verdict: APPROVE

@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.

Approving round 2: 0 critical, 0 should. Full report in the comment above. CI note: the Rest shard 3 failure (test_social_security_input_state_machine, NameError 'operator') also fails on main's own push run.

The income test is strict since 4f594f4 (RSA 167:79 III(e)), so the
eligibility comments in Cases 2, 6, 11, 13 and 14 now say "<" to match
Cases 19 and 20. Comments only; no expected value changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@PavelMakarchuk PavelMakarchuk changed the title Keep New Hampshire FANF's recipient earned income disregard at 50% Fix New Hampshire FANF earned income disregards (50% for recipients and every benefit, 20% only for the applicant test) and require net income below the payment standard Oct 27, 2026
@PavelMakarchuk

Copy link
Copy Markdown
Collaborator Author

@DTrim99 thank you for round 2. The suggestions:

  1. He-W 670.03(b) grant rounding and the $10 minimum: not changed in this PR yet. The gap is older than this PR, and Pavel will decide whether it goes in a follow-up PR or here. I corrected rulespec-us#1945: its Case 20 row now gives the $384 grant under He-W 670.03(b)(3) and warns not to copy PolicyEngine's 384.50.
  2. <= in test comments: fixed in 38ce9bc. Integration Cases 2, 6, 11, 13 and 14 now say <. Comments only; no expected values changed.
  3. Title: fixed. The title now reads "Fix New Hampshire FANF earned income disregards (50% for recipients and every benefit, 20% only for the applicant test) and require net income below the payment standard".

CI: the only failure is Rest (Python shard 3), test_social_security_input_state_machine with NameError: name 'operator' is not defined in policyengine-core's simulation_builder.py:347. Main's push run 40546990445 at the merge base 4c65c82191 fails the same way, so this PR cannot fix it.

@hua7450 hua7450 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.

Reviewed the ordinary FANF disregard and eligibility corrections in #9984. The separate applicant test and benefit calculations, general 50% rate, and strict income boundary are supported. Approving this scoped fix.

@PavelMakarchuk
PavelMakarchuk merged commit aa0b2f9 into main Oct 27, 2026
35 checks passed
@PavelMakarchuk
PavelMakarchuk deleted the fix-9984-nh-fanf-recipient-disregard branch October 27, 2026 23:37
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%

3 participants