Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Changed `yoy_growth.triple_lock` to use the previous year's September CPI and May-July AWE inputs rounded to 0.1 percentage points before taking the maximum of the included elements and configured floor, including CPI forecast gaps for observation years 2026–2030 and earnings forecast gaps for 2027–2030, with April 2027 determined by the provisional 3.9% earnings input; `triple_lock.outturn` is null from 2012, the generated uprating series runs through April 2074 and follows rounded lagged calendar-year earnings from April 2035 under the stored baseline, and basic and new State Pension levels are about 0.48% higher in 2027–2034 than under the previous baseline, with a growing gap thereafter and the 2027-onward changes provisional until the October 2026 labour market release.
1 change: 1 addition & 0 deletions changelog.d/triple-lock-statutory-inputs.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add an optional State Pension earnings-path guarantee (`gov.dwp.state_pension.triple_lock.earnings_path_guarantee`), so reforms that keep the pension in line with earnings over time, such as one reading of the plan announced in September 2026, can be modelled as parameter changes. Off under current law.
1 change: 1 addition & 0 deletions changelog.d/triple-lock-statutory-inputs.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Computed the State Pension triple lock from September CPI and May-July AWE total pay growth used in each uprating review, followed by OBR September CPI and Q2 earnings forecasts and then calendar-year growth, with macro scenarios moving those forecasts and `active: false` leaving non-negative earnings growth; April 2027's 3.9% rise and projected £250.71 new State Pension weekly rate use the 15 September 2026 first earnings estimate and stay provisional until the October labour market release, the vintage the review uses.
2 changes: 1 addition & 1 deletion docs/book/assumptions/nowcasting-comparison.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ earnings index.
| Aspect | Resolution Foundation | PolicyEngine UK |
|-------|------------------------|-----------------|
| Working-age benefits | Uses statutory uprating with explicit overrides for announced policy (e.g. CoL Payments, benefit freezes). | Same approach. Parameters under `gov/dwp/` and `gov/hmrc/child_benefit/` track legislated rates; ad hoc payments live under `gov/treasury/cost_of_living_support`. |
| State Pension | Models the triple lock explicitly, using its own internal earnings/CPI forecasts. | Models the triple lock via `gov/dwp/state_pension/triple_lock/*.yaml`; the uprating value tracks announced DWP rates with a fallback to the maximum of earnings, CPI and the 2.5% floor. |
| State Pension | Models the triple lock explicitly, using its own internal earnings/CPI forecasts. | Models the triple lock from its statutory inputs (September CPI, May-July AWE total pay growth, 2.5% floor) in `gov/economic_assumptions/statutory_uprating_inputs/` and `gov/dwp/state_pension/triple_lock/`, forecast from the OBR's September CPI and Q2 earnings growth to the end of the EFO and calendar-year growth after; see the State Pension page. |

### Take-up

Expand Down
159 changes: 146 additions & 13 deletions docs/book/programs/gov/dwp/state-pension.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,19 +36,152 @@ before or on/after 6 April 2016.

State Pension flat-rate parameters live in
`gov/dwp/state_pension/basic_state_pension/amount.yaml` and
`gov/dwp/state_pension/new_state_pension/amount.yaml`. Both are uprated
under the **triple lock**: the maximum of earnings growth, CPI
inflation, or the 2.5% floor parameterised at
`gov/dwp/state_pension/triple_lock/minimum_rate.yaml`. Active components
of the triple lock are controlled by:

- `triple_lock/active.yaml` — top-level toggle.
- `triple_lock/include_earnings.yaml` — whether the earnings limb is
active.
- `triple_lock/include_inflation.yaml` — whether the CPI limb is active.

These flags exist so that policy reforms can disable individual limbs
(e.g. "double lock" scenarios that drop the earnings or inflation limb).
`gov/dwp/state_pension/new_state_pension/amount.yaml`. Published rates run
to 2026-27; later years are uprated by
`gov.economic_assumptions.indices.triple_lock`, built from the yearly rates
in `gov.economic_assumptions.yoy_growth.triple_lock`.

### The triple lock

The rise each April is the highest of:

- **earnings growth**: average weekly earnings, total pay, whole economy, in
May to July of the previous year on a year earlier (ONS KAC3);
- **CPI inflation**: the 12-month rate in September of the previous year
(ONS D7G7);
- **2.5%**: `triple_lock/minimum_rate.yaml`.

`create_triple_lock.py` computes each element from these statutory inputs,
rounded to the one decimal place the ONS publishes. From them it reproduces
every published rise from April 2012 to April 2026. April 2011 is the one
override (`triple_lock/outturn.yaml`): the basic State Pension rose by
September 2010 RPI (4.6%) during the switch to CPI. The April 2022
suspension of the earnings element is `include_earnings` set to false for
that year.

The yearly rates run from April 2011 to one year past the end of the
economic-assumption series.

### The statutory inputs

`gov.economic_assumptions.statutory_uprating_inputs` holds:

- `cpi_september`: September CPI, keyed to 1 September;
- `awe_total_pay_may_july`: May-July earnings growth, keyed to 1 July, as
used in the uprating review.

Each holds published figures and then a null. From the null onwards,
`create_statutory_uprating_inputs.py` fills in a forecast: calendar-year
growth in the matching OBR series (`yoy_growth.obr.consumer_price_index` or
`yoy_growth.obr.average_earnings`) plus `forecast_gap`. The gap is the OBR's
statutory-basis forecast minus the calendar-year growth stored in
`yoy_growth.yaml`, so that in the baseline the input equals the OBR's figure:

