policyengine-us 1.434.0__py3-none-any.whl → 1.435.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. policyengine_us/reforms/congress/tlaib/__init__.py +4 -3
  2. policyengine_us/reforms/congress/tlaib/economic_dignity_for_all_agenda/__init__.py +9 -0
  3. policyengine_us/reforms/congress/tlaib/economic_dignity_for_all_agenda/edaa_end_child_poverty_act.py +237 -0
  4. policyengine_us/reforms/reforms.py +5 -4
  5. policyengine_us/tests/policy/baseline/gov/ssa/ssi/integration_tests.yaml +150 -4
  6. policyengine_us/tests/policy/contrib/congress/tlaib/economic_dignity_for_all_agenda/edaa_end_child_poverty_act.yaml +198 -0
  7. policyengine_us/variables/gov/ssa/ssi/eligibility/income/deemed/from_ineligible_spouse/is_ssi_spousal_deeming_applies.py +41 -0
  8. policyengine_us/variables/gov/ssa/ssi/eligibility/income/deemed/from_ineligible_spouse/ssi_income_deemed_from_ineligible_spouse.py +20 -20
  9. policyengine_us/variables/gov/ssa/ssi/ssi.py +22 -1
  10. policyengine_us/variables/gov/ssa/ssi/ssi_amount_if_eligible.py +26 -4
  11. {policyengine_us-1.434.0.dist-info → policyengine_us-1.435.1.dist-info}/METADATA +1 -1
  12. {policyengine_us-1.434.0.dist-info → policyengine_us-1.435.1.dist-info}/RECORD +24 -36
  13. policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/baby_bonus_act/age_limit.yaml +0 -8
  14. policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/baby_bonus_act/amount.yaml +0 -13
  15. policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/baby_bonus_act/in_effect.yaml +0 -8
  16. policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/baby_bonus_act/min_birth_year.yaml +0 -8
  17. policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/boost_act/amount.yaml +0 -13
  18. policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/boost_act/in_effect.yaml +0 -8
  19. policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/boost_act/max_age.yaml +0 -8
  20. policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/boost_act/min_age.yaml +0 -8
  21. policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/boost_act/tax/rate.yaml +0 -8
  22. policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/boost_act/tax/threshold.yaml +0 -24
  23. policyengine_us/reforms/congress/tlaib/income_security_package/__init__.py +0 -17
  24. policyengine_us/reforms/congress/tlaib/income_security_package/income_security_package.py +0 -453
  25. policyengine_us/tests/policy/contrib/congress/tlaib/income_security/integration.yaml +0 -154
  26. policyengine_us/tests/policy/contrib/congress/tlaib/income_security/state_integration.yaml +0 -110
  27. policyengine_us/tests/policy/contrib/congress/tlaib/income_security/test_individual_acts.yaml +0 -149
  28. policyengine_us/tests/policy/contrib/congress/tlaib/income_security/unit_tests.yaml +0 -272
  29. /policyengine_us/parameters/gov/contrib/congress/tlaib/{income_security_package → economic_dignity_for_all_agenda}/end_child_poverty_act/adult_dependent_credit/amount.yaml +0 -0
  30. /policyengine_us/parameters/gov/contrib/congress/tlaib/{income_security_package → economic_dignity_for_all_agenda}/end_child_poverty_act/adult_dependent_credit/min_age.yaml +0 -0
  31. /policyengine_us/parameters/gov/contrib/congress/tlaib/{income_security_package → economic_dignity_for_all_agenda}/end_child_poverty_act/child_benefit/age_limit.yaml +0 -0
  32. /policyengine_us/parameters/gov/contrib/congress/tlaib/{income_security_package → economic_dignity_for_all_agenda}/end_child_poverty_act/filer_credit/amount.yaml +0 -0
  33. /policyengine_us/parameters/gov/contrib/congress/tlaib/{income_security_package → economic_dignity_for_all_agenda}/end_child_poverty_act/filer_credit/eligibility/max_age.yaml +0 -0
  34. /policyengine_us/parameters/gov/contrib/congress/tlaib/{income_security_package → economic_dignity_for_all_agenda}/end_child_poverty_act/filer_credit/eligibility/min_age.yaml +0 -0
  35. /policyengine_us/parameters/gov/contrib/congress/tlaib/{income_security_package → economic_dignity_for_all_agenda}/end_child_poverty_act/filer_credit/phase_out/rate.yaml +0 -0
  36. /policyengine_us/parameters/gov/contrib/congress/tlaib/{income_security_package → economic_dignity_for_all_agenda}/end_child_poverty_act/filer_credit/phase_out/start.yaml +0 -0
  37. /policyengine_us/parameters/gov/contrib/congress/tlaib/{income_security_package → economic_dignity_for_all_agenda}/end_child_poverty_act/in_effect.yaml +0 -0
  38. {policyengine_us-1.434.0.dist-info → policyengine_us-1.435.1.dist-info}/WHEEL +0 -0
  39. {policyengine_us-1.434.0.dist-info → policyengine_us-1.435.1.dist-info}/entry_points.txt +0 -0
  40. {policyengine_us-1.434.0.dist-info → policyengine_us-1.435.1.dist-info}/licenses/LICENSE +0 -0
@@ -1,7 +1,8 @@
1
1
  from .end_child_poverty_act import (
2
2
  create_end_child_poverty_act_reform,
3
+ end_child_poverty_act,
3
4
  )
4
- from .income_security_package import (
5
- income_security_package,
6
- create_income_security_package_reform,
5
+ from .economic_dignity_for_all_agenda import (
6
+ end_child_poverty_act as edaa_end_child_poverty_act,
7
+ create_end_child_poverty_act_reform as create_edaa_end_child_poverty_act_reform,
7
8
  )
@@ -0,0 +1,9 @@
1
+ from .edaa_end_child_poverty_act import (
2
+ end_child_poverty_act,
3
+ create_end_child_poverty_act_reform,
4
+ )
5
+
6
+ __all__ = [
7
+ "end_child_poverty_act",
8
+ "create_end_child_poverty_act_reform",
9
+ ]
@@ -0,0 +1,237 @@
1
+ from policyengine_us.model_api import *
2
+
3
+
4
+ def create_ecpa_only() -> Reform:
5
+ class ecpa_child_benefit(Variable):
6
+ value_type = float
7
+ entity = Person
8
+ definition_period = YEAR
9
+ label = "End Child Poverty Act child benefit"
10
+ unit = USD
11
+ documentation = (
12
+ "Universal child benefit under the End Child Poverty Act"
13
+ )
14
+ reference = "placeholder - bill not yet introduced"
15
+
16
+ def formula(person, period, parameters):
17
+ p = parameters(
18
+ period
19
+ ).gov.contrib.congress.tlaib.economic_dignity_for_all_agenda.end_child_poverty_act
20
+
21
+ age = person("age", period)
22
+ is_eligible = age < p.child_benefit.age_limit
23
+
24
+ # Use FPG additional_person amount (CONTIGUOUS_US for all states), rounded to nearest $10
25
+ p_fpg = parameters(period).gov.hhs.fpg
26
+ fpg_amount = p_fpg.additional_person.CONTIGUOUS_US
27
+ amount = round(fpg_amount / 10) * 10
28
+
29
+ return is_eligible * amount
30
+
31
+ class ecpa_adult_dependent_credit(Variable):
32
+ value_type = float
33
+ entity = Person
34
+ definition_period = YEAR
35
+ label = "End Child Poverty Act adult dependent credit"
36
+ unit = USD
37
+ documentation = (
38
+ "Credit for adult dependents under the End Child Poverty Act"
39
+ )
40
+ reference = "placeholder - bill not yet introduced"
41
+
42
+ def formula(person, period, parameters):
43
+ p = parameters(
44
+ period
45
+ ).gov.contrib.congress.tlaib.economic_dignity_for_all_agenda.end_child_poverty_act
46
+
47
+ age = person("age", period)
48
+ is_dependent = person("is_tax_unit_dependent", period)
49
+
50
+ is_eligible = (
51
+ age >= p.adult_dependent_credit.min_age
52
+ ) & is_dependent
53
+
54
+ return is_eligible * p.adult_dependent_credit.amount
55
+
56
+ class ecpa_filer_credit(Variable):
57
+ value_type = float
58
+ entity = TaxUnit
59
+ definition_period = YEAR
60
+ label = "End Child Poverty Act filer credit"
61
+ unit = USD
62
+ documentation = "Filer credit under the End Child Poverty Act for eligible tax filers"
63
+ reference = "placeholder - bill not yet introduced"
64
+
65
+ def formula(tax_unit, period, parameters):
66
+ p = parameters(
67
+ period
68
+ ).gov.contrib.congress.tlaib.economic_dignity_for_all_agenda.end_child_poverty_act
69
+
70
+ person = tax_unit.members
71
+ age = person("age", period)
72
+
73
+ is_head_or_spouse = person("is_tax_unit_head_or_spouse", period)
74
+
75
+ is_eligible_age = (age >= p.filer_credit.eligibility.min_age) & (
76
+ age < p.filer_credit.eligibility.max_age
77
+ )
78
+ is_eligible_filer = is_head_or_spouse & is_eligible_age
79
+
80
+ has_eligible_filer = tax_unit.any(is_eligible_filer)
81
+
82
+ filing_status = tax_unit("filing_status", period)
83
+ amount = p.filer_credit.amount[filing_status]
84
+
85
+ agi = tax_unit("adjusted_gross_income", period)
86
+ excess_agi = max_(
87
+ agi - p.filer_credit.phase_out.start[filing_status], 0
88
+ )
89
+ phase_out = excess_agi * p.filer_credit.phase_out.rate
90
+
91
+ phased_out_amount = max_(amount - phase_out, 0)
92
+
93
+ return has_eligible_filer * phased_out_amount
94
+
95
+ class household_benefits(Variable):
96
+ value_type = float
97
+ entity = Household
98
+ label = "benefits"
99
+ unit = USD
100
+ definition_period = YEAR
101
+
102
+ def formula(household, period, parameters):
103
+ # Start with baseline benefits from parameters
104
+ BENEFITS = list(
105
+ parameters(period).gov.household.household_benefits
106
+ )
107
+
108
+ # Add ECPA child benefit
109
+ BENEFITS.append("ecpa_child_benefit")
110
+
111
+ return add(household, period, BENEFITS)
112
+
113
+ class spm_unit_benefits(Variable):
114
+ value_type = float
115
+ entity = SPMUnit
116
+ label = "Benefits"
117
+ definition_period = YEAR
118
+ unit = USD
119
+
120
+ def formula(spm_unit, period, parameters):
121
+ BENEFITS = [
122
+ "social_security",
123
+ "ssi",
124
+ "ma_state_supplement",
125
+ "ca_cvrp",
126
+ "co_ccap_subsidy",
127
+ "co_state_supplement",
128
+ "co_oap",
129
+ "snap",
130
+ "wic",
131
+ "free_school_meals",
132
+ "reduced_price_school_meals",
133
+ "spm_unit_broadband_subsidy",
134
+ "spm_unit_energy_subsidy",
135
+ "tanf",
136
+ "high_efficiency_electric_home_rebate",
137
+ "residential_efficiency_electrification_rebate",
138
+ "unemployment_compensation",
139
+ "ak_energy_relief",
140
+ "basic_income",
141
+ "ny_drive_clean_rebate",
142
+ ]
143
+
144
+ # Add ECPA child benefit
145
+ BENEFITS.append("ecpa_child_benefit")
146
+
147
+ if parameters(period).gov.contrib.ubi_center.flat_tax.deduct_ptc:
148
+ BENEFITS.append("aca_ptc")
149
+ if not parameters(period).gov.hud.abolition:
150
+ BENEFITS.append("spm_unit_capped_housing_subsidy")
151
+
152
+ return add(spm_unit, period, BENEFITS)
153
+
154
+ class income_tax_refundable_credits(Variable):
155
+ value_type = float
156
+ entity = TaxUnit
157
+ definition_period = YEAR
158
+ label = "federal refundable income tax credits"
159
+ unit = USD
160
+
161
+ def formula(tax_unit, period, parameters):
162
+ # Get standard refundable credits, excluding EITC and refundable CTC (ECPA replaces them)
163
+ standard_credits = parameters(period).gov.irs.credits.refundable
164
+
165
+ CREDITS = [
166
+ c
167
+ for c in standard_credits
168
+ if c not in ["eitc", "refundable_ctc"]
169
+ ]
170
+
171
+ base_credits = add(tax_unit, period, CREDITS) if CREDITS else 0
172
+
173
+ # Add ECPA credits
174
+ ecpa_filer = tax_unit("ecpa_filer_credit", period)
175
+ ecpa_adult_dep = add(
176
+ tax_unit, period, ["ecpa_adult_dependent_credit"]
177
+ )
178
+ return base_credits + ecpa_filer + ecpa_adult_dep
179
+
180
+ class income_tax_non_refundable_credits(Variable):
181
+ value_type = float
182
+ entity = TaxUnit
183
+ definition_period = YEAR
184
+ label = "federal non-refundable income tax credits"
185
+ unit = USD
186
+
187
+ def formula(tax_unit, period, parameters):
188
+ # Get the base list of non-refundable credits from parameters
189
+ p = parameters(period).gov.irs.credits
190
+ base_credits = list(p.non_refundable)
191
+
192
+ # ECPA removes non_refundable_ctc from the list
193
+ CREDITS = [c for c in base_credits if c != "non_refundable_ctc"]
194
+
195
+ return add(tax_unit, period, CREDITS)
196
+
197
+ class reform(Reform):
198
+ def apply(self):
199
+ # Update only ECPA variables
200
+ self.update_variable(ecpa_child_benefit)
201
+ self.update_variable(ecpa_adult_dependent_credit)
202
+ self.update_variable(ecpa_filer_credit)
203
+ self.update_variable(household_benefits)
204
+ self.update_variable(spm_unit_benefits)
205
+ self.update_variable(income_tax_refundable_credits)
206
+ self.update_variable(income_tax_non_refundable_credits)
207
+
208
+ return reform
209
+
210
+
211
+ end_child_poverty_act = create_ecpa_only()
212
+
213
+
214
+ def create_end_child_poverty_act_reform(
215
+ parameters, period, bypass: bool = False
216
+ ):
217
+ """Auto-application function for structural reforms."""
218
+ if bypass:
219
+ return create_ecpa_only()
220
+
221
+ from policyengine_core.periods import period as period_
222
+
223
+ p = parameters.gov.contrib.congress.tlaib.economic_dignity_for_all_agenda
224
+
225
+ reform_active = False
226
+ current_period = period_(period)
227
+
228
+ for i in range(5):
229
+ if p(current_period).end_child_poverty_act.in_effect:
230
+ reform_active = True
231
+ break
232
+ current_period = current_period.offset(1, "year")
233
+
234
+ if reform_active:
235
+ return create_ecpa_only()
236
+ else:
237
+ return None
@@ -28,8 +28,9 @@ from .harris.rent_relief_act.rent_relief_tax_credit import (
28
28
  )
29
29
  from .congress.tlaib import (
30
30
  create_end_child_poverty_act_reform,
31
- income_security_package,
32
- create_income_security_package_reform,
31
+ )
32
+ from .congress.tlaib.economic_dignity_for_all_agenda import (
33
+ create_end_child_poverty_act_reform as create_edaa_end_child_poverty_act_reform,
33
34
  )
34
35
  from .congress.tlaib.boost import (
35
36
  create_boost_middle_class_tax_credit_reform,
@@ -170,7 +171,7 @@ def create_structural_reforms_from_parameters(parameters, period):
170
171
  end_child_poverty_act = create_end_child_poverty_act_reform(
171
172
  parameters, period
172
173
  )
173
- income_security_package_reform = create_income_security_package_reform(
174
+ edaa_end_child_poverty_act = create_edaa_end_child_poverty_act_reform(
174
175
  parameters, period
175
176
  )
176
177
  boost_middle_class_tax_credit = (
@@ -288,7 +289,7 @@ def create_structural_reforms_from_parameters(parameters, period):
288
289
  middle_class_tax_credit,
289
290
  rent_relief_tax_credit,
290
291
  end_child_poverty_act,
291
- income_security_package_reform,
292
+ edaa_end_child_poverty_act,
292
293
  boost_middle_class_tax_credit,
293
294
  mn_walz_hf1938,
294
295
  or_rebate_state_tax_exempt,
@@ -68,10 +68,12 @@
68
68
  output:
69
69
  is_ssi_eligible: [true, false, true]
70
70
  # Spouse's countable: $2,000 - $20 - $65 - $957.50 = $957.50/month = $11,490/year
71
- # PolicyEngine deems all of spouse's countable income (doesn't subtract spouse allowance)
71
+ # Since $11,490 > $5,796 (couple - individual FBR diff), deeming applies
72
+ # With deeming, use couple FBR: $1,450/month = $17,400/year
72
73
  ssi_income_deemed_from_ineligible_spouse: [11_490, 0, 0]
73
74
  ssi_countable_income: [11_490, 0, 0]
74
- ssi: [114, 0, 11_604] # Adult1: $11,604 - $11,490 = $114; Child gets full FBR
75
+ # Adult1 SSI: $17,400 (couple FBR) - $11,490 (countable) = $5,910
76
+ ssi: [5_910, 0, 11_604] # Adult1: $5,910 with couple rate; Child gets full FBR
75
77
 
76
78
  - name: Case 3 - Both adults healthy with income + disabled child
77
79
  period: 2025
@@ -217,12 +219,14 @@
217
219
  output:
218
220
  is_ssi_eligible: [true, false, true]
219
221
  # Spouse's countable: $5,000 - $20 - $65 - $2,457.50 = $2,457.50/month = $29,490/year
220
- # PolicyEngine deems all countable income without subtracting spouse allowance
222
+ # Since $29,490 > $5,796 (couple - individual FBR diff), deeming applies
223
+ # With deeming, use couple FBR: $1,450/month = $17,400/year
224
+ # Adult1 SSI: $17,400 (couple FBR) - $29,490 (countable) = -$12,090, capped at $0
221
225
  ssi_income_deemed_from_ineligible_spouse: [29_490, 0, 0]
222
226
  # Parent income deeming to child also gets high amount
223
227
  ssi_unearned_income_deemed_from_ineligible_parent: [0, 0, 17_886]
224
228
  ssi_countable_income: [29_490, 0, 17_646]
225
- ssi: [0, 0, 0] # Both disabled members have too much deemed income
229
+ ssi: [0, 0, 0] # Both disabled members have countable income exceeding FBR
226
230
 
227
231
  - name: Case 7 - Illinois single parent with $9,600 income + healthy child
228
232
  period: 2024-01
@@ -254,3 +258,145 @@
254
258
  ssi_countable_income: [357.50, 0]
255
259
  ssi_amount_if_eligible: [943, 943]
256
260
  ssi: [585.50, 0]
261
+
262
+ - name: Case 8 - Deeming applies, benefit capped at individual FBR
263
+ period: 2025-01
264
+ input:
265
+ people:
266
+ adult1:
267
+ age: 55
268
+ is_disabled: false
269
+ employment_income: 967 * 12 # $967/month
270
+ adult2:
271
+ age: 60
272
+ is_disabled: true
273
+ employment_income: 0
274
+ tax_units:
275
+ tax_unit:
276
+ members: [adult1, adult2]
277
+ marital_units:
278
+ marital_unit:
279
+ members: [adult1, adult2]
280
+ households:
281
+ household:
282
+ members: [adult1, adult2]
283
+ state_code: NC
284
+ output:
285
+ is_ssi_eligible: [false, true]
286
+ # Step 1: Check if deeming applies
287
+ # Adult1 gross income: $967/month > $483 threshold → Deeming applies
288
+ #
289
+ # Step 2: Calculate deemed income
290
+ # Combined income: $967/month earned
291
+ # Apply exclusions: $967 - $20 (general) - $65 (earned) = $882
292
+ # Take half: $882 / 2 = $441/month
293
+ # Adult2 alone countable: $0
294
+ # Deemed income = $441 - $0 = $441/month
295
+ ssi_income_deemed_from_ineligible_spouse: [0, 441]
296
+ ssi_countable_income: [0, 441]
297
+ #
298
+ # Step 3: Calculate benefit
299
+ # Use couple FBR (deeming applies): $1,450/month
300
+ # Benefit before cap: $1,450 - $441 = $1,009/month
301
+ # Cap at individual FBR: min($1,009, $967) = $967/month
302
+ # Note: This demonstrates the cap is necessary when spouse's gross income
303
+ # is just above $483, resulting in low countable income after exclusions
304
+ ssi: [0, 967]
305
+
306
+ - name: Case 9 - Deeming applies without child
307
+ period: 2025-01
308
+ input:
309
+ people:
310
+ adult1:
311
+ age: 41
312
+ is_disabled: false
313
+ employment_income: 3_000 * 12 # $3,000/month
314
+ adult2:
315
+ age: 40
316
+ is_disabled: true
317
+ employment_income: 0
318
+ tax_units:
319
+ tax_unit:
320
+ members: [adult1, adult2]
321
+ marital_units:
322
+ marital_unit:
323
+ members: [adult1, adult2]
324
+ households:
325
+ household:
326
+ members: [adult1, adult2]
327
+ state_code: NC
328
+ output:
329
+ is_ssi_eligible: [false, true]
330
+ # Step 1: No child allocation (no child present)
331
+ # Adult1 gross income: $3,000/month (no reduction)
332
+ #
333
+ # Step 2: Check if deeming applies
334
+ # Adult1 gross income: $3,000 > $483 threshold → Deeming applies
335
+ #
336
+ # Step 3: Calculate deemed income
337
+ # Combined income: $3,000/month earned
338
+ # Apply exclusions: $3,000 - $20 (general) - $65 (earned) = $2,915
339
+ # Take half: $2,915 / 2 = $1,457.50/month
340
+ # Adult2 alone countable: $0
341
+ # Deemed income = $1,457.50 - $0 = $1,457.50/month
342
+ ssi_income_deemed_from_ineligible_spouse: [0, 1_457.50]
343
+ ssi_countable_income: [0, 1_457.50]
344
+ #
345
+ # Step 4: Calculate benefit
346
+ # Use couple FBR (deeming applies): $1,450/month
347
+ # Benefit before cap: $1,450 - $1,457.50 = -$7.50 (negative)
348
+ # Benefit capped at $0 (cannot be negative)
349
+ ssi: [0, 0]
350
+
351
+ - name: Case 10 - Deeming applies with child allocation (compare to Case 9)
352
+ period: 2025-01
353
+ input:
354
+ people:
355
+ adult1:
356
+ age: 41
357
+ is_disabled: false
358
+ employment_income: 3_000 * 12 # $3,000/month
359
+ adult2:
360
+ age: 40
361
+ is_disabled: true
362
+ employment_income: 0
363
+ child:
364
+ age: 12
365
+ is_disabled: false
366
+ employment_income: 0
367
+ tax_units:
368
+ tax_unit:
369
+ members: [adult1, adult2, child]
370
+ marital_units:
371
+ marital_unit:
372
+ members: [adult1, adult2, child]
373
+ households:
374
+ household:
375
+ members: [adult1, adult2, child]
376
+ state_code: NC
377
+ output:
378
+ is_ssi_eligible: [false, true, false]
379
+ # Step 1: Apply child allocation
380
+ # Child allocation: $1,450 (couple FBR) - $967 (individual FBR) = $483/month
381
+ # Child has $0 income, so full $483 allocation applies
382
+ # Adult1 earned after child allocation: $3,000 - $483 = $2,517/month
383
+ #
384
+ # Step 2: Check if deeming applies
385
+ # Adult1 income after child allocation: $2,517 > $483 threshold → Deeming applies
386
+ #
387
+ # Step 3: Calculate deemed income
388
+ # Combined income: $2,517/month earned (after child allocation)
389
+ # Apply exclusions: $2,517 - $20 (general) - $65 (earned) = $2,432
390
+ # Take half: $2,432 / 2 = $1,216/month
391
+ # Adult2 alone countable: $0
392
+ # Deemed income = $1,216 - $0 = $1,216/month
393
+ ssi_income_deemed_from_ineligible_spouse: [0, 1_216, 0]
394
+ ssi_countable_income: [0, 1_216, 0]
395
+ #
396
+ # Step 4: Calculate benefit
397
+ # Use couple FBR (deeming applies): $1,450/month
398
+ # Benefit before cap: $1,450 - $1,216 = $234/month
399
+ # Cap at individual FBR: min($234, $967) = $234 (no cap needed)
400
+ # Note: Compare to Case 9 - child allocation ($483) reduces deemed income,
401
+ # changing result from $0 to $234/month
402
+ ssi: [0, 234, 0]
@@ -0,0 +1,198 @@
1
+ # End Child Poverty Act tests
2
+
3
+ - name: ECPA child benefit for eligible child
4
+ period: 2026
5
+ reforms: policyengine_us.reforms.congress.tlaib.economic_dignity_for_all_agenda.end_child_poverty_act
6
+ input:
7
+ people:
8
+ parent:
9
+ age: 30
10
+ child:
11
+ age: 5
12
+ tax_units:
13
+ tax_unit:
14
+ members: [parent, child]
15
+ filing_status: SINGLE
16
+ adjusted_gross_income: 20_000
17
+ households:
18
+ household:
19
+ members: [parent, child]
20
+ output:
21
+ ecpa_child_benefit: [0, 5_630]
22
+ ecpa_filer_credit: 700
23
+
24
+ - name: ECPA adult dependent credit
25
+ period: 2026
26
+ reforms: policyengine_us.reforms.congress.tlaib.economic_dignity_for_all_agenda.end_child_poverty_act
27
+ input:
28
+ people:
29
+ parent:
30
+ age: 45
31
+ adult_dependent:
32
+ age: 20
33
+ is_tax_unit_dependent: true
34
+ tax_units:
35
+ tax_unit:
36
+ members: [parent, adult_dependent]
37
+ filing_status: SINGLE
38
+ adjusted_gross_income: 15_000
39
+ output:
40
+ ecpa_adult_dependent_credit: [0, 700]
41
+ ecpa_filer_credit: 700
42
+
43
+ - name: ECPA filer credit with phase out
44
+ period: 2026
45
+ reforms: policyengine_us.reforms.congress.tlaib.economic_dignity_for_all_agenda.end_child_poverty_act
46
+ input:
47
+ people:
48
+ filer:
49
+ age: 40
50
+ tax_units:
51
+ tax_unit:
52
+ members: [filer]
53
+ filing_status: SINGLE
54
+ adjusted_gross_income: 24_000
55
+ output:
56
+ ecpa_filer_credit: 500 # 700 - (4,000 * 0.05)
57
+
58
+ - name: ECPA household with children and adult dependent
59
+ period: 2026
60
+ reforms: policyengine_us.reforms.congress.tlaib.economic_dignity_for_all_agenda.end_child_poverty_act
61
+ input:
62
+ people:
63
+ parent:
64
+ age: 45
65
+ child1:
66
+ age: 5
67
+ child2:
68
+ age: 10
69
+ adult_dependent:
70
+ age: 20
71
+ is_tax_unit_dependent: true
72
+ tax_units:
73
+ tax_unit:
74
+ members: [parent, child1, child2, adult_dependent]
75
+ filing_status: SINGLE
76
+ adjusted_gross_income: 30_000
77
+ output:
78
+ ecpa_child_benefit: [0, 5_630, 5_630, 0]
79
+ ecpa_adult_dependent_credit: [0, 0, 0, 700]
80
+ ecpa_filer_credit: 200 # 700 - (10,000 * 0.05)
81
+
82
+ - name: ECPA joint filers with children and adult dependent
83
+ period: 2026
84
+ reforms: policyengine_us.reforms.congress.tlaib.economic_dignity_for_all_agenda.end_child_poverty_act
85
+ input:
86
+ people:
87
+ parent1:
88
+ age: 40
89
+ parent2:
90
+ age: 38
91
+ child:
92
+ age: 8
93
+ adult_dependent:
94
+ age: 22
95
+ is_tax_unit_dependent: true
96
+ tax_units:
97
+ tax_unit:
98
+ members: [parent1, parent2, child, adult_dependent]
99
+ filing_status: JOINT
100
+ adjusted_gross_income: 45_000
101
+ output:
102
+ ecpa_child_benefit: [0, 0, 5_630, 0]
103
+ ecpa_adult_dependent_credit: [0, 0, 0, 700]
104
+ ecpa_filer_credit: 1_150 # 1,400 - (5,000 * 0.05)
105
+
106
+ - name: Oklahoma family - state credits reference federal calculations
107
+ period: 2026
108
+ reforms: policyengine_us.reforms.congress.tlaib.economic_dignity_for_all_agenda.end_child_poverty_act
109
+ absolute_error_margin: 1
110
+ input:
111
+ people:
112
+ parent1:
113
+ age: 35
114
+ employment_income: 30_000
115
+ parent2:
116
+ age: 33
117
+ employment_income: 20_000
118
+ newborn:
119
+ age: 0
120
+ birth_year: 2026
121
+ child:
122
+ age: 8
123
+ birth_year: 2018
124
+ adult_dependent:
125
+ age: 19
126
+ birth_year: 2007
127
+ is_full_time_student: true
128
+ tax_units:
129
+ tax_unit:
130
+ members: [parent1, parent2, newborn, child, adult_dependent]
131
+ filing_status: JOINT
132
+ households:
133
+ household:
134
+ members: [parent1, parent2, newborn, child, adult_dependent]
135
+ state_code: OK
136
+ output:
137
+ # Federal CTC/EITC calculated for state reference
138
+ ctc: 4_900
139
+ eitc: 4_244
140
+
141
+ # Oklahoma credits (5% of federal)
142
+ ok_child_care_child_tax_credit:
143
+ 2026: 245 # 5% of $4,900
144
+ ok_eitc:
145
+ 2026: 72.07
146
+
147
+ # ECPA benefits
148
+ ecpa_child_benefit:
149
+ 2026: [0, 0, 5_630, 5_630, 0]
150
+ ecpa_adult_dependent_credit:
151
+ 2026: [0, 0, 0, 0, 700]
152
+ ecpa_filer_credit:
153
+ 2026: 900 # $1,400 - ($50k - $40k) * 0.05
154
+
155
+ # Federal refundable credits exclude CTC/EITC
156
+ income_tax_refundable_credits:
157
+ 2026: 1_600 # ECPA filer ($900) + adult dependent ($700)
158
+
159
+ - name: Maine single parent - state EITC percentage of federal
160
+ period: 2026
161
+ reforms: policyengine_us.reforms.congress.tlaib.economic_dignity_for_all_agenda.end_child_poverty_act
162
+ absolute_error_margin: 1
163
+ input:
164
+ people:
165
+ parent:
166
+ age: 28
167
+ employment_income: 25_000
168
+ child1:
169
+ age: 3
170
+ birth_year: 2023
171
+ child2:
172
+ age: 10
173
+ birth_year: 2016
174
+ tax_units:
175
+ tax_unit:
176
+ members: [parent, child1, child2]
177
+ filing_status: HEAD_OF_HOUSEHOLD
178
+ households:
179
+ household:
180
+ members: [parent, child1, child2]
181
+ state_code: ME
182
+ output:
183
+ # Federal calculations
184
+ ctc: 4_400
185
+ eitc: 7_071
186
+
187
+ # Maine EITC is 25% of federal
188
+ me_eitc: 1_767
189
+
190
+ # ECPA benefits
191
+ ecpa_child_benefit:
192
+ 2026: [0, 5_630, 5_630]
193
+ ecpa_filer_credit:
194
+ 2026: 450 # $700 - ($25k - $20k) * 0.05
195
+
196
+ # Federal credits exclude EITC/CTC
197
+ income_tax_refundable_credits:
198
+ 2026: 450