Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/ssi-railroad-retirement-income.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Count railroad retirement annuities as unearned income for Supplemental Security Income and the Colorado Old Age Pension.
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@ values:
# (a) Annuities, pensions, and other periodic payments.
- pension_income
- social_security
# NOTE: Household net income, SNAP, HUD annual income and other program
# income lists count social_security and ssi but not railroad_benefits, so
# an SSI recipient's railroad annuity drops out of them.
# https://github.com/PolicyEngine/policyengine-us/issues/10551
- railroad_benefits
- disability_benefits
- veterans_benefits
- survivor_benefits
Expand All @@ -30,3 +35,7 @@ metadata:
reference:
- title: United States Code of Federal Regulations, Title 20, Subsection 416.1121
href: https://www.law.cornell.edu/cfr/text/20/416.1121
- title: 42 U.S.C. 1382a(a)(2)(B)
href: https://www.law.cornell.edu/uscode/text/42/1382a#a_2_B
- title: SSA POMS SI 00830.225 Railroad Retirement Payments
href: https://secure.ssa.gov/poms.nsf/lnx/0500830225
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@ values:
- social_security_disability
- disability_benefits
- workers_compensation
# NOTE: railroad_benefits is not listed. The exemption covers Railroad
# Retirement disability annuities until they convert to age annuities at
# full retirement age, but the input does not separate disability annuities
# from age, spouse or survivor annuities, so every railroad payment counts.
# https://github.com/PolicyEngine/policyengine-us/issues/10540

metadata:
unit: list
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ values:
2020-03-01:
- pension_income
- social_security
- railroad_benefits
- disability_benefits
- veterans_benefits
- survivor_benefits
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,11 @@
retirement_distributions: 1_000
output:
ssi_unearned_income: 1_000

- name: SSI unearned income counts railroad retirement annuities.
period: 2026
input:
railroad_benefits: 10_800
output:
# 42 U.S.C. 1382a(a)(2)(B) lists "railroad retirement annuities and pensions".
ssi_unearned_income: 10_800
33 changes: 32 additions & 1 deletion policyengine_us/tests/policy/baseline/gov/ssa/ssi/ssi.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# Unit tests for SSI variable (final benefit calculation)
# These tests only use the direct inputs to the ssi variable
# The first tests only use the direct inputs to the ssi variable; the railroad
# retirement cases at the end run the full income calculation.

# Note: The 'abolish_ssi' parameter test would need a reform, which is not
# supported in the current test framework for YAML tests. This would need to be
Expand All @@ -25,3 +26,33 @@
uncapped_ssi: -100
output:
ssi: 0

- name: A railroad retirement annuity reduces an aged divorced spouse's SSI.
period: 2026
absolute_error_margin: 0.01
input:
age: 70
# 900 a month, near the RRB's September 2025 average divorced spouse
# annuity of 893.35 (Quarterly Benefit Statistics, Table 1).
railroad_benefits: 10_800
output:
# (900 - 20 general exclusion) x 12 = 10,560.
ssi_countable_income: 10_560
# 2026 federal benefit rate of 994 x 12 = 11,928; 11,928 - 10,560 = 1,368.
uncapped_ssi: 1_368
ssi: 1_368

- name: The average railroad retirement employee annuity leaves an aged retiree no SSI.
period: 2026
absolute_error_margin: 0.01
input:
age: 70
# RRB News Release 25-8: the average regular employee annuity is 3,636 a
# month in January 2026; 3,636 x 12 = 43,632.
railroad_benefits: 43_632
output:
# (3,636 - 20 general exclusion) x 12 = 43,392.
ssi_countable_income: 43_392
# 11,928 - 43,392 = -31,464.
uncapped_ssi: -31_464
ssi: 0
Original file line number Diff line number Diff line change
Expand Up @@ -552,3 +552,23 @@
output:
co_oap_own_countable_income: 8_760.12
co_oap: 3_612

- name: Case 36, a Railroad Retirement annuity counts as unearned income.
# 3.520.785(B)(5) counts Railroad Retirement Board payments. 900/month, near
# the RRB's September 2025 average divorced spouse annuity of 893.35, less the
# $20 disregard is 880; SSI pays 994 - 880 = 114; 1,032 - 114 - 880 = 38,
# raised to 189.
period: 2026
input:
people:
person:
age: 70
railroad_benefits: 10_800
households:
household:
members: [person]
state_code: CO
output:
ssi: 1_368
co_oap_countable_income: 10_560
co_oap: 2_268
Original file line number Diff line number Diff line change
Expand Up @@ -790,7 +790,7 @@
# Manual p17 deducts Medicare premiums withheld from Social Security. Social
# Security of 12,000 is 1,000 a month, or 980 after the $20 exclusion, within the
# Medicare Savings Program limit (135% of the 2027 one-person guideline, about
# 1,838 a month), so MSP pays the premium and nothing is withheld or deducted.
# 1,848 a month), so MSP pays the premium and nothing is withheld or deducted.
- name: "Case 27, no Part B deduction applies when the Medicare Savings Program pays the premium."
period: 2027
absolute_error_margin: 0.01
Expand All @@ -816,7 +816,8 @@
nh_fap_countable_income: 12_000

# Manual pp15,17 deduct the Medicare premium withheld from railroad retirement.
# railroad_benefits is not an SSI unearned source in the model, so MSP status
# Railroad retirement counts as SSI unearned income for MSP, and 1,500 - 20 =
# 1,480 a month is within the MSP limit (about 1,848 a month), so MSP status
# turns on assets: 20,000 exceeds the 9,950 MSP resource limit and the enrollee
# pays the 2027 premium of 202.90 * 12 = 2,434.80. 18,000 - 2,434.80 = 15,565.20.
- name: "Case 28, the Part B premium withheld from railroad retirement is deducted."
Expand Down Expand Up @@ -845,7 +846,7 @@
nh_fap_countable_income: 15_565.2

# Manual pp14-17 allow support paid and the withheld Medicare premium separately.
# Social Security of 2,000 a month is above the MSP limit (about 1,838 a month),
# Social Security of 2,000 a month is above the MSP limit (about 1,848 a month),
# so the premium is 2,434.80: 24,000 - 2,000 - 2,434.80 = 19,565.20.
- name: "Case 29, support paid and the Part B premium are both deducted."
period: 2027
Expand Down Expand Up @@ -900,7 +901,7 @@

# Manual p17 and plan item 1.9 count Social Security net of the Medicare deduction.
# An enrollee aged 70 needs no reported amount: 1,980 a month after the $20
# exclusion is above the MSP limit (about 1,838), so the premium is
# exclusion is above the MSP limit (about 1,848), so the premium is
# 202.90 * 12 = 2,434.80 and 24,000 - 2,434.80 = 21,565.20.
- name: "Case 31, a Medicare enrollee's Part B premium is deducted from Social Security."
period: 2027
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
class ssi_unearned_income(Variable):
value_type = float
entity = Person
label = "SSI earned income"
label = "SSI unearned income"
unit = USD
definition_period = YEAR

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,14 @@
class railroad_benefits(Variable):
value_type = float
entity = Person
label = "Recieves any railroad benefits"
label = "Railroad Retirement Board benefits"
unit = USD
definition_period = YEAR
documentation = (
"Gross annual benefits paid by the Railroad Retirement Board, such as "
"retirement, disability, spouse and survivor annuities, before Medicare "
"premiums or other amounts are withheld. Railroad Unemployment Insurance "
"Act benefits are reported elsewhere: unemployment benefits in "
"unemployment_compensation and sickness benefits in disability_benefits."
)
default_value = 0
Loading