Skip to content

Add Kansas State Supplemental Payment Program (SSPP)#7731

Merged
hua7450 merged 8 commits intoPolicyEngine:mainfrom
mattunrath:ks-ssp
Apr 21, 2026
Merged

Add Kansas State Supplemental Payment Program (SSPP)#7731
hua7450 merged 8 commits intoPolicyEngine:mainfrom
mattunrath:ks-ssp

Conversation

@mattunrath
Copy link
Copy Markdown
Contributor

@mattunrath mattunrath commented Mar 8, 2026

Summary

Implements Kansas's State Supplemental Payment Program (SSPP) — a flat monthly cash payment to SSI recipients in Medicaid-approved institutions (federal Code D living arrangement).

Regulatory Authority

Program Overview

  • Administration: State-administered (KDADS/KDHE, via contractor Paychex)
  • Funding: State funds
  • Living arrangement: Medicaid facility (federal Code D) only

Eligibility (Policy Memo Section III)

Requirement Source How Modeled
Residing in a Kansas Medicaid institution Section III(1) ssi_federal_living_arrangement == MEDICAL_TREATMENT_FACILITY
SSI recipient (reduced institutional benefit) Section III(2) ssi > 0
Receiving Kansas Medicaid (full benefits) Section III(3) medicaid_enrolled
Age 18 or over Section III(4) age >= p.age_threshold (parameterized)
Kansas resident State program defined_for = StateCode.KS

Benefit Amounts

Period Individual Couple Source
2006-07-01 $20 $40 KHPA Policy Memo Section IV
2009-07-01 $32 $64 SSA 2009 report, confirmed through 2018 report
  • Flat payment — NOT modified by income or resources (Policy Memo Section IV)
  • Couple rate is per-person (each eligible person gets full amount)
  • K.S.A. 39-972(c) allows annual COLA but it is permissive ("may adjust"); $32 appears frozen since 2009

Not Modeled (by design)

What Source Why Excluded
COLA adjustments after 2009 K.S.A. 39-972(c) Amount confirmed at $32 through 2018; no evidence of change since

Files

  • parameters/gov/states/ks/kdhe/sspp/payment/amount.yaml
  • parameters/gov/states/ks/kdhe/sspp/eligibility/age_threshold.yaml
  • variables/gov/states/ks/kdhe/sspp/ks_sspp.py
  • variables/gov/states/ks/kdhe/sspp/ks_sspp_eligible.py
  • variables/household/income/spm_unit/spm_unit_benefits.py
  • tests/policy/baseline/gov/states/ks/kdhe/sspp/ks_sspp.yaml
  • tests/policy/baseline/gov/states/ks/kdhe/sspp/integration.yaml

Test plan

  • 6 unit tests + 6 integration tests pass (12 total)
  • Tests cover: eligible, ineligible (no facility, under 18, non-KS, Medicaid not paying majority, not on Medicaid), SSI income chain, couple both in facility, mixed couple
  • CI passes

🤖 Generated with Claude Code

Implements KS SSPP per K.S.A. 39-972: flat $20/month payment to SSI
recipients age 18+ residing in Medicaid-approved institutions.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@codecov
Copy link
Copy Markdown

codecov Bot commented Mar 8, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 85.36%. Comparing base (c7fb681) to head (20705b0).
⚠️ Report is 14 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #7731      +/-   ##
==========================================
- Coverage   94.17%   85.36%   -8.81%     
==========================================
  Files           7        3       -4     
  Lines         103       41      -62     
  Branches        2        2              
==========================================
- Hits           97       35      -62     
  Misses          6        6              
Flag Coverage Δ
unittests 85.36% <100.00%> (-8.81%) ⬇️

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 4 commits April 15, 2026 22:37
…mount

- Derive institutional status from ssi_federal_living_arrangement
  (FLA='D') instead of bare ks_sspp_in_medicaid_institution input
- Change definition_period to MONTH (benefit is monthly)
- Use adds=[] pattern instead of formula for flat payment
- Add ks_sspp to spm_unit_benefits.py
- Parameterize age threshold (no hardcoded 18)
- Fix parameter formatting (description template, values before metadata)
- Add PDF page numbers to all references
- Add 2009-07-01 rate update ($20 -> $32) from SSA report
- Rewrite tests with real SSI chain and proper naming
- Add integration tests including couple/mixed scenarios

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Tests used period 2025-01 but expected $20 — parameter returns $32
since 2009-07-01. Also use scalar output for single-person tests.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Policy memo Section III(3) requires "Receiving Kansas Medicaid
(full Medicaid benefits only)." Add medicaid_enrolled to eligibility
formula and add test case for non-Medicaid person.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@hua7450 hua7450 marked this pull request as ready for review April 16, 2026 03:16
@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 requested a review from PavelMakarchuk April 17, 2026 23:08
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.

Full Program Review: PR #7731 -- Kansas State Supplemental Payment Program (SSPP)

Source Documents

Source URL Accessible Notes
K.S.A. 39-972 https://ksrevisor.gov/statutes/chapters/ch39/039_009_0072.html Yes Authorizing statute; specifies personal needs fund and supplemental income minimums
KHPA Policy No. 2007-05-01 https://khap.kdhe.ks.gov/kfmam/policydocs/state%20supplemental%20payment%20program%20policy%20memo.pdf Yes (PDF) Detailed implementation memo with eligibility criteria and payment amounts
WorkWORLD Kansas SSP https://help.workworldapp.com/wwwebhelp/ssi_state_supplement_kansas.htm Yes Confirms $32/month individual payment as of 2010
SSA POMS SI 01415.001 https://secure.ssa.gov/poms.nsf/lnx/0501415001 Yes Kansas is NOT in the SSA-administered list for FLA code D (state-administered program)

Regulatory Summary

Per KHPA Policy Memo 2007-05-01, Section III, Kansas SSPP eligibility requires:

  1. Residing in a Kansas institution
  2. Receiving a reduced SSI benefit based on residence in a Medicaid facility (FLA code D)
  3. Receiving Kansas Medicaid (full Medicaid benefits only)
  4. Age 18 or over as of the month of payment

Per Section IV, each eligible individual receives a flat monthly cash benefit ($20 originally; $32 as of at least 2010). The benefit is NOT modified based on other income or resources.


Critical (Must Fix)

C1. Payment amount parameter: missing intermediate value between 2007 and 2009

The parameter amount.yaml jumps from $20 (2006-07-01) directly to $32 (2009-07-01). The policy memo (Section XI) explicitly states that benefit levels were to change in July 2007 when the protected income level went from $50 to $60. The statute (K.S.A. 39-972) also allows annual COLA adjustments starting July 1, 2007. This means the SSPP amount almost certainly changed at 2007-07-01 (likely to $30) before reaching $32. The parameter file should include the intermediate value(s).

Files: /policyengine_us/parameters/gov/states/ks/kdhe/sspp/payment/amount.yaml

C2. programs.yaml not updated

The existing entry at line 649-652 of programs.yaml has status: in_progress and is missing the variable field. Since this PR implements the program, the entry should be updated to status: complete (or partial) with variable: ks_sspp and a parameter_prefix.

File: /policyengine_us/programs.yaml


Should Address

S1. Eligibility: SSI receipt check may have edge-case issues

The eligibility formula uses person("ssi", period) > 0 to confirm SSI receipt. The ssi variable has definition_period = MONTH, which is correct for the SSPP's monthly definition period. However, ssi is the final SSI amount after all caps and adjustments. A person could have ssi == 0 due to rounding or capping even if they are technically an SSI recipient in current pay status with FLA code D. Per the policy memo Section V, eligibility is determined by SSA payment status code C01 and FLA D, not by the computed SSI amount. Other state SSP implementations (e.g., Alabama) use person("uncapped_ssi", period) > 0 to avoid this edge case. Consider whether uncapped_ssi would be more robust.

File: /policyengine_us/variables/gov/states/ks/kdhe/sspp/ks_sspp_eligible.py

S2. household_state_benefits.yaml only has 2023 and 2024 blocks

The PR adds ks_sspp to both existing year blocks in household_state_benefits.yaml, which is correct given the file structure. However, when new year blocks are added in future PRs, someone will need to remember to include ks_sspp. This is a general maintenance concern, not specific to this PR.

S3. Administering agency: KDHE vs. KHPA

The directory structure uses kdhe (Kansas Department of Health and Environment). However, the original policy memo is from KHPA (Kansas Health Policy Authority), which was later absorbed into KDHE/KDADS. This is not wrong for the current state of affairs but should be documented. The reference URL domain khap.kdhe.ks.gov shows the KDHE hosting. This is acceptable.

S4. Age parameter reference text

The reference title says "Section III(4)" but the actual memo labels it as item "4." under Section III. The parenthetical notation is a minor formatting difference, not an error.


Suggestions

G1. Add test for exact age boundary (age == 18)

The unit tests include age: 17 (ineligible) and age: 70 (eligible) but no test for the exact boundary at age: 18. Adding a test case with age: 18 would strengthen boundary coverage.

G2. Add test for the 2006-07-01 payment period

All tests use period: 2025-01. A test with period: 2007-01 and expected ks_sspp: 20 would validate that the original payment amount works correctly.

G3. Consider adding documentation field

Other state SSP variables include documentation strings explaining the program. A brief description of the SSPP would improve discoverability:

documentation = "Kansas provides a flat monthly supplement to SSI recipients in Medicaid-approved institutions."

G4. Consider whether SSI disability/blindness criteria should be explicitly checked

The SSPP relies on SSI receipt, which implicitly requires aged/blind/disabled status. The policy memo Section II notes "SSI is a means-tested program for persons age 65 and over or who meet Social Security's disability criteria." Since SSI receipt is already checked, this is handled indirectly. No action needed unless the intent is to be more explicit.

G5. Integration test Case 6 does not verify SSI for person2

In Case 6, person2 (community spouse, age 68) is not in a medical facility. The test checks ks_sspp_eligible: [true, false] and ks_sspp: [32, 0], but does not verify person2's SSI amount. Adding ssi: [30, ...] for person2 would clarify the expected SSI behavior for the community spouse.


Validation Summary

Check Result Notes
Eligibility: Kansas resident PASS defined_for = StateCode.KS on eligible variable
Eligibility: SSI receipt PASS person("ssi", period) > 0 (see S1 for edge case)
Eligibility: Medical facility PASS Checks ssi_federal_living_arrangement == MEDICAL_TREATMENT_FACILITY
Eligibility: Medicaid enrolled PASS Checks person("medicaid_enrolled", period.this_year)
Eligibility: Age >= 18 PASS age >= p.age_threshold where threshold = 18
Payment: Flat benefit PASS Uses adds pattern with parameter, not income-tested
Payment: $20 initial (2006) PASS Parameter value matches policy memo Section IV
Payment: $32 (2009+) PARTIAL Confirmed for 2010 via WorkWORLD; missing intermediate values (see C1)
Entity level: Person PASS Consistent with other state SSPs (al_ssp, de_ssp, hi_oss, etc.)
Period: MONTH PASS Matches monthly payment cadence in policy memo
spm_unit_benefits integration PASS Added to benefits list; add() handles Person-to-SPMUnit aggregation
household_state_benefits PASS Added to both 2023 and 2024 blocks
Changelog fragment PASS changelog.d/add-ks-sspp.added.md present with appropriate type
Variable naming PASS ks_sspp / ks_sspp_eligible follow state prefix convention
Parameter path PASS gov.states.ks.kdhe.sspp.* follows established pattern
Test coverage: basic eligible PASS Multiple positive cases with income variations
Test coverage: ineligible cases PASS Under-age, non-KS, not in facility, no Medicaid, income too high
Test coverage: couples PASS Both in facility + mixed arrangement tested
Test coverage: boundary PARTIAL Missing age=18 boundary test (see G1)
Existing variable reuse PASS Reuses ssi, ssi_federal_living_arrangement, medicaid_enrolled, age
Reference URLs PASS Both statute and policy memo URLs resolve
programs.yaml update FAIL Entry exists but not updated with variable/status (see C2)
Hardcoded values PASS No hardcoded logic; all values from parameters
Import pattern PASS Enum import from ssi_federal_living_arrangement follows ga_ssp_eligible_person pattern

Review Severity

COMMENT -- Two issues that should be addressed (C1: missing intermediate parameter value, C2: programs.yaml not updated) but neither blocks functionality for the 2025 test period. The core implementation is correct and well-tested. The payment amount is confirmed correct for 2010+ by WorkWORLD data, and the eligibility logic faithfully implements the four criteria from the KHPA policy memo.


Generated with Claude Code

hua7450 and others added 2 commits April 21, 2026 17:41
- Simplify amount.yaml to 2009-01-01: $32 (aligns with KEESM Rev 38
  PIL increase to $62 on 2009-01-01; drops pre-2009 values per scope).
- Update programs.yaml KS entry: status=complete, variable=ks_sspp.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@hua7450 hua7450 merged commit 6136635 into PolicyEngine:main Apr 21, 2026
23 of 24 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.

4 participants