Skip to content

bsp_reported is CPI-uprated but BSP rates are frozen, and the variable is mostly War Widow's Pension #2381

Closed

Description

@vahid-ahmadi

Summary

bsp_reported is projected forward with CPI, but Bereavement Support Payment (BSP) rates have been frozen since BSP started on 6 April 2017. The catch is that bsp_reported is not only BSP. Both data pipelines build it from FRS benefit codes 6 and 9, and code 9 is War Widow's/Widower's Pension, which is uprated by CPI every April. In the FRS 2024-25 microdata, code 9 is about 90% of the value of bsp_reported. So simply freezing the variable would make the projection worse, not better.

The fix is to split the war widow's pension out into its own CPI-uprated variable, and then freeze BSP once the datasets populate the split.

The law

The model

  • policyengine_uk/data/uprating_indices.yaml:42 lists bsp_reported under gov.economic_assumptions.yoy_growth.obr.consumer_price_index, which is what projects the dataset column forward.
  • policyengine_uk/variables/gov/dwp/bsp_reported.py also declares uprating = "gov.economic_assumptions.indices.obr.consumer_price_index". policyengine-uk-data builds storage/uprating_factors.csv from that attribute, so its bsp_reported row is CPI too (1.0 in 2020 rising to 1.38 by 2029).
  • There is no formula for BSP and there are no BSP rate parameters. bsp (policyengine_uk/variables/gov/dwp/bsp.py:11) is just adds = ["bsp_reported"].
  • bsp feeds household_benefits (and so household_net_income), hbai_benefits, hbai_household_net_income, gov_spending, pre_budget_change_household_benefits and the disable_simulated_benefits reform.

What the FRS codes are

The FRS 2024-25 benefits data dictionary labels code 6 "Bereavement Support Payment / Widowed Parent's Allowance" and code 9 "War Widow's/Widower's Pension". Both pipelines sum the two:

  • policyengine-uk-data policyengine_uk_data/datasets/frs.py:1464: benefits.benefit.isin((6, 9))
  • microcosm packages/microcosm-build/src/microcosm/build/uk_runtime/frs_spine.py:825: benefit.isin((6, 9))

Grossed with gross4, the raw FRS 2024-25 benefits table gives:

FRS code Weekly amount Weighted recipients Annual £m What it is
6 £23.01 31,400 37.6 BSP standard rate (£100 a month)
6 £80.55 14,800 62.0 BSP higher rate (£350 a month)
6 £148.40 2,000 15.8 WPA 2024/25 standard rate
6 other 2,600 7.2 unclear
9 various 141,600 1,076.8 War Widow's/Widower's Pension
Total 1,199.4

So about £100m (8%) of the reported total is BSP at the frozen rates, and about £1,093m (91%) is WPA and war widow's pension, both of which are uprated by CPI. The 141,600 grossed code 9 recipients look high for the war widow's caseload, so part of code 9 may be misreported survivors' pensions, but those are also uprated. BSP lump sums are not captured in either code; that is out of scope here.

VAR2 on code 6 rows is meant to carry the Wid question (1 BSP, 2 WPA), but in the 2024-25 EUL file it does not line up with the amounts (most £23.01 rows have VAR2 = 2), so an amount-based or admin-based split may be safer than VAR2.

Size of the effect

The CPI index in the parameters rises by a factor of 1.1225 from 2024 to 2029 (OBR year-on-year growth 3.4%, 2.3%, 2.0%, 2.0%, 2.0% for 2025 to 2029). Every pound of BSP in a 2024 dataset is therefore shown as £1.12 in 2029-30, when it should still be £1.00.

On the enhanced FRS 2024-25 dataset, bsp_reported totals £731.4m in 2024 and £840.2m in 2029 (about £92m of that rise is the CPI projection; the rest is weight growth). Using the raw FRS shares above:

  • Keep CPI on the combined variable (status quo): the BSP part, about 8%, is overstated by about £8m in 2029-30.
  • Freeze the combined variable: everything else, about 92% and almost all war widow's pension and WPA, is understated by about £84m in 2029-30.

Freezing the whole variable now would swap an £8m error for one ten times larger.

Proposed fix

  1. policyengine-uk (this repo). Add war_widows_pension_reported (CPI-uprated, listed in uprating_indices.yaml) and war_widows_pension, and add war_widows_pension to every aggregate that lists bsp. Document on bsp_reported that it currently holds FRS codes 6 and 9, and that it stays on CPI until the datasets split code 9 out. Existing datasets have no war_widows_pension_reported column, so results do not change.
  2. policyengine-uk-data and microcosm. Write code 9 to war_widows_pension_reported and only code 6 to bsp_reported. Ideally also move WPA (the code 6 rows at the WPA rate) out of bsp_reported, for example into its own variable, so that bsp_reported is BSP only.
  3. policyengine-uk, follow-up. Once released datasets carry the split, drop bsp_reported from the CPI list in uprating_indices.yaml and remove its uprating attribute, so BSP stays at the 2017 rates. Then regenerate uprating_factors.csv in policyengine-uk-data, which will drop the bsp_reported row.

Freezing in step 3 before step 2 lands would put the £84m error above into results, so the order matters.

🤖 Generated with Claude Code

Activity

  1. added 2 commits that reference this issue on Oct 12, 2026
    62b3eb1
    f1a01e4
  2. vahid-ahmadi commented on Oct 23, 2026

    @vahid-ahmadi
    CollaboratorAuthor

    Status, 23 Oct 2026: step 1 is done in #2382, which added war_widows_pension_reported and war_widows_pension with CPI uprating. Freezing BSP (step 3) waits for the datasets to split FRS code 9 out of bsp_reported: PolicyEngine/policyengine-uk-data#578 and PolicyEngine/microcosm#1222, both still open.

    🤖 Generated with Claude Code

  3. juaristi22 commented on Oct 24, 2026

    @juaristi22
    Collaborator

    Step 2 is now done on the Microcosm side:

    • Microcosm's UK frame already writes FRS code 9 to war_widows_pension_reported.
    • From Lock policyengine-uk 2.151.0 and write the UK inputs it reads (#1095, #1278) microcosm#1383, it also splits code 6 by rate:
      • an amount within 1% of a Bereavement Support Payment rate's weekly equivalent stays in bsp_reported;
      • an amount at Widowed Parent's Allowance's 2024-25 rate (£148.40 a week, within 1%), or below it as a reduced award, goes to widowed_parents_allowance_reported (2.149.0);
      • any other amount, above that rate and at no BSP rate, stays in bsp_reported.

    So in Microcosm releases built from that PR, bsp_reported holds the Bereavement Support Payment amounts and the off-rate amounts above WPA's rate, with no WPA and no War Widow's Pension.

    Step 3 can follow for those releases. Older Microcosm releases and policyengine-uk-data still put both codes in bsp_reported, so freezing it outright would understate them. Keying the change on the dataset, for example on the presence of widowed_parents_allowance_reported, would cover both.

    Raised in Vahid's review of PolicyEngine/microcosm#1383 (item 12).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions