Skip to content

Commit ea20939

Browse files
MaxGhenisclaude
andcommitted
Break CO CCAP → snap_fpg circular dependency via spm_unit_fpg
CO CCAP used snap_fpg for its FPG calculation, creating a cycle: tanf → childcare_expenses → co_ccap_subsidy → co_ccap_fpg_eligible → snap_fpg → snap_unit_size → is_snap_ineligible_student → tanf_person → tanf Replaced with spm_unit_fpg (existing HHS FPG variable using spm_unit_size) divided by 12 for monthly values. No new variable needed — reuses the existing annual FPG with time-based indexing. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 19296cd commit ea20939

6 files changed

Lines changed: 21 additions & 24 deletions

File tree

policyengine_us/tests/policy/baseline/gov/states/co/ccap/co_ccap_add_on_parent_fee.yaml

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
input:
44
co_ccap_eligible_children: 1
55
co_ccap_countable_income: 60_000
6-
snap_fpg: 120_000
6+
spm_unit_fpg: 120_000
77
output:
88
co_ccap_add_on_parent_fee:
99
2023-01: 0
@@ -13,7 +13,7 @@
1313
input:
1414
co_ccap_eligible_children: 1
1515
co_ccap_countable_income: 80_000
16-
snap_fpg: 40_000
16+
spm_unit_fpg: 40_000
1717
output:
1818
co_ccap_add_on_parent_fee:
1919
2023-01: 0
@@ -23,7 +23,7 @@
2323
input:
2424
co_ccap_eligible_children: 2
2525
co_ccap_countable_income: 60_000
26-
snap_fpg: 120_000
26+
spm_unit_fpg: 120_000
2727
output:
2828
co_ccap_add_on_parent_fee:
2929
2023-01: 0
@@ -33,7 +33,7 @@
3333
input:
3434
co_ccap_eligible_children: 2
3535
co_ccap_countable_income: 80_000
36-
snap_fpg: 40_000
36+
spm_unit_fpg: 40_000
3737
output:
3838
co_ccap_add_on_parent_fee:
3939
2023-01: 15
@@ -43,7 +43,7 @@
4343
input:
4444
co_ccap_eligible_children: 1
4545
co_ccap_countable_income: 60_000
46-
snap_fpg: 120_000
46+
spm_unit_fpg: 120_000
4747
output:
4848
co_ccap_add_on_parent_fee:
4949
2022-12: 0
@@ -53,7 +53,7 @@
5353
input:
5454
co_ccap_eligible_children: 1
5555
co_ccap_countable_income: 80_000
56-
snap_fpg: 40_000
56+
spm_unit_fpg: 40_000
5757
output:
5858
co_ccap_add_on_parent_fee:
5959
2022-12: 0
@@ -63,7 +63,7 @@
6363
input:
6464
co_ccap_eligible_children: 2
6565
co_ccap_countable_income: 60_000
66-
snap_fpg: 120_000
66+
spm_unit_fpg: 120_000
6767
output:
6868
co_ccap_add_on_parent_fee:
6969
2022-12: 0
@@ -73,7 +73,7 @@
7373
input:
7474
co_ccap_eligible_children: 2
7575
co_ccap_countable_income: 80_000
76-
snap_fpg: 40_000
76+
spm_unit_fpg: 40_000
7777
output:
7878
co_ccap_add_on_parent_fee:
7979
2022-12: 15

policyengine_us/tests/policy/baseline/gov/states/co/ccap/co_ccap_base_parent_fee.yaml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
period: 2023
33
input:
44
co_ccap_countable_income: 60_000
5-
snap_fpg: 120_000
5+
spm_unit_fpg: 120_000
66
state_code: CO
77
output:
88
co_ccap_base_parent_fee:
@@ -12,7 +12,7 @@
1212
period: 2023
1313
input:
1414
co_ccap_countable_income: 80_000
15-
snap_fpg: 40_000
15+
spm_unit_fpg: 40_000
1616
state_code: CO
1717
output:
1818
co_ccap_base_parent_fee:
@@ -22,7 +22,7 @@
2222
period: 2022
2323
input:
2424
co_ccap_countable_income: 60_000
25-
snap_fpg: 120_000
25+
spm_unit_fpg: 120_000
2626
state_code: CO
2727
output:
2828
co_ccap_base_parent_fee:
@@ -32,7 +32,7 @@
3232
period: 2022
3333
input:
3434
co_ccap_countable_income: 80_000
35-
snap_fpg: 40_000
35+
spm_unit_fpg: 40_000
3636
state_code: CO
3737
output:
3838
co_ccap_base_parent_fee:

policyengine_us/tests/policy/baseline/gov/states/co/ccap/entry/co_ccap_fpg_eligible.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
state_code_str: CO
55
co_ccap_countable_income: 2.3
66
county_str: ADAMS_COUNTY_CO
7-
snap_fpg: 1
7+
spm_unit_fpg: 12
88
output:
99
co_ccap_fpg_eligible: true
1010

@@ -14,7 +14,7 @@
1414
state_code_str: CO
1515
co_ccap_countable_income: 2.3
1616
county_str: BACA_COUNTY_CO
17-
snap_fpg: 1
17+
spm_unit_fpg: 12
1818
output:
1919
co_ccap_fpg_eligible: false
2020

@@ -24,6 +24,6 @@
2424
state_code_str: MN
2525
co_ccap_countable_income: 0
2626
county_str: HENNEPIN_COUNTY_MN
27-
snap_fpg: 1
27+
spm_unit_fpg: 12
2828
output:
2929
co_ccap_fpg_eligible: false

policyengine_us/variables/gov/states/co/ccap/co_ccap_add_on_parent_fee.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@ def formula(spm_unit, period, parameters):
2121
p = parameters(instant_str).gov.states.co.ccap
2222
# Calculate base parent fee and add on parent fee.
2323
gross_income = spm_unit("co_ccap_countable_income", period)
24-
# snap_fpg is monthly.
25-
snap_fpg = spm_unit("snap_fpg", period)
24+
fpg = spm_unit("spm_unit_fpg", period.this_year) / MONTHS_IN_YEAR
2625
eligible_children = spm_unit("co_ccap_eligible_children", period)
2726
# Calculate add-on parent fee based on the number of eligible
2827
# children in a household and income:
@@ -31,5 +30,5 @@ def formula(spm_unit, period, parameters):
3130
add_on_parent_fee_amount = (
3231
eligible_children - 1
3332
) * p.parent_fee.add_on
34-
add_on_parent_fee_applies = gross_income > snap_fpg
33+
add_on_parent_fee_applies = gross_income > fpg
3534
return add_on_parent_fee_amount * add_on_parent_fee_applies

policyengine_us/variables/gov/states/co/ccap/co_ccap_base_parent_fee.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,11 @@ def formula(spm_unit, period, parameters):
2121
p = parameters(instant_str).gov.states.co.ccap
2222
# Calculate base parent fee and add on parent fee.
2323
gross_income = spm_unit("co_ccap_countable_income", period)
24-
# snap_fpg is monthly.
25-
snap_fpg = spm_unit("snap_fpg", period)
24+
fpg = spm_unit("spm_unit_fpg", period.this_year) / MONTHS_IN_YEAR
2625
# Calculate base parent fee scaled (note income is monthly):
2726
# When income_scaled <= 1: income_scaled * 0.01
2827
# When income_scaled > 1: [1 * 0.01 + (income_scaled - 1) * 0.14]
2928
# Multiply by fpg afterward to scale back up
30-
gross_income_fpg_ratio = gross_income / snap_fpg
29+
gross_income_fpg_ratio = gross_income / fpg
3130
base_parent_fee_scaled = p.parent_fee.base.calc(gross_income_fpg_ratio)
32-
return base_parent_fee_scaled * snap_fpg
31+
return base_parent_fee_scaled * fpg

policyengine_us/variables/gov/states/co/ccap/entry/co_ccap_fpg_eligible.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,7 @@ def formula(spm_unit, period, parameters):
3636
)
3737
if mask.any():
3838
fpg_rate[mask] = p.entry.fpg_rate[county[mask]]
39-
# SNAP FPG is monthly.
40-
fpg = spm_unit("snap_fpg", period)
39+
fpg = spm_unit("spm_unit_fpg", period.this_year) / MONTHS_IN_YEAR
4140
fpg_limit = np.round(fpg * fpg_rate, 2)
4241
meets_income_limit = monthly_gross_income < fpg_limit
4342
return state_eligible & meets_income_limit

0 commit comments

Comments
 (0)