Skip to content

Apply 416.1163(e)(2) to deemed SSI and identify SSI couples by marriage, not tax roles - #10141

Merged
MaxGhenis merged 56 commits into
mainfrom
ssi-couples-and-deeming-cap
Nov 10, 2026
Merged

MaxGhenis merged 56 commits into
mainfrom
ssi-couples-and-deeming-cap

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #10138.

Summary

We apply 20 CFR 416.1163(e)(2) before the SSI zero floor. Under spousal income deeming, a claimant receives the lesser of the couple computation and the individual benefit after their own countable income. State readers of uncapped_ssi receive the same federal shortfall.

SSI calculations identify each person's co-resident spouse through the existing resource-deeming helper. Joint claims, combined income and resources, spouse-deemed income and facility counts use that spouse. Explicit marital units preserve marriages for tax dependents and separate filers. We exclude a third adult's income and resources from the identified couple's budget.

The public variable ssi_marital_both_eligible remains available and uses the spouse test. The marital earned-income and unearned-income labels describe the two spouses' combined income. is_ssi_eligible_spouse retains its tax-unit-spouse label, and both qualifying spouses carry ssi_claim_is_joint.

For the individual comparison, we value in-kind support with the regular individual presumed maximum value and reapply income exclusions. SSA describes the individual computation in POMS SI 01320.150 B.1.b, SI 01320.400 C.2 and SI 00835.300.

For example, a claimant whose only income comes from in-kind support, with a spouse earning $500 monthly in 2026, receives $662.67 monthly: $994 − ($351.33 − $20). Using the reduced deeming PMV would pay $755.50.

California and other state readers

CAPI and the per-person state supplement use the identified spouse for category counts, facility separation, CAPI membership, countable income and SSI/SSP receipts. An unrelated recipient's income, payment or eligibility cannot enter the mixed couple's calculation.

Household Result
A disabled citizen, age 17, claimed by another adult, has a CAPI-eligible spouse with a $500 monthly pension. 2025; no cooking facilities. The spouse receives $9,255.60 of annual CAPI, compared with $10,269.72 on main.
Aged citizen spouses each receive $500 monthly beside an unrelated CAPI-eligible adult. 2025; marital units omitted; no cooking facilities. The couple receives $10,386.96 of annual supplement, matching explicit units after rounding each spouse's payment.

When one spouse occupies a Title XIX facility and the other doesn't, CAPI computes the spouses separately, even when only the California facility input identifies the stay. An unrelated facility resident cannot separate the couple or contribute a payment-standard share.

We set exhausted mixed-couple CAPI benefits to zero when floating-point cancellation leaves a residual within the stored payment standard's precision. This prevents a residual from creating CAPI income eligibility.

For joint computations, the optional senior or disabled Medicaid income calculation combines the identified spouses' premiums and qualifying dependent premiums. The medically needy and 209(b) income calculations likewise exclude unrelated adults from couple budgets. California's Working Disabled income test excludes unrelated adults from spouse income.

We replace marital-unit sums with spouse totals in the changed state supplement readers. Colorado, Missouri, Oregon, South Dakota, Virginia and Iowa retain an explicitly declared marriage across households in specified state calculations.

Iowa and Oregon

Iowa's shared-room and prior-SSI inputs default to false. Same-month entry alone does not establish a shared room, and SSI awarded after separation does not establish prior receipt. See 441 IAC 51.4(3) and 6-B, PDF p.60.

For co-resident legacy situations, current or reported SSI approximates pre-entry receipt. Separated spouses need the explicit prior-SSI fact. Iowa retains the qualifying entry-month couple budget while excluding unrelated adults.

Oregon pays legally married spouses who each receive SSI and community-based care services, whether they occupy one facility or two. See OAR 461-155-0630(3) and the spouse definition in OAR 461-001-0000(62).

Validation

  • We moved all 43 mixed-household cases into 34 variable-named YAML files and preserved their expected values. The Makefile and workflow selectors route each moved case once.
  • We removed five overlapping explicit co-resident property examples. YAML retains the expected payments, and generated cases compare omitted and explicit marital units.
  • We retained six separated-spouse examples. They add or remove an unrelated adult in either spouse's household while preserving the marriage and independent tax units. They also cover pensions, resources, eligibility and care conditions outside the generated ranges.
  • At 312e3ff4ca, 47 YAML files covering SSI, Medicaid, CAPI and state supplements passed 850 cases, including 660 cases in the 34 destination files. The property file passed 80 cases in Rest, Python shard 1, process core-1.
  • The CAPI income-eligibility file passed seven cases, including the three zero-benefit households and the positive-cent case.
  • Before trimming examples, run 41978111346 recorded 203.827 seconds across the property's 80 cases in Rest, Python shard 4, process core-2. That contributed about 12% of the group's 1,656.749 pytest seconds.
  • At 312e3ff4ca, run 42153104620 recorded 93.159 seconds across the property's 80 cases, including fixtures. Its shared core-1 process ran 977 tests, took 29:06.43 including collection and peaked at 8,475,532 KiB (8.083 GiB).
  • The earlier shared core-2 process ran 340 tests, took 28:39.95 including collection and peaked at 6,723,600 KiB. The two process measurements cover different groups of files.
  • At 7e5c7a2cde, run 42650265254 ran the property file's 80 tests in Rest, Python shard 4, in a process that passed 662 tests in 1,920.71 seconds.
  • CI records memory for that shared process, so a file-specific peak and isolated import/collection time remain unavailable.
  • Pull request run 42832243581 at 7e5c7a2cde passed all 36 jobs on GitHub's merge with main 052f399495.

Merge of main at ba9bfdea75 (head 7e5c7a2cde). Only nj_medical_expense_deduction.yaml conflicted. Main (#10667) keeps the 72-year-old dependent's income and self-employed deduction on the dependent's own return. With this branch, MSP and the SSI buy-in pay the dependent's Part B premium, so the deduction comes to 0 (main: 220). Main's new Colorado AND-CS readers (#10161) now use this branch's couple test, as Old Age Pension does: state_is_married for the $20 disregard split and state_couple_total for spouse deeming. co_state_supplement.yaml Case 42 pins a couple beside a claimed third adult. At this head, one file per process: 99 files passed 1,931 tests with none failing, and 56 partner files that name SSI, Medicaid or supplement variables passed 252, none edited.

Not in this PR

With omitted marital units, spouses who file separately receive different couple budgets: only the spouse who claims a child includes that child's term. California's dependent-child premium case produces $23,880 of annual countable income per spouse with omitted marital units and $29,880 with explicit units. Main has the same difference.

Remaining SSI-methodology readers include is_optional_senior_or_disabled_income_eligible, medicaid_optional_senior_or_disabled_income_limit, is_optional_senior_or_disabled_asset_eligible, msp_asset_eligible, msp_countable_income, ms_hmw_resource_eligible, ms_wd_resource_eligible, ms_wd_countable_earned_income, ms_wd_countable_unearned_income, ms_wd_fpg and ms_wd_premium. They retain marital-unit calculations.

Medicaid's LTSS screen (#9184) keeps its marital-unit couple budgets, because a community spouse lives apart and SSI's co-residence test would drop them. Colorado's AND-CS Medicaid gate, co_state_supplement_deeming_exempt, keeps its reach across the marital unit, tax unit and household, so it still covers every spouse or parent the deemed-income reader can find.

We still omit SSI's citizenship condition when classifying income couples (#10481). Spousal income deeming still omits the $30 medical-facility exception and related separation rules (#10455).

We still omit a non-applicant spouse's premiums under California Medicaid deeming. We also omit that spouse's maintenance need deduction (#10543). When only California's facility input separates a CAPI couple, the own-income calculation still omits in-kind support and the student earned-income exclusion.

A lone married pair with one spouse inferred as the other's tax dependent needs explicit tax roles. Parent and dependent facts exclude known nonspouses; unlabelled default groups can still infer a marriage.

Microsimulation impact

We estimate that this PR lowers SSI by $29.3m (0.05%) in 2026 on the default dataset, and household net income by $20.6m. We compared main at ba9bfdea75 with this branch at 7e5c7a2cde.

SSI falls for 6 sampled people (22,516 weighted), each by at most $2,957. Other benefits in their households rise by $8.7m in total, so household benefits and household net income each fall by $20.6m, by at most $2,483 in one household. At this head, is_ssi_ineligible_spouse holds only for a person without aged, blind or disabled status who lives with an aged, blind or disabled spouse. It now holds for 8.8 million weighted people, against 179.6 million on main, and the deeming flag is_ssi_spousal_deeming_applies doesn't change.

Federal and state income taxes, Medicaid eligibility and enrollment, SSI eligibility, joint claims and the resource test don't change. Neither do state benefits, the California supplement, Colorado's Old Age Pension, Medicare Part B premiums, MSP coverage of those premiums or New Jersey's medical expense deduction. California's CAPI and the Colorado State Supplement come to $0 on main and on this branch.

Output Main total Change Records changed (weighted)
ssi $57.01bn −$29.3m 6 (22,516)
is_ssi_ineligible_spouse 179.6m people −170.8m people 83,564 (170,837,165)
is_ssi_spousal_deeming_applies 7.3m people 0 0 (0)
ssi_claim_is_joint 43.7m people 0 0 (0)
is_medicaid_eligible 75.8m people 0 0 (0)
medicaid_enrolled 70.9m people 0 0 (0)
household_state_benefits $8.59bn $0 0 (0)
ca_state_supplement $2.53bn $0 0 (0)
ca_capi $0 $0 0 (0)
co_state_supplement $0 $0 0 (0)
co_oap $348.6m $0 0 (0)
medicare_part_b_premium $144.41bn $0 0 (0)
msp_part_b_premium_coverage $19.52bn $0 0 (0)
nj_medical_expense_deduction $25.66bn $0 0 (0)
income_tax $2,595.3bn $0 0 (0)
state_income_tax $577.3bn $0 0 (0)
household_benefits $2,060.5bn −$20.6m 6 (22,516)
household_net_income $17,198.7bn −$20.6m 6 (22,516)

impact: SSI −$29.3m (−0.05%) in 2026 on the default dataset, for 6 sampled people (22,516 weighted); household net income −$20.6m; income taxes and Medicaid eligibility don't change

axiom: TheAxiomFoundation/rulespec-us#1706 queued, extended with a comment (20 CFR 416.1163(d)-(f), 416.1801(c), 416.1806, 416.1160(d); same corpus-release blocker as TheAxiomFoundation/rulespec-us#1626). Resource deeming: TheAxiomFoundation/rulespec-us#1626 queued, extended with a comment.

🤖 Generated with Claude Code

MaxGhenis and others added 2 commits October 12, 2026 05:12
SSI under spousal income deeming was capped at the individual Federal
benefit rate. 20 CFR 416.1163(e)(2) makes it the lesser of the couple
computation and the individual rate less the claimant's own countable
income, so a claimant with income of their own could get more with
deeming than without it, and lower income could lower SSI. Add
uncapped_ssi_without_spousal_deeming and take the lesser in
ssi_if_takes_up; deem nothing while the $30 rate applies (416.1163(f)(5)).

Joint claims and the ineligible spouse whose income is deemed were tied
to tax-unit head and spouse roles, which go to the two oldest adults of a
tax unit. Use the co-resident spouse test that resource deeming already
uses (416.1801(c), 416.1806, 416.1160(d)), require both members of a
joint claim to meet the citizenship condition, and combine couple income
and resources over the two spouses rather than the marital unit.

Fixes #10138.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis
MaxGhenis marked this pull request as ready for review October 12, 2026 09:36
@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Local results at 2924cd90da (macOS, not Linux CI):

  • policyengine_us/tests/core/test_ssi_spousal_deeming_invariants.py: 8 passed. 19 s user CPU, 1.0 GB peak RSS.
  • test_ssi_resource_deeming_invariants.py and test_ssi_state_supplement_medicaid_dependency.py: 24 passed. 73 s user CPU, 4.9 GB peak RSS (mostly the dependency module).
  • All 33 YAML files under tests/policy/baseline/gov/ssa/ssi, run one process at a time: pass, after the three is_ssi_spousal_resource_deeming_applies.yaml updates described in the body. The new cases in ssi_if_takes_up.yaml (10), ssi_claim_is_joint.yaml (10) and the deemed-income file (7) also pass.
  • The same invariant module, with the new variable replaced by the oracle's no-deeming amount, fails 7 of 8 tests on main.

A real microsimulation of the impact (merge base b2aaef3391 against this head, 2026, default dataset) is queued under the shared heavy lock and will be added to the body.

MaxGhenis and others added 3 commits October 12, 2026 08:09
Review round 1 found three regressions. Requiring the citizenship
condition in ssi_claim_is_joint broke California CAPI's couple rate and
Medicaid's senior/disabled countable income, which read the joint claim
as the SSI couple methodology, so the joint claim and ineligible-spouse
status test only aged, blind or disabled status again (still through the
co-resident spouse test). The resource test keeps #10040's treatment of a
citizenship-ineligible spouse through _ssi_resource_couple.

Alabama's supplement read uncapped_ssi > 0 and paid when SSI was zero, so
the lesser-of rule moves into uncapped_ssi before the floor. The
416.1163(f)(5) facility rule covered only the payment and is dropped for
a follow-up. The invariant test drops the citizenship axis, adds mixed
household sizes, and suppresses Hypothesis's slow-data check.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The test omitted tax and marital units, so the model grouped all nine
disabled people together and made person0 and person1 a head-and-spouse
couple, which the co-resident spouse test now reads as a joint claim.
The test checks citizenship status, so each person is single.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review round 2 found that a situation omitting marital units, with three
aged adults, now pays more in MA and AK. The joint claim now covers only
the head-and-spouse couple, but both supplements still summed the whole
marital unit. _ssi_couple_total adds the co-resident spouse's value, which
equals the marital-unit sum for units of one or two people. MA's maximum
and payment, AK's payment, and AK's claim type now use it, so the
household gets the same supplements as with explicit marital units
($100.86, $100.86, $128.82 in MA; $264, $264, $362 in AK).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis and others added 9 commits October 28, 2026 00:13
One textual conflict, in ssi_amount_if_eligible.py: main corrected the
medical treatment facility citation from 42 USC 1382(e)(1)(A) to (e)(1)(B)
(#10283), while this branch moved the living-arrangement adjustment into
_ssi_living_arrangement_amount.py. Keep the branch's helper call and carry
main's citation into the helper.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Exercise five state supplement budgets across two households and correct Connecticut and Pennsylvania source comments.
@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Picking this up for the US hub. I'll post a hand-off comment here when it's ready.


Generated by Claude Code

GitHub reported a conflict with main (ba9bfde). Only
nj_medical_expense_deduction.yaml conflicted, on the 72-year-old
dependent's case. Main (#10667) moves the dependent's Schedule C income
and self-employed health insurance deduction to the dependent's own
return, so NJ AGI is 100,000. This branch stops deeming the head's
income to the dependent, so the state pays the Part B premium and the
subtotal is 0. Together the deduction is max(0, 0 - 0.02 x 100,000) = 0.

The other files both sides changed merged cleanly and keep every case:
co_oap_deeming_exempt.py, co_oap_deemed_income.yaml,
medicaid_optional_senior_or_disabled_countable_income.py and its YAML.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Main's Colorado AND-CS rules (#10161) found a client's spouse through
the marital unit. In a situation that omits marital units, that unit
holds every member, so a married client got the full $20 disregard
and a third adult's income was deemed as a spouse's.

The $20 disregard split (3.549(A)(2)(c)(1)) now reads
state_is_married, and spouse deeming (3.549(C)-(D)) reads
state_couple_total, as Old Age Pension does. Both keep a declared
spouse who lives apart and count only SSI's identified spouse in a
default unit. Case 42 covers a couple beside a claimed third adult.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The merge gave AND-CS's new spouse readers the same couple test as Old
Age Pension, so the fragment now names both programs.

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

Copy link
Copy Markdown
Contributor Author

Ready for hub review
7e5c7a2

I picked this up at 8eca1fcf85, the head the item named. No one had pushed since then (last commit 2026-11-06), so I built on it directly. Three commits on top:

  • 18e31f3651 merges main at ba9bfdea75 with a merge commit; I didn't rebase.
  • c45fe85e79 gives Colorado's new AND-CS readers this branch's couple test and adds Case 42.
  • 7e5c7a2cde names AND-CS beside OAP in the changelog fragment's retained-spouse sentence.

Main now stands 79 commits past the merge base 4279ce2e63, not 63. The brief's count matches 6eac550480. The Medicaid LTSS screen (#9184) and eight later commits landed after it; I checked them under the same rule.

1. Merge main

One conflict: nj_medical_expense_deduction.yaml, the case "A dependent's long-term care deduction is not counted again in New Jersey". Both sides changed its expected values:

  • Main (Leave tax unit dependents' income out of Arkansas, Mississippi, New Jersey and Iowa income #10667) puts the dependent's 4,000 of Schedule C income and their 3,000 deduction on the dependent's own return, so nj_agi is 100,000 and the deduction 220.
  • This branch stops deeming the head's income to the dependent, so the state pays the dependent's Part B premium and itemized_medical_expenses is 0.
  • The resolution keeps both rules (nj_medical_expense_deduction.yaml:261-273): itemized_medical_expenses 0, nj_agi 100,000, nj_medical_expense_deduction 0. The derivation is under item 3. All 15 cases remain.

Auto-merged, both sides changed. I read each result against both parents:

  • co_oap_deeming_exempt.py: this branch's co_oap_couple_total spouse test, with main's co_adult_financial_medicaid_enrolled (Apply Colorado's AND-CS payment floor and 3.549 income rules to every client #10161 renamed co_oap_medicaid_enrolled).
  • medicaid_optional_senior_or_disabled_countable_income.py: main's Part B lines (medicare_part_b_enrolled, medicaid_eligibility_health_insurance_premiums, medicare_part_b_premium_before_buy_in, Charge the Medicare Part B premium only to people who pay it #10634), with this branch's _ssi_couple_budget_total.
  • co_oap_deemed_income.yaml: 21 cases (20 at the merge base, plus main's one; this branch's two edited outputs stand).
  • medicaid_optional_senior_or_disabled_countable_income.yaml: 49 cases (41, plus this branch's 7 and main's 1). No case name repeats in either file.

Nothing else references a variable main deleted, and the merged system builds (7,583 variables).

2. New readers

git log --oneline 4279ce2e63..origin/main -- policyengine_us/variables/gov/ssa policyengine_us/variables/gov/states policyengine_us/variables/gov/hhs/medicaid lists 36 commits. Main changed nothing under gov/ssa. I also searched main's whole diff under variables/ for new marital_unit, head_or_spouse, is_tax_unit_spouse, is_tax_unit_head and tax_unit_married reads.

Commit Reader What it reads What I did
#10161 co/ssa/state_supplement/_and_cs_client_income.py marital_unit.nb_persons() == 2 for the 3.549(A)(2)(c)(1) $20 split Changed (:24-28) to state_is_married, as co_oap_is_married does for OAP
#10161 co/ssa/state_supplement/co_state_supplement_deemed_income.py marital_unit.sum(...) - own for 3.549(C)-(D) spouse deeming Changed (:50-58) to state_couple_total, as co_oap_couple_total does for OAP
#10161 co_state_supplement_deeming_exempt.py (:66-71) marital unit, tax unit and household sums of clients Left. It only decides who needs a Medicaid enrollment check. It spans every group in which the deemed-income reader can find a spouse or parent, so it stays a superset.
#10183 co_ssa_in_kind_support_and_maintenance.py, read by co_oap_in_kind_support_and_maintenance.py ssi_couple_computation_applies to halve a couple's ISM Left. That variable already uses this branch's spouse test.
#10161 co_adult_financial_medicaid_enrolled.py, co_state_supplement.py, co_state_supplement_own_countable_income.py, co_state_supplement_countable_income.py per person, or through the two helpers above Left. No couple read of their own.
#10634 medicaid_part_b_buy_in_premium_coverage.py, medicare_part_b_premium.py the buy-in reads each person's monthly ssi and receives_ssi; the premium nets that person's MSP or buy-in coverage Left. No couple read.
#10634 medicaid_medically_needy_medical_expenses.py an adds list Left. This branch's is_medically_needy_for_medicaid still combines it through _ssi_couple_total.
#9184 (after the brief's main) Medicaid LTSS: medicaid_ltss_assistance_unit_size, medicaid_ltss_couple_countable_income, medicaid_ltss_countable_resources, medicaid_ltss_community_spouse_countable_resources marital_unit.nb_persons() == 2 and marital_unit.sum Left; its own reason is below.
#10607, #10611, #10613, #10618 CA, CT, ID and WV LIHEAP CT and ID test SSI or SSP receipt across the SPM unit. CA reads no SSI, and WV leaves SSI out of income. Left. No SSI couple.
#10038, #10053, #10195, #10196, #10198, #10200, #10203, #10663, #10666, #10667 claim of right (federal, AR, HI, IN, MA, MT, NJ, OH, WV), dependent-filer rules (federal, AZ, AR, CA), Form 4797 gains, PA forgiveness, MS capital losses is_tax_unit_head_or_spouse, is_tax_unit_head, is_tax_unit_spouse, tax_unit_married, one marital_unit.sum in PA Left. These are tax rules about who is on the return, not SSI couples.

Why LTSS keeps the marital unit. Its couple budgets apply only when medicaid_ltss_assistance_unit_size is 2.

  • Outside Delaware that size is a reported input with default 0. In Delaware it comes from explicit marital-unit inputs: same facility, same-address HCBS and the six-month election.
  • The community spouse comes from medicaid_ltss_has_community_spouse, which the documentation says is "not inferred from a tax, household, or marital unit".
  • A community spouse lives apart from the institutionalized spouse, so SSI's co-residence test would drop them.

Why state_couple_total and not _ssi_couple_total for AND-CS. I read 9 CCR 2503-5 3.549 (PDF pages 93-95) this session.

  • (C) and (D) deem "the AND-CS client's spouse" with no shared-household condition, and (F) provides for an institutionalized spouse.
  • This branch reads OAP's 3.534(B)-(C) the same way.
  • For a declared couple, the new reads give main's result. They differ where this branch's spouse test rules a pair out (a parent link, or a lone pair in which one claims the other), and where a default unit holds a third person, whose income main's sum adds.

3. Cases that move

One case moves: the conflict case in nj_medical_expense_deduction.yaml, "A dependent's long-term care deduction is not counted again in New Jersey" (2025). I updated it in the merge.

Output Main This branch before the merge Merged
itemized_medical_expenses 2,220 0 0
nj_agi 100,000 104,000 100,000
nj_medical_expense_deduction 220 3,000 0

Derivation on the merged tree. nj_medical_expense_deduction is the filers' self_employed_health_insurance_ald plus max(0, itemized_medical_expenses − excluded dependent premiums + pre-tax premiums − 0.02 × nj_agi).

  • The head has no self-employed deduction. Main's rule puts the dependent's 3,000 on the dependent's return, so the first term is 0.
  • The dependent's deduction is all long-term care (Form 7206 line 2), so the excluded medical part is min(…, 3,000 − 3,000) = 0. Pre-tax premiums are 0.
  • itemized_medical_expenses is 0. The long-term care premiums stay out on both sides. medicare_part_b_premium is max(2,220 − max(MSP 2,220, SSI buy-in 2,220), 0) = 0.
  • So the deduction is 0 + max(0, 0 − 0 − 2,000) = 0.

Why the premium is paid. I probed both trees with the case's household:

  • Merged: is_ssi_spousal_deeming_applies is false for the dependent. Countable income is 1,490 (the dependent's own earnings), and SSI is 11,604 − 1,490 = 10,114. msp_part_b_premium_coverage and main's new medicaid_part_b_buy_in_premium_coverage (Charge the Medicare Part B premium only to people who pay it #10634) are each 2,220.
  • Main: the head's income is deemed (countable income 51,490), so there's no SSI and no MSP. The premium stays at 2,220 and the deduction is max(0, 2,220 − 2,000) = 220.

The case's comment now names both payers. The resolution changes no other case.

No other case moves. All 99 files below pass with their existing expected values, among them main's 30 SSI, supplement and Medicaid files and this branch's 63. The 56 partner files that name SSI, supplement, MSP, Medicaid or Part B variables all pass, so none of their cases moves.

4. Mutants

Each mutant restores main's read in its own run. Each run covers co_state_supplement.yaml, co_state_supplement_own_countable_income.yaml and co_state_supplement_deemed_income.yaml, one process per file, and git checkout restores the files afterwards (git status empty).

Mutant Killed by Mutant gives Expected
married = person.marital_unit.nb_persons() == 2 in _and_cs_client_income.py co_state_supplement.yaml Case 42 co_state_supplement_own_countable_income [3,360, 2,160, 0] [3,480, 2,280, 0]
marital_unit.sum(gross_earned) - gross_earned and the unearned twin in co_state_supplement_deemed_income.py co_state_supplement.yaml Case 42 co_state_supplement_deemed_income [14,280, 14,280, 0] [0, 0, 0]

No case on main kills either mutant: every multi-person AND-CS case there declares its marital units. So I added Case 42 (co_state_supplement.yaml:908), computed by hand before the run:

  • A disabled couple (husband $300 a month pension, head; wife $200, spouse) and a claimed third adult with $1,200 a month, in one tax unit, 2026, with no marital units.
  • SSI pairs only the spouses: (1,491 − (300 + 200 − 20)) / 2 = 505.50 each.
  • 3.549(A)(2)(c)(1) splits the $20, so own countable income is 290 and 190. Neither spouse deems to the other, since each receives SSI (3.549(F)).
  • Grants: 994 − 505.50 − 290 = 198.50 and 994 − 505.50 − 190 = 298.50 a month, or 2,382 and 3,582 a year.
  • The married mutant gives the full $20 to each: 280 and 180. The deemed mutant deems the third adult's 1,200 less the remaining $10, or 1,190 a month, to each spouse. The third adult isn't deeming-exempt: no SSI or OAP, and 1,180 of countable income is over the 994 limit.

5. Tests

One file per process on the merged tree at c45fe85e79, at most four processes at a time. 7e5c7a2cde changes only the changelog fragment.

Group Files Passed Failed
Named by the item, or touched by a conflict 6 277 0
SSI, state supplement and Medicaid files the merge brought in (Colorado, Part B, LTSS, CT and ID LIHEAP) 30 465 0
This branch's other test files: every one its diff from the merge base changes 63 1,189 0
Partner files that name SSI, supplement, MSP, Medicaid or Part B variables (none edited) 56 252 0
Code-health guards: builtin sum, in-place writes, group variables in person adds 3 15 0
Total 158 2,198 0

The named files: test_source_conflicts.py 103, test_ssi_spousal_deeming_invariants.py 80, nj_medical_expense_deduction.yaml 15, medicaid_optional_senior_or_disabled_countable_income.yaml 49, co_oap_deemed_income.yaml 21 and co_oap_deeming_exempt.yaml 9. co_state_supplement.yaml passes 42, Case 42 included.

Per-file counts

Named or conflict-touched: code_health/test_source_conflicts.py 103, core/test_ssi_spousal_deeming_invariants.py 80, gov/states/nj/tax/income/deductions/nj_medical_expense_deduction.yaml 15, gov/hhs/medicaid/income/medicaid_optional_senior_or_disabled_countable_income.yaml 49, gov/states/co/ssa/oap/co_oap_deemed_income.yaml 21, gov/states/co/ssa/oap/co_oap_deeming_exempt.yaml 9

Brought in by the merge: core/test_co_and_cs_invariants.py 4, core/test_co_ism_invariants.py 2, core/test_co_oap_invariants.py 2, core/test_medicaid_home_equity_limit_indexing.py 22, core/test_medicaid_ltss_financial_invariants.py 60, core/test_medicaid_spousal_impoverishment_indexing.py 10, core/test_ssi_state_supplement_medicaid_dependency.py 28, gov/hhs/medicaid/eligibility/categories/medically_needy/medicaid_medically_needy_medical_expenses.yaml 3, gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml 12, gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml 45, gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.yaml 9, gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml 34, gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml 21, gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml 16, gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml 9, gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_special_income_limit.yaml 2, gov/hhs/medicare/eligibility/medicaid_part_b_buy_in_premium_coverage.yaml 10, gov/hhs/medicare/eligibility/medicare_part_b_enrolled.yaml 4, gov/hhs/medicare/eligibility/medicare_part_b_premium.yaml 19, gov/hhs/medicare/test_part_b_msp_offset.py 15, gov/states/co/ssa/co_ssa_in_kind_support_and_maintenance.yaml 19, gov/states/co/ssa/oap/co_oap_in_kind_support_and_maintenance.yaml 5, gov/states/co/ssa/oap/co_oap_own_countable_income.yaml 15, gov/states/co/ssa/state_supplement/co_state_supplement.yaml 42, gov/states/co/ssa/state_supplement/co_state_supplement_countable_income.yaml 4, gov/states/co/ssa/state_supplement/co_state_supplement_deemed_income.yaml 12, gov/states/co/ssa/state_supplement/co_state_supplement_deeming_exempt.yaml 12, gov/states/co/ssa/state_supplement/co_state_supplement_own_countable_income.yaml 8, gov/states/ct/dss/ceap/eligibility/ct_ceap_categorically_eligible.yaml 11, gov/states/id/dhw/liheap/eligibility/id_liheap_income_eligible.yaml 10

This branch's test files: core/test_calculate_chunked_validation.py 80, gov/hhs/medicaid/eligibility/categories/is_209b_ssi_recipient_for_medicaid.yaml 20, gov/hhs/medicaid/eligibility/categories/medically_needy/is_medically_needy_for_medicaid.yaml 40, gov/hhs/medicaid/income/deemed/from_ineligible_spouse/medicaid_optional_senior_or_disabled_income_deemed_from_ineligible_spouse.yaml 7, gov/ssa/ssi/eligibility/income/deemed/ssi_income_deemed_from_ineligible_spouse.yaml 7, gov/ssa/ssi/eligibility/resources/deemed/is_ssi_spousal_resource_deeming_applies.yaml 14, gov/ssa/ssi/eligibility/ssi_marital_both_eligible.yaml 6, gov/ssa/ssi/is_ssi_qualified_noncitizen.yaml 1, gov/ssa/ssi/ssi_claim_is_joint.yaml 9, gov/ssa/ssi/ssi_couple_computation_applies.yaml 6, gov/ssa/ssi/ssi_if_takes_up.yaml 10, gov/ssa/ssi/uncapped_ssi_without_spousal_deeming.yaml 5, gov/states/ak/dpa/ssp/ak_ssp.yaml 9, gov/states/al/dhr/ssp/integration.yaml 20, gov/states/ca/cdss/capi/ca_capi_payment_standard.yaml 24, gov/states/ca/cdss/capi/ca_capi_person.yaml 26, gov/states/ca/cdss/capi/eligibility/ca_capi_income_eligible.yaml 7, gov/states/ca/cdss/state_supplement/ca_state_supplement.yaml 19, gov/states/ca/cdss/state_supplement/ca_state_supplement_person.yaml 37, gov/states/ca/chhs/wdp/eligibility/ca_wdp_income_eligible.yaml 3, gov/states/co/ssa/oap/co_oap.yaml 37, gov/states/ct/dss/ssp/eligibility/ct_ssp_resource_eligible.yaml 11, gov/states/dc/dhcf/ossp/dc_ossp_payment_amount.yaml 1, gov/states/de/dhss/ssp/de_ssp.yaml 9, gov/states/fl/dcf/oss/fl_oss_provider_rate.yaml 6, gov/states/hi/dhs/oss/hi_oss_payment_amount.yaml 1, gov/states/ia/hhs/ssa/ia_ssa.yaml 121, gov/states/in/fssa/ssp/in_ssp_sapn.yaml 5, gov/states/ky/dcbs/ssp/ky_ssp.yaml 13, gov/states/ky/dcbs/ssp/ky_ssp_claim_type.yaml 7, gov/states/ma/dta/ssp/ma_state_supplement.yaml 3, gov/states/me/dhhs/ssp/me_ssp.yaml 21, gov/states/mi/mdhhs/ssp/mi_ssp.yaml 5, gov/states/mn/dhs/msa/eligibility/mn_msa_resource_eligible.yaml 12, gov/states/mn/dhs/msa/mn_msa_person.yaml 17, gov/states/mn/dhs/msa/payment/mn_msa_guardian_fee.yaml 10, gov/states/mn/dhs/msa/payment/mn_msa_payment_category.yaml 11, gov/states/mo/dss/ssp/mo_ssp.yaml 35, gov/states/mo/dss/ssp/mo_ssp_resource_eligible.yaml 16, gov/states/ms/dom/hmw/eligibility/ms_hmw_eligible.yaml 4, gov/states/ms/dom/hmw/eligibility/ms_hmw_income_eligible.yaml 8, gov/states/mt/dphhs/liheap/eligibility/mt_liheap_categorical_eligibility.yaml 13, gov/states/mt/dphhs/liheap/mt_liheap.yaml 16, gov/states/mt/dphhs/liheap/payment/mt_liheap_benefit_income.yaml 8, gov/states/mt/dphhs/ssp/mt_ssp.yaml 17, gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_pre_one_claimant.yaml 3, gov/states/ne/dhhs/aabd/ne_aabd_standard_of_need.yaml 1, gov/states/nj/njdhs/ssp/nj_ssp.yaml 18, gov/states/nj/njdhs/ssp/nj_ssp_living_arrangement.yaml 12, gov/states/nv/dwss/oss/nv_oss.yaml 59, gov/states/ny/otda/ssp/ny_ssp.yaml 49, gov/states/oh/dbh/rss/oh_rss.yaml 23, gov/states/ok/dhs/ssp/ok_ssp.yaml 22, gov/states/or/odhs/ssp/or_ssp.yaml 39, gov/states/pa/dhs/ssp/pa_ssp.yaml 21, gov/states/ri/dhs/ssp/ri_ssp.yaml 23, gov/states/sd/dss/ssp/sd_ssp.yaml 41, gov/states/ut/dws/ssp/ut_dws_ssp.yaml 11, gov/states/va/dars/ag/va_ag.yaml 33, gov/states/vt/dcf/aabd/vt_aabd.yaml 18, gov/states/vt/dcf/aabd/vt_aabd_ep.yaml 27, gov/states/wa/dshs/ssp/wa_ssp.yaml 12, gov/states/wi/dhs/ssp/wi_ssp.yaml 20

Partner files: partners/amplifi/2025.yaml 1, partners/amplifi/2026.yaml 3, partners/analytics_coverage/edge_cases/federal/cash/ssi/federal.yaml 14, partners/analytics_coverage/edge_cases/federal/cash/tanf/federal.yaml 14, partners/analytics_coverage/edge_cases/federal/composition/cash_health/federal.yaml 8, partners/analytics_coverage/edge_cases/federal/healthcare/aca_ptc/ca.yaml 1, partners/analytics_coverage/edge_cases/federal/healthcare/aca_ptc/co.yaml 2, partners/analytics_coverage/edge_cases/federal/healthcare/aca_ptc/federal.yaml 11, partners/analytics_coverage/edge_cases/federal/healthcare/aca_ptc/il.yaml 1, partners/analytics_coverage/edge_cases/federal/healthcare/aca_ptc/ma.yaml 1, partners/analytics_coverage/edge_cases/federal/healthcare/aca_ptc/nc.yaml 1, partners/analytics_coverage/edge_cases/federal/healthcare/aca_ptc/wa.yaml 1, partners/analytics_coverage/edge_cases/federal/healthcare/chip/ca.yaml 1, partners/analytics_coverage/edge_cases/federal/healthcare/chip/co.yaml 2, partners/analytics_coverage/edge_cases/federal/healthcare/chip/federal.yaml 8, partners/analytics_coverage/edge_cases/federal/healthcare/chip/il.yaml 1, partners/analytics_coverage/edge_cases/federal/healthcare/chip/ks.yaml 3, partners/analytics_coverage/edge_cases/federal/healthcare/chip/ma.yaml 1, partners/analytics_coverage/edge_cases/federal/healthcare/chip/nc.yaml 1, partners/analytics_coverage/edge_cases/federal/healthcare/chip/wa.yaml 1, partners/analytics_coverage/edge_cases/federal/healthcare/medicaid/ca.yaml 2, partners/analytics_coverage/edge_cases/federal/healthcare/medicaid/co.yaml 2, partners/analytics_coverage/edge_cases/federal/healthcare/medicaid/federal.yaml 9, partners/analytics_coverage/edge_cases/federal/healthcare/medicaid/il.yaml 2, partners/analytics_coverage/edge_cases/federal/healthcare/medicaid/ks.yaml 2, partners/analytics_coverage/edge_cases/federal/healthcare/medicaid/ma.yaml 3, partners/analytics_coverage/edge_cases/federal/healthcare/medicaid/nc.yaml 1, partners/analytics_coverage/edge_cases/federal/healthcare/medicaid/wa.yaml 1, partners/analytics_coverage/edge_cases/federal/healthcare/msp/federal.yaml 11, partners/analytics_coverage/edge_cases/federal/healthcare/msp/ma.yaml 1, partners/analytics_coverage/edge_cases/state/ca/cdcc.yaml 3, partners/analytics_coverage/edge_cases/state/ca/eitc.yaml 6, partners/analytics_coverage/edge_cases/state/ca/foster_youth_tax_credit.yaml 3, partners/analytics_coverage/edge_cases/state/ca/renter_credit.yaml 5, partners/analytics_coverage/edge_cases/state/ca/state_supplement.yaml 4, partners/analytics_coverage/edge_cases/state/ca/tax_credits_composition.yaml 2, partners/analytics_coverage/edge_cases/state/ca/yctc.yaml 3, partners/analytics_coverage/edge_cases/state/co/care_worker_credit.yaml 4, partners/analytics_coverage/edge_cases/state/co/eitc_ctc.yaml 2, partners/analytics_coverage/edge_cases/state/co/family_affordability_credit.yaml 4, partners/analytics_coverage/edge_cases/state/co/oap.yaml 3, partners/analytics_coverage/edge_cases/state/co/state_supplement.yaml 3, partners/analytics_coverage/edge_cases/state/co/tax_credits_composition.yaml 2, partners/analytics_coverage/edge_cases/state/ma/eaedc.yaml 3, partners/analytics_coverage/edge_cases/state/ma/state_supplement.yaml 4, partners/analytics_coverage/edge_cases/state/wa/tax_credits_composition.yaml 2, partners/analytics_coverage/edge_cases/state/wa/working_families_tax_credit.yaml 7, partners/analytics_coverage/signatures/ca.yaml 29, partners/analytics_coverage/signatures/co.yaml 6, partners/analytics_coverage/signatures/federal.yaml 18, partners/analytics_coverage/signatures/il.yaml 7, partners/analytics_coverage/signatures/ma.yaml 5, partners/analytics_coverage/signatures/nc.yaml 5, partners/analytics_coverage/signatures/tx.yaml 7, partners/analytics_coverage/signatures/wa.yaml 4, partners/my_friend_ben/2025.yaml 1

CI

The Pull request run at this head is https://github.com/PolicyEngine/policyengine-us/actions/runs/42650265254. It was still running when I posted this. The run at the previous head, 8eca1fcf85 (https://github.com/PolicyEngine/policyengine-us/actions/runs/42274602235), passed all 36 jobs, including Household API Partners.

Judgment calls

  • AND-CS spouse helper. I used state_couple_total and state_is_married rather than the co-resident _ssi_couple_total, for the reasons under item 2. It's the reading this branch already takes for OAP.
  • The AND-CS Medicaid gate stays. co_state_supplement_deeming_exempt's near_client doesn't identify a spouse; it skips a Medicaid enrollment check for people who can't be a client's spouse or parent.
  • LTSS stays on the marital unit. It landed after the brief's main, so the hub hasn't seen it. My reasons are under item 2.
  • Case 42's home. I put it in co_state_supplement.yaml beside main's couple cases. It asserts the two intermediate variables and the grant in one household, as this branch's OAP counterpart does in co_oap.yaml. That's one simulation rather than one per variable file.
  • Changelog. The fragment's sentence now reads "Colorado OAP and AND-CS retain declared spouses living apart"; nothing else changed.
  • NJ comment. The merged case's comment names both payers of the Part B premium, MSP and Charge the Medicare Part B premium only to people who pay it #10634's SSI buy-in, since the merged tree computes 2,220 for each.
  • Wider test set. The item asked for conflict-touched files, the SSI and supplement files the merge brought in, test_ssi_spousal_deeming_invariants.py and test_source_conflicts.py. I also ran every test file this branch changes and 56 partner files, because I hand off before CI finishes.
    • I picked the partner files by searching for SSI, SSP, supplement, OAP, CAPI, MSP, Medicaid, Part B and NJ medical-expense variables.
    • I didn't run the other 89 partner files.
  • Process. I installed hypothesis with uv sync --extra dev, as CI does. I restarted the partner run once with more processes. The file I stopped mid-run, partners/.../medicaid/il.yaml, reran and passed.
  • Body. When I saved the paragraph, the server replaced the body's closing "Generated with" line with its standard attribution footer. The impact: and axiom: lines are byte-for-byte unchanged. The older "- CI:" bullet predates the passing run at 8eca1fcf85; I left it for the hub.

Proposed follow-up

Medicaid LTSS: rule out parent and child pairs as community spouses.
medicaid_ltss_community_spouse_countable_resources takes the other member of any two-person marital unit. With the community-spouse flag set, a default unit of a parent and a claimed child would count the child's resources; this branch's pair test rules that pair out.


Generated by Claude Code

@MaxGhenis

Copy link
Copy Markdown
Contributor Author

David, here's where each item of your review stands at 7e5c7a2cde:

  • S1: in f88c5ac70b, I moved all 43 cases from ssi_state_supplement_three_adult.yaml and ca_capi_three_adult.yaml into 34 variable-named files, three of them new: dc_ossp_payment_amount.yaml, hi_oss_payment_amount.yaml and ne_aabd_standard_of_need.yaml. Each case keeps its expected values, no stale path header remains, and the CI selectors run each moved case once.
  • S2: in 7f1e3486c2, I removed the five @example rows in test_state_supplements_do_not_depend_on_omitted_marital_units that repeated the YAML cases, and kept the six separated-spouse examples. I added the file's CI time before and after the trim, 203.827 s and 93.159 s, to the description's Validation section, with each CI group and the shared process's peak memory. CI records no peak for the file alone, and the description says so.
  • S3: I commented on Encode the SSI spousal-deeming benefit limit (20 CFR 416.1163(d)-(f)) and SSI couple definitions (416.1801(c), 416.1806, 416.1160(d)) (PE-US #10138 parity) TheAxiomFoundation/rulespec-us#1706. The comment names C2, D7, D9 and C1's output 6 as known PolicyEngine-US divergences, ties C2 to Treat an aged, blind or disabled spouse who fails SSI's noncitizen test as an ineligible spouse, and base CAPI's mixed couple on actual SSI/SSP receipt #10481 and D7 to SSI spousal deeming ignores a stay in a medical facility, and the couple computation ignores a privately paid one (20 CFR 416.1163(f)(5), 416.1167, 416.1801(c)) #10455, and points output 6 at ssi_claim_is_joint.
  • G1: I changed the description to read "compared with $10,269.72 on main" in the California table and "6-B, PDF p.60" in the Iowa section.
  • G2: under POMS SI 01320.150 B.1.b, SSA applies the regular individual PMV when it computes the individual amount in SI 01320.400 C.2. In bed40519a1, I changed uncapped_ssi_without_spousal_deeming.py to value in-kind support at that PMV and reapply the exclusions, and added five cases in uncapped_ssi_without_spousal_deeming.yaml, including your $662.67.
  • G3: in bed40519a1, I added the NOTE comments for issue 10481 at ssi_claim_is_joint.py:26 and in the deeming README, and for issue 10455 at uncapped_ssi_without_spousal_deeming.py:34 and is_ssi_spousal_deeming_applies.py:27.
  • G4: in 3eb77130b5, I kept ssi_marital_both_eligible as public API, redefined it with the spouse test and added two cases to its YAML. The marital earned and unearned income labels now describe the two spouses' combined income.
  • G5: in 7f1e3486c2, I replaced the pointer in or_ssp.py, or_ssp.yaml and the property test with OAR 461-155-0630(3) and the spouse definition in OAR 461-001-0000(62). Neither rule requires the spouses to share a facility, so candidates.yaml needs no entry.
  • G6: I documented both asymmetries in the description's "Not in this PR" section, with California's $23,880 and $29,880, and listed the readers still on marital units. This PR changes no code for them. I've recorded the follow-up issue for symmetric couple budgets and the remaining readers, and haven't filed it yet.
  • G7: I kept _ssi_spouse_index uncached, since every CI job passed at 7e5c7a2cde, the Microsimulation job included.
  • G8: I commented on Encode SSI spouse and parent resource deeming under 20 CFR 416.1202 and the 416.1205 resource limits (PE-US #3557 parity) TheAxiomFoundation/rulespec-us#1626 with rows for the four resource cases this PR adds or changes. They include the married dependents who now combine resources through a joint claim and the aged noncitizen spouse whose resources SSA deems.

An independent review of the commits since your review confirmed each code and test change above at 7e5c7a2cde.

🤖 Generated with Claude Code

@MaxGhenis
MaxGhenis dismissed DTrim99’s stale review November 10, 2026 15:45

I answered each item in the commits since this review, the description and two comments on TheAxiomFoundation/rulespec-us. In the reply above, I map each one to its commit, file or comment.

@MaxGhenis
MaxGhenis merged commit 6bcd43b into main Nov 10, 2026
115 of 123 checks passed
@MaxGhenis
MaxGhenis deleted the ssi-couples-and-deeming-cap branch November 10, 2026 15:45
@MaxGhenis

Copy link
Copy Markdown
Contributor Author

US + core hub merge audit, us#10141 at 7e5c7a2cde464841e23e0a2355fb100c79f48efe (squash): Apply 416.1163(e)(2) to deemed SSI and identify SSI couples by marriage, not tax roles.

🤖 Generated with Claude Code

MaxGhenis added a commit that referenced this pull request Nov 11, 2026
Main's SSI couples change (#10141) moved the spouse sums of the SSI
supplements into helpers such as _ssi_couple_total, so 11 FORMULA_READS
rulings stopped matching and test_formula_rulings_are_current failed at
the merge. The third code review also proved three ways to count a source
twice with every test green: a source that reads other sources through a
loop over a parameter list (M3), a ruled formula that changes how it uses
a read (M4), and a ruled formula that adds a read through a helper defined
beside it (M5).

- formula_sources() reads each formula and every helper it calls by name,
  recursively. helpers_called() matches helpers by source path under
  policyengine_us/variables, because core loads each variable file under a
  generated module name.
- CROSS_PERSON_HELPERS lists the helpers that combine a value across people
  by indexing; the scan counts a call to one as a sum, and the rulings test
  fails when one is no longer defined in a scanned formula.
- reads_by_variable() flags a formula that reads a variable by a name held
  in a variable (M3).
- RULED_READS pins the variables each ruled formula reads that another
  listed source reaches; any change fails test_formula_rulings_are_current
  (M5). The docstring states M4 as a limit.
- Rulings: capital_gains_behavioral_response, wi_cts,
  employment_income_behavioral_response, mt_ssp, nh_ssp, nj_ssp, nv_oss and
  vt_aabd_federal added after reading each with its helpers; ca_capi_person,
  co_tanf, ne_adc and sd_ssp_care relabelled OFFSET, or_ssp RECEIPT.

Text, from the third sources review: disability_benefits holds the
survey's Black lung and railroad disability payments (DIS_SC 8 and 6) in
the default data; survivor_benefits also holds workers' compensation and
Black lung survivor payments (Appendix A, source 8); the means-tested list
names ca_capi apart from the state SSI supplements.

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.

SSI: deemed benefit is capped at the individual rate instead of the no-deeming amount, and couples are identified by tax roles

3 participants