Summary
Parameter-driven categorical-eligibility lists reference the modeled benefit amount (snap, wic) but omit the reported-receipt inputs (receives_snap, receives_wic). Formulas that hardcode the check consistently OR the two arms; the parameter lists do not. Households that report receiving SNAP or WIC but whose modeled amount is $0 are therefore dropped from categorical eligibility in those programs.
Mechanism
receives_snap (variables/gov/usda/snap/receives_snap.py) is a bare input: bool, SPMUnit, MONTH, no formula — "reported to receive SNAP".
snap (variables/gov/usda/snap/snap.py) is the modeled allotment, defined_for = "takes_up_snap_if_eligible".
- Same split for WIC:
receives_wic is a bare input (bool, Person, MONTH); wic is defined_for = "takes_up_wic_if_eligible".
So snap == 0 / wic == 0 for a reporting household whenever the takeup draw is negative, income lands just over the limit, or member composition makes it ineligible. Formulas like is_head_start_categorically_eligible.py:26-31, meets_wic_categorical_eligibility.py:16-17, and medicaid_community_engagement_pass_through_eligible.py:31-32 handle this by ORing snap > 0 with receives_snap. The parameter lists carry only the amount variable.
Precedent for putting a receipt flag in a parameter list already exists: receives_medicaid appears in parameters/gov/aca/qualifying_non_marketplace_health_coverage.yaml:6 and parameters/gov/hhs/chip/disqualifying_health_coverage.yaml:7.
Lists needing receives_snap
| File |
Line |
Consumer |
Aggregation |
parameters/gov/usda/school_meals/categorical_eligibility.yaml |
5 |
meets_school_meal_categorical_eligibility |
adds =, SPMUnit |
parameters/gov/fcc/lifeline/categorical_eligibility.yaml |
5 |
is_lifeline_eligible, is_acp_eligible |
add(spm_unit, ...) |
parameters/gov/states/ma/dot/mbta/income_eligible_reduced_fares/applicable_programs.yaml |
6 |
ma_mbta_enrolled_in_applicable_programs |
adds = |
parameters/gov/states/ca/cpuc/care/eligibility/categorical.yaml |
6 |
ca_care_categorically_eligible |
add(household, ...) > 0 |
parameters/gov/states/tx/dart/qualifying_programs.yaml |
8 |
tx_dart_reduced_fare_program_eligible |
adds =, Person |
parameters/gov/ed/pell_grant/efc/simplified/benefits.yaml |
4 |
pell_grant_simplified_formula_applies |
add(tax_unit, ...) > 0 |
Lists needing receives_wic
| File |
Line |
Consumer |
Aggregation |
parameters/gov/fcc/acp/categorical_eligibility.yaml |
11 |
is_acp_eligible |
add(spm_unit, period, [program]) |
parameters/gov/states/ca/cpuc/care/eligibility/categorical.yaml |
5 |
ca_care_categorically_eligible |
add(household, ...) > 0 |
parameters/gov/states/tx/dart/qualifying_programs.yaml |
7 |
tx_dart_reduced_fare_program_eligible |
adds =, Person |
parameters/gov/ed/pell_grant/efc/simplified/benefits.yaml |
7 |
pell_grant_simplified_formula_applies |
add(tax_unit, ...) > 0 |
Entity aggregation was checked for each: receives_wic is Person-entity and every consumer aggregates person → SPMUnit / Household / TaxUnit, so the sums compose correctly. All consumers are YEAR-defined while both receipt flags are MONTH, so add over a year sums up to 12 monthly bools; every consumer either thresholds with > 0 or casts into a bool variable, so the result is correct in all cases.
The tx_dart_reduced_fare_program_eligible.py docstring already describes the list as "(SNAP, Medicaid, Medicare, CHIP, TANF, WIC, etc.)", indicating receipt was the intent.
Out of scope — do not change
These lists sum dollars, so adding a bool would contribute $1 of phantom income:
parameters/gov/states/ca/cpuc/income_sources.yaml:31-32 (SNAP and WIC as counted income for CARE/FERA)
parameters/gov/local/ca/la/dwp/ez_save/income_sources.yaml:20 (SNAP)
parameters/gov/states/ma/tax/income/credits/senior_circuit_breaker/income/disallowed_deductions.yaml:8,12 (consumed by ma_scb_total_income)
Reporting aggregates (gov/household/household_benefits.yaml, cbo_means_tested_transfers.yaml, spm_unit_benefits.py) are also out of scope — traced their consumers and no program income test reads them.
Impact
Adding the receipt arm expands categorical eligibility counts in microsimulation for school meals, Lifeline/ACP, CA CARE, MA MBTA, TX DART, and the Pell simplified-EFC formula. Partner contract tests under tests/policy/baseline/partners/** may move; any change to those expected outputs needs partner sign-off before it lands.
Tasks
Summary
Parameter-driven categorical-eligibility lists reference the modeled benefit amount (
snap,wic) but omit the reported-receipt inputs (receives_snap,receives_wic). Formulas that hardcode the check consistently OR the two arms; the parameter lists do not. Households that report receiving SNAP or WIC but whose modeled amount is $0 are therefore dropped from categorical eligibility in those programs.Mechanism
receives_snap(variables/gov/usda/snap/receives_snap.py) is a bare input:bool,SPMUnit, MONTH, no formula — "reported to receive SNAP".snap(variables/gov/usda/snap/snap.py) is the modeled allotment,defined_for = "takes_up_snap_if_eligible".receives_wicis a bare input (bool,Person, MONTH);wicisdefined_for = "takes_up_wic_if_eligible".So
snap == 0/wic == 0for a reporting household whenever the takeup draw is negative, income lands just over the limit, or member composition makes it ineligible. Formulas likeis_head_start_categorically_eligible.py:26-31,meets_wic_categorical_eligibility.py:16-17, andmedicaid_community_engagement_pass_through_eligible.py:31-32handle this by ORingsnap > 0withreceives_snap. The parameter lists carry only the amount variable.Precedent for putting a receipt flag in a parameter list already exists:
receives_medicaidappears inparameters/gov/aca/qualifying_non_marketplace_health_coverage.yaml:6andparameters/gov/hhs/chip/disqualifying_health_coverage.yaml:7.Lists needing
receives_snapparameters/gov/usda/school_meals/categorical_eligibility.yamlmeets_school_meal_categorical_eligibilityadds =, SPMUnitparameters/gov/fcc/lifeline/categorical_eligibility.yamlis_lifeline_eligible,is_acp_eligibleadd(spm_unit, ...)parameters/gov/states/ma/dot/mbta/income_eligible_reduced_fares/applicable_programs.yamlma_mbta_enrolled_in_applicable_programsadds =parameters/gov/states/ca/cpuc/care/eligibility/categorical.yamlca_care_categorically_eligibleadd(household, ...) > 0parameters/gov/states/tx/dart/qualifying_programs.yamltx_dart_reduced_fare_program_eligibleadds =, Personparameters/gov/ed/pell_grant/efc/simplified/benefits.yamlpell_grant_simplified_formula_appliesadd(tax_unit, ...) > 0Lists needing
receives_wicparameters/gov/fcc/acp/categorical_eligibility.yamlis_acp_eligibleadd(spm_unit, period, [program])parameters/gov/states/ca/cpuc/care/eligibility/categorical.yamlca_care_categorically_eligibleadd(household, ...) > 0parameters/gov/states/tx/dart/qualifying_programs.yamltx_dart_reduced_fare_program_eligibleadds =, Personparameters/gov/ed/pell_grant/efc/simplified/benefits.yamlpell_grant_simplified_formula_appliesadd(tax_unit, ...) > 0Entity aggregation was checked for each:
receives_wicisPerson-entity and every consumer aggregates person → SPMUnit / Household / TaxUnit, so the sums compose correctly. All consumers are YEAR-defined while both receipt flags are MONTH, soaddover a year sums up to 12 monthly bools; every consumer either thresholds with> 0or casts into aboolvariable, so the result is correct in all cases.The
tx_dart_reduced_fare_program_eligible.pydocstring already describes the list as "(SNAP, Medicaid, Medicare, CHIP, TANF, WIC, etc.)", indicating receipt was the intent.Out of scope — do not change
These lists sum dollars, so adding a bool would contribute $1 of phantom income:
parameters/gov/states/ca/cpuc/income_sources.yaml:31-32(SNAP and WIC as counted income for CARE/FERA)parameters/gov/local/ca/la/dwp/ez_save/income_sources.yaml:20(SNAP)parameters/gov/states/ma/tax/income/credits/senior_circuit_breaker/income/disallowed_deductions.yaml:8,12(consumed byma_scb_total_income)Reporting aggregates (
gov/household/household_benefits.yaml,cbo_means_tested_transfers.yaml,spm_unit_benefits.py) are also out of scope — traced their consumers and no program income test reads them.Impact
Adding the receipt arm expands categorical eligibility counts in microsimulation for school meals, Lifeline/ACP, CA CARE, MA MBTA, TX DART, and the Pell simplified-EFC formula. Partner contract tests under
tests/policy/baseline/partners/**may move; any change to those expected outputs needs partner sign-off before it lands.Tasks
receives_snapto the six lists abovereceives_wicto the four lists above