Skip to content

weekly_hours_worked_before_lsr default of 40 silently passes all SNAP work requirements when hours data is missing #9254

Description

@DTrim99

Summary

weekly_hours_worked_before_lsr is a pure input with default_value = 40 and no fallback formula (policyengine_us/variables/household/income/person/weekly_hours_worked.py). Forty hours passes both the SNAP 20-hour ABAWD test (meets_snap_abawd_work_requirements.py) and the 30-hour general work-requirement test, so any dataset or household that fails to populate this input silently behaves as if everyone works full-time and all hours-conditioned work requirements pass — a false negative that looks like a populated model rather than an error.

This is the same failure mode behind the populace constant-40 landmine (populace #613, #626, #242/#248): whenever the input is absent or defaulted, SNAP work-requirement reform exposure collapses to ~zero with no visible signal.

Why 40 is the worst possible default

The real population distribution (CPS/ACS) is mean ~19 weekly hours with ~50% zeros. A default of 40 is not a neutral placeholder — it sits above every work-requirement threshold, so missing data maps precisely onto "exempt / compliant." We repeatedly hit this: a fixture and multiple dataset builds all showed meets_abawd_work_requirement = TRUE for 0-hour adults purely because the input defaulted to 40.

Proposed hardening (pick one)

  1. Change default_value to 0. Missing data then reads as "no work hours" — a visible, conservative failure that surfaces immediately in any work-requirement result, rather than silently exempting everyone. Datasets that carry real hours are unaffected.
  2. Add a fallback formula deriving weekly_hours_worked_before_lsr from hours_worked_last_week (already a populated input on the affected builds) when the usual-weekly input is absent. Inputs still override the formula, so real data is untouched; only the missing-data case changes.

Option 1 is the smaller, safer change and is my recommendation; option 2 preserves more signal where hours_worked_last_week exists.

Guard (optional, complementary)

A test asserting the model does not treat a fully-defaulted hours column as universal WR compliance would catch regressions of this class.

Refs: populace #613, #626, #242, #248.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions