Observed. Since #1006 merged (2026-09-25), every licensed spine built at main's head blocks at the transferred phase on uk_stage_student_loans_realization, worst absolute realization deviation 1.1021725784754537 against the declared maximum 1.0. Seen on the #901 rebase A/B at 8f628b1, on today's spine at 937aca4, and on the #1012 lane's control, reorder, housing and final spines (built under a local relaxation of the threshold to 2.0). Spine-u on 2026-09-23, before #1006, passed with 0.297. The value is identical across the #1012 lane's spines, so the SPI-first reorder did not move it.
What the gate measures. assign_student_loan_plans (uk_runtime/student_loans.py) assigns reported plans from repayments and course start year, then tops up PLAN_5 and PLAN_2 towards the pinned SLC liable stocks for the calibration year (PLAN_2025_STOCKS: PLAN_5 10,000, PLAN_2 8,940,000). The top-up is a Bernoulli draw over the eligible pool at rate = shortfall / eligible_mass with identity-keyed uniforms. The gate (stage_health, check student_loan_plans) compares the realised top-up mass with the expected top-up mass rate * eligible_mass and refuses above a relative deviation of 1.0. It does not compare the final plan count with the stock.
Why PLAN_5 fails, on the licensed spine at 937aca4. Reported PLAN_5 in England already 9,183 of the 10,000 stock, so the shortfall is 817; eligible mass 136,538, so the rate is 0.006; the draw realised 2 rows with combined weight 1,718 against the expected 817, a deviation of +1.10. A shortfall of 817 people is about one survey person's weight, so any integer outcome of the draw is off by around 100% (zero rows −100%, two rows +110%), and the outcome is deterministic because the uniforms are keyed to person ids. The final England count is 10,901 against the 10,000 stock (+9%), which is a perfectly acceptable result the gate does not look at. What #1006 changed is the reported PLAN_5 mass (the band-donor persons), which shrank the shortfall into the one-or-two-rows regime.
What the gate hides on PLAN_2. PLAN_2 passes with deviation 0 only because its rate saturates at 1.0: the shortfall is 7.5M but the eligible pool holds 2.0M, so every eligible person is taken and the increment is deterministic. Its final England count is 3.43M against the 8.94M stock, 62% short, and the gate is silent about it. So the gate reports Bernoulli noise for the small plan and nothing for the large one; neither reading is stock attainment.
Proposed fix (stage and gate, on main).
- Stage: realise a shortfall deterministically rather than by a Bernoulli draw, for example taking eligible persons in uniform order until the cumulative weight reaches the shortfall (deviation bounded by one person's weight, identity-keyed reproducibility kept); or skip a top-up whose shortfall is below one median person weight and record it in the receipt.
- Gate: measure the final England count against the stock with a stated tolerance instead of the increment's realisation. That also surfaces the PLAN_2 attainment question, which is a data question about what the SLC liable stock counts (all liable borrowers, including those not repaying) against what the FRS can carry.
Receipts. experiments/901-uk-main-rebase-receipts.md R1 and R7 on #901; the per-plan receipts above come from the stage evidence of the #901 smoke run. The #1014 lane builds its spines under an uncommitted relaxation of the threshold; #901 did the same for its smoke run. Nothing on any branch changes the gate.
Observed. Since #1006 merged (2026-09-25), every licensed spine built at main's head blocks at the transferred phase on
uk_stage_student_loans_realization, worst absolute realization deviation1.1021725784754537against the declared maximum1.0. Seen on the #901 rebase A/B at 8f628b1, on today's spine at 937aca4, and on the #1012 lane's control, reorder, housing and final spines (built under a local relaxation of the threshold to 2.0). Spine-u on 2026-09-23, before #1006, passed with 0.297. The value is identical across the #1012 lane's spines, so the SPI-first reorder did not move it.What the gate measures.
assign_student_loan_plans(uk_runtime/student_loans.py) assigns reported plans from repayments and course start year, then tops up PLAN_5 and PLAN_2 towards the pinned SLC liable stocks for the calibration year (PLAN_2025_STOCKS: PLAN_5 10,000, PLAN_2 8,940,000). The top-up is a Bernoulli draw over the eligible pool atrate = shortfall / eligible_masswith identity-keyed uniforms. The gate (stage_health, checkstudent_loan_plans) compares the realised top-up mass with the expected top-up massrate * eligible_massand refuses above a relative deviation of 1.0. It does not compare the final plan count with the stock.Why PLAN_5 fails, on the licensed spine at 937aca4. Reported PLAN_5 in England already 9,183 of the 10,000 stock, so the shortfall is 817; eligible mass 136,538, so the rate is 0.006; the draw realised 2 rows with combined weight 1,718 against the expected 817, a deviation of +1.10. A shortfall of 817 people is about one survey person's weight, so any integer outcome of the draw is off by around 100% (zero rows −100%, two rows +110%), and the outcome is deterministic because the uniforms are keyed to person ids. The final England count is 10,901 against the 10,000 stock (+9%), which is a perfectly acceptable result the gate does not look at. What #1006 changed is the reported PLAN_5 mass (the band-donor persons), which shrank the shortfall into the one-or-two-rows regime.
What the gate hides on PLAN_2. PLAN_2 passes with deviation 0 only because its rate saturates at 1.0: the shortfall is 7.5M but the eligible pool holds 2.0M, so every eligible person is taken and the increment is deterministic. Its final England count is 3.43M against the 8.94M stock, 62% short, and the gate is silent about it. So the gate reports Bernoulli noise for the small plan and nothing for the large one; neither reading is stock attainment.
Proposed fix (stage and gate, on main).
Receipts.
experiments/901-uk-main-rebase-receipts.mdR1 and R7 on #901; the per-plan receipts above come from the stage evidence of the #901 smoke run. The #1014 lane builds its spines under an uncommitted relaxation of the threshold; #901 did the same for its smoke run. Nothing on any branch changes the gate.