Skip to content

Require a need for care in North Carolina's child care program - #10691

Open
MaxGhenis wants to merge 2 commits into
mainfrom
nc-scca-need-test
Open

MaxGhenis wants to merge 2 commits into
mainfrom
nc-scca-need-test

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Nov 7, 2026 •

Copy link
Copy Markdown
Contributor

North Carolina pays for subsidized child care only when a family needs it. Each parent or responsible adult in the home has to work, study, or have a reason, such as a disability, that keeps them from working and providing care. A family in Work First, or with a child who has a developmental delay or receives protective services, also has a need. nc_scca_entry_eligible on main has no such test, so a family receives a subsidy whether or not anyone in it works or studies. We add nc_scca_need_eligible with the state's test and require it in nc_scca_entry_eligible.

For example, a Wake County parent of a 3-year-old with a $1,000 monthly child care bill and $30,000 in wages receives $750 in January 2026, on main and on this branch. With the same $30,000 from a pension and no job, the parent receives the same $750 on main and nothing on this branch.

We fix Colorado's half of #9289 in #10690.

The rule

Under 10A NCAC 10 .0905(a), the program "shall pay for child care services provided to support: (1) employment of the recipient; and (2) training leading to employment of the recipient." In section II of Chapter 5 of its policy manual, the state adds three more needs: a child's developmental needs, Child Protective Services and Child Welfare Services. In the rest of .0905 and Chapter 5, the state sets whose need counts and what meets it:

  • Under section III.A, "When both recipients/responsible adults are in the same household, both parents/responsible adults must have a need for care." The agency pays for care to support employment only when both work, one works and the other studies, or the one at home can't provide care because of a disability, age or another reason. We treat the head and spouse of the tax unit that claims an eligible child as the responsible adults, and leave an incarcerated parent out of the household.
  • Under section III, the agency finds no need when another adult in the home can and will provide care. We can't observe that, so another adult in the home never removes the need.
  • Under .0905(b), the state pays for care for recipients the local purchasing agency finds unable to work or train and incapable of providing care, for reasons such as illness, disability or age. We use disability or an inability to care for oneself in place of that finding.
  • Under section III.B, the state sets no minimum hours of work. Under section III.B.4, the agency authorizes fewer hours for a self-employed recipient who earns less than the minimum wage, so a recipient with any positive earnings has a need. Under section V.B.1 of Chapter 7, an applicant self-employed for more than 12 months with no earnings isn't eligible. Under section III.B.4.i, a newly self-employed recipient has 12 months to reach gainful employment. We can't see how long a business has run, so self-employment without earnings never counts. We compute every family's payment from the full-time market rate, without those hours.
  • Under .0905(f) and section III.C, training leading to employment includes high school, basic education, and post-secondary education or skills training. We count full-time students and can't see the 20-month limit on post-secondary study or the exclusion of graduate study.
  • Under section III.B.5, Work First participants have a need through their employment and training plan. Under sections III.D and III.E, a child with a developmental delay or the risk of one, or who receives Child Protective Services, has a need of their own. We use Work First enrollment, the child's disability and the protective services flag in place of the agency's records.

Users can set meets_ccdf_activity_test for job search and absences under .0905(c) to (e), part-time study, Child Welfare Services under section III.F, and an elderly recipient under .0905(b)(6), which sets no age. We date the earned income sources from the state's readoption of .0905 on March 1, 2019, before the program's earliest parameter.

Invariants

test_nc_scca_need_properties.py draws earnings, studies, disabilities and family makeups and checks five invariants. The first compares the model with adult_has_need, which restates the rule on its own:

  1. Without Work First, a child's need or the activity input, a family has a need when each responsible adult works, studies, or can't work and provide care. Any positive earnings count.
  2. nc_scca_entry_eligible implies nc_scca_need_eligible, and a family without a need receives no nc_scca.
  3. Giving an adult earnings never removes the need.
  4. An adult who files separately and claims no eligible child doesn't change the result, whatever that adult earns.
  5. A family with no activity has a need through each of the other paths.

