Skip to content

Include farm and partnership earnings in SSI and correct loss netting - #10532

Open
MaxGhenis wants to merge 11 commits into
mainfrom
ssi-earned-farm-partnership
Open

MaxGhenis wants to merge 11 commits into
mainfrom
ssi-earned-farm-partnership

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #10531
Fixes #10558

What and why

A Texas senior aged 67 with $60,000 of Schedule C profit receives no SSI or MSP Part B coverage. On base 8b17892d2cba99a82961ea32fbaf9d69c6ba73d6, putting that profit in farm operations or partnership SECA earnings instead produces $11,928 SSI and $2,434.80 MSP Part B coverage. Both cases are now treated like Schedule C: SSI $0, MSP Part B coverage $0, and personal Part B premium $2,434.80.

Add the disjoint farm_operations_income (active Schedule F) and partnership_self_employment_net_earnings (the K-1 Box 14 SECA component) once to SSI earned sources, and correct “unearned” to “earned” in the description. Do not add passive farm rent, all partnership_income, or total_self_employment_income, which would duplicate or misclassify income. The tax-base formula applies its NESE adjustment to the partnership input, confirming that the input is pre-adjustment despite its name.

The loss-rule review also exposed existing errors. Keep signed individual earnings for own-income readers, but apply a spouse's excess business loss to the other spouse's earned SSI/MSP/optional-Medicaid budget, using the existing co-resident spouse identification. Prevent negative earned balances from increasing child allocations or creating negative student exclusions. MN readers combine the same loss-adjusted own earnings with deemed earnings so the loss is deducted once. Connecticut SSP and Maryland PAA do not adopt SSI's loss offset: they count the applicant's own earnings, so a spouse's residual loss no longer reduces them (reading (e) below). MN restores pretax premiums only after covering any otherwise unabsorbed business loss, preventing false positive gross income. NH floors each person's combined self-employment income before adding wages. KY instead floors each modeled business source separately: a loss reduces neither another business's profit nor either spouse's wages. Kentucky spouse deeming now takes the ineligible spouse's own Kentucky earned-income amount while retaining the remaining deeming arithmetic and combining earnings before the $65 and one-half disregard. Restoring these sources also moves ssi_engaged_in_sga, so is_ssi_disabled, so a couple's computation: a disabled spouse whose farm profit exceeds the SGA amount becomes an ineligible spouse whose income is deemed (see the couple section below).

Merged main 8cd756f5f5efc07bf7e4108030afef8876345f25 in merge commit b1525c5106ca507534a0e79c59b2b8acb5d58981. It brought current Medicaid income/asset rules, state SNAP/LIHEAP and program updates, SSA PIA ratio and South Carolina TANF updates, and spouse-swap invariant coverage. Resolved one append conflict in MSP YAML by retaining main's 14 added state-exclusion cases and this PR's two loss cases; the formula auto-merged, and all 21 MSP cases pass. #10141 remains separate.

Governing text

  • (a) Classification. 20 CFR 416.1110(b): “Net earnings also include your share of profit or loss in any partnership to which you belong.” 404.1080 includes “Your distributive share (whether or not actually distributed)”; 404.1095 covers an “agricultural trade or business”; POMS SI 00820.200 says “NESE also includes any profit or loss in a partnership.” Active farm and qualifying partnership earnings are earned.
  • (b) Adjustment. 42 USC 1382a(a)(1)(B) incorporates section 411's definition of self-employment earnings, including 42 USC 411(a)(11): “there shall be allowed a deduction equal to the product of”, using half the combined payroll rates. The settled model reading applies the 7.65% deduction to positive combined NESE, without a $400 floor or tax-paid condition; losses remain signed and unadjusted. POMS SI 00820.210 A.3 and SI 00820.220 C.2.b–f describe a narrower administrative tax-paid test. A separate follow-up PR will implement the statutory deduction after this PR lands. This PR retains raw Schedule C and added farm/partnership amounts consistently.
  • (c) Losses. 404.1081(c): “A loss in one trade or business you carry on offsets the income from another trade or business.” Subsection (d) combines partnership and other NESE. Under 416.1111(b), losses offset earned income, including wages, never unearned income. POMS .210 B.2.c applies a loss to the person's earnings first, then the spouse's earnings, including eligible/ineligible spouses. The signed source sum already handled own-business/wage netting; this PR fixes the remaining spouse/allocation/exclusion paths.
  • (d) Monthly allocation. 416.1111(b): “divide the total of these earnings equally among the months in the taxable year”; “we deduct them only from your other earned income”. The model already divides annual earnings by 12 before monthly exclusions; seasonal or partial-year work is not prorated only over months worked. Short taxable years remain an annual-input limitation.
  • (e) Connecticut and Maryland. POMS SI 00820.210 B.2.c binds SSI, not Connecticut SSP or Maryland PAA, and no state text adopts SSI's income computation or a cross-person loss offset. UPM 5020.70 C.3.a: “the deemor's self-employment earnings are reduced by self-employment expenses, if applicable”; C.3.d deems “the combined total of the deemor's gross unearned income and applied earned income”. UPM 5020.05 A: “the income of the deemor is counted in full, except for those reductions specifically described in this chapter”. UPM 5030.10 A takes earned disregards from “the assistance unit's monthly total available gross earned income”. Maryland DHS's PAA page: “The assistance unit is always one person.” A spouse's residual business loss therefore does not reduce the applicant's own earned income in either program. SSI keeps the POMS treatment, and Connecticut still counts the resulting SSI payment as unearned income, so its countable income follows SSI. The reverse direction, an applicant's own loss against a spouse's deemed earnings, keeps main's netting through SSI's spouse-deemed amounts. Whether Maryland should pool spouses at all is a separate question that this PR leaves alone.

Invariants and intentional exceptions

  • Moving a fixed profit between Schedule C, active farming, and qualifying partnership earnings leaves ssi_earned_income unchanged; no added source is counted twice.
  • SSI does not rise when business profit rises.
  • A spouse's business loss never changes the applicant's Connecticut own earnings (ct_ssp_own_earned_income, never negative) or, where SSI deems no spouse income, the applicant's Connecticut earned budgets or Maryland PAA countable income.
  • With farm/partnership zero and nonnegative remaining business income, SSI, MSP, and all bounded state-reader outputs match main exactly. The property test uses a source-list reversion; the separate differential restores every changed variable class from the recorded git base.
  • Signed-loss cases intentionally differ: spouse loss offsets earned SSI income, residual child losses cannot increase an allocation above its zero-earned-income ceiling, student exclusions cannot be negative, MN gross income cannot become negative or resurrect unabsorbed losses through premium restoration, NH floors combined business income before wages, KY floors each source before either spouse's earnings are combined, and CT and MD keep the applicant's own earnings. Exact before/after examples are recorded in validation below.

Reader audit

Each row checks that program's own law; qualifying active farm/partnership earnings count as earned in all audited readers. Classification sharing does not assert that tax net profit captures every program-specific expense or averaging adjustment.

Reader(s) Own law: farm and partnership earnings Disposition / qualification
ssi_earned_income; ssi_earned_income_after_spousal_loss; ssi_marital_earned_income 20 CFR 416.1110(b) includes any trade/business NESE and partnership profit/loss; 416.1112 applies couple exclusions; POMS .210 B.2.c applies own/spouse loss offsets. Shared raw SSI list; helper adjusts only SSI-style budgets, keeping SGA and own-income state readers raw. Its readers that follow SSI methodology keep it (see the note after the ssi_countable_income table); CT SSP and MD PAA no longer read it for the applicant's own earnings.
ssi_earned_income_deemed_from_ineligible_spouse, ssi_income_deemed_from_ineligible_spouse, is_ssi_spousal_deeming_applies 416.1163(a), (d) first determines spouse earned/unearned income, then combines earnings under SSI exclusions. Shared SSI list via ssi_earned_income.
ssi_unearned_income_deemed_from_ineligible_parent, ssi_ineligible_child_allocation 416.1165(a)-(e) determines parental earned income and child allocations under SSI rules. Shared SSI list via ssi_earned_income.
ssi_blind_or_disabled_working_student_exclusion 416.1112(c)(3) applies to earned income generally, including NESE. Shared SSI list via ssi_earned_income.
ssi_engaged_in_sga 416.975(b)-(c) explicitly evaluates self-employed businesses and materially participating farm landlords. DI 10510.012 starts with NESE then work-value deductions. Inclusion correct. Existing income-only SGA approximation omits services/comparability tests; do not interpret this list addition as implementing those tests.
msp_countable_income (own earnings and spouse-deemed earnings) SSA 1905(p)(1)(B), (s)(2) determines QMB/QDWI income under SSI section 1612; 42 CFR 435.601 allows less restrictive state exclusions. Shared SSI list; state exclusions applied downstream.
medicaid_optional_senior_or_disabled_income_deemed_from_ineligible_spouse, medicaid_optional_senior_or_disabled_unearned_income_deemed_from_ineligible_parent 42 CFR 435.601(b)-(d) uses categorically related cash-assistance methodology, SSI for ABD, subject to 209(b)/state exceptions; 435.602 permits spouse/parent responsibility. Shared SSI earned classification; existing state methodology exceptions remain.
ca_wdp_gross_earned_income DHCS WDP criteria accept self-employment; 22 CCR 50503(a)(2), (8), 50505 in DHCS manual classify net self-employment profits and actively produced farm products as earned. Reads raw source list; inclusion correct. Existing state business-expense rules differ from tax NESE and remain a model-input limitation.
mn_msa_gross_income, mn_msa_net_income_eligible, mn_msa_person Minn. Stat. 256P.01 subd.3 includes net self-employment profits; CM 0017.15.33 explicitly includes sole proprietorships and partnerships and links farming. 256D.435 subds.4,4a,6 applies SSI deeming/exclusions. 256D.35 subd.10 defines gross income before disregards. Shared earned classification correct; premium restoration first absorbs otherwise unused losses. 256P.05 gives non-SSI recipients half-gross/taxable methods; SSI recipients exempt. Existing method choice requires separate inputs beyond this source fix.
nh_ssp_countable_income He-W 601.04(n), 654.01(b)–(c) treats self-employment work income minus business costs as earned; “the self-employment income amount shall be zero” if costs exceed gross income. Own source list/computation implemented. The rule names one self-employment amount per individual and bars excess costs from other income. Net the person's business profits and losses together, floor that combined amount at zero, then add wages. It contains no business-by-business prohibition.
wi_cts_gross_earned_income CTS Handbook 3.2.1 counts earned income from work and explicitly provides deductions for self-employed individuals; CTS uses historical AFDC definition in 45 CFR 233.20(a)(6)(iii)-(v), including farm, business and professional self-employment. Reads raw source list; inclusion correct. AFDC/state expense calculation differs from tax NESE, a preexisting input limitation.
ct_ssp_own_earned_income, ct_ssp_countable_income, ct_ssp_earned_income_disregard, ct_ssp_gross_income UPM 5000.01 definitions include self-employment proceeds in earned income. UPM 5020.70 C.3.a: “the deemor's self-employment earnings are reduced by self-employment expenses, if applicable”; C.3.d deems “the combined total of the deemor's gross unearned income and applied earned income”; C.4 repeats deeming in each direction. UPM 5020.05 A: “the income of the deemor is counted in full, except for those reductions specifically described in this chapter”. UPM 5030.10 A: disregards come off “the assistance unit's monthly total available gross earned income”. Own earnings; no spouse-loss offset. No Connecticut text adopts SSI's income computation or POMS SI 00820.210 B.2.c. All three readers take ct_ssp_own_earned_income, the person's signed SSI earnings floored at zero: own business losses still reduce own wages, but a spouse's residual loss does not. Spouse-deemed earnings keep SSI's after-loss amount, which already nets an applicant's own loss, so the floor stops that loss counting twice. SSI itself keeps POMS and enters as unearned income. UPM 5025.15 partial-year averaging remains an input limitation.
co_state_supplement_countable_income, co_oap_own_countable_income, co_oap_deemed_income 9 CCR 2503-5 3.520.782-.783 counts self-employment net profits as earned and expressly counts annual farm net income as earned; 3.534 governs spouse deeming. Inclusion correct; CO excludes depreciation and has its own averaging, existing raw tax-profit approximation limitations.
va_ag_countable_income AG Manual Chapter A.4 and I.59 uses SSI policy; I.59 expressly classifies all-trade/business NESE and partnership profit/loss earned. Shared SSI classification. Non-SSI self-employment cases require an AG consultant under I.59.1; do not invent additional rule.
vt_aabd_ep_countable_income AABD rule 2786 adopts Reach Up income rules. P-2213C / rule2251.3 classifies self-employment earned and expressly recognizes farm expenses. Reads raw list; inclusion correct. Reach Up disallows prior-year losses, depreciation and other expenses; current annual farm/partnership profit input does not expose all adjustments (preexisting limitation).
_ok_ssp_income helper: ok_ssp_countable_income, ok_ssp_own_countable_income; ok_ssp_spouse_child_allocation OAC 317:35-5-42(b)(9)(B), (i)(4) includes trade/business and partnership profit/loss; explicitly averages crop-farm income over 12 months. Inclusion correct; helper already floors each raw source and keeps state rounding/exclusions. Subannual-business averaging differs from SSI; annual-input limitation remains.
or_ssp_countable_income OAR 461-145-0910 includes own business/trade; 461-145-0915 explicitly includes general partners; 461-150-0095 annual NESE/12 and net losses against other earned income. Inclusion correct. Existing own-only vs financial-group loss treatment documented in source remains.
nc_sa_countable_income NC SA-3210 III.C, IV.B.1 counts self-employment and farm profit as earned and combines with other earnings; qualifying partnership NESE inferred from general SE rule. Inclusion correct; expense calculation disallows depreciation (existing input limitation).
oh_rss_countable_income OAC 5160:1-1-01(B)(19),(85) and 5160:1-3-03.1(B)(4) include self-employment from any trade/business less allowable deductions. Inclusion correct; farm/qualifying partnership inference from general NESE definition.
sd_ssp_care ARSD 67:46:04:03 refers to SSI earned-income definition; 67:46:04:02 counts available income; 67:46:06:03 applies the provisions for care supplement payments. Inclusion correct; no separate SE-loss floor found.
sd_ssp_independent ARSD 67:12:14:03(2) ends optional supplementation when a recipient has other income beyond SSI; POMS SI DEN01415.011 B.5 likewise requires no other income. Positive farm/business or partnership NESE is other income. Shared raw source list is a source-presence inventory here. Each source stays floored independently; this reader does not apply SSI earned exclusions or loss netting.
wy_ssp_eligible W.S. 42-2-103(d) and EOM M1804 require the SSI payment to be the recipient's sole income. Positive farm/business or partnership NESE defeats that condition. Shared raw source list is a source-presence inventory here. Retain positive-only source checks, with no earned exclusions or loss offsets.
md_paa_countable_income COMAR 07.03.07.07 B(2) counts self-employment less essential production expenses; 07.03.07.08 A(1), (3) sets earned-income deductions for an individual. Farm and active partnership inclusion follows the general self-employment rule (inference). Maryland's PAA program guidance: “The assistance unit is always one person.” Own earnings; no spouse-loss offset. No Maryland text adopts SSI's income computation or a cross-person loss offset; COMAR .03's SSI references concern disability and application conditions. Outside the SSI couple computation the reader takes the applicant's own ssi_earned_income, floored after the student exclusion; under the couple computation it keeps ssi_marital_earned_income. Pooling spouses at all is a separate question, unchanged here. Spouse-deemed income stays SSI's ssi_income_deemed_from_ineligible_spouse. State production expenses remain a methodology constraint.
ky_ssp_earned_income, ky_ssp_earned_income_deemed_from_ineligible_spouse, ky_ssp_countable_income 921 KAR 2:015 §8(1) counts income “according to the policy for the medically needy”. Volume IVA MS2450 B.4, C.7, C.8(b) measures self-employment as “profit”, lists “Allowable deductions”, and bars “prior losses or loss from one business to another”. Active farm/partnership profits count as earned; partnership inclusion follows the general self-employment rule. Separate own/spouse earned inputs. Each modeled business source floors at zero. No Kentucky text permits a loss to cross to other income; C.8(b) expressly forbids transfer between businesses. Consequently a loss reduces neither another business's profit, wages, nor a spouse's earnings. This departs from SSI's individual/spouse earned-loss offsets in POMS SI 00820.210 A.2, B.2.b–c. The ineligible spouse supplies that spouse's own ky_ssp_earned_income; remaining deeming arithmetic is retained, and §8(6) earnings combination still precedes the $65/half disregard. State-disallowed tax expenses, §8(3) conservation ordering and distinct parental methodology remain limitations.
tx_ssi_state_supplement_eligible Texas MEPD H-6000 states SSA determines SSI eligibility and institutional recipients qualify at SSI countable income of $30 or less. Federal 416.1110(b) therefore supplies the farm/partnership earned classification. Reads SSI countable income and removes spouse-deemed income for the institutional own-income test. Shared SSI earned classification correct.
mt_ssp, nv_oss, nj_ssp, vt_aabd_federal 20 CFR 416.2025(b) determines federally administered optional-supplement countable income by SSI methodology, including spouse deeming. Current POMS SI 01415.058 H, I, J, M identifies these four states' federally administered supplement programs. Thus the farm/partnership NESE classification in 416.1110(b) applies to each program. Shared SSI helper classification and spouse-loss budget are supported. This row covers Vermont's federal supplement, separately from Vermont's Reach Up-based essential-person payment audited above.
pa_ssp 55 Pa. Code 299.21(a)-(b) requires SSI eligibility except excess income; 299.36(a)(2)(iv) expressly applies 20 CFR Part 416 Subpart K income requirements to state-administered SSP-only cases. Federally administered care supplements are also identified in POMS SI 01415.058 K. Farm/partnership NESE counts as earned under the adopted SSI rules for both administration paths; shared helper appropriate for classification.
ny_ssp NY Social Services Law 208(6)-(8) defines countable income using federal/state exclusions and defines earned income to include self-employment. 209(4) computes additional payments from SSI plus countable income. Active farm/qualifying partnership NESE inclusion follows the general self-employment definition (inference). State administration does not change the earned classification. Existing New York-specific categories and payment rules remain in the wrapper.
ri_ssp 218-RICR-20-00-5.1.1(A)(1), 5.2(B)(2)-(3) applies Part 416 income eligibility, distinguishes SSA-administered Category D from state administration, and specifies countable-income calculations for state-only payments. Category D is identified in POMS SI 01415.058 L. SSI farm/partnership NESE classification applies; the state-only provision cross-references its Medicaid countable-income rules, without a separate exclusion of active farm/partnership earnings. Classification sharing is supported for both paths; administrative/payment differences remain in the wrapper.

