Skip to content

Add Virginia state supplementation for 2026 - #10172

Merged
hua7450 merged 7 commits into
mainfrom
va-ssp-2026
Oct 20, 2026
Merged

hua7450 merged 7 commits into
mainfrom
va-ssp-2026

Conversation

@hua7450

@hua7450 hua7450 commented Oct 12, 2026 •

Copy link
Copy Markdown
Collaborator

What and why

Virginia's Auxiliary Grant (AG) was missing from PolicyEngine-US. Add va_ag for 2026 (Va. Code § 51.5-160; 22VAC30-80-50; 2026 Appropriation Act Item 332; AG Manual). Virginia administers the grant itself (AG Manual Chapter A), so there is no SSA rounding or $1 minimum.

  • Who qualifies:

    • an SSI recipient, or an adult who meets every SSI requirement except income (Chapter C § 8);
    • in an approved assisted living facility, adult foster care home or supportive housing placement (va_ag_certified);
    • aged, blind or disabled; a citizen or qualified alien (Chapter C § 9.4); and not incarcerated;
    • with resources within $2,000 / $3,000 unless receiving SSI (Chapter E § 5).

    An applicant who appears to meet SSI income standards must apply for SSI (Chapter C § 8.2.2).

  • The grant: the care rate plus the $87 personal needs allowance, minus countable income, rounded to the nearest dollar (22VAC30-80-50; Chapter J).

    • The maximum rate is the SSI federal benefit rate plus $1,136: $2,130 in 2026, and $2,450 in Planning District Eight (15% more, rounded). The offset is inferred from the 2024–2026 rates, which rose by each SSI COLA (Item 332 A.3).
    • va_ag_facility_rate enters an approved assisted living facility rate below the maximum.
    • The entry month is prorated on a 30-day month (va_ag_partial_month_days).
  • Countable income:

    • SSI recipients use SSA's countable income plus the SSI payment (Chapter D).
    • Others get the $20 and $65 + ½ exclusions on their own income (Chapter H).
    • A couple entering care together is one unit only in the application month (Chapter B § 6; va_ag_is_joint_initial_month).
    • va_ag_allowable_income_exclusions enters the state exclusions (Chapter D § 6).
  • Inputs: all default to 0 or false, so entering one for one person leaves other household members unchanged. One-month inputs (partial-month days, the initial couple month and the state exclusions) don't carry into later months.

AG is added to the household and SPM benefit totals and to SNAP and HUD unearned income.

References

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

Coverage limits

The registry marks Virginia as partial, verified for 2026.

Not modeled:

  • conditional resource benefits and historical grandfathering;
  • placement certification and the state income exclusions, which are inputs.

In the entry month of a resident whose spouse stays home, the model uses SSA's deemed amounts (Chapter D), though Chapter B § 6 makes the unit the applicant only. For later months, put the spouses in separate marital units.

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

Related: #10226 tracks the reform copies of spm_unit_benefits (such as the Texas rebate's), which this PR leaves unchanged.

Test plan

  • 40 Virginia AG YAML cases (30 in va_ag.yaml, 10 in integration.yaml). They cover:
    • the standard and Planning District Eight rates, the 2027 FBR link, a capped facility rate, proration and rounding;
    • SSI and non-SSI budgets, state exclusions, resources, immigration, incarceration and the SSI application gate;
    • couples: joint and separate SSI claims, entry-month deeming, initial-month pooling and the couple resource limit;
    • two people with an input on one only, and one-month inputs that stay in their month;
    • SNAP, HUD and household benefit wiring.
  • After merging main: all 560 Virginia 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: Va. Code § 51.5-160; 22VAC30-80-50; 2026 Appropriation Act Item 332; AG Manual Chapters B-D, H, J TheAxiomFoundation/rulespec-us#1787 queued

hua7450 and others added 3 commits October 12, 2026 14:36
…s and tests

- Exclude interest and dividends from the non-SSI budget, per the AG manual
- Document how ongoing-care spouses are represented; one locality-maximum lookup
- Registry placement and comments, SNAP reference title, shorter programs.yaml note
- Manual page anchors and Planning District 8 sources; age-gate citation
- Corrected ongoing-care and interest cases; joint initial-month and realistic households

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 13, 2026

Copy link
Copy Markdown
Collaborator

PR Review: Add Virginia state supplementation for 2026

PR #10172 (author: hua7450, head 0e6fa7c292, merge-base 2e9eea7e6e). 23 files (+786/−4), 3 commits.

Summary

The PR adds Virginia's Auxiliary Grant (AG). This is the state-administered supplement for SSI recipients, and for people who would get SSI except for income, who live in an assisted living facility (ALF), an adult foster care home (AFCH) or supportive housing (SH).

  • Parameters (gov.states.va.dars.ag):
    • rate.standard is $2,130 and rate.northern_virginia is $2,450, both from 2026-01-01.
    • personal_needs_allowance is $87 from 2024-01-01.
    • northern_virginia_localities lists the nine Planning District 8 localities.
    • proration_days is 30.
    • excluded_unearned_sources lists dividends and interest.
  • Variables (all Person, MONTH):
    • va_ag_eligible (defined_for = StateCode.VA) requires all of: a certified placement, SSI aged/blind/disabled status, citizenship or SSI-qualified noncitizen status, SSI receipt or resources within $2,000 / $3,000, and no incarceration.
    • va_ag_maximum_care_rate picks the rate by county. va_ag_care_rate is an input that defaults to the maximum.
    • va_ag_countable_income:
      • For SSI recipients it is SSA's countable income plus the SSI payment.
      • For everyone else it applies the SSI exclusions to the person's own income. A couple's income is pooled only in the initial month (va_ag_is_joint_initial_month).
      • Both paths then subtract the state exclusions input.
    • va_ag rounds (prorated rate + personal needs allowance − countable income) to the nearest dollar.
  • Aggregates and registry. household_state_benefits (all four year blocks), spm_unit_benefits, SNAP unearned income, HUD unearned income, and a programs.yaml entry (partial, verified_years: '2026').
  • Tests: 28 YAML cases, 21 in va_ag.yaml and 7 in integration.yaml.

The 2026 policy content is right:

  • Amounts. $2,130, $2,450 and $87 match the DARS rate letter of November 10, 2025 and Item 332 A.1–A.2 of the 2026 Appropriation Act.
  • Formula. It matches 22VAC30-80-50 and AG Manual Chapter J:
    • The AG limit is the rate plus the allowance, minus countable income.
    • The result is rounded to the nearest dollar, and no payment is made on a deficiency of $.49 or less.
    • The entry month is prorated on a 30-day month.
  • Income and eligibility.
    • Countable income follows Chapter D (SSI recipients) and Chapter H (non-SSI).
    • The assistance-unit rule follows Chapter B § 6, and the resource limits follow Chapter E § 5.
    • The alien rules follow Chapter C § 9.4, which mirror SSI's.
  • Administration. Virginia administers the program itself. It is not on SSA's January 2026 list of federally administered supplements.
  • Tests and branch. All 28 expectations check by hand and pass at the head. The branch merges cleanly with main.

The one failing CI check is the Rest job, cancelled at its 90-minute limit after every test it ran had passed. That is infrastructure, not this PR.

