Verified gap (Max, 7/21): the three SSA age-band recipient counts (under-18 / 18–64 / 65+, December 2024: 1,001,922 / 3,905,779 / 2,382,142) exist only as hardcoded constants in ssi_take_up.py (US_SSI_TAKE_UP_AGE_TARGETS) driving the assignment machinery — they were never minted as ledger facts nor bound as calibration targets. The registry's SSA SSI surface today: ssi_recipients national+state totals, ssi_total national dollars, ssi_state_payments state dollars; the supplement's aged/blind/disabled category sub-rows stay reviewed-exclusions (engine models no category split — that reasoning does NOT apply to age, which the frame carries directly).
Work: (1) ledger — mint the SSA SSI recipients-by-age table (the source the constants were copied from) as a package with oracle-verified rows; (2) populace — age-band indicator targets on the take-up flag (the reference builder needs age-bound metadata like the AGI-band slices already carry); (3) delete the constants with #469's machinery removal — the bands live in the registry like every other count, and the scorecard reports their misses. Should have been targets even under the old contraption; mandatory once take-up is plain Bernoulli (#469).
Verified gap (Max, 7/21): the three SSA age-band recipient counts (under-18 / 18–64 / 65+, December 2024: 1,001,922 / 3,905,779 / 2,382,142) exist only as hardcoded constants in
ssi_take_up.py(US_SSI_TAKE_UP_AGE_TARGETS) driving the assignment machinery — they were never minted as ledger facts nor bound as calibration targets. The registry's SSA SSI surface today:ssi_recipientsnational+state totals,ssi_totalnational dollars,ssi_state_paymentsstate dollars; the supplement's aged/blind/disabled category sub-rows stay reviewed-exclusions (engine models no category split — that reasoning does NOT apply to age, which the frame carries directly).Work: (1) ledger — mint the SSA SSI recipients-by-age table (the source the constants were copied from) as a package with oracle-verified rows; (2) populace — age-band indicator targets on the take-up flag (the reference builder needs age-bound metadata like the AGI-band slices already carry); (3) delete the constants with #469's machinery removal — the bands live in the registry like every other count, and the scorecard reports their misses. Should have been targets even under the old contraption; mandatory once take-up is plain Bernoulli (#469).