Skip to content

Set UK road-fuel and energy levels in the LCFS stage on a calendar-2024 basis (#1113) - #1167

Draft
juaristi22 wants to merge 14 commits into
mainfrom
uk-consumption-tax-levels
Draft

juaristi22 wants to merge 14 commits into
mainfrom
uk-consumption-tax-levels

Conversation

@juaristi22

Copy link
Copy Markdown
Collaborator

Summary

Part of #1113 and of #1123 (item 3). The UK LCFS stage now sets household road fuel and domestic energy at their published levels, at calendar-2024 prices, instead of leaving the calibration weights to reach them. The rows whose gap is not a weight question become measured diagnostics. This follows María's rulings of 2026-10-08 (D1–D3), plus two of 2026-10-09: the ONS road-fuel row is bound, and every LCFS spend column sits on one calendar-2024 basis.

  • Calibration rows. obr.vat, ons.household_electricity_expenditure, ons.household_gas_expenditure and obr.fuel_duties_cars move to the measure-exclusion register. They are still measured on every evaluation, and the entries expire 2027-01-08. The contract binds a new household-scope row in their place: ons.household_road_fuel_expenditure (ONS Consumer Trends 07.2.2, calendar 2025, measured as petrol plus diesel spend).
  • LCFS stage. Three declared steps:
    • redraw_zero_road_fuel gives every flagged fuel-car household a positive fuel spend;
    • level_road_fuel scales petrol and diesel to ONS 07.2.2 for 2024, less the donor's other-fuels share;
    • recompose_from_remainder writes housing and transport around their levelled parts.
  • Calendar-2024 basis. Energy is priced at QEP's calendar-2024 averages and levelled to the DESNZ volume over the four quarters of 2024. Each area's bus yield is re-priced to 2024 by its fares index. policyengine-uk can then project every column from the H5's year.
  • Gates. Four new release-blocking stage-health gates check the receipts: road_fuel_incidence, road_fuel_level, recomposed_totals and consumption_basis.
  • Diagnostics (report-only):
    • uk_diagnostics.consumption_drift: the levelled totals and shares at design and final weights;
    • division_capture in the stage receipt: each COICOP division against ONS Consumer Trends;
    • the litres audit: each fuel against its cars share of road use.
  • Feed. The UK Chronicle feed is re-pinned to 1ee7dfe (UK consumption-tax facts: Consumer Trends for every COICOP division, and road fuel by vehicle type and fuel (PolicyEngine/microcosm#1113, PolicyEngine/microcosm#1123) chronicle#322 via Expand UK consumption-tax expenditure and road fuel facts chronicle#323, 352,549 rows), which brings Consumer Trends by division and DESNZ road fuel by vehicle type and fuel. No compiled target value moves on either surface, and the three compile-parity receipts are unchanged.

Receipts, findings and rulings are in experiments/1113-consumption-tax-levels-receipts.md.

Why the levels belong to the stage

On #1121's head calibration (policyengine-uk 2.122.2, 1,167 rows):

  • obr.vat reads +24.7% at design weights, against a 25% bound. Its level is the engine's microdata_vat_coverage factor (0.38, with no recorded derivation; policyengine-uk#1996), not a weight question.
  • The ONS electricity and gas rows sit below the unit cost of the DESNZ volume at QEP prices, so they are a published-source residual.
  • obr.fuel_duties_cars reads −34.5% at design weights. It is a fiscal-year duty total that includes business use of cars. The LCFS diary records about a quarter less road fuel than ONS, and a third of fuel-car households show no fuel purchase in the two-week diary.
  • Closing these rows through the weights distorts the frame. The gas-connected share fell from 84.5% to 78.9%, petrol rose 21% and diesel 34%.
  • Masking all four rows in a re-solve of the 2026-09-30 national problem cost the other 1,086 rows nothing: 98.5% within 10%, against 98.4%.

Stage-only measurements

These re-run lcfs_consumption on #1121's head-r3 spine (63,956 households), before the rebase. All seven lcfs stage-health gates pass.

  • Road fuel. No flagged fuel-car household is left at zero fuel (33.2% before the redraw). Petrol plus diesel is levelled to £36.89bn: ONS 07.2.2 for 2024 (£37.03bn) less the donor's 0.37% other-fuels share.
  • Energy. Electricity is £29.5bn and gas £19.2bn at calendar-2024 prices, with 84.6% of households connected to gas.
  • Totals. No household's housing or transport total is below its levelled parts (2.7% and 1.8% were before). Consumption across the twelve divisions moves from £979.0bn to £971.4bn (−0.8%).
  • Division capture. The frame's twelve divisions are 72.8% of ONS's 2024 spending in survey scope; the donor's own diary is 58.5%.
    • Housing reads 1.059. D1's energy level is £8.0bn of its £9.7bn excess.
    • Furnishings read 1.251: the frame draws 66% more per household than the donor. That is not investigated here.
  • Litres audit. Against HMRC clearances times DESNZ's cars share of each fuel, petrol reads 1.011 and diesel 0.709.

Not in this PR

Testing

  • Targeted engine-free tests for each commit's surface. At the head, before the rebase, a broad funnel of 1,613 tests and a sweep of the remaining touched-surface files (1,251 tests) passed. The skips are tests that need the licensed LCFS tabs or the US extra.
  • During the rebase onto 7f235941c, a check ran after every commit. Each commit loads the UK spec, has a current release-input coverage manifest, and has current gate digests mirrored in microcosm-data.
  • The charter-H2 spine fixture is regenerated once, at the head. Only the stage contract hashes move: lcfs_consumption's, and those of the ten stages declaring a vendored resource the re-pin restamped. The commits before that one fail test_h2_uk_spine_parity on their own.

🤖 Generated with Claude Code

juaristi22 and others added 14 commits October 9, 2026 14:50
…ith a diagnose tool (#1113)

The national solve was closing three level gaps by moving weights. obr.vat
reads +24.7 percent at design weights and +24.1 percent calibrated on
#1121's head calibration (policyengine-uk 2.122.2), against the 25 percent
bound: the engine divides household VAT by microdata_vat_coverage (0.38, a
constant since January 2023), and the frame's raw household VAT is about 46
percent of the OBR receipts (policyengine-uk#1996). The ONS 04.5.1 and
04.5.2 rows sit below the stage's DESNZ volume at QEP prices on every
aligned basis (gas below unit cost alone), and fitting them cut electricity
8.6 percent, gas 18.9 percent and the gas-connected share from 84.5 to 78.9
percent. A re-solve of the 2026-09-30 problem with the rows masked changed
no other row's fit (98.5 against 98.4 percent within 10 percent).

The three rows join the measure-exclusion register on María's 2026-10-08
ruling (VAT until the engine factor is split; the energy rows as a
published-source residual, with DESNZ volume at QEP prices kept as the
level), windowed to 2027-01-08. tools/diagnose_uk_consumption_taxes.py keeps
them measured on any H5 the engine loads, against the values the run's
contract registry declares, beside the fuel and energy composition the rows
pulled. The twelve COICOP division columns become a named view beside the
LCFS rename map so the tool imports them rather than copying them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The LCFS diary records about a quarter less road fuel than ONS household
spending, and binding the OBR cars receipts closed that gap by moving weight
onto fuel-buying households. A declared level_road_fuel step after the fuel
flag now scales petrol and diesel by one factor, so their prior-weighted total
equals ONS Consumer Trends COICOP 07.2.2 for calendar 2024 (the year of the
DESNZ pump prices the donor uprating uses) less the donor's own c72213
other-fuels share. The drawn mix and each household's relative spend are kept.

- lcfs_consumption reads ons_household_expenditure_facts.json, now its
  declared consumer (re-vendored; values unchanged).
- The uk_stage_lcfs_consumption_road_fuel_level stage-health gate recomputes
  the level from the vendored row and checks that the factor reproduces it;
  the licensed donor's other-fuels share is bounded at 5%.
- Petrol and diesel join the levelled columns, so they carry no committed
  support bound (regenerated from the pinned LCFS tabs).
- The existing litres audit runs after the step, so its frame litres at DESNZ
  pump prices describe the levelled frame.
- Mirrors: operation schema and kind, stage_health parameter vocabulary,
  spine gate scope, gate-battery digests and entry lists, coverage manifest.
  The graph parity fixture is regenerated once at the end of the series.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The LCFS diary covers two weeks, so about a third of car-owning donors record
no fuel purchase, and the chain reproduced that zero share among the
households the fuel flag marks as buying petrol or diesel (34.3% at prior
weights on #1121's head). Over a year such a car is refuelled; binding the
OBR cars row had moved weight off those households to compensate.

A declared redraw_zero_road_fuel step, between the fuel flag's zeroing and
the level step, redraws a flagged household whose chain draw is zero from the
donor's distribution among households with positive road fuel, on the
chain's predictors. A weighted regime-gated QRF draws the total, positive by
construction, then the petrol share of it, which keeps diesel-only and mixed
households. The quantiles are keyed on the household id
(predict_from_uniforms), so a household's draw doesn't depend on row order.
Positive chain draws are kept, and the level step then rescales the total.

- The receipt records the flagged zero share before and after, the mean
  among positive households before, the redrawn mean and mix, and the model's
  regimes. Its two fits add fit-weight records.
- The uk_stage_lcfs_consumption_road_fuel_incidence gate checks the declared
  rule, seed, salt and trees; that no flagged household is left at zero and
  no unflagged one carries fuel; and the total's positive-only regime. It
  fails if the chain's zero share passes one half, which would point at the
  chain rather than the diary.
- The end-to-end stage test's synthetic donor now has one-car diaries with no
  purchase, so the redraw runs there, and the stage's receipts pass both
  road-fuel gates.
- Mirrors: operation schema and kind, stage_health parameter vocabulary,
  spine gate scope, gate-battery digests and entry lists, coverage manifest,
  seed pin.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…#1113)

The contract declares ons.household_road_fuel_expenditure: ONS Consumer
Trends COICOP 07.2.2 (fuels and lubricants for personal transport), calendar
year, household scope, with value_expression "petrol_spending +
diesel_spending". It resolves to GBP 35.099bn for 2025. Its notes cover the
other motor fuels and lubricants the class carries and the measure doesn't
(0.4% on the LCFS diary), and why its design-weight gap is the engine's
2024-to-2025 uprating, since the stage levels the columns to the 2024 row.

obr.fuel_duties_cars moves to the measure-exclusion register, still measured
on every evaluation. Its gap breakdown:
- The OBR cars line includes business-paid car fuel. ONS 07.2.2 at DESNZ
  pump prices implies about GBP 13.5bn of duty, 7% under it.
- With the level step in place, the engine's fuel_duty reads -9.9% against
  it (-8.1% on DESNZ divisors; policyengine-uk#2169 A). Binding it would move
  weight onto fuel buyers to stand in for business use.

This commit is the only one that changes if the OBR cars row is kept bound
instead.

- National references regenerated: 1,232 active, with 7
  no_fact_at_or_before_period and 16 signed excluded unchanged. The local
  census is unchanged.
- Both compile-parity receipts gain the row as ledger_only.
- tools/diagnose_uk_consumption_taxes.py measures the new row beside the
  held-out ones. The register census and the contract and reference counts
  are re-pinned.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The chain draws COICOP 04 (housing, water and fuel) and 07 (transport) as
whole diary totals, while the stage re-levels the energy and road fuel inside
them. Electricity and gas move to DESNZ volume at QEP prices, and petrol and
diesel to ONS 07.2.2, so the totals no longer contained their own parts: 2.7%
of households had energy above their COICOP 04 total. PE-UK's explicit
energy VAT base (policyengine-uk#2166) can only take energy out of the
generic base if the totals hold it.

A declared recompose_from_remainder step runs after the levelling steps. Each
total keeps its own chain draw, less the chain's draws of the parts the stage
re-levels, and adds the levelled parts back:
- housing_water_and_electricity_consumption: its draw, less the drawn
  electricity and gas, plus the levelled electricity and gas;
- transport_consumption: its draw, less the drawn petrol and diesel, plus the
  levelled petrol and diesel.
The drawn parts are kept right after the support clip, before any step
touches them. A remainder floors at zero where the parts outgrow the total:
2,056 and 1,240 of 63,956 households on the head-r3 spine, about GBP 1.0bn
and 0.3bn. The chain draws each part after, and conditional on, its total, so
the remainder is the chain's own split.

Drawing the remainders as chain targets of their own (the plan's first
version) over-drew the vehicle-purchase tail of transport: 10 to 13% above
the donor in-sample, and GBP 27bn on the spine. The chain and its targets are
unchanged, and output columns are unchanged.

On the head-r3 spine, consumption across the twelve divisions moves -0.7%
(GBP 979.0bn to 972.3bn):
- housing -3.4%, as DESNZ x QEP energy (GBP 47.9bn) replaces the drawn
  electricity and gas (GBP 54.7bn);
- transport +0.2%, as the levelled fuel (GBP 36.9bn) replaces the chain's
  fuel draws (GBP 28.7bn), including those zeroed for households without a
  fuel car.

- The chain's domestic-energy target is the diary's electricity plus gas, so
  the liquid and solid fuels of COICOP 04.5, which have no column of their
  own, stay inside the housing remainder at the diary's level. The receipt
  records their published ONS 04.5.3 and 04.5.4 spend beside it (CY2024,
  vendored rows): GBP 1.55bn.
- The uk_stage_lcfs_consumption_recomposed_totals gate checks each total
  against its declaration. It requires no negative remainder and no
  household below its components. The remainder must equal the draw less the
  drawn parts plus the floored mass, and the total must equal the remainder
  plus the parts. It also recomputes the uncarried ONS spend from the
  vendored rows.
- The two totals leave the committed support bounds (regenerated); the gate
  holds them instead.
- Mirrors: operation schema and kind, spine gate scope, gate-battery digests
  and entry lists, coverage manifest, source-stage pins.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The audit scales each fuel's all-road-user HMRC litres by the all-fuel OBR
cars share (58.3%), giving petrol x1.30 and diesel x0.37. Diesel is mostly
vans and lorries, so those per-fuel ratios mislead; only the total ratio
compares like with like. The receipt now says so in per_fuel_ratio_basis
until a per-fuel cars benchmark exists (DESNZ sub-national road fuel by
vehicle and fuel, requested in PolicyEngine/chronicle#322).

The plan's quarterly 04.5.x and 07.2.2 vendoring is dropped: no code would
read those rows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The lcfs_consumption stage now sets the levels of electricity, gas, petrol and
diesel, the gas connection and the fuel incidence, so calibration should
barely move them. Before this series, the bound rows moved them a lot: gas
fell 19% through the weights and the gas-connected share 84.5% to 78.9%.

uk_diagnostics gains a report-only consumption_drift block, computed from the
calibration's initial and final weights on the frame's own columns:
- totals: electricity, gas, domestic energy, petrol, diesel, and consumption
  across the twelve COICOP divisions;
- shares: gas-connected households, fuel-buying households, and flagged
  fuel-car households without fuel.
Each value carries design, final, change and relative change. The block is
omitted for a frame without the consumption columns. The typed schema
(UKConsumptionDrift, UKDriftValue) is optional and forbids undeclared
fields, as the rest of the UK extension does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PE-UK projects each household spend column from the H5's year, 2024, with
calendar-year growth, and Microcosm's calibration uprates the same values to
the calendar-2025 window, so both read every column as calendar-2024 prices.
Two of the stage's levels were on FY2024-25 instead:
- energy: DESNZ volume and QEP prices for FY2024-25;
- bus fares: the yield per fare-paying boarding from FY2024-25 receipts and
  journeys.
Each column would then have needed its own basis to be projected correctly.
Instead every column now sits on calendar 2024, so none does:
- Energy is priced at QEP's calendar-2024 averages paid and levelled to the
  DESNZ Energy Trends volume over the four quarters of 2024, both vendored
  beside the fiscal rows. The level now takes a calendar or fiscal year.
- Each area's FY2024-25 bus yield is re-priced to calendar 2024 by its fares
  index:
  - London and England outside London: DfT's quarterly local bus fares
    index, calendar-year mean over fiscal-year mean;
  - Scotland: its calendar-year index, taking the fiscal year as three
    quarters of 2024 and one of 2025;
  - Northern Ireland: England's index.
  The factors are 1.000 for London (fares held flat), 0.965 for England
  outside London (the fare cap rose in January 2025), 0.988 for Scotland and
  0.982 for Northern Ireland. The bus pricing gate checks them.
- The diary columns (CPI-uprated to 2024) and road fuel (ONS 07.2.2 for 2024)
  were already on calendar 2024.

The uk_stage_lcfs_consumption_basis gate holds every level-setting step to
calendar 2024: the donor uprating's target year, the energy prices' and the
DESNZ level's periods, the bus prices' year and the road-fuel level's period.
A step whose receipt is absent fails.

On the head-r3 spine all seven lcfs stage-health gates pass. Energy moves
+1.7% (GBP 47.9bn to 48.8bn) and bus fares -2.1%; fuel and the diary columns
don't move. PE-UK can then project every column from the H5's year with no
basis of its own. It still has to project energy: an energy price index from
2024 in place of the uk-data assumption that bills are stored at FY2026-27
prices.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
experiments/1113-consumption-tax-levels-receipts.md is the receipt the
register entries cite. It holds:
- the commit list;
- microcosm#1121's head calibration;
- the measurements that put the levels in the stage (energy volumes and
  sources, road fuel, the VAT factor);
- the masked re-solve of the 2026-09-30 problem;
- the stage-only development run on the head-r3 spine, where all seven lcfs
  stage-health gates pass, with the in-sample check that moved the
  recomposed totals off chain-drawn remainders.

One changelog fragment per change. The charter-H2 graph parity fixture and
the national remeasure follow Group B (PolicyEngine/chronicle#322), whose
feed re-pin moves the fixture again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#323) (#1113)

The artifact is chronicle main at the #323 merge: 352,549 rows (825406f's
344,402 plus 8,147), consumer_fact.v4 with an unchanged schema. It brings ONS
Consumer Trends by COICOP division and class, with the national and domestic
totals, and DESNZ road transport fuel consumption by vehicle type and fuel.

- No existing value moved. Every 825406f row is byte-identical except the seven
  Consumer Trends series already in the feed. #323 restates their 217 rows on
  ONS's domestic concept (territory role; price-basis, seasonal-adjustment,
  unit, sheet and concept dimensions), under new keys with the same values.
- The national and local reference files are byte-identical. The electricity,
  gas and road-fuel targets resolve to the same values through the new keys,
  which is all the national membership records beside the feed label.
- The three compile-parity receipts are unchanged.
- The vendored resources carry the same rows under the new feed identity. The
  Consumer Trends resource names the domestic concept, and the road-fuel
  target's note says why no national bridge applies: ONS splits the tourism
  adjustment by no class.
- The charter-H2 fixture moves at the branch head, after the stage changes that
  follow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The stage receipt gains a report-only division_capture block. For each of the
twelve COICOP divisions it sets the prior-weighted frame total against ONS
Consumer Trends for the uprating's target year (calendar 2024), less the classes
a household diary does not record: 02.3 narcotics, 04.2 owner-occupiers'
imputed rent and 12.6.1 FISIM.

- The divisions are on ONS's domestic concept. Consumer Trends publishes the
  tourism adjustment for the total only, so only the twelve together are also
  compared on the national concept (NAT0). International students' tuition has
  no published split either, and stays in the domestic gap of division 10.
- The Consumer Trends resource vendors the 0CN totals and divisions and the
  three out-of-survey classes for 2023 to 2025 (42 to 93 rows).
- Nothing is gated on it. The engine-free stage test has no uprating step, so
  it checks the block is absent there; a unit test checks the arithmetic
  against the vendored rows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The litres audit's per-fuel benchmark is now HMRC's clearances of that fuel
times the cars share of its UK road use, from DESNZ sub-national road transport
fuel consumption by vehicle type and fuel (PolicyEngine/chronicle#322), for the
uprating's target year. Within one fuel the ktoe cancel, so no conversion factor
enters.

- For 2024 cars burn 97.8% of road petrol and 39.2% of road diesel; the OBR cars
  share of fuel duty receipts applied one share to both, which A8 labelled. The
  OBR-based total stays on the receipt beside the new one.
- desnz_road_fuel_by_vehicle.json vendors the UK rows for 2022 to 2024 (30
  rows), and the lcfs_consumption stage declares it as an artifact.
- Report-only, as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The fixture moves once, at the branch head, for every stage change above.

- The bundle gains the lcfs_consumption steps: redraw_zero_road_fuel,
  level_road_fuel and recompose_from_remainder. It also gains the
  calendar-2024 energy and bus-fare parameters, the ONS and DESNZ artifact
  roles, and the updated source and notes text.
- The synthetic LCFS donor gains c72213, the other motor fuels whose donor
  share level_road_fuel nets from ONS 07.2.2. It is added after the positional
  columns, so no other synthetic value moves.
- In the graph JSON only stage_contract_sha256 moves: for lcfs_consumption and
  for the ten stages that declare a vendored resource the 1ee7dfe re-pin
  restamped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The receipts gain B1 to B3 and the fixture commit, plus the stage-only run at
B3: all seven lcfs gates pass, and the Group A figures hold.

- Division capture: the frame's twelve divisions are 72.8% of ONS's survey
  scope for 2024, against 58.5% for the donor's own diary. Housing reads 1.059,
  GBP 8.0bn of its excess being D1's energy level. Furnishings read 1.251: the
  frame draws 66% more per household than the donor.
- Litres audit: petrol reads 1.011 of its cars benchmark and diesel 0.709. The
  total is 0.894, against 0.951 on the OBR cars share.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@vahid-ahmadi

Copy link
Copy Markdown
Contributor

Automated review pass (Claude Code, high effort) — round 1 at 2e32d7bd

Verdict: nothing blocks this. The stage steps are sound, declared and gated, and the four rows it moves out of the fit are justified and signed. Two should-fixes on the register wording and the bound row, and one to note for the engine side before the national remeasure.

What checks out

  • level_road_fuel is one factor on petrol and diesel at prior weights, so the drawn mix and each household's relative spend are kept (lcfs_consumption.py:1151-1182). The other-fuels share comes from the donor's own c72213, and the step refuses a fiscal-year level or a share outside [0, 1).
  • redraw_zero_road_fuel is seeded, identity-keyed and redraws only flagged households that drew zero, so households without a fuel car stay at zero.
  • recompose_from_remainder refuses a declaration that differs from the parents and components it recomposes, and floors the remainder at zero.
  • Calendar 2024 is applied everywhere: energy sums the four Energy Trends quarters of 2024 (energy_pricing.py, period_quarters); road fuel levels to ONS 07.2.2 for 2024; bus yields are re-priced to 2024. The consumption_basis gate holds every level step to that year.
  • Four new release_blocking gates (road_fuel_incidence, road_fuel_level, recomposed_totals, consumption_basis) are in gates.json, with digests mirrored.
  • The four exclusions are signed, carry a tracking issue, an adjudication with receipts and an expiry (2027-01-08), and stay measured through tools/diagnose_uk_consumption_taxes.py.
  • The Chronicle pin 1ee7dfe is the merge commit of chronicle#323 on main. The selectors resolve 07.2.2 as text, and the 217 restated rows keep their values under the new keys.
  • Tests: the 17 touched test files pass locally (778 passed, 6 skipped). Against the base 7f235941, the new stage-health tests fail and the new diagnostics test doesn't import, so they cover the change.

Should

  1. The electricity and gas exclusion reasons describe the old basis (calibration_measure_exclusions.json:590, :599). They say the stage sets spend from "Energy Trends FY2024-25 domestic volume at QEP FY2024-25 average prices", but the stage now uses calendar 2024 (the 2026-10-09 ruling), and the quoted ratios (0.90, 0.81) were measured on the fiscal-year basis. Restate both reasons on calendar 2024 and re-quote the ratios, so the register matches what the stage does.
  2. The bound row compares petrol plus diesel with all of 07.2.2 (uk_population_targets.json, ons.household_road_fuel_expenditure). The stage levels to 07.2.2 less the donor's other-fuels share (0.37%), but the target is the full class, so calibration pulls about 0.4% toward fuel buyers to close a gap that is only scope. Either scale the target by the same share the stage uses, or record it as a known 0.4% offset in the binding notes and the receipts.
  3. Non-residents' spending inside the bound row. The notes say 07.2.2 is on the domestic concept and no bridge is applied. That's fine as a choice, but the frame is residents only, so the row is an upper bound. Add one line with the size of the effect (or that ONS gives no split), so a later reader knows which way it leans.

Nits

  1. The model year: policyengine-uk reads the H5's 2024 as fiscal 2024-25, while the frame is priced at calendar 2024, about a quarter apart. Worth one sentence in the stage notes, since every levelled column inherits it.
  2. If the LCFS diary has a line for vehicle electricity inside 07.2.2, it should sit with c72213 in the other-fuels share; otherwise a sentence saying it doesn't exist.

Knock-on for policyengine-uk

  • #2186 (DESNZ litre divisors): still holds. Its divisors are DESNZ calendar-year averages, the same basis this stage prices road fuel on, and its spending proxy is derived to keep litres on the volume path whatever the level. What moves is the level: petrol plus diesel for 2024 goes from £34.81bn on the certified release to £36.89bn here (+6.0%), so litres and fuel duty rise by the same 6%, about 25.6bn litres in 2024 and about £13.3bn of duty in 2025. That matches the register's −8.1% against the OBR cars line. The new ONS row will read about −1% at design weights, because the engine's 2024-to-2025 spending growth (−6.2%) is a little below ONS's (−5.2%).
  • #2187 (VAT coverage split): the 0.67 coverage was derived on the certified release. Here total consumption is 0.8% lower and energy is levelled separately, which by itself moves coverage to about 0.665, still 0.67 to two places, but it should be re-derived on the R1 remeasure. Once #2187 is in the locked version, the obr.vat exclusion's own retire condition is met ("rebind when a locked policyengine-uk splits the factor"), and on the certified release the split factor put VAT within 0.4% of OBR.
  • #2189 (electricity and gas VAT base): energy here is priced at QEP calendar-2024 average prices including VAT, so the 5/105 extraction is still right. #2189's description says the bills are at Ofgem cap rates; that should say QEP average prices paid. With electricity at £29.5bn and gas at £19.2bn, domestic energy VAT is about £2.32bn, against about £2.02bn on the certified release and HMRC's implied £2.33bn, and the 2026-27 zero-rate cost rises from about £0.62bn to roughly £0.70bn.

This branch has not been deployed

No deployments
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.

2 participants