NH nets businesses within a person and floors their combined result before wages. Kentucky instead forbids a loss crossing from one business to another or to either spouse's wages. Its spouse-deemed earned input now uses the ineligible spouse's own Kentucky amount, with the other retained deeming steps unchanged. MN own-and-deemed budgets use the loss-adjusted SSI helper consistently; CT and MD count the applicant's own earnings, as reading (e) states. Other state expense/partial-year conventions remain input limitations, as the table states.

The recorded static audit covers direct earned-source and earned-income readers, all direct consumers of the changed marital/deeming budgets, and their state function wrappers: 34 state outputs across 23 sampled states, including Kentucky's own-income helper. The Kentucky spouse-deemed variable added in this revision is additional coverage; it is not included in that prior differential's output list. The audit excludes unbounded propagation through SSI as transfer income. The table distinguishes classification from program-specific expense/deeming rules.

Readers of ssi_countable_income

These 24 files read ssi_countable_income, so counting farm and partnership earnings moves them too. A grep at this head finds no others (three more matches are comments). Each row asks whether the program's own law follows SSI's income counting, and so reaches farm and partnership income: 20 CFR 416.2025(b) covers federally administered supplements, and a state-administered program needs its own text. This is research only; none of these readers changes here.

Reader(s) Own law: farm and partnership earnings Disposition
uncapped_ssi Federal SSI. 42 USC 1382a(a)(1)(B) counts net earnings from self-employment; 20 CFR 416.1110(b): “Net earnings also include your share of profit or loss in any partnership to which you belong.” SSI methodology; the source change applies directly.
_ssi_state_supplement helper (mt_ssp, nv_oss, nj_ssp, vt_aabd_federal, pa_ssp, ri_ssp, ny_ssp) 20 CFR 416.2025(b): countable income is “determined in the same manner as such income is determined under the title XVI supplemental security income program”; POMS SI 01415.058 lists the federally administered programs. New York has been state administered since October 1, 2014 (OTDA 14-ADM-07), so its row below rests on New York's own text. SSI methodology for the federally administered callers.
ssi_resources_deemed_from_ineligible_parent SSI parent-to-child resource deeming, 20 CFR 416.1202(b); POMS SI 01330.200 B: “equally divide the value of the deemed resources among those children”. The reader uses each child's SSI countable income to find the eligible children who share deemed resources (inference from the formula and SI 01330.200 B). SSI methodology.
is_optional_senior_or_disabled_for_medicaid SSA 1902(m)(1)(B) uses income “as determined under section 1612 for purposes of the supplemental security income program”, subject to (m)(2)(C)'s COLA disregard; 42 CFR 435.601 permits specified less restrictive methods. SSI methodology.
is_medically_needy_for_medicaid 42 CFR 435.831(b)(2) requires states covering SSI recipients to “deduct amounts that would be deducted in determining eligibility under SSI”; 209(b) states keep their 1972 criteria under (b)(3) and 435.121. SSI methodology outside 209(b) states; individual state plans not assessed.
ca_capi, ca_capi_income_eligible California CAPI, county administered. CDSS MPP §49-035.12: “Detailed income rules are found in 20 CFR, Part 416, Subpart K.” SSI methodology.
ca_state_supplement Federally administered: POMS SI SF01415.100: “By agreement, SSA administers both mandatory and optional State supplementation payments for California”; 416.2025(b) supplies the income rule. SSI methodology. New YAML case 10: $13,200 Social Security and $30,000 farm profit gives $0 at this head and $3,393.72 on main.
co_state_supplement_countable_income State administered (9 CCR 2503-5 §§3.547–3.548). Its own §3.520.783 counts self-employment profit after permitted costs: “Farm income shall be considered on a yearly basis.” (B)(2): “Depreciation of equipment shall not be considered as a business expense.” Partnerships are not named (inference from the general rule). A loss-offset rule was not found. Own text; reaches farm and partnership. Depreciation and loss treatment differ from tax net profit (existing input limitation).
fl_oss, fl_oss_eligible State administered: ESS §0240.0100: “SSI-Related Programs are state administered programs”. ESS §2640.0418 uses deductions across all trades and businesses and counts the “share of ordinary net income (or loss) from partnerships”; §2640.0420.01: a loss “is to be reflected as zero” until established, then offsets self-employment income or wages. Own text; reaches partnership expressly and farming by inference. Loss rule agrees with SSI's verification requirement.
ia_ssa_federal Iowa's federally administered components (441 IAC 50.2(1)(a)); HHS Manual 6-B: “Use SSI policy when determining countable income.” SSI methodology.
ia_ssa_smme_countable_income State administered (441 IAC 50.2(1)(c)); Manual 6-B: “Income for eligibility is determined according to SSI income criteria.” Manual 8-E uses Schedule F but says “Apply a 15.3% deduction to net profit”, where SSI applies 7.65%. SSI methodology; the manual's deduction is a discrepancy for the hub.
id_aabd State administered. IDAPA 16.03.05.400–.403 count self-employment receipts less allowable costs; .403, “Self-employment expenses not allowed”, lists “Loss of Farm Income Subtracted From Other Income” (.06) and “Net Losses from Previous Periods” (.08). Partnerships follow the general rule (inference). Own text; a farm loss may not reduce other income, unlike SSI. Reported to the hub.
in_ssp_rcap State administered (SSA Indiana summary). The RCAP Provider Guide gives gross-income ceilings only; 455 IAC 1-3-3 could not be opened. Not found. Reported to the hub.
in_ssp_sapn State administered (POMS SI CHI01401.001 B.2.c). IHCPPM §5005 subtracts “budgeted earned and unearned income” from the $52 personal needs allowance; §2810.30.00 includes “Farm self-employment”; §3410.15.00: “Self-employment business losses cannot be used to offset or reduce other, non-self-employment income (i.e. wages).” Own text (Medicaid budget, inference); losses may not reduce wages, unlike SSI. Reported to the hub.
la_oss State administered. LDH I-1534: “Count the distributive share (whether or not distributed or received) as net earned income, if the business is a partnership.” Farming follows the general net self-employment rule (inference). No loss rule found. Own text; reaches partnership expressly, farming by inference.
nc_sa_eligible 10A NCAC 71P .0905: “Eligibility shall be determined using the income rules governing the SSI Program”. The SA manual SA-3210 III.C says “Do not allow depreciation as an operational expense.” SSI methodology; the manual's depreciation rule is an existing input limitation.
ny_ssp State administered. 18 NYCRR 398-2.1 counts income “not excluded by federal law or regulation in determining eligibility for SSI” and earnings “including earnings from self-employment, in accordance with federal law and regulations”; 398-4.3 relies on SSA eligibility determinations. SSI methodology.
sc_ssi_state_supplement, sc_ssi_state_supplement_eligible, sc_ssi_state_supplement_pna State administered (R.126-940(C)). R.126-910(E): countable income is “an individual's gross income less those exclusions of income allowed under the provisions of the federal Supplemental Security Income (SSI) Program.” SSI methodology.
tx_ssi_state_supplement_eligible MEPD H-6000: SSA “determines eligibility for these recipients”. E-3100 includes a partner's share and active farm income; E-6200: “Losses cannot be deducted from unearned income or carried over from a previous period.” SSI methodology.
va_ag_countable_income AG Manual A.4: AG is “required to use SSI policy to determine eligibility”; I.59: “NESE also includes any profit or loss in a partnership.” SSI methodology.