Two should-fix items remain, the same two as in #10174, #10168 and #10167:

  • The PR body's axiom: needed isn't a valid form for a staff PR.
  • Four of the six new parameter descriptions don't follow the house template.

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. main's CLAUDE.md, "Axiom Parity (required for policy changes)":
    • "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 who can't complete the Axiom work, 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.
  • 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: Va. Code § 51.5-160; 22VAC30-80-50 TheAxiomFoundation/rulespec-us#NNNN queued. The issue needs:
    • Module paths, for example:
      • us-va/statutes/51.5/... for § 51.5-160 B and C, following the existing us-va/statutes/58.1/58/1-320.yaml layout
      • us-va/regulations/22vac30-80/22vac30-80-50.yaml for the rate, allowance and countable-income rule, on the us-al/regulations/660-4/ pattern
      • us-va/policies/dars/auxiliary-grant-manual/... for Chapter J (limit, proration, rounding), Chapter D § 5–6 (SSI-recipient income), Chapter H § 2–4 (non-SSI exclusions) and Chapter B § 6 (assistance unit)
      • us-va/policies/dss/appropriation-act/2026/item-332-a.yaml for $2,130, the 15% Planning District Eight differential and $87
    • Corpus citations, plus the blocker if a source isn't in the corpus yet.
    • Verbatim law: the passages quoted under Verified correct.
    • Required outputs (Person, monthly):
      • Money parameters: the maximum rate ($2,130; $2,450 in Planning District 8) and the allowance ($87).
      • A Judgment: an SSI recipient, or someone who meets every SSI requirement except income (Chapter C § 8). For non-SSI applicants, also resources within $2,000 / $3,000. Also resides in an approved ALF, AFCH or SH placement.
      • A Money output: the rate (prorated by rate ÷ 30 × days in the entry month) plus the allowance, minus countable income. Round to the nearest dollar, and pay nothing when the deficiency is $.49 or less.
      • Countable income: gross SSI plus SSA's net earned and unearned income, less the state exclusions (Chapter D § 5). Non-SSI applicants get the $20 and $65 + ½ exclusions on their own income. A couple forms one assistance unit only in the application month.
    • Companion tests from the same sources, not from PolicyEngine output:
      • Chapter J § 3.3, Example 1 (p. 522): $1,221 ÷ 30 × 12 = $488.40, plus $82, gives a limit of $570.40.
      • Example 2 (p. 523): 19 days gives $773.30, plus $82, for a limit of $855.30.
      • Chapter J § 6.1.2 (p. 526), with countable income of $700: $1,221 + $82 − $700 = $603, and in Planning District 8, $1,404 + $82 − $700 = $786.
      • Chapter J § 5.1 (p. 524): $64.45 pays $64, $64.56 pays $65, and $.45 pays $0.
      • Chapter D § 6.4.1.1 (p. 130): $623 of SSI less a $10 guardianship fee leaves $613.
      • 2026 letter and Item 332, an SSI-only resident: $2,130 + $87 − $994 = $1,223; in Planning District 8, $1,543.
  • The batch. The sibling SSP PRs all carry axiom: needed and need the same fix.

2. Four of the six new parameter descriptions don't follow the house template.

  • Where:
    • parameters/gov/states/va/dars/ag/rate/standard.yaml:1 and rate/northern_virginia.yaml:1 both read "Virginia provides this monthly approved Auxiliary Grant care rate in this locality group."
      • Neither has the "under the ... program" clause.
      • The two sentences are identical, so neither says which locality group it covers.
    • northern_virginia_localities.yaml:1: "Virginia applies the Planning District 8 care rate in these localities."
    • proration_days.yaml:1: "Virginia divides the monthly care rate by this number of days when prorating an initial partial month."
  • The template: "one sentence, spell the program out fully (no acronyms), [State] [verb] ... under the [Full Program Name] program."
    • excluded_unearned_sources.yaml and personal_needs_allowance.yaml in this PR already follow it.
    • So do the siblings on main. For example, ga/dhs/ssp/amount.yaml: "Georgia provides this amount as the monthly supplement under the State Supplementary Payment program." And Indiana's per diem: "Indiana provides this amount as the daily per diem rate for licensed residential care facilities under the Residential Care Assistance Program."
  • Fix:
    • rate/standard.yaml: "Virginia provides this amount as the maximum monthly care rate outside Planning District Eight under the Auxiliary Grant program."
    • rate/northern_virginia.yaml: "Virginia provides this amount as the maximum monthly care rate in Planning District Eight under the Auxiliary Grant program."
    • northern_virginia_localities.yaml: "Virginia applies the Planning District Eight care rate in these localities under the Auxiliary Grant program."
    • proration_days.yaml: "Virginia divides the monthly care rate by this number of days to prorate the entry month under the Auxiliary Grant program."

Suggestions

  1. Rates and allowance before 2026 (deferral documented in the PR body).

    • The leak. Both rates have only a 2026-01-01 value, so backdating carries $2,130 / $2,450 back to 2015. The allowance's first value, $87, also carries back before 2024. Probe at the head, an aged SSI-only resident:

      Month Model va_ag Law Gap
      2025-01 1,250 2,103 + 87 − 967 = 1,223 +27
      2025-01, Fairfax 1,570 2,418 + 87 − 967 = 1,538 +32
      2024-01 1,274 2,079 + 87 − 943 = 1,223 +51
      2022-01 1,376 1,609 + 82 − 841 = 850 +526
    • The sources:

      • The PR's own rate letter: "The Auxiliary Grant rate will increase by $27 dollars from $2,103 to $2,130 ... Rates in Planning District 8 (Northern VA) will increase from $2,418 to $2,450".
      • 2025 Act (Ch. 725) Item 328 A.1: "Effective January 1, 2025 ... not to exceed a maximum rate of $2,103 per month".
      • 2024 Act (Ch. 2) Item 328 A.1: "Effective January 1, 2024 ... $2,079".
      • 2023 Act (Ch. 1) Item 344 A.1–A.2: "Effective January 1, 2022 ... $1,609" and "Effective January 1, 2013, the monthly personal care allowance ... shall be $82 per month".
    • Fix:

    • Going forward (optional).

      • Since 2024 the rate has risen by exactly the SSI COLA: 2,079 − 943 = 2,103 − 967 = 2,130 − 994 = 1,136. The letter says "This includes the COLA increase of $27 from Social Security", and Item 332 A.3 allows the department to raise the rate "on January 1 of each year in which the federal government increases Supplemental Security Income".
      • With the rate frozen, the 2027 probe gives 14,340 (1,195 a month) instead of 1,223 a month.
      • Consider a note, or uprating the rate by the FBR increase.
  2. The Texas rebate reform's copy of spm_unit_benefits now omits va_ag.

    • Where: policyengine_us/reforms/states/tx/rebate/tx_rebate.py:45-127 redefines spm_unit_benefits nationwide with a hard-coded list. It already lacks ca_state_supplement, and after this PR it also lacks va_ag.
    • Probe at the head: an aged SSI-only certified resident in 2027.
      • spm_unit_benefits is 26,902.01 at baseline and 12,562.01 under the reform, a drop of exactly the 14,340 of va_ag.
      • spm_unit_net_income falls by the same amount, and household_net_income (27,553.01) is unchanged.
    • Fix: insert "va_ag", # Virginia 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 three income-attribution readings.

    • (a) A spouse at home is deemed by default on the SSI path.
      • What happens. Integration Case 3 sets is_ssi_spousal_deeming_applies: false. Remove that override and the probe gives deeming [true, false], SSI 11, ssi_countable_income 1,480 and va_ag 726, instead of SSI 994 and va_ag 1,223.
        • Because the grant fills income up to the limit, the resident's total falls by the full $1,480 of the spouse's income, which stays with the spouse.
        • The non-SSI path already ignores the spouse. With the resident's own Social Security at $2,000, the probe gives va_ag_countable_income 1,980 and va_ag 237 whether or not the spouse is deemed.
      • The law points to no deeming.
        • AG Manual Chapter B § 6 (p. 34): "The assistance unit consists of the AG applicant only", except in the application month.
        • 20 CFR 416.1160(a)(1) deems "If you live in the same household with your ineligible spouse".
      • The PR documents the workaround in va_ag_countable_income.py and va_ag_is_joint_initial_month.py.
      • Fix: either subtract ssi_income_deemed_from_ineligible_spouse from the SSI-branch countable income (va_ag_countable_income.py:52-53) outside the joint initial month, or keep the workaround and add the default case above as a pinned test.
    • (b) The grant replaces SSI when SSI isn't taken up.
      • What happens. With takes_up_ssi_if_eligible: false, the probe gives SSI 0, va_ag_countable_income 0 and va_ag 2,217. The grant covers the FBR too.
      • The law. AG Manual Chapter C § 8 (p. 93): "AG is limited to individuals who are SSI recipients and those who meet all of the SSI eligibility requirements except for income."
        • § 8.2.2 (p. 94): an applicant who "Appears To Meet SSI Income Standards ... must apply for SSI".
        • p. 95: if no application is filed within 15 days, "Deny the AG application".
      • Why it is only a suggestion. va_ag_certified's documentation already folds in "pursuit of other benefits", and take-up defaults to true.
      • Fix: gate the non-SSI path on SSI take-up, or say in va_ag_certified that certification implies an SSI application. Then pin the chosen behavior.
    • (c) Integration Case 2's joint flag does nothing.
      • Case 2 is titled "initial couple computation". The probe gives va_ag [1472, 1472] with and without va_ag_is_joint_initial_month, because the SSI branch never reads the flag. The 1,472 comes from the joint SSI claim (745.50 each).
      • Fix: rename it, for example "joint SSI couple claim". Case 7 already covers the pooled non-SSI budget.
  4. Untested branches.

    • Immigration gate. No case covers va_ag_eligible.py:15-16,29 (citizen or is_ssi_qualified_noncitizen). AG Manual Chapter C § 9.4 (p. 102): "Eligibility for aliens is limited to those that are determined qualified aliens".
    • Incarceration. No case covers the gate at va_ag_eligible.py:31.
    • Care-rate cap. No case covers va_ag.py:19 when va_ag_care_rate is above the maximum. Item 332 A.1 says "not to exceed a maximum rate of $2,130".
    • Asymmetric non-SSI couple. This shows the joint flag matters:
      • Social Security of $30,000 and $18,000, both aged.
      • Separate: [0, 737].
      • Joint: [227, 227], from (4,000 − 20) ÷ 2 = 1,990 against a limit of 2,217.
    • Fix: add these four cases to va_ag.yaml / integration.yaml.
  5. Polish.

    • Blank lines. The PR adds a stray blank line before metadata: in household_state_benefits.yaml (line 408) and in hud/annual_income/sources/unearned.yaml (line 33). Neither relates to Virginia.
    • Case count. The PR body says "26 source-based YAML cases". The PR has 28 (21 + 7).
    • The statute is never cited. Add Va. Code § 51.5-160 to va_ag.py and personal_needs_allowance.yaml. Its subsection C reads: "Auxiliary grant recipients shall be entitled to a personal needs allowance when computing the amount of the auxiliary grant. The amount of such personal needs allowance shall be set forth in the appropriation act."
    • Authority for January–June 2026. The 2026 Act (HB30, Ch. 1) appropriates for FY2027–FY2028, starting July 1, 2026. It restates the January 1, 2026 rate, so it corroborates the value. The authority for January–June 2026 is the 2025 Act (Ch. 725) Item 328 A.3 together with the rate letter. Consider adding that item as a reference.
    • Naming. Integration Case 1, "separate institutional SSI claims", concerns an ALF, which isn't an institution for SSI purposes. "Separate SSI claims" is clearer.

Verified correct

  • Statute. Va. Code § 51.5-160 B: the program assists people who "(i) are ineligible for benefits under Title XVI ... or for whom benefits provided under Title XVI ... are not sufficient to maintain the minimum standards of need ... and (ii) reside in supportive housing, an assisted living facility licensed by the Department of Social Services ..., or an adult foster care home approved by a local board of social services".
    • § 51.5-160 C has the appropriation act set the allowance.
  • Regulation.
    • 22VAC30-80-50: "The AG payment is determined by adding the rate plus the personal needs allowance minus the individual's countable income." That is va_ag.py:22-27.
    • 22VAC30-80-10 defines AG as a program "to supplement income of an individual receiving Supplemental Security Income (SSI) or adult who would be eligible for SSI except for excess income, who resides in an ALF, an AFC home, or a supportive housing setting with an established rate".
  • 2026 amounts.
    • DARS rate letter (November 10, 2025): "There will be an increase in the Auxiliary Grant rate effective January 1, 2026. The Auxiliary Grant rate will increase by $27 dollars from $2,103 to $2,130 ... Rates in Planning District 8 (Northern VA) will increase from $2,418 to $2,450 due to the 15 percent differential. The personal needs allowance will remain at $87."
    • 2026 Act Item 332:
      • A.1: "Effective January 1, 2026 ... not to exceed a maximum rate of $2,130 per month, which rate is also applied to approved adult foster care homes ... The department may add a 15 percent differential to the maximum amount for licensed assisted living facilities and adult foster care homes in Planning District Eight."
      • A.2: "Effective January 1, 2024, the monthly personal care allowance for auxiliary grant recipients ... shall be $87 per month". That matches the 2024-01-01: 87 date.
    • Rounding of the differential. 2,130 × 1.15 = 2,449.50, published as $2,450. 2,103 × 1.15 = 2,418.45, published as $2,418. Parameterizing the published amount is right.
  • Planning District 8. AG Manual SH chapter (p. 542): "Planning District 8 consists of the counties of Arlington, Fairfax, Loudoun, Prince William and the cities of Alexandria, Fairfax, Falls Church, Manassas and Manassas Park."
    • All nine names exist in the county enum.
    • Probe: each gives 2,450, and Richmond city and Stafford county give 2,130.
  • Computation, AG Manual Chapter J.
    • The steps (p. 519): "Step 2 Determine the individual's AG Limit by adding the appropriate rate for his/her locality to the Personal Needs Allowance ... Step 3 Subtract the individual's net countable income from the AG Limit. Step 4 Round the remainder to the nearest dollar."
    • Proration (p. 522): "Divide the full monthly rate by 30 ... 30 is the number of days used regardless of the actual number of days within the month of entry". Also: "The number of days includes the day of entry but not discharge" and "Add the result to the full personal needs allowance".
      • The note "The rate is not prorated for the month of discharge when the month of discharge is later than the month of entry" matches the va_ag_days_eligible documentation.
      • Probes: 30 days in January gives the full 1,223. In February, 28 days gives 1,223 (a full month) and 27 days gives 2,130 ÷ 30 × 27 + 87 − 994 = 1,010.
    • Rounding (p. 524): "Amounts ending in $.01 through $.49 are to be rounded down ...; from $.50 through $.99 to the next higher dollar. When the budgetary deficiency is $.49 or less, no payment is to be made."
      • np.floor(x + 0.5) does this.
      • Probes: a deficiency of 0.49 pays 0 and 0.50 pays 1. Case 6 (468.50 → 469) pins the half-dollar.
    • The approved facility rate. "ALF/AFCH Rate ... publishes the maximum rate" (p. 520), and Item 332 bases facility rates on 85% occupancy, "not to exceed" the maximum. That supports va_ag_care_rate capped at the maximum.
  • SSI recipients, Chapter D (p. 126): "The total countable monthly amount is calculated by adding the gross SSI payment amount to the net earned and net unearned income amounts as determined by SSI and subtracting the Virginia income exclusions."
    • That matches va_ag_countable_income.py:52-55.
    • Resources are "deemed to have met" for SSI recipients (p. 125). That supports (ssi > 0) | ... at va_ag_eligible.py:23.
    • The four state exclusions (community expenses, child at home, spouse at home, guardianship fee; pp. 127–132) are an input. Its documentation follows the Chapter D § 6.4.1.2.2 order.
  • Non-SSI applicants.
    • Exclusions, Chapter H:
      • "The first $20 per month of income ... is excluded" (p. 373)
      • "An eligible couple receives only one $20 exclusion per month" (p. 374)
      • "$65 per month of earned income plus one-half of the remaining earned income" (p. 374)
      • "The $65 earned income exclusions are applied only once to a couple" (p. 374)
      • _apply_ssi_exclusions on pooled income, then halved, matches all four.
    • Interest and dividends, Chapter I § 24.1.1 (p. 439): "Dividends or interest earned on countable resources are not income." Excluding all of it, because the inputs can't flag excluded resources, is a documented and reasonable simplification (Case 21).
    • Resources, Chapter E § 5 (p. 152): "Individual $2000 Couple $3000". That is the SSI limit parameter.
  • Assistance unit, Chapter B § 6 (pp. 34–35): the couple is a unit only when both were married and living together "As of the first moment of the month of application", and each entered care, applied and was found eligible that month. "This situation can exist only in the month of application. ... Sharing a room in an institution is not living in the same household."
    • That matches va_ag_is_joint_initial_month (Cases 4 and 7).
  • Covered groups and aliens.
    • Chapter C § 2 (p. 75): "The AG covered groups are aged, blind and disabled". That supports is_ssi_aged_blind_disabled.
    • The qualified-alien chart in § 9.4.3.1 (pp. 108–111) uses SSI's conditions (40 quarters, the 7-year refugee/asylee limit, receipt on 8/22/96). That supports is_ssi_qualified_noncitizen.
  • Administration.
    • POMS SI 01415.058 A (January 2026) lists California, Delaware, DC, Hawaii, Iowa, Michigan, Montana, Nevada, New Jersey, Pennsylvania, Rhode Island and Vermont as federally administered. Virginia is absent.
    • AG Manual Chapter A (p. 2): "Virginia opted for self-administration."
    • So there is no SSA rounding and no $1 minimum, and the PR correctly doesn't use the shared _ssi_state_supplement helper.
  • Kept out of SSI income. 20 CFR 416.1124(c)(2) excludes "Assistance based on need which is wholly funded by a State or one of its political subdivisions". AG is funded 80% by the state and 20% by localities (AG Manual SH chapter, p. 536).
    • va_ag isn't in the SSI income sources, so there is no circularity.
    • It holds only the state grant, so summing it with ssi doesn't double-count.
  • Counted for SNAP and HUD. 7 CFR 273.9(b)(2)(i) counts "other assistance programs based on need". The SNAP reference consolidation matches the batch. The HUD addition matches the batch convention.
  • Code:
    • Vectorized throughout (where, min_, max_, clip, np.isin).
    • Periods. YEAR stocks and flags use period.this_year (age status, resources, county, immigration). YEAR flows come in monthly through period. The MONTH grant sums to 14,676 for 2026 (Integration Case 5).
    • No hard-coded policy values. The 0.5 is the rounding offset and the 2 is couple size.
    • References.
      • The PDF anchors open the cited text: p. 34, 69, 75, 127, 439, 519, 520, 522 and 542.
      • The variable tuples carry # PDF pages comments.
      • The rate letter is a single page, so it needs no anchor.
    • Callers. va_ag is referenced only in the lists this PR edits, including all four household_state_benefits year blocks.
    • Microsimulation. va_ag_certified defaults to false, so microsimulation pays nobody. That is consistent with the partial status.
  • Hand checks: all 28 expectations. The 2026 FBR is $994 for an individual and $1,491 for a couple. The limit is 2,130 + 87 = 2,217.
    • va_ag.yaml:
      • Case 1: 2,217 − 994 = 1,223.
      • Cases 2 and 3: 2,450 + 87 − 994 = 1,543 (Fairfax County, Manassas Park).
      • Case 4: 2,000 − 20 = 1,980 (SSI 0), so 237.
      • Case 5: SSI countable is (600 − 85) ÷ 2 = 257.50 and SSI is 736.50. 257.50 + 736.50 = 994, so 1,223.
      • Case 6: (1,500 − 20) + (602 − 65) ÷ 2 = 1,748.50, so 468.50, paid as 469.
      • Case 7: 2,450 ÷ 30 × 14 = 1,143.33; + 87 − 994 = 236.33, paid as 236.
      • Case 8: 2,000 + 500 − 20 = 2,480 is above 2,217, so 0.
      • Cases 9 and 10: resources of 2,000 give 1,223; 2,001 gives 0.
      • Cases 11–13: not certified, North Carolina and age 40 each give 0.
      • Cases 14 and 15: disabled at 18 and blind at 45 each give 1,223.
      • Case 16: 2,130 ÷ 30 × 15 = 1,065; + 87 − 994 = 158.
      • Case 17: 0 days gives 0.
      • Case 18: 1,152 − (994 − 400) = 558.
      • Case 19: 2,217 − (994 − 10) = 1,233.
      • Case 20: 1,500 + 87 − 994 = 593.
      • Case 21: SSI counts 2,000 + 5 − 20 = 1,985, so SSI is 0. The AG budget excludes the interest: 1,980, so 237.
    • integration.yaml:
      • Case 1: separate claims give SSI 994 each and 1,223 each.
      • Case 2: a joint claim gives SSI 745.50 each; 2,217 − 745.50 = 1,471.50, paid as 1,472.
      • Case 3: SSI is [994, 0] and va_ag is [1,223, 0].
      • Case 4: resources of 1,500 + 1,501 = 3,001 are above 3,000, so SSI is 0 and va_ag is 0.
      • Case 5: 12 × 1,223 = 14,676. SNAP and HUD unearned income are 11,928 + 14,676 = 26,604.
      • Case 6: separate marital units, so no deeming. SSI is 994, the maximum rate is 2,130 and va_ag is 1,223.
      • Case 7: (3,200 − 20) ÷ 2 = 1,590 each. 745.50 − 1,590 is negative, so SSI is 0, and 2,217 − 1,590 = 627 each.
  • Changelog: changelog.d/va-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.
    • partial fits the unmodeled conditional benefits and grandfathering.
    • parameter_prefix resolves.

