Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
8e2fb19
Hash every target-deciding module in both UK target kernels; add a ta…
juaristi22 Oct 7, 2026
480cb0d
Name the SPI amounts' ITL band index in the contract, as the committe…
juaristi22 Oct 7, 2026
46ff770
Enforce UK cross-grain coverage: nation grain, multi-leg rows, partit…
juaristi22 Oct 7, 2026
504dd62
Reconcile the UK national register across its own grains and bind the…
juaristi22 Oct 7, 2026
3012a32
Declare every UK hold: uprating holds register, local appliers, refus…
juaristi22 Oct 9, 2026
d61a0ce
Hold the salary-sacrifice income-tax and employee-NIC reliefs on the …
juaristi22 Oct 9, 2026
1082c68
Keep zero-valued targets in the loss on purpose and census them (#104…
juaristi22 Oct 9, 2026
4230dbb
Read a numeric month beside its year as a period in layout values (#1…
juaristi22 Oct 9, 2026
8b517b2
Re-pin the UK Chronicle feed to 942a1fa: the 2025 calibration inputs …
juaristi22 Oct 10, 2026
a607a1a
Add a rolled_forward_by_ratio value operation with period-pinned oper…
juaristi22 Oct 10, 2026
f2611a4
Bind HMRC income on a taxpayer basis at both grains and reconcile the…
juaristi22 Oct 10, 2026
a2de54f
Control census households by each nation's official estimate; partiti…
juaristi22 Oct 10, 2026
65da09c
Drift England's census tenure shares by SPREE's 2022-2024 share chang…
juaristi22 Oct 10, 2026
3ba282f
Bind UC by area as the calendar-2025 mean; partition the child bands;…
juaristi22 Oct 10, 2026
d6ca337
Defer local cells below a small-cell floor by rule, with expiry (#112…
juaristi22 Oct 10, 2026
672fd0a
Compare monthly window members by record set, not by selector spec id…
juaristi22 Oct 10, 2026
b0a1b42
Author a ratio operand from its own publisher's facts (#1123)
juaristi22 Oct 10, 2026
e520418
Declare a roll-forward built from lower-grain cells as a composed row…
juaristi22 Oct 10, 2026
94ff1d5
Keep the UC three-plus band's declared monthly window in the local ge…
juaristi22 Oct 10, 2026
143a29f
Sum the UC child-count cells across their own record sets in one wind…
juaristi22 Oct 10, 2026
ff29f99
Read the SPREE tenure concept where the vendored rows carry it (#1123)
juaristi22 Oct 10, 2026
8407e73
Document the household, income, caseload and small-cell controls (#1123)
juaristi22 Oct 10, 2026
4d9795e
Pin Northern Ireland bus receipts to DfI's 2025-26 restatement (#1123…
juaristi22 Oct 10, 2026
b16caef
Scan only a reference's own sources in the UK national compile (#1123)
juaristi22 Oct 10, 2026
b5fb22f
Retire the transitional target-doctrine exceptions ledger (#1123 C12)
juaristi22 Oct 10, 2026
58068d8
Bind HMRC higher and additional rate taxpayers by region and nation, …
juaristi22 Oct 10, 2026
e7a300a
Drop the C2 changelog fragment: main fixed the contract drift (#1123)
juaristi22 Oct 10, 2026
8155ac1
Regenerate the UK target surface on the 942a1fa feed with every #1123…
juaristi22 Oct 10, 2026
01553d7
Re-pin the digests #104's solve.py edit moves (#1123)
juaristi22 Oct 10, 2026
2273739
Count a roll-forward as moved, and retire the UC holds the re-pin mad…
juaristi22 Oct 10, 2026
60a3ab9
Give the summed fan-out control a contract-shaped signature (#1123)
juaristi22 Oct 10, 2026
1f09454
Re-pin the US spec digest and the diesel donor factor the engine lane…
juaristi22 Oct 11, 2026
81b488b
Keep an unsigned hold or small-cell rule out of force (#1198 review, …
juaristi22 Oct 11, 2026
77c7acf
Gate the reconciliation where the #1198 review found it open
juaristi22 Oct 11, 2026
88b9655
Say what the UC area bridge reconciles, and correct stale text (#1198…
juaristi22 Oct 11, 2026
7397f87
Regenerate the local surface with the small-cell rules unsigned (#119…
juaristi22 Oct 11, 2026
27aae7a
Name the files a target-surface receipt was run over that differ from…
juaristi22 Oct 11, 2026
1bb87dc
Pin on the engine what the marginal-rate targets measure (#1198 revie…
juaristi22 Oct 11, 2026
510e5af
Commit the before and after target-surface receipts' extracts (#1198 …
juaristi22 Oct 11, 2026
ceb3f00
Sign the 16 UK uprating holds (juaristi22, 2026-10-11)
juaristi22 Oct 11, 2026
637346a
Put a register entry in force only at status approved (#1198 re-revie…
juaristi22 Oct 11, 2026
2764c21
Bound what the HMRC area cells take, and keep absent cells' share off…
juaristi22 Oct 11, 2026
3184645
Test each subset relation on what it states (#1198 re-review, F)
juaristi22 Oct 11, 2026
c964e7a
Check each band bridge against Table 3.11's own UK row (#1198 re-revi…
juaristi22 Oct 11, 2026
a230fdd
Record what a receipt's working tree adds to its commit (#1198 re-rev…
juaristi22 Oct 11, 2026
b8feb38
State the higher-rate rounding as a bound, not a floor (#1198 re-revi…
juaristi22 Oct 11, 2026
8ab3101
Leave out an off-surface area the run's own ladder does not carry
juaristi22 Oct 12, 2026
7a4ecb9
Re-run both target-surface receipts and their extracts (#1198 re-review)
juaristi22 Oct 12, 2026
3a1acb5
Reconcile the rebased target surface with main's #1113, #940 and #1178
juaristi22 Oct 12, 2026
a864c84
Rebuild the target-surface evidence on the rebased branch (#1198)
juaristi22 Oct 12, 2026
21da310
Reconcile the rebased target surface with main's #1145 (property income)
juaristi22 Oct 12, 2026
7d49e01
Warn before the uprating holds lapse, and hold them to their signed w…
juaristi22 Oct 12, 2026
b75e8fb
Bound the implied cells and guard the ladder rule (#1198 re-review 2,…
juaristi22 Oct 12, 2026
cd39d03
Record the three items of Vahid's #1145 review in the #1106 receipts …
juaristi22 Oct 12, 2026
a4df360
Rebuild the target-surface evidence on main at 51a263726 (#1198)
juaristi22 Oct 12, 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
1 change: 1 addition & 0 deletions changelog.d/104-zero-target-loss-census.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Calibration options now census the zero-valued targets under target_loss_scales.zero_targets (count, scale range, loss-weight range, zero-weighted rows): it reports each zero target's scale (max(abs(target), 1) by default) and loss weight, so a weighting scheme that drops one is visible in the diagnostics; the census reports and does not enforce a positive weight (microcosm#104).
1 change: 1 addition & 0 deletions changelog.d/1123-band-bridge-explained-factor.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Each national band bridge now names what explains its factor and the compile checks it on the values: the factor must sit within half a point of HMRC SPI Table 3.11's United Kingdom row over the twelve regional areas' sum (the taxpayers HMRC places in no region), read from a vendored resource of the UK rows (microcosm#1123).
1 change: 1 addition & 0 deletions changelog.d/1123-chronicle-repin-942a1fa.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The UK Chronicle feed is re-pinned to 942a1fa (PolicyEngine/chronicle#313 via #314): mid-2025 population for the UK, regions and every local authority, the revised mid-2024 estimates, monthly UC by area, household, tenure, census residence and rent inputs, and newer SLC, ISC, public sector employment, land and DfI editions; the national population rows, local-authority ages, SLC repayments, land (preliminary 2025), ISC and DfI move to their 2025 editions, public sector employment binds its 2025 quarterly mean, and spine inputs move only by publisher revisions (microcosm#1123).
1 change: 1 addition & 0 deletions changelog.d/1123-enforced-cross-grain-coverage.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
UK cross-grain reconciliation gains a nation grain, lower rows that span several legs (England over its regions), same-geography partitions and a refusal of partial middle tiers; the UK declarations move to uk/cross_grain_declarations.json and a coverage check refuses any undeclared multi-grain overlap or local target without a control (microcosm#1123).
1 change: 1 addition & 0 deletions changelog.d/1123-hmrc-area-taxpayer-basis.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
HMRC income targets are bound on a taxpayer basis at both grains (income_tax > 0; employment and self-employment counts count income != 0, as HMRC counts a loss with nil income); the area rows take HMRC's all-ranges ITL growth to 2025 and reconcile per grain to the national SPI band partition summed over every band, gated at each grain on source agreement (within 2%) and on the gap between the two sides' uprating indices (each bridge's measured gap plus half a point); fan-outs are never exact-signature controls (microcosm#1123).
1 change: 1 addition & 0 deletions changelog.d/1123-hmrc-rate-band-taxpayers.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
HMRC higher and additional rate Income Tax payers bind for each English region and nation (Income Tax liabilities Table 2.2, the calendar-2025 window of the 2024-25 and 2025-26 projections, on the engine's tax_band), and higher rate taxpayers bind by constituency and local authority in England, Wales and Northern Ireland (SPI 2023-24 Tables 3.14 and 3.15), each region or nation row controlling its area cells; Scotland's area cells predate its advanced rate and the additional rate area cells are too rounded and suppressed to bind (microcosm#1123).
1 change: 1 addition & 0 deletions changelog.d/1123-local-small-cell-rule.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Local cells below a declared small-cell floor (uk/local_small_cell_rule.json: council-tax band cells under 50 dwellings, and higher rate taxpayer cells of 5,000 or fewer; both rules are proposed and unsigned, so they defer nothing yet) are deferred by rule with an expiry the loader enforces; the joint surface still counts a deferred cell's value in its leg's control (microcosm#1123 item 7).
1 change: 1 addition & 0 deletions changelog.d/1123-nation-household-controls.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Each nation's official household estimate for 2025 controls its census household cells (LFS for England's regions, NRS for Scotland, Welsh Government rolled forward for Wales, Census 2021 rolled by LPS dwelling stock for Northern Ireland); the UK household composition takes the nations' sum, A15 uprates census cells to it with the LFS UK total kept as a diagnostic, and census tenure cells partition their authority's households (microcosm#1123).
1 change: 1 addition & 0 deletions changelog.d/1123-national-compile-source-index.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The UK national target compile scans only the facts of the sources a reference's selectors name, in feed order, instead of the whole Chronicle feed once per reference (microcosm#1123).
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The UK national target register is reconciled across its own grains (exact signatures, and HMRC ITL Table 2.5 bands controlling the SPI regional band cells) and written back before the measure exclusions and the frozen-register check, in both the full and national loaders; the joint local pass refuses a national factor away from one (microcosm#1123).
1 change: 1 addition & 0 deletions changelog.d/1123-off-surface-cells.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
A signed local cell that is off the UK target surface (deferred with its published value, or absent from the publisher's table) now counts in its leg's control where a control moves the leg, so the leg's bound cells no longer take its share: the South West's local authorities took 2.4% more employees than its constituencies because HMRC's local-authority tables carry no Torbay row (microcosm#1123).
1 change: 1 addition & 0 deletions changelog.d/1123-rolled-forward-by-ratio.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Ledger target references gain a rolled_forward_by_ratio value operation: an official estimate for an earlier period (one cell or the sum of its cells) carried to the target period by base * numerator / denominator, with the numerator pinned to the target period, the denominator to the base's own period, and the growth bounded to (0.5, 2] (microcosm#1123).
1 change: 1 addition & 0 deletions changelog.d/1123-target-compile-hash-and-receipt.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Both UK target kernels hash every module that decides a target value (the shared resolver and the HMRC uprating appliers were missing), and tools/uk_target_surface_receipt.py writes and diffs receipts of the compiled target surface (microcosm#1123).
1 change: 1 addition & 0 deletions changelog.d/1123-tenure-share-drift.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
England's census tenure shares drift by ONS SPREE's change in each category's share of the authority's dwellings from 2022 to 2024 (dwellings move shares, never levels); other nations hold their census shares (microcosm#1123).
1 change: 1 addition & 0 deletions changelog.d/1123-uc-area-calendar-window.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
UC by area binds the calendar-2025 mean of DWP's monthly series (the window the national UC rows use) and its child bands follow each constituency's caseload; the area series still counts every household on UC while the national rows count paid claims, so the bridge applies the GB paid share (0.921) to every area until a paid-claims area series is pinned; the receipt tool gains a census communal-establishment validation (--communal) (microcosm#1123).
1 change: 1 addition & 0 deletions changelog.d/1123-uprating-holds-doctrine.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Every UK target the calibration-year compile binds from an older fact now carries either a declared uprating index or a declared hold in uk/uprating_holds.json (matched_period, in_year_snapshot, control_rescaled, reviewed_no_index); the compile refuses an undeclared, unsigned, expired or stale hold (a register entry is in force only with an approver, an approval date and the status approved), and a local area target that declares an index is uprated at authoring and at compile as national targets are (microcosm#1123).
16 changes: 8 additions & 8 deletions docs/evidence/spec-engine/us-f0-coverage.json
Original file line number Diff line number Diff line change
Expand Up @@ -1656,13 +1656,13 @@
"compiler_ir.node_slices"
],
"expected": {
"map_sha256": "7d03cc07e973165f38781d5932d5fe6d16ca0b1e4dc854e7841460737fd043fb",
"protocol_sha256": "37da8f68444677850a97bdf958b7f62b426a60da570b80a002eeba8af4861f68"
"map_sha256": "bdd339868ee0cec07fa3a52a91c4bd97de707c15aeb0dc224b064be9ce04eb4b",
"protocol_sha256": "8d028354d487eadecf3bc4a950d70c95e5c44c792fe7fdf2d52c77e6d86a7886"
},
"failures": [],
"observed": {
"map_sha256": "7d03cc07e973165f38781d5932d5fe6d16ca0b1e4dc854e7841460737fd043fb",
"protocol_sha256": "37da8f68444677850a97bdf958b7f62b426a60da570b80a002eeba8af4861f68"
"map_sha256": "bdd339868ee0cec07fa3a52a91c4bd97de707c15aeb0dc224b064be9ce04eb4b",
"protocol_sha256": "8d028354d487eadecf3bc4a950d70c95e5c44c792fe7fdf2d52c77e6d86a7886"
},
"status": "covered"
},
Expand All @@ -1677,7 +1677,7 @@
"compiler_ir.seed_stream_map"
],
"expected": {
"implementation_sha256": "37da8f68444677850a97bdf958b7f62b426a60da570b80a002eeba8af4861f68",
"implementation_sha256": "8d028354d487eadecf3bc4a950d70c95e5c44c792fe7fdf2d52c77e6d86a7886",
"protocol": "legacy-v1",
"streams": [
"build_model",
Expand All @@ -1698,7 +1698,7 @@
},
"failures": [],
"observed": {
"implementation_sha256": "37da8f68444677850a97bdf958b7f62b426a60da570b80a002eeba8af4861f68",
"implementation_sha256": "8d028354d487eadecf3bc4a950d70c95e5c44c792fe7fdf2d52c77e6d86a7886",
"protocol": "legacy-v1",
"streams": [
"build_model",
Expand Down Expand Up @@ -2599,7 +2599,7 @@
"country": "us",
"schema_id": "country_spec",
"schema_version": 1,
"spec_sha256": "fbf25dbae68242198972f5bef4f1fc20f65ee0769615b8d94639e6a80121f31f"
"spec_sha256": "638cd60e97a9b200f8bdfd4f92e67be986f516ac25b9a37508235963e695e640"
}
},
"report_schema_version": 3,
Expand All @@ -2609,7 +2609,7 @@
"country": "us",
"schema_id": "country_spec",
"schema_version": 1,
"spec_sha256": "fbf25dbae68242198972f5bef4f1fc20f65ee0769615b8d94639e6a80121f31f"
"spec_sha256": "638cd60e97a9b200f8bdfd4f92e67be986f516ac25b9a37508235963e695e640"
},
"status": "pass"
}
114 changes: 114 additions & 0 deletions docs/evidence/uk-target-surface-1123/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
# Evidence for the UK target surface change (microcosm#1123, PR #1198)

Two receipts of the compiled UK target surface, written by
`tools/uk_target_surface_receipt.py`, and what they show. The receipts carry
every bound row (6.5 MB and 7.4 MB), so they stay outside the tree under
`data/ukds/acceptance/1123-pr-a/receipts/`. The two extracts here are written
from them by `scripts/extract_surface_receipts.py`.

## The two receipts

- **Before:** `before-51a263726.json`. `main` at `51a263726`, the commit the
branch is rebased on, with only the commit that adds the receipt tool (it
moves no value), on the feed `main` pins, Chronicle `1ee7dfe`.
- **After:** `after-cd39d037e.json`. Branch commit `cd39d037e`, on the feed it
pins, Chronicle `942a1fa`, with `--communal`.

Both use review date 2026-10-12 and the 2021 output-area ladder of the
2026-10-04 local build.

**Each receipt records what its working tree added to the commit it names**
(`code_modifications`): every file under `packages` and `tools` that differs
from `code_head`, with the SHA-256 of its content, and the diff of the tracked
ones. The extracts keep the file list and the diff's digest.

- **After** ran on a clean tree: no file differs from `cd39d037e`. The hold
register is signed, so the compile needs no overlay.
- **Before** names six files. `main` does not carry the receipt tool, so the
tool's commit was laid over `51a263726`, uncommitted, with the provenance
record added to the tool. That overlay is `before-overlay.diff` here; its
SHA-256 is the `diff_sha256` that `surface-diff.json` records for the
before receipt.

## `surface-diff.json`

What the surface moves between the two receipts.

- **National, bound rows:** 1,177 before and 1,213 after. 36 added, none
removed, 552 moved.
- Added: the 12 nation household control cells and the 24 Income Tax
liabilities Table 2.2 marginal-rate cells.
- Moved by this change's own reconciliation: 360 SPI regional cells (the
band bridges) and 24 CGT regional cells.
- Moved by the re-pin and the household controls: 149 population rows, the
10 household-composition rows, 3 land rows, 3 SLC repayment rows, and one
row each for DfI, ISC and public sector employment.
- **Local cells:** 20,885 before and 21,804 after. 919 added (higher rate
taxpayers by area), none removed, 18,811 moved. The file gives each target
at each grain: cells, totals before and after, and the spread of the
relative moves.
- 437 of the moved cells move only because a deferred authority no longer
leaves its share on its neighbours: the council-tax band A to G cells of
London and the South West (406) and Scotland's band H cells (31). The
widest move is 0.5%.

The national count is of bound rows, after the measure exclusions. The
reference register is larger (1,245 active references before, 1,281 after).

## `reconciliation.json`

How the after surface was reconciled.

- **`national_reconciliation.band_bridges`:** the 24 bridges from the UK
Table 2.5 bands to the SPI regional cells. Each carries its factor, its
declared `max_factor_shift`, and `explained_factor`: Table 3.11's United
Kingdom row over the regional cells' sum, which the factor must sit within
half a point of. 21 factors equal it to five decimals; the widest gap is
0.19 points. The widest factor is income tax at £12,570 to £15,000, 1.0573
against a bound of 0.063.
- **`national_reconciliation.sum_bridges`:** the UK household composition
scaled onto the nations' sum (29,003,000 to 29,082,020).
- **`fanout_sum_bridges`:** each HMRC area bridge at each local grain, read
before any reconciliation. Both parts of the factor the cells take are
gated.
- `source_factor` is the bands over the cells before either side's
uprating index: 0.999 to 1.006 at constituency grain and 1.003 to 1.008
at local-authority grain, against 2% (`max_factor_shift`).
- `index_factor` is the gap between the two sides' indices: 0.997 to 1.014,
each inside its bridge's `max_index_shift`.
- `applied_factor` is their product, 0.996 to 1.019.
- `off_surface_cells` counts the frame's rows for cells that are not bound;
the totals include them.
- **`off_surface_cells`:** the signed cells that are off the surface and
still count in their leg. 44 frame rows: 38 deferred cells with a published
value, and 6 implied for cells the publisher's table does not carry. Torbay
and the Isles of Scilly are implied at 2.3% of the South West's employees;
their share of its households is 2.6%. Each implied row carries that
`household_share` and its `share_ratio`, which the compile refuses above
1.5: the ratios are 0.32 to 0.89. `areas_outside_the_ladder` is empty.
- **`cross_grain_groups`:** every group's factor by leg. The local-authority
legs under the constituency totals (`constituency_over_la`) are 1.018 to
1.021 on employment counts and 1.008 to 1.011 on employment amounts. The
North East's 1.029 on self-employment amounts is the two tables' own gap
at source: that leg is whole at both tiers.
- **`subset_relations`:** each declared part against its whole on the compiled
values. All 20 tests hold and none is skipped. The nine age bands and the
two 90-and-over rows are tested on their sum, which equals the UK total.
- **`uprating_holds`:** the held targets by kind and the earliest expiry,
2026-12-11, at both grains.
- **`partitions`, `communal_validation`:** counts and spreads.

## Reproducing

```
uv run --no-sync python tools/uk_target_surface_receipt.py \
--ledger-facts <chronicle consumer artifact at the pinned commit> \
--ladder <uk_oa_ladder_2021.npz> --review-date 2026-10-12 \
[--communal] --out <receipt.json>
python docs/evidence/uk-target-surface-1123/scripts/extract_surface_receipts.py \
<before.json> <after.json> docs/evidence/uk-target-surface-1123
```

Neither input is in the repository: the consumer artifact comes from
Chronicle's `build-bundle --suite uk` and `build-consumer-artifact` at the
commit `uk/chronicle_feed.json` pins, and the ladder from a UK local build.
Loading
Loading