The other readers of ssi_marital_earned_income and ssi_earned_income_after_spousal_loss follow SSI methodology and keep the POMS treatment: SSI's own deeming and countable income, msp_countable_income (SSA 1905(p)), medicaid_optional_senior_or_disabled_income_deemed_from_ineligible_spouse and medicaid_optional_senior_or_disabled_countable_income (42 CFR 435.601), and Minnesota MSA. Minnesota administers MSA itself under Minn. Stat. 256D.435, which the MN row above cites for SSI deeming and exclusions; this revision did not re-read it for a loss-offset rule.

Remaining methodology questions: Kentucky §8(3) spouse conservation versus §8(6) combined-earnings ordering, plus its distinct parental methodology. Neither subsection states a business-loss offset, so it does not contradict the per-source floor adopted here. Kentucky's retained SSI student/unearned and remaining deeming inputs are an approximation; raw business inputs also do not expose every business or state-disallowed depreciation. The 7.65% SSI deduction is settled and deferred to the follow-up; NH's combined self-employment floor is settled and implemented here.

SGA and self-employment losses (for the hub). ssi_engaged_in_sga compares signed ssi_earned_income with the SGA amount, so an own self-employment loss lowers SGA earnings against wages. POMS DI 10505.015 D.3 (multiple work efforts): “When an individual has wages and has a loss from self-employment, do not use the loss to reduce total earnings.” Main already nets Schedule C losses this way; this PR extends that to farm and partnership losses. Netting one business's loss against another business follows 20 CFR 404.1081(c), “A loss in one trade or business you carry on offsets the income from another trade or business”, and DI 10510.012 B, which starts from NESE. This PR does not change the SGA computation.

State loss rules found in the ssi_countable_income reader review (for the hub). Idaho AABD (IDAPA 16.03.05.403.06) disallows “Loss of Farm Income Subtracted From Other Income”. Indiana's Medicaid budget, which SAPN uses, says “Self-employment business losses cannot be used to offset or reduce other, non-self-employment income (i.e. wages)” (IHCPPM 3410.15.00). Indiana RCAP's own income rule was not found. Both Idaho and Indiana read SSI countable income, which lets losses offset wages.

Proposed separate follow-up (no issue created): Missouri SAB omits active partnership self-employment earnings from its earned source list.
Its own source list already contains farm income and is unaffected by the SSI-list change; the omission is independent. Review active partnership NESE against MO SAB Manual 0410.015.05, preserving passive investment treatment.

SGA, disability and the couple computation

Restoring these sources moves ssi_engaged_in_sga, so is_ssi_disabled, so whether two spouses are an eligible couple. New ssi_spouse_farm_sga.yaml pins two Texas couples in 2026: a head aged 67 with no income, and a spouse aged 50 who meets the disability criteria.

Case Output Main 8cd756f5f5 This head
Spouse farm profit $24,000 ($2,000 a month, above the $1,690 SGA amount) is_ssi_disabled (head, spouse) false, true false, false
Same ssi, annual (head, spouse) $8,946, $8,946 $6,402, $0
Spouse wages $18,000 plus farm profit $6,000 is_ssi_disabled (head, spouse) false, true false, false
Same ssi, annual (head, spouse) $4,701, $4,701 $6,402, $0

On main the farm profit counted nowhere, so the spouse stayed disabled and the two were paid as an eligible couple, at half the couple rate each. Here the spouse's farm earnings exceed the SGA amount, so the spouse is not disabled (20 CFR 416.905(a): “The law defines disability as the inability to do any substantial gainful activity”). Not aged, blind or disabled, the spouse is an ineligible spouse under 416.1160(d), and 416.1802(a) counts “part of that person's income as yours”. Under 416.1163(d) the $2,000 exceeds the $497 rate difference, so the head is paid as a couple: $1,491 − ($2,000 − $85) / 2 = $533.50 a month. The second case reproduces the downstream shape, where the head's SSI rose and the spouse's fell to zero. With farm profit alone above SGA and no other spouse income, the head's SSI cannot rise: at least $9,750 a year is then deemed, which leaves the head less than the half couple rate main paid. The result follows these sections, within the model's existing income-only SGA test (see the limitations below). #10141's 416.1163(e)(2) limit, “Your SSI benefit under the deeming rules cannot be higher than it would be if deeming did not apply”, cannot bind here: $533.50 is below the $994 the head would receive without deeming. It binds only while the deemed amount stays under the $5,964 annual rate difference, that is, while the spouse's earned income stays under about $12,700 to $12,950 a year, depending on how much of the $20 general exclusion the head's own unearned income uses. Here $11,490 is deemed from $24,000 of farm earnings.

Open-PR overlap

The following open-PR merge-tree analysis was recorded at reviewed head 6cb74d7c4ee2a566a30712673200a6aa371d3f69, 2026-10-29 13:19:24 UTC. Those PR-head comparisons are historical. This revision has since merged main 8cd756f5f5efc07bf7e4108030afef8876345f25, retaining both additions in its one MSP YAML append conflict as noted above; it has not pre-merged #10141.

Exit 1 below denotes a hypothetical merge conflict. Exact common/conflict files and semantic integration requirements follow; raw command logs remain untracked locally for the hub.

