Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
391cbd6
Refuse FRS household codes outside the data dictionary (uk-data#636)
juaristi22 Oct 25, 2026
b337c79
Record seven more UK inputs left at the engine default, with their er…
juaristi22 Oct 25, 2026
c79dfb8
Add the CT-C tool: engine council tax against the stored FRS bill
juaristi22 Oct 25, 2026
a61b52b
Report the local age rows on a private-household basis too
juaristi22 Oct 25, 2026
21388ee
Pin obr.domestic_rates to the UK and hold it as a measured diagnostic
juaristi22 Oct 25, 2026
5da4cbc
Guard the nested mortgage debts and note paternity pay's 52 weeks
juaristi22 Oct 25, 2026
8462fee
Measure the held ORR rail-support row on table 7271
juaristi22 Oct 25, 2026
7324e08
Re-lock policyengine-uk 2.160.0, the newest on PyPI
juaristi22 Oct 25, 2026
25da289
Read the income tax rows before the Winter Fuel Payment charge
juaristi22 Oct 25, 2026
5c3f9a7
Measure the held obr.vat row with VAT on private school fees
juaristi22 Oct 25, 2026
bcad529
Price England outside London's bus fares as policyengine-uk 2.158.3 does
juaristi22 Oct 25, 2026
369aac4
Read the engine's universal eligibility in the DfE spring-term measures
juaristi22 Oct 25, 2026
14e9a6b
Re-lock policyengine-uk 2.161.0, the newest on PyPI
juaristi22 Oct 25, 2026
88172b1
Add England's single adult discount cells by billing authority
juaristi22 Oct 25, 2026
f90cb03
Declare the loss-relief measures once, as named terms of the grammar
juaristi22 Oct 25, 2026
a69acd6
Report a built file's single years of age against ONS mid-2025
juaristi22 Oct 25, 2026
29a1651
Regenerate the national references, parity receipt and derived files
juaristi22 Oct 25, 2026
e7fb07e
Bind HMRC's Child Benefit families in payment by number of children
juaristi22 Oct 25, 2026
2c3e25f
Re-pin the CGT projection gate's growth path to policyengine-uk 2.161.0
juaristi22 Oct 26, 2026
a01d811
Bind the Winter Fuel row at FY2025-26 alone
juaristi22 Oct 26, 2026
7124fbd
Re-lock policyengine-uk 2.162.3 (microcosm#1095)
juaristi22 Oct 26, 2026
0ed5b7a
Withhold a sex's whole single-year block when one of its years is thin
juaristi22 Oct 26, 2026
aeef4bb
Record the Child Benefit counts' gap to the spending row; name CTBAND…
juaristi22 Oct 26, 2026
4a49f94
Pin the concept mapping's savings interest test to policyengine-uk 2.…
juaristi22 Oct 26, 2026
005ae0a
Regenerate on the 272c987 feed after #1381, with the single adult dis…
juaristi22 Oct 26, 2026
42ad7de
Add the ISA cash interest charge to the HBAI deductions
juaristi22 Oct 26, 2026
6b4b1da
Declare the frame's legacy-gross ISA income contract
juaristi22 Oct 26, 2026
3c0832f
Count SPI interest recipients on interest outside ISAs
juaristi22 Oct 26, 2026
b7f089d
Let the gambling top-up's stake scale reach 2.5
juaristi22 Oct 26, 2026
a540883
Pin the engine keeping recorded student loan plans from 2.162.2
juaristi22 Oct 26, 2026
59dd2e3
Register the ISA income contract writer as an HDF write site
juaristi22 Oct 26, 2026
be5fcde
Record the gambling stake scale's terms in its receipt
juaristi22 Oct 26, 2026
6c31d27
Pin the 2024 frame's interest read at 2025
juaristi22 Oct 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The FRS spine refuses a region (GVTREGNO), tenure (PTENTYP2) or accommodation (TYPEACC) code outside the FRS data dictionary, and names the variable, where it used to map the code silently to a default (uk-data#636, microcosm#1095). A blank value keeps its default, as before: some FRS 2024-25 households leave TYPEACC blank, and they stay detached houses, as uk-data#636 maps them. Every code on the FRS 2023-24 and 2024-25 household tabs is in the dictionary, so the spine does not change. The council tax band (CTBAND) keeps its mapping: a code outside bands A to I still takes the placeholder band D.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
England outside London's bus fare yield takes off only the older and disabled concessionary journeys of DfT BUS01c, as policyengine-uk prices it from 2.158.3, in the fare pricing of both the LCFS and the ETB stages (microcosm#1095). Other concessions stay in the priced denominator, as the frame's eligibility flag leaves those travellers priced. London, Scotland and Northern Ireland are unchanged, the engine parity test holds within 1% again, and the bus support's reimbursement per concessionary boarding is unchanged.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
HMRC's Child Benefit families in payment by number of children bind as five national rows (microcosm#1095): one, two, three, four, and five or more children (HMRC's five-to-nine and ten-or-more columns together), from the Child Benefit Statistics of August 2025. Each counts the benefit units whose `child_benefit` is above zero by their children on policyengine-uk's own definition, a child or qualifying young person who is not the claimant or partner (the new measure `child_benefit_child_count`). The rows carry an in-year snapshot hold, signed by María on 2026-10-25. Only Child Benefit spending bound before, so nothing fixed the size of the claiming families.
1 change: 1 addition & 0 deletions changelog.d/1095-uk-council-tax-liability-tool.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
`tools/compare_uk_council_tax_liability.py` compares the engine's council tax (`simulated_council_tax` and `simulated_council_tax_less_discounts`, PolicyEngine/policyengine-uk#1855 and #1864) with the stored FRS bill, `council_tax`, on a dense release (CT-C, microcosm#1095, #953, #736). It writes weighted totals and ratios for Great Britain, each nation and each region, and weighted means and ratios for each local authority and band that at least ten distinct source households carry. A cell never gives a total or a weighted count, so a published total less the published cells cannot give a withheld cell back. It is a private diagnostic and never recalibrates.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The DfE spring-term universal measure reads policyengine-uk's own eligibility, `universal_childcare_entitlement_eligible`, in place of its own DfE-age gate (microcosm#1095). Since policyengine-uk 2.156.1 (PolicyEngine/policyengine-uk#2588) the engine starts the universal and 2-year-old hours in the term after the birthday on a dataset that supplies none of its legacy childcare inputs, as the release does, so a child still before school in the spring term is eligible exactly when DfE counts them. The 2-year-old measure keeps its DfE-age check, since a child who turns three by 31 December takes the universal hours in the spring term.
1 change: 1 addition & 0 deletions changelog.d/1095-uk-domestic-rates-pin-and-hold.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
`obr.domestic_rates` compiles its fact: OBR's table 4.1 is UK-wide, so Chronicle stamps the Northern Ireland domestic rates row K02000001, and the row now pins to the UK, as `obr.council_tax` does, instead of the Northern Ireland code the substring rule gave it (microcosm#1095, uk-data#520). `domestic_rates` is zero outside Northern Ireland, so the UK total is Northern Ireland's. The row looks like the district rate only, while `domestic_rates` is each household's whole bill, so a measure exclusion holds it as a diagnostic, measured on every evaluation, until a whole-bill total is in Chronicle (María's ruling of 2026-10-25).
1 change: 1 addition & 0 deletions changelog.d/1095-uk-engine-defaults-signed.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Seven more policyengine-uk inputs that the UK build leaves at the engine's default are recorded in `UK_ENGINE_DEFAULT_INPUTS`, each with the error it can make (microcosm#1095): `uc_receives_new_claimant_health_element`, which the engine draws for data from 2026; the three regulation 77 company stocks (`owned_company_capital`, `owned_company_holding_value` and `owned_company_trade_assets`); the two intermediaries inputs; and `benunit_reported_capital`, which the build's complete capital overrides make redundant. The existing tests hold that each is an engine input the mapping leaves unbound and that no spine column writes it.
1 change: 1 addition & 0 deletions changelog.d/1095-uk-gambling-stake-scale-bound.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The gambling participation gate (`uk_stage_lcfs_consumption_gambling_participation`, microcosm#1359) lets the stake scale reach 2.5 instead of 2.0 (María's ruling of 2026-10-26, microcosm#1095). The scale is what the stage multiplies the added regular players' drawn stakes by to bring their mean to the seen players'. Full spine builds, on main after #1381 and on this branch, put the National Lottery's at about 2.03, against 1.82 to 1.86 on the stage-only runs that set the bound, so every full UK spine stopped at this gate. A draw more than 2.5 times off the seen players' mean still fails.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The OBR income tax row, HMRC's income tax by total income band, the ten regional HMRC income tax rows and the 32 HMRC taxpayer filters read income tax before the Winter Fuel Payment charge (`income_tax_before_winter_fuel_payment_charge_annual`), which policyengine-uk adds to `income_tax` from 2.157.0 (María's ruling of 2026-10-25, microcosm#1095). HMRC's statistics predate the charge, and HMRC recovers 2025's payments through 2026-27 tax codes and self assessment, so the FY2025-26 receipts in the OBR row's window hold almost none of the recovery. The filters select the same people either way, since anyone the charge reaches pays income tax before it. `obr.winter_fuel_allowance` needs no change: from 2.157.0 its column is the gross payment, like DWP's spending.
1 change: 1 addition & 0 deletions changelog.d/1095-uk-incumbent-age-rows-two-bases.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The incumbent evaluation (`tools/evaluate_uk_incumbent_surface.py`) reports the local age rows on two bases: against the mid-year estimates, which count residents of communal establishments, and against the same estimates less each area's census communal share for the band, which the household frame can hold (María's ruling of 2026-10-25, microcosm#1095). Each age row carries its `communal_share` and `incumbent_target_private_households`, and the summary and the markdown give the share of those rows within 25% on each basis. The census residence-type computation moves from `tools/uk_target_surface_receipt.py` to `uk_runtime.communal_residents`, which both tools now read; the communal receipt is unchanged. The targets still count communal residents; moving every age target to private households stays with the age-universe change.
1 change: 1 addition & 0 deletions changelog.d/1095-uk-loss-relief-named-terms.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The HMRC loss-relief measures become named terms of the binding interpreter's expression grammar, declared once in `UK_LOSS_RELIEF_TERMS` (microcosm#1095): `self_employment_income_after_loss_relief` is `max(self_employment_income - loss_relief, 0)` and `total_income_after_loss_relief` is `total_income - self_employment_income + self_employment_income_after_loss_relief`. The grammar gains one function, `max(<sum>, 0)`. The measure resolver evaluates a named term from its leaves, all from one source (the frame's columns at the frame's own period when the frame stores every leaf, the engine otherwise), and each `_annual` form on the annual income simulation, so the bindings keep their names and their values. The measurement-period receipt reads a value expression with the interpreter's parser, so a subtraction reads as two names.
1 change: 1 addition & 0 deletions changelog.d/1095-uk-obr-vat-private-school.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The held OBR VAT row, `obr.vat`, measures `vat + private_school_vat`: policyengine-uk charges VAT on private school fees from 1 January 2025 as `private_school_vat` from 2.157.1 (PolicyEngine/policyengine-uk#2319), and OBR's receipts include it (microcosm#1095). The row stays held as a measured diagnostic (María's ruling of 2026-10-24), and `tools/diagnose_uk_consumption_taxes.py` sums both parts too.
1 change: 1 addition & 0 deletions changelog.d/1095-uk-orr-rail-support-7271-held.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The held ORR rail-support row, `orr.rail_government_support`, is measured on ORR table 7271's net operational government support from all sources instead of table 7270's broad total, which adds enhancements and miscellaneous support that no household's rail use carries (María's basis ruling of 2026-10-25, microcosm#890 G, microcosm#1095). It stays held as a measured diagnostic: bound on table 7271 on #1383's arm 2c, it failed the weight-ratio gate.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
England's single adult council tax discount gains its billing-authority cells (microcosm#1095): a local-authority row on MHCLG's Council Taxbase line 8, all bands, whose measurement is the national row's, so the England row is its control, and whose cells are a part of England's households. Its metric `council_tax/single_adult_discount` is appended after the domestic energy metrics. Line 8's total is the row's one `linear_combination` operand, so each cell takes the latest return across its authority's codes, as the band cells do (Barnsley and Sheffield hold their earlier returns under their former codes). 294 of England's 296 authorities compile, with a signed local in-year hold; the support floor defers the Isles of Scilly and the City of London. The cells bind in the next dense build.
1 change: 1 addition & 0 deletions changelog.d/1095-uk-single-year-ages-report.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
A report-only check of single years of age (microcosm#1095; uk-data#600's age check): `tools/report_uk_single_year_ages.py` gives a built file's weighted persons by sex and single year of age (0 to 89, and 90 and over) beside ONS's mid-2025 UK estimates (MYE2, vendored in `ons_mid2025_single_year_age_by_sex.json`), and the same for 80 to 84, 85 to 89, 90 and over and 80 and over. No target binds the estimates. A cell that fewer than 10 source households carry reads "<10". When any single year of a sex is withheld, every cell of that sex reads "<10", its bands too, so the sex's persons less its shown ages cannot give a withheld age back.
1 change: 1 addition & 0 deletions changelog.d/1095-uk-winter-fuel-fy2025-26.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
`obr.winter_fuel_allowance` binds OBR's FY2025-26 winter fuel payments alone instead of a calendar-2025 window of FY2024-25 and FY2025-26 (María's ruling of 2026-10-26, microcosm#1095). The payment falls in November and December, so calendar 2025 holds the 2025-26 winter, when every eligible pensioner is paid and the charge recovers the payment above £35,000, as policyengine-uk models it from 2.157.0. The window mixed in a quarter of FY2024-25, when only pensioners on Pension Credit or another means-tested benefit were paid, and left the row outside 10 percent of its target on the head arm.
1 change: 1 addition & 0 deletions changelog.d/uk-policyengine-uk-2-162.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The UK lock moves from policyengine-uk 2.151.0 to 2.162.3, the newest on PyPI; policyengine-core stays at 3.33.3 (microcosm#1095). From 2.155.0 the engine takes population growth from the OBR's March 2026 determinants, so the per-capita mixed-income and GDP indices of the uprating pins move, and so do the household-weight projection the release divides by, the bonus sacrifice anchor and the growth path the CGT projection gate pins. From 2.162.2 the engine's `savings_interest_income` is the interest outside tax-free accounts: a file with no ISA income contract is read as gross, and the engine takes `tax_free_savings_income` out of it when it loads the file. The frame still writes gross interest, and now declares that legacy-gross contract itself, in every H5 it writes and in the datasets it hands the engine, rather than rest on the engine's default. So the HMRC SPI interest amounts by income band now measure the interest outside ISAs, as SPI Table 3.7 counts it, and the ONS interest diagnostic adds the ISA part back. The SPI interest counts by band now count the recipients of interest outside ISAs too: their filter reads the frame's gross interest less its ISA part, so a person whose only interest is ISA interest is no longer counted. `isa_cash_interest_flat_rate_charge` (2.162.2), a tax on the cash interest in non-cash ISAs from 2027-28, joins the HBAI deductions that the survey-concept gross income adds back, in the LCFS, NTS and ETB VAT stages. From 2.162.2 the engine keeps each student loan holder's recorded plan and repayment when it projects the dataset (PolicyEngine/policyengine-uk#2636), where it used to relabel them by a course started at 18, so the SLC rows read the plans the stage dated, at 2025. `individual_savings_account_interest_income` now has a formula, so the concept mapping no longer binds it. The concept coverage adds 22 inputs. `would_claim_wales_childcare_offer` (2.155.0) stays at its default, recorded with its error, until Chronicle carries the Offer's take-up (María's ruling of 2026-10-25). These new inputs also stay at their defaults, recorded with their errors: the three Housing Benefit inputs (main-phase ESA, the protected family premium and the severe disability premium's joint-occupier exclusion) and the five exceptions to the two-child limit (2.161.0); Northern Ireland's Energy Price Guarantee inputs (2.161.1); and the ISA dividend and non-cash ISA interest inputs, the Lifetime ISA's flows and the two purchase flags (2.162.2).
Loading
Loading