Skip to content

Align SSI take-up band goals to the national recipients total and publish a fresh pair#430

Merged
MaxGhenis merged 1 commit into
mainfrom
reconciliation-aligned-exit
Jul 14, 2026
Merged

Align SSI take-up band goals to the national recipients total and publish a fresh pair#430
MaxGhenis merged 1 commit into
mainfrom
reconciliation-aligned-exit

Conversation

@MaxGhenis

Copy link
Copy Markdown
Contributor

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:

  1. Two official totals. The registry's national SSI-recipients target (7,404,820) and the take-up stage's SSA age-band sum (7,289,843) differ by ~115k — different SSA measures. Enforced simultaneously to one-source-identity precision on ~4M of modeled candidate mass (SSI candidate undercount: modeled eligible mass far below SSA recipient counts #424), the fixed-point iteration has no fixed point.
  2. Stale-pair gating. Each pass assigns flags under pre-refit weights, refits against the age-blind national/state targets, then gates the frozen flags against the drifted weights — a pair the loop structurally never makes self-consistent. Instrumentation on the harvested target-frame checkpoint proved a single assignment call is always within one source-identity weight of its goal; the 197k overshoot was manufactured between assignment and check.

The fix:

  • Aligned totals: band goals become SSA age shares applied to the registry national total, extracted fail-closed from the compiled specs (_registry_national_ssi_recipients_total); both raw totals and the rescale ship in the reconciliation compilation record.
  • Fresh-pair exit with a measured invariant: after the final refit, one more assignment + health-tail replay under the returned weights; gates run on that self-consistent pair; and the freeze invariant's purpose (weights consistent with the targets they were solved against) is verified — the flag-swap's effect on selected recipient mass must stay within assignment granularity — instead of assumed by prohibition. Per-band deltas recorded; breach continues the loop or fails with the deltas in the terminal error.

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

…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>
@MaxGhenis MaxGhenis merged commit b3ab643 into main Jul 14, 2026
4 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