Repository navigation
Declare cross-grain target reconciliation for the UK local surface: national wins, sub-national rescales (#495 increment 6 companion) #802
Description
Parent: #495 (workstream G of #665). Companion to the cross-family review that #762 owes; the per-family rulings this issue produces are inputs to that review.
Why
Increment 6 binds national families and all area×metric rows in one uniform solve. Any concept bound at two grains then pulls the solver in two directions, and the joint solve becomes an implicit reconciler — splitting the difference by loss contribution, which is exactly the implicit-per-target-weights behavior the #492/#493 doctrine forbids, and which pollutes the per-family fit table the increment-6 review must adjudicate.
Nothing in standing doctrine forbids explicit reconciliation — the opposite:
- the
census_disclosure_control_noisefence rule anticipates it and demands only that the winner be named; - the UK dataset build: full migration from policyengine-uk-data (master epic) #665 epic invariant sanctions the category: computed targets are explicit microcosm-side declarations (uprating, rate×count, splits — and rescaling to a bound control);
- Loss shape: flat cap at 1.0 makes past-cap rows free dumping grounds (17 rows pushed out in Build N); bounded-tail experiment + past-cap census diagnostic #492/max_weight_ratio anchors differently per arm: 5x vs design (dense) but ~25x effective (sparse refit re-anchors) — declare one stretch contract #493 is satisfied, not violated: rescaling is uniform target work declared before the solve, never a knob.
The adjudicated posture (recorded in local_binding_adjudications.json via #760 / PR #801, approved 2026-08-27): today only census_households/constituency binds and no same-concept national control is in the bound surface; when increment 6 binds one, national wins and sub-national values rescale to it as a declared reconciliation.
Scope
- Collision census. Enumerate the same-concept collisions between the national target surface and each local family, with measured tension:
census_households(ladder census-day sums vs any bound 2023 national household count — a vintage gap of ~1–2%, not the 2e-5 disclosure noise; measured constituency-sum vs published national deltas at review: E&W +105, Scotland −554, NI +3), HMRC constituency amounts/counts vs national SPI totals, UC constituency counts vs the national caseload, age structure vs mid-year estimates, tenure/private rent vs any national analogs. - The declared operator. Where the same concept binds at both grains, sub-national target values rescale (per country leg) to the bound national control. One uniform declared operation — no per-target parameters — with factors and pre/post deltas recorded in the solve manifest, mass-log-style.
- Per-family ruling at the First calibrated rowwise UK local candidate (#495 increment 6) #762 cross-family review. For each collision: rescale (national wins) or fence the sub-national family — recorded, so no same-concept two-grain bind ships without a ruling.
Out of scope
- Binding and solving themselves (First calibrated rowwise UK local candidate (#495 increment 6) #762), the fence-enforcement machinery (Enforce the UK local binding fences at execution time (#495 increment 4) #760, landed via PR Enforce the UK local binding fences at execution time (#760) #801), and the doctrine constants.
Acceptance
- The collision census is committed and enumerable.
- The reconciliation operator exists with manifest echo and tests; a same-concept two-grain bind without a recorded ruling fails, or the collision is proven absent.
- Each colliding family carries its ruling, and First calibrated rowwise UK local candidate (#495 increment 6) #762's release manifest shows which reconciliations the solve stood on.
🤖 Generated with Claude Code
Activity
Close Vahid's review: assert leg closure, canonicalize signatures (#802)
Close review round 2: scope the sign and order rules correctly (#802)
Merge pull request #827 from PolicyEngine/uk-cross-grain-reconciliati…
Activate the UK local target surface against uk-data parity: register…
Activate the UK local target surface against uk-data parity: register…