Align SSI take-up band goals to the national recipients total and publish a fresh pair#430
Merged
Merged
Conversation
…lish a fresh pair The post-calibration SSI take-up reconciliation could not converge. Each pass fixed the take-up flags on one weight surface, refit the household weights to the age-blind national/state ssi_recipients targets, then gated the frozen flags on the drifted weights. Two official totals were enforced simultaneously to one-unit precision -- the registry national ssi_recipients count (7,404,820) and the SSA federal-payment-by-age band sum (7,289,843), ~115k apart -- so no fixed point existed. The frozen flags on the refit weights overshot the age bands (attempt 6: ~197k over a ~42,613 allowance) and failed count-faithfulness after three passes. Piece 1 -- align the totals. Before the loop, extract the registry's national ssi_recipients target (role SSA_SSI_RECIPIENTS_TARGET_ROLE, national grain; fails closed if absent) and rescale the SSA recipient age shares onto it, so the greedy count-match and the calibration pursue one recipient measure. Both raw totals and the rescale are recorded in the reconciliation compilation. Piece 2 -- fresh-pair exit. After the refit, re-assign take-up under the returned weights (count-faithful by construction) instead of gating the frozen flags, replay the SSI dependency tail on the fresh flags, gate the fresh pair, and bound how far the re-assignment moved aggregate recipient mass with a national swap delta (|fresh - stale| <= one source-identity weight per band). The measured bound is the honest replacement for the retired "never rewrite the flags after optimization" freeze invariant; Medicaid enrolled-mass swap deltas are recorded per state. The dense arm reaches reconciliation through the same function, so it is fixed too. Tests: totals extraction fails closed without a national spec; the rescale applies shares to the national total; the swap delta bounds/flags the national move; the exit publishes the fresh pair on drifted weights where the stale pair fails (verified failing under the retired stale-pair gate); a national swap breach fails closed after the bounded passes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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.
Build M sparse attempt 6 ran the full 127-minute pipeline — take-up battery, parity, materialization, target assembly, complete calibration solve — and failed at post-calibration take-up reconciliation after 3 passes (SSI 18-64 selected 4,102,760 vs goal 3,905,779; 65+ 2,636,756 vs 2,382,142; Medicaid state 22 over by 432 people beyond allowance).
Two root causes, both proven:
The fix:
_registry_national_ssi_recipients_total); both raw totals and the rescale ship in the reconciliation compilation record.Verification: teeth test fails under the old stale-pair gating with identical fakes and passes under the fresh-pair exit; totals-extraction fails closed without a national spec; rescale math pinned; 109 tests in the builder suite + full SSI take-up suite green; CI-ruff and format clean.
Diagnosis and implementation by the Build M runner agent (instrumented reproduction, per-band decomposition); design adjudicated by the coordinator. Follow-ups tracked: #424 (candidate undercount — the root amplifier), age-banded registry targets for architecture week.
🤖 Generated with Claude Code