Batch checks

  1. Axiom line: SHOULD (Should 1). axiom: needed is invalid for a staff PR. rulespec-us has no Virginia AG module or issue, so a dispatch-ready pe-parity issue and a queued line are needed.
  2. Parameter descriptions: SHOULD (Should 2). rate/standard.yaml, rate/northern_virginia.yaml (whose sentences are identical), northern_virginia_localities.yaml and proration_days.yaml are off-template. The other two are fine.
  3. Backdating: SUGGESTION (Suggestion 1). The rates leak $2,130 / $2,450 into years before 2026, where the Acts give $2,103 / $2,418 (2025), $2,079 (2024) and $1,609 (2022). The allowance leaks $87 into years before 2024, where it was $82 (from January 1, 2013). The PR claims only 2026 and documents the deferral.
  4. tx_rebate.py copy: SUGGESTION (Suggestion 2). va_ag is missing, which costs a Virginia AG resident 14,340 of SPM resources in 2027. ca_state_supplement is still missing too.
  5. Aggregate wiring: complete, with no double count. va_ag is in spm_unit_benefits, all four household_state_benefits blocks, HUD unearned, SNAP unearned and programs.yaml. It holds only the state grant, separate from ssi.
  6. Income attribution: correct for 2026, with three readings to pin (Suggestion 3).
    • Pinned: separate and joint SSI couples, pooled non-SSI couples in the initial month, the couple resource limit, and the deeming override (two forms).
    • Still to pin: deeming when the override is absent, SSI take-up, and Case 2's inert flag.
  7. Sibling conflicts (branch note):
  8. CI: one failing check, classified as infrastructure.
    • "Python tests / Full Suite - Rest (Python + variables)" was cancelled at the job's timeout-minutes: 90 ("The job has exceeded the maximum execution time of 1h30m0s").
    • Every test it ran passed: 4,266, with 11 skipped and 0 failed.
    • It touches none of this PR's tests. The same job ran 74–88 minutes on the sibling runs that day.
    • Re-run it. No code change is needed.
  9. State law first: done.
    • Read Va. Code § 51.5-160; 22VAC30-80-10, -15, -20, -40, -45, -50 and -60; the 2023, 2024, 2025 and 2026 Appropriation Act items; the 2026 DARS rate letter; AG Manual Chapters A–E, H, I § 24, J and the SH chapter; POMS SI 01415.058 A and SI 01401.001.
    • SSA's "State Assistance Programs for SSI Recipients" Virginia page returned HTTP 403, so administration rests on POMS and the Manual.
    • Every 2026 amount, the locality split, state administration and the January 1, 2026 effective date check out.
    • All 28 expectations check by hand.

Axiom line assessment

Invalid (Should 1).

CI status

25 of 26 checks pass; 1 failure, which is infrastructure (gh pr checks 10172). Three "skipping" entries belong to the superseded run 38359305588.

  • The run. Run 38367941792 on head 0e6fa7c292.
  • The failure. Job 115200102624, "Python tests / Full Suite - Rest (Python + variables)", conclusion cancelled.
    • The annotation reads "The job has exceeded the maximum execution time of 1h30m0s", and the limit is .github/workflows/python-tests.yaml:13.
    • All nine Rest Python groups passed (17 + 52 + 54 + 29 + 1,362 + 52 + 424 + 106 + 2,170 = 4,266 passed, 11 skipped, 0 failed). The last finished at 11:43:27, 89 minutes in.
    • The cancellation at 11:44:33 came before the step "Run tests/variables YAML tests". That step runs policyengine_us/tests/variables, which this PR doesn't touch.
  • Sibling runs the same day. The same job took 74 minutes on Add Pennsylvania state supplementation for 2026 #10167, 88 on Add Wyoming state supplementation for 2026 #10174 and 88 on Add Rhode Island state supplementation for 2026 #10168 (all success). It was cancelled at 90 on Add Vermont state supplementation for 2026 #10171.
    • main hasn't changed this workflow or the Rest Makefile targets since the merge-base, so a re-run is the remedy.
  • Where the new tests run. This PR's YAML files run in the baseline states shards, which pass.
  • Local run. The two new test files at the head with policyengine-core 3.33.3: 28 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: $2,130 / $2,450 (Planning District 8) / $87 match the DARS rate letter and the 2026 Act Item 332, the formula follows 22VAC30-80-50 and AG Manual Ch. J, and all 28 cases check by hand. Two should items (see the comment above): (1) 'axiom: needed' isn't valid for staff and rulespec-us has no Auxiliary Grant module, so file a dispatch-ready pe-parity issue and add a queued line; (2) four parameter descriptions are off the template. The one CI failure is the Rest job hitting its 90-minute limit after 4,266 tests passed with 0 failures, which is infrastructure; I've re-run it.

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 changes are in af62c8b and 1a6e32c, with a merge of main (70876d7) between them.

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

  • your module paths;
  • the verbatim § 51.5-160, 22VAC30-80-50, Item 332 and AG Manual text;
  • the required outputs;
  • your companion cases (Chapter J Examples 1 and 2, § 5.1 and § 6.1.2, Chapter D § 6.4.1.1, and the 2026 SSI-only resident) mapped to the PE cases.

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

Should 2 (descriptions): northern_virginia_localities.yaml and proration_days.yaml use your wording. The two rate files are gone (see Suggestion 1), and their replacements, rate/fbr_offset.yaml and rate/northern_virginia_differential.yaml, follow the template.

Suggestion 1 (rates):

  • History stays out of scope, so I didn't add the 2022–2025 values or the $82 allowance, and didn't open a backlog issue.
  • Going forward, the maximum rate is the FBR plus the $1,136 offset you found (2,130 − 994; 2,103 − 967 and 2,079 − 943 give the same). Planning District Eight is that rate × 1.15, rounded to the nearest dollar (2,449.50 → 2,450).
  • Your 2027 probe now gives 1,223 a month instead of 1,195. va_ag.yaml Case 29 pins it.
  • The offset is inferred, not stated in law. The comment in fbr_offset.yaml says so, and notes that a reform lowering the FBR would also lower the rate below the appropriated amount.

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: I removed the is_ssi_spousal_deeming_applies override instead of keeping the workaround.
    • Setting that formula variable as an input for one person resets everyone else to its default. In one probe, the override for one resident switched off deeming for an unrelated couple in the same household (SSI 11 → 994).
    • va_ag_certified now says to put the spouses in separate marital units for the months after they stop living together, and to simulate the entry month with one unit. Integration Case 6 is the after-entry case.
    • Integration Case 3 now pins the entry month with no override. SSA still deems the spouse's income, since 20 CFR 416.1163(f)(2) stops deeming only from the following month: SSI 11, va_ag_countable_income 1,491, va_ag 726.
    • Chapter D uses SSA's amounts, but Chapter B § 6 makes the unit the applicant only. A NOTE in va_ag_countable_income.py and the conflict comment cover this.
  • (b) Take-up: va_ag_eligible now requires takes_up_ssi_if_eligible | (uncapped_ssi <= 0) (Chapter C §§ 8.2.1, 8.2.2, 8.2.2.2.1).
    • Case 25: an applicant who meets SSI income standards but doesn't apply gets 0, not 2,217.
    • Case 26: an applicant over the SSI income limit still gets 237.
  • (c) Integration Case 2: renamed "joint SSI couple claim".

Suggestion 4 (untested branches): all four added.

  • Case 22, a noncitizen who isn't a qualified alien: 0.
  • Case 23, an incarcerated person: 0.
  • Case 24, a facility rate of 2,500, capped at 2,130: 1,223.
  • Integration Cases 8 and 9, your asymmetric couple: [0, 737] after the initial month (separate marital units) and [227, 227] in it.

Suggestion 5 (polish):

  • I kept the blank lines before metadata:; they come from our formatting pass and are harmless.
  • The body's case count is updated.
  • va_ag.py and personal_needs_allowance.yaml cite § 51.5-160, and the rate and allowance files add the 2025 Act Item 328 A.
  • Integration Case 1 is renamed "separate SSI claims", and it now uses separate marital units instead of the ssi_claim_is_joint override.

Other fixes I found:

  • Input-reset trap. va_ag_care_rate and va_ag_days_eligible were formulas that users had to set as inputs. Entering a care rate for one resident set every other resident's rate to 0; in one probe, a second resident got 0 instead of 1,223.
    • They now read new zero-default inputs: va_ag_facility_rate (0 means the maximum; a higher entry is capped) and va_ag_partial_month_days (0 means a full month).
    • va_ag.yaml Case 27 pins two residents with one input each: [593, 158].
  • Inputs that carried into later months. policyengine-core reuses a formula-less monthly input in later months.
    • va_ag_is_joint_initial_month entered for January kept pooling the couple in February (627 instead of 637). Integration Case 10 now pins January [627, 627] and February [637, 637].
    • va_ag_allowable_income_exclusions repeated entry-month community expenses every month. Case 30 pins [558, 1,223].
    • Both, and the new va_ag_partial_month_days, now have formulas returning the default, so an entry stays in its month. Case 28 pins a February partial month followed by a full March.
    • va_ag_facility_rate still carries forward on purpose, since an approved rate persists.
  • Student earned income exclusion. Chapter H's exclusion list (p. 370) doesn't name it, but Chapter D requires SSI policy. The model keeps it, with a NOTE in va_ag_countable_income.py; the conflict comment covers it.

On the merged head, these pass locally: all 560 Virginia cases, and the aggregate list integrity and program registry tests (677 passed, 10 skipped).

@DTrim99

DTrim99 commented Oct 20, 2026

Copy link
Copy Markdown
Collaborator

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

