Skip to content

Fix state pension reforms having no budget impact (#1178)#1509

Open
MaxGhenis wants to merge 2 commits intomainfrom
fix-state-pension-reform
Open

Fix state pension reforms having no budget impact (#1178)#1509
MaxGhenis wants to merge 2 commits intomainfrom
fix-state-pension-reform

Conversation

@MaxGhenis
Copy link
Collaborator

Summary

  • State pension parameter reforms now correctly affect budget impact
  • basic_state_pension and additional_state_pension formulas now respond to parameter changes at the simulation period

Root cause

basic_state_pension read parameters(data_year) instead of parameters(period). The formula fetched the parameter at the survey data year and applied a fixed triple-lock uprating, so reforms to the parameter for the simulation year were never seen. Same issue in additional_state_pension.

Fix

Both formulas now compute a reform ratio: parameters(period).amount / parameters(data_year).amount applied as a multiplier on top of the triple-lock-uprated amount. If no reform is active, the ratio is 1.0 (no change). If a reform modifies the parameter, the ratio adjusts the output accordingly.

Test plan

  • New test: halving basic_state_pension.amount halves the pension output
  • Test fails on old code, passes on fix
  • All existing tests pass

Fixes #1178

MaxGhenis and others added 2 commits February 23, 2026 13:58
basic_state_pension and additional_state_pension read parameters at
data_year using node-level access (parameters(instant).path.amount),
which doesn't reflect parameter reforms. Fixed by:

1. Using leaf-level access (parameters.path.amount(instant)) which
   correctly reflects reforms applied to the parameter tree.
2. Computing each person's share of the maximum at data_year, then
   applying that share to the (possibly reformed) maximum at the
   simulation period — replacing the manual triple-lock uprating.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Copy link
Collaborator

@vahid-ahmadi vahid-ahmadi left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I write it in a new comment (below)

Copy link
Collaborator

@vahid-ahmadi vahid-ahmadi left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1. new_state_pension has the same bug

new_state_pension.py:18 uses node-level access (parameters(period).gov.dwp...), which I verified empirically does not see reforms — same root cause fixed here. Currently dormant (£0 in baseline) but trivial to fix with the same leaf-level pattern.

2. additional_state_pension baseline changes should be documented

The old formula had no uprating; the new one adds bsp(period) / bsp(data_year) (~1.26x at 2029). This increases baseline additional SP by ~26% (~£5bn) and is what shifts the UC taper expected impact from -34.3 to -42.0. Adding uprating is arguably correct (real additional SP is CPI-uprated), but the PR description says the ratio is 1.0 when no reform is active — that only holds when data_year == period. Worth acknowledging as an intentional improvement.

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.

Decreasing state pension amount has no budget impact

2 participants