Skip to content

Add North Carolina state supplementation for 2026 - #10160

Merged
hua7450 merged 8 commits into
mainfrom
nc-ssp-2026
Oct 16, 2026
Merged

hua7450 merged 8 commits into
mainfrom
nc-ssp-2026

Conversation

@hua7450

@hua7450 hua7450 commented Oct 12, 2026 •

Copy link
Copy Markdown
Collaborator

What and why

North Carolina's State-County Special Assistance (SA) was missing from PolicyEngine-US. Add nc_sa for 2026 under G.S. 108A-41 and 108A-42.1 and the SA and SA In-Home manuals. It covers the basic rate (adult care homes and SA In-Home) and the enhanced rate (special care units and enhanced in-home cases).

North Carolina administers SA itself, so the payment follows the manual's own budget. That budget is the maintenance amount (rate plus the $70 personal needs allowance) less total countable monthly income (TCMI), rounded to the nearest dollar.

  • Rates: $1,397 basic and $1,792 enhanced from January 1, 2026.
    • G.S. 108A-42.1 adjusts both each January by the Social Security COLA; the model applies it through gov.ssa.uprating.
    • Later years are projections until DHHS publishes the rates.
  • Income test: an applicant is ineligible when the rounded payment is $0 (SA-3220 III.C).
    • With a lower contracted rate, the test uses the rate the facility actually charges (II.A).
    • This reproduces the published $1,466.51 and $1,861.51 cutoffs.
    • A code NOTE records the different wording of G.S. 108A-41(b)(2).
  • Countable income:
    • A budget unit of one, with the SSI-style exclusions that SA-3210 IV restates.
    • Facility residents on an individual claim are budgeted at the full FBR. A couple's SSI and an in-home one-third reduction are kept (SA-3210 V.D.1.e).
  • Who qualifies:
    • The person is in an approved setting (nc_sa_care_setting).
    • The person is aged, a disabled or blind adult, or a blind child in a specialized facility (SA-3100).
    • The person receives SSI, or is ineligible for SSI solely because of income (SA-3100 I, II.A.6). An applicant over income for SSI is tested on own resources up to $2,000 (SA-3200 I) and needn't apply for SSI.
    • An applicant whose income would qualify for SSI must receive it; an SSI denial on resources also denies SA (SA-3110 V.K).
    • Inmates are excluded (SA-3100 II.A.5).
  • First month and contracted rates:
    • nc_sa_partial_month_days prorates the rate without deducting income (SA-3220 IV.A).
    • nc_sa_facility_rate enters a lower contracted rate.
    • Both default to 0 (a full month at the published rate), so entering them for one resident leaves other household members unchanged.
  • Spouses living apart: enter them in separate marital units from the month after they stop living together. This is documented on nc_sa_care_setting.

SA is added to the household and SPM benefit totals, and to SNAP and North Carolina LIEAP unearned income (FNS 300.02; SA-5400 II). HUD counts facility SA but not SA In-Home (SA-5400 III), through nc_sa_countable_for_hud.

References

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

Coverage limits

The registry marks North Carolina as partial, verified for 2026.

Not modeled:

  • open/shut and discharge payments;
  • the first two months after admission, when a one-third-reduced SSI may still be budgeted (SA-3210 V.B.1.b).

Earlier years use parameter backfilling and are unverified historical estimates; no historical rate coverage is claimed.

Related:

Test plan

  • 75 North Carolina SA YAML cases (39 in nc_sa.yaml, 9 each in integration.yaml and nc_sa_eligible.yaml, 7 in nc_sa_rate.yaml, 6 in nc_sa_countable_for_hud.yaml and 5 in nc_sa_countable_income.yaml), plus North Carolina LIEAP integration Case 10. They cover:
    • each setting and rate, the rounding cutoffs and lower contracted rates;
    • first-month proration and the age, blindness, resource, immigration and inmate rules;
    • applicants over income for SSI, an SSI denial on a spouse's resources, couples and spouses living apart;
    • the 2027 COLA projection;
    • annual, SNAP, HUD, LIEAP and spm_unit_benefits integration.
  • After merging main: all 258 North Carolina DHHS cases (SA, LIEAP, SCCA and TANF) and 243 federal SSI cases pass locally, and the aggregate list integrity and program registry tests pass (677 passed, 10 skipped).
  • ruff format and git diff --check.
  • Changelog fragment in changelog.d/.

axiom: N.C.G.S. 108A-41(b), 108A-42.1; NC SA Manual SA-3100 I–II, SA-3110 V.K, SA-3200 I, SA-3210 IV–V, SA-3220 II–IV; SAIH Manual SA-5300, SA-5400 TheAxiomFoundation/rulespec-us#1779 queued

hua7450 and others added 3 commits October 12, 2026 14:21
…cutoff and tests

- Apply the applicant-only $2,000 resource test to non-SSI applicants (budget unit of one)
- Gate SSI receipt on (ssi > 0) | receives_ssi
- Compare the income cutoff at cent precision instead of a float32 step
- Registry placement and comments, SNAP title, revert shared HUD metadata, shorter programs.yaml note
- Special Assistance HUD helper label and SAIH/24 CFR 5.609(b)(12)(ii) references; page anchors
- Realistic households, trimmed cutoff cases, per-variable tests and intermediate outputs

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
@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 North Carolina state supplementation for 2026

PR #10160 (author: hua7450, head 223fe3fd77, merge-base 2e9eea7e6e). 24 files (+1,275/−4), 3 commits.

Summary

The PR adds North Carolina's State-County Special Assistance (SA). It is a state-administered optional supplement that counties run under N.C.G.S. 108A-40 et seq., and it covers adult care homes (basic rate), special care units (enhanced rate) and SA In-Home (SAIH):

  • Parameters under gov.states.nc.dhhs.sa:
    • rate.basic $1,397 and rate.enhanced $1,792 (2026-01-01)
    • personal_needs_allowance $70 (2022-01-01)
    • income_limit.basic $1,466.51 and .enhanced $1,861.51, exclusive cutoffs (2026-01-01)
    • minimum_adult_age 18
  • Variables (all Person, MONTH):
    • nc_sa_care_setting: an enum input that defaults to NONE (adult care home, special care unit, in-home basic, in-home enhanced).
    • nc_sa_facility_rate: defaults to the published rate, and a lower contracted rate can be entered. It is capped at the published rate and used only for facilities.
    • nc_sa_days_eligible: defaults to the days in the month. A smaller value triggers the first-month proration.
    • nc_sa_countable_income (TCMI): the person's own income after SSI-style exclusions, plus ssi. Facility residents on an individual claim are budgeted at the full FBR.
    • nc_sa_eligible: setting, age or blindness, SSI receipt or the non-SSI test (aged, blind or disabled; citizen or SSI-qualified noncitizen; own resources ≤ $2,000), the cent-precise TCMI cutoff, and SSI take-up.
    • nc_sa: the full month is round-half-up(rate + $70 − TCMI). A partial month is round-half-up(round2(rate ÷ days) × eligible days + $70), with no income deducted.
    • nc_sa_countable_for_hud: zero for SAIH, otherwise nc_sa.
  • Aggregates and registry:
    • nc_sa is added to household_state_benefits (all four year blocks), spm_unit_benefits and SNAP unearned income.
    • nc_sa_countable_for_hud is added to HUD unearned income.
    • There is a programs.yaml entry (partial, verified_years: '2026').
  • Tests: 59 YAML cases across five files.

The 2026 policy content is right:

  • Amounts. $1,397 / $1,792, the $1,467 / $1,862 maintenance amounts, the $70 personal needs allowance and the $1,466.51 / $1,861.51 cutoffs match change notice EFS-SA-CN-01-2026 and SA-3220 II. The 2026 rates are also the G.S. 108A-42.1 base amounts carried forward by each year's COLA.
  • Formulas. The budget, rounding and partial-month formulas reproduce every worked example in SA-3220 III–VI and SA-5300 IV that the model covers.
  • Income rules. The budget unit of one, the SSI-style exclusions and the FBR-budgeting rule with its couple and SAIH one-third-reduction exceptions follow SA-3210 IV–V.
  • Tests. All 59 expectations check by hand and pass at the head.
  • CI and branch. CI is green, and the branch merges cleanly with main.

Three should-fix items remain:

  1. The axiom: needed line isn't valid for a staff PR that adds a program. This is the same finding as in the sibling reviews.
  2. One parameter description lacks the "under the ... program" clause, and the other six shorten the program name to "its Special Assistance program".
  3. North Carolina LIEAP doesn't count SA, though SA-5400 II and the FNS income chart that LIEAP adopts both say it is countable. A probe shows an SAIH household's LIEAP payment overstated by $100.

Critical (must fix)