Tests

  • We add 21 cases in nc_scca_need_eligible.yaml, among them:
    • wages below the minimum wage, and a business loss with and without wages;
    • the combinations of two parents, an incarcerated parent, and a grandparent who files separately;
    • each of the other paths;
    • the Wake County family end to end.
  • We set nc_scca_need_eligible: true in 9 existing cases whose families have no earnings and would otherwise fail the new test:
    • the first court supervision case;
    • Cases 1 and 3 in nc_scca_entry_eligible.yaml;
    • the two families of four in integration.yaml;
    • Case 4 in nc_scca_child_eligible.yaml;
    • Cases 1, 4 and 5 in nc_scca_maximum_payment.yaml.
  • In a new Case 5 in nc_scca_entry_eligible.yaml, a family with an eligible child and no need fails entry.
  • At 9cd97f5, 106 tests pass in North Carolina's YAML folder, 13 in the unedited partner files signatures/nc.yaml and edge_cases/state/nc/scca.yaml, and 9 in test_nc_scca_need_properties.py.

Impact

We ran the default dataset for 2026 on this branch and on its base, 040fe56. We estimate that North Carolina's child care subsidies fall from $127.1 million to $2.0 million a year. On main, 4 North Carolina records receive a payment, with weights summing to 17,825 families. The 2 that lose it account for 12,572 of those families, and nearly all of that weight comes from one family of five, so the estimate rests on one record. In that family, one parent earned $25,047 in 2024 and the other neither worked, studied nor had a disability.

As these families pay more of their bills, we estimate that they receive $37.4 million more in SNAP. National household net income falls by $87.7 million, all of it in North Carolina, and national SPM poverty rates don't change. National SPM net income rises by the same $37.4 million, because spm_unit_benefits counts SNAP and leaves out North Carolina's subsidy.

axiom: TheAxiomFoundation/rulespec-us#2068 queued

🤖 Generated with Claude Code

MaxGhenis and others added 2 commits November 7, 2026 10:47
Under 10A NCAC 10 .0905 and Chapter 5 of the Subsidized Child Care
Assistance policy manual, North Carolina pays for care only when both
parents or responsible adults in the household need it, through work,
education or training, or an inability to provide care, or when the
child needs it for developmental needs or Child Protective Services.
nc_scca_entry_eligible had no such test, so a family received a
subsidy whether or not anyone in it worked or studied.

Add nc_scca_need_eligible and require it in nc_scca_entry_eligible.
Work First enrollment, child disability and protective services stand
in for the agency's records, and meets_ccdf_activity_test covers job
search, absences, part-time study and Child Welfare Services.

Part of #9289.

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

codecov Bot commented Nov 9, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (518fbea) to head (9cd97f5).
⚠️ Report is 82 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff            @@
##              main    #10691   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files            1         2    +1     
  Lines           29        36    +7     
=========================================
+ Hits            29        36    +7     
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.

@DTrim99

DTrim99 commented Nov 13, 2026

Copy link
Copy Markdown
Collaborator

PR Review: Require a need for care in North Carolina's child care program

PR #10691 (author: MaxGhenis), head 9cd97f594a: 2 commits, +789/−2 across 11 files. This is the first review.

Path prefixes:

  • V/ = policyengine_us/variables/gov/states/nc/ncdhhs/scca/entry/
  • P/ = policyengine_us/parameters/gov/states/nc/ncdhhs/scca/need/
  • T/ = policyengine_us/tests/policy/baseline/gov/states/nc/ncdhhs/scca/

I read these sources first, before the code:

  • all of 10A NCAC 10, readopted March 1, 2019, in particular .0102, .0905, .0906, .0907, .1001 and .1004;
  • Chapter 5 of the Subsidized Child Care Assistance Program Policy Manual (revised 06/30/2025);
  • Chapter 7 of the same manual (revised 08/01/2024).

Page numbers below are PDF file pages. In Chapter 5 the file page is the printed page plus one; in Chapter 7 the two are the same.

Each claim says what it rests on: my reading of the code, a hand trace, a source PDF, or a CI log. I ran no Python or tests.

Summary

The fix is needed, and its core matches the rule. On main, any North Carolina family with an eligible child gets SCCA whether or not anyone in it works or studies, but .0905 and Chapter 5 pay only when the family has a need for care.

