Skip to content

Apply the $10 minimum payment in Michigan FIP, Virginia TANF, South Carolina TANF and Maryland TCA - #10261

Merged
PavelMakarchuk merged 6 commits into
mainfrom
fix-9985-tanf-10-dollar-minimum
Oct 27, 2026
Merged

PavelMakarchuk merged 6 commits into
mainfrom
fix-9985-tanf-10-dollar-minimum

Conversation

@PavelMakarchuk

@PavelMakarchuk PavelMakarchuk commented Oct 16, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

Michigan, Virginia, South Carolina and Maryland pay nothing when the monthly amount is under $10; PolicyEngine paid any positive amount. This PR adds a minimum_payment parameter ($10) to each program, as Illinois, Nevada and Missouri have.

  • Michigan FIP. BEM 518 (7-1-2023): "Financial need exists if: There is at least a $10 deficit after income is budgeted in the issuance deficit test"; at application the group must also pass the qualifying deficit test. mi_fip_income_eligible now requires an issuance deficit (payment standard less mi_fip_countable_income_for_benefit) of at least $10 for every group, plus the qualifying test for groups that are not enrolled. Before, enrolled groups needed any positive deficit and applicants only the qualifying test. mi_fip only gets a corrected comment.
  • Virginia TANF. TANF Manual 502.1 A: the payment is the budgetary deficiency "adjusted to the next lower dollar"; A.2 "If the budgetary deficiency is less than $10.00, no payment is made," and the case stays active. va_tanf now rounds the capped payment to cents (so float error cannot drop a dollar), then down to whole dollars, and returns 0 under $10. va_tanf_eligibility is unchanged.
  • South Carolina TANF. S.C. Code Regs. 114-1140(A)(5): "no payment of assistance shall be made to an assistance unit in any month in which the amount of assistance prior to any adjustments is determined to be less than ten dollars"; TANF Policy Manual vol. 65, 8.16 I. sc_tanf returns 0 under $10. (The TANF supplemental payment that 8.16 I lets count toward the $10 is not modeled.)
  • Maryland TCA. COMAR 07.03.03.13 E: E(1) deducts "the net countable income, rounded down to the nearest dollar", and E(2) "The assistance unit shall be issued a benefit if determined to be eligible for $10 or more." md_tca now rounds net countable income down to the dollar (after rounding to cents) and returns 0 under $10.

Mississippi's $10 minimum is in #10258 and is not part of this PR.

Known limitations, not changed here:

Parameter start dates follow each program's existing parameters from the same source (MI 2008-10-01, SC 1996-07-01, MD 2016-01-01); Virginia's is 2020-07-01, the date of the 502.1 page.

Tests

  • Virginia va_tanf.yaml: four new monthly cases in January 2025 with the printed 7/22 Group II size-3 standard of $482 (deficiency $2.80 and $9.99 pays $0, exactly $10 pays $10, $381.60 pays $381). The 2023 "small payment is still paid" case ($8.33 a month) now expects $0. The $10,000 / $4,000 case is unchanged and passes because the payment is rounded to cents before the floor (without that it gives $5,988). The TANF-UP cases are Pay Virginia TANF-UP units the TANF standards of assistance in every year #10253's, kept when main was merged in (see Overlap). Five integration.yaml results are rounded down (for example $191.60 to $191).
  • Michigan: four mi_fip_income_eligible.yaml cases (enrolled $8 deficit fails, enrolled $10 passes, applicant passing the qualifying test with an $8 issuance deficit fails, applicant passing both passes) and one integration case (the issue's repro: $1,356 a month of earnings, family of 3, deficit $5, mi_fip = $0).
  • South Carolina sc_tanf.yaml: benefits of $4.72 and $9.99 pay $0; $10.30 and $12.81 are paid (households of two people, so the cases also hold with Count South Carolina TANF unearned income at gross amounts and leave SSI recipients out of the benefit group #10184's benefit group size). Comments record what the unmodeled (A)(4) rounding would give.
  • Maryland md_tca.yaml: income $443.20 (benefit $5) pays $0; exactly $10 is paid; income $438.50 is rounded down to $438, so $10 is paid; income $200.75 gives $527.
  • The new non-control cases fail on main. policyengine-core test on the four program folders: 276 passed; MD (all) and gov/hhs/tanf: 734 passed. Reference and source-conflict code-health tests pass.

Overlap

Fixes #9985

axiom: TheAxiomFoundation/rulespec-us#1952 queued (open, pe-parity; the four sources are already in axiom-corpus, and the signed encoder run needs approval)

🤖 Generated with Claude Code

Michigan: financial need requires an issuance deficit of at least $10
(BEM 518), for applicants as well as recipients. Virginia: the payment is
the budgetary deficiency rounded down to whole dollars, and none is made
under $10 (TANF Manual 502.1 A). South Carolina: no payment under $10
(S.C. Code Regs. 114-1140(A)(5)). Maryland: a benefit is issued only when
it is at least $10 (COMAR 07.03.03.13 E(2)).

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

DTrim99 commented Oct 26, 2026

Copy link
Copy Markdown
Collaborator

PR Review: Apply the $10 minimum payment in Michigan FIP, Virginia TANF, South Carolina TANF and Maryland TCA

Summary

The PR adds a minimum_payment parameter ($10 a month) to four programs and applies it:

  • Michigan FIP. mi_fip_income_eligible now requires an issuance deficit (payment standard less mi_fip_countable_income_for_benefit) of at least $10 for every group. Groups that are not enrolled must also pass the qualifying deficit test. Before, enrolled groups needed any positive deficit and applicants only the qualifying test. mi_fip only gets a corrected comment.
  • Virginia TANF. va_tanf now rounds the capped payment down to whole dollars and returns 0 under $10. va_tanf_eligibility is unchanged.
  • South Carolina TANF and Maryland TCA. sc_tanf and md_tca return 0 when the benefit is under $10.

It also adds 4 + 1 + 4 + 2 + 2 YAML cases, edits 3 va_tanf.yaml cases, re-rounds 5 Virginia integration results, and adds a fixed changelog fragment. No partner test file (tests/policy/baseline/partners/**) is touched.

  • Law. All four minimums are right in every claimed year. None of them rounds the payment up:
    • Michigan. BEM 518 (7-1-2023, and the same text in the 10-1-2015 edition): "at least a $10 deficit". At application the group also needs the qualifying deficit, so it must pass both tests. A deficit under $10 means no financial need, so the group is ineligible.
    • Virginia. TANF Manual 502.1 A: the payment is the deficiency "adjusted to the next lower dollar". "If the budgetary deficiency is less than $10.00, no payment is made", and the case stays active.
    • South Carolina. S.C. Code Regs. 114-1140(A)(5): no payment when the amount is "less than ten dollars". TANF Policy Manual 8.16 I says the same.
    • Maryland. COMAR 07.03.03.13 E(2): issue a benefit "if determined to be eligible for $10 or more".
  • Boundary. "Less than $10" is strict in every source. The code's >= p.minimum_payment pays exactly $10, which is right in all four states.
  • Who stays eligible. VA, SC and MD units stay eligible with a $0 payment, and MI groups become ineligible. Each matches its rule.
  • Code. The code is vectorized, and the new parameters are scalars. No state-gated variable is used as a parameter key, so the NH Add New Hampshire state supplementation for 2026 #10156 pattern doesn't apply.
  • Tests. I hand-checked 27 expectations. All are arithmetically right for their inputs.
  • CI. All 27 checks pass. The one earlier cancellation was a 1-hour timeout (infrastructure).
  • Branch. The merge with main is clean.

Three things need fixing:

  1. The edited TANF-UP case in va_tanf.yaml now asserts that the UP grant standard applies in 2021. The approved Pay Virginia TANF-UP units the TANF standards of assistance in every year #10253 shows that this contradicts the Appropriation Act floor, and the two PRs now conflict. The body's overlap paragraph ("identical to Pay Virginia TANF-UP units the TANF standards of assistance in every year #10253's", "a trial merge of the three branches is clean") is out of date.
  2. Virginia's new whole-dollar floor is applied to the model's fractional standards (417 × 1.155 = 481.635), so most payments from July 2021 on land $1-$2 below the printed standards. A no-income Group II family of 3 gets $481 where the manual pays $482. The new 2025 rounding test pins $381 where the rule gives $382.
  3. The axiom: line is missing.

Critical (must fix)

None.

Should address

1. The edited TANF-UP case conflicts with the approved #10253, both textually and on the law, and the body's overlap claim is out of date.

va_tanf.yaml:27-40 renames the old 2023 UP case to "If up tanf eligible before July 2022, the UP grant standard applies." It then pins $1,200 for 2021, with TANF grant standard 0 and UP grant standard 2,400. The body says this edit "is identical to #10253's" and that "a trial merge of the three branches is clean ... (279 tests)".

That held against #10253's earlier head (8738598107, "from July 2022"). On 2026-10-26 #10253 pushed 9bb2dc4f7f, "Give Virginia TANF-UP units the TANF standards in every year", and DTrim99 approved that head the same day. The two PRs now disagree on the law and on the file:

Fix:

2. The new floor drops the cents of Virginia's fractional standards. Most payments land $1-$2 under the printed amounts, and the new 2025 test pins one.

The floor at va_tanf.py:48 is what 502.1 A requires. The trouble is the standard it is applied to. va_tanf_grant_standard (unchanged) multiplies the 7/20 base table by standard_multiplier: 1.1 from July 2021 and 1.155 from July 2022. That leaves cents. VDSS instead rounds up after each increase and prints whole dollars: TANF Manual Section 304, Appendix 2 (7/22), Group II file page 29 and Group III file page 30. The rule floors (printed standard − income). The PR floors (fractional standard − income), so the standard's fraction is dropped as well.

Unit, no countable income, 2025 Printed 7/22 standard (rule) main PR
Group II, 1 person 262 261.03 261
Group II, 2 385 383.46 383
Group II, 3 482 481.635 481
Group II, 4 577 576.345 576
Group III, 2 489 487.41 487
Group III, 3 587 586.74 586

The evidence:

  • The manual's own example. 502.2 A, Example 1 (Chapter 500, file page 4, 7/22): a Group II mother and two children with no income, "$482.00 = payment amount for full month's payment". The PR pays $481, and main pays $481.64.
  • The new test. "The payment is rounded down to the next lower dollar." (va_tanf.yaml, 2025-01, Pittsylvania) uses va_tanf_grant_standard: 481.635, the model's Group II size-3 standard, and pins $381. With the printed $482 standard, the rule pays 482 − 100 = $382.
  • Already known. Pay Virginia TANF-UP units the TANF standards of assistance in every year #10253's body records the sub-dollar gap as a known limitation ("standards up to $1 below the printed amounts (VDSS rounds up after each year's increase)"). rulespec-us#1921 lists the printed 7/20, 7/21 and 7/22 values.
  • What the floor changes. It turns that $0.03-$1.59 gap into a $1-$2 underpayment for no-income units and for units whose income is in whole dollars.
  • Not affected. The 2021-01 integration cases use multiplier 1.0, so their standards are whole dollars and their floored results match the rule.

Fix (either):

  • (a) Preferred: give the floor whole-dollar standards.
    • Rounding up after each increase (×1.1, round up, ×1.05, round up) reproduces every printed 7/22 standard in both groups, the $95 add-on and both maximums ($723 and $861). For example, 417 → 458.7 → 459 → 481.95 → 482, and 625 → 687.5 → 688 → 722.4 → 723.
    • The plainest way is to store the printed 7/21 and 7/22 Appendix 2 values as dated entries, as rulespec-us#1921 tabulates them.
    • A single np.ceil(base_amount * p.standard_multiplier) gets $482 right but leaves some sizes $1 low (Group II size 2: 384 against 385).
  • (b) Keep the scope.
    • Say in the body that, with the model's fractional standards, the floor pays $1-$2 below the printed Appendix 2 amounts from July 2021 on, and link a follow-up issue.
    • Change the 2025 test's grant standard to a whole-dollar amount, for example 482 with countable income 100.40, which gives 381.60 and so $381. The test then pins the floor on income cents, which is what 502.1 A rounds.

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

The body (head b92c4eae5e, last updated 2026-10-23) doesn't mention axiom in any format. Pavel is staff and this is a policy fix, so the line is required, and axiom: needed isn't available. encoded-correct isn't available either (see "Axiom line assessment").

Suggestions

  1. South Carolina and Maryland rounding (the body defers both). Add a test comment, open a follow-up issue, and note the boundary effect:
    • South Carolina, 114-1140(A)(4) (file page 210): "The FI benefit will be rounded down to the next lower whole dollar when the result of determining the standard of need or the payment amount is not a whole dollar."
      • Manual 8.15 (file page 132) prints a need standard of $851 for 2 people, and a payment standard of $344 ("multiply the Need Standard by .4046 and drop the cents").
      • New Case 5 pins $12.81. The rule gives (851 − 820) × 0.4046 = 12.54, so $12.
      • Near the threshold the result flips. At countable income $826.80, PE pays (851.67 − 826.80) × 0.4046 = $10.06, but the rule gives ⌊(851 − 826.80) × 0.4046⌋ = ⌊9.79⌋ = $9, so $0.
      • A comment in Case 5 would record this, for example # The rule rounds the need standard and benefit down (114-1140(A)(4)): (851 - 820) * 0.4046 = 12.54, so $12.
    • Maryland, COMAR 07.03.03.13 E(1): "deducting the net countable income, rounded down to the nearest dollar". With an allowable amount of $448 and countable income of $438.50, PE pays $0 (9.50), but the rule pays 448 − 438 = $10.
    • E(1) and (A)(4) sit right next to the provisions this PR encodes, so folding them in is also reasonable.
    • Michigan (lower priority). BEM 520 (file page 1) says "Drop cents before entering any amount used to compute the issuance amount on the worksheet". That would make a PE deficit of $9.01-$9.99 a $10 worksheet deficit. The same page also says "Cents amounts are included when computing recouped, vendored and benefit amounts", so this is less clear. It is worth a line in the follow-up.
  2. Make the Virginia floor float-safe. Use np.floor(np.round(min_(payment, maximum), 2)). snap_net_income.py already does this (np.floor(np.round(net_income, 2) + 0.5)), and so do the IRA limit variables.
    • The body explains that one test's inputs were changed because 10,000 / 12 − 4,000 / 12 floors to $499 in float32.
    • In microsimulation, countable income comes from annual amounts divided by 12, so real households can lose the same $1.
  3. Add a South Carolina near-boundary pair, like Virginia's $9.99 / $10. SC is the only state without a case near $10. For 2 people in 2025-01:
    • countable income 826.98 gives (851.67 − 826.98) × 0.4046 = 9.99, so 0;
    • countable income 826.90 gives 10.02, which is paid.
  4. References.
    • mi/mdhhs/fip/minimum_payment.yaml lists BEM 518 twice (#page=2 and #page=4). CLAUDE.md says: "One reference entry per source document; URLs that differ only by #page= are one source", and a multi-page title "ends with #page 72-75". Use one entry: href #page=2, title "Michigan DHHS BEM 518 - FIP/RCA/SDA Income Budgeting, Financial Need #page 2-4". Page 3 has "a deficit less than $10".
    • The variable reference tuples don't cite the new rules:
      • va_tanf: add Chapter 500 #page=3.
      • sc_tanf: add Chapter 114 #page=210.
      • md_tca: add .13.
      • mi_fip_income_eligible: it cites BEM 518 #page=5 (deductions); add #page=2 with a # PDF pages 2-4 comment.

Verified correct

  • Rule text and years:
    • Michigan BEM 518 (7-1-2023).
      • File page 2: "Financial need exists if: There is at least a $10 deficit after income is budgeted in the issuance deficit test ... Exception: At application, the certified group must have a deficit of at least $1 in the qualifying deficit test".
      • File page 1: need exists "when the certified group passes the Qualifying Deficit Test, Issuance Deficit Test and the Child Support Income Test".
      • File page 3: "ineligible for the benefit month if no deficit exists or the group has a deficit less than $10".
      • File page 4: "If the deficit is less than $10, no financial need exists and the group is not eligible to receive benefit."
      • The 10-1-2015 edition (BPB 2015-015, Wayback) has the same text on pages 2-4. That covers every year from 2017, when the MI payment standards begin.
    • Virginia TANF Manual 502.1 A (Chapter 500, file page 3, 7/20, Transmittal 68, still current): the deficiency "adjusted to the next lower dollar"; "If the budgetary deficiency is less than $10.00, no payment is made. However, if an assistance unit's ineligibility is based solely on this minimum payment provision, the case will be approved and retained as an active TANF case."
      • 22VAC40-295 has no minimum-payment or rounding text (I checked sections 10-170), so the manual is the right source.
    • South Carolina 114-1140(A)(5)-(6) (file page 210; history 1995, 1997, 2002):
      • "no payment of assistance shall be made to an assistance unit in any month in which the amount of assistance prior to any adjustments is determined to be less than ten dollars";
      • a unit denied for this reason "shall be deemed a recipient for all other purposes".
      • Manual 8.16 I (file page 133): "No TANF cash benefits are made for less than $10, unless when combined with a TANF supplemental payment the two total $10 or more". The body notes the supplemental payment as not modeled.
    • Maryland COMAR 07.03.03.13 (DSD page):
      • E(2): "The assistance unit shall be issued a benefit if determined to be eligible for $10 or more."
      • A(2): "Each member of the assistance unit is considered to be a recipient of FIP even though no cash assistance is paid."
  • Boundary and order of operations:
    • "At least $10", "less than $10.00", "less than ten dollars" and "$10 or more" all pay exactly $10. >= p.minimum_payment does that in all four states.
    • Virginia. Applying the floor and the $10 test after the cap is the same as applying them to the deficiency. The maximum is a whole dollar of at least $599, so floor(min(p, M)) = min(floor(p), M), and that is at least 10 exactly when p is.
    • Michigan. The issuance test uses the 50% disregard and the benefit-month payment standard (BEM 518 page 3, BEM 520 Section D). Applicants need both tests. passes_issuance_test & (enrolled | passes_qualifying_test) encodes this. The qualifying test's < is the same as "at least $1" for whole-dollar payment standards.
    • South Carolina and Maryland. The minimum is applied to (need − net income) × 40.46% (8.16 H-I) and to allowable − countable income.
  • Interactions on the merged trees:
  • Code:
  • Callers. va_tanf, sc_tanf, md_tca and mi_fip feed only tanf_if_takes_up. mi_fip_income_eligible feeds only mi_fip_eligible, which only mi_fip reads. Eligibility stays true for VA, SC and MD, as their rules require.
  • Hand-checked expectations (27):
    • va_tanf.yaml:
      • 2023: 2,100 / 12 − 2,000 / 12 = 8.33 a month, which floors to 8 < 10, so 0.
      • The 2021 UP case: (2,400 − 1,200) / 12 = 100 a month, under the maximum, so 1,200 under main's formula (see Should 1).
      • 12,000 / 12 − 6,000 / 12 = 500, so 6,000.
      • 481.635 − 479.20 = 2.435, so 0.
      • 500 − 490.01 = 9.99, so 0.
      • 500 − 490 = 10, so 10.
      • 481.635 − 100 = 381.635, so 381 (Should 2).
      • The unchanged cases stay right: 4,000 − 4,000 = 0; 6,000 / 12 = 500, so 6,000; the caps 12 × 861 = 10,332 and 12 × 722 = 8,664; and 700 a month, so 8,400.
    • Virginia integration.yaml (2021-01, whole-dollar standards):
      • 508 − 316.40 = 191.60, so 191;
      • 332 − 91.40 = 240.60, so 240;
      • 332 − 133.07 = 198.93, so 198;
      • 417 − 116.40 = 300.60, so 300;
      • 316 − 106.40 = 209.60, so 209.
    • mi_fip_income_eligible.yaml:
      • 583 − 575 = 8, so false.
      • 583 − 573 = 10, so true.
      • An applicant with a qualifying deficit of 3 and an issuance deficit of 8: false.
      • An applicant with 3 and 83: true.
      • The existing applicant cases still pass the new issuance test: $400 → 363 − 100 = 263; $814 → 583 − 307 = 276; $825 → 583 − 312.50 = 270.50.
    • Michigan integration.yaml Case 16: 16,272 / 12 = 1,356, and 1,356 − (200 + 0.5 × 1,156) = 578. The deficit is 583 − 578 = 5, so mi_fip_income_eligible and mi_fip_eligible are false and mi_fip is 0.
    • sc_tanf.yaml: (851.67 − 840) × 0.4046 = 4.72, so 0. (851.67 − 820) × 0.4046 = 12.812, so 12.81 within the 0.01 margin.
    • md_tca.yaml: 448 − 443.20 = 4.80, so 0. 448 − 438 = 10, so 10.
  • PR body. "The new non-control cases fail on main" is right. Main pays 2.435, 9.99, 381.635, 100 (2023), 4.72 and 4.80; it passes the enrolled $8 group and the applicant with an $8 issuance deficit; and it pays the Case 16 family $5.
  • Source-conflict ratchet (Tie source-conflict markers to the register shared with Axiom #10287). None of the 66 added or removed comment lines (code, parameters and tests) matches CONFLICT_COMMENT_RE. No MI, VA, SC or MD file is in KNOWN_UNMARKED. The CI run started after Tie source-conflict markers to the register shared with Axiom #10287 and Count the FL and SD LIHEAP comments in the source-conflict ratchet baseline #10334.
  • Changelog. changelog.d/fix-9985-tanf-10-dollar-minimum.fixed.md is a top-level fragment with the fixed type.
  • Parameters. Each has a description that follows the house template, unit: currency-USD, period: month and a label. Every href anchor shows its text: BEM 518 pages 2 and 4, Chapter 500 page 3, Chapter 114 page 210, manual page 133, and the COMAR page.
  • Partner tests. None are touched, and Household API Partners passes.
  • Issue closure. Fixes #9985 is right. The issue covers MI and VA; SC and MD are extra provisions of the same kind.

Axiom line assessment

The line is missing (Should 3), and encoded-correct isn't available:

Recommended line. File a dispatch-ready pe-parity issue (one issue, or one per state) and use axiom: TheAxiomFoundation/rulespec-us#<n> queued. All four sources are already in axiom-corpus, byte-identical to the PR's links, so the only blocker is approval of the billed encoder run.

State Module (following existing layouts) Corpus
Michigan us-mi/policies/mdhhs/bridges/bem/518, citing us-mi/manual/mdhhs/bridges/bem/518 us-mi/manual/2026-07-17-mi-bridges-manual, mi-mdhhs-bridges-bem-518.pdf, sha256 7624aa41…
Virginia a Section 502.1 module under us-va/, citing us-va/manual/dss/tanf/chapter-500 us-va/manual/2026-09-10-tanf-state-policy-manual, us-va-dss-tanf-manual-chapter-500.pdf, sha256 74dbae90…
South Carolina us-sc/regulations/114/1140/..., citing us-sc/regulation/114/1140 us-sc/regulation/2026-10-06-w6-tanf-ccdf-regulation-sc, sha256 6edbe62d…
Maryland a .13 E module, citing us-md/regulation/title-07/subtitle-03/chapter-03; it can be added to programs/us-md/tca/fy-2026.yaml's scope us-md/regulation/2026-07-03-md-tca-comar-publication-2026-06-29-title-07-subtitle-03-chapter-03

The issue should also include:

  • Law. The verbatim text quoted above: BEM 518 pages 1-4, 502.1 A, 114-1140(A)(4)-(6) and COMAR .13 E(1)-(2).
  • Required outputs. Michigan financial need (both tests at application, the issuance test ongoing) and the monthly payment with the $10 minimum in each state, plus Virginia's rounding to the lower dollar.
  • Companion cases, taken from the sources, not from PolicyEngine output:
    • Virginia. 502.2 A Example 1: Group II, a mother and two children, no income, $482.00. Example 2: $482.00 − $88.50 = $393.50, paid as $393 for a full month. A $9.99 deficiency pays $0, and $10.00 pays $10.
    • Michigan. With the RFT 210 size-3 standard of $583: budgetable income of $575 means no financial need, and $573 means need exists. An applicant with a $3 qualifying deficit and an $8 issuance deficit is ineligible.
    • South Carolina. Manual 8.15: size 2 with no income gets the $344 payment standard. A computed amount under $10 is not paid.
    • Maryland. With the IM 26-13 size-1 allowable of $348: net countable income of $339 gives $9, not issued; $338 gives $10, issued.
  • Divergence notes. PolicyEngine doesn't yet apply South Carolina's (A)(4) or Maryland's E(1) rounding (Suggestion 1). Its Virginia standards are fractional (Should 2).

CI status

All 27 checks pass at b92c4eae5e (gh pr checks 10261). The workflow run on that SHA was created 2026-10-23 18:45 UTC, after #10287 and #10334. That includes:

  • the 11 Baseline shards (incl. states shards 1-4);
  • the 9 Contrib shards;
  • Household API Partners;
  • PR validation (lock, guard tests, lint, changelog);
  • Microsimulation;
  • the two Full Suite - Rest jobs;
  • Package and compatibility;
  • Quick Feedback.

The earlier non-green check was attempt 1's "Full Suite - Microsimulation". It was cancelled with "The job has exceeded the maximum execution time of 1h0m0s", which is infrastructure. Attempt 2, re-run 2026-10-23 21:05 UTC, passed that job in 40m24s. Nothing is pending or failing.

Branch status

The branch is 2 commits ahead of main (the change on 2026-10-16 and a merge of main on 2026-10-23) and 48 behind. git merge-tree --write-tree PolicyEngine/main b92c4eae5e merges cleanly.

Verdict: REQUEST_CHANGES

@DTrim99 DTrim99 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

The law checks out in all four states: under $10 is strict, exactly $10 is paid, nothing rounds up, MI groups become ineligible and VA/SC/MD units stay eligible. No partner files are touched, and all 27 hand-checks pass. Three should-address items: (1) the edited VA TANF-UP case says the UP standard applies in 2021, which contradicts the approved #10253 ('every year'), and the two PRs now conflict, so align with #10253 and update the body's overlap claim; (2) flooring fractional VA standards leaves payments $1-2 under the printed 7/22 Appendix 2 (family of 3: $481 vs $482, and the new 2025 test pins $381 vs $382); (3) there's no axiom line. Four suggestions. Full report in the comment above.

PavelMakarchuk and others added 2 commits October 27, 2026 11:07
…come rounding

- va_tanf.yaml: the edited TANF-UP case no longer asserts which standard a
  TANF-UP unit gets (both standards are $2,400), so it holds with and
  without #10253. The 2025 rounding tests use the printed 7/22 Appendix 2
  standard ($482); the $381 case floors $381.60 on income cents.
- va_tanf: round the capped payment to cents before the floor, so float
  error does not drop a dollar. The $10,000 / $4,000 case is restored.
- md_tca: round net countable income down to the dollar before it is
  deducted (COMAR 07.03.03.13 E(1)); new cases at $438.50 and $200.75.
- sc_tanf.yaml: a $9.99 / $10.30 pair at the minimum, and comments on the
  unmodeled 114-1140(A)(4) rounding.
- References: one BEM 518 entry (#page 2-4); cite Chapter 500, Chapter 114
  and COMAR .13 in the variable references.

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

Copy link
Copy Markdown
Collaborator Author

@DTrim99 thanks for the review. New head: fda3e348ad (fix commit d54735d200, then a merge of main). Each item:

Should address

  1. TANF-UP case vs Pay Virginia TANF-UP units the TANF standards of assistance in every year #10253: fixed in d54735d200. The case is now neutral: period 2021, TANF and UP grant standards both $2,400, countable income $1,200, result $1,200. It is renamed "If up tanf eligible, the payment is the grant standard less countable income." and no longer says which standard applies, so it holds with and without Pay Virginia TANF-UP units the TANF standards of assistance in every year #10253.
  2. Fractional Virginia standards: option (b), fixed in d54735d200. The 2025 tests now use the printed 7/22 Group II size-3 standard of $482. The rounding case is $482 − $100.40 = $381.60, so $381, which pins the floor on income cents. The under-$10 case is $482 − $479.20 = $2.80. The body now states that, with the model's fractional standards, the floor pays $1-$2 below the printed Appendix 2 amounts from July 2021 on, with the $482 / $481 example.
  3. axiom: line: added. axiom: TheAxiomFoundation/rulespec-us#1952 queued. The issue is a dispatch-ready pe-parity issue with these parts:
    • module paths and corpus citations (all four corpus PDFs and COMAR XML are byte-identical to the PR's links);
    • the verbatim law;
    • the required outputs;
    • 12 companion cases from the sources (502.2 A Examples 1-2, BEM 518, Manual 8.15, IM 26-13).

Suggestions

  1. SC / MD / MI rounding: partly folded in, partly deferred.
  2. Float-safe Virginia floor: fixed. np.floor(np.round(min_(payment, maximum), 2)). The $10,000 / $4,000 case is back to its original inputs. Without the rounding it gives $5,988; with it, $6,000. md_tca's new income floor uses the same pattern.
  3. South Carolina near-boundary pair: added. Case 6 is countable income $826.98: benefit $9.99, so $0. Case 7 is $826.20: benefit $10.30, paid.
    • I chose $826.20 instead of $826.90 because it is paid under (A)(4) as well (⌊(851 − 826.20) × 0.4046⌋ = $10). $826.90 would pin $10.02 where the rule pays $0.
  4. References: fixed.
    • mi/mdhhs/fip/minimum_payment.yaml has one BEM 518 entry: href #page=2, title ... Financial Need #page 2-4.
    • Variable references:
      • va_tanf adds Chapter 500 #page=3.
      • sc_tanf adds Chapter 114 #page=210. The manual entry stays one entry, with a # PDF pages 131, 133 comment.
      • md_tca adds .13.
      • mi_fip_income_eligible now cites BEM 518 #page=2 with a # PDF pages 2-5 comment. The existing #page=5 entry is merged into it, because a second entry for the same document would break the one-entry-per-source rule.

Tests

  • The four program folders: 276 passed on the new head.
  • MD (all) and gov/hhs/tanf: 734 passed on d54735d200, before the merge of main.
  • The reference, source-conflict and parameter-key code-health tests pass on d54735d200.
  • No partner test files are touched.

🤖 Generated with Claude Code

@DTrim99

DTrim99 commented Oct 27, 2026

Copy link
Copy Markdown
Collaborator

PR Review (round 2): Apply the $10 minimum payment in Michigan FIP, Virginia TANF, South Carolina TANF and Maryland TCA

Summary

Since round 1 (b92c4eae5e), Pavel pushed one fix commit (d54735d200) and a clean merge of main (fda3e348ad). All three Should items are fixed:

He also took up most of the suggestions:

Law and code. I checked the new Maryland rule against the current COMAR text. A January 2019 OAH decision applies the same rule. I hand-checked every new or changed expectation (10, listed below), and all are right. The new code is vectorized, and no state-gated variable is used as a parameter key.

Guards. The source-conflict ratchet holds. No added or removed comment line matches CONFLICT_COMMENT_RE. No MI, VA, SC or MD file is in KNOWN_UNMARKED, and test_source_conflicts.py passed at the head. The PR doesn't touch any income source list, so the #9558, #10317 and #10408 guards aren't affected.

CI. It is green except the known main-caused Montana AGI failure (Python shard 3; the fix, #10496, is still open) and its aggregator. Microsimulation has since passed; four contrib shards were still pending at my last check (see CI status).

Open findings: 0 critical, 0 should and 1 suggestion (a body detail).

Prior findings

Finding Status Evidence
Should 1: the edited TANF-UP case asserted the UP standard for 2021, conflicting with the approved #10253; the body's overlap claim was out of date Fixed va_tanf.yaml: "If up tanf eligible, the payment is the grant standard less countable income." now sets both standards to 2,400 (period 2021, countable income 1,200, result 1,200). The comment says the result "does not depend on which standard a TANF-UP unit gets". The body's Overlap section is rewritten. The textual conflict with #10253 remains, because both PRs replace the same case. The documented resolution (keep #10253's two cases) works under this PR's code: 200 − 100 = 100 a month, so 1,200 for 2021; 400 − 100 = 300 for 2020-01. A sibling conflict is a branch note only.
Should 2: the whole-dollar floor applied to fractional Virginia standards pays $1-$2 under the printed amounts; the 2025 test pinned $381 against the rule's $382 Fixed (option b, as offered) The body's "Known limitations" states that the model pays $1-$2 below the printed Appendix 2 amounts from July 2021 on, with the $482 / $481 example. #10495 is open and lists all 24 printed 7/22 values against the model. The 2025 tests now use the printed Group II size-3 standard of $482: 482 − 100.40 = 381.60, so 381, which pins the floor on income cents. Pavel's reason for not doing (a) here holds. The standards feed every Virginia unit, the income test and the need and TANF-UP standards, and the $723 maximum sits in the va_tanf.py lines #10253 edits.
Should 3: the axiom: line was missing Fixed The body has axiom: TheAxiomFoundation/rulespec-us#1952 queued. The issue is OPEN, labelled pe-parity and dispatch-ready (see "Axiom line assessment").
Suggestion 1: SC (A)(4), MD E(1) and MI BEM 520 rounding MD fixed; SC and MI declined with reason (accepted) md_tca now uses np.floor(np.round(md_tca_countable_income, 2)) (COMAR .13 E(1)), with new Cases 7 ($438.50 → $10, issued) and 8 ($200.75 → $527). SC Case 5 carries the comment (851 - 820) * 0.4046 = 12.54, so $12. SC and MI are deferred to #10497 (open), which records the $826.80 flip. The SC reason is sound: the whole-dollar need standard belongs in sc_tanf_need_standard, which #10184 adds, and editing that line here would conflict.
Suggestion 2: make the Virginia floor float-safe Fixed va_tanf.py: capped_payment = np.floor(np.round(min_(payment, maximum), 2)). The $10,000 / $4,000 case has its original inputs again: 833.33 − 333.33 = 500.00, so 6,000. Without the cent rounding, float32 gives 499.99997, which floors to $499 (5,988 a year).
Suggestion 3: add a South Carolina pair near $10 Fixed Case 6 ($826.98 → $9.99 → 0) and Case 7 ($826.20 → 10.30). Choosing $826.20 over $826.90 is right: it is also paid under (A)(4), since ⌊(851 − 826.20) × 0.4046⌋ = ⌊10.03⌋ = 10. That keeps the test valid when #10497 lands.
Suggestion 4: references Fixed mi/mdhhs/fip/minimum_payment.yaml has one BEM 518 entry: href #page=2, quoted title ending #page 2-4. va_tanf adds Chapter 500 #page=3. sc_tanf adds Chapter 114 #page=210 and keeps one manual entry under # PDF pages 131, 133. md_tca adds .13. mi_fip_income_eligible uses one BEM 518 entry, #page=2, under # PDF pages 2-5. These follow the CLAUDE.md reference rules. The new URLs return 200: Chapter 500, Chapter 114, BEM 518 and COMAR .13.

New findings

Critical

None.

Should address

None.

Suggestions

  1. The body's Tests paragraph describes the Virginia inputs loosely.
    • What it says. "four new monthly cases in January 2025 with the printed 7/22 Group II size-3 standard of $482 (deficiency $2.80 and $9.99 pays $0, exactly $10 pays $10, $381.60 pays $381)".
    • What the tests use. The $9.99 and $10 cases use a $500 standard (500 − 490.01 and 500 − 490). Only the $2.80 and $381.60 cases use $482.
    • Fix. Say "two of them with the printed ... $482". The results are right either way.

Verified

  • Maryland E(1) and E(2) (COMAR 07.03.03.13, fetched 2026-10-27):
    • E(1): "The local department shall determine a TCA benefit payment amount by deducting the net countable income, rounded down to the nearest dollar, from the allowable amount for the assistance unit size specified in Regulation .17B of this chapter."
    • E(2): "The assistance unit shall be issued a benefit if determined to be eligible for $10 or more."
    • E(3) defines net countable income as income after the disregards. That matches md_tca_countable_income: earned income after the 20% or 40% disregard and the child care deduction, plus gross unearned income.
    • An OAH decision issued 2019-01-04 (OAH No. DBS-OS-18-32460, a 2018 application) applies the same rounding ("net countable income (rounded down to the nearest dollar) is subtracted from the allowable amount ... COMAR 07.03.03.13E(1)"). The MD allowable table in the model starts 2017-10-01.
    • The floor applies only to the benefit amount, as E(1) does. md_tca_income_eligible is unchanged. That can't change any payment. The allowable amounts are whole dollars, so a unit whose unrounded income exceeds the allowable amount would also get $0 with rounded income.
  • Michigan. I found no $10 or other minimum in the Social Welfare Act (MCL chapter 400). MCL 400.6 lets the department set policies outside rule promulgation. So BEM 518 governs without a statute or regulation conflict.
  • Virginia. 22VAC40-295 is silent on rounding and minimums (round 1), so Manual 502.1 governs.
  • South Carolina and Maryland. The regulation is itself the source, and the SC manual agrees.
  • Source conflicts. None of the four states needs a source-conflict record.
  • Code at the head:
    • va_tanf: rounds the capped payment to cents, floors it, and pays nothing under $10.
    • md_tca: floors cent-rounded income, caps the benefit, and pays nothing under $10. Income is never negative: it sums a non-negative earned amount and gross unearned income.
    • sc_tanf and the MI files: unchanged since round 1 except for references.
    • All of this is vectorized (np.floor, np.round, where, min_, max_). The new parameters are scalars, and no state-gated variable is used as a key, so the NH Add New Hampshire state supplementation for 2026 #10156 pattern doesn't apply.
  • Rounding to cents first. It can push a sub-cent fraction up by at most half a cent. That only arises with the model's fractional Virginia standards (for example 481.635 − 99.64 = 381.995, which can round to 382.00 and pay $382). With the printed $482 standard, the rule pays ⌊382.36⌋ = $382 anyway, so the rounding doesn't push any case past what the rule pays.
  • Existing MD expectations. All are whole dollars: md_tca.yaml Cases 1-4 and integration.yaml Cases 1-7 (countable incomes 400, 600, 1,600 and 0). So the new income floor changes none of them, and none of them uses an error margin.
  • Hand-checked expectations, every one new or changed since round 1 (10):
    • va_tanf.yaml:
      1. TANF-UP, 2021: (2,400 − 1,200) / 12 = 100 a month, under the Group III maximum, so ⌊100⌋ × 12 = 1,200.
      2. 2023: 10,000 / 12 − 4,000 / 12 = 500.00 after cent rounding, so 6,000.
      3. 2025-01: 482 − 479.20 = 2.80, ⌊2.80⌋ = 2 < 10, so 0.
      4. 2025-01: 482 − 100.40 = 381.60, so 381.
    • md_tca.yaml:
      5. Case 5: ⌊443.20⌋ = 443, and 448 − 443 = 5 < 10, so 0. The output is unchanged; the comment is updated.
      6. Case 7: ⌊438.50⌋ = 438, and 448 − 438 = 10, so 10. Main pays 9.50, and the round-1 head paid 0.
      7. Case 8 (2024-01): ⌊200.75⌋ = 200, and 727 − 200 = 527, under the 727 cap.
    • sc_tanf.yaml. The need standard for 2 in 2025-01 is 50% × the monthly FPG of $1,703.33 = 851.667:
      8. Case 5: the output is unchanged at 31.667 × 0.4046 = 12.81. The new comment is right: (851 − 820) × 0.4046 = 12.54, so $12.
      9. Case 6: (851.667 − 826.98) × 0.4046 = 9.988 < 10, so 0.
      10. Case 7: (851.667 − 826.20) × 0.4046 = 10.304, so 10.30 within the 0.01 margin. The comment's (A)(4) figure is right: 24.80 × 0.4046 = 10.03, so $10.
    • The round-1 checks of the other cases still hold, since their inputs and the formulas they test are unchanged: the $9.99 / $10 VA pair, the 2023 $8.33 case, the 2021-01 integration floors, the MI eligibility and integration cases, SC Case 4, and MD Case 6.
  • Sibling merges at the current heads:
  • Source-conflict ratchet (Tie source-conflict markers to the register shared with Axiom #10287).
    • No comment line that the PR adds or removes (code, parameters and tests, against main) matches CONFLICT_COMMENT_RE.
    • No MI, VA, SC or MD file is in KNOWN_UNMARKED.
    • At the head, Python shard 1 ran test_source_conflicts.py (35 passed), test_unemployment_compensation_readers.py (4 passed) and test_military_retirement_readers.py (4 passed).
  • Other main-side guards:
  • Changelog. The fixed fragment now also names E(1) rounding.
  • Partner tests. None are touched, and Household API Partners passes.
  • Pre-existing, not this PR's. The first va_tanf reference (the tanfx2fview/.../Chapter-300...#page=51 URL) returns 404. It is used in many VA TANF files and already listed in the known-dead reference registry. The PR only moved it into a tuple.

Axiom line assessment

axiom: TheAxiomFoundation/rulespec-us#1952 queued is valid.

CI status

  • Run. The current run (40530085254, attempt 1) is on fda3e348ad, created 2026-10-27 15:21 UTC. The branch is 0 commits behind main, so this run tests the merged tree.
  • At my last check of gh pr checks 10261 (16:15 UTC): 27 pass, 2 fail, 4 pending.
  • Passing:
    • Baseline: all 11 shards, including states shards 1-4, which cover the MI, VA, SC and MD tests.
    • Rest Python shards 1, 2, 4, 5 and 6.
    • Full Suite - Microsimulation (44m39s).
    • Household API Partners.
    • PR validation (lock, guard tests, lint, changelog).
    • Package and compatibility.
    • Quick Feedback.
    • Contrib (congress, other-shard-2a, other-shard-2b, other-shard-3 and states-shard-3).
  • Failing, main-caused (a CI note, not a finding):
  • Still pending: Contrib (states-shard-1, states-shard-2, states-shard-4 and other-shard-1). The PR touches no contrib reform, and round 1's run passed all of these at b92c4eae5e.

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: 0 critical, 0 should. Full report in the comment above. CI note: the Rest shard 3 failure (test_mt_state_agi_invariants) comes from main and is fixed by #10496; re-run after it lands.

…ar-minimum

# Conflicts:
#	policyengine_us/tests/policy/baseline/gov/states/va/dss/tanf/va_tanf.yaml

@hua7450 hua7450 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed the minimum-payment corrections within #9985, including the comment adding South Carolina and Maryland. Approving the scoped eligibility/payment changes; the separately tracked rounding and standards gaps remain follow-ups.

@PavelMakarchuk
PavelMakarchuk merged commit c545648 into main Oct 27, 2026
33 checks passed
@PavelMakarchuk
PavelMakarchuk deleted the fix-9985-tanf-10-dollar-minimum branch October 27, 2026 23:38
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.

Michigan FIP and Virginia TANF: mi_fip and va_tanf pay amounts under the states' $10 minimum

3 participants