Skip to content

Record strike_benefits as a reviewed degenerate input - #993

Merged
MaxGhenis merged 1 commit into
mainfrom
us-strike-benefits-reviewed-exclusion
Sep 23, 2026
Merged

MaxGhenis merged 1 commit into
mainfrom
us-strike-benefits-reviewed-exclusion

Conversation

@MaxGhenis

Copy link
Copy Markdown
Contributor

strike_benefits joins US_DEGENERATE_INPUT_REVIEWED_EXCLUSIONS in tools/build_us_fiscal_refresh_release.py.

Why

Route A's fresh-base release run on 2026-09-23 (epic #956) refused at the pre-solve degenerate-input gate:

strike_benefits: every observed value equals the engine default (0)

alimony.py splits ASEC other income on OI_OFF: code 20 is alimony, code 12 is strike benefits, and everything else is miscellaneous income. policyengine-us-data's cps.py uses the same codes. The ASEC 2024 public use data dictionary confirms that OI_OFF 12 is "strike benefits", so the mapping is right. No respondent reports it. OI_OFF values in the three pinned official person files:

Person file (income year) Codes present Code 12 rows Code 20 (alimony) rows
pppub23 (2022) 0, 2-10, 13, 19, 20 0 88
pppub24 (2023) 0-5, 7-10, 13, 19, 20 0 76
pppub25 (2024) 0-4, 7, 9, 13, 19, 20 0 75

The PUF half carries no strike-benefit field. So the column is identically zero on the pinned sources, and the gate's documented remedy is a reviewed exclusion, not a code change.

Guard rails

  • The register's own rule still applies: if a later vintage has a code-12 reporter, the column stops being degenerate, the entry goes stale and the gate fails again.
  • test_strike_benefits_exclusion_rests_on_zero_code_12_reporters reads the three official archives when MICROCOSM_ASEC_ARCHIVE_DIR points at them. It asserts there are no code-12 rows and that the alimony code is still present, which catches a layout change. It passes locally against the pinned archives (sha256 d2e00025…, cdb39cda…, 318845a2…).

Route A builds from route-a-integration-20260923, which merges this branch with #991 and #992.

🤖 Generated with Claude Code

No respondent in the pinned public ASEC person files reports other-income
source OI_OFF == 12 ("strike benefits" in the ASEC 2024 public use data
dictionary): pppub23, pppub24 and pppub25 carry codes 0-10, 13, 19 and 20
only. The PUF half has no strike-benefit field, so alimony.py's code-12 split
is identically zero, and route A's fresh-base release (2026-09-23) refused
at the pre-solve degenerate-input gate: "strike_benefits: every observed
value equals the engine default (0)".

The mapping is right (policyengine-us-data uses the same code), so this is
the gate's documented remedy, a reviewed exclusion, not a code change. A
vintage with a code-12 reporter makes the entry stale and fails the gate.
An archive-gated test (MICROCOSM_ASEC_ARCHIVE_DIR) checks the zero-reporter
claim against the three official archives.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis
MaxGhenis marked this pull request as ready for review September 23, 2026 10:23
@MaxGhenis
MaxGhenis merged commit d9a248d into main Sep 23, 2026
23 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant