PolicyEngine / PolicyEngine/policyengine-scorecard

HMRC ready reckoner (mode 2): PE-UK counterparts to the direct effects of illustrative tax changes

Open
#60 0 comments 0 reactions 1 assignee View on GitHub

@vahid-ahmadi is already working on this.

Since Aug 17, 2026.

Dominant language
Python
Stars
0
Forks
0
Avg merge
6d 12h
Merged PRs (30d)
32

Description

The external side is already in the DB: the merged HMRC adapter (#45, sources/hmrc-personal-tax/adapter.py) parses the June 2025 tax ready reckoner — revenue effects of illustrative changes (1p on each rate, £100/£500 on each threshold, allowance moves, NICs rates/thresholds), three forecast years each, with the sign-convention machinery (classify_reckoner_label) reviewed and landed. The campaign also proved computability: 23 uk_reckoner PE results staged in #32. What does not exist is the maintained lane: no measure→reform registry, no per-row PE counterpart on the certified bundle, no comparison artifact, no issue tracking it. This fills the gap.

Why this population is the best-value mode-2 family per unit of work

  • Parametrically trivial: every reckoner row is a one-parameter reform (a rate or threshold delta) — near-zero not_expressible triage, unlike the OBR PMD's 5/26.
  • Dense and refreshed: ~250 rows per publication, updated twice a year, so it doubles as a per-fiscal-event regression battery for PE-UK's tax logic.
  • Decomposition-grade: HMRC publishes the reckoner in both pre- and post-behavioural terms for the income-tax rate rows, giving #59 its behavioural-axis measurements for free.
  • US analogue: this is the UK's closest thing to the reform-score adapters lane (#4) with an official static-ish counterpart — a cleaner benchmark class than OBR's behavioural-adjusted costings.

Design — extend #56's machinery, don't reinvent

  • Registry data/uk/hmrc_reckoner_reforms.yaml under the same schema as obr_measure_reforms.yaml (verbatim HMRC change label, pe-uk parameter dict, construction, computability, notes), generated semi-mechanically from the adapter's parsed labels since each is a stated parameter delta.
  • Compute via the same offline-hardened certified-bundle pipeline as pipeline/compute_uk_obr_costings.py (one delta per row, per forecast year), staged under the campaign ingest contract; descriptive comparison with named axes (basis: pre/post-behavioural where HMRC splits it; CY-proxies-FY; certified-world vs reckoner baseline).
  • Join key: the adapter's verbatim-label subgroup ids, so external and PE rows meet without re-parsing.

Blocked only on #57 (which DB shape the staged rows ingest against). Sibling of #54; feeds #59.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.