Skip to content

Implement Connecticut State Supplementary Payment (SSP)#7881

Merged
hua7450 merged 14 commits intoPolicyEngine:mainfrom
hua7450:ct-ssp
Apr 17, 2026
Merged

Implement Connecticut State Supplementary Payment (SSP)#7881
hua7450 merged 14 commits intoPolicyEngine:mainfrom
hua7450:ct-ssp

Conversation

@hua7450
Copy link
Copy Markdown
Collaborator

@hua7450 hua7450 commented Mar 26, 2026

Summary

Implements Connecticut's State Supplementary Payment (SSP) -- budget-based supplement for aged, blind, and disabled SSI recipients per CGS 17b-600.

Closes #7880

Regulatory Authority

Program Overview

  • Administration: State-administered by CT Department of Social Services (DSS)
  • Funding: 100% state funds
  • Statutory basis: CGS 17b-600 (effective January 1, 1974)
  • Benefit formula: Budget-based (Need Standard - Countable Income)
  • Current caseload: ~10,348 recipients (January 2011 SSA report; most recent available)

Eligibility

Requirement Source How Modeled
Must be aged (65+), blind, or disabled per SSI standards CGS 17b-600 is_ssi_eligible via ct_ssp_categorically_eligible
Only blind children eligible (disabled children excluded) SSA 2011 Report Blind child check in ct_ssp_categorically_eligible
CT resource limits ($1,600 individual / $2,400 couple) UPM 4005.10 ct_ssp_resource_eligible with CT-specific parameters (lower than federal SSI $2,000/$3,000)
Income cap: gross income <= 300% SSI FBR ($2,982/mo) CGS 17b-600 ct_ssp_income_eligible multiplies income_cap_rate (3.0) by SSI FBR
Must reside in Connecticut State program defined_for = StateCode.CT

Benefit Amounts (DSS Standards Chart 3/1/2026)

Personal Needs Allowance (PNA)

Category Monthly Amount Source
Community individual $198.55 DSS Standards Chart (frozen per legislation)
Community married (per person) $197.35 DSS Standards Chart (frozen per legislation)
Boarding home $34.75 DSS Standards Chart (eff. 7/1/2024)
SNF / Medicaid facility $75.00 UPM 4520.20; DSS Standards Chart

Shelter Allowance

Category Monthly Maximum Source
Living alone $400 UPM 4520.10; SSA 2005/2011 footnote (a)
Shared living $200 UPM 4520.10; SSA 2005/2011 footnote (a)
Facility (boarding/SNF) $0 Shelter included in facility rate

Unearned Income Disregards (adjust annually with SSA COLA)

Living Arrangement Monthly Amount Source
Community / Roomer / SNF $562.00 UPM 5030.15; DSS Standards Chart
Boarding home $469.70 UPM 5030.15; DSS Standards Chart
Shared living (non-relative) $629.90 UPM 5030.15; DSS Standards Chart

Earned Income Disregards

Category Formula Source
Aged / Disabled $65 + 1/2 of remainder UPM 5030.10
Blind $85 + 1/2 of remainder UPM 5030.10

Special Needs

Item Monthly Amount Source
Therapeutic diet $36.20 DSS Standards Chart; SSA 2005/2011 reports

Couple treatment: Per-person PNA ($197.35 married vs $198.55 individual); uses ssi_claim_is_joint to determine.
COLA: PNA amounts frozen per state legislation; unearned disregards adjust annually with SSA COLA.

Benefit Calculation

Budget formula: Benefit = max(0, Total Need - Countable Income)

For Community Living (alone or shared):

  1. Shelter Allowance = min(actual shelter cost, max allowance for arrangement)
  2. PNA = $198.55 individual / $197.35 married
  3. Special Needs = therapeutic diet ($36.20 if applicable)
  4. Total Need = Shelter Allowance + PNA + Special Needs
  5. Unearned Disregard = arrangement-specific amount ($562 / $629.90)
  6. Earned Disregard = $65 + 1/2 remainder (aged/disabled) or $85 + 1/2 remainder (blind)
  7. Countable Income = max(0, unearned incl. SSI - unearned disregard) + max(0, earned - earned disregard)
  8. Benefit = max(0, Total Need - Countable Income)

For Boarding Home:

  • PNA = $34.75; Unearned Disregard = $469.70; no shelter allowance (included in facility rate)

For SNF:

  • PNA = $75.00 (vs Medicaid's $60; AABD adds $15); Unearned Disregard = $562.00

Key rule: SSI payments count as unearned income subject to the disregard. This is the core mechanism that creates the state supplement on top of SSI.

Living Arrangements

4 categories modeled via CtSspLivingArrangement enum:

  • COMMUNITY_ALONE -- own home/apartment, full housing cost
  • COMMUNITY_SHARED -- living with others, not in facility
  • BOARDING_HOME -- licensed boarding home / residential care home
  • SNF -- skilled nursing facility / Medicaid facility

Not Modeled (by design)

What Source Why Excluded
24-month transfer penalty CGS 17b-600; UPM 3025 Requires tracking asset transfers over time
Life care contract exception CGS 17b-602 Extremely rare edge case
Mental institution exclusion UPM 3015.05 Institutional status requires case-level data
No retroactive benefits UPM 1560.05 Application timing not modeled
New Horizons facility CGS 19a-507 Single specific facility
PASS deductions SSA 2011 Report Separate SSA program, requires individual plan data
IRWE deductions SSA 2011 Report Requires individual expense data
Emergency housing special need SSA 2011 Report Nonrecurring, max 60 days/year
Meals on Wheels / restaurant meals SSA 2011 Report Nonrecurring allowance
Nonrecurring special needs (moving, clothing) SSA 2011 Report One-time expenses
Spousal asset deeming UPM 4025.55 Complex deeming rules; uses SSI resource test as proxy
Liens and estate recovery UPM 7510.10 Post-death administrative process
LLR contribution (12%) UPM 7520.05 Relative income data not available
Rental diversion ($650/$400) DSS Standards Chart Payment routing mechanism, not benefit calculation
Blind work expenses (itemized) SSA 2011 Report Simplified; $85+1/2 disregard provides enhanced blind treatment
Income exclusions (Holocaust reparations, irregular gifts) UPM 5015.10.F Uncommon income types; SSI income sources already exclude most

Files

parameters/gov/states/ct/dss/ssp/          (11 files)
  eligibility/
    income_cap_rate.yaml              # 300% SSI FBR
    asset_limit/
      individual.yaml                 # $1,600
      couple.yaml                     # $2,400
  personal_needs_allowance.yaml       # By living arrangement (enum breakdown)
  personal_needs_allowance_married.yaml  # Community married override
  shelter_allowance.yaml              # By living arrangement (enum breakdown)
  disregard/
    unearned.yaml                     # By living arrangement (enum breakdown)
    earned/
      aged_disabled_initial.yaml      # $65
      blind_initial.yaml              # $85
      rate.yaml                       # 0.5 (half of remainder)
  special_needs/
    therapeutic_diet.yaml             # $36.20

variables/gov/states/ct/dss/ssp/          (16 files)
  ct_ssp.py                          # SPMUnit: sums person-level benefits
  ct_ssp_person.py                   # Person: max(0, need - countable_income)
  ct_ssp_living_arrangement.py       # Enum input variable
  ct_ssp_has_therapeutic_diet.py     # Bool input variable
  eligibility/
    ct_ssp_eligible_person.py        # Categorical + financial + income cap
    ct_ssp_categorically_eligible.py # SSI-eligible + blind child logic
    ct_ssp_income_eligible.py        # Gross income <= 300% SSI FBR
    ct_ssp_resource_eligible.py      # CT-specific asset limits
  income/
    ct_ssp_gross_income.py           # Earned + unearned (for income cap)
    ct_ssp_countable_income.py       # After disregards
    ct_ssp_unearned_income_disregard.py  # By living arrangement
    ct_ssp_earned_income_disregard.py    # $65+1/2 or $85+1/2
  payment/
    ct_ssp_need_standard.py          # Shelter + PNA + special needs
    ct_ssp_shelter_allowance.py      # $400/$200/$0 by arrangement
    ct_ssp_personal_needs_allowance.py   # By arrangement + marital status
    ct_ssp_special_needs.py          # Therapeutic diet

tests/policy/baseline/gov/states/ct/dss/ssp/  (12 files, 91 tests)
  ct_ssp_person.yaml                 # 6 person-level benefit tests
  integration.yaml                   # 13 end-to-end integration tests
  eligibility/
    ct_ssp_eligible_person.yaml      # 8 eligibility tests
    ct_ssp_income_eligible.yaml      # 6 income cap tests
    ct_ssp_resource_eligible.yaml    # 9 resource limit tests
  income/
    ct_ssp_countable_income.yaml     # 8 income calculation tests
    ct_ssp_earned_income_disregard.yaml  # 12 earned disregard tests
    ct_ssp_unearned_income_disregard.yaml # 4 unearned disregard tests
  payment/
    ct_ssp_need_standard.yaml        # 7 need standard tests
    ct_ssp_personal_needs_allowance.yaml # 7 PNA tests
    ct_ssp_shelter_allowance.yaml    # 9 shelter allowance tests
    ct_ssp_special_needs.yaml        # 2 special needs tests

Verification TODO

  • Verify payment amounts against DSS Program Standards Chart (3/1/2026)
  • Verify eligibility logic against CGS 17b-600 and UPM sections 3030, 4005
  • Verify amounts current as of 2022-2026
  • CI passes

Test plan

  • 91 tests pass (12 test files: eligibility, income, payment, person, integration)
  • CI passes

Known Issues / Follow-up Work

  • Historical parameter backdating (pre-2022 values) deferred to follow-up PR -- SSA 2005/2011 anchor data preserved in working_references.md
  • Boarding home benefit is simplified (PNA + disregard structure only; facility rate is individually determined per UPM 4520.10.C)

Generated with Claude Code

hua7450 and others added 2 commits March 25, 2026 22:41
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Implements Connecticut's State Supplement to the Aged, Blind or Disabled
(AABD) program per CGS 17b-600, administered by CT DSS.

Budget-based formula: Benefit = max(0, Total Need - Countable Income)
- 4 living arrangements (community alone/shared, boarding home, SNF)
- Income disregards vary by living arrangement and disability category
- CT-specific asset limits ($1,600/$2,400, lower than federal SSI)
- Historical parameter coverage from 2005-2026

Closes PolicyEngine#7880

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@codecov
Copy link
Copy Markdown

codecov Bot commented Mar 26, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 98.83%. Comparing base (61ae9f9) to head (12a5e69).
⚠️ Report is 270 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #7881      +/-   ##
==========================================
+ Coverage   91.75%   98.83%   +7.07%     
==========================================
  Files          42       19      -23     
  Lines         837      257     -580     
  Branches       22        2      -20     
==========================================
- Hits          768      254     -514     
+ Misses         67        1      -66     
  Partials        2        2              
Flag Coverage Δ
unittests 98.83% <100.00%> (+7.07%) ⬆️

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 3 commits March 26, 2026 00:12
…ve #page=1 from single-page PDFs

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Consolidate 17 parameter files → 11 using enum breakdowns by living arrangement
- Replace boolean breakdowns (caused warnings) with separate files + where() in variables
- Fix invalid portal.ct.gov/dss/common-elements URL in 4 variable files

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@hua7450 hua7450 marked this pull request as ready for review March 26, 2026 21:32
@MaxGhenis
Copy link
Copy Markdown
Contributor

Follow-up fixes pushed on this branch:\n\n- swapped the Connecticut community individual vs. married personal-needs allowance values to match the DSS standards chart\n- updated CT SSP gross/countable income and asset handling so deemed income/resources from an ineligible spouse flow into the mixed-status married-case tests\n- extended the CT earned-income disregard to treat deemed spouse earnings consistently\n- wired into the shared household/SPM benefit aggregates and refreshed the affected CT SSP regression baselines\n\nLocal verification: , , , , , and targeted All checks passed! all passed.

@MaxGhenis
Copy link
Copy Markdown
Contributor

Follow-up fixes pushed on this branch:

  • swapped the Connecticut community individual vs. married personal-needs allowance values to match the DSS standards chart
  • updated CT SSP gross/countable income and asset handling so deemed income/resources from an ineligible spouse flow into the mixed-status married-case tests
  • extended the CT earned-income disregard to treat deemed spouse earnings consistently
  • wired ct_ssp into the shared household/SPM benefit aggregates and refreshed the affected CT SSP regression baselines

Local verification: policyengine_us/tests/policy/baseline/gov/states/ct/dss/ssp/payment/ct_ssp_personal_needs_allowance.yaml, policyengine_us/tests/policy/baseline/gov/states/ct/dss/ssp/payment/ct_ssp_need_standard.yaml, policyengine_us/tests/policy/baseline/gov/states/ct/dss/ssp/income/ct_ssp_countable_income.yaml, policyengine_us/tests/policy/baseline/gov/states/ct/dss/ssp/eligibility/ct_ssp_resource_eligible.yaml, policyengine_us/tests/policy/baseline/gov/states/ct/dss/ssp/integration.yaml, and targeted ruff check all passed.

MaxGhenis and others added 6 commits March 28, 2026 10:24
- Rename SNF enum to MEDICAID_FACILITY (matches SSA 2011 "federal Code D")
- Convert ct_ssp_living_arrangement from bare input to formula deriving
  MEDICAID_FACILITY from ssi_federal_living_arrangement, with state
  booleans ct_ssp_resides_in_boarding_home and ct_ssp_lives_with_others
- Add SSA 2011 footnote comment to eligibility (no uncapped_ssi check)
- Backdate PNA to 2011: community $164, Medicaid facility $39
- Fix pre-existing test bugs using married PNA for single-person cases
- Update all tests to use upstream federal/state inputs

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…izons

- Boarding home shelter uses committee-set per diem rate (varies by
  facility), not the $0 in the parameter table — needs facility-rate
  input to model correctly
- New Horizons Village is a specific CT facility with its own PNA
  ($156.82) and DSS-set rate, not modeled due to small population

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Remove hardcoded ssi input from 9 of 13 cases, let federal SSI
  system compute the amount from person's actual income/arrangement
- Cases 2, 3, 9: SSI now correctly reduced by earnings, changing
  eligibility outcomes to match real-life federal-state interaction
- Add ssi and ssi_federal_living_arrangement as output checks
- Add Case 14: verify CT SSP flows through to spm_unit_benefits
- Keep ssi as input only for edge cases (7: negative income,
  8: intentional $0, 10: boundary test)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Copy link
Copy Markdown
Collaborator

@PavelMakarchuk PavelMakarchuk left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Program Review: PR #7881 — Implement Connecticut State Supplementary Payment (SSP)

Source Documents

  • Statute: CGS 17b-600
  • DSS: Program Standards Charts (2022, 2025, 2026)
  • UPM: Sections 3030, 4005, 4520, 5030, P-5045
  • SSA: State Assistance Programs 2005, 2011
  • CI: All passing

Critical (Must Fix)

None. All formulas are regulatorily correct. Five integration scenarios were manually recalculated and verified. The PNA individual/married values ($197.35/$198.55) were flagged by the reference validator as potentially reversed relative to the task brief, but the regulatory reviewer confirmed the code values are correct (individual = $197.35, married = $198.55).

Should Address

  1. Trailing zeros in parameter values. disregard/unearned.yaml contains values like 250.90, 345.90, 469.70, 629.90 and special_needs/therapeutic_diet.yaml contains 36.20. Per formatting conventions, these should be 250.9, 345.9, 469.7, 629.9, and 36.2 respectively.

    • Files: parameters/gov/states/ct/dss/ssp/disregard/unearned.yaml, parameters/gov/states/ct/dss/ssp/special_needs/therapeutic_diet.yaml
  2. PDF references missing #page=XX anchors. Seven DSS Program Standards Chart PDF references across six parameter files lack page anchors. Reviewers clicking these links land on page 1 and must search manually.

    • Files: disregard/earned/rate.yaml, disregard/unearned.yaml, personal_needs_allowance.yaml, personal_needs_allowance_married.yaml, shelter_allowance.yaml, special_needs/therapeutic_diet.yaml
  3. UPM links do not navigate to cited sections. The ctdssmap.com/CTPortal/Information/Get/UPM#XXXX.XX hash fragments are non-functional -- the portal loads its homepage, not the specific policy section. Eight parameter files are affected.

  4. SSA source pages return HTTP 403. Both ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/ct.html and the 2005 equivalent return 403 Forbidden. All 10 parameter files cite SSA 2011; 5 also cite SSA 2005. These may work in a regular browser but fail for automated verification. Consider adding web.archive.org fallback links.

  5. Missing dedicated test for ct_ssp_living_arrangement priority ordering. The variable uses select() with priority: medical facility > boarding home > shared > alone. No test verifies what happens when multiple flags are true (e.g., both ct_ssp_resides_in_boarding_home and ct_ssp_lives_with_others are true).

  6. Missing integration test for mixed-eligibility couple. No integration test shows a couple where one spouse is eligible (receives SSP) and the other is ineligible (receives $0). Resource test Case 10 covers the resource piece, but no end-to-end test demonstrates the full flow.

Suggestions

  1. Description verb "disregards" not in standard verb list. Four earned disregard parameter files use "disregards" in their description. Consider changing to "excludes" for consistency with the standard verb list. Files: disregard/earned/aged_disabled_initial.yaml, blind_initial.yaml, rate.yaml, disregard/unearned.yaml.

  2. Single-use intermediate variable. In ct_ssp_earned_income_disregard.py, rate = p.rate is used only once on the next line. Could be inlined to remainder * p.rate.

  3. Comment errors in income eligibility tests. ct_ssp_income_eligible.yaml Cases 1 and 6 say "Need = $400 + $198.55 = $598.55" but the person is unmarried, so PNA should be $197.35 and Need = $597.35. Does not affect test correctness (outputs are booleans).

  4. Missing #page=XX in January 2026 DSS Chart reference for PNA. personal_needs_allowance.yaml does not reference the January 2026 DSS chart, unlike other parameters. Either the PNA did not change (add the reference anyway for consistency) or it did (update the parameter).

  5. Archive.org Excel reference. The July 2022 DSS Standards Chart reference links to an .xlsx file via archive.org. Consider noting the file format in the reference title.

  6. Therapeutic diet and shelter unchanged since 2005. The therapeutic diet ($36.20) and shelter allowance ($400/$200) have not changed in 21 years. While plausible (states sometimes freeze these), verify against current DSS Standards Chart.

  7. Consider adding dedicated test files for ct_ssp_categorically_eligible (child exclusion at age 17/18 boundary) and ct_ssp_gross_income (multiple income sources summing to boundary). Both are currently only tested indirectly.

  8. income_cap_rate.yaml description uses "this multiple" instead of the standard "this share" or "this amount." Minor wording alignment.

Validation Summary

Check Result
Formulas match regulation (CGS 17b-600, UPM, DSS Charts) PASS -- all 15 formulas verified
Manual recalculation of integration scenarios PASS -- 5 of 14 cases hand-verified
Parameter values cross-checked against sources PASS -- all 17 parameters correct (values verified where accessible, internally consistent elsewhere)
No hardcoded values in formulas PASS
Period handling (MONTH vs YEAR) PASS
Vectorization (where/select/max_/min_) PASS
Entity levels (Person vs SPMUnit vs MaritalUnit) PASS
Aggregation patterns (adds/add) PASS
Variable naming (ct_ssp_ prefix) PASS
Changelog fragment present PASS (ct-ssp.added.md)
Benefits rollup wiring PASS (spm_unit_benefits.py, household_state_benefits.yaml)
Federal/state separation (reuses SSI variables, no duplication) PASS
Test coverage (94 cases, 12 files) PASS -- excellent boundary testing, all 4 living arrangements covered
Unearned disregard internal consistency (constant differentials across time) PASS -- $67.90 shared-alone, $92.30 alone-boarding, all periods
Blind child eligible / disabled child excluded PASS -- tested in Cases 2, 3, 8 of eligible_person
Reference completeness (all parameters have 2+ references) PASS
Reference accessibility PARTIAL -- SSA 403s, UPM non-functional, PDFs missing page anchors
Trailing zero formatting FAIL -- 11 values need trailing zeros removed

Review Severity: COMMENT

All issues are reference quality, formatting, or test coverage enhancements. No logic errors, no incorrect parameter values, no blocking defects. The implementation is regulatorily correct and well-structured with 94 test cases providing excellent coverage.

Generated with Claude Code

@MaxGhenis
Copy link
Copy Markdown
Contributor

Closing — conflicts for 2+ weeks. Reopen after rebasing from upstream/main.

@MaxGhenis MaxGhenis closed this Apr 17, 2026
@hua7450 hua7450 reopened this Apr 17, 2026
@hua7450 hua7450 merged commit e2af9bf into PolicyEngine:main Apr 17, 2026
15 checks passed
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.

Implement Connecticut State Supplementary Payment (SSP)

3 participants