Repository navigation
UK local surface before the Budget build: high-value homes OBR leg, per-vehicle fuel flag, Northern Ireland energy share and housekeeping (#1278) - #1306
Conversation
Independent adversarial review of this PR at cf3aae4Run with Claude Code on 16–17 October 2026 at cf3aae4: seven independent review lenses (correctness, method, generated artifacts, tests, claims against the diff, disclosure, a second fresh-eyes pass), then one to three skeptics per finding who tried to refute it; (k/n) is how many agreed. No builds and no feed-gated tests were run. The head has not moved since the review. Keep this in draft; it should not merge yet. Item by item, the code mostly holds up: the targeted tests pass, the generators report current, and the vendored Northern Ireland rows match the abf0921 feed byte for byte. Two things block it:
Blocking
Should fix
MinorLow:
Nit:
Cross-PR
Disclosure check
Tests and tools run
Checked and found sound
Refuted during verification
Not covered
🤖 Generated with Claude Code |
cf3aae4 to
567d383
Compare
|
Every finding of the review above is addressed below. The branch is rebased onto main after #1302's merge, and the PR now targets main. History. The nine item commits are replayed on main. Only two messages change: J1 and D, which the review flagged. The fixes sit in seven commits on top, one per item, so each finding's change can be read on its own:
Blocking
Should fix
Minor
Nits
Cross-PR
VerificationLocal, since this is the first CI run on main. See the body for the counts:
The receipt and membership were regenerated on a cut of the pinned abf0921 artifact (digest checked against the pin), not the whole feed: both generators hold the whole file in memory. The cut keeps the constituency and local-authority rows that match a local contract selector. No local reference reads operands outside its own selector, so the cut holds every candidate. Every row other than the 694 energy cells came out byte-identical to the committed full-feed outputs. 🤖 Generated with Claude Code |
On main after #1302: 25,327 compiled cells. The 18 Scottish BRMA rows are ledger-only by construction, and no signed value moves. The UC drift rationales now read their fixture/ours bands off the rows, and the support floor's deferred cells carry their own signed rationale. The release-blocking preflight gate uk_ledger_compile_parity_local_incumbent_2025 reads this receipt, so whichever of #1305, #1306, #1307 and #1308 lands last regenerates it on the combined tree. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The energy module's docstring said consumption is calendar 2024 kWh. Since the abf0921 re-pin the gas rows are DESNZ's gas year 2024, which the sub-national lookups pair with calendar 2024 (SUBNATIONAL_PERIOD_TYPES); electricity stays on calendar years. Docstring only. The other wording the re-review names in this module (the module docstring's account of the Northern Ireland interim, UK_ENERGY_LEVEL_BASIS and the interim text in the household-share receipt) is left as it is: the two stacked changes that retire the interim, #1305 and #1306, rewrite those same lines, and UK_ENERGY_LEVEL_BASIS is stamped into each kWh cell's metadata, so it moves with their regeneration. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Re-review of this PR at 567d383Run with Claude Code on 17 October 2026, after the rebase onto main (post #1302), the seven fix commits (R1–R7) and the response. Three independent reviewers re-checked every first-round finding and every claim in the response, attacked the new code with synthetic probes, checked the new public text against the UK Data Service rules, and simulated the merges with #1305, #1307 and #1308. No builds and no feed-gated tests were run. VerdictEvery first-round blocker and should-fix item is fixed, and the reviewers verified each one in code. CI is 10/10 green at this head.
What is left is low. Low
Nits
Regeneration note for #1305The feed cut used for R7 (constituency and local-authority rows matching a local selector) was complete at this head. #1305 adds 18 First-round dispositions
Cross-PR
Disclosure checkThese parts of the new public text are clean:
Tests and tools run
🤖 Generated with Claude Code |
The benchmarks gate's OBR leg looked for observed_measure.source_concept and layout.record_set_spec_id, but uk/obr_hvcts_costing_facts.json carries a top-level concept and unit, layout.record_set_id, and the band and behaviour basis as dimensions. Every row was skipped, so the leg reported awaiting_vendored_facts on every build. It now selects rows by concept, fiscal year, behaviour basis and England, and takes the band from property_value_band (the group-by value for the total). A matching row with an unknown band or unit, or a repeated band, is refused. The non-owner-occupied share comes from the note's own row (40 percent), not from a stock-facts parameter that was never set. So the leg now reports the owner-occupied sensitivity, the derived stock's ratio to it, and the frame's England total beside it. Rows that match no requested year or basis report no_matching_rows. The leg stays informational. The full-gates kernel now hashes both high-value modules, so a resumed store recomputes the evidence. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The high-value homes family and its two report-only gates measure owner-occupiers' main residences. Second homes, let property and homes owned by companies or non-residents fall outside it, and the OBR costing note puts the properties in scope that are not owner-occupied at 40 per cent. Until the coverage decision of #1240 fix 6, every reading of these figures now names that scope: HIGH_VALUE_HOME_SCOPE travels in the evidence summary and in the details of both gates, and the family's census description says the same (uk_local_target_census.json regenerated). The target labels and the gates.json notes stay as they are. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Three consumption-tax measure exclusions (the two ONS energy rows and obr.fuel_duties_cars) still named #1207 in their tracking field and in their retire condition. Nineteen uprating holds named #1123 (16) or #1207 (3). Both issues closed into #1278, so every one now tracks #1278 (María's ruling of 2026-10-16). approved_on, expires_on and the adjudications are unchanged, so nothing is re-signed. The SLC hold keeps #868. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#796 had asked since #609 whether the SPI usage agreement or the FRS terms set a minimum cell of 30 rather than 10. Neither does. The UK Data Service catalogue entries for the FRS 2024-25 (SN 9563) and the SPI 2022-23 Public Use Tape (SN 9422) were read on 2026-10-16. Those for the LCFS, ETB, WAS and NTS studies were read on 2026-10-14. Only the SPI tape adds conditions to the End User Licence: no attempt to attribute a record, and analyses of the tape go to HMRC at least ten working days before distribution or publication. CD171's working floor of ten stands. The receipt-count module, the floor's canonical statement, now records this. The weighted-integrity baselines tool no longer tells its reader to check for a threshold of 30. No floor value changes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The fuel-buyer flag drew one Bernoulli per vehicle-owning household at the fuel-buyer share of licensed cars (one minus the battery-electric and fuel-cell share of DfT VEH1103). So a household with several vehicles was all one or the other, and multi-car households were flagged as zero-emission as often as one-car households. Each of a household's vehicles is now zero-emission at that share, independently. 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. One-vehicle households keep their flag. Each car is drawn zero-emission at the VEH1103 share, but the frame stores one flag per household, so a zero-emission car beside a petrol or diesel one keeps its household's fuel spend. Who holds those cars by income is still random; a later change conditions it. The declaration's rate_rule becomes per_car_zero_emission_share in the stage spec, the rendered stage roster and the sources schema, and the stage notes say so. The fuel-flag receipt adds the flagged share among vehicle households. The release input coverage manifest and the H2 spine fixture are regenerated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…1278) prepare_uk_full_solve called require_adjudicated_uk_local_binding with no clock, so every engine-free test that solves a bound local surface reviewed the committed register on today's date. The six local adjudications renewed under #1278 lapse on 2027-01-14. Seventeen tests would have warned from 2027-01-07 and failed from 2027-01-15, whatever the code did: rowwise, target-weight wiring, holdout and CGT observation period. prepare_uk_full_solve, solve_uk_rowwise_weights_under_doctrine and rotated_uk_local_holdout take an optional now and pass it on; builds and the graph kernels keep reviewing on today's date. The tests review on COMMITTED_BINDING_NOW, the register's latest approval, asserted to fall before its earliest expiry, as the national graph tests' review date does. An entry outside its window still fails them. Two new tests check that a solve and every holdout fold refuse a date past the windows, and the solve's receipt records the date it reviewed on. Checked by forcing the default review date to 2027-01-20: the 17 tests fail before this change and none after. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The report-only division capture already gave each COICOP division's frame total beside its donor's. Furnishings and health on the 2023-24 diary, and recreation and education on the 2024-25 one, drew above the donor, but the receipt could not say whether the excess came from a few heavy spenders or from the body of the distribution. Each division now also records the share of its 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. Households are taken by spend until they carry the fraction of the weight. A share carried by fewer than ten households is "<10", as every receipt count is. Nothing is gated. The stage's code changes, so the spine re-keys; the H2 fixture and the coverage manifest do not move. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The register still compared Microcosm with uk-data as it stood on 1 September (8629dbb). uk-data's main is now a43e8c5 (15 October), 136 commits on. Re-extracted there, the inventory has 57 modules. obr.py, hmrc_salary_sacrifice.py and tests/test_target_registry.py changed, and three sources are new. The re-extraction changes no existing concern's classification; one is corrected by hand (below). New concerns: - dwp_housing_benefit.py (uk-data#490) splits DWP's Housing Benefit line by age. The pension-age half is ported: Microcosm binds dwp.hb.amount_pension_age and the pension-age caseloads. The working-age half, net of supported and temporary accommodation, is routed to #867 and fenced against binding the full line. - dwp_pension_credit.py (uk-data#510) is ported: obr.pension_credit (stamped Great Britain by #1302) and the dwp.pension_credit rows. - ons_labour_market.py (uk-data#529) is a blocked source: the feed has no LFS employment series. The five obr.py line citations follow the functions that moved. Two verdicts are corrected. Band D entered uk-data's LA loss only as the multiplier in England's housing/council_tax_net proxy, never as a column. The council-tax outlier guard is a ported compile contract: each authority's cells compile from its own row, and the local compile-parity preflight pins every one. uk-data#482 and #484 are still open; a second re-pin follows when they merge. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The local-authority energy rows are levelled onto the LCFS stage's Energy Trends level, a United Kingdom total. DESNZ's sub-national figures cover Great Britain, so Great Britain's part of the level was taken at its share of UK households (ONS LFS), an interim fenced until Chronicle carried Northern Ireland's consumption. abf0921 (#1302) brought those rows, and María ruled on 16 October that the change stacked on the re-pin reads the share from them. Great Britain's part of the level is now its share of DESNZ's sub-national domestic consumption with Northern Ireland's row added (all domestic meters, 2024), so each fuel's factor is the UK level over the UK sub-national total. Northern Ireland's electricity runs on financial years from April and its gas on its own gas years. Both labelled 2024, they pair with Great Britain's 2024 as Great Britain's gas year pairs with its calendar-year electricity. DESNZ calls the Northern Ireland figures not directly comparable with Great Britain's, and the basis text and the receipt say so. desnz_local_energy_facts.json now vendors the two Northern Ireland rows in place of the four LFS household totals; its 697 meter rows are unchanged. The resource was cut with the tool's own vendor_resource from a grep superset of the pinned artifact's lines, under #1302's pin. The desnz_northern_ireland_interim_share adjudication and its census fence retire, and the two energy contract rows' notes say how Northern Ireland is taken out. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…1278) Review of microcosm#1306, items A and B. The band counts suppressed thin bands but always shipped the total, and added a complementary band only when exactly one was suppressed. The total is now withheld when it rests on fewer than ten distinct source households, and further bands are withheld until the withheld ones rest together on ten, so the total less the shipped bands cannot give back their sum. The regional shares, which sum to one, and their frame total follow the same rule. The ratios read the shipped counts. The OBR leg selects rows by concept, England, fiscal-year period type, year and basis, and needs every band and the total once. Otherwise it reports no_matching_rows, incomplete_rows or malformed_rows rather than raising in the terminal phase after the solve. It reads the share for its own year where the rows state one, else the note's one year, and names that year. The owner-occupied ratio is dropped: the stock build sets the owner-occupied share of England's 2m+ stock from the same OBR share, so it repeated the private-sector ratio. The full-gates kernel no longer hashes the high-value homes modules. The source preflight runs that kernel and the dense solve keys on the preflight, so an edit to report-only code re-solved. The calibrated node carries their source hash as terminal_code instead, checked before the kernel runs. The coverage decision is cited as tracked on #1278, which #1240 closed into: the scope note, its comment, the census family text and B's fragment. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review of microcosm#1306, item C. The salary-sacrifice reliefs' open ruling and the fuel-duty cars roll-forward still named closed #1123 in their reasons, though their tracking fields already said #1278; only the two reasons change. The two plan-2 student-loan borrower exclusions tracked microcosm#868, which closed on 2026-10-16. María ruled on 2026-10-17 that they move to #1278: their tracking fields change and their adjudications record the move. The plan-2 and plan-5 uprating hold keeps #868. Approvals and windows are unchanged, so nothing is re-signed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review of microcosm#1306, item G. Only the tool's docstring had changed: its default's comment, the --sdc-minimum-count help and the caller obligations written into every receipt still asked whether a study requires 30. All three now say that no study the build reads sets a minimum above ten. The obligations add the SPI 2022-23 tape's two conditions: no attempt to attribute a record, and material analysing it goes to HMRC at least ten working days before distribution. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rencing (#1278) Review of microcosm#1306, items J1 and H. The division tails' "<10" floor counted frame rows, but the frame stacks copies of one source household (the SPI support channel, the high-value home split). It now counts distinct source_household_id values, which the stage passes in; the donor keeps one row per LCFS household. Both fractions now come from one ordering. The top 1% leads the top 10%, so their difference is the spend of the households between them, and a top-10% share whose households beyond a shipped top 1% rest on one to nine sources is withheld. The fuel-flag receipt's share among vehicle households now carries the floor. It adds 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, and that share sits below the per-car share the draw uses. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
) Review of microcosm#1306, item E. COMMITTED_BINDING_NOW asserted at import that the register's latest approval preceded its earliest expiry. A partial renewal (six entries renewed, a dormant fence left to lapse) would have broken the collection of every module importing it, though a build's review passes on that register; the strict comparison was also a day early. It now asserts nothing: on that date the review is a build's, so a lapsed fence a fixture binds fails and a dormant one does not. Pinning the date took away CI's warning that the adjudications lapse. test_no_committed_local_adjudication_is_about_to_lapse fails fourteen days before the earliest local expiry, as the uprating holds' clock does. A holdout test shows all five folds receive the date. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…1278) Review of microcosm#1306, item D. - Pension-age Housing Benefit stays ported, with the difference stated. uk-data applies the pension-age regulations, leaving out units on Universal Credit, Income Support, income-based JSA or income-related ESA; policyengine-uk 2.132.6 encodes them as housing_benefit_pension_age_regulations_apply. Microcosm's four rows filter on the deprecated eldest_adult_age alone. Re-binding goes with #867. - The local employment-income count notes that uk-data#529 made it validation-only in create_datasets.py, outside the inventory's scope. Microcosm still binds it, and whether to follow is a ruling owed on #1095. The LFS concern points to it. - The TV-licence citation reads obr.py:620 (_parse_tv_licence) and 668-684 (the static rows before get_targets) at a43e8c5. - D's fragment says the re-extraction changes no classification and one is corrected by hand. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
) Review of microcosm#1306, item I. The local compile-parity receipt, which the release-blocking preflight reads, still carried the retired household-share factor on its 694 kWh rows. Regenerated on abf0921 at this head, exactly those rows move (348 electricity, 346 gas, ledger_value only), each by its fuel's new factor over the interim's: 0.99901 and 1.01582. The local membership report moves on the same cells' holds and resolved values. Everything else in both files, and the local references, is byte-identical to #1302's full-feed regeneration. Both generators hold the whole feed in memory, which this machine cannot. They ran on a cut of the pinned artifact, digest checked against the pin: the constituency and local-authority rows matching a local contract selector. No local reference reads operands outside its own selector, so the cut holds every candidate, as the unchanged rows confirm. María signed off a rewording of the desnz_subnational_consumption_basis adjudication and its census fence on 2026-10-17. One sentence on Northern Ireland's periods and comparability is added, with dates unchanged, so the caveat stays under an adjudication now the interim's fence is gone. The census also changes: - DESNZ's two Northern Ireland publications are family sources, verified 2026-10-17. - The electricity note says Northern Ireland is published separately. - The module docstring and the verified-on comment no longer describe the interim. I's fragment says why the share stands over the plan's subtraction (María's ruling of 2026-10-17): the sub-national statistics run about 9% (electricity) and 12% (gas) above Energy Trends, and the share keeps both nations on that one basis. The re-pin history entry points here. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…pies (#1278) Second review of microcosm#1306, items J1 and H. The fuel-flag receipt floored its share among vehicle households on the flagged count, so with one to nine fuel-free vehicle households it shipped and one less it gave back their share; the raw pair differenced into the same group. Every share on a side now differences into the households with and without a vehicle, crossed with fuel or none, so each is "<10" when any non-empty group rests on one to nine distinct positive-weight sources: the frame's source households, the donor's diaries. The division tails counted top-group rows, zero spenders included, and never floored the complement, though the division's total ships beside the shares. The floors now count sources that spend anything, and a share is withheld when one to nine of them sit in its top group, outside it, or between it and a shipped smaller fraction's group. The stage computes the source households once and hands them to both receipts; a frame that marks copies (the SPI support channel's clones, the high-value home split) without a source_household_id is refused, so a floor never falls back to rows. A stage test checks both receipts get them, and division_capture is tested with copies. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…process (#1278) Second review of microcosm#1306, items A and B. The OBR leg still raised on a matching row with a missing or non-numeric value, or a period or dimensions field that is not a mapping, and passed NaN or negative counts as available. Such a row is now reported: a count must be finite and non-negative, a field that is not a mapping reads as empty, and an unreadable share leaves the band comparison standing. uk_terminal_only_code_hash is memoised, so an edit to the high-value homes files while a build runs cannot fail the calibrated gates after the solve. Its docstring now says what it buys: an edit to high_value_home_gates.py never re-solves, but high_value_homes.py also feeds the target kernels, so an edit there still does. The hash test covers the preflight kernel #1307 added, which inherits the calibrated kernel's hash, and the memoisation. Two comments are corrected: the regional split withholds regions until the withheld ones rest together on the floor, and its threshold follows the derived stock while the bands follow OBR's. The evidence summary, not the gate details, carries the frame total. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…#1301) Third review of microcosm#1307. "At about one household weight each" in the high-value homes small-cell rule could read as a measured count of frame records. The rule and the changelog fragment now say the rows' published stock is about one average household weight each at the ruled 150,000 households, an expectation from the stock and not a count of frame records. The local membership, which copies the rule's reason into 601 rationales, is regenerated; nothing else in it moves. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Third review of microcosm#1307. The re-pin procedure now tells whoever regenerates the receipts to run one --surface at a time with nothing else running, since the tool holds every parsed fact and a run over both surfaces peaked past a 24 GiB machine on abf0921. It describes the local-selector cut microcosm#1306 used on a smaller machine, and when that cut holds. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Third review of microcosm#1307. The disclosure walk's warnings went to
stderr only: --preflight-only printed {"valid": true, "published":
false} without them, and nothing in the published tag recorded that a
release went out past them.
prepare_release now returns its contract warnings, and --preflight-only
adds them to its verdict, as a real publication adds them to its
printed pointer; a clean verdict is unchanged. The tag of a release
published past warnings says how many there were, never their text, and
no uploaded file carries them. Nothing refuses or asks for an
acknowledgement: the walk warns and never refuses.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
) Third review of microcosm#1307. The drafter's free-text check accepted figures dressed as citations (a household and weight beside microcosm references, uk-data references counting rows, references to made-up PolicyEngine repositories, counts after anchors, far-off dates and logins carrying a number), and refused legitimate ones (a lower-case owner, review anchors, file URLs with digits in the path). Digits may now stand only in a citation of a repository on a fixed list, matched in any case: an issue reference, an issue or pull request URL optionally anchored on a comment or review with GitHub's ten-digit id, or a file URL. A citation running into a word, or right next to a noun a figure counts or belongs to, is refused, and an anchor stands only in a URL. ISO dates must lie within a year of the drafting date. Logins with digits must be on a fixed list. The sign-off fragment #1307 added now describes these rules. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Third review of microcosm#1307.
The disclosure walk now builds its figure names and extreme stems from
one set, so it adds distinct_sources, sample_size, num_rows, row_count,
kish_ess and the source-household names, and catches
min_distinct_source_households again. It also catches:
- an order statistic above a figure ({"min": {"rows": ...}});
- figure maps by or per a level (rows_by_area);
- area_code and geography_id in any case, and any field holding an area
code (lad_code, geography);
- pandas split tables;
- numbers written with thousands separators.
Region, nation and UK codes still name no area, and the near misses the
second review found (max_excess and its kin) stay unflagged, with tests.
On the real run outputs on this machine the old and new walks flag the
same paths.
The release pre-flight now reads files as the contract does, refusing
NaN and reporting a nesting too deep to walk, and also walks the opt-in
incumbent files, which ship byte for byte (--incumbent-manifest). Tests
drive --candidate-dir to its warnings with a figure planted in every
walked file, the signed report included, and the assembler with a
finding.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Third review of microcosm#1307. The runbook now says how to retry build 1: into a new --out, never the failed attempt's, with the same review date and graph store, and with the failed attempt's Logbook row as the predecessor, since a second attempt's row in the same spool makes the drafter, --verify and the assembler refuse the run directory. It also describes the publisher's verdict, the drafter's citation rules and the pre-flight's walk as they now stand. The full-build doc says the dense release contract warns about, rather than refuses, a shipped JSON document carrying a per-area support figure. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
567d383 to
0f764b1
Compare
|
Every item of the re-review above is addressed. The branch is rebased onto main after #1307's merge (ff3f348). The first 16 commits are replayed unchanged apart from the four conflicts the re-review named, resolved as it described:
The receipt and membership auto-merged to the union, 27,249 rows. A regeneration on the combined tree, from a re-cut of the pinned artifact identical to R7's, reproduced the committed receipt, references and membership byte for byte. Low
Nits
With #1307's remaining fixesThis PR also carries the remaining fixes from the third look at #1307:
Regeneration note for #1305The re-pin procedure now says when the local-selector cut holds, and to widen it for references at other levels, such as #1305's BRMA rows at 🤖 Generated with Claude Code |
On main after #1307 and #1306: 27,267 rows, 23,004 of them compiled. The 18 Scottish BRMA rows are ledger-only by construction, and no signed value moves. The 40 cells of the support floor's two authorities, E06000053 and E09000001, carry the floor's own signed rationale; nothing else changes. The release-blocking preflight gate uk_ledger_compile_parity_local_incumbent_2025 reads this receipt, so whichever of #1305 and #1308 lands second regenerates it on the combined tree. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On main after #1307 and #1306: 27,267 rows, 23,004 of them compiled. The 18 Scottish BRMA rows are ledger-only by construction, and no signed value moves. The 40 cells of the support floor's two authorities, E06000053 and E09000001, carry the floor's own signed rationale; nothing else changes. The release-blocking preflight gate uk_ledger_compile_parity_local_incumbent_2025 reads this receipt, so whichever of #1305 and #1308 lands second regenerates it on the combined tree. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On main after #1307 and #1306: 27,267 rows, 23,004 of them compiled. The 18 Scottish BRMA rows are ledger-only by construction, and no signed value moves. The 40 cells of the support floor's two authorities, E06000053 and E09000001, carry the floor's own signed rationale; nothing else changes. The release-blocking preflight gate uk_ledger_compile_parity_local_incumbent_2025 reads this receipt, so whichever of #1305 and #1308 lands second regenerates it on the combined tree. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Second PR for #1278: the items that are actionable now and small enough to land before the frozen pre-Budget build.
Base.
{**gate_params, "phase": "terminal", "terminal_code": uk_terminal_only_code_hash()};Part of #1278.
What changes (one commit each, then the review fixes and #1307's)
A. The high-value homes benchmarks gate reads the OBR costing facts (bug).
observed_measure.source_concept,layout.record_set_spec_id), so it reportedawaiting_vendored_factson every build, and the derived-stock level question (Place high-value homes where the Land Registry sees them (#1240) #1270 review, finding 4) had no OBR comparison.no_matching_rows,incomplete_rowsormalformed_rows, and a missing or non-numeric value, or a field that is not a mapping, is reported rather than raised, since the leg runs after the solve.terminal_code), hashed once per process, so a resumed store recomputes the evidence. The full-gates kernel's hash, which UK local release: publish a K=15, 150,000-household dense dataset in at most two builds (#1301) #1307's preflight kernel inherits, leaves that code out, because the dense solve keys on the preflight.high_value_home_gates.pynever re-solves.high_value_homes.pyalso feeds the target kernels, so an edit there still re-solves: a disclosure fix between two builds that must reuse the solve belongs inhigh_value_home_gates.pyalone.B. The high-value homes evidence names its scope.
C. Registers track #1278.
slc.borrowers.plan_2_*exclusions move from closed UK spine: SLC plan-2 borrower stocks at a third of SLC's — the FRS flag captures repayers, not the liable stock #868 to UK local surface, consumption and high-value homes: remaining items (consolidation) #1278 too (María's ruling of 2026-10-17), and their adjudications record the move. The plan-2 and plan-5 uprating hold keeps UK spine: SLC plan-2 borrower stocks at a third of SLC's — the FRS flag captures repayers, not the liable stock #868.G. The disclosure floor's study conditions are recorded. This answers #796's open #609 question.
uk_runtime.receipt_counts.--sdc-minimum-counthelp and the caller obligations it writes into every receipt. Those obligations now carry the SPI tape's two conditions.J1. Zero-emission cars are drawn per vehicle.
nvehicles is therefore a fuel buyer at1 - (1 - rate) ** n, against the same identity-keyed uniform. One-vehicle households keep their flag.rate_rulebecomesper_car_zero_emission_sharein the stage spec, the rendered roster and the sources schema.E. The rowwise solve takes its review date.
prepare_uk_full_solve, the doctrine solve and the rotated holdout acceptnowand pass it to the binding review. Builds keep today's date.COMMITTED_BINDING_NOW), as a build would on that day. Nothing is asserted at import.test_no_committed_local_adjudication_is_about_to_lapsefails fourteen days before the earliest local expiry, as the uprating holds' clock does.uk.full.problemkernel and the holdout kernel should take the build's review date.H. Division tails. The LCFS stage's report-only division capture adds each division's top-1% and top-10% spend shares, on the frame and the donor.
D. The parity register is re-pinned to uk-data a43e8c5 (from
8629dbb).eldest_adult_age. Re-binding goes with UK spine: housing benefit £2.7bn against OBR £12.1bn — pensioner and supported-accommodation HB missing after the UC migration #867.obr.pyline citations follow the functions that moved.housing/council_tax_netmultiplier.I. Northern Ireland's energy share comes from DESNZ.
desnz_subnational_consumption_basisadjudication and census fence say so. María signed off one added sentence on 2026-10-17, with dates unchanged.desnz_local_energy_facts.jsonvendors the two Northern Ireland rows in place of the four LFS household totals; its 697 meter rows are unchanged.desnz_northern_ireland_interim_shareadjudication and its census fence.Review fixes (on top of the item commits)
terminal_code, and the UK local surface, consumption and high-value homes: remaining items (consolidation) #1278 citations.From the second review:
terminal_codehashed once per process with its scope stated, and two comments corrected.Remaining fixes from the third review of #1307
N1. The two below-floor region rows are worded as an expectation from their published stock, not a count of frame records, in the small-cell rule and its fragment. The local membership, which copies the rule into 601 rationales, is regenerated; nothing else in it moves.
L6. The re-pin procedure says to regenerate the receipts one
--surfaceat a time with nothing else running, and when the local-selector cut used here holds.T1. The publisher's
--preflight-onlyverdict and printed pointer carry the contract's warnings. The tag of a release published past them records how many, never their text. Nothing refuses.T2. The sign-off drafter accepts digits only in citations of a fixed list of repositories, refuses a citation next to a noun a figure counts or belongs to, accepts review anchors and file URLs, bounds dates to a year of the drafting date, and accepts digits only in listed logins.
T3. The disclosure walk catches:
The release pre-flight reads files as the contract does and walks the incumbent files too, and the tests now drive both ends.
T4. The runbook says how to retry build 1, and the full-build doc says the contract warns.
Regenerated
uk/uk_local_target_census.json(B, I).uk/release_input_coverage_manifest.jsonand the H2 spine fixture (J1).uk/uk_data_target_inventory.jsonanduk/uk_data_target_parity.json(D).uk/desnz_local_energy_facts.json(I).uk/ledger_compile_parity_local_incumbent_2025_signed_differences.jsonanduk/local_target_reference_membership.json(I), on abf0921.uk/local_target_references.jsonregenerates byte-identical.Merge order with the open PRs
statistical_scope(the re-pin procedure says how).source_manifest_sha256and onuk_spine.json. Regenerate both after both land, under Port the uk-data wave to policyengine-uk 2.134.4: stamp duty, Move to UC, national home values (sixth #1095 PR) #1308's policyengine-uk 2.134.4 lock.tools/graph_uk_spine_fixture.pyunder the locked engine;Rulings owed
Not run locally
test_committed_surfaces_regenerate_from_pinned_feed[local].Verification (local)
MICROCOSM_UK_DATA_TREEon a43e8c5: the parity file's 14 tests passed.tools/ci_test_plan.py verifyandtools/graph_acceptance_burndown.py --verifyare ok.ruff checkandruff format --checkare clean on the 33 edited Python files.census_uk_local_targets.py --check,census_uk_data_target_parity.py --checkandbuild_uk_release_input_coverage_manifest.py --checkall report current.Disclosure
Commit messages, changelog fragments and this body carry no survey-derived figures, only:
H's fragment names, without figures, the divisions that drew above their donor.
🤖 Generated with Claude Code