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)
- 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.
- 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.
Summary
weekly_hours_worked_before_lsris a pure input withdefault_value = 40and 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 = TRUEfor 0-hour adults purely because the input defaulted to 40.Proposed hardening (pick one)
default_valueto 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.weekly_hours_worked_before_lsrfromhours_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_weekexists.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.