Skip to content

Commit fa2594a

Browse files
authored
Add SSI disability criteria input (#8398)
* Add SSA disability screen input * Document SSI disability transition precedence * Remove SSA disability screen alias * Carry data-backed SSI disability criteria forward
1 parent 94ee513 commit fa2594a

5 files changed

Lines changed: 73 additions & 1 deletion

File tree

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Added an SSA disability-screen variable for data-backed SSI disability modeling.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
Keep the SSI substantial gainful activity screen separate from the data-backed SSI disability criteria variable.
1+
Keep the SSI substantial gainful activity screen separate from the data-backed SSI disability criteria variable and preserve data-backed SSI disability criteria across future analysis years.
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
from policyengine_us import Simulation
2+
3+
4+
def test_data_provided_ssi_disability_criteria_carries_to_future_years():
5+
simulation = Simulation(
6+
situation={
7+
"people": {
8+
"person1": {
9+
"is_disabled": {2024: False, 2026: False},
10+
"meets_ssi_disability_criteria": {2024: True},
11+
}
12+
}
13+
}
14+
)
15+
16+
result = simulation.calculate("meets_ssi_disability_criteria", 2026)
17+
18+
assert result[0]
19+
20+
21+
def test_formula_derived_ssi_disability_criteria_allows_later_disabled_input():
22+
simulation = Simulation(
23+
situation={
24+
"people": {
25+
"person1": {
26+
"is_disabled": {2024: False, 2026: True},
27+
}
28+
}
29+
}
30+
)
31+
32+
assert not simulation.calculate("meets_ssi_disability_criteria", 2024)[0]
33+
34+
result = simulation.calculate("meets_ssi_disability_criteria", 2026)
35+
36+
assert result[0]

policyengine_us/tests/policy/baseline/gov/ssa/ssi/meets_ssi_disability_criteria.yaml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,19 @@
2121
ssi_engaged_in_sga: false
2222
output:
2323
meets_ssi_disability_criteria: false
24+
25+
- name: Data-provided SSI disability criteria can override broad disability
26+
period: 2024
27+
input:
28+
meets_ssi_disability_criteria: true
29+
is_disabled: false
30+
output:
31+
meets_ssi_disability_criteria: true
32+
33+
- name: Data-provided SSI disability criteria can exclude broad disability
34+
period: 2024
35+
input:
36+
meets_ssi_disability_criteria: false
37+
is_disabled: true
38+
output:
39+
meets_ssi_disability_criteria: false

policyengine_us/variables/gov/ssa/ssi/eligibility/status/meets_ssi_disability_criteria.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,23 @@ class meets_ssi_disability_criteria(Variable):
1313
reference = "https://www.law.cornell.edu/uscode/text/42/1382c#a_3_A"
1414

1515
def formula(person, period, parameters):
16+
holder = person.simulation.get_holder("meets_ssi_disability_criteria")
17+
prior_periods = [
18+
known_period
19+
for known_period in holder.get_known_periods()
20+
if known_period.unit == YEAR and known_period.start < period.start
21+
]
22+
if prior_periods:
23+
latest_period = max(
24+
prior_periods, key=lambda known_period: known_period.start
25+
)
26+
latest_value = holder.get_array(
27+
latest_period, person.simulation.branch_name
28+
)
29+
latest_broad_disability = person("is_disabled", latest_period)
30+
# Data-backed overrides should persist across analysis years; pure
31+
# formula caches should not shadow later is_disabled inputs.
32+
if not np.array_equal(latest_value, latest_broad_disability):
33+
return None
34+
1635
return person("is_disabled", period)

0 commit comments

Comments
 (0)