Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
df24789
Read the vendored OBR costing rows in the high-value homes gate (#1278)
juaristi22 Oct 16, 2026
c6353bd
Name the main-residence scope of the high-value homes evidence (#1278)
juaristi22 Oct 16, 2026
ee26a44
Track the registers on #1278, which #1123 and #1207 closed into
juaristi22 Oct 16, 2026
4dd633b
Record which study conditions the UK disclosure floor answers to (#1278)
juaristi22 Oct 16, 2026
55a9b05
Draw zero-emission cars per vehicle in the UK LCFS stage (#1278)
juaristi22 Oct 16, 2026
77febc5
Review the rowwise binding adjudications on a date the caller gives (…
juaristi22 Oct 16, 2026
fdce3ce
Record where each LCFS division's over-draw sits (#1278)
juaristi22 Oct 16, 2026
0d0ef3b
Re-pin the UK parity register to uk-data a43e8c5 (#1278)
juaristi22 Oct 16, 2026
0514b9c
Take Northern Ireland's energy share from DESNZ's own rows (#1278)
juaristi22 Oct 16, 2026
eb986ae
Withhold thin high-value homes totals and read the OBR rows strictly …
juaristi22 Oct 17, 2026
913591f
Point two hold reasons and the SLC exclusions at #1278 (#1278)
juaristi22 Oct 17, 2026
3fe9287
Drop the threshold of 30 from the baselines tool's outputs (#1278)
juaristi22 Oct 17, 2026
31fdc9f
Count source households in the LCFS receipts and stop the tails diffe…
juaristi22 Oct 17, 2026
67e54c4
Keep the rowwise tests' review date without an import-time assert (#1…
juaristi22 Oct 17, 2026
fa468ba
Name the parity register's Housing Benefit and employment-count gaps …
juaristi22 Oct 17, 2026
01561db
Regenerate the local receipts for Northern Ireland's energy share (#1…
juaristi22 Oct 17, 2026
9c5fb7c
Floor the LCFS receipts on spenders and groups, and refuse unnamed co…
juaristi22 Oct 17, 2026
ba0f40f
Report every unreadable OBR row, and hash the terminal code once per …
juaristi22 Oct 17, 2026
01d20c2
Say that two source files and a test changed in the parity re-pin (#1…
juaristi22 Oct 17, 2026
9daf9bc
Word the two below-floor region rows as an expectation from the stock…
juaristi22 Oct 17, 2026
05bc871
Say how to regenerate the compile-parity receipts within memory (#1301)
juaristi22 Oct 17, 2026
55cd2b9
Carry the contract's warnings in the publisher's output and tag (#1301)
juaristi22 Oct 17, 2026
a89da79
Accept only citations of known repositories in sign-off free text (#1…
juaristi22 Oct 17, 2026
aaed85a
Walk more figure shapes, and every file the pre-flight ships (#1301)
juaristi22 Oct 17, 2026
0f764b1
Say how to retry build 1, and that the contract warns (#1301)
juaristi22 Oct 17, 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 @@
`microcosm.build.uk_runtime.receipt_counts` now records the study conditions behind the UK disclosure floor (microcosm#1278; the open question on microcosm#796). No study the build reads sets a minimum cell above CD171's working floor of ten: the FRS, LCFS, ETB, WAS and NTS add nothing to the End User Licence. The SPI 2022-23 Public Use Tape (SN 9422) adds two conditions: no attempt to attribute a record, and analyses of the tape go to HMRC at least ten working days before distribution or publication. The weighted-integrity baselines tool no longer asks whether a study requires a threshold of 30, in its docstring, its default's comment, the `--sdc-minimum-count` help or the caller obligations it writes into every receipt, and those obligations now carry the SPI tape's two conditions.
1 change: 1 addition & 0 deletions changelog.d/1278-division-capture-tail-shares.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The UK LCFS stage's report-only division capture now records where an over-draw sits (microcosm#1278). For each COICOP division it gives the share of spend held by the top 1% and the top 10% of households, on the frame at prior weights and on the donor at its design weights, and the frame's share over the donor's. The floors count the distinct source households that spend anything: the frame counts source households, not the copies it stacks of one, and refuses a frame that marks copies without naming their sources. A share is "<10", as every receipt count is, when one to nine of them sit in its top group, outside it (the division's total less the top group's spend would give back theirs), or between it and a shipped smaller fraction's group (the two shares' difference would). Furnishings and health on the 2023-24 diary, and recreation and education on the 2024-25 one, drew above the donor; the next build's receipt says whether the excess sits in the tail or the body.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The high-value homes evidence and both of its gates name their scope: owner-occupiers' main residences only. Second homes, let property and homes owned by companies or non-residents fall outside the family until the coverage decision (microcosm#1240 fix 6, tracked on microcosm#1278 since #1240 closed into it). The evidence summary and the details of `uk_high_value_homes_benchmarks` and `uk_high_value_homes_support` carry `scope.label = owner_occupied_main_residences_only`, with a note citing the OBR costing note's 40 per cent of properties in scope that are not owner-occupied. The family's description in the local-target census says the same.
8 changes: 8 additions & 0 deletions changelog.d/1278-high-value-homes-obr-leg.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
The high-value homes benchmarks gate reads the vendored OBR costing rows (`uk/obr_hvcts_costing_facts.json`) by concept, England, fiscal year and behaviour basis, so its OBR leg reports Table 1.1 (or 1.2) beside the frame's owner-occupied bands and the derived Land Registry stock. It had looked for an older row shape and reported `awaiting_vendored_facts` on every build (microcosm#1278).

- **The share.** The non-owner-occupied share comes from the note's own row (40 per cent), not from a stock-facts parameter that was never set, so the owner-occupied sensitivity (99,000 for 2028-29, static) and the frame's England total over it are reported. The note states the share once, for 2028-29, and the leg names the year its share is from.
- **The derived stock.** The leg reports the derived stock's private-sector count over Table 1.1's total. The stock build sets the owner-occupied share of England's £2m+ stock from the same OBR share, so an owner-occupied ratio would repeat that one and is not reported.
- **Statuses, not errors.** The leg needs every band and the total of one table, once each, each a finite, non-negative count. Otherwise it reports `no_matching_rows`, `incomplete_rows` or `malformed_rows`, and a share it cannot read leaves the band comparison standing. A missing or non-numeric value, or a row field that is not a mapping, is reported rather than raised, since the leg runs in the terminal phase after the solve.
- **Disclosure.** The shipped band counts now withhold the total when it rests on fewer than ten distinct source households. They withhold further bands until the withheld ones rest together on ten, so the total cannot give their sum back. The regional shares and their total follow the same rule.
- **Informational.** The gate's outcome does not depend on the leg.
- **Cache keys.** The calibrated gate node keys on the high-value homes code through its parameters (`terminal_code`), so a resumed graph store recomputes the evidence when that code changes. The full-gates kernel's own hash, which the source preflight inherits, leaves it out, because the dense solve keys on the preflight. An edit to `high_value_home_gates.py` therefore never re-solves. `high_value_homes.py` also feeds the target kernels, which hash it, so an edit there still re-solves. The hash is taken once per process, so editing the files during a build cannot fail the calibrated gates after the solve.
7 changes: 7 additions & 0 deletions changelog.d/1278-northern-ireland-energy-share.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
The UK local energy rows take Northern Ireland's part of the Energy Trends level from DESNZ's own Northern Ireland consumption (microcosm#1278; María's rulings of 2026-10-16 and 2026-10-17). Great Britain's share of UK households had stood in as an interim.

- **The factor.** Great Britain's part of the UK level is now its share of DESNZ's sub-national domestic consumption with Northern Ireland's row added (all domestic meters, 2024). Each fuel's factor is therefore the UK level over the UK sub-national total. Northern Ireland's electricity runs on financial years from April and its gas on DESNZ's Northern Ireland gas years; the year labelled 2024 pairs with Great Britain's 2024. DESNZ calls these figures not directly comparable with Great Britain's, and the basis text and receipt say so.
- **Why a share, not a subtraction.** The plan of record took Northern Ireland's row off the Energy Trends total. The sub-national statistics run about 9% (electricity) and 12% (gas) above Energy Trends, so that would take Northern Ireland out at a higher basis than Great Britain's part. The share keeps both nations on DESNZ's sub-national basis (María's ruling of 2026-10-17).
- **The vendored resource.** `desnz_local_energy_facts.json` vendors the two Northern Ireland rows in place of the four ONS LFS household totals.
- **The fence.** The `desnz_northern_ireland_interim_share` adjudication and its census fence retire. The two energy contract rows' notes say how Northern Ireland is taken out. The signed `desnz_subnational_consumption_basis` adjudication and its census fence gain one sentence on Northern Ireland's periods and comparability, with dates unchanged (María's rewording of 2026-10-17). The census lists DESNZ's two Northern Ireland publications among the family's sources.
- **The receipts.** The 348 electricity and 346 gas rows of the local compile-parity receipt, and the same cells' holds and resolved values in the local membership report, move by one factor per fuel: 0.99901 for electricity and 1.01582 for gas, the new factor over the interim's. Nothing else in either file moves. Both were regenerated on the abf0921 feed.
8 changes: 8 additions & 0 deletions changelog.d/1278-registers-track-1278.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
Twenty-four signed register entries now track microcosm#1278.

- **From #1123 and #1207.** Both closed into #1278 (María's ruling of 2026-10-16):
- the three consumption-tax measure exclusions that tracked microcosm#1207 (`ons.household_electricity_expenditure`, `ons.household_gas_expenditure`, `obr.fuel_duties_cars`);
- the 19 uprating holds that tracked microcosm#1123 (16) or microcosm#1207 (3).
- **From #868.** The two plan-2 student-loan borrower exclusions (`slc.borrowers.plan_2_liable`, `slc.borrowers.plan_2_above_threshold`) tracked microcosm#868, which closed on 2026-10-16 (María's ruling of 2026-10-17). Their adjudications record the move.
- **Unchanged.** Approvals, windows and the earlier adjudications, so nothing is re-signed.
- **The hold.** The plan-2 and plan-5 uprating hold keeps tracking microcosm#868.
6 changes: 6 additions & 0 deletions changelog.d/1278-rowwise-binding-review-date.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
The UK rowwise solve takes the date it reviews the local binding adjudications on (microcosm#1278). `prepare_uk_full_solve`, `solve_uk_rowwise_weights_under_doctrine` and `rotated_uk_local_holdout` accept `now` and pass it to `require_adjudicated_uk_local_binding`. Builds and the graph kernels still review on today's date; the `uk.full.problem` kernel and the holdout kernel taking the build's review date is a follow-up.

The engine-free rowwise tests now review the committed register on its latest approval date (`COMMITTED_BINDING_NOW` in `test_support`), not today. Seventeen of them would otherwise have warned from 2027-01-07 and failed from 2027-01-15, when the six local adjudications renewed under #1278 lapse. On that date the review is a build's: a lapsed fence a fixture binds still fails, a dormant one does not, and nothing is asserted when the module is imported.

- **Tests.** Two new tests check that a solve and every holdout fold refuse a date past the register's windows. Another shows that all five folds receive the date.
- **The calendar's warning.** `test_no_committed_local_adjudication_is_about_to_lapse` fails fourteen days before the earliest local adjudication expires, as the uprating holds' clock does, while builds still pass.
11 changes: 11 additions & 0 deletions changelog.d/1278-uk-data-parity-a43e8c5.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
The UK parity register now compares Microcosm with uk-data at `a43e8c5` (15 October 2026) rather than `8629dbb` (microcosm#1278). The inventory has 57 modules: two source files and a test changed, and three sources are new. The re-extraction changes no existing concern's classification; one is corrected by hand (the council-tax outlier guard, below). A second re-pin follows when uk-data#482 and #484 merge.

- **Four new concerns.**
- Pension-age Housing Benefit and Pension Credit are ported (`dwp.hb.amount_pension_age` and the pension-age caseloads; `obr.pension_credit` and the `dwp.pension_credit` rows). The Housing Benefit age split differs and the concern says how: uk-data applies the pension-age regulations, leaving out units on a working-age means-tested benefit, while Microcosm's rows read `eldest_adult_age` alone; re-binding goes with microcosm#867.
- Working-age Housing Benefit is routed to microcosm#867 and fenced against binding the full line.
- LFS employment is a blocked source, since the feed has no LFS series.
- **Updated citations.** The five `obr.py` line citations point at the moved functions.
- **The local employment-income count.** uk-data#529 made it validation-only in the incumbent's local calibration, outside the inventory's scope; its concern says so, and that whether Microcosm follows is a ruling owed on microcosm#1095.
- **Two corrected verdicts.**
- `local_council_tax_band_d_rate`'s origin now says Band D entered uk-data's loss only as the multiplier in England's `housing/council_tax_net` proxy.
- `credibility_local_council_tax_outliers` is a ported compile contract: Microcosm binds dwelling counts per authority from that authority's own row, and the local compile-parity preflight pins every cell.
8 changes: 8 additions & 0 deletions changelog.d/1278-zero-emission-cars-per-vehicle.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
The UK LCFS stage now draws the fuel-buyer flag per vehicle (microcosm#1278). Each of a household's vehicles is zero-emission at the battery-electric and fuel-cell share of the DfT VEH1103 licensed-car stock, so a household with `n` vehicles buys fuel unless all `n` are zero-emission: it is flagged at `1 - (1 - rate) ** n`, against the same identity-keyed uniform as before.

- One-vehicle households keep their flag.
- Households with several vehicles are no longer all one or the other, so they buy fuel more often.
- The declaration's `rate_rule` becomes `per_car_zero_emission_share` in the stage spec, the rendered stage roster and the sources schema.
- The fuel-flag receipt adds the flagged share among vehicle households and the share of vehicles in fuel-free households. The flag is per household, so a zero-emission car beside a petrol or diesel one keeps its household's fuel spend, and the second share sits below the per-car share the draw uses. The receipt's shares on each side difference into the households with and without a vehicle, crossed with fuel or none, so every share on a side is "<10" when any of those groups that is not empty rests on one to nine distinct positive-weight sources: the frame's source households, the donor's diaries.
- Who holds the zero-emission cars by income is still random (a later change).
- The release input coverage manifest and the H2 spine fixture are regenerated.
1 change: 1 addition & 0 deletions changelog.d/1301-uk-dense-build-1-retry.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The dense release runbook and the full-build graph doc say how to retry a failed or interrupted build 1 (microcosm#1301, answering the third review of microcosm#1307): into a new `--out`, with the same `--review-date` and `--graph-store` so that the retry reuses the nodes the failed attempt finished, and with `--logbook-prev-row-digest` naming the failed attempt's row when it spooled one. Nothing refuses an occupied `--out` for build 1, and a retry into the failed attempt's directory spools a second Logbook row there, which the sign-off drafter and `--verify` refuse and assembly can misread; clearing the failed attempt's row instead would drop its Logbook record. The graph doc also now says that the dense release contract warns on a shipped JSON document carrying a per-area support figure, rather than refusing it.
1 change: 1 addition & 0 deletions changelog.d/1301-uk-dense-disclosure-walk-shapes.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The dense release contract's disclosure walk finds the per-area support figures it still missed, and still only warns (microcosm#1301, answering the third review of microcosm#1307). It now reads an order statistic keyed above a figure's name as well as below it; `distinct_sources` and `sample_size` as an area record's fields, with `num_rows`, `row_count`, `kish_ess`, `source_households` and `distinct_source_households`, from one list the extreme names are built from too, so `min_distinct_source_households` is found again; a map of a figure by area or level (`rows_by_area`); an area record or table identified by any field holding an area code (`lad_code`, `geography`) and by `area_code` or `geography_id` in any case; a pandas `split` table, whose rows are read as records with their index labels; and a number written as text with thousands separators. A `code` field marks an area's table only as a list or a pandas column of area codes. A real-shaped candidate manifest still draws no warning: a cross-grain relation's `max_excess` and the spine gate's excess bound stay unflagged, under an order statistic too.
1 change: 1 addition & 0 deletions changelog.d/1301-uk-dense-preflight-walk.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The release pre-flight's disclosure walk over a finished dense run covers every file assembly ships byte for byte and reads them as the contract does (microcosm#1301, answering the third review of microcosm#1307). Besides the candidate manifest, the original diagnostics and the signed local report, `--candidate-dir` now walks the opt-in incumbent comparison's `score_vs_incumbent.json` and `incumbent_surface_evaluation.json` when the run directory holds them, and a new `--incumbent-manifest` names the extraction manifest assembly will attach, so the walk reads it too; a named manifest that is missing fails the pre-flight. Each file goes through the contract's own reader, `_uk_dense_disclosure_file_warnings`, which the release directory's walk now shares: NaN and the infinities are refused, and a file nested too deep to walk is reported as one the walk cannot rule out instead of crashing the pre-flight. Findings still print as warnings and never fail it. New tests drive `--candidate-dir` through to its warning lines with a planted figure in each walked file, the signed report's under a valid signature, and drive the dense assembler with a finding, which it prints and lists in its summary while still assembling.
1 change: 1 addition & 0 deletions changelog.d/1301-uk-dense-signoff-citations.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The dense sign-off drafter's free-text and login checks no longer let a figure through as a citation, and accept the citations they refused (microcosm#1301, answering the third review of microcosm#1307). Digits may now stand only in a citation of a repository on the tool's fixed `KNOWN_REPOSITORIES` list, matched in any case: an issue reference (`microcosm#N`, `chronicle#N`, `uk-data#N` or `PolicyEngine/<repo>#N`), a GitHub URL of an issue or pull request, optionally anchored on a comment or review (`#issuecomment-`, `#pullrequestreview-` or `#discussion_r` with the ten-digit id GitHub gives one), or a GitHub URL of a file, whose path may hold digits. A reference to a repository off the list, a count run into an anchor's id, a citation running into a word, and a citation right next to a noun a figure counts or belongs to (rows or households after it, a household or a weight before it) are refused, and an anchor now stands only in a URL. ISO dates must lie within 366 days of the day the tool runs, so a date-shaped figure far from it is refused. `--approved-by` accepts digits only in a login on the tool's `KNOWN_DIGIT_LOGINS` list, so login-shaped figures with one run of digits are refused while the reviewer's own login still passes. The runbook describes the new rule.
Loading
Loading