Repository navigation
Place high-value homes where the Land Registry sees them (#1240) - #1270
Conversation
|
Needs changes before merge: the support split nearly doubles the mass in each region's top value stratum (finding 1). The rest are should-fix items or nits. @juaristi22, I reviewed the diff against Disclosure verdict first. Most of the 1.27m added lines are seven generated resources:
I read every one of them. Every committed value is an aggregate of public data: Price Paid, UK HPI, NSPL, VOA CTSOP, census tenure and the OBR note. None of them holds a survey unit record, a per-seat count of survey households, or a survey-derived cell. The 2,673 new parity rows are 3 × (575 + 316) derived targets. The spine parity fixtures that changed are synthetic. The per-area support table ( Findings
What I checked
🤖 Generated with Claude Code |
4f824b0 to
5fbf114
Compare
Review of PR #1270, finding 1: the value node dropped the support copies from the within-region rank, so the unselected owners spread up into the stratum and the copies' own draws landed on top, nearly doubling the owner mass above the stratum (0.0895 for a 0.05 stratum on a 4,000-owner probe). The copies now rank beside their root, tying on value, so the mass at or above the stratum is the selected share; a 4,000-household test asserts it at 0.95 and 0.99. The stage docstring no longer says the selection rank and the value rank agree by construction: they agree up to ties and up to the spine-to-pool weight change. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Review of PR #1270, findings 2, 3 and 9. The stock builder now compares category A residential sales and medians by 2024 constituency, fiscal year and property type with the ONS HPSSA rows in the feed, and writes the aggregates (cells compared, median and 90th-percentile relative difference, share within tolerance) to the provenance file: seat sales match to the year ending March 2025 and show the registration lag for the latest year. Every derived resource carries a licence block with the publishers' attribution statements (HM Land Registry data under the Open Government Licence v3.0 for Price Paid and the UK HPI, the NSPL's OS and Royal Mail notices with ONS's OGL statement, OGL v3.0 for the VOA, census and OBR inputs); the docs restate them. Both builders take an explicit --built-on, so a rerun reproduces the committed bytes for the same date. The facts rows are unchanged (same rows_sha256). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Review of PR #1270, finding 5: the derived cells are fractional, coverage-scaled aggregates, with hundreds of seats under ten homes over 2 million, and the default scale max(|target|, 1) charged one clone's weight there as a miss of that many units. The local solve doctrine's scale rule becomes default_target_loss_scales_with_family_floors: the default rule with a floor of 100 homes for the high_value_homes/ cells, the support gate's assessment threshold. The floor lives in target_weights; the prepared solve carries the scales and a receipt of the rows it raised; the ordered problem binds them, so the dense node (and the size search and refit that inherit its scales) solves under them; the doctrine evidence and the rotated holdout derive the same scales. The dense node still honours the plain default that the national seam binds without row scales, since the two rules coincide wherever no floored family has a row. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Review of PR #1270, findings 4 and 6. The benchmarks gate suppresses any England band or region that rests on fewer than ten distinct source households in the details it ships, and one more cell when only one would be, so the total cannot recover it; the gate still evaluates the exact regional gap. The stage gate rounds its survey counts to the nearest ten. The OBR leg now sets the derived stock's England private-sector count over 2 million beside Table 1.1, the like-for-like comparison, next to the owner-occupied count the family binds, and the derived-estimate fence names the coverage correction as the main sensitivity. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Review of PR #1270, finding 7: the VOA mix counts every dwelling in the LSOA, so drawing renters from it handed the owners' share of the high bands to households the value node leaves untouched. The band node now redraws owner-occupiers only; renters keep the spine's band, and the receipt counts them. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
7636689 to
ee360d8
Compare
|
Thanks, @vahid-ahmadi. The branch is rebased onto the current
Verification on the rebased tree: engine-free suite, engine-backed UK suite and the integration smoke, with the two pre-existing failures described in the PR body unchanged. The per-seat support table still only reaches the run directory. 🤖 Generated with Claude Code |
ee360d8 to
82b7240
Compare
Review of PR #1270, finding 1: the value node dropped the support copies from the within-region rank, so the unselected owners spread up into the stratum and the copies' own draws landed on top, nearly doubling the owner mass above the stratum (0.0895 for a 0.05 stratum on a 4,000-owner probe). The copies now rank beside their root, tying on value, so the mass at or above the stratum is the selected share; a 4,000-household test asserts it at 0.95 and 0.99. The stage docstring no longer says the selection rank and the value rank agree by construction: they agree up to ties and up to the spine-to-pool weight change. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Review of PR #1270, findings 2, 3 and 9. The stock builder now compares category A residential sales and medians by 2024 constituency, fiscal year and property type with the ONS HPSSA rows in the feed, and writes the aggregates (cells compared, median and 90th-percentile relative difference, share within tolerance) to the provenance file: seat sales match to the year ending March 2025 and show the registration lag for the latest year. Every derived resource carries a licence block with the publishers' attribution statements (HM Land Registry data under the Open Government Licence v3.0 for Price Paid and the UK HPI, the NSPL's OS and Royal Mail notices with ONS's OGL statement, OGL v3.0 for the VOA, census and OBR inputs); the docs restate them. Both builders take an explicit --built-on, so a rerun reproduces the committed bytes for the same date. The facts rows are unchanged (same rows_sha256). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Review of PR #1270, finding 5: the derived cells are fractional, coverage-scaled aggregates, with hundreds of seats under ten homes over 2 million, and the default scale max(|target|, 1) charged one clone's weight there as a miss of that many units. The local solve doctrine's scale rule becomes default_target_loss_scales_with_family_floors: the default rule with a floor of 100 homes for the high_value_homes/ cells, the support gate's assessment threshold. The floor lives in target_weights; the prepared solve carries the scales and a receipt of the rows it raised; the ordered problem binds them, so the dense node (and the size search and refit that inherit its scales) solves under them; the doctrine evidence and the rotated holdout derive the same scales. The dense node still honours the plain default that the national seam binds without row scales, since the two rules coincide wherever no floored family has a row. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Review of PR #1270, findings 4 and 6. The benchmarks gate suppresses any England band or region that rests on fewer than ten distinct source households in the details it ships, and one more cell when only one would be, so the total cannot recover it; the gate still evaluates the exact regional gap. The stage gate rounds its survey counts to the nearest ten. The OBR leg now sets the derived stock's England private-sector count over 2 million beside Table 1.1, the like-for-like comparison, next to the owner-occupied count the family binds, and the derived-estimate fence names the coverage correction as the main sensitivity. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Review of PR #1270, finding 7: the VOA mix counts every dwelling in the LSOA, so drawing renters from it handed the owners' share of the high bands to households the value node leaves untouched. The band node now redraws owner-occupiers only; renters keep the spine's band, and the receipt counts them. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
Rebased onto 🤖 Generated with Claude Code |
82b7240 to
0263998
Compare
Review of PR #1270, finding 1: the value node dropped the support copies from the within-region rank, so the unselected owners spread up into the stratum and the copies' own draws landed on top, nearly doubling the owner mass above the stratum (0.0895 for a 0.05 stratum on a 4,000-owner probe). The copies now rank beside their root, tying on value, so the mass at or above the stratum is the selected share; a 4,000-household test asserts it at 0.95 and 0.99. The stage docstring no longer says the selection rank and the value rank agree by construction: they agree up to ties and up to the spine-to-pool weight change. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Review of PR #1270, findings 2, 3 and 9. The stock builder now compares category A residential sales and medians by 2024 constituency, fiscal year and property type with the ONS HPSSA rows in the feed, and writes the aggregates (cells compared, median and 90th-percentile relative difference, share within tolerance) to the provenance file: seat sales match to the year ending March 2025 and show the registration lag for the latest year. Every derived resource carries a licence block with the publishers' attribution statements (HM Land Registry data under the Open Government Licence v3.0 for Price Paid and the UK HPI, the NSPL's OS and Royal Mail notices with ONS's OGL statement, OGL v3.0 for the VOA, census and OBR inputs); the docs restate them. Both builders take an explicit --built-on, so a rerun reproduces the committed bytes for the same date. The facts rows are unchanged (same rows_sha256). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Review of PR #1270, finding 5: the derived cells are fractional, coverage-scaled aggregates, with hundreds of seats under ten homes over 2 million, and the default scale max(|target|, 1) charged one clone's weight there as a miss of that many units. The local solve doctrine's scale rule becomes default_target_loss_scales_with_family_floors: the default rule with a floor of 100 homes for the high_value_homes/ cells, the support gate's assessment threshold. The floor lives in target_weights; the prepared solve carries the scales and a receipt of the rows it raised; the ordered problem binds them, so the dense node (and the size search and refit that inherit its scales) solves under them; the doctrine evidence and the rotated holdout derive the same scales. The dense node still honours the plain default that the national seam binds without row scales, since the two rules coincide wherever no floored family has a row. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Review of PR #1270, findings 4 and 6. The benchmarks gate suppresses any England band or region that rests on fewer than ten distinct source households in the details it ships, and one more cell when only one would be, so the total cannot recover it; the gate still evaluates the exact regional gap. The stage gate rounds its survey counts to the nearest ten. The OBR leg now sets the derived stock's England private-sector count over 2 million beside Table 1.1, the like-for-like comparison, next to the owner-occupied count the family binds, and the derived-estimate fence names the coverage correction as the main sensitivity. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Review of PR #1270, finding 7: the VOA mix counts every dwelling in the LSOA, so drawing renters from it handed the owners' share of the high bands to households the value node leaves untouched. The band node now redraws owner-occupiers only; renters keep the spine's band, and the receipt counts them. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
Rebased onto 🤖 Generated with Claude Code |
|
Fine once the largest regional gap stops exposing suppressed regions (new finding 1). Round-1 finding 1 is fixed; the rest are fixed or settled. @juaristi22, round 2 at 0263998 (on Round-1 status
New findings
Rebase onto
|
Review of PR #1270, finding 1: the value node dropped the support copies from the within-region rank, so the unselected owners spread up into the stratum and the copies' own draws landed on top, nearly doubling the owner mass above the stratum (0.0895 for a 0.05 stratum on a 4,000-owner probe). The copies now rank beside their root, tying on value, so the mass at or above the stratum is the selected share; a 4,000-household test asserts it at 0.95 and 0.99. The stage docstring no longer says the selection rank and the value rank agree by construction: they agree up to ties and up to the spine-to-pool weight change. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Review of PR #1270, finding 5: the derived cells are fractional, coverage-scaled aggregates, with hundreds of seats under ten homes over 2 million, and the default scale max(|target|, 1) charged one clone's weight there as a miss of that many units. The local solve doctrine's scale rule becomes default_target_loss_scales_with_family_floors: the default rule with a floor of 100 homes for the high_value_homes/ cells, the support gate's assessment threshold. The floor lives in target_weights; the prepared solve carries the scales and a receipt of the rows it raised; the ordered problem binds them, so the dense node (and the size search and refit that inherit its scales) solves under them; the doctrine evidence and the rotated holdout derive the same scales. The dense node still honours the plain default that the national seam binds without row scales, since the two rules coincide wherever no floored family has a row. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Review of PR #1270, findings 4 and 6. The benchmarks gate suppresses any England band or region that rests on fewer than ten distinct source households in the details it ships, and one more cell when only one would be, so the total cannot recover it; the gate still evaluates the exact regional gap. The stage gate rounds its survey counts to the nearest ten. The OBR leg now sets the derived stock's England private-sector count over 2 million beside Table 1.1, the like-for-like comparison, next to the owner-occupied count the family binds, and the derived-estimate fence names the coverage correction as the main sensitivity. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Review of PR #1270, finding 7: the VOA mix counts every dwelling in the LSOA, so drawing renters from it handed the owners' share of the high bands to households the value node leaves untouched. The band node now redraws owner-occupiers only; renters keep the spine's band, and the receipt counts them. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
PR #1270 review round 2, finding 1. The benchmarks gate's regional leg evaluated its largest gap over every region, suppressed ones included, and shipped and printed that value. The derived-stock shares are public, so when the maximum came from a suppressed region the value gave back that region's frame share, and the total then constrained the other. The gate keeps the full maximum for its outcome but ships the largest gap over the unsuppressed regions only, and when the evaluated maximum rests on a suppressed region the failure message names the threshold it exceeds without the value. The evidence summary carries both maxima and the flag; the gate's details carry only the shipped one. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
Thanks, @vahid-ahmadi. Round 2 is addressed at the new head, rebased onto
Finding 4 from round 1 (scaling the derived level to the OBR total) stays with María. Verification on this head: the engine-free modules this PR touches or pins plus #1271's new spine and release-identifier modules (53 files; the two pre-existing failures described in the body unchanged), the spine-parity acceptance test, the engine graph, coverage, identifier, birth-month and admission tests, the integration smoke on the 41-stage synthetic spine, 🤖 Generated with Claude Code |
PolicyEngine/chronicle#349 lands the inputs microcosm#1240 needs: the OBR April 2026 costing note for the High Value Council Tax Surcharge (63 rows), the ONS house price statistics for small areas by 2024 constituency to the year ending March 2026 (22,940 rows), and three raw-only registrations (the HM Land Registry Price Paid yearly files, the UK HPI full file and the NSPL) that carry no facts and are read by the stock builder against their registered sha256 pins. The feed grows from 927,239 to 950,242 rows; no existing package moves, so no compiled target changes and the vendored facts only carry the new provenance header. The OBR note is vendored for the benchmarks gate (`obr_hvcts_costing_facts.json`), the national references and the spine parity fixture sources are regenerated on the new pin, and the re-pin doc records the move. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
`tools/build_uk_high_value_home_stock.py` reduces the pinned Price Paid yearly files to the latest non-bulk sale of every dwelling (identity: postcode, PAON, SAON), uprates each sale by its local authority's and property type's HPI to the calendar-2024 average, places it through the NSPL output area and the committed England-and-Wales atomic support, and counts dwellings over £1m, £1.5m and £2m (April-2026 prices deflated with the England index) by constituency, local authority, region and nation. The counts are owner-occupied by the census share of the private-sector stock, rescaled to the OBR costing note's control on homes over £2m, and corrected for stock never sold since 1995 by the VOA private-sector stock over the valued dwellings. The outputs are consumer-fact rows under the Microcosm derived-fact namespace, per-constituency value knots (winsorised at £20m), the support bound the knots imply, and a provenance file with the parity receipts and the sensitivities. `tools/build_uk_voa_band_mix.py` turns the pinned CTSOP1.1 tables into cumulative band shares per England-and-Wales LSOA. The loader module validates every resource against its recorded hashes and the atomic support pin, and exposes the thresholds, metric names and owner masks the rest of the build shares (microcosm#1240 fix 2). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The local surface compiles the derived stock beside the Chronicle feed: three contract targets (`microcosm.high_value_homes.over_1m|over_1_5m|over_2m`, provider `microcosm`) bind at constituency and local-authority grain for England and Wales, with no higher control declared, the `high_value_home_stock_derived_estimate` fence adjudicated to 2026-12-31 and the generic support-floor deferral on the Isles of Scilly and the City of London. The frame metrics read the stored `main_residence_value` at the dataset period for owner households. `generate_uk_local_target_references.py` takes `--derived-facts`, the compile-parity and release-cut tools merge the same rows, the full-targets provenance records the derived resource, and the census, local references, membership and parity receipts are regenerated on the 735820c pin (575 seats and 316 authorities active per threshold). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Two report-only gates on the calibrated pool (microcosm#1240 fix 8): `uk_high_value_homes_benchmarks` sets England owner-occupied homes by surcharge band beside OBR Table 1.1, the regional split of homes over £2m beside the derived stock, and the seat rank correlations against the derived stock and VOA band H; `uk_high_value_homes_support` counts areas by band of distinct source households above £1.5m and £2m, with dominance. The per-area support table is a candidate artifact (`.high_value_home_support.csv`) that stays in the run directory; the shipped details carry counts only. Both gates sit in the local diagnostic scope and outside certification. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
After geography derivation, `uk.full.property.value` and `uk.full.property.band` (`--property-localisation price_paid`, the default on the atomic assignment) read every England-and-Wales owner clone's `main_residence_value` off its assigned constituency's uprated Land Registry sale distribution at the household's weighted rank among its region's owners, move `property_wealth` by the same amount, and draw `council_tax_band` from the assigned LSOA's VOA band mix at the same uniform. The uniform is keyed on the spine household, so every pool clone of one household shares it whatever K is; high-value support copies take a keyed rank inside the top stratum. Scotland and Northern Ireland keep the spine's values and bands. The draw is a typed artifact the band node and the pool consume, the resource digests enter the size-checkpoint identity and the candidate manifest, and `uk_support` binds the rewritten columns to the knots' cap (microcosm#1240 fixes 3 and 4). `regional_land_values.json` moves from the December-2025 HPI level to the calendar-2024 average so the stored value sits at the dataset period's prices and the engine's annual uprating projects it once (fix 5). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The `high_value_home_support` stage after `regional_property_uprating` copies every owner household in the top five per cent of its region's value rank six ways at equal weight, each copy carrying `high_value_support_copy_index` (the lineage the geography identity keys on), so the few tail households spread across seats once the value node gives each copy its own keyed rank inside the stratum. Mass is conserved exactly (`uk_stage_high_value_home_support_mass`). The spine graph, the kernel tables, the coverage manifest, the operation vocabulary and the spine parity fixture (41 stages) move with it (microcosm#1240 fix 1). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Review of PR #1270, finding 1: the value node dropped the support copies from the within-region rank, so the unselected owners spread up into the stratum and the copies' own draws landed on top, nearly doubling the owner mass above the stratum (0.0895 for a 0.05 stratum on a 4,000-owner probe). The copies now rank beside their root, tying on value, so the mass at or above the stratum is the selected share; a 4,000-household test asserts it at 0.95 and 0.99. The stage docstring no longer says the selection rank and the value rank agree by construction: they agree up to ties and up to the spine-to-pool weight change. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Review of PR #1270, findings 2, 3 and 9. The stock builder now compares category A residential sales and medians by 2024 constituency, fiscal year and property type with the ONS HPSSA rows in the feed, and writes the aggregates (cells compared, median and 90th-percentile relative difference, share within tolerance) to the provenance file: seat sales match to the year ending March 2025 and show the registration lag for the latest year. Every derived resource carries a licence block with the publishers' attribution statements (HM Land Registry data under the Open Government Licence v3.0 for Price Paid and the UK HPI, the NSPL's OS and Royal Mail notices with ONS's OGL statement, OGL v3.0 for the VOA, census and OBR inputs); the docs restate them. Both builders take an explicit --built-on, so a rerun reproduces the committed bytes for the same date. The facts rows are unchanged (same rows_sha256). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Review of PR #1270, finding 5: the derived cells are fractional, coverage-scaled aggregates, with hundreds of seats under ten homes over 2 million, and the default scale max(|target|, 1) charged one clone's weight there as a miss of that many units. The local solve doctrine's scale rule becomes default_target_loss_scales_with_family_floors: the default rule with a floor of 100 homes for the high_value_homes/ cells, the support gate's assessment threshold. The floor lives in target_weights; the prepared solve carries the scales and a receipt of the rows it raised; the ordered problem binds them, so the dense node (and the size search and refit that inherit its scales) solves under them; the doctrine evidence and the rotated holdout derive the same scales. The dense node still honours the plain default that the national seam binds without row scales, since the two rules coincide wherever no floored family has a row. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Review of PR #1270, findings 4 and 6. The benchmarks gate suppresses any England band or region that rests on fewer than ten distinct source households in the details it ships, and one more cell when only one would be, so the total cannot recover it; the gate still evaluates the exact regional gap. The stage gate rounds its survey counts to the nearest ten. The OBR leg now sets the derived stock's England private-sector count over 2 million beside Table 1.1, the like-for-like comparison, next to the owner-occupied count the family binds, and the derived-estimate fence names the coverage correction as the main sensitivity. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Review of PR #1270, finding 7: the VOA mix counts every dwelling in the LSOA, so drawing renters from it handed the owners' share of the high bands to households the value node leaves untouched. The band node now redraws owner-occupiers only; renters keep the spine's band, and the receipt counts them. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The branch is rebased onto uk-local-doctrine-k25-ngfes at 3b4f899, which retired the 2023 production parity receipt and moved the national targets. The national references, the local census, the local references and membership, the two remaining compile-parity receipts, the data-target parity register, the spine fixture, the release input coverage manifest and the release-contract digests are regenerated on it. The derived family's ledger_only parity rows carry their own rationale (review finding 8). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
PR #1270 review round 2, finding 1. The benchmarks gate's regional leg evaluated its largest gap over every region, suppressed ones included, and shipped and printed that value. The derived-stock shares are public, so when the maximum came from a suppressed region the value gave back that region's frame share, and the total then constrained the other. The gate keeps the full maximum for its outcome but ships the largest gap over the unsuppressed regions only, and when the evaluated maximum rests on a suppressed region the failure message names the threshold it exceeds without the value. The evidence summary carries both maxima and the flag; the gate's details carry only the shipped one. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
e851e76 to
e1a65e2
Compare
uk_council_tax_band_domain runs at the spine's transferred boundary, and the full build carries that report forward instead of evaluating it again, so a later step that writes council_tax_band (#1270's band redraw after geography derivation) was checked by nothing. uk_council_tax_band_domain_terminal is the same release-blocking check at the terminal phase; a test pins its parameters to the spine entry's. The release-cut scope owns it, so in the full build a failure stops the build rather than counting as a local export exception. Contract mirrors added and five gate digests re-pinned. Vahid's review, finding 2. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
uk_council_tax_band_domain runs at the spine's transferred boundary, and the full build carries that report forward instead of evaluating it again, so a later step that writes council_tax_band (#1270's band redraw after geography derivation) was checked by nothing. uk_council_tax_band_domain_terminal is the same release-blocking check at the terminal phase; a test pins its parameters to the spine entry's. The release-cut scope owns it, so in the full build a failure stops the build rather than counting as a local export exception. Contract mirrors added and five gate digests re-pinned. Vahid's review, finding 2. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#1270 merged first, so this branch regenerates rather than merging the registers by hand. From the 735820c feed main now pins (the consumer artifact rebuilt from PolicyEngine/chronicle at 735820c and checked against its pinned row count and facts digest), the local references, the membership and the local parity receipt are regenerated: 24,269 active local references, main's 24,477 less the same 208 small-cell cells, and 1,796 reviewed exclusions. The scorer's frozen count, the battery pin, the runbook and the receipts move with them. local_binding_adjudications.json keeps the six renewals and #1270's high_value_home_stock_derived_estimate entry; local_targets.py keeps both imports; the parity tool keeps #1270's derived stock rationale beside the small-cell one. The gate digests, the H2 spine fixture and the coverage manifest are regenerated. The C1 receipt now says its twin spines were measured before the rebases, on a shell redraw neither rebase touches. This commit sets the tree to the tested merge of the branch and main; the replayed commits before it resolved conflicts toward the branch. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Delivers the fix-1, 2, 3, 4, 5 and 8 parts of #1240 under María's rulings of 2026-10-13; fixes 6 and 7 stay open on that issue as follow-ups, so this PR does not close it. Based on
mainat 412f916 (after #1242, the K=15 doctrine, #1256, #1271, #1267, #1282 and #1281 merged; the contract digests are re-pinned on #1281's gate battery, nothing else moved). One PR: seven ordered commits, six for review round 1, one for round 2 and the regeneration of the registers and pins on the current base; the register regeneration lands with the family commit so the first two commits are reviewable but not individually green.What changes
Feed re-pin (commit 1). The Chronicle pin moves to
735820c(PolicyEngine/chronicle#343 via #349): the OBR April 2026 HVCTS costing note, the ONS HPSSA by 2024 constituency, and three raw-only registrations (Price Paid yearly files, UK HPI full file, NSPL). No existing package moves, so no compiled target changes; the OBR note is vendored for the benchmarks gate.Land Registry stock and VOA band mix (commit 2).
tools/build_uk_high_value_home_stock.pyreduces the Price Paid files to the latest non-bulk sale of every dwelling, uprates by local authority and property type HPI to the calendar-2024 average, places sales through the NSPL and the committed England-and-Wales atomic support, and counts dwellings over £1m, £1.5m and £2m (April-2026 prices, deflated with the England index) by constituency, local authority, region and nation. Owner-occupied counts use the census private-sector tenure share rescaled to the OBR control on homes over £2m, with a coverage correction for stock never sold since 1995. Outputs:high_value_home_stock_facts.json(consumer-fact rows undermicrocosm.derived_fact., 5,430 rows), per-constituency value knots winsorised at £20m, the implied support bound, and a provenance file with the HPSSA parity receipts and the sensitivities (no coverage correction; census share without the control).tools/build_uk_voa_band_mix.pygives cumulative band shares per LSOA from CTSOP1.1.Derived target family (commit 3). Three contract targets
microcosm.high_value_homes.over_1m|over_1_5m|over_2mbind at constituency and local-authority grain for England and Wales (575 seats and 316 authorities active per threshold; the Isles of Scilly and the City of London take the standing support-floor deferral). The fencehigh_value_home_stock_derived_estimateis adjudicated to 2026-12-31. The metrics read the storedmain_residence_valueat the dataset period. Census, local references, membership and parity receipts are regenerated.Diagnostic gates (commit 4).
uk_high_value_homes_benchmarks(England owner-occupied homes by surcharge band beside OBR Table 1.1, regional £2m+ shares beside the derived stock, seat rank correlations against the derived stock and VOA band H) anduk_high_value_homes_support(areas by band of distinct source households above £1.5m and £2m, with dominance). Both report-only, in the local diagnostic scope, outside certification. The per-area support table is a candidate artifact that stays in the run directory; shipped details carry counts only.Per-clone value and band (commit 5). Two nodes after geography derivation,
uk.full.property.valueanduk.full.property.band(--property-localisation price_paid, the default on the atomic assignment), give every England-and-Wales owner clone its home value off its assigned constituency's sale distribution at the household's weighted rank among its region's owners, moveproperty_wealthby the same amount, and draw the council-tax band from the LSOA's VOA mix at the same uniform. The uniform is keyed on the spine household, so pool clones of one household share it whatever K is.regional_land_values.jsonmoves to the calendar-2024 average so the stored value sits at the dataset period's prices and the engine uprates it once.Support stage (commit 6).
high_value_home_supportafterregional_property_upratingcopies every owner household in the top 5% of its region's value rank six ways at equal weight, each copy carryinghigh_value_support_copy_indexin its lineage; the value node spreads the copies inside the stratum. Mass is conserved exactly (uk_stage_high_value_home_support_mass). The spine fixture moves to 41 stages.Docs and changelog (commit 7).
Review round 1 (Vahid, 2026-10-14)
test_support_copies_keep_the_stratum_mass_at_the_selected_share). The stage docstring no longer claims the two ranks agree by construction.licenceblock with the publishers' attribution statements (HM Land Registry OGL v3.0 for Price Paid and the UK HPI, the NSPL's OS and Royal Mail notices with ONS's OGL statement, OGL v3.0 for VOA, census and OBR); the docs restate them. The vendored OBR resource is written by the generic vendoring tool, which carries no licence field; its attribution sits in the stock resources' block and the docs.default_target_loss_scales_with_family_floors: the default rule with a 100-home floor for thehigh_value_homes/cells (the support gate's assessment threshold), receipted on the prepared solve; every cell stays bound.ledger_onlyrows carry their own reason.--built-onis explicit on both builders; the byte-identical claim holds for the same date.Review round 2 (Vahid, 2026-10-15)
largest_gapin the details), and when the evaluated maximum rests on a suppressed region the failure message names the threshold it exceeds without the value. The evidence summary carries both maxima and the flag;test_benchmarks_gate_keeps_a_suppressed_regions_gap_out_of_what_it_shipspins the three cases.UK_LOCAL_CLONE_COUNT, UK local release: nation-grain doctrine at K=15 and 2,000 epochs, a 100,000-household release path, line-scoped gate exclusions, and the QRF tail surface #1242); the earlier body said K=25 by mistake. The post-merge dense build runs at the doctrine's K=15.Rebased onto
mainat c28b453. The registers, parity receipts, spine fixture, coverage manifest and contract digests are regenerated on 71b9b8b (#1271, the last merge touching UK files; #1267 and #1282 touch US and NZ files only): every register regenerates byte-identical, so #1271 moved only the age-band split's four national targets and the engine lock beside this branch, and the derived family's rows are unchanged.Verification
The full suites below ran on the tree rebased onto the #1242 branch at da026cb (identical to
mainat 1cfbf7d); Vahid's round-2 check confirms all ten CI jobs green at 0263998 on 121fd4d. On the current head (the UK tree of 71b9b8b, after #1271) the engine-free modules this PR touches or pins plus #1271's new spine and release-identifier modules (53 files, the two pre-existing failures below unchanged), the spine-parity acceptance test, the engine graph, coverage, identifier, birth-month and admission tests, the integration smoke on the 41-stage synthetic spine,ruffandtools/ci_test_plan.py verifyran, not the whole suite; CI runs the rest.tools/ci_test_plan.py list-job engine-freenames): green except two failures that reproduce identically on the base commit with the previous feed and are unrelated to this branch:test_uk_target_references.py::test_childcare_and_bus_references_compile_with_declared_provenance(the pinned DfI NI passenger-receipts value) andtest_uk_cgt_projection.py::test_engine_is_reported_unavailable_without_the_uk_extra(the local environment has the UK extra installed).pytest packages/microcosm-build/tests/engine/uk: green (one pre-existing skip).test_uk_staging_integration.py --run-integration): green. The smoke reports four failed stage-health gates (child benefit take-up, LCFS energy rake, NTS facts, pension credit take-up); they are identical onmain's synthetic fixture and non-blocking in smoke mode.tools/ci_test_plan.py verify,ruff check,ruff format --checkon every touched file: clean.Disclosure control
Every committed receipt is an aggregate over public data (Land Registry, HPI, NSPL, VOA, census, OBR) or a count; the per-seat support table from the licensed pool is not committed and not copied into the release directory.
After merge
One spine build and one dense build (the doctrine's K=15, 100k households,
--inspection-export --staging-local-only); then a register PR on the band-H deferrals and anyhigh_value_homescells without support, and the #1241 freeze.🤖 Generated with Claude Code