Skip to content

Replay every OBR-costed fiscal event, June 2010 to Autumn Budget 2025 #156

Open

Description

@MaxGhenis

Extends the Autumn Budget 2025 port (#136) to every fiscal event in the OBR's Policy measures database since the June 2010 Budget: 32 events, from the uk_obr harvest (PMD November 2025 vintage, tax and spending measures by head and fiscal year).

Why now. The 28 October Budget is the next event. The official costings are the only key for national figures that PolicyEngine never touched, and replaying past events tests the model on the kinds of measures Budgets actually contain: reliefs, freezes, mid-year dates and benefit interactions. Synthetic drills have not reached those yet.

Recipe (the #136 pattern, per event):

  1. An event registry: every measure, with OBR costings by head and year. Each measure carries one construction: pe_reform_delta, pe_baseline_modifier / reversal_on_certified_world, a package, or not_expressible with a pe_gap reason.
  2. Counterparts for each expressible measure on the certified bundle, one artifact per measure and year.
  3. Staging under the ingest contract.
  4. A descriptive comparison: bins and named divergence axes, with no pass/fail (the Scorecard epistemics rule).

Two engine pins. Run on the current certified bundle (populace-uk-2023, policyengine-uk 2.89.2). Run again on the next certified pair (uk-data 1.58.0 with policyengine-uk 2.123.x, policyengine.py#555) once it is certified. The difference between the two runs shows what the recent fixes changed.

Plan.

  • A pilot lane builds the generalised event pipeline and runs Autumn Budget 2024, Spring Budget 2024 and Autumn Budget 2017. Autumn Budget 2017 tests whether the bundle can simulate scoring years from 2017-18.
  • An inventory lane classifies every measure in all 32 events for household-model scope and expressibility.
  • Per-event lanes then fan out on the pilot's recipe.
  • Not-expressible measures, ranked by size, become policyengine-uk capability issues.

Comparisons stay descriptive throughout (bins, explained share, named axes).

Activity

  1. MaxGhenis commented on Oct 9, 2026

    @MaxGhenis
    ContributorAuthor

    Plan revised after Max's point: a faithful replay needs historical policy rules, per-year Microcosm populations and vintage calibration targets (the OBR's own forecast at each event). That is a large project, so the work is in two tracks.

    • Track 1, now, before 28 October. Replay only the events whose costing years the certified bundle (populace-uk-2023, policyengine-uk 2.89.2) can stand behind: Spring Budget 2023, Autumn Statement 2023, Spring Budget 2024, Autumn Budget 2024 and Spring Statement 2025, with Autumn Budget 2025 already ported in Port every Autumn Budget 2025 score into the scorecard, with pe_gap rows for what the engine cannot express #136. The vintage difference is tagged as a named divergence axis, not fixed. Branch replay/pilot, lane 20261009-095118-replay-track1-recent.
    • Track 2, scoping now, build after the Budget. Inventory all 32 events from June 2010 to Autumn Budget 2025. For each policy area, assess historical rules coverage in policyengine-uk and rulespec-uk, what Microcosm can build by year, and which vintage targets exist per event. Then a phased plan with effort estimates. Branch replay/inventory, lane 20261009-095118-replay-track2-scoping.
  2. MaxGhenis commented on Oct 10, 2026

    @MaxGhenis
    ContributorAuthor

    Status, 10 October.

    • Track 1 merged (Add certified-bundle replay pipeline for recent OBR fiscal events #157). Spring Budget 2023, Autumn Statement 2023, Spring Budget 2024, Autumn Budget 2024 and Spring Statement 2025 are replayed on the certified bundle (policyengine-uk 2.89.2). There are 165 computed source rows across 16 partial measures. The review found the causes behind the main divergences:
      • model bugs, filed: policyengine-uk#2237, #2238 and #2239;
      • HICBC: fixed on main after the pin;
      • employee NICs: the certified base is 15–20% above the OBR;
      • the rest are labelled assumption differences.
    • Track 2 merged (Scope the vintage-faithful replay of 32 OBR-costed fiscal events #158). It scopes all 32 events since June 2010: the inventory, historical rules coverage, populations and vintage targets, and a phased plan. Phase 0 is 8–12 lane-days; phases 0–5 are 182–312 lane-days, starting with 2022 and working back. Max is deciding on funding (d1199).
    • Next. Rerun track 1 on the new certified pair (uk-data 1.58.0 with policyengine-uk 2.123.x+) once policyengine.py#555 is certified, and after the #2237–#2239 fixes land. The difference between the two runs measures what the fixes changed.
  3. 6 remaining items

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