- September CPI: the OBR's September CPI forecast (receipts Table 3.19, the
CPI used to uprate tax thresholds), or Q3 CPI (economy Table 1.7) in years
that table does not cover;
- May-July earnings: Q2 average earnings growth (economy Table 1.6). The
OBR does not forecast the ONS AWE series; its measure is wages and
salaries per employee, and Q2 is the quarter nearest May to July.

After the EFO horizon the gap is zero, so the inputs follow calendar-year
growth. Smooth forecasts pay the higher of earnings, CPI and 2.5% each year,
so the baseline has none of the extra cost the triple lock builds up when
September CPI and May-July earnings take turns to spike; the OBR's long-run
projections add 0.56 percentage points a year over earnings for it (Fiscal
risks and sustainability, July 2026). To capture it, supply simulated paths
of the statutory inputs, as below.

`policyengine_uk/utils/import_obr_forecasts.py` regenerates the gaps with the
calendar-year series, from the EFO economy and receipts tables
(`--receipts-file` or `--receipts-url`). After editing `yoy_growth.yaml` by
hand, run it with `--gaps-only`.

### Scenarios

A macro scenario applied before the data load that edits calendar-year
growth moves the forecast inputs one for one, and so the triple lock.
Calendar-year series are keyed to 1 January, so key the change
`year:YYYY-01-01:1`: a bare year names the fiscal year from 6 April, which
lands in the next calendar-year value and so moves the following year's
inputs.

```python
from policyengine_uk.model_api import Scenario

scenario = Scenario(
parameter_changes={
"gov.economic_assumptions.yoy_growth.obr.average_earnings": {
"year:2027-01-01:1": 0.05,
},
},
applied_before_data_load=True,
)
```

A scenario can also set the statutory inputs directly, for example from a
model of the monthly series, since the triple lock pays out on how September
CPI and May-July earnings differ from each other. A value replaces the
forecast for that year only; a bare year names the fiscal year from 6 April,
which contains both observation dates:

```python
Scenario(
parameter_changes={
"gov.economic_assumptions.statutory_uprating_inputs.cpi_september": {
"2027": 0.031,
},
"gov.economic_assumptions.statutory_uprating_inputs.awe_total_pay_may_july": {
"2027": 0.024,
},
},
applied_before_data_load=True,
)
```

These changes, and the reform levers below, must go through
`Scenario(parameter_changes=...)`. The rates are built when parameters are
processed, and a `reform=` dictionary edits parameters after that, so it
changes the parameter but not the uprating.

### Reform levers

- `triple_lock/minimum_rate.yaml` sets the floor. A double lock, the higher
of earnings and CPI, is the floor set to 0 (or below 0 to allow cash
cuts).
- `triple_lock/include_earnings.yaml` and
`triple_lock/include_inflation.yaml` drop an element but keep the floor.
A CPI link is `include_earnings` false with the floor at or below 0.
- `triple_lock/active.yaml` switches the triple lock off. The pension then
rises by the statutory minimum from the review under the Social Security
Administration Act 1992, section 150A: earnings growth, and nothing when
earnings fall. The floor and the include flags no longer apply, and
neither do the one-year changes to section 150A for April 2021 and April
2022.
- `triple_lock/earnings_path_guarantee.yaml` (off under current law) keeps
the pension on or above an earnings path started from its level in the
year before the guarantee first applies. With `include_earnings` false,
it models a plan that drops the earnings element of the triple lock but
keeps the pension in line with earnings over time. The plan announced on
29 September 2026 gave no formula; one reading, from April 2030, is:

```python
Scenario(
parameter_changes={
"gov.dwp.state_pension.triple_lock.include_earnings": {
"year:2030-01-01:100": False,
},
"gov.dwp.state_pension.triple_lock.earnings_path_guarantee": {
"year:2030-01-01:100": True,
},
},
applied_before_data_load=True,
)
```

Each guaranteed year, the rise is the highest of the triple lock elements
still included and the rise needed to reach the earnings path, rounded up to
0.1 percentage points.

## Known aggregate gap (#1632)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ metadata:
unit: currency-GBP
label: Basic State Pension amount
uprating: gov.economic_assumptions.indices.triple_lock
documentation: Projected weekly State Pension rates are not rounded to 5p; SSAA 1992 s.150A(4) permits discretionary rounding up or down (https://www.legislation.gov.uk/ukpga/1992/5/section/150A/4).
reference:
- title: House of Commons Library
href: https://researchbriefings.files.parliament.uk/documents/SN05649/SN05649.pdf
href: https://researchbriefings.files.parliament.uk/documents/SN05649/SN05649.pdf
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ metadata:
unit: currency-GBP
label: New State Pension amount
uprating: gov.economic_assumptions.indices.triple_lock
documentation: Projected weekly State Pension rates are not rounded to 5p; SSAA 1992 s.150A(4) permits discretionary rounding up or down (https://www.legislation.gov.uk/ukpga/1992/5/section/150A/4).
reference:
- title: House of Commons Library
href: https://researchbriefings.files.parliament.uk/documents/SN05649/SN05649.pdf
href: https://researchbriefings.files.parliament.uk/documents/SN05649/SN05649.pdf
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
description: The triple lock is active if this value is true.
description: Whether the triple lock applies to the April uprating of the State Pension; without it, the pension rises by the statutory minimum, earnings growth, and not at all when earnings fall.
values:
2010-01-01: true
metadata:
documentation: Changes take effect through Scenario(parameter_changes=...), which rebuilds the uprating rates; a reform dictionary changes this parameter but not the rates.
unit: bool
label: Triple lock
label: Triple lock
reference:
- title: Social Security Administration Act 1992, section 150A
href: https://www.legislation.gov.uk/ukpga/1992/5/section/150A
Loading
Loading