The PR adds nc_scca_need_eligible and requires it in nc_scca_entry_eligible, the gate for nc_scca and nc_scca_maximum_payment. The effect stays inside North Carolina's program and its aggregates. These parts match the sources:

  • employment with any positive earnings and no hours floor;
  • the both-parents rule for married parents;
  • the .0905(b) incapacity stand-in;
  • leaving out an incarcerated parent;
  • the needs through Work First, a disabled or CPS-served eligible child, and the activity input.

It reuses the generic activity variables and reinvents none.

One critical:

Four should items:

  • S1. A child's other parent who lives in the home but files separately is never a responsible adult. The model's parent ids could identify that parent, and Require an eligible activity for Colorado's child care assistance #10690 uses them.
  • S2. Four new terms or list entries fail no test when deleted.
  • S3. The references break CLAUDE.md's one-entry-per-source rule. They also omit .0906 and .0907, the rules behind the CPS and developmental needs.
  • S4. rulespec-us#2068 defers the Work First, developmental and CPS paths that this PR encodes, and no issue tracks them.

Five suggestions: G1 to G5.

CI and branch. CI is 38/38 green at the head. The branch is 217 behind main and 2 ahead, and git merge-tree is clean.

Critical (must fix)

C1. V/nc_scca_need_eligible.py:39-41 (also the comment at line 73): the education test counts only full-time students. A parent in part-time college, or an adult finishing high school or a GED, has no need in the model.

  • The rule (source PDFs):
    • 10A NCAC 10 .0905(a)(2) pays for care to support "training leading to employment of the recipient".
    • .0905(f) defines that training as "(1) continuation of high school; (2) basic education or a high school education or its equivalent in community colleges or technical institutes; and (3) post-secondary education or skills training, up to a maximum of 20 months enrollment". It sets no minimum enrollment.
    • Chapter 5 III.C (page 9) says only that "Assistance is provided when an individual is engaged in education or skills training leading to employment." Hours set the level of care, not eligibility.
  • The code (code reading):
    • student = person("is_full_time_student", year), and is_full_time_student is is_full_time_college_student | is_in_k12_school.
    • is_in_k12_school is an imputation from age 5 to 17.
  • The inputs that already exist:
    • is_part_time_college_student: "Enrolled at least half-time but less than full-time in an institution of higher education". Oregon's or_erdc_activity_eligible reads it. So does co_ccap_in_eligible_education in Require an eligible activity for Colorado's child care assistance #10690, the same author's Colorado sibling, because Colorado's rule has "no full-time requirement". .0905(f) has none either.
    • is_in_secondary_school: "Is in secondary school (or in an equivalent level of training)". az_ccap_activity_eligible and or_erdc_activity_eligible read it.
  • The result (hand trace). Take a single parent aged 30 with is_part_time_college_student: true, or a parent aged 18 (past the 5-to-17 imputation) with is_in_secondary_school: true, each with an eligible child. Each gets nc_scca_need_eligible: false and nc_scca: 0. Under .0905(f)(3) and (f)(1), each has a need.
  • Why it isn't a reasoned deferral. The comment at line 73 and the PR body send part-time study to meets_ccdf_activity_test. That input is for needs the model can't see, and the model can see this one.
  • Fix:
    • Use student = person("is_full_time_student", year) | person("is_part_time_college_student", year) | person("is_in_secondary_school", year).
    • Consider technical_institution_student too, for skills training under (f)(3).
    • Pin each new input with a case in T/entry/nc_scca_need_eligible.yaml: a part-time college single parent (true), and an 18-year-old parent in secondary school (true).
    • Update the line 73 comment, the PR body and the description in rulespec-us#2068.

Should address

S1. V/nc_scca_need_eligible.py:49-61: a child's other parent who lives in the home but files separately is never a responsible adult, so the both-parents rule doesn't reach unmarried parents.

  • Sources:
    • Chapter 7 III.A (page 5): "if both parents (biological or adoptive) of a child in need of child care assistance reside in the same household, both are members of the income unit and both incomes are counted".
    • Chapter 5 III (page 4): "When there are two (2) parents/responsible adults in a household, both parents/responsible adults must meet the need criteria." III.A, on the same page, repeats the rule.
    • Chapter 7 III.A.4 (page 6): a minor parent and their children form their own unit, so the parent, not the grandparent, is the one with the need.
  • Code (code reading). The responsible adults are the head and spouse of a tax unit that claims an eligible child. Unmarried co-resident parents file separately, so the parent who doesn't claim the child drops out. The same happens to a dependent parent whose child the grandparent claims: the model tests the grandparent.
  • Result (code reading):
    • Take a mother who claims the child and works, and a father in his own tax unit with no activity, whom the child's parent_2_id names.
    • The model finds a need and pays.
    • Under Chapter 5 III and III.A, the father is a parent at home with no need, so the family has none.
    • The income side already counts the father: nc_scca_countable_income sums the whole SPM unit.
  • The model can see this parent.
    • co_resident_parent_indices in _parent_links.py resolves a child's parent ids within the household.
    • Require an eligible activity for Colorado's child care assistance #10690 adds "any parent that the child's parent ids name in the same SPM unit" to Colorado's caretakers for this reason.
    • is_parent alone would also pick up a grandparent whose adult child lives at home, so the ids are the precise route.
  • Fix:
    • Mirror Require an eligible activity for Colorado's child care assistance #10690: caretaker = (claiming_filer | linked_parent) & ~incarcerated.
    • Add a YAML case with linked unmarried parents, one of them idle (false). Cases 14 and 15 (a grandparent, no ids) stay as they are.
    • If you defer this instead, say so in the comment and the PR body. The body now presents head and spouse as the whole rule.

S2. Four new terms or list entries are unpinned: deleting any one fails no fixed test (my reading of the YAML, the property test and the partner cases).

  • sstb_self_employment_income and farm_operations_income in P/earned_income_sources.yaml. No case uses either input. The property test sets only employment_income and self_employment_income, and the partner cases use employment_income_before_lsr.
  • is_incapable_of_self_care in unable_to_provide_care (lines 45-47). Only is_disabled is tested.
  • The eligible_child & mask in has_child_need (line 71). No YAML case expects false for a family where a disabled or CPS-flagged person isn't an eligible child. Without the mask, a disabled adult would give any family a need. Only a random hypothesis draw, such as an idle adult beside a disabled adult, would catch that, and none of the four @examples is that family.
  • Fix: add four short cases to T/entry/nc_scca_need_eligible.yaml:
    • SSTB self-employment income only (true);
    • farm income only (true);
    • is_incapable_of_self_care only (true);
    • one parent idle and the other disabled, with no child need (false). This last one is a III.A case worth having anyway: the parent at home can provide care.

S3. The references don't follow CLAUDE.md ("Parameter and variable references"; "Always cite specific regulation sections").

  • One entry per source. V/nc_scca_need_eligible.py:14-25 lists the Chapter 5 PDF six times, differing only in #page=.
    • CLAUDE.md: "One reference entry per source document; URLs that differ only by #page= are one source". For variables, "put a # PDF pages 61-62, 67 comment above a multi-page href".
    • The pages themselves are right (source PDF): II on 2-3, III and III.A on 4, III.B.5 on 8, III.C on 9, III.D on 12, III.E on 14.
    • Fix: one #page=2 entry under # PDF pages 2-4, 8-9, 12, 14.
  • The child paths cite only the manual, but rules govern them (source PDFs):
    • 10A NCAC 10 .0906(a) covers CPS, and .0906(b) covers CWS.
    • .0907 covers developmental delay. Its (c)(1) factor, "has a severe disability or special needs", also supports using the child's disability as the stand-in.
    • Each rule has its own OAH PDF, such as .../10a%20ncac%2010%20.0906.pdf. Add .0906 and .0907.
    • The PR body says "In section II of Chapter 5 of its policy manual, the state adds three more needs". The rules provide those needs, not the manual, so reword it.
  • The parameter's citation. P/earned_income_sources.yaml takes its 2019-03-01 start from the readoption of .0905, but it cites only Chapter 5 page 5, which is III.B.1 on employment. Self-employment is III.B.4, on pages 7-8. Add .0905, and give the manual pages in a quoted title: "... #page 5,7-8".

