Repository navigation
Conversation
PolicyEngine-US rules that key on actual SSI receipt read (ssi > 0) | receives_ssi, but no US release carries receives_ssi, so every such rule depends on modeled take-up and imputed attributes alone. - cps_carried.reported_ssi_receipt: positive SSI_VAL, excluding a respondent whose only RESNSSI reasons are on behalf of a disabled or blind child (the child's payee). Refuses positive amounts without the reason columns. Broadcast to all months like the other receipt inputs. - Release input coverage: receives_ssi is a hard requirement with no reviewed exclusion; the gate also checks every marked person reports a positive SSI_VAL and carries takes_up_ssi_if_eligible. - Stacked ACS chain: the column joins the source_operator_cps_carried transfer family (surface 134 -> 135, early targets 48 -> 49); spec bundle, engine ABI lock and pool contracts regenerated with the repo's tools. - Tests: examples, Hypothesis properties for the producer and the consistency check, and coverage-contract tests. - Evidence: measured effect on the pinned default with PolicyEngine-US main and #10145 (docs/evidence/us-reported-ssi-receipt). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 18, 2026
Open
The added source_operator_cps_carried person boolean moves the reviewed inventories that pin the US spec surface: field-usage pointer pins and counts (+23 authored fields), the F0 inventory hashes (stacked authority, early families, gap-fill schedule, checkpoint identity), the coverage report, the legacy pool publication manifest golden, and the counts in the multispine, battery, head-to-head, compiler-IR and lineage tests. Every moved value was recomputed by the code that asserts it; the late, tail and calibration authority components are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review (Sol r1) found the stacked ACS chain QRF-transferred receives_ssi although ACS measures SSI receipt itself, and that a transferred ACS receipt need not carry the CPS take-up anchor. - ACS rows: map_acs_native_inputs maps receives_ssi from positive SSIP, and the pool lists it as complete on both spines, so it is never a transfer target. This reverts the stacked-surface re-pins (134 targets again); only the pool's engine-input provisioning and checkpoint identity move. - Consistency gate: the amount arm uses SSI_VAL on CPS rows and native ssi_reported on ACS rows; the take-up arm judges CPS-measured rows, which the take-up stage anchors, and counts ACS rows. - Preflight: receipt-consistency failures are at risk on the L0 path, certain on the full pool, and keep their counts. - Payee rule is order-free across RESNSSI1/RESNSSI2, with an independent test oracle. - Evidence README: correct the claim that the two engine trees differ only in Colorado. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- ACS SSIP: refuse a blank at age 15 or older (blank only below the income universe is no receipt) and record the universe count in the native receipt; the operator boundary accepts that declared extra key for receives_ssi only. - Consistency check: count ACS receipt rows without take-up separately, and fail receipt when the table carries neither SSI_VAL nor ssi_reported. - Tests: receives_ssi is never a pool transfer target and is native on the legacy ACS multispine chain. - Text: manifest note, local-release coverage note, waiver flag help, and the take-up anchor wording (physical ASEC source identities). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
PolicyEngine-US rules that key on actual SSI receipt read
(ssi > 0) | receives_ssi. Examples are state supplements, the Medicaid SSI categories, SNAP categorical eligibility, Head Start, and county GA exclusions. Colorado's AND-CS joins them once PolicyEngine/policyengine-us#10145 merges. No US release carriesreceives_ssi, so every one of these rules depends only on modeled SSI. This PR makes the base build carry the survey fact, and makes the release coverage gate require it.Draft until Max rules on the methodology question below (d1675). Merging changes what the next national default carries. Nothing here touches a published release.
What changes
Producer.
cps_carried.reported_ssi_receiptmarks a person whenSSI_VAL > 0and at least one reported reason is their own (or none is recorded).RESNSSIreasons are "on behalf of a disabled/blind child" (codes 3 and 4) are payees, not recipients, so they are not marked. That is 133 rows and 0.45M weighted people on the pinned default.receives_snap,receives_tanfandreceives_wic.ssiinput would replace the federal formula for every reporter, so SSI reforms would stop moving them.ssi_reportedis deprecated and feeds nothing.Release gate.
receives_ssiis a required coverage input with no reviewed exclusion (US_ASEC_REPORTED_SSI_RECEIPT_REQUIRED_INPUTS).us_release_input_coverage_gatealso checks two invariants:SSI_VALon CPS rows, nativessi_reportedon stacked ACS rows;takes_up_ssi_if_eligible. The take-up stage anchors CPS reporters only, so ACS rows are counted, not judged.Release preflight treats these row-dependent failures as at risk on the L0 path and as certain on the full pool.
ACS rows (multispine pool and ACS local chain).
map_acs_native_inputsmapsreceives_ssinatively from a positiveSSIP(blank below age 15 is no receipt). The pool lists it as complete on both spines (_POOL_NATIVE_COMPLETE_OUTPUTS), so it is never a QRF transfer target, and the stacked surface stays at 134 targets.tools/repin_us_pool_engine_contracts.pyandtools/spec_engine_coverage.py.tools/build_us_release_input_coverage_manifest.py.Docs.
docs/us-reported-ssi-receipt.md, plus measured evidence indocs/evidence/us-reported-ssi-receipt/(aggregates only).Invariants (property-tested with Hypothesis)
SSI_VAL.SSI_VALor the take-up anchor.SSI_VAL, with the take-up stage's anchor, always passes the check.Measured effect (pinned default
populace_us_2024.h5, 2026; fixed-weight sensitivity)Method and full tables are in
docs/evidence/us-reported-ssi-receipt/README.md.fab18b7d6band #10145f450d4ab00, run on every household with a reporter plus every Colorado household.receives_ssiis a person input with no cross-household interaction, so these deltas are the national deltas. The run checks this on Colorado's non-reporter households, whose deltas are exactly zero.receives_ssiNearly all of this comes from reporters whom the model pays $0. They are treated as SSI recipients for categorical purposes while their modeled SSI income stays $0. Of 5.15M own-reason reporters, the model pays 2.79M. The other 2.35M get nothing for these reasons:
meets_ssi_disability_criteriaanchor, although they carrySSI_VALand the take-up anchor. Anchoring them would add $6.2B of federal SSI before take-up recalibration.Main's $233M Colorado supplement goes to 11 records, none of which reports SSI. They are modeled-eligible non-claimants, so reported receipt restores none of it.
Methodology choice for Max (d1675)
More than one reading is defensible, so this is queued as a decision. There are two separate axes.
A. CPS rows (the national default):
B. ACS rows (stacked and local-area releases only; the national default has none):
Recommendation: A1 + B1. The receipt is a leaf survey fact that the raw-only doctrine carries. The disagreements come from imputed attributes, fixed where they arise (#1313–#1315, #1317).
Review
Round 1 (GPT-6.1 Sol,
dd6e51791) asked for changes; all five findings are addressed in1466d4195:Round 2 (Sol,
1466d4195) found all five round-1 findings resolved and asked for six smaller changes. They are addressed in902c6d2d8:Verification
ruff check .passes.python3 tools/ci_test_plan.py verifypasses.test_us_reported_ssi_receipt(new),test_us_stacked_spine,test_us_spine_blindness,test_us_puf_support,test_us_acs_transfer,test_us_plan,test_release_input_coverage,test_spec_engine_typed_closure.tools/generate_us_bundle_from_constants.py --checkand--engine-lock-only --checkpass.tools/repin_us_pool_engine_contracts.pyreports current.Follow-ups filed
is_disabled) treat on-behalf-of-child payees as disabled SSI claimants. The model pays 0.16M of them $1.5B.axiom: n/a: Microcosm data input, no rules change.
🤖 Generated with Claude Code