Implement Maryland State Supplementary Payment (SSP)#8184
Open
hua7450 wants to merge 16 commits intoPolicyEngine:mainfrom
Open
Implement Maryland State Supplementary Payment (SSP)#8184hua7450 wants to merge 16 commits intoPolicyEngine:mainfrom
hua7450 wants to merge 16 commits intoPolicyEngine:mainfrom
Conversation
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #8184 +/- ##
===========================================
+ Coverage 71.72% 94.95% +23.23%
===========================================
Files 4658 8 -4650
Lines 67710 119 -67591
Branches 341 2 -339
===========================================
- Hits 48563 113 -48450
+ Misses 19140 6 -19134
+ Partials 7 0 -7
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
- Fix earned-income disregard cascade per COMAR 07.03.07.08(A): apply $20 to unearned first, leftover (up to $20) cascades into earned; earned floor is $65 + leftover (matches federal SSI pattern) - Fix REHAB_RESIDENCE provider rate: cap at $54/day per AT 23-02 page 3 ($1,642.50/month) instead of $0 - Apply cost-of-care disregard for REHAB residents per COMAR 07.03.07.08(B) - Update COMAR citations from .09 to .08 for income disregards Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Round 1 incorrectly added a $54/day provider rate cap for REHAB residents, overpaying by $1,642.50/month. Per PAA Manual §400 and §900.3, MDH pays the cost of care directly for Rehabilitative Residence cases — PAA contributes only the personal needs allowance. - Delete provider_rate_rehab_daily_cap.yaml (parameter not needed) - Revert md_paa_provider_rate.py to simple parameter lookup (REHAB=$0) - Simplify md_paa_countable_income.py: per COMAR 07.03.07.08(B), REHAB residents get a full cost-of-care disregard, so countable income is fully absorbed (PAA = PNA always) - Update REHAB tests to expect PNA-only benefit ($106 in 2026) Round 1's earned-disregard cascade fix and COMAR .09→.08 citation fix remain correct and are kept. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Eligibility: accept SSI, SSDI, or other OASI/survivor receipt with aged/blind/disabled gate on the OASI path; add $2,000 resource check; fix §300.2 → §300.1.B citation. - Countable income: include SSI cash payment in unearned per §500.8 / AT 23-02; document residual gaps (lump sums §500.7, §500.8 contributions, §500.9 exclusions, "actually available" first-month treatment). - Earned disregard: gate on living arrangement — no disregard for Assisted Living per §500.11.B.1. - Rehab Residence: replace return-zero shortcut with §900.3 cost-of-need ceiling test ($54/day × 30) so high-income residents no longer automatically receive the full PNA. - PNA: collapse and re-place placeholder at 2025-01-01 = $102 with research-based comment (DLS FY26 budget still cites $93; IM 26-04 is the first source mentioning $102). - References: fix §500.3 → §500.11 in three income disregard YAMLs; remove broken §400 URL from md_paa_living_arrangement.py. - Tests: recompute expected values for SSI inclusion; add cases for SSDI-only path, $2,000 resource limit, asymmetric married couple, high-income Rehab Residence, CARE_HOME_LEVEL_D, and Assisted Living no-disregard path. All 52 tests pass. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…into md-ssp # Conflicts: # policyengine_us/parameters/gov/household/household_state_benefits.yaml # policyengine_us/programs.yaml # policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py
… pathway - Backdate PNA to $84 effective 2022-01-01 (pre-AT 22-28); add reference. - Update Case 4 to expect $98 in 2024-01 (IM 24-05 effective 2023-07-01). - Add Case 5 asserting $84 in 2022-01. - Add md_paa_pending_federal_benefit input and wire into md_paa_eligible per PAA Manual §300.5 / COMAR 07.03.07.03 (pending SSI/SSDI/RSDI application or no-fault denial), gated by is_ssi_aged_blind_disabled. - Add tests for the §300.5 pathway. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The prior md_paa formula (state_max - countable_income) double-counted
SSI as PAA unearned income and treated provider_rate + PNA as the state
supplement, overpaying for SSI recipients. Verified against SSA 2011 MD
Table 1 (LEVEL_A 6, LEVEL_C 3, REHAB ).
Changes:
- md_paa.py rewritten as state_supp = max(combined_need - federal_ssi -
income_excess, 0). REHAB residents use medical-facility federal max
per 42 USC § 1382(e)(1)(A); override is local to md_paa to avoid
coupling federal SSI to MD-specific input.
- Federal ssi_countable_income now feeds income_excess, replacing the
duplicated PAA-specific countable variables.
- Removed md_paa_countable_{income,earned_income,unearned_income} and
the income/ and rehab_residence/ parameter folders.
- provider_rate and personal_needs_allowance: added 2011-01-01 values
derived from SSA 2011 MD Table 1 (REHAB combined → 2011 PNA ).
- Tests updated; integration covers cascade for SSI / SSDI / couple /
high-income / asymmetric-eligibility cases.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
md_paa_eligible now requires `ssi_federal_living_arrangement == MEDICAL_TREATMENT_FACILITY` whenever `md_paa_living_arrangement == REHAB_RESIDENCE`. SSA 2011 MD Table 1 confirms MDH rehab is a Title XIX medical treatment facility (federal SSI capped at /mo). This forces callers to set `ssi_lives_in_medical_treatment_facility` and `ssi_medicaid_pays_majority_of_care` for REHAB residents, which makes federal SSI compute correctly without coupling federal SSI formulas to MD-specific inputs. The local REHAB override in md_paa.py is removed since federal SSI is now correctly upstream. REHAB test cases set both flags; integration Case 4 verifies federal SSI = , state PAA = , total = . Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Locks intermediate cascade values (ssi_amount_if_eligible, ssi_countable_income) in integration Cases 5/9, adds resource limit boundary, pending blind/disabled paths, OASI-not-aged rejection, income-excess waterfall partial erosion, asymmetric married couple living arrangements, and the 2021-01 provider-rate transition. Reconciles the $102 PNA placeholder-date comment between the parameter and test files. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Cascade now uses individual FBR per SSA 2011 MD Table 1 footnote a
("state supplementation rate for individuals applies to each member of
a couple"), with the $30/mo medical-facility cap for REHAB. Previously
read ssi_amount_if_eligible, which returns couple_FBR/2 for couples
and overpaid LEVEL_A couples by ~$136/mo in 2026. Updates integration
Cases 5 and 10 to reflect the corrected per-spouse outputs.
Reference cleanup: COMAR Cornell LII URLs migrated to regs.maryland.gov
(canonical source), COMAR 07.03.07.04 title corrected from "Allowable
Needs" to "Need Requirements", IM 26-04 reference annotated with the
$102 -> $106 transition, and the broken AT 22-28 URL removed.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Replace SSA-derived 2011 provider rates with COMAR 07.03.07.04(B)(2)/(C)(2) schedule ($740/$849/$1,137/$1,340/$858); re-key 2011-01-01 → 2009-01-01. - Drop unsupported PNA $84 step at 2022-01-01; $82 forward-fills until AT 22-28 raises it to $93 on 2022-07-01. - Promote COMAR 07.03.07.04(A)(1) to primary citation for PNA $82; remove the 403-blocked SSA URL from PNA references. - Reorder md_paa.py references (COMAR first, SSA last); add COMAR §.04 cite. - Replace non-existent §300.1.B / §500.2.B inline citations with COMAR 07.03.07.03(A)(2) and PAA Manual §500. - Make REHAB / SSI medical-facility consistency check bidirectional. - Replace md_paa_personal_needs_allowance scalar passthrough formula with adds = ["gov.states.md.dhs.fia.paa.personal_needs_allowance"]. - Replace Cornell-mirror COMAR URL with regs.maryland.gov. - Add COMAR / AT references to md_paa_personal_needs_allowance, md_paa_pending_federal_benefit, md_paa_living_arrangement, and md_paa_total_cost_of_care. - Add CARE Home / Project Home legacy-term comment on enum. - Add 6 new test cases: 2011 PNA $82; REHAB without medical-facility flags ineligible; CARE Home with medical-facility flag set ineligible; aged-OASI positive PAA; symmetric LEVEL_C couple both positive; pending §300.5 applicant positive PAA. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replace stale §300.1.B / §500.2.B / SSA 2011 footnote citations in test and variable comments with COMAR 07.03.07.03(A)(2), PAA Manual §500, and COMAR 07.03.07.04 — aligns inline documentation with the parameter file references. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- programs.yaml: add `parameter_prefix: gov.states.md.dhs.fia.paa` to the Maryland PAA SSP entry (matches MI / other state SSP entries). - md_paa_eligible.py: subtract SSDI from the OASI branch's `social_security` so the OR-chain doesn't double-count SSDI recipients (SSDI is a component of OASDI). Behavior unchanged (boolean OR is idempotent), but the intent is now explicit. - md_paa_eligible.py: clarify that PAA evaluates each person against the federal SSI individual resource limit independently — the couple limit is not used. - md_paa_personal_needs_allowance.yaml: renumber test cases in chronological order (2011 → 2026) so case numbers match listing order. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Implements Maryland's State Supplementary Payment (SSP) — officially Public Assistance to Adults (PAA) — as a state-funded supplement for SSI / SSDI / qualifying OASI recipients in CARE Homes, Licensed Assisted Living, or MDH Rehabilitative Residences. Calculation uses the SSA state-supplementation cascade per COMAR 07.03.07.09(A): federal SSI absorbs countable income first, then PAA fills the gap between allowable need and federal SSI.
Closes #1137.
Regulatory Authority
Program Overview
Calculation — SSA cascade
Per COMAR 07.03.07.09(A): "the monthly PAA payment is the amount by which allowable needs exceed net countable income," with federal SSI applied first.
For each eligible person, per month:
Per PAA Manual §900.1 worked example (Assisted Living): combined_need = $894 + $93 PNA = $987 total cost of care.
md_paareturns only the state contribution. Federal SSI remains its own variable, so household total cash =ssi + md_paa.REHAB residents and the federal SSI medical-facility cap
MDH Rehabilitative Residence is a Title XIX medical-treatment-facility setting; federal SSI is capped at $30/mo per 42 USC § 1382(e)(1)(A).
md_paa_eligibleenforces a bidirectional consistency gate: a person is REHAB iff their upstreamssi_federal_living_arrangement == MEDICAL_TREATMENT_FACILITY. CARE Home / AL recipients with the medical-facility flag accidentally set are also rejected — both inconsistencies are surfaced rather than silently producing the wrong cascade. For a 2026 REHAB resident with no other income:ssi = $30+md_paa = $76=$106(full PNA).Eligibility
(ssi > 0) | (ssdi > 0) | (oasi > 0 & is_ssi_aged_blind_disabled)md_paa_pending_federal_benefitANDis_ssi_aged_blind_disabledssi_countable_resources <= ssi.individual_limitdefined_for = StateCode.MDmd_paa_living_arrangementis_rehab == is_medical_facility)Income Treatment
PAA's countable-income disregards ($20 general, $65 earned, ½ remainder) mirror federal SSI's per COMAR 07.03.07.04, so the cascade reuses
ssi_countable_incomedirectly. No PAA-specific disregard variables are needed. Note: PAA Manual §900 uses an $85 earned disregard rather than $65; this approximation produces identical countable income for pure-unearned cases and mirrors federal SSI for combined cases.Benefit Amounts
Provider rates (cost of care; paid to facility — does not include PNA):
2009 rates from COMAR 07.03.07.04(B)(2) and (C)(2). 2021 rates from AT 23-02 page 3 (still effective per AT 23-02's "no COLA increase for 2023" language). REHAB cost-of-care is $0 because PAA Manual §900.3 treats MDH Rehabilitative Residence as PNA-only (the $54/day cost is paid directly by MHA, not PAA).
Personal Needs Allowance (PNA) — universal across all living arrangements per COMAR 07.03.07.04(A)(1) and IM 26-04:
Couple treatment: per-person evaluation. The PAA cascade always uses the federal individual FBR ($994 in 2026), never
couple_FBR/2, consistent with COMAR §04's per-recipient framing.COLA: PNA adjusts on action transmittals (irregular); cost-of-care updates similarly.
Architecture
md_paa.py— cascade formula. Does not touch federal SSI variables.md_paa_eligible.py— gates eligibility on federal cash receipt + resources + facility + bidirectional REHAB ⇄ medical-facility consistency.md_paa_total_cost_of_care.py—provider_rate + personal_needs_allowanceper PAA Manual §900.1.md_paa_personal_needs_allowance.py—adds-based parameter passthrough (no formula).ssi_lives_in_medical_treatment_facility,ssi_medicaid_pays_majority_of_care,ssi_federal_living_arrangement,ssi_amount_if_eligible): untouched.Not Modeled (by design)
md_paa_living_arrangementinputKnown Modeling Gap
Files
Plus registry entries in
programs.yaml,parameters/gov/household/household_state_benefits.yaml, andvariables/household/income/spm_unit/spm_unit_benefits.py; and a changelog fragment atchangelog.d/md-ssp.added.md.Verification
Test plan
policyengine-core test policyengine_us/tests/policy/baseline/gov/states/md/dhs/fia/paa -c policyengine_us)