None.

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. CLAUDE.md, "Axiom Parity":
    • "Put one line in the PR body: axiom: <legal id> encoded-correct | <rulespec PR> encoded | <rulespec issue> queued | n/a: <reason>."
    • needed is reserved for external contributors ("If you are an external contributor and cannot complete the Axiom work, use axiom: needed"), 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-nc/ holds only statutes/105/ (income tax), regulations/10a-ncac/71u, policies/dhhs/fns, policies/cms and policies/income_tax. There is no Chapter 108A module and no Special Assistance manual module.
    • Issue searches for "North Carolina Special Assistance", "Special Assistance", "State-County Special Assistance", "108A-41", "108A-42.1", "North Carolina SSP" and "North Carolina supplement" find no SA issue. The NC pe-parity issues cover tax, school meals and LIEAP (Colorado Old Age Pension #1466).
  • 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: N.C.G.S. 108A-41(b), 108A-42.1; NC SA Manual SA-3200 I, SA-3210 IV–V, SA-3220 II–IV; SAIH Manual SA-5300 TheAxiomFoundation/rulespec-us#NNNN queued. The issue needs:
    • Module paths, following the existing us-nc/statutes/105/105-153.5 and us-nc/policies/dhhs/fns/... layout. For example:

      • us-nc/statutes/108a/108a-41.yaml for eligibility and the (b)(2) income limits
      • us-nc/statutes/108a/108a-42.1.yaml for the rates and the COLA indexing
      • us-nc/policies/dhhs/special-assistance-manual/sa-3200-resources.yaml, sa-3210-income.yaml and sa-3220-budgeting-principles.yaml
      • us-nc/policies/dhhs/special-assistance-in-home-manual/sa-5300-calculation-of-payments.yaml
    • Corpus citations, plus the blocker if the manuals aren't in the corpus yet.

    • Verbatim law: the passages quoted under Verified correct.

    • Required outputs (Person, monthly):

      • Money parameters: the basic rate ($1,397), the enhanced rate ($1,792) and the personal needs allowance ($70).
      • A Judgment for eligibility: an approved facility or in-home setting, AND (age 65 or over, OR 18–64 and disabled or blind, OR under 18 and blind in a facility), AND (SSI recipient OR (meets SSI's non-income rules AND own resources ≤ $2,000)), AND the rounded payment is at least $1.
      • A Money output for the full month: round-half-up(min(actual rate, maximum rate) + $70 − TCMI).
      • A Money output for a partial month: round-half-up(round2(rate ÷ days in month) × eligible days + $70).
    • Companion tests taken from the manuals' own worked examples, not PolicyEngine output:

      Source Case SA
      SA-3220 III.B Ex. 1 maintenance 1,467, TCMI 995.47 472
      SA-3220 III.B Ex. 4 rate 1,000, TCMI 997.47 73
      SA-3220 IV.B basic, 27 of 31 days 1,287
      SA-3220 IV.C enhanced, 27 of 31 days 1,631
      SA-3220 VI.B Step 1 basic, 21 of 30 days 1,048
      SA-5300 IV.B SSI recipient TCMI 994 / non-SSI TCMI 999.75 473 / 467
      SA-5300 IV.C basic 20 days / enhanced 14 days 971 / 879
      SA-3220 II.E.3 TCMI 1,466.51 ineligible

2. The parameter descriptions don't follow the house template.

  • Where (line 1 of each file under parameters/gov/states/nc/dhhs/sa/):
    • minimum_adult_age.yaml: "North Carolina requires disabled Special Assistance applicants and in-home participants to be at least this age." It has no "under the ... program" clause.
    • rate/basic.yaml and rate/enhanced.yaml: "North Carolina pays up to this monthly basic [enhanced] rate before the personal needs allowance and income deductions under its Special Assistance program."
    • personal_needs_allowance.yaml: "... under its Special Assistance program."
    • income_limit/basic.yaml and income_limit/enhanced.yaml: "North Carolina requires monthly countable income below this threshold for the basic [enhanced] rate under its Special Assistance program."
  • The template. The parameter-patterns skill asks for "one sentence, spell the program out fully (no acronyms), [State] [verb] ... under the [Full Program Name] program."
    • The statute names the program the "State‑County Special Assistance Program" (G.S. 108A-40). The PR's own label and changelog say "State and County Special Assistance".
    • "its Special Assistance program" is neither the full name nor the template's "under the ..." form.
  • Precedent. The siblings on main follow the template. ga/dhs/ssp/amount.yaml: "Georgia provides this amount as the monthly supplement under the State Supplementary Payment program." ks/kdhe/sspp/payment/amount.yaml: "Kansas provides this amount as the monthly cash payment under the State Supplemental Payment Program." The sibling reviews flagged the same gap as a should-fix item.
  • Fix, for example:
    • rate/basic.yaml: "North Carolina provides this amount as the maximum monthly basic rate under the State-County Special Assistance program."
    • rate/enhanced.yaml: "North Carolina provides this amount as the maximum monthly enhanced rate for special care units and in-home recipients with Alzheimer's disease or dementia under the State-County Special Assistance program."
    • personal_needs_allowance.yaml: "North Carolina provides this amount as the monthly personal needs allowance under the State-County Special Assistance program."
    • income_limit/basic.yaml: "North Carolina limits total countable monthly income to below this amount for the basic rate under the State-County Special Assistance program." Use "enhanced rate" in income_limit/enhanced.yaml.
    • minimum_adult_age.yaml: "North Carolina sets this age as the minimum for disabled and in-home applicants under the State-County Special Assistance program."

3. North Carolina LIEAP doesn't count Special Assistance.

  • Where: policyengine_us/parameters/gov/states/nc/ncdhhs/lieap/unearned_income_sources.yaml:3-44. The list counts ssi but not nc_sa, and nc_lieap_gross_income_person.py:23 sums that list.

  • The rules.

    • SAIH Manual SA-5400 II (PDF p. 47): "The SAIH payment is countable unearned income when determining eligibility for Energy Programs and may affect a beneficiary's eligibility for Energy Assistance."
    • Energy Programs Manual EP-300.09 A (PDF p. 10): "Refer to the following Food and Nutrition Services Manual sections for types of income to count ... FNS 300 Sources of Income". The LIEAP list's own comment cites this: "Section 300.09 A takes the types of income to count from the FNS manual."
    • The FNS 300.02 chart (PDF p. 20) row "Special Assistance (SA)" covers "State-County Special Assistance for Adults (SA) ... The SA In-Home Program ... This also include SA for the Certain Disabled". It is marked "Y" (countable) and "U" (unearned).
    • The PR already applies the same chart to SNAP by adding nc_sa to the SNAP unearned list. The LIEAP list, which is built from that chart, was missed.
  • Probe at the head (2026, aged single SAIH recipient, electric heat, nc_sa appended to the LIEAP list in a scratch reform):

    Household LIEAP income nc_lieap
    Basic SAIH, SSI only (SA $5,676 a year) 10,908 → 16,584 400 → 300
    Enhanced SAIH, SSI only (SA $10,416) 10,908 → 21,324 400 → 300
    Basic SAIH, SSI one-third reduced 6,932 → 16,580 400 → 300
    Basic SAIH, $700 Social Security 11,148 → 16,824 400 → 300
  • Fix: add - nc_sa to the LIEAP list. Cite the FNS 300.02 "Special Assistance (SA)" row (p. 20) in its comment block, and add an integration case: a basic SAIH single with electric heat gets nc_lieap: 300.

Suggestions

  1. Rates before 2026, and the COLA indexing after it (deferral documented: "Parameter backfilling does not establish verified historical coverage"; "Related: North Carolina SSP 2017, 2018, 2019 #8695").
    • The statute indexes the rates. G.S. 108A-42.1:

      • "(a) Basic Rate. – The maximum monthly rate ... is one thousand two hundred eighty‑five dollars ($1,285) per month per resident. This rate shall be adjusted on January 1, 2024, and each January 1 thereafter, using the federally approved Social Security cost‑of‑living adjustment effective for the applicable year."
      • (b) gives $1,647 for the enhanced rate, with the same indexing.
      • The chain reproduces the manual's chart (SA-3220 VIII, PDF p. 219): 1,285 × 1.032 = 1,326; × 1.025 = 1,359; × 1.028 = 1,397. For the enhanced rate: 1,647 → 1,700 → 1,743 → 1,792.
    • The personal needs allowance.

      • It has been $70 only since January 1, 2022 (SA-3220 II.C: "The last legislative action ... increasing the monthly personal needs allowance was effective January 1, 2022").
      • Before that it was $46. SSA's January 2011 North Carolina page gives a combined $1,228 basic and $1,561 special care unit, and notes "a $46 personal needs allowance is included". Issue North Carolina SSP 2017, 2018, 2019 #8695 carries the same $1,228 / $1,561 standards for 2017–2019.
    • The leak. Every parameter has a single entry (rate/*.yaml:3, income_limit/*.yaml:3, personal_needs_allowance.yaml:3), so the 2026 maintenance amounts carry back to 2015. Probe at the head, SSI-only resident (January of each year):

      Year FBR Model basic / SCU Law basic / SCU Over by
      2025 967 500 / 895 1,429 − 967 = 462 / 1,813 − 967 = 846 $38 / $49
      2024 943 524 / 919 1,396 − 943 = 453 / 1,770 − 943 = 827 $71 / $92
      2023 914 553 / 948 1,355 − 914 = 441 / 1,717 − 914 = 803 $112 / $145
      2015–2021 733–794 1,467 − FBR 1,228 − FBR $239
      • The PR wires nc_sa into the 2023–2025 household_state_benefits blocks, so these values reach the aggregates. For example, 2025 gives $6,000 a year against $5,544.
      • The 2023 figures assume the statute's base amounts were the rates in force for all of 2023. Confirm the effective date when backfilling.
    • Going forward. From 2027 the rate stays at $1,397 while the FBR rises. At the head, 2027-01 gives 445 (1,467 − 1,021.83). The statute's indexing would give about 484: round(1,397 × 1.028) = 1,436, so 1,506 − 1,021.83.

    • Fix:

      • Add 2023–2025 values to both rate files, citing SA-3220 VIII (p. 219) and G.S. 108A-42.1.
      • Add uprating: gov.ssa.uprating, rounded to the nearest dollar, or a comment explaining the freeze.
      • Date the $70 allowance as is, with $46 before 2022.
      • Widen North Carolina SSP 2017, 2018, 2019 #8695 to 2015–2025. It is open with a 2017–2019 scope.
      • Derive the two income_limit files instead of storing them: eligible when round-half-up(rate + allowance − TCMI) ≥ 1, which is SA-3220 III.C's rule. G.S. 108A-41(b)(2)a says TCMI "shall not exceed the basic rate ... plus a personal needs allowance". As stored, the cutoffs must be edited by hand every January alongside the rates.
  2. The Texas rebate reform's copy of spm_unit_benefits now omits nc_sa.
    • Where: policyengine_us/reforms/states/tx/rebate/tx_rebate.py:45-127 redefines spm_unit_benefits nationwide with a hard-coded list. It lacks nc_sa and already lacks ca_state_supplement.
    • Probe at the head: for an NC basic SAIH single in 2027, spm_unit_benefits is 17,902.01 at baseline and 12,562.01 under the reform. The drop is exactly the $5,340 nc_sa. spm_unit_net_income falls by the same amount, and household_net_income is unchanged at 18,552.01.
    • Fix: insert "nc_sa", # North Carolina 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. Write down and pin four readings.
    • (a) An adult care home resident whose spouse lives at home keeps the couple SSI amount.
      • nc_sa_countable_income.py:40-45 restores the FBR only when ssi_claim_is_joint is false. That flag depends only on both spouses being aged, blind or disabled.
      • The rules:
        • SA-3210 V.B.5.a (PDF p. 194) allows couple deeming only "for SA residential facility cases where a couple resides in the same room or SSA views the a/b as a member of a couple".
        • V.E.4.b (p. 198) asks SSA to "reinstate the beneficiary's SSI to FBR", noting "whether the applicant and his/her spouse reside in the same room".
        • 20 CFR 416.1801(c) defines an eligible spouse as one "living in the same household with that person on ... (iii) The first day of the month".
      • Probe at the head (2026-01): two aged spouses with no income, one in an adult care home. SSI is [745.50, 745.50] and nc_sa is [722, 0]. Budgeted at the FBR, the resident gets 1,467 − 994 = 473, so the model pays $249 a month more.
      • The cause is upstream (the federal SSI couple computation), as in Add New York state supplementation for 2026 #10158 Suggestion 6 and Add New Jersey state supplementation for 2026 #10157 Suggestion 3.
      • Fix: treat a facility resident as an individual claim when the spouse's nc_sa_care_setting isn't the same facility type, or state the limitation in the line-37 comment and pin the probe.
    • (b) The SSI take-up gate also blocks applicants who are over income for SSI.
      • nc_sa_eligible.py:61 requires takes_up_ssi_if_eligible for everyone.
      • SA-3210 V.A.4 (p. 191): "If the a/b currently has income at or above the FBR, a referral to SSA to apply for SSI is not required."
      • Probe: an aged resident with $1,300 a month of Social Security gets nc_sa 187 with take-up and 0 without.
      • Fix: apply the gate only when own TCMI is below the FBR, or comment that it doubles as an SA take-up proxy.
    • (c) A lower contracted rate in a partial month.
      • Probe: a $1,000 facility rate and TCMI of $1,100 give nc_sa_eligible true and nc_sa 0 for a full month, but 554 for a 15-day first month.
      • SA-3220 III.C (p. 209): "If an individual's SA payment when rounded to the nearest lower whole dollar is $0.00, the individual is not eligible for Special Assistance." II.A (p. 204) says that with a lower rate "the actual rate charged ... is used in the calculations addressed in this chapter".
      • Whether the cutoff moves with the actual rate is a reading the manual doesn't settle. The derived cutoff in Suggestion 1 would resolve it toward 0.
      • Fix: choose one reading, then document it and pin it.
    • (d) The one-third reduction in a facility's first months.
      • nc_sa_countable_income.yaml Case 3 and integration Case 6 restore the FBR at once.
      • SA-3210 V.B.1.b (p. 192) budgets the reduced SSI "for not more than a two-month period following the a/b's month of admission". It moves to the FBR "beginning the third month".
      • Fix: label both cases as ongoing months.
  4. Gates and wiring that no test covers.
    • Inmates. SA-3100 II.A.5 (PDF p. 6) requires the beneficiary "Not be an inmate in a jail or prison". No formula checks is_incarcerated.
      • Probe: an incarcerated non-SSI applicant with an ADULT_CARE_HOME input and $1,300 of Social Security gets 187.
      • Fix: add ~is_incarcerated to the non-SSI path, or say in the nc_sa_care_setting documentation that a positive setting excludes inmates. Add a case either way.
    • spm_unit_benefits wiring isn't asserted. Integration Case 4 checks household_state_benefits and SNAP, and Case 7 checks HUD. Removing nc_sa from spm_unit_benefits.py would pass every test.
  5. A new nc/dhhs/ folder sits next to the existing nc/ncdhhs/.
    • main keeps North Carolina's DHHS programs under variables/gov/states/nc/ncdhhs/ and parameters/gov/states/nc/ncdhhs/ (lieap, scca, tanf). This PR creates a second agency folder, nc/dhhs/sa.
    • Fix: move the files to nc/ncdhhs/sa, then update parameter_prefix and the test paths. This mirrors Add New Jersey state supplementation for 2026 #10157 Suggestion 5 (NJ).
  6. Polish.
    • Blank lines. The PR adds a stray blank line before metadata: in household_state_benefits.yaml:409 and hud/annual_income/sources/unearned.yaml:33. Neither relates to North Carolina.
    • Case count. The PR body says "42 source-based YAML cases". The PR has 59: 34 in nc_sa.yaml, 7 in integration.yaml, 6 in nc_sa_countable_for_hud.yaml, 5 in nc_sa_countable_income.yaml and 7 in nc_sa_eligible.yaml.
    • Numbering. nc_sa.yaml jumps from Case 32 (line 352) to Cases 36 and 37 (lines 369 and 409).
    • Statutory references.
      • The rate files cite only the manual and the change notice. Add G.S. 108A-42.1.
      • The income-limit files and nc_sa_eligible.py don't cite G.S. 108A-41(b), which sets the age categories and the income limits.
      • minimum_adult_age.yaml's second reference (SAIH p. 14) says "The SAIH option is only available for SAA or SAD" but doesn't print an age.
    • Federal parameters standing in for state rules. nc_sa_eligible.py:37-40 uses gov.ssa.ssi.eligibility.resources.limit.individual, and nc_sa_countable_income.py uses _apply_ssi_exclusions.
      • SA-3200 I states its own "$2000 ... The budget unit is always one", and SA-3210 IV states its own "$20 SA General Income Exclusion" and "$65 Earned Income Exclusion".
      • An SSI reform would move North Carolina's test with it. Consider state parameters, or a comment citing SA-3100 II.C ("non-SSI beneficiaries must meet the eligibility requirements for SSI except for income").

Verified correct

  • Statute.
    • G.S. 108A-41(b):
      • "(1) ... a. Is 65 years of age or older. b. Is between the ages of 18 and 65, and is permanently and totally disabled or is legally blind"
      • "(2) ... a. The total countable monthly income for individuals residing in adult care home facilities or in‑home living arrangements without a diagnosis of Alzheimer's disease or dementia shall not exceed the basic rate ... plus a personal needs allowance"
      • b gives the enhanced rate "for individuals residing in special care units or in‑home living arrangements with a diagnosis of Alzheimer's disease or dementia"
      • "(3) ... A resident of North Carolina for at least 90 days"
    • G.S. 108A-47.1, the old in-home section, was "Repealed by Session Laws 2021‑180, s. 9A.3A(b), effective January 1, 2023". In-home recipients now share the facility limits. SA-5400 IV's "maximum income level for SAIH (100% federal poverty guideline)" is legacy text. The SA-5400 V poverty test applies only to spousal-income SSI denials, where TCMI is below the $994 FBR and so always below the poverty guideline.
    • Blind children. SA-3100 II.A.1 and III.C.3 (PDF pp. 6, 10) admit "an individual who is under 18 and is legally blind" who resides "in a specialized community residential center". The code follows the manual (Cases 15–17). The statute's (b)(1) lists only the adult categories.
  • 2026 amounts.
    • EFS-SA-CN-01-2026, PDF p. 1, effective January 1, 2026:
      • "Effective January 1, 2026, the monthly Basic Rate for Special Assistance is $1,397.00, and the Basic Maintenance Amount is $1,467.00."
      • The same sentence gives "$1,792.00" and "$1,862.00" for the enhanced rate.
      • "The new Federal Benefit Rate (FBR) for 2026 is $994".
    • SA-3220 II (PDF pp. 204–207):
      • "The current SA Basic rate, effective January 1, 2026, is $1,397", and "The current Enhanced rate, effective January 1, 2026, is $1,792".
      • "A $70 personal needs allowance is added to the monthly rate for all SA recipients in SA facilities".
      • "For the SA Basic rate, if the a/b's TCMI is $1,466.51 or more, the a/b is not eligible", with "$1,861.51 or more" for the enhanced rate.
    • SAIH Manual SA-5300 II and IV.A (PDF pp. 40–41) give the same $1,467 / $1,862 maximums ("the SA Basic rate of $1,397 + $70 personal needs allowance") and the same cutoffs. So the in-home path's use of the published rate plus $70 is right.
  • Payment formula and rounding.
    • SA-3220 III.A (p. 207): "The monthly SA payment amount is determined by deducting the TCMI from the Maintenance Amount", and "always round to the nearest dollar: reduce values $0.01 through $0.49 to the next lower whole dollar amount. Raise values $0.50 through $0.99 to the next higher".
    • np.floor(x + 0.5) matches (Cases 8 and 10 give 1; Cases 9 and 11 give 0).
    • Lower rate. II.A says "the actual rate charged to the recipient ... is used". The min_(facility_rate, published) cap reproduces III.B Example 4 (1,070 − 997.47 → 73).
  • Partial months.
    • SA-3220 IV.A (pp. 209–210): "The applicant's income for the month of entry is not counted"; "Divide the monthly SA rate by the number of days in the month of entry to determine per diem rate (Round to the nearest hundredth)"; "Add personal needs allowance ($70.00)"; "Round amount to the nearest dollar".
    • SAIH SA-5300 IV.C (pp. 42–43) is the same.
    • SA-3100 IV.C.2 (p. 11): "include the full personal needs allowance, but do not count the applicant's income for that month".
    • The model reproduces IV.B (1,287, Case 22), IV.C (1,631), VI.B Step 1 (1,048), and SA-5300 Examples 1 and 2 (971 and 879, Cases 23 and 24).
    • IV.D (a private-pay basic resident ineligible "solely due to income" gets a partial SCU payment only after moving) supports keeping the income test in partial months (Cases 27–32).
  • Income.
    • SA-3220 I (p. 204): "SA is always a budget unit of one. Count only the income of the SA applicant/recipient."
    • SA-3210 IV (pp. 185–189): unearned income less the "$20 SA General Income Exclusion", applied "to unearned income first", then "$65 Earned Income Exclusion", IRWE and "Subtract ½ of the remaining earned income". _apply_ssi_exclusions matches (countable-income Cases 1–2), and the model reproduces SA-5300 IV.B's non-SSI example (999.75 → 467).
    • FBR budgeting. SA-3210 V.D.1.e and 2.d (pp. 195–196) budget the FBR except "(2) When SSA is considering an individual as part of a married couple" and "(3) When SSI is one-third reduced for a private living arrangement and application is for SAIH".
      • The facility restoration for individual claims, the kept couple amount (countable-income Case 5, integration Cases 1–2) and the kept one-third reduction for SAIH (integration Case 5, countable-income Case 4) all match.
    • Ineligible spouse. SA-5400 V (p. 48): "If a beneficiary is denied SSI due to spousal income ... authorize the SAIH payment and calculate the payment amount using countable income. This may result in a larger payment." That supports integration Case 3 (1,467).
  • Resources and categorical eligibility.
    • SA-3200 I (PDF p. 61): "The resource limit is $2000 for an applicant/recipient. The budget unit is always one", and "SSI recipients automatically meet the resource requirements for SA".
    • SA-3100 II.B–C (p. 7): "A current SSI beneficiary automatically meets the categorical and financial requirements for SA"; "non-SSI beneficiaries must meet the eligibility requirements for SSI except for income".
    • The (ssi > 0) | receives_ssi gate, the own-resources test (eligible Cases 2–6) and the SSI-qualified-noncitizen test (Case 7) match.
  • Administration.
    • SSA's January 2011 page: "Administration: State Department of Health and Human Services ... Payments are made under the State/County Special Assistance program."
    • North Carolina is absent from POMS SI 01415.058 A's list of federally administered supplements. So state rounding (nearest dollar), not SSA's, is right.
  • Counted for SNAP; kept out of SSI and HUD.
    • FNS 300.02 p. 20 marks SA "Y / U", and SA-5400 I says "The SAIH payment is countable unearned income when determining eligibility for FNS". So SNAP counts it.
    • SA-5400 V: "SAIH payments are excluded income for SSI purposes". nc_sa isn't in the SSI source lists, so there is no circularity.
    • SA-5400 III: "SAIH payments are excluded as income in the HUD housing assistance programs ... 24 CFR, Section 5.609 (b)(12)(ii)". The current 24 CFR 5.609(b)(12)(ii) excludes "Amounts received by a participant in other publicly assisted programs which are specifically for or in reimbursement of out-of-pocket expenses incurred ... and which are made solely to allow participation in a specific program". nc_sa_countable_for_hud implements the state's reading (HUD Cases 1–6).
    • nc_sa holds only state amounts, so summing it with ssi doesn't double-count.
  • Code:
    • Vectorization. where, min_, max_, clip and np.floor throughout, with no Python branching on arrays.
    • Periods. YEAR stocks and flags (age, is_blind, resources, immigration, ssi_claim_is_joint, take-up) use period.this_year. YEAR flows (ssi_earned_income, ssi_unearned_income) divide to the month. receives_ssi is MONTH. Annual cases sum 12 months (5,676; 16,764).
    • No hard-coded policy values. The literals are rounding and cents constants.
    • References follow CLAUDE.md. Quoted titles end #page 6,10, #page 204,219 and #page 205,219 (nonconsecutive lists are allowed in titles), each href opens the first page, and variable tuples carry # PDF pages ... comments. Every anchor checked shows the cited text: pp. 6, 10, 61, 185, 204, 205, 207, 209 and 219; SAIH pp. 14, 40, 41, 42 and 47; and change-notice p. 1.
    • The StateCode chain (the Add South Dakota state supplementation for 2026 #10169 lesson): nc_sa is defined_for = "nc_sa_eligible", which is defined_for = StateCode.NC, and nc_sa_countable_for_hud is StateCode.NC. test_aggregate_list_integrity.py gives 22 passed at the head, and the Rest job passed in CI.
    • Callers. nc_sa appears only in the lists this PR edits, including all four household_state_benefits blocks. It is missing from tx_rebate.py (Suggestion 2) and the NC LIEAP list (Should 3).
  • Hand checks: all 59 expectations. 2026 FBR $994 / $1,491. Maintenance amounts $1,467 / $1,862. Per diems 1,397 / 31 = 45.06 and 1,792 / 31 = 57.81.
    • nc_sa.yaml:
      • Cases 1–4: 1,467 − 994 = 473; 1,862 − 994 = 868; in-home 473 and 868.
      • Case 5: 15,600 / 12 = 1,300; 1,300 − 20 = 1,280, so no SSI; 1,467 − 1,280 = 187.
      • Case 6: 1,000 − 20 = 980; SSI 14; TCMI 994; 473.
      • Case 7: (600 − 20 − 65) / 2 = 257.50; SSI 736.50; TCMI 994; 473.
      • Cases 8–11: 0.50 rounds to 1; 0.49 gives 0 (ineligible); the enhanced cases are the same.
      • Case 12: 1,070 − 994 = 76.
      • Cases 13–15: NONE, Virginia, and a 17-year-old disabled non-blind applicant each give 0.
      • Case 16: a blind 17-year-old in a facility gets 473. Case 17: in-home, 0.
      • Case 18: age 18, disabled, 473. Case 19: age 64, not disabled, 0.
      • Cases 20–21: resources of 2,000 give 473; 2,001 give 0.
      • Case 22: 45.06 × 27 + 70 = 1,286.62, so 1,287.
      • Case 23: 45.06 × 20 + 70 = 971.20, so 971.
      • Case 24: 57.81 × 14 + 70 = 879.34, so 879.
      • Cases 25–28: 0 days, no take-up, and TCMI 2,980 (partial and full month) each give 0.
      • Case 29: 45.06 × 15 + 70 = 745.90, so 746. Case 30: 0.
      • Case 31: 57.81 × 15 + 70 = 937.15, so 937. Case 32: 0.
      • Case 36:
        • joint SSI resources 3,600 > 3,000, so SSI is 0
        • own TCMI is 1,080 and 880; person1's own 1,800 ≤ 2,000
        • 1,467 − 1,080 = 387
      • Case 37: 1,000 / 31 = 32.26; 32.26 × 15 + 70 = 553.90, so 554.
    • integration.yaml:
      • Case 1: 745.50 each; 1,467 − 745.50 = 721.50, so 722.
      • Case 2: (1,200 − 20) / 2 = 590; 745.50 − 590 = 155.50; 1,311.50, so 1,312.
      • Case 3:
        • deemed (3,787.33 − 85) / 2 = 1,851.17 > 1,491, so SSI is 0
        • own TCMI 0, so 1,467
      • Case 4: 473 × 12 = 5,676; SNAP 11,928 + 5,676 = 17,604.
      • Case 5: 994 × 2/3 = 662.67; 804.33, so 804.
      • Case 6: restored to 994, so 473.
      • Case 7: HUD counts 11,928 + 0.
    • nc_sa_countable_for_hud.yaml:
      • Cases 1–4: 473, 868, 0 and 0.
      • Case 5: SSI 994 − 691 = 303, so 3,636 a year; SA 5,676; HUD 8,532 + 3,636 + 5,676 = 17,844.
      • Case 6: 0.
    • nc_sa_countable_income.yaml:
      • Case 1: 2,068.
      • Case 2: 1,616 + (628.33 − 65) / 2 = 1,897.67.
      • Case 3: 691 + 303 = 994.
      • Case 4: 691.
      • Case 5: (711 + 711 − 20) / 2 = 701; SSI 44.50; 691 + 44.50 = 735.50.
    • nc_sa_eligible.yaml:
      • Case 1: true.
      • Case 2: reported receipt waives the resource test; TCMI is restored to 994.
      • Case 3: spousal resource deeming bars SSI, but own resources are 1,800, so true.
      • Case 4: own resources 2,500, so false.
      • Cases 5–6: resources of 2,000 give true; 2,001 give false.
      • Case 7: undocumented, so false.
  • Changelog: changelog.d/nc-ssp-2026.added.md is top-level, typed added, and accurate.
  • Registry:
    • The programs.yaml entry sits under ssi_state_supplement.state_implementations, after WA, with the batch's fields.
    • partial fits the unmodeled open/shut, discharge and transfer payments. parameter_prefix resolves.
  • SNAP reference. The SNAP list's two 7 CFR 273.9 entries are consolidated into one, which follows the one-entry-per-document rule, as in the siblings.

Batch checks

  1. Axiom line: SHOULD (Should 1). axiom: needed is invalid for a staff PR. rulespec-us has no Chapter 108A or SA manual module and no issue, so a dispatch-ready pe-parity issue and a queued line are needed.
  2. Parameter descriptions: SHOULD (Should 2). minimum_adult_age.yaml has no "under the ... program" clause, and the other six say "under its Special Assistance program" instead of the full name.
  3. Backdating: SUGGESTION (Suggestion 1).
    • The 2026 maintenance amounts leak back: +$38 / $71 / $112 for basic in 2025 / 2024 / 2023, and +$239 for 2015–2021, when the allowance was $46.
    • The rates are frozen after 2026, although G.S. 108A-42.1 indexes them to the COLA.
    • This is a documented deferral; widen North Carolina SSP 2017, 2018, 2019 #8695.
  4. tx_rebate.py copy: SUGGESTION (Suggestion 2). nc_sa is missing; the probe shows −$5,340 in 2027 spm_unit_benefits. ca_state_supplement is still missing too.
  5. Aggregate wiring:
    • Present, with no double count: spm_unit_benefits, all four household_state_benefits blocks, SNAP unearned, HUD unearned (via nc_sa_countable_for_hud, which excludes SAIH per SA-5400 III) and programs.yaml.
    • The NC LIEAP list omits nc_sa, though SA-5400 II and FNS 300.02 count it ($100 per SAIH household; Should 3).
  6. Income attribution:
    • Budget unit of one (SA-3220 I).
    • Couples keep the SSI couple amount in-home and in a shared facility (SA-3210 V.B.5, V.D.1.e).
    • An ineligible spouse's income isn't counted (SA-5400 V).
    • Facility individual claims are budgeted at the FBR.
    • To pin: a facility resident with a spouse at home ($722 vs $473), the take-up gate on over-income applicants, the lower-rate partial month, and the two-month one-third-reduction window (Suggestion 3).
  7. Sibling conflicts (branch note): trial merges with Add Wyoming state supplementation for 2026 #10174, Add South Dakota state supplementation for 2026 #10169 and Add New York state supplementation for 2026 #10158 each conflict in three files: HUD unearned, programs.yaml and spm_unit_benefits.py. This PR doesn't use the shared _ssi_state_supplement helper.
  8. CI: all 26 checks pass on head 223fe3fd77. No failing job.
  9. State law first: done.
    • Read:
      • G.S. 108A-40, 41, 42, 42.1, 43, 45 and 47.1 (repealed)
      • SA Manual (Rev. June 2026): SA-3100 (pp. 6–12), SA-3200 I (pp. 61–63), SA-3210 IV–V (pp. 185–201), SA-3220 (pp. 203–219)
      • SAIH Manual: SA-5200 (pp. 14–23), SA-5300 (pp. 40–44), SA-5400 (pp. 47–48)
      • EFS-SA-CN-01-2026; SSA's January 2011 NC page; FNS 300.02; EP-300.09; 24 CFR 5.609(b)(12); 20 CFR 416.1801(c)
    • Every 2026 amount by setting matches, as do the state administration and the January 1, 2026 effective date.
    • All 59 expectations check by hand. Six more manual examples reproduce at the head.

Axiom line assessment

Invalid (Should 1).

CI status

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

  • The run. Run 38367911619 (pull_request, 2026-10-13 08:14 UTC) on head 223fe3fd77, conclusion success. The Rest job took 1h15m31s and passed, including the aggregate-list guard.
  • Main since then. In the files this PR touches or depends on, main has changed only these, neither of which touches the lines this PR adds:
  • Local run with policyengine-core 3.33.3:
    • the five new YAML files: 59 passed
    • test_aggregate_list_integrity.py: 22 passed
  • Partner tests. The PR touches none, and the Household API Partners job passes.

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.

The 2026 policy is correct: the $1,397/$1,792 rates, $70 PNA and cutoffs match EFS-SA-CN-01-2026 and SA-3220, the budgeting follows SA-3210, every manual worked example reproduces, and all 59 cases check by hand. Three should items (see the comment above): (1) 'axiom: needed' isn't valid for staff, and rulespec-us has no SA module, so file a pe-parity issue and add a queued line; (2) the parameter descriptions are off the template; (3) the NC LIEAP unearned list omits nc_sa, though SA-5400 II and FNS 300.02 count Special Assistance (SAIH singles drop from the $400 band to $300).

hua7450 and others added 2 commits October 15, 2026 14:49
…and LIEAP

- Move the program to nc/ncdhhs/sa next to lieap, scca and tanf.
- Uprate the basic and enhanced rates by the Social Security COLA
  (G.S. 108A-42.1) and derive eligibility from SA-3220 III.C at the rate
  actually used, replacing the stored income limits.
- Make nc_sa_facility_rate and nc_sa_partial_month_days plain inputs
  (0 = published rate / full month) so one person's input no longer
  resets other residents; add nc_sa_rate and nc_sa_full_month_amount.
- Require SSI eligibility unless the applicant is over income for SSI
  (SA-3100 I, II.A.6; SA-3110 V.K), add the inmate gate, and document
  spouses living apart as separate marital units.
- Count nc_sa as unearned income for North Carolina LIEAP (FNS 300.02,
  SA-5400 II).
- Descriptions, references, case names and new cases.

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

hua7450 commented Oct 15, 2026

Copy link
Copy Markdown
Collaborator Author

Thanks, David. The fixes are in 4ddc942, followed by a merge of main (a0bb041).

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

  • your module paths;
  • the verbatim statute and manual sections;
  • the required outputs;
  • your eight manual examples mapped to the cases.

The source conflicts below are in a separate comment on that issue, and the axiom line now points to it.

Should 2 (descriptions): the four remaining parameter files follow the template with the statute's name, "under the State-County Special Assistance program" (G.S. 108A-40). The two income_limit files are gone; see Suggestion 1.

Should 3 (LIEAP): added nc_sa to the North Carolina LIEAP unearned list, citing the FNS 300.02 "Special Assistance (SA)" row and SA-5400 II. New LIEAP integration Case 10 has a basic SA In-Home single on electric heat: income 16,584, nc_lieap 300.

Suggestion 1 (rates and cutoffs): fixed going forward; history stays out of scope.

  • Both rate files uprate with gov.ssa.uprating, rounded to the dollar, under G.S. 108A-42.1. The 2027 projection is 1,436 and 1,842, and a 2027 resident gets 484 instead of 445 (nc_sa.yaml Case 37).
  • I derived the cutoffs instead of storing them: an applicant is eligible only when the rounded full-month payment is at least $1 (SA-3220 III.C), at the rate actually used. That reproduces $1,466.51 and $1,861.51 to the cent, and the income_limit files are deleted.
  • I didn't add 2023–2025 values or the $46 allowance, and didn't widen North Carolina SSP 2017, 2018, 2019 #8695.

Suggestion 2 (Texas rebate copy): #10226 tracks one spm_unit_benefits list that reforms append to, so this PR leaves tx_rebate.py unchanged.

Suggestion 3 (readings):

  • (a) Spouse at home: you're right for months after the month of entry. SSA then treats the spouses as individuals (20 CFR 416.1801(c); POMS SI 00501.154 A.1), so SSI should be 994 each as well. In the month of entry they are still a couple.
    • The nc_sa_care_setting documentation now says to use separate marital units from the month after spouses stop living together. That fixes SSI and SA together; an SA-only formula change would leave SSI at 745.50.
    • Integration Case 8 pins SSI [994, 994] and nc_sa [473, 0].
    • The couple case in nc_sa_countable_income is renamed to a couple sharing a room whom SSA treats as a couple (SA-3210 V.B.5.a).
  • (b) Take-up gate: replaced by the rule it stood in for. SA requires SSI eligibility "or ineligible for SSI solely due to being over income for SSI" (SA-3100 I, II.A.6), so the take-up input no longer matters on its own.
    • An applicant over income for SSI is tested on own resources and needn't apply. nc_sa.yaml Case 38 pins your probe: 187 without take-up.
    • An applicant whose income would qualify must receive SSI, and an SSI denial on other grounds also denies SA (SA-3110 V.K). nc_sa_eligible Case 9 has a spouse whose resources bar SSI: ineligible, although own resources are $1,800.
    • Integration Case 9 pays 1,467 to an applicant denied SSI for deemed spousal income (SA-3210 V.E.4.c, SA-5400 V).
  • (c) Lower contracted rate in a partial month: resolved toward 0 by the III.C test at the actual rate (II.A). nc_sa.yaml Cases 35 and 36 pin your case with a $1,000 rate and Social Security of $1,300 (TCMI 1,280): ineligible, 0 in both the 15-day and the full month. A NOTE in nc_sa_eligible.py records the G.S. 108A-41(b)(2) "shall not exceed" wording, which differs only in a prorated first month.
  • (d) One-third reduction: nc_sa_countable_income Case 3 and integration Case 6 are renamed as ongoing months after the two-month admission window. A comment says the first two months aren't modeled.

Suggestion 4 (gates and wiring):

  • Inmates: nc_sa_eligible now requires ~is_incarcerated (SA-3100 II.A.5), pinned by nc_sa_eligible Case 8.
  • Benefits total: integration Case 4 asserts spm_unit_benefits of 17,895: SSI 11,928 + SA 5,676 + the SNAP minimum of 291.

Suggestion 5 (folder): moved to nc/ncdhhs/sa, next to lieap, scca and tanf, with parameter_prefix updated.

Suggestion 6 (polish):

  • I kept the blank lines before metadata:. They come from our formatting pass and are harmless.
  • The body's case count is now right, and Cases 36 and 37 are renumbered to 33 and 34.
  • The rate files cite G.S. 108A-42.1, and nc_sa_eligible.py cites G.S. 108A-41(b). minimum_adult_age.yaml cites G.S. 108A-41(b)(1) in place of the SAIH page that prints no age.
  • I kept the federal resource limit and exclusions. A comment cites SA-3100 II.C ("except for income"), SA-3200 I and SA-3210 IV, and notes that an SSI reform carries over to SA.

One more fix I found: nc_sa_facility_rate and the partial-month days were both formulas and inputs. Entering either one for one resident reset the other residents to a rate of 0 or 0 days, which dropped their SA from 473 to 0.

  • Both are now plain inputs where 0 means the published rate or a full month. The days input is renamed nc_sa_partial_month_days.
  • A new nc_sa_rate variable gives the rate used.
  • nc_sa.yaml Case 25 pins two residents: [554, 473]. New nc_sa_rate.yaml (7 cases) covers the cap at the published rate and the in-home rule.
  • The partial-month payment now works in whole cents, so a total ending in exactly 50 cents rounds up (Case 39: 952.50 → 953).

On the merged head, these pass locally: all 258 North Carolina DHHS cases (75 SA, plus LIEAP, SCCA and TANF), 243 federal SSI cases, and the aggregate list integrity and program registry tests (677 passed, 10 skipped).

@hua7450
hua7450 requested a review from DTrim99 October 15, 2026 18:55
@DTrim99

DTrim99 commented Oct 15, 2026

Copy link
Copy Markdown
Collaborator

PR Review (round 2): Add North Carolina state supplementation for 2026

PR #10160 (author: hua7450). This round reviews head a0bb041e08; round 1 reviewed 223fe3fd77. Two commits landed in between:

  • 4ddc9420cd, the review-response commit (31 files, +653/−233). It does the following:
    • moves the program to nc/ncdhhs/sa;
    • uprates both rates by the Social Security COLA and derives the income cutoff from SA-3220 III.C instead of storing it;
    • turns the contracted rate and partial-month days into plain inputs (0 means the published rate or a full month), and adds nc_sa_rate and nc_sa_full_month_amount;
    • replaces the SSI take-up gate with the SSI-eligibility rule, and adds the inmate gate;
    • counts nc_sa for North Carolina LIEAP;
    • rewrites the descriptions and adds 16 SA cases and one LIEAP case.
  • A merge of main at 9560e7f183. Its tree (165fcdf9c2) is identical to an automatic merge, so it has no hand edits.

Summary

Ziming fixed all three round-1 should items. The axiom line now points to rulespec-us#1779, which is open, labelled pe-parity, dispatch-ready and consistent with the head. He also acted on every suggestion: he fixed most of them, deferred the Texas rebate copy to #10226, and declined the pre-2026 history and two cosmetic points with reasons.

The changes beyond the asks also check out against G.S. 108A-41 and 108A-42.1 and the SA and SA In-Home manuals:

  • the COLA-indexed rates;
  • the derived cutoff, which reproduces $1,466.51 and $1,861.51 to the cent;
  • the rule that only applicants over income for SSI may skip SSI;
  • the whole-cent proration.

The New Hampshire bug pattern doesn't occur: no North Carolina variable is used as a parameter key, and mixed-state simulations run cleanly. All 75 SA cases and the 10 LIEAP integration cases pass locally and in Quick Feedback. Only small suggestions remain. CI is still running: 17 pass, 10 pending and none failed.

Round-1 findings status

Finding Status Evidence
Should 1: axiom: needed isn't valid for a staff PR that adds a program Fixed The PR body now ends axiom: N.C.G.S. 108A-41(b), 108A-42.1; NC SA Manual SA-3100 I–II, SA-3110 V.K, SA-3200 I, SA-3210 IV–V, SA-3220 II–IV; SAIH Manual SA-5300, SA-5400 TheAxiomFoundation/rulespec-us#1779 queued. #1779 is open, labelled pe-parity, dispatch-ready and consistent with the head. See the Axiom line assessment; Suggestion 1 has one correction.
Should 2: parameter descriptions are off-template Fixed All four remaining files end "under the State-County Special Assistance program", the statute's name (G.S. 108A-40, -42.1). rate/basic.yaml, rate/enhanced.yaml and personal_needs_allowance.yaml use round 1's wording, and minimum_adult_age.yaml reads "North Carolina sets this age as the minimum for disabled and in-home applicants under the State-County Special Assistance program." The two income_limit files are deleted (Suggestion 1).
Should 3: North Carolina LIEAP didn't count Special Assistance Fixed The list. lieap/unearned_income_sources.yaml:13-16 adds nc_sa, with a comment citing the FNS 300.02 "Special Assistance (SA)" row (p. 20) and SA-5400 II. A new reference links SA-5400 II at PDF p. 47: "The SAIH payment is countable unearned income when determining eligibility for Energy Programs". The test. LIEAP integration Case 10 pins round 1's probe: gross income 17,604, LIEAP income 16,584, nc_lieap 300. No double count. nc_sa holds only the state payment and is separate from ssi, social_security and general_assistance in the same list. A mixed North Carolina and Georgia simulation gives nc_lieap [300, 0].
Suggestion 1: rates leaked back to 2015, froze after 2026, and the cutoffs were stored Fixed going forward; history declined with a reason (accepted) Uprating. Both rate files uprate with gov.ssa.uprating, rounded to the dollar, citing G.S. 108A-42.1(a) and (b). This gives 1,436 and 1,842 in 2027 and 1,463 and 1,877 in 2028. Cutoffs. They are derived from SA-3220 III.C at the rate used, and the income_limit files are gone. Declined. The 2024–2025 rates, the 2023 base and the $46 allowance before 2022 are still missing, and #8695 isn't widened. The PR body now says "Earlier years use parameter backfilling and are unverified historical estimates; no historical rate coverage is claimed", so this is a documented deferral. The leak is unchanged: 2025-01 pays 500 / 895 against the law's 462 / 846. See Suggestion 2 for a cheap partial fix.
Suggestion 2: the spm_unit_benefits copy in tx_rebate.py omits nc_sa Declined with a reason (deferred to #10226) #10226 (open) proposes one shared list that reforms append to. At the head, tx_rebate.py still goes from "fl_oss" (line 65) to "ks_sspp" (line 66). This matches the sibling SSP PRs.
Suggestion 3(a): a facility resident whose spouse lives at home kept the couple SSI amount Fixed (documented, as round 1 allowed) The documentation. nc_sa_care_setting now says to put spouses in separate marital units "from the month after they stop living together". That fixes SSI and SA together (20 CFR 416.1801(c)). The tests. Integration Case 8 pins SSI [994, 994] and nc_sa [473, 0]. nc_sa_countable_income.yaml Case 5 is renamed to a couple sharing a room whom SSA treats as a couple (SA-3210 V.B.5.a). #1779 records the shared-room conflict with POMS SI 00501.154 B.
Suggestion 3(b): the take-up gate blocked applicants over income for SSI Fixed (replaced by the rule) See Verified. nc_sa.yaml Case 38 pins round 1's probe: 187 without take-up. nc_sa_eligible.yaml Case 9 denies an applicant whose SSI fails on a spouse's resources (SA-3110 V.K). Integration Case 9 pays 1,467 when deemed spousal income bars SSI (SA-5400 V).
Suggestion 3(c): a lower contracted rate in a partial month Fixed Resolved toward 0 by III.C at the actual rate. nc_sa.yaml Cases 35 and 36 give nc_sa_full_month_amount 0, ineligible, 0 for both the 15-day and the full month. A NOTE in nc_sa_eligible.py records G.S. 108A-41(b)(2)'s "shall not exceed" wording, and #1779 conflict 1 tabulates the two readings.
Suggestion 3(d): the two-month one-third-reduction window Fixed nc_sa_countable_income.yaml Case 3 and integration Case 6 are renamed as ongoing months after the window. nc_sa_countable_income.py:42-44 says the first two months aren't modeled, and the PR body lists that under coverage limits.
Suggestion 4: no inmate gate; spm_unit_benefits wiring unasserted Fixed nc_sa_eligible.py:83 adds ~is_incarcerated (SA-3100 II.A.5, p. 6: "Not be an inmate in a jail or prison"), and nc_sa_eligible.yaml Case 8 pins it. A probe with reported SSI receipt also gives 0. Integration Case 4 asserts spm_unit_benefits: 17_895 (11,928 + 5,676 + the $291 SNAP minimum), so dropping nc_sa from spm_unit_benefits.py now fails a test.
Suggestion 5: a second nc/dhhs agency folder Fixed All variables, parameters and tests are under nc/ncdhhs/sa, next to lieap, scca and tanf, and parameter_prefix is gov.states.nc.ncdhhs.sa. No stale references. At the head, git grep finds no nc/dhhs, nc.dhhs, nc_sa_days_eligible or income_limit.basic/.enhanced, and the tree has no states/nc/dhhs path. The registry test passes, so the prefix resolves.
Suggestion 6: polish Fixed except the blank lines and the federal parameters (both declined with reasons, accepted) Done: the body's case count (75 = 39 + 9 + 9 + 7 + 6 + 5, matching the files); Cases 36 and 37 renumbered to 33 and 34; G.S. 108A-42.1 on the rate files; G.S. 108A-41 on nc_sa_eligible.py; G.S. 108A-41(b)(1) on minimum_adult_age.yaml in place of the SAIH page with no age. Blank lines: the two before metadata: stay, a harmless formatting artifact accepted in every sibling. Federal parameters: kept, with a comment citing SA-3100 II.C ("except for income"), SA-3200 I and SA-3210 IV and noting that an SSI reform carries over. The printed SA figures equal SSI's, so this is acceptable.

New findings

Critical (must fix)

None.

Should address

None.

Suggestions

1. Case 9's comment, and #1779's conflict 6, cite the wrong SSI resource limit.

  • Where: nc_sa_eligible.yaml:184-185: "No income, so SSI would be payable, but 1,800 + 3,500 = 5,300 exceeds the 2,000 limit." #1779's source-conflict comment, item 6, says the same: "SSI counts the spouse's resources (5,300 > 2,000)".
  • The rule. 20 CFR 416.1205(a): "An individual who is living with an ineligible spouse is eligible ... if his or her nonexcludable resources, including the resources of the spouse, do not exceed" the individual-and-spouse limit, which is $3,000 from 1989 under (c).
    • meets_ssi_resource_test applies that couple limit when spousal resource deeming applies.
    • Case 3's comment in the same file says it correctly: "the spouse's 3,500 counts against SSI's 3,000 limit".
  • Effect: none on the result, since 5,300 also exceeds 3,000.
  • Fix:
    • Change "the 2,000 limit" to "the 3,000 limit for an individual living with an ineligible spouse (20 CFR 416.1205(a))", and make the same edit in #1779.
    • Optionally, add "10A NCAC 71P .0603(3)" to the axiom line. nc_sa_eligible.py and #1779 already cite it for the SSI application rule.

2. The 2024 and 2025 rates are on a page the rate files already cite (optional).

  • The page. SA-3220 VIII (PDF p. 219) prints Basic $1,326 (2024) and $1,359 (2025), and Enhanced $1,700 and $1,743. Both rate files cite this page.
  • The fix. Two dated values per file would remove the 2024–2025 leak without new research:
    • Probe at the head: an SSI-only adult care home resident gets 524 in 2024-01 and 500 in 2025-01. The law gives 453 and 462.
    • The aggregates. The PR wires nc_sa into the 2023–2025 household_state_benefits blocks, so these years reach them.
    • The uprating. The values sit before the 2026 entry, so the uprating isn't affected.
  • Why optional. The deferral is documented, the PR claims only 2026, and round 1 treated it as a suggestion. 2023 and the $46 allowance would still need the effective-date check that round 1 described.

3. Pin the manuals' worked examples as cases (optional).

  • The gap. #1779's companion tests A, B, D and E, and F's non-SSI figure, have "No PE case".

  • They reproduce at the head. I ran them as YAML cases:

    Example Inputs nc_sa
    A, SA-3220 III.B Ex. 1 TCMI 995.47 472
    B, III.B Ex. 4 $1,000 rate, TCMI 997.47 73
    D, IV.C special care unit, 27 of 31 days 1,631
    E, VI.B Step 1 basic, 21 of 30 days in September 1,048
    F, SA-5300 IV.B non-SSI, TCMI 999.75 467
  • One harness caveat. Write E like Case 39 (period: 2026 with month-keyed input and output). A period: 2026-09 case returns 0, because the YAML runner doesn't carry the yearly inputs into a non-January month.

  • Why add them. These cases would pin the manual's own figures rather than nearby PolicyEngine cases.

Verified

  • The New Hampshire bug pattern doesn't occur here.

    • The pattern. Add New Hampshire state supplementation for 2026 #10156 failed because a state-gated integer variable with a default of 0 indexed a parameter with no key 0.

    • This PR's North Carolina-gated variables. None is used as a parameter or breakdown key:

      • nc_sa_care_setting (enum, default NONE) is only compared with ==.
      • nc_sa_partial_month_days (int, default 0) is only used in arithmetic and in (days > 0) & (days < period.days).
      • nc_sa_facility_rate (float input, default 0) is compared with 0 and capped.
      • nc_sa_rate, nc_sa_full_month_amount, nc_sa_countable_income, nc_sa_eligible and nc_sa_countable_for_hud are floats or bools.
      • Parameters are read by attribute (rate.basic, rate.enhanced, personal_needs_allowance, minimum_adult_age).
    • Reproduced at the head (policyengine-core 3.32.29; each person has their own units):

      Population (2026) Result
      An adult care home resident in North Carolina, a Virginia resident also given ADULT_CARE_HOME, a $1,000 rate and 15 days, and a Massachusetts single, in one simulation nc_sa_rate [1,397, 0, 0]. nc_sa [473, 0, 0] for January and [5,676, 0, 0] for the year. spm_unit_benefits [17,895, 12,702, 15,429.84] and household_net_income [18,545, 13,353, 15,429.84], each equal to its single-state simulation. 17,895 matches integration Case 4.
      A North Carolina SA In-Home single and a Georgia single, both with electric heat nc_lieap_income [16,584, 0], nc_lieap [300, 0]
      The same North Carolina and Virginia pair as a two-household YAML case passes: nc_sa_rate [1,397, 0], nc_sa_eligible [true, false], nc_sa [473, 0]
    • CI evidence. The jobs that held eight of Add New Hampshire state supplementation for 2026 #10156's nine failures pass on this head: Microsimulation, and Rest (Python, shard-1 + variables). Rest (Python + variables), which held the ninth, is still running.

  • COLA-indexed rates.

    • The statute. G.S. 108A-42.1(a) sets "$1,285" and says "This rate shall be adjusted on January 1, 2024, and each January 1 thereafter, using the federally approved Social Security cost-of-living adjustment effective for the applicable year". (b) gives "$1,647" for the enhanced rate.
    • The manual's chart (p. 219) gives 1,326 / 1,359 / 1,397 and 1,700 / 1,743 / 1,792 for 2024–2026, and the COLA chain reproduces it.
    • What the PR does. gov.ssa.uprating is the CPI-W Q3 index behind the COLA: 326.149 / 317.265 = 1.0280 for 2027.
      • 2027: 1,397 × 1.0280 = 1,436.12 → 1,436, and 1,792 → 1,842.18 → 1,842.
      • 2028: 1,463 and 1,877. These match chaining the rounded COLAs (1,436 × 1.019 = 1,463.28; 1,842 × 1.019 = 1,877.00).
    • Differences from the official method. Uprating from the unrounded index rather than the published 0.1% COLA can differ by at most $1 in a projected year. The published rate then replaces the projection, as the parameter comment says.
  • The derived income cutoff.

    • The rule. SA-3220 III.C (PDF p. 209): "If an individual's SA payment when rounded to the nearest lower whole dollar is $0.00, the individual is not eligible for Special Assistance."
    • The math. nc_sa_full_month_amount is floor((maintenance − TCMI in cents) / 100 + 0.5), so it is ≥ 1 exactly when TCMI ≤ maintenance − $0.50.
      • That gives II.E's published cutoffs: $1,466.51 and $1,861.51 are ineligible, and $1,466.50 and $1,861.50 are eligible.
      • At a $1,000 contracted rate the cutoff is $1,069.51.
      • Cases 8–11 and 29–32 pass unchanged.
    • The NOTE. It accurately describes G.S. 108A-41(b)(2): "shall not exceed the basic rate established in subsection (a) of G.S. 108A-42.1 plus a personal needs allowance". The statute admits TCMI up to $1,467 at the published rate, but any full-month payment in that band rounds to $0. So the readings differ only in a prorated first month.
  • SSI eligibility in place of the take-up gate.

    • The sources:

      • SA-3100 I (PDF p. 6): "To be eligible for SA, an individual must be eligible for SSI, or ineligible for SSI solely due to being over income for SSI." II.A.6 says the same.
      • SA-3110 V.K (PDF p. 40): "If SSA denies the SSDI/SSI application ... based on eligibility criteria other than income (such as resources, transfers, fleeing felon, etc.), the SA application will also be denied."
      • SA-3210 V.A.4 (PDF p. 191): "If the a/b currently has income at or above the FBR, a referral to SSA to apply for SSI is not required."
      • 10A NCAC 71P .0603(3) (p. 11): "If the applicant's income is less than the Federal Benefit Rate for SSI pursuant to 20 C.F.R. 416.1101, the individual shall also apply for SSI benefits".
    • The code. over_income_for_ssi = ssi_amount_if_eligible <= ssi_countable_income. The two federal variables use the same basis in every case:

      • couple: half the couple rate against half the couple's countable income;
      • deeming: the couple rate against own income plus deemed income;
      • one-third reduction: two-thirds of the FBR.
    • Resources stay out of the over-income test. ssi_countable_income is zero only when the person isn't aged, blind or disabled or lacks a qualifying status. So an over-income applicant who also fails SSI's joint resource test is still tested on own resources (Case 33 and nc_sa_eligible.yaml Case 3, both eligible).

    • Probes at the head (2026-01):

      Household Result
      In-home applicant with no income whose aged spouse has $1,600 a month of Social Security (one marital unit) SSI amount 745.50 ≤ countable 790, SSI 0; TCMI 0; nc_sa 1,467
      In-home applicant with $700 of Social Security in another's household, no take-up 662.67 ≤ 680, so over income; TCMI 680; nc_sa 787
      Facility applicant earning $1,200 a month 473 with SSI take-up (SSI 436.50); 0 without. #1779 conflict 2 records this band against SA-3210 V.A's gross-income wording
  • Inputs that default to 0. nc_sa_facility_rate and nc_sa_partial_month_days no longer have formulas, so an input for one person can't reset another's value to the type default. Case 25 gives [554, 473] for two residents, one with a $1,000 rate and 15 days. Days at or beyond the month's length give the full month (a probe with 31 days in February gives 473).

  • Whole-cent proration.

    • The rule. SA-3220 IV.A: "Divide the monthly SA rate by the number of days in the month of entry to determine per diem rate (Round to the nearest hundredth)", then "Round amount to the nearest dollar".
    • Case 39: 105,900 cents / 30 = 3,530; 3,530 × 25 + 7,000 = 95,250 cents, so 952.50 → 953.
    • The old float code gave 952: 35.30 × 25 + 70 = 952.4999….
    • Case 25 still works: 100,000 / 31 = 3,225.8, which rounds to 3,226 cents.
  • New and changed expectations, checked by hand. The 2026 FBRs are $994 for an individual and $1,491 for a couple, and the maintenance amounts are $1,467 and $1,862.

    • nc_sa.yaml:
      • Case 25: person1: rate 1,000; 32.26 × 15 + 70 = 553.90 → 554; eligible at 1,070 − 994 = 76. person2: 473.
      • Case 34: the same, 554.
      • Case 35: 1,300 − 20 = 1,280; SSI 0; facility restoration max(994 − 1,280, 0) = 0, so TCMI 1,280; 1,070 − 1,280 < 0, so full-month amount 0, ineligible, 0.
      • Case 36: the same in a full month, 0.
      • Case 37: 1,436 + 70 − 1,021.83 = 484.17 → 484.
      • Case 38: 1,280 > 994, so over income without take-up; 1,467 − 1,280 = 187.
      • Case 39: 953, shown above.
    • nc_sa_rate.yaml Cases 1–7: 1,397; 1,792; 1,792; 1,000; 2,000 capped to 1,397; 1,500; in-home ignores the $1,000 rate, so 1,397.
    • nc_sa_eligible.yaml:
      • Case 8: incarcerated, so false and 0.
      • Case 9: income 0 < 994, so SSI is required; deemed resources 5,300 > 3,000 bar it, so false.
    • integration.yaml:
      • Case 8: separate marital units, so SSI 994 each; TCMI 994; 473 and 0.
      • Case 9: (3,787.33 − 85) / 2 = 1,851.17 deemed, so uncapped_ssi 1,491 − 1,851.17 = −360.17; over income; TCMI 0; 1,467.
      • Case 4: SNAP's minimum benefit is 24 × 9 + 25 × 3 = 291; 11,928 + 5,676 + 291 = 17,895. My probe gives SNAP 291 and the same total.
    • LIEAP Case 10: 11,928 + 5,676 = 17,604; less the 85 × 12 = 1,020 medical deduction gives 16,584, or $1,382 a month. That is above the $978 lower band (half of 15,650 × 1.5 / 12), so $300.
  • The main merge. It brought in 61 commits. Two touch SSI inputs that nc_sa_countable_income reads:

    No North Carolina case sets either input.

  • Wiring at the head:

    • all four household_state_benefits blocks;
    • SNAP unearned income;
    • HUD unearned income, through nc_sa_countable_for_hud (unchanged);
    • spm_unit_benefits.py;
    • the North Carolina LIEAP list (new);
    • programs.yaml (partial, verified_years: '2026', prefix gov.states.nc.ncdhhs.sa).

    nc_sa is still not an SSI income source (SA-5400 V, SAIH Manual p. 47: "SAIH payments are excluded income for SSI purposes"). The new eligibility test reads SSI variables that don't depend on nc_sa, so there is no circularity.

  • Changelog: changelog.d/nc-ssp-2026.added.md now says "State-County", and is still top-level and typed added.

  • Tests:

    • Locally (policyengine-core 3.32.29):
      • the six SA files, the LIEAP integration file and my two-state case pass, 86 of 86;
      • test_aggregate_list_integrity.py and test_programs_registry.py give 677 passed and 10 skipped.
    • In CI: Quick Feedback ran the same seven files: 39, 9, 9, 7, 6, 5 and 10 passed.

Axiom line assessment

Valid: axiom: N.C.G.S. 108A-41(b), 108A-42.1; NC SA Manual SA-3100 I–II, SA-3110 V.K, SA-3200 I, SA-3210 IV–V, SA-3220 II–IV; SAIH Manual SA-5300, SA-5400 TheAxiomFoundation/rulespec-us#1779 queued.

  • Issue state.
    • The PR author filed #1779 on 2026-10-15. It is open, labelled pe-parity, and the only rulespec-us issue found by a "Special Assistance" search that covers North Carolina.
    • rulespec-us main (d8511cca76) still has no module: us-nc/statutes/ holds only 105, us-nc/regulations/ only 10a-ncac, and us-nc/policies/dhhs/ only fns. So queued is the right form.
  • Dispatch-ready on the Add AMT parameters for 2020-2023 #1467 model:
    • Module paths:
      • us-nc/statutes/108a/108a-41.yaml and 108a-42.1.yaml;
      • the SA manual's sa-3100, sa-3200, sa-3210 and sa-3220;
      • the SA In-Home manual's sa-5300.
    • Corpus citations. The two manuals are in axiom-corpus as us-nc/manual/dss/special-assistance/manual and .../in-home-manual. I confirmed both on main in manifests/us-nc-ssi-state-supplement.yaml. G.S. 108A-41, G.S. 108A-42.1, 10A NCAC 71P and the change notice are marked "Needs ingest", which is the recorded blocker.
    • Verbatim law. I checked these quotes against the source PDFs:
      • G.S. 108A-41(b)(1)-(2) and 108A-42.1(a)-(b);
      • SA-3100 I and II.A;
      • SA-3110 V.K;
      • SA-3210 V.A.4;
      • SA-3220 III.C;
      • SA-5400 V and SA-5400 II.
    • Required outputs. Six rows: the rates, the personal needs allowance, eligibility, TCMI, the full-month payment and the partial month.
    • Companion tests A–H come from the manuals' worked examples, not PolicyEngine output. C, F, G and H map to cases by name. A, B, D, E and F's non-SSI figure have no PolicyEngine case, but I reproduced each at the head (Suggestion 3).
    • The source-conflict comment lists six conflicts. Each names the reading the PR takes and the case that pins it:
      • the statute cap against the manual's cutoff;
      • which income triggers the SSI application;
      • a shared facility room;
      • blind children;
      • the in-home poverty-guideline text;
      • own resources against an SSI resource denial.
  • Matches the head:
    • the variable and parameter names;
    • the 39 / 9 / 9 / 7 / 6 / 5 case counts;
    • the COLA uprating;
    • the derived III.C cutoff;
    • the over-income rule.
  • One correction (Suggestion 1): conflict 6 should cite the $3,000 limit for an individual living with an ineligible spouse.

CI status

17 pass, 10 pending, 0 failed (run 38789491571 on head a0bb041e08, pull_request, started 2026-10-15 18:54 UTC, still in progress at 19:34 UTC).

Branch status

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; details in the report above. All three round-1 should items are fixed: rulespec-us#1779 is ready for the encoder, the descriptions name the State-County Special Assistance program, and the NC LIEAP list now counts nc_sa without double counting. The new logic checks out: COLA uprating under G.S. 108A-42.1, the derived cutoffs, the SSI-eligibility rule replacing the take-up gate, the inmate gate and whole-cent proration. The NH-sibling bug doesn't occur here (NC+VA+MA results match the single-state runs), and nothing points at the old nc/dhhs path. 75 SA, 10 LIEAP and the two-state case pass. Ten CI jobs (Rest and the Contrib shards) were still running when I posted, with none failing; please confirm they finish green before merging. Three optional suggestions are in the report.

…nths

A formula-less monthly input carries forward to later months, so a
partial first month also prorated every month after it. A formula that
returns 0 keeps a one-month entry to that month.

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

hua7450 commented Oct 15, 2026

Copy link
Copy Markdown
Collaborator Author

One follow-up to my reply, in fae907a. In policyengine-core, a monthly input with no formula carries forward to later months, so nc_sa_partial_month_days entered for January also prorated February and March. It now has a formula that returns 0. A one-month entry stays in its month, and entering it for one person still leaves other household members unchanged. nc_sa.yaml Case 40 pins a January entry followed by a full February.

hua7450 and others added 2 commits October 16, 2026 03:19
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@hua7450
hua7450 merged commit 8b9e586 into main Oct 16, 2026
27 checks passed
@hua7450
hua7450 deleted the nc-ssp-2026 branch October 16, 2026 09:02
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