PR / current head Final merge-tree Common files Semantic overlap / integration requirement
Previously checked main 1b52a6d7c08574c47aa87d762efc996f55a0ff58 Exit 0; clean No common changed files since our base 8b17892d2c That main added the owners-draw reform (#10483), which is off by default. The later main merge is described above; the original policy-comparison base is recorded above.
#10146 6559b7c3358e935951799543890a6bbbef30d8f4 Exit 1; 12 conflicted files 16 files: MSP formula/YAML; optional Medicaid spouse-deeming formula; SSI spouse earned/income-deeming formulas; SSI child-allocation formula/YAML; CT SSP countable/disregard/gross formulas; KY SSP countable formula; MN MSA net-eligibility/gross/person formulas; NH SSP countable formula/YAML Replaces annual SSI/Medicaid budgets with monthly consumers and changes child-allocation scope. Preserve this PR's ssi_earned_income_after_spousal_loss routing and nonnegative child-earned contribution in the new monthly formulas. Keep CT/MN own/deemed earnings consistent, including MN gross-premium restoration. Preserve KY's separate positive-business source computation when adapting its monthly budget. Combine NH's add/add test cases and preserve its separate self-employment loss rule.
#10141 a53311ad7b201b8f9aa7b37185fbde55b34b4382 Exit 1; 2 conflicted files SSI spouse-earned-deeming and marital-earned formulas (conflicts); MN MSA net-eligibility and person formulas (automatic merge) Replaces marital-unit assumptions with actual spouse indices and changes SSI couple/deeming caps. Retain ssi_earned_income_after_spousal_loss with its _ssi_spouse_index selection in both conflicted files. Its changes to _ssi_spouses.py also affect this PR's SSI loss helper and MN gross-premium restoration. Both Kentucky's countable-income pooling and its new spouse-deemed earned-income helper retain marital-unit assumptions: the former must adopt #10141's two-spouse total helper, and the latter its spouse-selection helper, when integrating the third-adult fix. This PR does not pre-merge #10141; whichever PR lands second adapts.
#10360 7291aa771386606c03e87ce736fd07007da6350a Exit 1; MSP YAML conflict only msp_countable_income.py and msp_countable_income.yaml; formula auto-merges Adds state MSP exclusions after the same earned-income budget. Preserve the loss-adjusted source before applying its state exclusions and combine both YAML additions.
#10483 b5fb5cabb2227fab8e00d40a9fc3bb964768f0cd (merged) Exit 0; clean No common files Now merged into main. Reads partnership SE earnings as an already-SE subset to remove from its optional owners-draw residual; reform is off by default. This PR counts that existing partnership component once and adds no owners-draw source. No conflicting baseline change.

#10146 exact conflict files

  • policyengine_us/tests/policy/baseline/gov/hhs/medicare/savings_programs/income/msp_countable_income.yaml
  • policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ssp/nh_ssp_countable_income.yaml (add/add)
  • policyengine_us/variables/gov/hhs/medicaid/income/deemed/from_ineligible_spouse/medicaid_optional_senior_or_disabled_income_deemed_from_ineligible_spouse.py
  • policyengine_us/variables/gov/hhs/medicare/savings_programs/income/msp_countable_income.py
  • policyengine_us/variables/gov/ssa/ssi/eligibility/income/deemed/from_ineligible_spouse/ssi_earned_income_deemed_from_ineligible_spouse.py
  • policyengine_us/variables/gov/ssa/ssi/eligibility/income/deemed/from_ineligible_spouse/ssi_income_deemed_from_ineligible_spouse.py
  • policyengine_us/variables/gov/ssa/ssi/eligibility/income/deemed/ssi_ineligible_child_allocation.py
  • policyengine_us/variables/gov/states/ct/dss/ssp/income/ct_ssp_countable_income.py
  • policyengine_us/variables/gov/states/ct/dss/ssp/income/ct_ssp_earned_income_disregard.py
  • policyengine_us/variables/gov/states/ky/dcbs/ssp/ky_ssp_countable_income.py
  • policyengine_us/variables/gov/states/mn/dhs/msa/eligibility/mn_msa_net_income_eligible.py
  • policyengine_us/variables/gov/states/mn/dhs/msa/mn_msa_person.py

#10146 other common files, merging automatically

  • policyengine_us/tests/policy/baseline/gov/ssa/ssi/eligibility/income/deemed/ssi_ineligible_child_allocation.yaml
  • policyengine_us/variables/gov/states/ct/dss/ssp/income/ct_ssp_gross_income.py
  • policyengine_us/variables/gov/states/mn/dhs/msa/income/mn_msa_gross_income.py
  • policyengine_us/variables/gov/states/nh/dhhs/ssp/nh_ssp_countable_income.py

Other exact conflict files

#10141:

  • policyengine_us/variables/gov/ssa/ssi/eligibility/income/deemed/from_ineligible_spouse/ssi_earned_income_deemed_from_ineligible_spouse.py
  • policyengine_us/variables/gov/ssa/ssi/eligibility/income/marital/ssi_marital_earned_income.py

Automatically merged common files for #10141:

  • policyengine_us/variables/gov/states/mn/dhs/msa/eligibility/mn_msa_net_income_eligible.py
  • policyengine_us/variables/gov/states/mn/dhs/msa/mn_msa_person.py

#10360:

  • policyengine_us/tests/policy/baseline/gov/hhs/medicare/savings_programs/income/msp_countable_income.yaml

Automatically merged common file for #10360:

  • policyengine_us/variables/gov/hhs/medicare/savings_programs/income/msp_countable_income.py

#10483: none.

Validation

At revision 7f5467b8e11d03f528314faa05d28b1cbfd90e17, every YAML file named below ran in its own foreground process under the 4 GB / 1800 s cap: 160 cases in 21 files pass. They cover all 13 Connecticut SSP files (99 cases), all four Maryland PAA files (md_paa.yaml 10, md_paa_countable_income.yaml 6, md_paa_imputed_federal_ssi.yaml 5, integration.yaml 14), ca_state_supplement.yaml (10), ssi_engaged_in_sga.yaml (8), the new ssi_spouse_farm_sga.yaml (2) and from_ineligible_parent.yaml (6). The property file passes all 10 tests. ruff format, ruff check and git diff --check pass. All 33 CI checks pass at this head: the Pull request run 41198024956 concluded success, observed 2026-10-31 12:45 UTC after polling every five minutes.

Differential against merge base 8cd756f5f5. The run covered 480 seeded couples (240 CT, 240 MD, 960 people) with wages, signed Schedule C and SSTB income, Social Security and private pensions. Farm and partnership inputs were zero, so main counts the same sources.

  • CT: wherever both spouses' signed SSI earnings are nonnegative (260 rows), ct_ssp_gross_income minus ssi matches main exactly. Of the 132 other differences, 122 come only from flooring a person's own negative earnings at zero. The remaining 10 also involve main giving an adult a “child allocation” from negative earnings (max_(0, 0 - income) in ssi_ineligible_child_allocation), which this PR's floor removes.
  • MD: wherever main's ssi_marital_earned_income is nonnegative (373 rows), md_paa_countable_income matches main in 370. The 3 mismatches each have a positive-earning applicant and an ineligible spouse with a residual loss and a pension. On main, that adult “child allocation” from the spouse's negative earnings cut the spouse's deemed pension, for example $10,188 to $1,581, so SSI deemed nothing; this PR deems the full pension. That runs through ssi_income_deemed_from_ineligible_spouse, not through PAA's own earnings. The 5 other MD differences are applicants with residual losses. Main deducted each loss twice, as an allocation against the spouse's earnings and again in the combined countable income; this PR deducts it once.

Mutants for this revision. Each mutant ran in a scratch worktree, one process each under 2 GB / 900 s. All five YAML runs (ct_ssp_countable_income.yaml; md_paa_countable_income.yaml for m4) hit the 2 GB RSS cap during the first YAML case, about 180 s in, so they count as unrun, not as kills. The targeted property -k test_spouse_loss_never fits under the cap and killed all five by assertion. m5 first survived it, because the property draws applicants with nonnegative own earnings; the never-negative assertion now kills it.

Mutant Property result
m1: ct_ssp_countable_income reads ssi_earned_income_after_spousal_loss killed
m2: ct_ssp_earned_income_disregard reads ssi_earned_income_after_spousal_loss killed
m3: ct_ssp_gross_income reads ssi_earned_income_after_spousal_loss killed
m4: md_paa_countable_income reads ssi_marital_earned_income unconditionally killed
m5: ct_ssp_own_earned_income drops its zero floor killed

At the previous revision 4550dd0597deec0d367a61dfa5b0cd37a475d03c, all 134 YAML cases across 15 files pass through the standard CLI, including all 21 MSP cases, 15 Kentucky cases and nine unchanged Kansas TANF contract cases. Every added/changed YAML file was run separately. No lightyaml fallback was needed. The code-health guard passes (1 test, 1.54s pytest / 14s process wall), and all nine property tests pass. All eight review mutants are killed by assertion failures. make format (ruff formatting/lint) and git diff --check pass. All 33 CI checks passed at this head, observed 2026-10-30 09:07:43 UTC after approximately 90 minutes of polling at five-minute intervals. The original-head results below are historical and are reported separately.

New Kentucky cases compare the reviewed head with this revision:

Case Output Reviewed head Revised
Applicant 67, farm −$6,000; ineligible spouse 60, wages $20,000 Spouse-deemed earnings, annual $14,000 $20,000
Same case Kentucky countable income, monthly $540.83 $790.83
Applicant 67, farm $0; ineligible spouse 60, wages $20,000 and Schedule C −$6,000 Spouse-deemed earnings, annual $14,000 $20,000
Same case Kentucky countable income, monthly $540.83 $790.83

The first case restores the recorded base's $20,000 / $790.83 values. Both revised outputs follow Kentucky's prohibition on transferring a business loss, while retaining the earnings combination before its $65/half disregard.

An additional §8(6) case gives the applicant $600 wages and the ineligible spouse $20,000 wages; Kentucky countable income is $815.83 monthly, confirming their earnings combine before the disregard.

The CT/MD probe uses a 67-year-old applicant with $12,000 of wages and a 60-year-old spouse with $2,000 of wages and a $7,000 Schedule C loss. Base is merge base 8cd756f5f5efc07bf7e4108030afef8876345f25; the previous head is 4550dd0597deec0d367a61dfa5b0cd37a475d03c. Connecticut's countable income exceeds main only because SSI rose: Connecticut counts the SSI payment as unearned income, less the $562 community-alone disregard.

State/output Base (main) Previous head This head
SSI, annual (either state) $6,438 $8,938 $8,938
CT earned-income disregard, monthly $532.50 $324.17 $532.50
CT gross income, monthly $1,536.50 $1,328.17 $1,744.83
CT countable income, monthly $467.50 $442.00 $650.33
MD PAA countable income, annual $5,490 $2,990 $5,490

In the reverse direction (applicant $5,000 Schedule C loss, ineligible spouse $10,000 of wages), MD PAA countable income is $0 on main, at the previous head and here. The routes differ. Here, POMS B.2.c leaves the spouse $5,000 of after-loss earnings, below the $5,964 deeming threshold. On main, the applicant's negative earnings gave the applicant a $5,000 “child allocation” (the error #10558 describes), which took the spouse's deemed earnings to the same $5,000. With $15,000 of spouse wages, main deducted the loss twice and deemed $1,990; the previous head and this head deem $4,490, deducting it once.

Generated property cases now draw negative business income for either spouse and for children/students; state-specific properties use their own state. These invariants extend the finite sourced YAML examples:

Property Failure it detects Review mutant Revised property run
A business loss never reduces SSI countable unearned income Residual earned loss crossing into unearned income Independent metamorphic invariant; no unique reviewer mutant passed
Both spouses' after-loss earnings are nonnegative and sum to max(e_a + e_b, 0) Residual loss or missing spouse offset m1a, m2 passed; both mutants killed
Residual child losses cannot increase allocation above its zero-earned-income ceiling; student exclusion remains nonnegative Negative earnings inflating allocation or exclusion m1b (child allocation) passed; mutant killed
NH countable earned income for nonpositive combined self-employment equals wages-only Flooring after wages m3 passed; mutant killed
KY own earnings equal wages less capped pretax premiums plus independently floored business sources Netting losses across businesses m4 passed; mutant killed
Profit-source repartition preserves SSI earned income Missing or duplicated farm/partnership source s1, s2, s3 passed; all three mutants killed
A spouse's business loss never changes the applicant's CT own earnings or, where SSI deems no spouse income, the applicant's CT gross earned income, earned disregard, countable earned income or MD PAA countable income; CT own earnings are never negative Spouse loss reaching a CT or MD applicant's earnings; an own loss deducted twice r2 m1–m5 passed; all five killed

The local before measurement passed all four existing property tests in 17.00s pytest / 35.77s process wall. The timing wrapper then exited 1 because macOS denied its sysctl kern.clockrate read; this occurred after pytest's successful result. No before peak RSS was captured. The expanded nine-test file passes in 20.40s pytest / 33s process wall, a 3.40s increase in pytest time. An instrumented measurement including startup took 30.63s and peaked at 2.648 GiB under the 4 GB cap / 1800s timeout. These local measurements retain the existing CI budget. Each mutant ran its targeted property from the same file using -k, -q and -x in an isolated scratch copy under 2 GB / 900s. All eight failed assertions; none failed during import/collection or hit a cap.

Mutant Property that killed it Process wall, seconds Peak RSS, GiB Result
m1a: residual loss left unfloored Spousal nonnegative/conservation identity 18 1.028 killed
m1b: child loss reduces unearned income Child allocation/student floor 34 1.514 killed
m2: spouse-loss step removed Spousal nonnegative/conservation identity 15 1.028 killed
m3: NH floor after wages NH nonpositive-business wages-only equality 13 1.029 killed
m4: KY loss offsets another business, context adapted KY independently floored source identity 13 1.029 killed
s1: farm source removed Profit-source repartition 13 1.028 killed
s2: partnership source removed Profit-source repartition 17 1.029 killed
s3: farm source duplicated Profit-source repartition 13 1.028 killed

The reviewer’s original m4 patch targets the generator syntax removed by the code-health fix, so its context no longer applies. The scratch mutation preserves the same semantic fault: replace the sum of individually floored Kentucky business sources with a single floor after summing all business sources. Both the original and context-adapted patches are retained as evidence.

For existing Linux CI context, the reviewed head's run 40894251789 ran these four tests in 43.117s including shared setup in Python shard 2's core-1 group. That group completed 1,950 tests in 1,512.48s; the job took 27m30s against its existing 90-minute budget. Local before/after measurements and this historical Linux measurement are reported separately; this revision changes no CI runners or budgets.

At this revision, main's updated routing places the property file in Python shard 5. All nine tests passed in 41.504s including shared setup; the five new property calls total 3.47s. Its core-1 group completed 945 tests in 887.74s, and the entire shard finished in 30m39s within the existing 90-minute budget. Uploaded resource reports give the full core-1 process a peak of 11.263 GiB before (27m00.76s wall, 1,950 tests) and 7.437 GiB after (16m07.58s wall, 945 tests). Group membership and setup times differ, so this is not a controlled whole-group comparison and does not attribute the decrease to this change. These Linux group peaks are separate from the local single-file peak reported above.

Original-head validation

  • YAML: 117 distinct cases across 15 files passed, including all nine unchanged Kansas partner cases. Minnesota's 18 person cases were rerun after its gross-income correction.
  • Python: four tests passed: Hypothesis profit repartition, SSI monotonicity, zero-farm/partnership list-reference equivalence on the nonnegative-business domain, and a seeded 200-household comparison.
  • Actual-main differential: 200 households, 377 people, 23 states, 113 existing outputs exactly match base 8b17892d2cba99a82961ea32fbaf9d69c6ba73d6 with farm/partnership zero and nonnegative Schedule C/SSTB. Restored 15 exact base variable classes, rather than only reverting the source list.
  • Mutants: all three killed by assertion failures under 2 GB/900s; positive control passed under the same cap (0.761 GiB local peak). No RSS/timeout kill was counted as a semantic kill.
YAML file Cases Process wall, seconds Peak RSS, GiB
gov/ssa/ssi/income/ssi_earned_income.yaml 14 434 2.193
gov/ssa/ssi/ssi.yaml 7 465 2.646
gov/ssa/ssi/income/ssi_earned_income_after_spousal_loss.yaml 4 366 2.371
gov/ssa/ssi/income/ssi_marital_earned_income.yaml 6 582 2.154
gov/ssa/ssi/eligibility/income/deemed/ssi_ineligible_child_allocation.yaml 5 561 2.130
gov/ssa/ssi/eligibility/income/ssi_blind_or_disabled_working_student_exclusion.yaml 11 352 2.179
gov/hhs/medicare/savings_programs/income/msp_countable_income.yaml 7 261 2.140
gov/states/nh/dhhs/ssp/nh_ssp_countable_income.yaml 5 255 2.090
gov/states/ct/dss/ssp/income/ct_ssp_countable_income.yaml 11 266 2.108
gov/states/mn/dhs/msa/mn_msa_person.yaml 18 259 2.280
partners/analytics_coverage/edge_cases/state/ks/tanf.yaml 9 466 2.365
gov/states/sd/dss/ssp/sd_ssp_independent.yaml 2 168 2.084
gov/states/wy/health/ssp/wy_ssp_eligible.yaml 2 106 2.083
gov/states/ky/dcbs/ssp/ky_ssp_countable_income.yaml 12 137 2.152
gov/states/mn/dhs/msa/income/mn_msa_gross_income.yaml 4 272 2.088
Mutant Observed Schedule C / farm / partnership earned income Result
drop-farm [60000.0, 0.0, 60000.0] versus [60000, 60000, 60000] killed
drop-partnership [60000.0, 60000.0, 0.0] versus [60000, 60000, 60000] killed
double-farm [60000.0, 120000.0, 60000.0] versus [60000, 60000, 60000] killed

The following signed-loss cases intentionally change even with farm/partnership zero. Each was run against the actual recorded base and the fixed policy; amounts are annual except MSP/NH/KY/MN monthly values.

Intentional correction Output Main Fixed
spouse_business_loss_offsets_applicant_wages msp_countable_income@2026-01 [457.5, 0.0] [249.1666717529297, 0.0]
spouse_business_loss_offsets_applicant_wages ssi@2026 [6438.0, 0.0] [8938.0, 0.0]
spouse_business_loss_offsets_applicant_wages ssi_countable_income@2026 [5490.0, 0.0] [2990.0, 0.0]
child_business_loss_cannot_reduce_unearned_income ssi_ineligible_child_allocation@2026 [0.0, 8364.0] [0.0, 5364.0]
student_exclusion_cannot_be_negative ssi_blind_or_disabled_working_student_exclusion@2026 [-3000.0] [0.0]
new_hampshire_business_loss_cannot_offset_wages nh_ssp_countable_income@2026-01 [360.5] [860.5]
kentucky_business_loss_cannot_offset_wages ky_ssp_countable_income@2026-01 [217.5] [467.5]
minnesota_gross_earnings_cannot_be_negative mn_msa_gross_income@2026-01 [-66.66667175292969] [0.0]

New Python-file measurement: 153 seconds including startup; pytest reported 45.25s; process peak 2.404 GiB. These are local macOS measurements, not whole-group or Linux CI benchmarks. The base has no corresponding property file.

All tests ran as single-file foreground processes with the numeric thread caps, load gate <=100, and 4 GB/1800s process-group cap; each mutant used 2 GB/900s. No suites, folder runs, microsimulations, or partner-file edits. make format and git diff --check passed. Evidence remains untracked.

The new Python file uses vectorized cases and a shared read-only country model for source repartition, monotonicity, and exact cross-output comparisons that YAML cannot enumerate. It follows the existing core test selection; no runner changes. The preceding historical figures describe local single-file validation. Revised-head Linux timing and memory reports are summarized above.

  • Externally sourced YAML expectations from the cited federal and state program rules.
  • SSI's positive-NESE deduction is settled and assigned to a follow-up; NH's combined floor and Kentucky's per-source floor are stated with their sources.
  • make format (ruff formatting and lint).
  • Changelog fragment.

impact: pending (hub)

axiom: TheAxiomFoundation/rulespec-us#1970 queued

The rulespec-us main tree was checked read-only and has no 20 CFR 416.1110 encoding. A dispatch-ready pe-parity issue body is drafted for the farm/partnership NESE classification, earned-loss offsets, and the NH/KY state loss rules, with corpus citations, verbatim law, required outputs and companion tests. It is posted as TheAxiomFoundation/rulespec-us#1970 (pe-parity); no RuleSpec was authored or encoder run here.

🤖 Generated with Claude Code

MaxGhenis and others added 3 commits October 29, 2026 07:33
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…gets

Net excess losses between co-resident spouses before SSI, MSP and Medicaid exclusions. Keep Connecticut and Minnesota own/deemed budgets consistent, prevent negative child/student exclusions, and isolate New Hampshire self-employment losses from wages. Add vectorized property and differential coverage.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Use Kentucky's own business-source floors and preserve Minnesota gross-income premium restoration without resurrecting losses. Add SD and WY source-presence regressions and complete direct reader coverage across 23 states, including loss-to-profit monotonicity.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis
MaxGhenis marked this pull request as ready for review October 29, 2026 14:42
MaxGhenis and others added 3 commits October 31, 2026 05:23
…ings

POMS SI 00820.210 B.2.c binds SSI, not Connecticut's or Maryland's own
programs. UPM 5020.05 A, 5020.70 C.3 and 5030.10 A count each person's
own earnings and reduce self-employment earnings only by self-employment
expenses; COMAR 07.03.07.08 sets deductions for an individual, and
Maryland DHS states that "The assistance unit is always one person."

Connecticut's three budget readers now read ct_ssp_own_earned_income,
the person's signed SSI earnings floored at zero; spouse-deemed earnings
still net an own loss through the spouse's after-loss SSI earnings.
Maryland PAA reads ssi_marital_earned_income only under the couple
computation and the applicant's own ssi_earned_income otherwise. SSI and
its spouse-deemed amounts keep the POMS treatment.

Tests: re-derive the Connecticut spouse-loss cases and pin the hub's
probe couple; add Maryland own-earnings and reverse-direction cases, a
California supplement case with farm profit, farm and partnership SGA
cases, a couple whose farm profit ends the couple computation, the
issue #10558 parent-deeming case, and a generated property that a
spouse's loss never changes the applicant's CT or MD figures.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Extend the CT/MD property so that, where SSI deems no spouse income,
the applicant's Connecticut gross earned income, earned disregard and
countable earned income stay the same when only the spouse's business
loss changes, and the gross earned income equals the applicant's own
earnings. SSI itself, which Connecticut counts as unearned income, may
still change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every Connecticut spouse in the generated property has a business loss.
Check that ct_ssp_own_earned_income stays at or above zero for all of
them, so an own residual loss cannot be deducted again from earnings
that SSI already nets through the spouse's after-loss amount.

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

This branch has not been deployed

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

Labels

None yet

Projects

None yet

1 participant