S4. Axiom coverage stops at .0905 and Chapter 5 III.A.

  • rulespec-us#2068 queues .0905 and Chapter 5 III and III.A. Its review finding says to "Leave for later modules ... the needs through Work First (III.B.5), a child's developmental needs (III.D), Child Protective Services (III.E) and Child Welfare Services (III.F)".
  • This PR encodes three of those: Work First, developmental needs and CPS. No issue tracks them, so they aren't queued in rulespec-us as CLAUDE.md "Axiom Parity" requires.
  • Fix: extend Louisiana EITC #2068 to .0906(a), .0907 and III.B.5, or open a companion queued issue and add it to the axiom line. After C1, also update the issue's "as a full-time student" line.

Suggestions

G1. Model the CPS and CWS income waiver in a follow-up (pre-existing; this PR doesn't introduce it).

  • 10A NCAC 10 .1004(1) and (3) provide CPS and CWS care "without regard to income", and Chapter 5 III.E (page 14) assesses no parental fee.
  • The new CPS path is gated on nc_scca_child_eligible, which includes the income test. So a CPS family above 200% FPG still gets nothing, as on main.
  • A follow-up issue for the income and fee waivers would help, and the comment at lines 65-67 could note that the waiver isn't modeled.

G2. The need is vacuously true when no responsible adult remains (lines 54-61).

  • If no tax unit in the SPM unit claims an eligible child, or every claimer is incarcerated, adults_have_need is true by default.
  • That is harmless for entry today, since entry also requires an eligible child.
  • It does cover a grandparent who doesn't claim the child, raising a child whose claiming parents are absent or incarcerated. Chapter 7 III.C.2 (page 9) requires such a caretaker to "meet the need criteria".
  • It also makes Case 15 depend on the child staying income-eligible. The grandparent's $50,000 gives $4,166.67 < $4,553.33. At $54,640 or more, the child is ineligible and the need flips to true.
  • Consider requiring at least one responsible adult, as the New Jersey, Massachusetts and Oregon tests do, or falling back to the SPM unit's adult heads.

G3. The property test overlaps the YAML and costs more than it needs to (CLAUDE.md "Test design and CI cost").

  • adult_has_need restates the formula's adult test.
  • test_each_other_path_gives_a_family_with_no_activity_a_need repeats YAML Cases 16-19.
  • CI shard 4's log shows about 17 s of call time for the file. 7.3 s of that is [path2], the disabled child, which YAML Case 17 already covers.
  • The PR body gives pass counts but no time or memory. Consider dropping the parametrized test and stating the CI time.

G4. Share a helper with #10690.

  • Both PRs add the same four-entry earned_income_sources list and pick caretakers the same way: the claiming filers less incarcerated adults, with is_disabled | is_incapable_of_self_care as incapacity.
  • They already diverge on part-time college and on parent ids (C1, S1).
  • A shared person-level helper, such as a CCDF caretaker mask beside _parent_links, or a shared parameter would keep them aligned.

G5. Note how far the Work First stand-in reaches.

  • Under III.B.5 (pages 8-9), care goes to participants with an approved plan and a written MRA referral.
  • is_tanf_enrolled also covers child-only Work First cases, where no adult has an MRA. Require an eligible activity for Colorado's child care assistance #10690 treats TANF receipt alone as not enough for Colorado.
  • A sentence in the comment would make the stand-in's reach explicit.

Verified correct

  • Scope (code reading; grep at the head):
    • nc_scca_entry_eligible is now has_eligible_child & nc_scca_need_eligible.
    • nc_scca and nc_scca_maximum_payment are defined_for = "nc_scca_entry_eligible".
    • nc_child_care_subsidies adds nc_scca and flows on to child_care_subsidies and household_state_benefits. Those tests input nc_scca or nc_child_care_subsidies directly, so they don't change.
    • No variable outside North Carolina's program changes.
  • Employment (source PDFs; code reading):
    • .0905(a)(1) covers it.
    • Chapter 5 III.B.1-2 (pages 5-6) defines full-time and part-time work only for the level of care.
    • Under III.B.4.ii (page 8), earnings below minimum wage cut a self-employed recipient's authorized hours, not their eligibility.
    • Under Chapter 7 V.B.1 (page 21), an established self-employed applicant with $0 earnings isn't eligible.
    • So positive earnings in any one source, with losses not offsetting wages (Cases 5 and 6), match.
  • Earnings rather than hours. In a state with no hours floor, testing earnings is sound: weekly_hours_worked_before_lsr defaults to 0, so many households would fail an hours test. Arizona uses hours above zero. "Working" isn't a shared variable, so this reinvents nothing. North Carolina's countable income already reads post-response employment_income, so the need test adds no labor-supply loop.
  • Two parents (source PDFs). III and III.A (page 4) allow both working, one working and one in education, or one incapable. Two students are allowed (the III.C.1 note, page 11). Under .0905(b), a single recipient who is unable to work and incapable of providing care has a need.
  • Another adult in the home blocks care only when "willing and able" (III, page 4), which the model can't see. Never blocking is the right default.
  • Reuse. The formula reads existing variables in the same pattern as about 30 other state activity tests:
    • is_full_time_student, is_disabled, is_incapable_of_self_care, is_tax_unit_head_or_spouse and is_incarcerated;
    • is_tanf_enrolled, which defaults to the reported receives_tanf input;
    • receives_or_needs_protective_services, and meets_ccdf_activity_test (a pure input, false by default).
  • Mechanics (code reading):
    • The variable is an SPMUnit MONTH variable. Yearly inputs are read at period.this_year; is_incarcerated, nc_scca_child_eligible and is_tanf_enrolled are read at the month.
    • The vectorized calls (np.any(..., axis=0), spm_unit.sum and .any, person.tax_unit.sum) are sound, and there is no builtin sum.
    • The new variable is a bool, so the NH Add New Hampshire state supplementation for 2026 #10156 key pattern doesn't apply.
  • Housekeeping. The changelog fragment is changelog.d/nc-scca-need-test.fixed.md. The new YAML file is named after its variable, and the test periods are plain.
  • Existing tests. The nine nc_scca_need_eligible: true inputs sit on families with input countable income and no earnings. No expected value changed.
  • Partner tests. The PR doesn't touch them, and every North Carolina partner case has a working adult: both adults in signature_3, the head in each edge_cases/state/nc/scca.yaml case. So the need holds, and signature_3's nc_scca_maximum_payment stays (455 + 1,256 − 300) × 12 = 16,932. Household API Partners passed.
  • Source conflicts: none to record (source PDFs).
    • The manual's both-parents rule fills a gap: .0905 is silent on two-parent homes.
    • The manual's five needs restate .0905 to .0907.
    • Section II's "special needs are not one of the five (5) need categories" (page 3) fits .0907(c)(1), which makes special needs a factor within the developmental need.
    • The PR's stand-ins are approximations, not choices between conflicting sources.
    • None of the added comments matches the ratchet's conflict pattern.

Hand checks (13, all at 2026-01 unless noted; 2026 FPG is $21,640 for 2 and $27,320 for 3, so 200% is $3,606.67 and $4,553.33 a month):

Case Trace Expected
need 1 Wages 20,000 > 0. Child income 20,000/12 = 1,666.67 < 3,606.67, so eligible. The only responsible adult has a need true ✓
need 2 No earnings, college flag false, age 30 is outside the K-12 imputation, not disabled. receives_tanf defaults to false; no child need; no activity input false ✓
need 5 Self-employment −5,000 is not > 0 false ✓
need 6 Wages 20,000 > 0 count on their own; the −30,000 loss doesn't offset them true ✓
need 9 parent2 is a full-time college student, so both adults have a need true ✓
need 10 parent2 is the spouse, with no activity. Child 1,666.67 < 4,553.33, so the child is eligible and one responsible adult lacks a need false ✓
need 13 parent2 is incarcerated in 2026-01 and drops out; parent1 works true ✓
need 14 The grandparent heads a tax unit with 0 eligible children, so isn't responsible; the parent works true ✓
need 15 50,000/12 = 4,166.67 < 4,553.33, so the child is eligible and the idle parent is responsible false ✓
need 20 30,000/12 = 2,500. Fee round(0.10 × 2,500) = 250. Wake preschool rate 1,256, so the maximum is 1,256 − 250 = 1,006. Bill 12,000/12 = 1,000, so 1,000 − 250 = 750. Payment min(750, 1,006) = 750 750 ✓
need 21 A pension isn't an earned source: no need, so not entry eligible, and nc_scca is 0 through defined_for false / false / 0 ✓
entry 5 (2024-01) Eligible child, need false false ✓
court supervision pipeline (2023-01) Need input true. Rate 323 − fee 215 = 108. Bill 120,000/12 − 215 = 9,785. Payment min = 108 108 ✓

Axiom line assessment

The line is axiom: TheAxiomFoundation/rulespec-us#2068 queued. The issue meets the requirements and matches the head as it stands:

  • It is OPEN and labelled pe-parity (last updated 2026-11-07).
  • It gives the module paths and corpus citations, the verbatim text of .0905 and of Chapter 5 III and III.A, and the required outputs.
  • It has 13 companion tests drawn from the sources.
  • It records its blocker: the pinned corpus release lacks 10A NCAC 10, and the Chapter 5 ingest is requested in axiom-corpus#985.
  • Its "PolicyEngine implementation" section matches the head's behavior.

Two caveats:

  • S4: the Work First, developmental and CPS paths have no queued coverage.
  • C1: the fix will change the issue's "as a full-time student" line. Its companion case 3 ("Post-secondary education ... Need") doesn't depend on full-time status, which agrees with C1.

CI status

  • 38/38 checks pass at the head: run 42595251853 on 2026-11-09, head 9cd97f594a. The three "skipping" lines belong to an older run.
  • The run postdates Tie source-conflict markers to the register shared with Axiom #10287, so the source-conflict ratchet ran against this head.
  • The property file ran in Rest shard 4 (remaining-2), and all 9 of its tests passed (CI log).
  • I re-checked gh pr checks near the end of this review. Nothing is pending.

Branch status

  • The branch is 217 behind main (f926615321) and 2 ahead, with merge base 040fe5686c. git merge-tree --write-tree PolicyEngine/main 9cd97f594a gives tree 77a17f45cf with no conflicts.
  • Main hasn't touched the North Carolina SCCA files since the merge base.
  • Main has changed is_tax_unit_head.py and is_tax_unit_spouse.py (Keep an inferred tax unit spouse in the head's marital unit #10555). By my reading, this changes no roles in the PR's tests:
    • The YAML cases omit marital units, so everyone shares one, and the second adult is still the head's partner.
    • The property test gives each person a separate marital unit. The second adult, aged 30, is still the next-oldest adult who fails the qualifying-child age test: 30 isn't younger than 30, and is_permanently_and_totally_disabled is an input left unset.
  • Main also changed signatures/nc.yaml, but only its WIC fixtures, not the SCCA outputs.
  • The sibling Require an eligible activity for Colorado's child care assistance #10690 (Colorado) touches disjoint 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.

Requesting changes: 1 critical, 4 should address, 5 suggestions (details in the report above). The core matches 10A NCAC 10 .0905-.0907 and manual chapters 5 and 7, reuses the generic variables, and gates only the NC program. All 13 hand checks pass.

  • Critical: the education path reads only is_full_time_student. .0905(f) defines training leading to employment as continuation of high school, basic education or its equivalent, and post-secondary or skills training, with no full-time condition; manual III.C sets none either. So a part-time or GED-track parent is denied a need and gets $0. is_part_time_college_student and is_in_secondary_school already exist, and #10690 reads part-time study.
  • Should:
    1. A co-resident parent who files separately is never a responsible adult.
    2. Several new entries and branches have no case.
    3. Six manual hrefs differ only by #page, and the CPS and developmental paths should cite .0906 and .0907.
    4. rulespec-us#2068 defers paths the PR encodes, and no issue tracks them.

This branch has not been deployed

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants