diff --git a/changelog.d/ma-state-supplement-circuit-breaker.fixed.md b/changelog.d/ma-state-supplement-circuit-breaker.fixed.md new file mode 100644 index 00000000..caca5a36 --- /dev/null +++ b/changelog.d/ma-state-supplement-circuit-breaker.fixed.md @@ -0,0 +1 @@ +Zero the imputed Massachusetts SSI state supplement so it does not inflate the Senior Circuit Breaker total income, matching TAXSIM (which does not model it). diff --git a/policyengine_taxsim/core/input_mapper.py b/policyengine_taxsim/core/input_mapper.py index 2be72a6b..cc34bb26 100644 --- a/policyengine_taxsim/core/input_mapper.py +++ b/policyengine_taxsim/core/input_mapper.py @@ -225,6 +225,17 @@ def form_household_situation(year, state, taxsim_vars): "commodity_supplemental_food_program" ] = {str(year): 0} + # Explicitly set the Massachusetts SSI state supplement to 0 so PolicyEngine + # does not impute it. TAXSIM does not model it, and Massachusetts counts cash + # public assistance (including SSI) in the Senior Circuit Breaker "total + # income" (MGL c.62 s.6(k)), so an imputed supplement understates the credit. + # See PolicyEngine/policyengine-taxsim#1031. + if state.upper() == "MA": + for person_name in household_situation["people"]: + household_situation["people"][person_name]["ma_state_supplement"] = { + str(year): 0 + } + # Explicitly set imputed medical expenses to 0 for all people. TAXSIM has no # medical-expense input, so PE's imputed Medicare Part B premiums would # otherwise flow through the federal itemized medical deduction into state diff --git a/policyengine_taxsim/runners/policyengine_runner.py b/policyengine_taxsim/runners/policyengine_runner.py index 9d24d103..e28b3313 100644 --- a/policyengine_taxsim/runners/policyengine_runner.py +++ b/policyengine_taxsim/runners/policyengine_runner.py @@ -159,6 +159,7 @@ def _initialize_dataset_structure(self) -> dict: "ak_energy_relief", "ak_permanent_fund_dividend", "ssi", # SSI should be 0 to match TAXSIM (which doesn't model SSI) + "ma_state_supplement", # MA SSI state supplement should be 0 to match TAXSIM (which doesn't model it); it feeds the MA Senior Circuit Breaker income "wic", # WIC should be 0 to match TAXSIM (which doesn't model WIC) "snap", # SNAP should be 0 to match TAXSIM (which doesn't model SNAP) "tanf", # TANF should be 0 to match TAXSIM (which doesn't model TANF) @@ -829,6 +830,9 @@ def generate(self) -> None: data["ssi"][year_int] = np.zeros( total_people_for_year ) # Set SSI to 0 to match TAXSIM (which doesn't model SSI) + data["ma_state_supplement"][year_int] = np.zeros( + total_people_for_year + ) # Set MA SSI state supplement to 0 to match TAXSIM; it feeds the MA Senior Circuit Breaker total income (MGL c.62 s.6(k)). See issue #1031. data["wic"][year_int] = np.zeros( total_people_for_year ) # Set WIC to 0 to match TAXSIM (which doesn't model WIC)