Skip to content

Implement Maryland State Supplementary Payment (SSP)#8184

Open
hua7450 wants to merge 16 commits intoPolicyEngine:mainfrom
hua7450:md-ssp
Open

Implement Maryland State Supplementary Payment (SSP)#8184
hua7450 wants to merge 16 commits intoPolicyEngine:mainfrom
hua7450:md-ssp

Conversation

@hua7450
Copy link
Copy Markdown
Collaborator

@hua7450 hua7450 commented Apr 28, 2026

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

  • Administration: State-administered (Maryland DHS-FIA via local DSS).
  • Funding: 100% state funds; pays the gap between combined federal+state need and federal SSI.
  • Caseload: ~2,020 recipients/month (FY2026 DLS Budget Analysis).
  • Effective date: July 1, 1974.
  • See: COMAR 07.03.07 chapter index.

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:

combined_need   = provider_rate + personal_needs_allowance   # PAA Manual §900.1
federal_ssi_max = ssi_amount_if_eligible                      # individual FBR ($994 in 2026)
state_supp_max  = max(combined_need - federal_ssi_max, 0)
income_excess   = max(ssi_countable_income - federal_ssi_max, 0)
md_paa          = max(state_supp_max - income_excess, 0)

Per PAA Manual §900.1 worked example (Assisted Living): combined_need = $894 + $93 PNA = $987 total cost of care.

md_paa returns 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_eligible enforces a bidirectional consistency gate: a person is REHAB iff their upstream ssi_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

Requirement Source How Modeled
Receives SSI, SSDI, or qualifying OASI on the basis of A/B/D COMAR 07.03.07.03(A)(2) (ssi > 0) | (ssdi > 0) | (oasi > 0 & is_ssi_aged_blind_disabled)
§300.5 / §03(G)(1) pending-application pathway PAA Manual §300.5; COMAR 07.03.07.03 Boolean input md_paa_pending_federal_benefit AND is_ssi_aged_blind_disabled
Resources ≤ $2,000 PAA Manual §500 ssi_countable_resources <= ssi.individual_limit
Maryland resident COMAR 07.03.07.03B defined_for = StateCode.MD
Resides in PAA facility PAA Manual §300, §400 New input enum md_paa_living_arrangement
REHAB ⇒ SSI medical-facility flagged upstream 42 USC § 1382(e)(1)(A) Bidirectional check (is_rehab == is_medical_facility)
Single-person assistance unit COMAR 07.03.07; per-spouse evaluation Per-person cascade

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_income directly. 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):

Tier 2009-01-01 (COMAR §04) 2021-01-01 (AT 23-02)
CARE Home Level A $740 $776
CARE Home Level B $849 $875
CARE Home Level C $1,137 $1,173
CARE Home Level D $1,340 $1,376
Licensed Assisted Living $858 $894
MDH Rehabilitative Residence $0 $0

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:

Effective Date Amount Source
2009-01-01 $82 COMAR 07.03.07.04(A)(1)
2022-07-01 $93 AT 22-28 (transmittal not located; value confirmed by AT 23-02 p.3)
2023-07-01 $98 IM 24-05 (transmittal not located; value implied by IM 26-04 referencing $98 as the prior PNA before the $102 step)
2024-07-01 $102 Originating transmittal not located; value confirmed by IM 26-04 p.2 ("$102 → $106")
2025-07-01 $106 IM 26-04 page 2

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.

⚠️ Couple FBR caveat: PolicyEngine's federal SSI for a married couple where both are eligible uses couple_FBR/2 = $745.50 per spouse, while the PAA cascade uses the individual FBR ($994). For a CARE_HOME_LEVEL_A couple this means PolicyEngine reports each spouse with $745.50 federal SSI + $0 state PAA = $745.50 total, rather than $994 + something — Maryland does not top up to fill the federal couple-FBR reduction. Integration test Cases 5 (symmetric LEVEL_A) and 10 (asymmetric LEVEL_A vs C) lock this divergence in. Review carefully if you compare this household type against external sources.

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.pyprovider_rate + personal_needs_allowance per PAA Manual §900.1.
  • md_paa_personal_needs_allowance.pyadds-based parameter passthrough (no formula).
  • Federal SSI variables (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)

What Source Why Excluded
§300.3.A private mental institution carve-out PAA Manual §300.3.A Not tracked at the moment; relies on md_paa_living_arrangement input
30-day absence disqualification COMAR 07.03.07.03B Sub-monthly residency not tracked
Pre-1973 grandfathered Mandatory Minimum State Supplement PAA Manual §100.1 SSA-administered; tiny population
SALSP n/a Separate program (Maryland Dept of Aging)
Lump sums, parent contributions, irregular-income exclusions PAA Manual §500.7-9 Approximated via federal SSI income aggregation
Form 4350 disability-certification verification PAA Manual §300.1.C Not modelable from CPS
REHAB $54/day cap on allowable need PAA Manual §900.3 / AT 23-02 Not enforced as a separate ceiling; most cases fall within it
Per-diem prorating for fractional-month entry COMAR 07.03.07.04(B)(3) / (C)(3) Edge case

Known Modeling Gap

  • AT 22-28 / IM 24-05 / 2024-07-01 transmittal not located: PNA values for 2022-07-01, 2023-07-01, and 2024-07-01 are corroborated only by adjacent transmittals (AT 23-02 confirms $93 was current; IM 26-04 confirms the $102 → $106 step). Effective dates may shift slightly when the originating transmittals are obtained.

Files

policyengine_us/parameters/gov/states/md/dhs/fia/paa/
├── personal_needs_allowance.yaml
└── provider_rate.yaml

policyengine_us/variables/gov/states/md/dhs/fia/paa/
├── md_paa.py
├── md_paa_eligible.py
├── md_paa_living_arrangement.py
├── md_paa_pending_federal_benefit.py
├── md_paa_personal_needs_allowance.py
├── md_paa_provider_rate.py
└── md_paa_total_cost_of_care.py

policyengine_us/tests/policy/baseline/gov/states/md/dhs/fia/paa/
├── integration.yaml
├── md_paa.yaml
├── md_paa_eligible.yaml
├── md_paa_personal_needs_allowance.yaml
└── md_paa_provider_rate.yaml

Plus registry entries in programs.yaml, parameters/gov/household/household_state_benefits.yaml, and variables/household/income/spm_unit/spm_unit_benefits.py; and a changelog fragment at changelog.d/md-ssp.added.md.

Verification

Test plan

  • 57 PAA tests pass (policyengine-core test policyengine_us/tests/policy/baseline/gov/states/md/dhs/fia/paa -c policyengine_us)
  • CI passes

hua7450 and others added 2 commits April 28, 2026 17:08
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 28, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 94.95%. Comparing base (cc5bd64) to head (b397c27).
⚠️ Report is 105 commits behind head on main.

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     
Flag Coverage Δ
unittests 94.95% <100.00%> (+23.23%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

hua7450 and others added 12 commits April 28, 2026 20:19
- 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>
@hua7450 hua7450 marked this pull request as ready for review May 4, 2026 04:09
hua7450 and others added 2 commits May 4, 2026 00:15
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>
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.

Maryland SSI State Supplement

1 participant