PR #10172 (author: hua7450). This round reviews head 1a6e32cf8a; round 1 reviewed 0e6fa7c292. Three commits landed in between:

  • af62c8b6da, "Address review: Virginia Auxiliary Grant rate, proration and input fixes" (20 files, +427/−92). It does the following:
    • replaces the two fixed rate files with rate.fbr_offset ($1,136 above the SSI federal benefit rate) and rate.northern_virginia_differential (0.15, rounded to the nearest dollar), so the maximum rate follows each SSI COLA;
    • replaces the formula-overridden va_ag_care_rate and va_ag_days_eligible inputs with the zero-default inputs va_ag_facility_rate and va_ag_partial_month_days;
    • gives va_ag_partial_month_days, va_ag_is_joint_initial_month and va_ag_allowable_income_exclusions formulas that return the default, so an entry stays in its month;
    • adds the SSI application gate (takes_up_ssi_if_eligible | uncapped_ssi <= 0), and lets a reported SSI recipient (receives_ssi) pass the resource test;
    • drops the deeming override from integration Case 3, which now pins the entry month with SSA's deeming, and documents separate marital units for later months;
    • adds NOTEs on entry-month deeming and the student earned income exclusion, cites § 51.5-160 and the 2025 Act Item 328 A, and fixes the descriptions;
    • adds va_ag.yaml Cases 22–30 and integration Cases 8–10, and rewrites va_ag.yaml Case 17 and integration Cases 2–3.
  • 70876d771c, a merge of main at 9560e7f183 with no hand-resolved conflicts. It leaves the Virginia AG files untouched. Among other things, it brought in:
  • 1a6e32cf8a, "Use separate marital units for Virginia separate SSI claims case". Integration Case 1 now uses two marital units in place of the ssi_claim_is_joint override, and pins SSI [994, 994].

Summary

Ziming fixed both round-1 should items and every suggestion, apart from two deferrals I accept:

He gave reasons for the rest, and I accept them:

He went further in three places:

  • The forward rate. The maximum rate is now the SSI FBR plus $1,136. My round-1 probe for 2027 now gives 1,223 a month in place of 1,195 (Case 29).
  • The input-reset trap. Entering a care rate or a deeming override for one person reset everyone else in the household.
  • Inputs carrying into later months. An entry-month flag or exclusion kept applying in later months.

Every new or changed expectation (20 cases) checks by hand.

The wage lesson (NH #10156 round 3, OK #10165, OR #10166 round 2, VT #10171 round 2) finds nothing here.

  • The code. The non-SSI budget reads ssi_earned_income, which nets out pre-tax health premiums since Document disjoint health premium inputs and correct consumer treatment #10046 arrived with the merge.
  • The state rule. Unlike Vermont, Virginia's own rule excludes them too:
    • AG Manual Chapter I § 17.1.1: "A qualified benefit is not income", and the list starts with "Accident and health plans".
    • Chapter D: "the AG program is required to use SSI policy".
  • The SSI-recipient budget. It uses SSA's amounts, as Chapter D § 5 directs.
  • Probe. An aged worker with $100 a month of pre-tax premiums gets 520, which matches the rule; counting gross wages would give 470.

The NH #10156 check also finds nothing. No Virginia parameter is keyed by a variable. In a two-state probe, a Maryland resident gets va_ag_eligible false and 0, with no error.

One optional suggestion: record the cafeteria-plan reading in the code and in #1787, and pin it with the probe household. That way the sibling finding isn't applied here by mistake.

CI is 27/27 green on the head. The branch is 58 commits behind main and conflicts with it in four shared lists, where sibling SSP lines landed at the same spots (branch note).

Prior findings status

Finding Status Evidence
Should 1: axiom: needed isn't valid for a staff PR that adds a program Fixed The line now reads axiom: Va. Code § 51.5-160; 22VAC30-80-50; 2026 Appropriation Act Item 332; AG Manual Chapters B-D, H, J TheAxiomFoundation/rulespec-us#1787 queued. #1787 is open and labelled pe-parity; Ziming filed it on 2026-10-15. It has: the module paths I proposed, with corpus status; verbatim § 51.5-160, 22VAC30-80-10/-50, Item 332 A, the rate letter and AG Manual Chapters B–J; five required outputs; and companion tests A–I mapped to PE cases. Its source-conflicts comment covers entry-month deeming and the student exclusion, and notes the authority for January–June 2026 (see Axiom).
Should 2: four parameter descriptions were off-template Fixed Two use my wording. northern_virginia_localities.yaml and proration_days.yaml. The rate files are replaced. rate/fbr_offset.yaml: "Virginia sets the maximum monthly care rate outside Planning District Eight at this amount above the federal Supplemental Security Income benefit rate under the Auxiliary Grant program." rate/northern_virginia_differential.yaml: "Virginia increases the maximum monthly care rate by this share in Planning District Eight under the Auxiliary Grant program." The other two were already on template and are unchanged.
Suggestion 1: rates and allowance before 2026 leaked the 2026 values Partly fixed by the FBR link; history declined (accepted) Now right. 943 + 1,136 = 2,079 (2024) and 967 + 1,136 = 2,103 (2025), which match the 2024 and 2025 Acts. 2,103 × 1.15 = 2,418.45 → 2,418, which matches the letter's "from $2,418". Still off before 2024. For 2022, PE gives 841 + 1,136 = 1,977, where the law gives $1,609, and $87 carries back before 2024 ($82 from 2013). Documented. The body says "Earlier years use parameter backfilling and are unverified historical estimates; no historical coverage is claimed", programs.yaml claims only verified_years: '2026', and #1787 lists both gaps. Going forward: fixed. Case 29 pins 1,223 for 2027, against round 1's 1,195.
Suggestion 2: the Texas rebate's copy of spm_unit_benefits omits va_ag Deferred to #10226 (accepted) #10226 ("Keep one spm_unit_benefits list so reforms that add a benefit stop dropping baseline programs") is open. The body links it, and the sibling PRs defer it the same way.
Suggestion 3(a): a spouse at home was deemed by default on the SSI path Fixed (pinned and documented, by another route) The override is gone. Ziming showed it reset other household members, and I agree that's a trap. The entry month is pinned. Integration Case 3 now pins it with SSA's deeming: SSI [11, 0], va_ag_countable_income [1,491, 1,480], va_ag [726, 0]. Later months are pinned. Case 6 pins them in separate marital units: [1,223, 0]. Documentation. va_ag_certified tells users to split the marital units after the entry month, the NOTE at va_ag_countable_income.py:51-54 records the Chapter B § 6 tension, and #1787's conflict 1 sets out both readings (726 against 2,206). I accept the Chapter D reading (see Verified).
Suggestion 3(b): the grant replaced SSI when SSI wasn't taken up Fixed The code. va_ag_eligible.py:27-32 adds `pursues_ssi = takes_up_ssi_if_eligible
Suggestion 3(c): integration Case 2's joint flag did nothing Fixed Renamed "joint SSI couple claim". The flag is gone, and the case now pins ssi_claim_is_joint [true, true], SSI [745.50, 745.50] and va_ag_countable_income [745.50, 745.50].
Suggestion 4: four untested branches Fixed Case 22 (an undocumented noncitizen) gives 0. Case 23 (incarcerated) gives 0. Case 24 (a facility rate of 2,500, capped at 2,130) gives 1,223. Integration Cases 8 and 9 (my asymmetric couple) give [0, 737] separately and [227, 227] pooled.
Suggestion 5: polish Mostly fixed; blank lines kept (accepted) Case count. The body says 40 (30 + 10), and CI ran 30 and 10. Statute. va_ag.py and personal_needs_allowance.yaml cite § 51.5-160 (C in the parameter). January–June 2026. The 2025 Act Item 328 A is cited in personal_needs_allowance.yaml, fbr_offset.yaml, northern_virginia_differential.yaml and the body. Naming. Integration Case 1 is "separate SSI claims", now in separate marital units. Blank lines. The two before metadata: stay; they are harmless, as in Vermont.

New findings

Critical (must fix)

None.

Should address

None.

Suggestions

1. Record the cafeteria-plan reading so the batch's wage finding isn't applied here by mistake.

  • Where: va_ag_countable_income.py:29-33, earned = max_(person("ssi_earned_income", period) - person("ssi_blind_or_disabled_working_student_exclusion", period), 0). Since Document disjoint health premium inputs and correct consumer treatment #10046, ssi_earned_income returns wages less min_(wages, pre_tax_health_insurance_premiums).

  • Why the code is right.

    • Chapter D (p. 123): "AG is a federally mandated program established to supplement the SSI program. As such, the AG program is required to use SSI policy to determine eligibility."
    • Chapter I § 17, "Cafeteria Benefit Plans / Not Income/Earned Income" (p. 430), § 17.1.1: "A qualified benefit is not income. Qualified benefits include, but are not limited to: Accident and health plans (including medical plans, vision plans, dental plans, accident and disability insurance)". § 17.1.1.1: "Verification is not required."
    • This is the federal rule. 20 CFR 404.1053 keeps qualified cafeteria-plan benefits out of wages, including "any qualified benefit made to you, or on your behalf, pursuant to a salary reduction agreement between you and your employer". POMS SI 00820.102 C.2 applies that to SSI.
  • Why a note helps.

    • Four sibling reviews found the opposite, because Vermont, New Hampshire, Oklahoma and Oregon count wages before payroll deductions.
    • Chapter I has two passages a reader could take the other way:
      • § 76 (p. 510): "Wages are what an individual receives (before deductions)".
      • § 76.2.1 (p. 511): "The following payments by an employer are not income unless the funds for them are deducted from the employee's salary: Funds the employer uses to purchase qualified benefits under a cafeteria plan".
    • Both fit § 17 once you read them as SSA does. A salary-reduction amount isn't salary in the first place, while after-tax payroll deductions stay in wages. That is POMS C.4, and ssi_earned_income keeps those because Document disjoint health premium inputs and correct consumer treatment #10046 makes after-tax premiums a separate input.
  • Probe at the head (2026-01; one simulation). An aged resident (65), certified, with $18,000 a year of Social Security, $7,200 of wages and $1,200 of pre-tax premiums:

    Model By hand
    ssi_earned_income (2026) 6,000 7,200 − 1,200
    SSI 0 994 − 1,697.50 < 0
    va_ag_countable_income 1,697.50 (1,500 − 20) + (500 − 65) ÷ 2
    va_ag 520 2,217 − 1,697.50 = 519.50, paid as 520
    The same without premiums 1,747.50; 470 (600 − 65) ÷ 2 = 267.50, so 469.50, paid as 470
  • Fix (optional):

    • Add a NOTE at va_ag_countable_income.py:29: "Chapter I § 17.1.1 (p. 430) excludes qualified cafeteria-plan benefits, as SSI does, so ssi_earned_income's salary-reduction netting applies". Add page 430 to the # PDF pages comment.
    • Pin the probe household in va_ag.yaml: ssi_earned_income: 6_000 (period 2026), va_ag_countable_income: 1_697.5 and va_ag: 520.
    • In MO social security deduction calculations are still incorrect #1787, add the earned-income definition to the countable-income row ("wages per Chapter I § 76, less qualified cafeteria-plan benefits, § 17.1.1"), and add the household to the companion tests.

Verified

  • Administration.
    • Virginia isn't on POMS SI 01415.058 A's list of federally administered supplements, and Chapter A says "Virginia opted for self-administration."
    • So the wage lesson applies, and the PR correctly avoids SSA rounding and the shared helper.
  • The wage count (NH Add New Hampshire state supplementation for 2026 #10156 r3, OK Add Oklahoma state supplementation for 2026 #10165, OR Add Oregon state supplementation for 2026 #10166 r2, VT Add Vermont state supplementation for 2026 #10171 r2).
    • SSI recipients. Chapter D § 5 (p. 126): "the worker will use the amounts determined by SSI as the individual's net earned and net unearned income". The state rule itself adopts SSA's figures, so ssi_countable_income + ssi is right even though Virginia administers the grant. For any SSI recipient the sum equals the FBR, so pre-tax premiums don't change the grant.
    • Non-SSI applicants. These read ssi_earned_income. Chapter I § 17.1.1 makes qualified cafeteria-plan benefits "not income", so the netting is right (Suggestion 1). Unlike Vermont's Reach Up rule 2251(a), no Virginia rule counts wages before insurance deductions.
    • Unearned income reads ssi_unearned_income. With the merge, that carries Integrate modeled state unemployment insurance into income flows #9558's total_unemployment_compensation. After a rebase it will also carry Wire military retirement pay and survivors into federal and state tax (#10181) #10182's military retirement pay, which SSI policy counts too. No Virginia file reads raw unemployment_compensation.
  • State-gated keys (NH Add New Hampshire state supplementation for 2026 #10156 check).
    • No parameter under gov.states.va.dars.ag is a breakdown or is keyed by a variable. The only list is used with np.isin.
    • The gated variables are va_ag_eligible (bool), va_ag_facility_rate (float, default 0) and va_ag_partial_month_days (int, default 0), all used only in arithmetic or boolean logic.
    • Elsewhere. immigration_status is compared with possible_values. va_ag_maximum_care_rate is ungated but reads only the FBR and Virginia parameters.
    • Two-state probe. The simulation that ran the Suggestion 1 households also held a Maryland resident (65, SSI-only) with va_ag_certified true. va_ag_eligible was false, va_ag 0 and household_state_benefits 0. va_ag_maximum_care_rate computed (2,130), with no error.
  • The FBR link.
    • 22VAC30-80-50: "The established rate ... is the established rate as set forth in the appropriation act or as set forth by changes in the federal maintenance of effort formula."
    • Item 332 A.3: the department "is authorized to increase the assisted living facility and adult foster care home rates and/or the personal care allowance cited above on January 1 of each year in which the federal government increases Supplemental Security Income or Social Security rates".
    • The rate letter: "This includes the COLA increase of $27 from Social Security."
    • The pattern. 2,079 − 943 = 2,103 − 967 = 2,130 − 994 = 1,136.
    • Caveats. A.3 authorizes increases but doesn't fix their size, so the offset is an inference. fbr_offset.yaml says so, and notes that a reform cutting the FBR would cut the rate.
    • Rounding. Planning District Eight is rounded to the nearest dollar: 2,449.50 → 2,450, 2,418.45 → 2,418, and the manual's 1,221 × 1.15 = 1,404.15 → 1,404. In float64, 2,130 × 1.15 is exactly 2,449.5, so the floor gives 2,450.
    • After a rebase, Update Social Security and SSI parameters for the 2027 COLA #10225's 2027 FBR of $1,029 gives 2,165, and 2,490 in Planning District Eight. Case 29 stays 1,223.
  • The SSI application gate.
    • Chapter C § 8.2.1 (p. 94): an applicant who doesn't appear to meet SSI income standards "is not required to apply for SSI". § 8.2.2: "The individual must apply for SSI". § 8.2.2.2.1 (p. 95): "Deny the AG application".
    • uncapped_ssi is defined_for = "is_ssi_eligible". Someone not SSI-eligible for a non-income reason gets 0, so passes this gate, and the immigration and resource gates catch them.
  • receives_ssi in the resource test.
    • It is a monthly reported input. Chapter D (p. 125) says "an SSI recipient who has applied for AG is deemed to have met AG resource eligibility".
    • The same (ssi > 0) | receives_ssi pattern is in the Florida, North Carolina and Wyoming supplements on main.
    • The income budget still uses SSA's amounts only when SSI > 0, as MO social security deduction calculations are still incorrect #1787 records.
  • Entry-month deeming: the Chapter D reading is right.
    • 20 CFR 416.1163(f)(2): "If you separate from your ineligible spouse ..., we do not deem your ineligible spouse's income to you ... beginning with the first month following the event." So SSA deems in the entry month.
    • Chapter D § 5 is the operative instruction for an SSI recipient's budget, and it names SSA's amounts. Chapter B § 6 decides "whose income and resources will be used in determining financial eligibility", which Chapter D deems met for SSI recipients.
    • The effect is limited to the separation month. It is documented in the code, the body and MO social security deduction calculations are still incorrect #1787.
    • Case 1's new comment cites POMS SI 00501.154 B. That section says "Sharing a room in an institution is not living in the same household", the same sentence as Chapter B § 6.
  • The input design.
    • Defaults match the formulas. All four new or reworked inputs default to 0 or false. The three one-month inputs' formulas return that default, so entering one for one person leaves the others where the formula would put them.
    • Pinned. Cases 27 (two residents, one input each), 28 and 30 (a one-month entry doesn't carry over) and integration Case 10 pin the behavior.
    • The facility rate carries forward on purpose, since an approved rate persists.
  • Proration and the cap.
    • Partial months. partial_month = (days > 0) & (days < period.days). Chapter J § 3.3 uses 30 "regardless of the actual number of days within the month of entry". So entering on January 2 (30 days) gives 2,130 ÷ 30 × 30, the full rate, and 28 days in February is full (Case 17).
    • Discharge. A discharge month later than the entry month isn't prorated, as va_ag_partial_month_days documents.
    • The cap. va_ag_care_rate caps va_ag_facility_rate at the maximum, per Item 332 A.1's "not to exceed a maximum rate of $2,130" (Case 24).
  • New and changed expectations, checked by hand. The 2026 FBRs are $994 and $1,491, and the limit is 2,130 + 87 = 2,217.
    • va_ag.yaml:
      • Case 7: the input is renamed. 2,450 ÷ 30 × 14 = 1,143.33; + 87 − 994 = 236.33, paid as 236.
      • Case 16: renamed. 2,130 ÷ 30 × 15 = 1,065; + 87 − 994 = 158.
      • Case 17: February 2026 has 28 days, so 28 is a full month: 1,223.
      • Case 18: renamed. 1,065 + 87 − (994 − 400) = 558.
      • Case 20: renamed. 1,500 + 87 − 994 = 593.
      • Case 22: an undocumented resident gets SSI 0, va_ag_eligible false and 0.
      • Case 23: incarcerated, so va_ag_eligible is false and the grant 0.
      • Case 24: the maximum is 2,130 and the care rate min(2,500, 2,130) = 2,130, so 1,223.
      • Case 25: uncapped_ssi is 994 and SSI 0 (no take-up), so the gate fails: va_ag_eligible false, 0.
      • Case 26: uncapped_ssi is 994 − (2,000 − 20) = −986, so the gate passes: 2,217 − 1,980 = 237.
      • Case 27: the care rate is [1,500, 2,130] and the grant [593, 158].
      • Case 28: February is 2,130 ÷ 30 × 27 = 1,917; + 87 − 994 = 1,010. March is 1,223.
      • Case 29: for 2027, (FBR + 1,136) + 87 − FBR = 1,223.
      • Case 30: January is 1,065 + 87 − 594 = 558. February is 1,223.
    • integration.yaml:
      • Case 1: separate marital units give SSI [994, 994] and [1,223, 1,223].
      • Case 2: a joint claim gives SSI 1,491 ÷ 2 = 745.50 each, and countable income 0 + 745.50. 2,217 − 745.50 = 1,471.50, paid as 1,472.
      • Case 3: the spouse is 63 and not disabled. SSA deems 1,500 − 20 = 1,480, so SSI is 1,491 − 1,480 = 11. Countable income is 1,480 + 11 = 1,491 for the resident and the spouse's own 1,480. The grant is [2,217 − 1,491 = 726, 0].
      • Case 8: separate units. ssi_countable_income is [2,500 − 20, 1,500 − 20] = [2,480, 1,480], both above 994, so SSI [0, 0]. The grant is [0, 2,217 − 1,480 = 737].
      • Case 9: joint. (2,500 + 1,500 − 20) ÷ 2 = 1,990 each, and uncapped_ssi is 745.50 − 1,990 = −1,244.50, so SSI 0. The AG budget is (4,000 − 20) ÷ 2 = 1,990, so 227 each.
      • Case 10: January pools: (3,200 − 20) ÷ 2 = 1,590, so 627 each. In February the flag's formula returns false: 1,600 − 20 = 1,580, so 637 each.
    • Unchanged values. The FBR link gives 994 + 1,136 = 2,130 and 2,450, so va_ag.yaml Cases 1–6, 8–15, 19 and 21 and integration Cases 4–7 keep their round-1 values.
  • Wiring at the head:
    • va_ag is in all four household_state_benefits blocks, in spm_unit_benefits.py, and on the SNAP and HUD unearned lists;
    • programs.yaml is partial, with verified_years: '2026', and the gov.states.va.dars.ag prefix still resolves;
    • va_ag isn't an SSI income source.
  • Changelog. changelog.d/va-ssp-2026.added.md is unchanged, top-level and typed added.
  • Tests.
    • In CI: Quick Feedback ran both Virginia files at the head: 10 and 30 passed. The body's 40 is right.
    • Locally: one small probe, covering the wage path and the two-state check.
  • Partner tests. The PR touches none, and Household API Partners passes.
  • What the main merge changes for Virginia.

Axiom line assessment

Valid: axiom: Va. Code § 51.5-160; 22VAC30-80-50; 2026 Appropriation Act Item 332; AG Manual Chapters B-D, H, J TheAxiomFoundation/rulespec-us#1787 queued.

  • Issue state.
  • Dispatch-ready. It has:
    • module paths with corpus status:
      • 22VAC30-80-10/-50, the AG Manual chapters and the rate letter are in the corpus;
      • § 51.5-160 and Item 332 need ingest;
      • Item 328's page in the 2025 Act PDF isn't located;
    • the verbatim law;
    • five required outputs;
    • companion tests A–I from Chapter J, Chapter D § 6.4.1.1, Chapter H, Item 332 and the rate letter, mapped to PE cases;
    • the interpretations that change a result: the forward rate, entry-month deeming, the SSI gate, the student exclusion, the couple split, interest and dividends, input defaults and history;
    • a source-conflicts comment covering:
      • Chapter B § 6 against Chapter D § 5 in the entry month (726 against 2,206);
      • the student earned income exclusion (1,037 against 820);
      • the authority for January–June 2026.
  • Matches the head: the 30 and 10 cases, the variable and parameter lists, and every pinned value it quotes. The only gap is the earned-income definition (Suggestion 1).

CI status

27 pass, 0 pending, 0 failed (run 38822958154 on head 1a6e32cf8a, pull_request, 2026-10-15 23:20 UTC to 2026-10-16 01:13 UTC).

  • Passed:
    • PR validation, and Package and compatibility;
    • Quick Feedback (Virginia: 10 + 30 passed);
    • Household API Partners;
    • Microsimulation and both Rest (Python) jobs;
    • all 11 Baseline shards and all 9 Contrib shards.
  • Round 1's timeout is gone. The Rest job that was cancelled at 90 minutes in round 1 now passes in 1h11m7s.

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. Both round-1 should items are fixed: rulespec-us#1787 is queued and ready for the encoder, and all six descriptions follow the template. Suggestions 3–5 are done, and the history and Texas rebate deferrals are reasonable. Your extra changes check out: the max rate follows the SSI COLA, the input reset is gone, and one-month inputs no longer carry forward. There's no wage-count gap: AG Manual Ch. I § 17.1.1 treats qualified benefits as not income, and Ch. D requires SSI policy, so ssi_earned_income is right. The NH-sibling bug doesn't occur here, all 20 new or changed expectations check by hand, and CI is green. Branch note: 58 behind main and conflicting in four shared lists; keep both lines. One optional suggestion: pin the premium household and cite § 17.1.1.

@hua7450
hua7450 marked this pull request as draft October 20, 2026 17:44
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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