diff --git a/changelog.d/1113-calendar-2024-spend-basis.changed.md b/changelog.d/1113-calendar-2024-spend-basis.changed.md new file mode 100644 index 0000000000..b80fe75d30 --- /dev/null +++ b/changelog.d/1113-calendar-2024-spend-basis.changed.md @@ -0,0 +1 @@ +Every household spend column the UK LCFS stage emits is now at calendar-2024 prices, the H5's year (microcosm#1113): the diary columns are carried on the engine's CPI index from the April-to-March 2023-24 diary year to calendar 2024, three quarters of a year's step and not a full one; domestic energy is priced at QEP's calendar-2024 averages paid and levelled to the DESNZ volume over the four quarters of 2024, and each area's fiscal-year bus yield is re-priced to 2024 by its fares index, so policyengine-uk can project every column from the H5's year. A stage-health gate holds every level-setting step to that year and checks that each diary column declares the diary-year window. diff --git a/changelog.d/1113-consumption-drift-diagnostics.added.md b/changelog.d/1113-consumption-drift-diagnostics.added.md new file mode 100644 index 0000000000..ba31caac15 --- /dev/null +++ b/changelog.d/1113-consumption-drift-diagnostics.added.md @@ -0,0 +1 @@ +UK calibration diagnostics report the stage-levelled consumption totals (electricity, gas, domestic energy, petrol, diesel and total consumption) and shares (gas-connected, fuel-buying, and fuel-car households without fuel) at design and final weights, in a report-only `consumption_drift` block (microcosm#1113). diff --git a/changelog.d/1113-consumption-tax-measure-exclusions.changed.md b/changelog.d/1113-consumption-tax-measure-exclusions.changed.md new file mode 100644 index 0000000000..a59e7a70eb --- /dev/null +++ b/changelog.d/1113-consumption-tax-measure-exclusions.changed.md @@ -0,0 +1 @@ +The UK calibration holds `obr.vat`, `ons.household_electricity_expenditure`, `ons.household_gas_expenditure` and `obr.fuel_duties_cars` out of the objective as reviewed measure exclusions, still measured on every evaluation; `tools/diagnose_uk_consumption_taxes.py` reports them on any H5 the engine loads (microcosm#1113, microcosm#1123 item 3). VAT's level is an engine factor (policyengine-uk#1996), the ONS energy rows sit below the DESNZ volume at QEP prices the stage sets, and the OBR cars receipts include business-paid car fuel; a re-solve of the 2026-09-30 national problem with the four rows masked together left the other rows fitting no worse. diff --git a/changelog.d/1113-division-capture-diagnostic.added.md b/changelog.d/1113-division-capture-diagnostic.added.md new file mode 100644 index 0000000000..6d938f1e18 --- /dev/null +++ b/changelog.d/1113-division-capture-diagnostic.added.md @@ -0,0 +1 @@ +The UK LCFS stage receipt reports how much of ONS household spending each COICOP division captures (microcosm#1113): each of the twelve division totals at prior weights against ONS Consumer Trends for calendar 2024, less the classes a household diary does not record (narcotics, owner-occupiers' imputed rent and FISIM), on ONS's domestic concept, with the twelve together also against the national concept. The block is report-only, and the Consumer Trends resource vendors the division and total rows it reads. When a published row is missing for the year, the block records why it has no figures and the stage carries on. diff --git a/changelog.d/1113-household-road-fuel-target.added.md b/changelog.d/1113-household-road-fuel-target.added.md new file mode 100644 index 0000000000..e0d57ec87a --- /dev/null +++ b/changelog.d/1113-household-road-fuel-target.added.md @@ -0,0 +1 @@ +The UK contract binds `ons.household_road_fuel_expenditure`, ONS Consumer Trends COICOP 07.2.2 (fuels and lubricants for personal transport) for the calendar year, measured as petrol plus diesel spend (microcosm#1113). The class also carries other motor fuels and lubricants, so the row reads about 0.4% low from scope alone, and the new row adds one ledger-only row to each national compile-parity receipt. diff --git a/changelog.d/1113-recomposed-coicop-totals.changed.md b/changelog.d/1113-recomposed-coicop-totals.changed.md new file mode 100644 index 0000000000..2daea3233d --- /dev/null +++ b/changelog.d/1113-recomposed-coicop-totals.changed.md @@ -0,0 +1 @@ +The UK LCFS stage writes `housing_water_and_electricity_consumption` and `transport_consumption` around the parts it re-levels (microcosm#1113): each keeps its own chain draw less the chain's draws of the diary energy, or of petrol, diesel and bus fares, and adds the levelled electricity and gas, or the levelled petrol and diesel and the priced bus fares, back, so no total is below its parts. No column carries the diary's liquid and solid fuels: part of them stays inside the housing remainder, and the receipt records their published ONS spend. The two totals keep their committed support bounds, which the terminal support gate applies to the emitted frame; a stage-health gate checks the declaration and the receipt. diff --git a/changelog.d/1113-road-fuel-level-and-incidence.changed.md b/changelog.d/1113-road-fuel-level-and-incidence.changed.md new file mode 100644 index 0000000000..d3746c7425 --- /dev/null +++ b/changelog.d/1113-road-fuel-level-and-incidence.changed.md @@ -0,0 +1 @@ +The UK LCFS stage sets household road fuel itself (microcosm#1113): a flagged fuel-car household whose chain draw is zero is redrawn from the donor's distribution among households with positive road fuel (`redraw_zero_road_fuel`), and one factor then scales petrol and diesel to ONS 07.2.2 for 2024 less the donor's other-fuels share (`level_road_fuel`). Two stage-health gates check the receipts, petrol and diesel leave the committed support bounds, and the litres audit benchmarks each fuel against HMRC clearances times DESNZ's cars share of that fuel's road use (PolicyEngine/chronicle#322), keeping the OBR cars share of duty receipts, uniform across fuels, beside the total and falling back to it where DESNZ publishes no split for the year. diff --git a/changelog.d/uk-chronicle-feed-repin-1ee7dfe.changed.md b/changelog.d/uk-chronicle-feed-repin-1ee7dfe.changed.md new file mode 100644 index 0000000000..dc2a8e062e --- /dev/null +++ b/changelog.d/uk-chronicle-feed-repin-1ee7dfe.changed.md @@ -0,0 +1 @@ +Re-pin the UK Chronicle feed to 1ee7dfe (PolicyEngine/chronicle#322 via #323). The feed now carries ONS Consumer Trends household final consumption expenditure by COICOP division and class, with the national and domestic totals (annual for 2020 to 2025, quarterly to 2026 Q1), and DESNZ road transport fuel consumption by vehicle type and fuel for 2005 to 2024 (352,549 rows). No compiled target value moved on either surface. The seven Consumer Trends series already in the feed come back on ONS's domestic concept under new keys with the same values, so the electricity, gas and road-fuel targets resolve to the same values; the vendored resources and the membership reports restate the feed identity, and the re-pin itself leaves the three compile-parity receipts unchanged (microcosm#1113). diff --git a/docs/evidence/uk-consumption-taxes-1113/README.md b/docs/evidence/uk-consumption-taxes-1113/README.md new file mode 100644 index 0000000000..ad7bfd0ca4 --- /dev/null +++ b/docs/evidence/uk-consumption-taxes-1113/README.md @@ -0,0 +1,36 @@ +# Consumption-tax levels: measurement scripts and outputs + +Evidence for [PolicyEngine/microcosm#1167](https://github.com/PolicyEngine/microcosm/pull/1167) (microcosm#1113), filed on the review's ask that the scripts behind `experiments/1113-consumption-tax-levels-receipts.md` live in the repository. `receipts.json` carries the digests of the files here and of the spine the stage runs measured. + +## What was measured + +- **M2 and M3, desk measurements** (`scripts/m2_m3_desk.py`, `outputs/m2_m3_desk.json`). ONS Consumer Trends energy and road-fuel spending against DESNZ Energy Trends volume at QEP prices, and the road-fuel level against the OBR cars receipts. It reads the pinned Chronicle feed, the vendored resources, the 2026-09-30 national build and the LCFS 2023-24 household file. It runs no solve and no engine. +- **M4, the masked re-solve** (`scripts/m4_resolve.py`, `scripts/run_m4.sh`, `outputs/m4_report.json`, `outputs/solve_*.json`). The stored 2026-09-30 national problem (1,090 rows) re-solved twice with the doctrine options: with all rows bound, which reproduces the stored weights exactly, and with `obr.vat`, `obr.fuel_duties_cars` and the two ONS energy rows masked together. No arm masks one row alone. +- **Stage-only runs** (`scripts/stage_dev_run.py`, `scripts/run_stage_dev_at.sh`, `outputs/stage_dev_run*.json`). The `lcfs_consumption` stage re-run on the finished head-r3 spine of microcosm#1121 (63,956 households), with every lcfs stage-health gate run on its receipts: + - `stage_dev_run.json`: Group A's head; + - `stage_dev_run.group-b.json`: Group B's head; + - `stage_dev_run.base-7f235941c.json`: the base tree's stage on the same spine; + - `stage_dev_run.review-r2.json`: the head after the second review round. + +The base run is what isolates this PR's effect. The spine already holds the stages after `lcfs_consumption`, so a re-run redraws most households, and a comparison with the spine's stored columns mixes that drift with the change. Compare a run with the base run, not with `before_head_r3`. + +## What is not here + +- **Unit records.** The household dumps the stage runs write (`*.households.parquet`) and the solved weight vectors (`weights_*.npy`) stay out of the repository. +- **Licensed inputs.** The LCFS tabs, the spine and the national H5s. +- **Exact donor minima.** `scripts/sanitize_outputs.py` drops the stage's `donor_floor` receipt, which records each donor column's exact minimum, before an output is copied here. +- **M1.** The design- and final-weight energy volumes on the 2026-09-30 build (93.0 and 260.1 TWh at design weights, 82.9 and 205.2 TWh at final weights) were computed during the audit of 2026-10-08, and no script was saved. `outputs/m4_report.json` holds the same build's spend at design and final weights. + +## Re-running + +The stage runs need the licensed LCFS 2023-24 tabs and the head-r3 spine: + +```bash +scripts/run_stage_dev_at.sh