Skip to content

Bind the Chronicle transport and energy facts on the UK national surface (#890 PR-T) - #904

Merged
juaristi22 merged 9 commits into
mainfrom
uk-890-target-binding
Sep 14, 2026
Merged

juaristi22 merged 9 commits into
mainfrom
uk-890-target-binding

Conversation

@juaristi22

@juaristi22 juaristi22 commented Sep 11, 2026 •

Copy link
Copy Markdown
Collaborator

Target-binding half of #890 (PR-T of the two-PR plan in repos/uk-890-implementation-plan.md; the spine half, PR-S, follows on main). Everything here binds pinned Chronicle facts and lets the solver calibrate — the #790 ruling — and nothing in it changes an imputed value.

Commits

  1. Re-pin the Chronicle feed to c6f9361 (chronicle Add state-level SNAP benefit hard targets from USDA FNS administrative data #255 + UK firm generator: net-VAT liability missing the 0.20 rate factor (inherited from firm-microsim-paper pre-fix) #258: 138,847 rows) as one declaration for both grains. Round 2 renamed uk/national_chronicle_feed.json to uk/chronicle_feed.json and made the local census, local references and local validation levels restate that pin instead of carrying their own (the base already includes Bind UK census households from Chronicle and map NI Data Zones with NISRA's published lookup (#887) #900, which had moved both to ec7169b). No existing reference on either surface resolves a different fact or value: national 415/7/8 unchanged before the new bindings, local 20,430 active / 1,586 no-fact / 513 signed deferred / 1 signed compile error unchanged; only the feed labels move.
  2. Vendor pinned facts into build resources. tools/vendor_uk_ledger_facts.py + uk/ledger_fact_vendor_selections.json copy the facts the stages and diagnostics need into nine per-concern resources, verbatim, with the feed identity; a test regenerates them byte-identical from the pin. This is the doctrine "fixtures of publisher facts come from Chronicle" applied to build resources and retires the chronicle_candidate anchors one concern at a time (PR-S consumes them).
  3. Region leg. The generator pins region-only contract targets at region level; the compiler validates region pins against the nine English region codes. The two London bus rows bind (fares GBP 1,347.4m, support GBP 1,130.2m); England outside London is derived; the UK rows stay signed out (Wales fare revenue unpublished; UK support replaced by four heterogeneous country legs).
  4. BUS0415 alignment, declared. The four dft.bus_fare_receipts.* contract rows declare uprating_index: dft.local_bus_fares_index; the generator applies it while authoring (membership records the applied value with index, factor, value_before_uprating) and the runtime applies the same applier keyed on the declaration, so membership, parity receipts and the run manifest carry one value (England 3,417,388,656 → 3,612,036,036, ×1.05696; London ×1.0). Net support declares no index and is never aligned. The index series is read from the vendored dft_bus_value_anchors.json, refused if its feed identity differs from the pin, so the production factors reproduce in CI without the licensed feed. At target period 2023 (production parity receipt) the same alignment gives England ×0.99368 and London ×0.99769, below one because the fare cap held index growth inside calendar 2023 under the fiscal-year mean.
  5. New targets (registry scope, unmapped declarations): obr.fuel_duties_cars (cars receipts) on the engine's cars-only fuel_duty, bound at FY2024-25 (period_value: 2024, GBP 14.4bn, held to 2025 like the CGT rows) per María's ruling that a fiscal-year source binds the base data's FY2024-25 or CY2025 and never a later projection; every row of the vehicle-type release is the April 2024 vintage, so this is that vintage's figure for the base year (its all-vehicle FY2024-25 total overshoots the March 2026 outturn by 1.4%). obr.fuel_duties is signed out and its Swap the microcosm-built UK spine into the national build and retire the incumbent feed #757 measure exclusion retired. Open for María: the rest of the obr family still binds FY2025-26 projections at period 2025 by the inherited uk-data policy; orr.rail_government_support (7270, GBP 21.6bn, GB); ons.household_energy_expenditure (COICOP 04.5, CY2025 GBP 43.4bn); Scotland passenger revenue and government support; Wales public support (local-authority route); NI Translink receipts; NI public transport support as a joint bus-plus-rail cell.
  6. Baseline receipts, no exclusion. On the newest gated national spine (spine-p) every new row fits inside the 25% bound after calibration. In round 1 the cars fuel-duty row sat at −25.6% against the FY2025-26 projection and carried a dated exclusion; against FY2024-25 it solves to −16.7% (the frame's calibrated cars duty is GBP 12.0bn either way, so the change is the target, not the frame), the round-2 run blocked on that exclusion being stale, and the register is back to empty as on main (Part G of the receipts). The receipts record what the fit costs today: the London bus rows, the Scotland and Northern Ireland legs and the ORR rail row are closed by weight stretch (73–85% of London bus mass and 71% of rail support mass sit on households stretched more than 5×), which is exactly what PR-S's value-side work removes. ONS household energy expenditure already sits on the frame at design weights.

Round 2 (Vahid's review)

  • Should-fix 1 (alignment as a declaration): done as commit 4 describes; test_childcare_and_bus_references_compile_with_declared_provenance now pins the applied values and checks them against the membership.
  • Should-fix 2 (consumers): the register now separates consumers (present readers; a test imports each module and checks it names the file) from planned_consumers (PR-S). One resource has a present reader, the BUS0415 series.
  • Should-fix 3 (adjudication): moot, the entry is retired (Part G); the plan of record stays outside the tree by repo convention and its rulings are summarised in this body.
  • Should-fix 4 (CI): the separate local feed default is gone with the pin unification; the alignment factors, the vendored headers and the membership feed identity are all checked feed-free in CI now; provisioning the pinned feed in CI so the regeneration tests run there is a follow-up (predates this PR).
  • Questions: the 2023 factors and the OBR vintage are in the body above; covered_by_country_legs is now replaced_by_heterogeneous_country_legs with the scope of each leg spelled out. Nits: the Part F placeholder is gone.
  • María's rulings: one Chronicle pin (commit 1) and FY2024-25 for the cars fuel duty (commit 5); the baseline was re-run on that surface (Part G) and the fuel exclusion retired.

Rebases onto main and the 474a0ae re-pin (chronicle #263)

Main's schema-8 hierarchy (#855) requires a catalog category_id and a label on every contract target: the eight #890 targets declare them (four new providers, six new categories, the cars fuel duty under obr.efo_receipts). The nine English regions join Microcosm's UK geography label catalog (UK_GEOGRAPHY_ID_TO_LABEL), because the London fact carries no geography name and the catalog had only country codes.

The hierarchy also needs dimension labels on every selected Chronicle fact. María's chronicle #263 (closing #261) ships them as chronicle.consumer_fact.v2, so the feed is re-pinned to 474a0ae (141,400 rows, every row labelled; the extra rows are chronicle #260's Universal Credit packages). On that artifact the national generator runs again and regenerates the references and membership byte-identical to the round-2 surface apart from the feed label (424 active / 7 deferred / 7 signed out, no value or period moves), its hierarchy lookups equal the hand-completed ones, the nine vendored resources regenerate, the parity receipts are unchanged, and compile_uk_target_registry compiles 424 / 0 unsupported. All 109,693 local-level facts are identical between the two artifacts, so the local surface moves only by its feed label.

What remains blocked, on main as here: the local generator and the local runtime compile refuse every constituency and local-authority reference because Chronicle emits no geography.name and Microcosm's catalog has no constituency or local-authority labels (receipts Part I). Filed as chronicle#266 (Chronicle owns geography labels per the hierarchy doc) and tracked as microcosm#920; not part of this PR.

Baseline on the new surface (receipts Part J): spine-p cannot host the post-#903 composition rows, so round 3 ran on #903's spine-r twin; every #890 row is inside the 25% bound (cars fuel duty −15.6%), and the battery blocks on one row outside this PR's scope, the HMRC self-employment income band 20–30k cell at +25.8%, which sat at +24.1% on #903's own spine-r calibration. That posture is María's ruling, not a fence added here.

Conflicts across the two rebases: measure-exclusion counts to the merged truth (47 entries, tranche 35), the target-fit register and its tests are main's, the UK spec digest re-pinned.

Surface

Contract 236 → 244 targets (registry 202 → 210); active references 415 → 424; 7 deferred; signed out 8 → 7. National runtime compile 424 / 0 unsupported on the pinned feed. Compile-parity receipts regenerate with the new rows as ledger-only entries.

Receipts

experiments/890-fuel-bus-energy-receipts.md; licensed evidence under data/ukds/acceptance/890-fuel-bus/.

Open rulings carried in the plan

  • Rail: 7270 broad total (GBP 21.6bn, bound here) versus 7271 all-sources operational (GBP 11.9bn, of which DfT GBP 9.5bn). The frame carries GBP 6.1bn of rail support at design weights, so 7270 is closed by a ×3.6 stretch on the 14% of households with rail use; a value-side treatment or a dated exclusion may be the better posture until then.
  • The NI joint public-transport cell versus a declared bus share; ONS 07.2.2 as a diagnostic; the outside-London reason id wording.

Verification

Head e80553b9 on main 15ebde80. Local lanes on that tree: uk 2,089 tests, 1 failure, the local regeneration (test_committed_surfaces_regenerate_from_pinned_feed[local], the #920 blocker, skips in CI), everything else green including the national regeneration from the pinned 474a0ae feed; shared-spec 1,903 tests, 0 failures. tools/ci_test_groups.py --verify, census_uk_local_targets --check, census_uk_data_target_parity --check, vendor_uk_ledger_facts --check and ruff check . clean. Baseline runs: pr-t-round3-spine-r on the new surface (Part J), plus the round-2 runs on spine-p (Part G).

Not in this PR

Every imputed value is unchanged: the car-count predictor, donor uprating, bus incidence, the bus rakes and the energy repricing are PR-S. No dense candidate run.

🤖 Generated with Claude Code

@vahid-ahmadi

Copy link
Copy Markdown
Contributor

Review at a256c880 (Claude Code, high effort; worktree checkout, the six commits read in order; without the engine or the pinned feed: 382 passed, 7 skipped, 0 failed across the twelve touched suites; ruff check and ruff format --check clean on all 16 changed files; both census tools, the coverage manifest, the spec-engine coverage check and ci_test_groups --verify current; CI in progress with no failures so far. Draft, so a comment rather than a review.)

The binding work reproduces. The re-pin commit on its own moves only the membership feed label, so "no existing reference resolves a different fact or value" holds for it. All nine vendored resources carry the new feed identity with matching row counts. Every new resolved value rebuilds from the vendored rows: ONS 04.5 at £43.427bn, Scotland 391m and 499m, Wales 62.4m + 69.0m, DfI 49.6m + 100.5m, NITHC 61.8m + 49.9m, and the BUS0415 factors (England 1.056957928802589, London 1.0) from the four quarter-end means. All five measurement variables exist on the engine at household entity, the two-term value_expression is supported, the region roster and the two region asserts fail closed, and the London derived member is a signed derived_partition_member exclusion rather than a computed target, which is the right shape. The fuel-duty deferral is a dated register entry, not prose, and the receipts are honest that the terminal battery fails without it.

Should-fix

1. The first applied rescale on the UK surface is a runtime post-pass, not a declaration, and the surface now carries two values for one target. align_dft_bus_fare_receipts_to_period (uk_runtime/ledger_targets.py:364-424) runs inside compile_uk_target_registry, keyed on the dft_local_bus family and the fares concept string, and multiplies spec.value by the factor. LedgerTargetReference already has an uprating_index field that flows to spec metadata; the reference does not use it. So target_references.json shows the two rescaled fares rows and the two lag-only support rows in identical shape (uprating_from_period: "2024", no index), uprating_holds in the membership lists all four as the same 2024 → 2025 hold, the membership records England fares at the raw 3,417,388,656 while both parity receipts and the runtime compile record 3,612,036,036, and test_childcare_and_bus_references_compile_with_declared_provenance still pins the unaligned value on the generic compiler. #874 established that a hold is a declared lag with values unchanged; this PR makes the same field trigger a value change for one concept by code. The compiled spec metadata is auditable (index, factor, months, means, record ids, pre-alignment value all present), so the fix is declaration rather than logic: put uprating_index on the two references, let the generator apply or record it, and make membership and parity agree on one value.

2. The vendored register's consumers field is not true yet. ledger_fact_vendor_selections.json lists uk_runtime.ledger_targets as a consumer of three resources, but _fares_index_series reads the feed rows and nothing outside ledger_fact_vendoring.py and its tests loads any vendored file. Nine files, 1.7 MB, no runtime reader; every consumer is PR-S. Not a second source of truth today, but the register says it is. Either mark them prospective or wire the one reader this PR does have.

3. The reviewed exclusion's adjudication is untracked. obr.fuel_duties_cars@2025 cites repos/uk-890-implementation-plan.md (approved 2026-09-10) and a run id; the body and receipts also cite data/ukds/acceptance/890-fuel-bus/. Neither path is in the tree, and neither is gitignored. Every other register entry cites a GitHub comment id. Same ask as on #903: commit the plan or cite something a reader can open.

4. "Regenerates byte-identical under test" runs nowhere in CI. The workflow sets no pinned-feed path, so the vendored regeneration, the reference regeneration and the BUS0415 pinned-feed tests skip in CI as they do here. The local-surface regeneration test also now defaults to a new .codex-work/consumer_facts_uk_local.jsonl, so on a machine with only the national feed it flips silently from run to skip.

Questions

  • The production-2023 parity receipt moves two rows the body does not mention: England fares 3,278,976,692 → 3,258,254,371 (factor 0.99368) and a new London row at 0.99769 of the FY2023-24 fact. Both are the alignment at 2023 with factors below one from the fare cap. Worth a line, since the body gives only the 2025 factors.
  • The OBR cars fuel-duty rows are all vintage april_2024, so the FY2025 £15.9bn bound at period 2025 is a projection two and a half years old. allow_source_projection makes that consistent with the previous obr.fuel_duties row; the vintage should be visible in the body.
  • dft.bus_net_support.uk is signed out as covered_by_country_legs, but the legs are heterogeneous — NITHC is a bus-plus-rail cell excluding the £53.2m other revenue funding, Wales is the local-authority route only. The notes disclose it; "covered" overstates.

Nits

Receipts Part F still carries the placeholder "(filled from … once the run completes)". The two BUS0415 windows share the March 2025 quarter-end, which the basis string declares.

#903 overlap

Same finding as posted there: five of the seven shared files auto-merge, two conflict (test_uk_measure_simulation.py counts — merged truth 47 / 35 with both census markers dropped — and the UK spec sha). Land #903 first and rebase this; also re-run census_uk_data_target_parity --check after, since #903 touches that register.

Could not verify

Regeneration from the pinned feed (no feed here, skipped in CI too), the spine-p baseline runs and the acceptance evidence, and the plan-of-record rulings.


Nothing blocks. 1 is the one that matters: it is the first value the UK surface changes rather than declares, and it should be visible on the reference, not only in the run manifest. 2 and 3 are register accuracy; 4 is a CI gap that predates this PR but bites harder now.

juaristi22 added a commit that referenced this pull request Sep 11, 2026
Two tools/calibrate_uk_national_dataset.py runs on spine-q.h5 with the same
overrides (epochs 1500, family_equal, lr 0.02): this branch's 595-reference
register against PR #904's 424-reference register. All 108 ONS region cells
and 78 of 81 VOA cells fit within 5% (median |error| < 0.1%); the three
band-H cells with no band-H household on the spine sit at -100%, the class
already signed for the local band-H family. Common-row fit is unchanged
within run noise.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@juaristi22
juaristi22 marked this pull request as ready for review September 11, 2026 14:53
juaristi22 added a commit that referenced this pull request Sep 11, 2026
…fuel duty at FY2024-25 (#890)

One commit because the pin rename touches every importer the other changes also touch.

## One Chronicle pin for both surfaces
María's ruling on PR #904: the national and local target surfaces are one
registry and must read one reviewed Chronicle artifact identity. The base
already carried #900, which had moved both to ec7169b; round 1 of this PR
re-pinned only the national side to c6f9361 and gave the local surface its
own default feed file. This commit removes that split.

- uk/national_chronicle_feed.json becomes uk/chronicle_feed.json
  (uk_runtime.chronicle_feed, load_uk_chronicle_feed, UKChronicleFeed,
  scope uk_calibration); every reader is renamed.
- local_target_census restates the pin from that declaration instead of
  carrying its own digest; the local validation-level loader checks the
  register's source_feed against the same declaration.
- The local census, local references and membership, and the local
  validation-level register regenerate from c6f9361: 20,430 active,
  1,586 no-fact, 513 signed deferred, 1 signed compile error, every value
  unchanged; only the feed labels move.
- The separate .codex-work/consumer_facts_uk_local.jsonl default and the
  CHRONICLE_UK_LOCAL_FACTS override are gone; both regeneration tests read
  the one pinned feed. docs/uk-chronicle-feed-repin.md describes the single
  re-pin procedure.

## Vahid's should-fixes and María's fiscal-year ruling
Vahid's review of PR #904 and María's second ruling.

Should-fix 1: the BUS0415 alignment is a declaration on the reference, not a
runtime post-pass keyed on a family and concept string. The four
dft.bus_fare_receipts.* contract rows declare
uprating_index: dft.local_bus_fares_index; the shared authoring gains an
uprating_appliers hook so the generator applies the UK applier while
authoring and the membership records the applied value with index, factor
and value_before_uprating on the hold; the runtime applies the same applier
keyed on the declaration (apply_declared_uk_uprating; an index no applier
implements refuses the compile). Membership, both parity receipts and the
run manifest now carry one value (England 3,417,388,656 -> 3,612,036,036;
London x1). Net support declares nothing and holds unchanged.

Should-fix 2: the BUS0415 series is read from the vendored
dft_bus_value_anchors.json (refused if its feed identity differs from the
pin), so uk_runtime.ledger_targets is a real reader and the production
factors reproduce in CI without the licensed feed. The vendor register
separates consumers (present readers, test-checked by import and source)
from planned_consumers (the spine half).

María's ruling: fiscal-year sources bind the base data's FY2024-25 or
CY2025, never a later fiscal-year projection. obr.fuel_duties_cars pins
period_value 2024 and binds GBP 14.4bn (the April 2024 vintage's FY2024-25
figure) held to 2025, like the HMRC CGT rows, instead of the FY2025-26
GBP 15.9bn projection. On the spine-p baseline the row now solves to -16.7%
(from -41.0%; the frame's calibrated cars duty is GBP 12.0bn either way),
the round-2 run blocked on the dated exclusion being stale, and the
target-fit register is back to empty as on main. The rest of the obr
family still binds FY2025-26 projections by the inherited policy; that is
flagged for María, not changed here.

Also: the UK net-support row's reason id is
replaced_by_heterogeneous_country_legs with each leg's scope spelled out;
the production-2023 parity receipt drops the fuel row (a fact pinned at
FY2024 is not at-or-before 2023); receipts Part G; UK spec digest re-pinned.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@juaristi22

Copy link
Copy Markdown
Collaborator Author

Round 2 at 3fdede45 (all four should-fixes, the three questions and the nits; two of María's rulings landed at the same time).

1. Alignment as a declaration. The four dft.bus_fare_receipts.* contract rows now declare uprating_index: dft.local_bus_fares_index. The generator carries it onto the reference and applies the UK applier while authoring, so target_reference_membership.json records the applied value with index, factor and value_before_uprating on the hold (England 3,417,388,656 → 3,612,036,036; London ×1). The runtime applies the same applier keyed on the declaration (apply_declared_uk_uprating; an index no applier implements refuses the compile), so membership, both parity receipts and the run manifest carry one value. Net support declares nothing and holds unchanged. test_childcare_and_bus_references_compile_with_declared_provenance pins the applied values and checks them against the membership.

2. consumers. Split into consumers (present readers) and planned_consumers (PR-S). The BUS0415 series is now read from the vendored dft_bus_value_anchors.json (refused if its feed identity differs from the pin), which makes uk_runtime.ledger_targets a real reader of that one resource; the other eight list their readers under planned_consumers. A test imports every present consumer and checks its source names the file.

3. Adjudication. Moot: the entry is retired. With the cars fuel duty bound at FY2024-25 (below) the row solves to −16.7%, the round-2 run blocked on the exclusion being stale, and the register is back to empty as on main (receipts Part G). The plan of record lives outside the tree by repo convention (plans are not committed), same as #903; its rulings are summarised in the body.

4. CI. The separate local feed default is gone: María's ruling is that the national and local surfaces share one pin, so uk/national_chronicle_feed.json became uk/chronicle_feed.json and the local census, local references and validation levels restate it (both surfaces regenerate byte-identical from c6f9361 apart from the feed label; local values unchanged). What now runs feed-free in CI: the BUS0415 factors from the vendored series (test_bus0415_alignment_from_the_vendored_series), the vendored headers against the pin, and the membership feed identity. Provisioning the licensed feed in CI so the regeneration tests run there is a follow-up that predates this PR.

Questions. 2023 factors (England 0.99368, London 0.99769, below one from the fare cap) and the april_2024 vintage are in the body and receipts. covered_by_country_legs → replaced_by_heterogeneous_country_legs, with each leg's scope spelled out in the rationale (Wales LA-route only, NITHC bus-plus-rail excluding the GBP 53.2m other revenue funding).

Also in this round (María's ruling). The cars fuel duty binds at FY2024-25 (period_value: 2024, GBP 14.4bn, held to 2025 like the CGT rows), not the FY2025-26 projection: fiscal-year sources bind the base data's FY2024-25 or CY2025. The baseline was re-run on the round-2 surface (Part G): every new row inside the 25% bound, loss 0.01123, 95.45% within 10%, ESS 10,528; the cars fuel duty goes −41.0% → −16.7% with the frame's calibrated duty at GBP 12.0bn either way, so the change is the target, not the frame.

#903 overlap. Agreed on the order; this PR rebases after #903 lands and census_uk_data_target_parity --check is re-run then (it is current at this head).

Nits: the Part F placeholder is gone.

Verification is in the body: shared-spec 1,888/0; uk 2,050 with the known eFRS parity failure plus one I introduced and fixed in the same commit (the validation-levels loader now reads the shared pin, and that file's drift test patches json.loads for the whole call; the pin is read once at import, 28 tests re-run green). UK spec digest re-pinned.

@juaristi22
juaristi22 force-pushed the uk-890-target-binding branch from 3fdede4 to 3bb2927 Compare September 11, 2026 19:20
juaristi22 added a commit that referenced this pull request Sep 11, 2026
…fuel duty at FY2024-25 (#890)

One commit because the pin rename touches every importer the other changes also touch.

María's ruling on PR #904: the national and local target surfaces are one
registry and must read one reviewed Chronicle artifact identity. The base
already carried #900, which had moved both to ec7169b; round 1 of this PR
re-pinned only the national side to c6f9361 and gave the local surface its
own default feed file. This commit removes that split.

- uk/national_chronicle_feed.json becomes uk/chronicle_feed.json
  (uk_runtime.chronicle_feed, load_uk_chronicle_feed, UKChronicleFeed,
  scope uk_calibration); every reader is renamed.
- local_target_census restates the pin from that declaration instead of
  carrying its own digest; the local validation-level loader checks the
  register's source_feed against the same declaration.
- The local census, local references and membership, and the local
  validation-level register regenerate from c6f9361: 20,430 active,
  1,586 no-fact, 513 signed deferred, 1 signed compile error, every value
  unchanged; only the feed labels move.
- The separate .codex-work/consumer_facts_uk_local.jsonl default and the
  CHRONICLE_UK_LOCAL_FACTS override are gone; both regeneration tests read
  the one pinned feed. docs/uk-chronicle-feed-repin.md describes the single
  re-pin procedure.

Vahid's review of PR #904 and María's second ruling.

Should-fix 1: the BUS0415 alignment is a declaration on the reference, not a
runtime post-pass keyed on a family and concept string. The four
dft.bus_fare_receipts.* contract rows declare
uprating_index: dft.local_bus_fares_index; the shared authoring gains an
uprating_appliers hook so the generator applies the UK applier while
authoring and the membership records the applied value with index, factor
and value_before_uprating on the hold; the runtime applies the same applier
keyed on the declaration (apply_declared_uk_uprating; an index no applier
implements refuses the compile). Membership, both parity receipts and the
run manifest now carry one value (England 3,417,388,656 -> 3,612,036,036;
London x1). Net support declares nothing and holds unchanged.

Should-fix 2: the BUS0415 series is read from the vendored
dft_bus_value_anchors.json (refused if its feed identity differs from the
pin), so uk_runtime.ledger_targets is a real reader and the production
factors reproduce in CI without the licensed feed. The vendor register
separates consumers (present readers, test-checked by import and source)
from planned_consumers (the spine half).

María's ruling: fiscal-year sources bind the base data's FY2024-25 or
CY2025, never a later fiscal-year projection. obr.fuel_duties_cars pins
period_value 2024 and binds GBP 14.4bn (the April 2024 vintage's FY2024-25
figure) held to 2025, like the HMRC CGT rows, instead of the FY2025-26
GBP 15.9bn projection. On the spine-p baseline the row now solves to -16.7%
(from -41.0%; the frame's calibrated cars duty is GBP 12.0bn either way),
the round-2 run blocked on the dated exclusion being stale, and the
target-fit register is back to empty as on main. The rest of the obr
family still binds FY2025-26 projections by the inherited policy; that is
flagged for María, not changed here.

Also: the UK net-support row's reason id is
replaced_by_heterogeneous_country_legs with each leg's scope spelled out;
the production-2023 parity receipt drops the fuel row (a fact pinned at
FY2024 is not at-or-before 2023); receipts Part G; UK spec digest re-pinned.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
juaristi22 added a commit that referenced this pull request Sep 11, 2026
#904)

Main merged the calibration target hierarchy (schema 8, #855) after
round 2. The eight #890 targets now declare a catalog category and a
label (four new providers: ORR, Welsh Government, DfI Northern Ireland,
NITHC; six new categories; the cars fuel duty under obr.efo_receipts),
and the committed references carry the contract-derived hierarchy
lookups the generator emits for the 196 contract targets with an active
reference.

What the rebase exposes and this commit does not fix: main's hierarchy
completion requires dimension labels on every selected Chronicle fact
(chronicle#261), which no artifact carries, so on main and here alike
the generators and compile_uk_target_registry return nothing against
the pinned feed (0 compiled / 424 unsupported). The reference surfaces
are the round-2 regenerations plus those lookups; the feed-backed
regeneration and compile tests skip in CI and fail locally until #261
or the interim fallback that issue announces. Vendored resources still
regenerate byte-identical.

The nine English regions join Microcosm's UK geography label catalog:
the London fact carries no geography name and the catalog had only
country codes, so the region leg would be refused at compile once labels
arrive; a test checks the national region roster is covered.

Conflicts: measure-exclusion counts to the merged truth (47 entries,
tranche 35); the UK spec digest re-pinned; the target-fit register and
its tests are main's.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
juaristi22 and others added 8 commits September 14, 2026 13:32
The national feed moves from ec7169b to c6f9361, the merge of chronicle #258
on top of #255: the transport and energy packages #890 binds (HMRC hydrocarbon
oils, OBR fuel duty by vehicle category, DESNZ pump prices, DfT licensed cars
by fuel type, Scotland/Wales/NI bus finance, ORR rail finance and fares index,
NEED consumption, Ofgem cap levels by period and region, ONS Consumer Trends
COICOP expenditure, NTS0313/NTS0621 bus-use frequency). 138,847 rows; the
consumer-fact schema digest moved with the new quarter and week period types.

No existing national reference resolves a different fact or value: 415
active, 7 deferred, 8 signed out, and the compile-parity receipts regenerate
unchanged; only the membership's feed label moves. The local census,
validation levels and local references keep their separately reviewed
ec7169b pin, so the local regeneration test now reads its own default file
(.codex-work/consumer_facts_uk_local.jsonl) instead of falling back to the
national one; the runbook records both locations.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Spine stages and target diagnostics need publisher values without reading the
feed at build time. tools/vendor_uk_ledger_facts.py copies the facts named by
uk/ledger_fact_vendor_selections.json into nine per-concern resources (DfT bus
receipts, support, fares index and NTS quintile trips; HMRC clearances, DESNZ
prices, OBR receipts by vehicle category and ONS population; DfT licensed cars
by fuel type; NEED consumption; Ofgem cap levels and benchmark consumption for
FY2024-25; NTS bus-use frequency; devolved bus finance; ORR rail finance; ONS
COICOP expenditure). Every row carries the fact keys, source digest and value
verbatim plus the national feed identity it was taken from; selectors use the
reference-selector vocabulary and are matched by the same function, so an
unknown field or a changed match count refuses. A test regenerates each
resource byte-identical from the pinned feed. This retires the hand-copied
chronicle_candidate anchors one concern at a time.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…de London (#890 B)

The national reference generator now pins a contract target whose only
declared level is region at region level with its E12 code, so the two
London bus rows match the region-stamped BUS05i facts (fares GBP 1,347.4m,
net support GBP 1,130.2m, year ending March 2025) instead of a country row
that never exists. The compiler refuses a region pin outside the nine English
region codes the geography ladder already carries and refuses a region-pinned
reference that resolves anything but a region-stamped fact, so no second
roster is needed.

England outside London is now a derived partition member: the England and
London rows are bound, Chronicle stamps the outside-London rows at
statistical_scope, and test_uk_bus_targets keeps asserting the publisher
partition reconciles within GBP 1,000. The UK rows stay signed out because
Wales publishes no fare receipts. Active references 415 -> 417; the
compile-parity receipts gain the two London rows as ledger-only entries.
Contract notes on the England rows now describe the compile-time BUS0415
alignment and the in-stage NTS0705a shaping rather than "pending #790".

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…index (#890 C)

BUS05ai receipts are published for the year ending March; the calibration
year is a calendar year. The national compile now transports each
dft_local_bus fare-receipts row by the ratio of the mean BUS0415 local bus
fares index at the four quarter-ends inside the calibration calendar year to
the mean at the four quarter-ends inside the receipts' April-to-March fiscal
year, per publisher series (England E92000001, London E12000007). On the
pinned feed that is x1.05696 for England (GBP 3,417.4m -> 3,612.0m) and x1.0
for London, whose fares were frozen. Net support is never aligned (#789
scope item 5). A missing quarter-end refuses the reference rather than
guessing.

The factor is declared on the spec metadata with the index concept, the
series geography, the months used, their source record ids, the two means,
the pre-alignment value and the adjudication (calendar-year basis, ruling
2026-09-10), so run manifests and receipts show the publisher facts the
transport stands on. The compile-parity receipts move by the same factors.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…evolved bus legs (#890 E1, G, F1)

Eight net-new national targets, all pinned Chronicle facts, in registry
scope with their no-incumbent-ancestor declarations:

- obr.fuel_duties_cars binds the OBR fuel duty receipts from cars (FY2025
  projection GBP 15.9bn) on the engine's cars-only fuel_duty. The
  all-road-users obr.fuel_duties row is signed out of the reference surface
  and its #757 calibration measure exclusion retires with it.
- orr.rail_government_support binds ORR table 7270 total government support
  (FY2024 GBP 21.6bn, Great Britain, so Northern Ireland households are
  filtered out of the measure) on rail_subsidy_spending, replacing the
  incumbent's post-calibration rail scaler.
- ons.household_energy_expenditure binds ONS Consumer Trends COICOP 04.5
  (CY2025 GBP 43.4bn) on domestic_energy_consumption, with the other-fuels
  scope difference noted.
- The devolved local-bus legs: Scotland passenger revenue (GBP 391m) and all
  government support (GBP 499m) from the 2025 Scottish Transport Statistics;
  Wales public support through local authorities (concessionary fares plus
  support to operators, GBP 131.5m gross) from the StatsWales outturn;
  Northern Ireland Translink bus receipts (GBP 150.1m, Ulsterbus plus
  Metro/Glider) from DfI; and Northern Ireland public transport support as a
  joint bus-plus-rail cell (PSO plus concessionary compensation, GBP 111.7m)
  from the NITHC accounts, measured on bus_subsidy_spending +
  rail_subsidy_spending. The UK net-support row is signed out as covered by
  the four country legs; the UK fares row stays out because Wales publishes
  no fare revenue.

Active references 417 -> 424; contract targets 236 -> 244 (registry scope
202 -> 210, unmapped declarations 19 -> 27). Compile-parity receipts gain
the new rows as ledger-only entries.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…eceipts (#890)

On the newest gated national spine (spine-p) with the PR-T surface, every new
row fits inside the 25% bound after calibration except obr.fuel_duties_cars at
-25.6% (from -46.6% before the solve). That row gets a dated reviewed
target-fit exclusion (approved 2026-09-11, expires 2026-10-11, naming the
baseline run) because both of its fixes are the spine half: the LCFS car-count
predictor and the donor litre-proxy uprating. The row stays bound; only the
release fence defers. A second run with the entry in force passes the battery.

The receipts record what the fit costs today: the London bus rows, the
Scotland and Northern Ireland legs and the ORR rail row are closed by weight
stretch on the households that carry the imputed columns (73-85% of London
bus mass and 71% of rail support mass on households stretched more than 5x),
which is the distortion the value-side stage work in PR-S removes; ONS
household energy expenditure already sits on the frame at design weights.
The ORR 7271 all-sources figure is recorded for the open 7270-versus-7271
rail ruling.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…fuel duty at FY2024-25 (#890)

One commit because the pin rename touches every importer the other changes also touch.

María's ruling on PR #904: the national and local target surfaces are one
registry and must read one reviewed Chronicle artifact identity. The base
already carried #900, which had moved both to ec7169b; round 1 of this PR
re-pinned only the national side to c6f9361 and gave the local surface its
own default feed file. This commit removes that split.

- uk/national_chronicle_feed.json becomes uk/chronicle_feed.json
  (uk_runtime.chronicle_feed, load_uk_chronicle_feed, UKChronicleFeed,
  scope uk_calibration); every reader is renamed.
- local_target_census restates the pin from that declaration instead of
  carrying its own digest; the local validation-level loader checks the
  register's source_feed against the same declaration.
- The local census, local references and membership, and the local
  validation-level register regenerate from c6f9361: 20,430 active,
  1,586 no-fact, 513 signed deferred, 1 signed compile error, every value
  unchanged; only the feed labels move.
- The separate .codex-work/consumer_facts_uk_local.jsonl default and the
  CHRONICLE_UK_LOCAL_FACTS override are gone; both regeneration tests read
  the one pinned feed. docs/uk-chronicle-feed-repin.md describes the single
  re-pin procedure.

Vahid's review of PR #904 and María's second ruling.

Should-fix 1: the BUS0415 alignment is a declaration on the reference, not a
runtime post-pass keyed on a family and concept string. The four
dft.bus_fare_receipts.* contract rows declare
uprating_index: dft.local_bus_fares_index; the shared authoring gains an
uprating_appliers hook so the generator applies the UK applier while
authoring and the membership records the applied value with index, factor
and value_before_uprating on the hold; the runtime applies the same applier
keyed on the declaration (apply_declared_uk_uprating; an index no applier
implements refuses the compile). Membership, both parity receipts and the
run manifest now carry one value (England 3,417,388,656 -> 3,612,036,036;
London x1). Net support declares nothing and holds unchanged.

Should-fix 2: the BUS0415 series is read from the vendored
dft_bus_value_anchors.json (refused if its feed identity differs from the
pin), so uk_runtime.ledger_targets is a real reader and the production
factors reproduce in CI without the licensed feed. The vendor register
separates consumers (present readers, test-checked by import and source)
from planned_consumers (the spine half).

María's ruling: fiscal-year sources bind the base data's FY2024-25 or
CY2025, never a later fiscal-year projection. obr.fuel_duties_cars pins
period_value 2024 and binds GBP 14.4bn (the April 2024 vintage's FY2024-25
figure) held to 2025, like the HMRC CGT rows, instead of the FY2025-26
GBP 15.9bn projection. On the spine-p baseline the row now solves to -16.7%
(from -41.0%; the frame's calibrated cars duty is GBP 12.0bn either way),
the round-2 run blocked on the dated exclusion being stale, and the
target-fit register is back to empty as on main. The rest of the obr
family still binds FY2025-26 projections by the inherited policy; that is
flagged for María, not changed here.

Also: the UK net-support row's reason id is
replaced_by_heterogeneous_country_legs with each leg's scope spelled out;
the production-2023 parity receipt drops the fuel row (a fact pinned at
FY2024 is not at-or-before 2023); receipts Part G; UK spec digest re-pinned.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
#904)

Main merged the calibration target hierarchy (schema 8, #855) after
round 2. The eight #890 targets now declare a catalog category and a
label (four new providers: ORR, Welsh Government, DfI Northern Ireland,
NITHC; six new categories; the cars fuel duty under obr.efo_receipts),
and the committed references carry the contract-derived hierarchy
lookups the generator emits for the 196 contract targets with an active
reference.

What the rebase exposes and this commit does not fix: main's hierarchy
completion requires dimension labels on every selected Chronicle fact
(chronicle#261), which no artifact carries, so on main and here alike
the generators and compile_uk_target_registry return nothing against
the pinned feed (0 compiled / 424 unsupported). The reference surfaces
are the round-2 regenerations plus those lookups; the feed-backed
regeneration and compile tests skip in CI and fail locally until #261
or the interim fallback that issue announces. Vendored resources still
regenerate byte-identical.

The nine English regions join Microcosm's UK geography label catalog:
the London fact carries no geography name and the catalog had only
country codes, so the region leg would be refused at compile once labels
arrive; a test checks the national region roster is covered.

Conflicts: measure-exclusion counts to the merged truth (47 entries,
tranche 35); the UK spec digest re-pinned; the target-fit register and
its tests are main's.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…egenerate the surfaces (#904)

María merged chronicle #263 (closing #261): consumer facts now carry
dimension_labels and dimension_value_labels as chronicle.consumer_fact.v2,
the schema-8 hierarchy's missing input. The UK artifact rebuilt at 474a0ae
carries 141,400 rows (the c6f9361 rows plus chronicle #259/#260's nine
Universal Credit packages), every row labelled.

- uk/chronicle_feed.json pins the new artifact (facts bb12d77a, manifest
  c649b7fe, consumer-fact schema 6a42e4a5, rows chronicle.consumer_fact.v2).
- The national generator runs again on main's hierarchy code: references
  and membership regenerate byte-identical to round 2 apart from the feed
  label (424 active / 7 deferred / 7 signed out, no value or period moves)
  and the generator's hierarchy lookups equal the hand-completed ones.
- The nine vendored resources regenerate (rows unchanged, headers move);
  the local census restates the pin; the compile-parity receipts are
  unchanged; compile_uk_target_registry compiles 424 / 0 unsupported.
- All 109,693 local-level facts are identical between the two artifacts,
  so the local surface moves only by its membership feed label. The local
  generator and the local runtime compile stay refused on main and here:
  Chronicle emits no geography.name and Microcosm's catalog has no
  constituency or local-authority labels (receipts Part I); that is the
  local grain's own follow-up.
- The seam-driver test reads the pin's facts digest instead of a literal;
  the local validation-level register restates the new pin.
- Baseline (receipts Part J): spine-p cannot host the post-#903 composition
  rows, so round 3 ran on #903's spine-r twin; every #890 row inside the
  25% bound, the battery blocked on the HMRC self-employment 20-30k band
  cell (+25.8%, +24.1% on #903's own spine-r run), María's ruling.
- Filed chronicle#266 (geography.name) and microcosm#920 (local grain
  blocked since #855) on María's go.

Rebased onto main 15ebde8 first (only the spec-digest conflict).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@juaristi22
juaristi22 force-pushed the uk-890-target-binding branch from 3bb2927 to e80553b Compare September 14, 2026 12:05
@juaristi22

Copy link
Copy Markdown
Collaborator Author

Rebased onto main 15ebde80 and re-pinned the feed to chronicle 474a0ae (María's chronicle #263: consumer facts as chronicle.consumer_fact.v2 with dimension and value labels); head e80553b9, nine commits.

What the labels unblock. The national generator runs again on main's hierarchy code and regenerates the references and membership byte-identical to round 2 apart from the feed label (424 active / 7 deferred / 7 signed out, no value or period moves); its hierarchy lookups equal the hand-completed ones from the previous rebase, so those were what the generator would have written. The nine vendored resources regenerate, the parity receipts are unchanged, and compile_uk_target_registry compiles 424 / 0 unsupported on the pinned artifact (London labelled from the region catalog). 141,400 rows, every one labelled; the extra rows over c6f9361 are chronicle #260's UC packages, and all 109,693 local-level facts are identical between the two artifacts.

What is still blocked, on main as here. The hierarchy labels a geography from geography.name or Microcosm's catalog; Chronicle emits no geography.name and the catalog has no constituency or local-authority labels, so the local generator and the local runtime compile refuse every sub-national reference (receipts Part I). Filed as chronicle#266 (Chronicle owns geography labels per docs/calibration-target-hierarchy.md; the names are already in layout.groupby_value_label) and tracked as microcosm#920. Not fixed here.

Baseline on the new surface (Part J). spine-p cannot host the post-#903 composition rows (ons_household_type), so round 3 ran on #903's spine-r twin: every #890 row inside the 25% bound (cars fuel duty −15.6%), the ten composition cells within ±4.6%; the battery blocks on one row outside this PR's scope, hmrc/self_employment_income_income_band_20_000_to_30_000 at +25.8%, which sat at +24.1% on #903's own spine-r calibration. That posture is María's ruling; no fence added.

Verification. The national regeneration test passes again on the pinned feed; the hierarchy-dependent UK suites (383 tests) have one remaining failure, the local regeneration, which is #920 and skips in CI; ci_test_groups --verify, the two census checks, vendor_uk_ledger_facts --check and ruff check . are clean. The full uk and shared-spec lanes and CI are still running on this head; tallies follow in a reply.

@juaristi22

Copy link
Copy Markdown
Collaborator Author

What this PR makes bindable, where each row stood before, and how the solver does on it (round 3, spine-r, 474a0ae feed, receipts Part J; "initial" is the frame at design weights, "final" after the 1,500-epoch solve).

Rows that were signed out and now bind

  • dft.bus_fare_receipts.london and dft.bus_net_support.london (DfT BUS05ai/bi, London, FY2024-25 label 2025: GBP 1,347.4m fares, alignment factor 1.0; GBP 1,130.2m support). On main both were signed out as region_pin_unsupported (Adjudicate the incumbent's four post-calibration aggregate scalers #790: no region roster and no region leg in the compiler). The region leg binds them at E12000007. Fit: fares −72.3% → +0.1%; support −72.7% → +0.0%.
  • dft.bus_fare_receipts.england (already bound) now carries the BUS0415 alignment: GBP 3,417.4m → 3,612.0m (×1.05696). Fit −46.6% → −0.1%; support −28.9% → −0.1%.
  • The two outside-London rows stay signed out, re-reasoned from statistical_scope_unsupported to derived_partition_member (England minus London is bound through its two parts and reconciled under test). The two UK rows stay signed out: no publisher UK total for fares, and support is replaced by the four heterogeneous country legs rather than a UK total under another name.

Rows that were bound but excluded from the fit, now replaced

  • obr.fuel_duties (OBR all-road-users receipts) was active on main but carried a Swap the microcosm-built UK spine into the national build and retire the incumbent feed #757 measure exclusion (universe scope: freight, vans and business mileage against a household frame, compounded by LCFS diary under-capture; −62% at design weights). It is signed out and replaced by obr.fuel_duties_cars (OBR receipts by vehicle type, cars, FY2024-25 GBP 14.4bn, the April 2024 vintage). Fit −41.1% → −15.6%: the frame's calibrated cars duty is GBP 12.15bn, and the remaining gap is the diary under-capture and the has-fuel zeroing PR-S removes (car count predictor, donor uprating).

Rows that were never ported (no incumbent target; uk-data handled the quantity with a post-calibration scaler or not at all)

  • orr.rail_government_support (ORR table 7270, total government support, Great Britain, FY2024-25 GBP 21.62bn, on rail_subsidy_spending outside Northern Ireland). uk-data scaled rail support to the ORR total after calibration (the Adjudicate the incumbent's four post-calibration aggregate scalers #790 rail scaler). Fit −71.9% → −0.0%.
  • ons.household_energy_expenditure (ONS Consumer Trends COICOP 04.5, CY2025 GBP 43.43bn, on domestic_energy_consumption). uk-data raked energy to NEED means and never bound an expenditure total. Fit +0.2% → −0.1%: the frame already sits on this row at design weights.
  • scotgov.bus.passenger_revenue (GBP 391m) and scotgov.bus.government_support (GBP 499m), Scottish Transport Statistics FY2024-25. Fit −63.0% → −0.2% and −54.4% → +0.1%.
  • welshgov.bus.public_support (StatsWales revenue outturn, concessionary fares plus support to operators through local authorities, FY2024-25 GBP 131.5m). Fit −10.4% → +0.1%.
  • dfi_ni.bus.passenger_receipts (DfI Translink, Ulsterbus plus Metro/Glider, FY2024-25 GBP 150.1m). Fit −65.3% → −0.2%.
  • nithc.public_transport_support (NITHC accounts, PSO plus concessionary compensation, bus and rail as one cell, FY2024-25 GBP 111.7m, on bus_subsidy_spending + rail_subsidy_spending). Fit +66.5% → −0.6%: the frame overshoots at design weights because the ETB donor is a GB survey.

The country-leg facts first exist in Chronicle since #254/#255 and #257/#258, which is why none of them had an incumbent.

How to read the fit. Every row ends inside the 25% bound except the cars fuel duty, and the solver closes the large initial gaps by weight, not level: on the round-1 receipts (Part F, spine-p) 73–85% of the London bus mass, 71% of the rail support mass and 33–57% of the Scotland mass sit on households whose weight rose more than 5×. That is the anatomy the #790 ruling accepted for PR-T and the reason PR-S exists (car count predictor, donor uprating to FY2024-25, bus incidence to NTS frequency, the DfT and NTS rakes, Ofgem-priced energy): after it the frame should reach these rows at or near design weights and the fit should stop being a weight stretch.

@vahid-ahmadi vahid-ahmadi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Closing pass at e80553b9 (Claude Code, high effort; worktree checkout of the nine commits on main 15ebde80, the round-two and round-three responses read against the dispositions; without the engine or the pinned feed: 439 passed, 7 skipped, 0 failed across the fourteen touched and neighbouring suites, all skips feed-gated; ruff check and ruff format --check clean on the 23 changed files and ruff check . clean on the tree; both census tools, the coverage manifest, the spec-engine coverage check and ci_test_groups --verify current; CI ten lanes green and twelve still running, including engine-uk, when I posted).

All four should-fixes closed as described.

1. Verified. The four dft.bus_fare_receipts.* contract rows declare uprating_index: dft.local_bus_fares_index and the four support rows declare none. The generator applies it while authoring, so the membership hold for England records the index, factor 1.05695792880259 and value_before_uprating 3,417,388,656, and the resolved value is the applied 3,612,036,036; London is factor 1 with the same shape; the support holds are lag-only. The incumbent-2025 parity receipt carries the applied value once and the raw value not at all, and the production-2023 receipt carries the aligned 3,258,254,371. align_dft_bus_fare_receipts_to_period survives only as the applier registered behind apply_declared_uk_uprating, which is identity with no index, refuses an index no applier implements and refuses the fares index on a non-fares concept; the compile pre-checks the declaration so an undeclared index fails the whole compile. One precision note: the test the body cites for pinning the applied value against membership is feed-gated and skips here and in CI; the CI-visible proof is test_bus0415_alignment_from_the_vendored_series, which passes.

2. Verified, one small gap. The register now separates consumers from planned_consumers: dft_bus_value_anchors.json has the one present reader and the other eight have none yet, and a test imports each present consumer and asserts its source names the file. _vendored_fares_index_rows refuses the vendored payload when its source_fact_feed differs from the pin, but no test feeds it a mismatched identity — the identity is asserted only on the committed files. One fixture test would close it.

3. Moot and verified. target_fit_reviewed_exclusions.json is byte-identical to main and empty. obr.fuel_duties_cars binds at period_value: 2024, £14.4bn, held to 2025 with no index; obr.fuel_duties moves active → signed-excluded under universe_scope_all_road_users with approver and date; the #757 measure exclusion is gone and the register composes with #903's retirements to 47 with tranche 35, which is what the tests now assert.

4. Partial, as you said. national_chronicle_feed.json is gone and every reader goes through load_uk_chronicle_feed on chronicle_feed.json, pinned to 474a0ae with the v2 schema sha; the old filename survives only in the changelog. The .codex-work local default is gone from code and tests. The regeneration tests still skip in CI because the workflow provides no feed; the feed-free coverage you added does run. The follow-up predates this PR.

Rebase and surface. References 415 → 424 and membership 424 / 7 / 7, with common-row changes confined to the eight bus rows, obr.fuel_duties and the feed label; #903's composition rows and stage are intact; the UK spec sha is re-pinned and that test passes on the merged tree. The local surface moves only in its pin fields and feed label — 44 leaf diffs in the census file, all identity, no values. Part J's numbers are in the receipts.

Could not verify. The runtime compile on the pinned artifact, byte-identical regeneration from the feed, the "only failing test is local regeneration" claim, vendor_uk_ledger_facts --check (it needs --ledger-facts, so the body's "clean" is your environment), the spine-r baseline and the untracked plan. Stale prose: the receipts still name the retired .codex-work local default at line 29.


Approving, subject to the engine-uk and spine-uk lanes finishing green. The one thing I would add before merge is the mismatch test on the vendored feed identity.

juaristi22 added a commit that referenced this pull request Sep 14, 2026
Two tools/calibrate_uk_national_dataset.py runs on spine-q.h5 with the same
overrides (epochs 1500, family_equal, lr 0.02): this branch's 595-reference
register against PR #904's 424-reference register. All 108 ONS region cells
and 78 of 81 VOA cells fit within 5% (median |error| < 0.1%); the three
band-H cells with no band-H household on the spine sit at -100%, the class
already signed for the local band-H family. Common-row fit is unchanged
within run noise.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
juaristi22 added a commit that referenced this pull request Sep 14, 2026
After the rebase onto #904's re-pin (chronicle 474a0ae, consumer_fact.v2
labels, the schema-8 hierarchy from #855) the national register regenerates
byte-identically: 595 active, every one of the 189 region-tier cells
resolves, because the twelve tier codes are all catalogued in
UK_GEOGRAPHY_ID_TO_LABEL and need no Chronicle geography.name. The 2023
compile-parity receipt is regenerated on the same feed (2025 was already
identical). The household-composition bridge test main added since the
branch point moves from a 2010 constituency code to a crosswalk one, as the
older tests did when English areas started resolving their region leg.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@juaristi22

Copy link
Copy Markdown
Collaborator Author

Tallies for e80553b9, as promised above.

@juaristi22
juaristi22 merged commit 18271b2 into main Sep 14, 2026
23 checks passed
juaristi22 added a commit that referenced this pull request Sep 14, 2026
Two tools/calibrate_uk_national_dataset.py runs on spine-q.h5 with the same
overrides (epochs 1500, family_equal, lr 0.02): this branch's 595-reference
register against PR #904's 424-reference register. All 108 ONS region cells
and 78 of 81 VOA cells fit within 5% (median |error| < 0.1%); the three
band-H cells with no band-H household on the spine sit at -100%, the class
already signed for the local band-H family. Common-row fit is unchanged
within run noise.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
juaristi22 added a commit that referenced this pull request Sep 14, 2026
After the rebase onto #904's re-pin (chronicle 474a0ae, consumer_fact.v2
labels, the schema-8 hierarchy from #855) the national register regenerates
byte-identically: 595 active, every one of the 189 region-tier cells
resolves, because the twelve tier codes are all catalogued in
UK_GEOGRAPHY_ID_TO_LABEL and need no Chronicle geography.name. The 2023
compile-parity receipt is regenerated on the same feed (2025 was already
identical). The household-composition bridge test main added since the
branch point moves from a 2010 constituency code to a crosswalk one, as the
older tests did when English areas started resolving their region leg.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
juaristi22 added a commit that referenced this pull request Sep 14, 2026
… chronicle 474a0ae feed (#882)

Seven dwp_universal_credit rows (LCWRA, carer, housing any/social/private
tenure, childcare, deductions) bind the chronicle#260 Payment Indicator crosses
on the calendar-2025 paid-claim basis of the ten broad rows; obr.universal_credit
sums the two OBR welfare-cap cells (expected_member_count 2). Carer and childcare
enter the reviewed exclusion register: model concept gaps (-45 % / +155 % against
the bound targets at the 10 September baseline), not weight questions.

The feed is the one #904 pinned for both grains (chronicle 474a0ae, chronicle#263
labels over the #260 packages); nothing here binds a sub-national row. National
references and membership regenerate on it with main's schema-8 generator:
424 -> 432 active, 7 deferred, 7 signed out; no existing reference changes. Both
national compile-parity receipts gain the new rows as ledger-only entries and
nothing else moves; the vendored fact resources check clean.

Receipts: docs/uk-uc-baseline-2026-09-10.md records the Q50f/D2 UC readout, the
compile-time targets and the element sizing from the new
tools/diagnose_uk_uc_elements.py.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
juaristi22 added a commit that referenced this pull request Sep 14, 2026
The calibration-comparison evidence discloses its register vintage (the
a256c88 register: 47 current entries plus the three #903 retired, no
band-H, hence 374 and 545 targets; 377 and 542 under HEAD) and drops the
stale fuel-duty sentence (#904 retired that exclusion; the row sits at
-23.9% inside the bound). The runbook names the constants' home in
microcosm.calibrate.geography_constants. A geography predicate must project
to the reference's own entity, refused otherwise, so a hand-edited register
cannot misalign a mask silently. The three 2026-09-14 exclusions are
asserted by name, date, tracking and window. ruff format is clean on every
touched file.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
juaristi22 added a commit that referenced this pull request Sep 15, 2026
… chronicle 474a0ae feed (#882)

Seven dwp_universal_credit rows (LCWRA, carer, housing any/social/private
tenure, childcare, deductions) bind the chronicle#260 Payment Indicator crosses
on the calendar-2025 paid-claim basis of the ten broad rows; obr.universal_credit
sums the two OBR welfare-cap cells (expected_member_count 2). Three rows are
measured but held out of the objective on the reviewed exclusion register:
carer and childcare as model concept gaps (-45 % / +155 % against the bound
targets at the 10 September baseline) and the any-tenure housing row as a
structural bias (DWP's 'Yes' includes an other/unknown tenure the model cannot
carry: 112,518 of 4,037,650 in calendar 2025). LCWRA stays in the objective by
the stated rule: a concept mismatch goes to the register only when it puts the
row outside the 25 percent release bound at the baseline. The entries cite
microcosm#882 and docs/uk-uc-baseline-2026-09-10.md, signed in review of #921
on 2026-09-15 with a one-month window, and the register test asserts the
tranche.

Rebuilt on main after #904 and #906: the feed is the one #904 pinned for both
grains (chronicle 474a0ae, chronicle#263 labels over the #260 packages), the
region tier from #906 is untouched, and nothing here binds a sub-national row.
National references and membership regenerate with main's schema-8 generator:
595 -> 603 active, 7 deferred, 7 signed out; no existing reference changes.
Both national compile-parity receipts gain the new rows as ledger-only entries
(eight at 2025, seven at 2023: the OBR total does not compile at 2023) and
nothing else moves; the vendored fact resources check clean.

Also: docs/uk-uc-baseline-2026-09-10.md records the Q50f/D2 UC readout, both
feed pins, the compile-time targets and the element sizing from the new
tools/diagnose_uk_uc_elements.py; a changelog fragment covers the #355
--baseline-pi-floor knob riding this branch.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
juaristi22 added a commit that referenced this pull request Sep 16, 2026
… test, fix the round-1 pin prose (#890 PR-S C0)

- test_vendored_fares_index_refuses_a_foreign_feed: the committed
  dft_bus_value_anchors.json passes the feed-identity check and the same
  payload stamped with another facts digest is refused before any row is
  read.
- Receipts Part A no longer describes the retired separate local pin and
  its .codex-work default as current; it points at the round-2 single pin
  and Part I.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
juaristi22 added a commit that referenced this pull request Sep 25, 2026
…on, targets, calibration, terminal, driver

The graph full build from #901 now lives on main's code: uk_runtime/graph_build (the
one-graph composition over the bound spine checkpoint), graph_population (sample,
normalize, K-clone expansion, ladder locations, geography mapping and gate),
graph_targets (target compilation, selection, measures, the joint problem),
graph_calibration (dense reference solve, size search and draw, refit, holdout),
graph_terminal (export, diagnostics, candidate and certification receipts), the
full_* kernels, the country adapter that validates the UK source projection, the
driver full_build_cli with tools/build_uk_full.py and the microcosm-build-uk script.
Nothing of main's is removed: the seam engine, the release-role driver and every tool
body stay; the graph build sits beside them with dense defaults and no release role
yet (that is the next commit).

Main's newer API is honoured inside the new modules rather than shimmed: the
chronicle feed loader and pin (#904), area_region_codes on the local target surface
(#906), baseline_pi_floor threaded as a node parameter of the size-refit and holdout
nodes (#921), local_authority on the ladder columns, the geography gate's engine-domain
check and the export (#971), the region-level SPI contract in fixtures (#934). The
co-modified modules take #901's additions only: the strict spine-checkpoint helpers in
calibration_run, the draw/derive split in geography_ladder, the geographic pool in
rowwise_dataset, the prepare/solve/finish split in local_rowwise with #921 and #946
re-threaded, the size draw in dataset_size, the checkpoint loader in size_checkpoint,
and eager exports for the 14 new names.

UK spec: the spine's sources are declared as the 14 FRS 2024-25 raw tables with the
build_uk_frs_spine contract-only kernel (added to the F0 allow-list beside the
retained load_uk_national_frame), target period 2025 = the release's calibration
year; the resolved UK spec digest moves (main pins none). Packaging: microcosm-data
in the uk extra, the build script, uv.lock relocked, APPROVED_UV_LOCK_SHA256
recomputed, pytest pythonpath for sibling-test imports.

Flagged for review: _normalise_uk_local_bound_families no longer refuses an empty
declaration (the country-only scope passes none); the driver refuses every existing
acceptance spine at the strict checkpoint gate because this branch's gate
declarations moved, so a licensed full build needs a spine built by this branch.

Verified: targeted 367 + spot-check 203 passed; whole uk group 2,599 passed / 20
skipped; worker-identity lock test 24 passed; ci_test_groups --verify ok; ruff clean.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
juaristi22 added a commit that referenced this pull request Sep 28, 2026
…on, targets, calibration, terminal, driver

The graph full build from #901 now lives on main's code: uk_runtime/graph_build (the
one-graph composition over the bound spine checkpoint), graph_population (sample,
normalize, K-clone expansion, ladder locations, geography mapping and gate),
graph_targets (target compilation, selection, measures, the joint problem),
graph_calibration (dense reference solve, size search and draw, refit, holdout),
graph_terminal (export, diagnostics, candidate and certification receipts), the
full_* kernels, the country adapter that validates the UK source projection, the
driver full_build_cli with tools/build_uk_full.py and the microcosm-build-uk script.
Nothing of main's is removed: the seam engine, the release-role driver and every tool
body stay; the graph build sits beside them with dense defaults and no release role
yet (that is the next commit).

Main's newer API is honoured inside the new modules rather than shimmed: the
chronicle feed loader and pin (#904), area_region_codes on the local target surface
(#906), baseline_pi_floor threaded as a node parameter of the size-refit and holdout
nodes (#921), local_authority on the ladder columns, the geography gate's engine-domain
check and the export (#971), the region-level SPI contract in fixtures (#934). The
co-modified modules take #901's additions only: the strict spine-checkpoint helpers in
calibration_run, the draw/derive split in geography_ladder, the geographic pool in
rowwise_dataset, the prepare/solve/finish split in local_rowwise with #921 and #946
re-threaded, the size draw in dataset_size, the checkpoint loader in size_checkpoint,
and eager exports for the 14 new names.

UK spec: the spine's sources are declared as the 14 FRS 2024-25 raw tables with the
build_uk_frs_spine contract-only kernel (added to the F0 allow-list beside the
retained load_uk_national_frame), target period 2025 = the release's calibration
year; the resolved UK spec digest moves (main pins none). Packaging: microcosm-data
in the uk extra, the build script, uv.lock relocked, APPROVED_UV_LOCK_SHA256
recomputed, pytest pythonpath for sibling-test imports.

Flagged for review: _normalise_uk_local_bound_families no longer refuses an empty
declaration (the country-only scope passes none); the driver refuses every existing
acceptance spine at the strict checkpoint gate because this branch's gate
declarations moved, so a licensed full build needs a spine built by this branch.

Verified: targeted 367 + spot-check 203 passed; whole uk group 2,599 passed / 20
skipped; worker-identity lock test 24 passed; ci_test_groups --verify ok; ruff clean.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
juaristi22 added a commit that referenced this pull request Sep 28, 2026
…on, targets, calibration, terminal, driver

The graph full build from #901 now lives on main's code: uk_runtime/graph_build (the
one-graph composition over the bound spine checkpoint), graph_population (sample,
normalize, K-clone expansion, ladder locations, geography mapping and gate),
graph_targets (target compilation, selection, measures, the joint problem),
graph_calibration (dense reference solve, size search and draw, refit, holdout),
graph_terminal (export, diagnostics, candidate and certification receipts), the
full_* kernels, the country adapter that validates the UK source projection, the
driver full_build_cli with tools/build_uk_full.py and the microcosm-build-uk script.
Nothing of main's is removed: the seam engine, the release-role driver and every tool
body stay; the graph build sits beside them with dense defaults and no release role
yet (that is the next commit).

Main's newer API is honoured inside the new modules rather than shimmed: the
chronicle feed loader and pin (#904), area_region_codes on the local target surface
(#906), baseline_pi_floor threaded as a node parameter of the size-refit and holdout
nodes (#921), local_authority on the ladder columns, the geography gate's engine-domain
check and the export (#971), the region-level SPI contract in fixtures (#934). The
co-modified modules take #901's additions only: the strict spine-checkpoint helpers in
calibration_run, the draw/derive split in geography_ladder, the geographic pool in
rowwise_dataset, the prepare/solve/finish split in local_rowwise with #921 and #946
re-threaded, the size draw in dataset_size, the checkpoint loader in size_checkpoint,
and eager exports for the 14 new names.

UK spec: the spine's sources are declared as the 14 FRS 2024-25 raw tables with the
build_uk_frs_spine contract-only kernel (added to the F0 allow-list beside the
retained load_uk_national_frame), target period 2025 = the release's calibration
year; the resolved UK spec digest moves (main pins none). Packaging: microcosm-data
in the uk extra, the build script, uv.lock relocked, APPROVED_UV_LOCK_SHA256
recomputed, pytest pythonpath for sibling-test imports.

Flagged for review: _normalise_uk_local_bound_families no longer refuses an empty
declaration (the country-only scope passes none); the driver refuses every existing
acceptance spine at the strict checkpoint gate because this branch's gate
declarations moved, so a licensed full build needs a spine built by this branch.

Verified: targeted 367 + spot-check 203 passed; whole uk group 2,599 passed / 20
skipped; worker-identity lock test 24 passed; ci_test_groups --verify ok; ruff clean.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
juaristi22 added a commit that referenced this pull request Sep 28, 2026
…on, targets, calibration, terminal, driver

The graph full build from #901 now lives on main's code: uk_runtime/graph_build (the
one-graph composition over the bound spine checkpoint), graph_population (sample,
normalize, K-clone expansion, ladder locations, geography mapping and gate),
graph_targets (target compilation, selection, measures, the joint problem),
graph_calibration (dense reference solve, size search and draw, refit, holdout),
graph_terminal (export, diagnostics, candidate and certification receipts), the
full_* kernels, the country adapter that validates the UK source projection, the
driver full_build_cli with tools/build_uk_full.py and the microcosm-build-uk script.
Nothing of main's is removed: the seam engine, the release-role driver and every tool
body stay; the graph build sits beside them with dense defaults and no release role
yet (that is the next commit).

Main's newer API is honoured inside the new modules rather than shimmed: the
chronicle feed loader and pin (#904), area_region_codes on the local target surface
(#906), baseline_pi_floor threaded as a node parameter of the size-refit and holdout
nodes (#921), local_authority on the ladder columns, the geography gate's engine-domain
check and the export (#971), the region-level SPI contract in fixtures (#934). The
co-modified modules take #901's additions only: the strict spine-checkpoint helpers in
calibration_run, the draw/derive split in geography_ladder, the geographic pool in
rowwise_dataset, the prepare/solve/finish split in local_rowwise with #921 and #946
re-threaded, the size draw in dataset_size, the checkpoint loader in size_checkpoint,
and eager exports for the 14 new names.

UK spec: the spine's sources are declared as the 14 FRS 2024-25 raw tables with the
build_uk_frs_spine contract-only kernel (added to the F0 allow-list beside the
retained load_uk_national_frame), target period 2025 = the release's calibration
year; the resolved UK spec digest moves (main pins none). Packaging: microcosm-data
in the uk extra, the build script, uv.lock relocked, APPROVED_UV_LOCK_SHA256
recomputed, pytest pythonpath for sibling-test imports.

Flagged for review: _normalise_uk_local_bound_families no longer refuses an empty
declaration (the country-only scope passes none); the driver refuses every existing
acceptance spine at the strict checkpoint gate because this branch's gate
declarations moved, so a licensed full build needs a spine built by this branch.

Verified: targeted 367 + spot-check 203 passed; whole uk group 2,599 passed / 20
skipped; worker-identity lock test 24 passed; ci_test_groups --verify ok; ruff clean.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
juaristi22 added a commit that referenced this pull request Sep 29, 2026
…ity test to 505e0e7

The vendored-fact register and the hmrc_cgt_conditioning_facts.json payload
name uk_runtime.cgt_support in place of uk_runtime.cgt_structure as the
resource's second reader now that the support split, not the retired donor
stack, takes the Table 3 counts from it; the coverage manifest's resource
digest follows. The shared national-and-local Chronicle pin test that
arrived with main's #904 still named the 5324aa2 feed, which this branch
re-pinned to 505e0e7 in its first commit (Chronicle #287/#288, the HMRC CGT
Table 4 facts), so it has been the one red engine-free test on the PR since
the #901 rebase; it now asserts the 505e0e7 identity.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
juaristi22 added a commit that referenced this pull request Sep 30, 2026
…ity test to 505e0e7

The vendored-fact register and the hmrc_cgt_conditioning_facts.json payload
name uk_runtime.cgt_support in place of uk_runtime.cgt_structure as the
resource's second reader now that the support split, not the retired donor
stack, takes the Table 3 counts from it; the coverage manifest's resource
digest follows. The shared national-and-local Chronicle pin test that
arrived with main's #904 still named the 5324aa2 feed, which this branch
re-pinned to 505e0e7 in its first commit (Chronicle #287/#288, the HMRC CGT
Table 4 facts), so it has been the one red engine-free test on the PR since
the #901 rebase; it now asserts the 505e0e7 identity.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants