You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
UK bonus sacrifice: meet OBR's base at the final weights, not the stage's #1390
The salary_sacrifice stage imputes pension_contributions_via_bonus_sacrifice (#1340, #1383). It picks bonus sacrificers in the order of identity-keyed draws, until the engine's projection of the sacrificed bonuses above the £2,000 threshold at 2027-28 is nearest OBR's base. That base is £13.0bn (OBR supplementary forecast information, 5 February 2026, Table 1.1).
The stage measures the projection at its own weights, before calibration. On #1383's review arm, the base at the final weights falls short of OBR's line by more than a quarter. The column is the same in both files; only the weights move. Vahid flagged the risk in his review of #1383 (item 7).
Why
Calibration to the HMRC SPI income-band rows lowers the weights of the highest earners, and the bonus sacrificers sit mostly there:
a candidate must be paid at least the upper earnings limit;
the larger bonuses belong to the higher earners;
most of the sacrificers are rows of the SPI channel, and calibration lowers those the most.
No calibration row reads the bonus base, so nothing holds it. The salary route does not drift this way, because the HMRC salary-sacrifice rows bind it. The figures behind this diagnosis rest in part on the SPI channel's households, so they stay with the licensed data.
Proposal
Re-pick the bonus sacrificers after calibration, at the final weights. This is a post-calibration step that reruns convert_bonuses_to_bonus_sacrifice on the calibrated weights, with the same identity-keyed order and the same anchor.
The sacrifice sits beside pay, so no calibrated income moves.
The £2,000 NICs cap reads it only from April 2029.
First, check that no bound row reads the pension contributions it adds to, for example through the annual allowance tests.
Where the step does not run, keep the stage's selection.
The alternative is to bind the base during calibration, as a row deflated to 2025 by the anchor's growth factors. That needs a ruling, since the build refuses facts dated after the calibration year (_refuse_fact_after_target).
Until then
#1383's Phase B and C receipts record that the base holds at the stage's weights only. A costing of the bonus-sacrifice cap on a release built before this lands would understate the base.
Activity
Receipt arm 3: gates, fit, and the engine checks for items 7, 9, 14 a…