Repository navigation
UK: supply the engine's local_authority input from the ladder's April 2023 codes (#953) - #971
Conversation
|
Review at The UK side is sound. One blocker, three body corrections. Blocking
What I verified
Should fix
Nits. Not a formal review while it's a draft; happy to approve once the digest is re-pinned and CI is green. |
|
Thanks, all addressed in 22e25fe. 1 (blocking). 2. 3. Body fixed: 4. Stale verification line replaced with the 2.100.0 results. Nits. Dead disjunct gone: the round-trip test asserts the exact assignment (London row from the two London OAs, then Anglesey, Aberdeen City, Antrim and Newtownabbey), and it now goes through Noted the #979 conflict on the three |
…3 codes (#953) Every household row of the UK rowwise build carried local_authority_code (ONS GSS code, April 2023 LAD roster) but nothing mapped it into the engine's household enum input, so every Microcosm build priced council tax as MAIDSTONE and the five bespoke Council Tax Reduction schemes never fired. The ladder now writes local_authority right after the code, resolved through the sha-pinned ONS names-and-codes resource (uk/local_authority_names.json, tools/generate_uk_local_authority_names.py) and the mechanical key rule with one declared alias (King's Lynn and West Norfolk). Resolution fails closed on any code off the roster; the ladder gate reports any row whose input disagrees with its code (so the local battery's post-calibration rerun carries the verdict); the clone verifies the assigned member names against the installed engine. The input is declared on the export allow-list, not the coverage manifest, which is locked to the incumbent enhanced-FRS surface. The roster-wide engine-domain test is red until the engine pin carries the six April 2023 unitaries (added on the policyengine-uk side); merge after that pin bump. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…unitaries policyengine-uk#1870 (released as 2.100.0) adds Cumberland, North Northamptonshire, North Yorkshire, Somerset, West Northamptonshire and Westmorland and Furness to LocalAuthority, so every April 2023 roster code now resolves to a member. uv.lock moves 2.98.0 -> 2.100.0 and microcosm-build[uk] floors at >=2.100.0, so no build can pair the ladder input with an engine that lacks the members; the roster-wide membership test is green at the pin. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…p digest, refuse a foreign ladder vintage Review at 71c2543 (Vahid). Blocking: the engine bump moved uv.lock, so APPROVED_UV_LOCK_SHA256 in us_runtime/worker_identity.py re-pins to this branch's lock (ee85373f...), as #882's floor bump did; the sealed legacy-campaign digest is a separate identity and stays. "sha-pinned" now holds: geography_sources.LAD23_NAMES_SHA256 pins the ONS lookup bytes; the loader verifies the download, the generator refuses a source whose digest differs, and the resource loader asserts the recorded digest and URL. assign_uk_geography_ladder refuses a ladder whose local authority layer is not the names resource's April 2023 vintage, so a rebuilt ladder surfaces as a vintage message rather than off-roster codes. The engine round-trip test now goes through the written H5 and asserts the exact assignment; the bare-rule test computes the bare rule; the unrelated format hunks in two test files are reverted. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…er vintage, guard the US pool-tool tests Main re-pinned the UK gate-battery mirrors under this branch, so the three whole-manifest digests and the release_cut part's two are re-derived on top of main's values (spine, calibration_seam and the dense local scope are unchanged; the export gate is national-only). The approved uv.lock digest is unchanged because main's lock bytes did not move. The rowwise-candidate tests' toy ladder now declares its local authority layer as 2023_april_lad (its codes are real London codes), which the ladder's vintage refusal requires. Eight tests in test_us_multispine_pool_tool.py that reach the policyengine-us metadata index carry the requires_us marker, so a venv synced with only the UK extra skips them instead of failing on the missing distribution. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
Rebased onto main (
Locally on the rebased tree: 1,342 tests across the touched files, the data shard, the contract pins and the US identity tests, 0 failures. |
22e25fe to
0a25312
Compare
vahid-ahmadi
left a comment
There was a problem hiding this comment.
Second pass at 0a25312d (rebased onto e66d6f6c; worktree with engine 2.100.0 and policyengine-us installed). Local: ruff check clean on the 19 changed files (the two test files that ruff format flags are already unclean on main, and lint runs ruff check only); ci_test_groups.py --verify ok; coverage-manifest --check current; generator --check current against a fresh ONS download; pytest over the new and touched tests, contract pins and US identity tests 831 passed / 1 skipped (unmounted CSV) / 0 failed. Merge-tree against main b78f5a88 clean, and the merged lock still hashes to the new pin.
All round-one items closed:
APPROVED_UV_LOCK_SHA256(worker_identity.py:30-32) equals this branch'suv.lockdigest; the identity tests pass (25 + 2). Legacy constant untouched, as it should be.LAD23_NAMES_SHA256(geography_sources.py:121) is asserted by the lookup loader before parsing, by the generator (naming both digests), and by the resource loader against the recorded sha256 and URL; each refusal has a test, and the pin test ties the constant to the literal.- Body's scheme-supported sentence and verification paragraph corrected.
- Nits: exact-assignment round trip now goes through
write_uk_rowwise_dataset→ H5 →Microsimulation; bare-rule test computes the rule and assertsKING_S_LYNN_AND_WEST_NORFOLK; the two test files carry only your hunks;assign_uk_geography_ladder(geography_ladder.py:447-455) refuses a non-2023_april_ladLA layer naming the resource to regenerate, with a test; both toy ladders declare the vintage.
Rebase commit: the three whole-manifest and two release-cut digests are re-pinned and the pin tests pass; requires_us is a registered marker with skip logic in the root conftest, and the pool-tool tests still run in the us-am engine lane, so the fold-in is mechanical.
Two non-blocking notes: the loader's URL refusal (local_authority_input.py:101-102) has no test, only the digest branch does; and the generator records whatever --url it was given while the loader asserts the constant, so a --url regeneration yields a resource the loader rejects. Self-consistent, but worth a line in the tool's help.
CI: 20 lanes green, including three of the six that were red on the previous head (engine-uk 3.13, fast spine-uk 3.13, wheels 3.14); their 3.14/3.13 twins are still running at post time and run the same tests. Approving on that and the local run; merge on green.
#971 added the engine's local_authority input to the release-cut export allow-list, which moved the full UK gate battery digests and the release-cut certification part's digests on main. Replayed on that base, this branch's two entries move the full triple again; the release-cut part takes main's values unchanged and the spine and calibration-seam parts keep the digests this branch already carried. Data-shard mirrors follow. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…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>
…ased #901: supports, identity kernel, node swap, CLI, export, measurement Source commits (old #932 head, tag uk-932-pre-main-rebase): 3cc384c (rebuild the UK atomic-area supports from published lookups with committed provenance), fef75c3 (assign UK geography on the shared atomic operators, keyed by household lineage), 5ccf1ea (measure the assignment before and after, with committed 1% evidence), 0cd18d5 (name the step-2 evidence after #931 and cite chronicle#269). Applied with `git apply -3` over the re-based #901 head 7eaf6ff; nine files conflicted with main or the re-based series and were merged by hand. What changed against those commits: - Release-role driver: the geography flags (--geography-assignment, default atomic; --atomic-support-{ew,scotland,ni}; --atomic-support-sha256-*) sit beside main's --ladder pins; the cross-flag rules moved from parse_args into rowwise_cli.validate_cli_args next to the ladder/pin rules (atomic requires the three supports, legacy takes none, a release candidate refuses legacy and requires the three support digest pins) and the national role refuses the support flags by name in its refusal table. The supports enter `pins` as flat roles named by their graph source, so the Logbook input-pins digest, the candidate identity digest and uk_size_checkpoint_identity (geography binding in atomic mode only) all bind them; the support admission runs after the spine admission. bindings["geography"] reaches the export descriptor and the rowwise manifest projection (geography.assignment). - #971 interplay: main's export carries the engine local_authority enum resolved from local_authority_code, so the atomic path composes a UK-side node uk.full.geography.local_authority (resolve_local_authority_engine_keys, fail-closed on the April 2023 roster) between the shared derive and the gates. The country adapter's raw-source projection check now scopes to the FRS rows and admits the three support rows by role and loader. - The UK spec digest pin in test_spec_engine_country_bundles is dropped (main removed it). Gate-register re-pin: uk_export_surface's parameters moved the full-manifest policy/manifest/fingerprint digests and the release_cut part digests; the live values are pasted into microcosm-data contract.py and its test. The release-input coverage manifest is unchanged. - tools/build_uk_atomic_area_supports.py carries its own _pinned_sources and _verify_pinned_source (main's US PUMA tool no longer has them). The synthetic rowwise staging spine gains household_support_channel, which the identity kernel keys on. docs/uk-full-build-graph.md does not exist on the re-based line, so #932's hunk to it is not carried. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… guide The re-based guide (688dd60) predates the #932 re-stack; this carries #932's geography section onto it: the three support flags and their pins, the identity-keyed assignment and derivation nodes, the local-authority resolve node added for #971's engine key, the shared and UK gates, the legacy measurement mode, and the node table rows. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ased #901: supports, identity kernel, node swap, CLI, export, measurement Source commits (old #932 head, tag uk-932-pre-main-rebase): 3cc384c (rebuild the UK atomic-area supports from published lookups with committed provenance), fef75c3 (assign UK geography on the shared atomic operators, keyed by household lineage), 5ccf1ea (measure the assignment before and after, with committed 1% evidence), 0cd18d5 (name the step-2 evidence after #931 and cite chronicle#269). Applied with `git apply -3` over the re-based #901 head 7eaf6ff; nine files conflicted with main or the re-based series and were merged by hand. What changed against those commits: - Release-role driver: the geography flags (--geography-assignment, default atomic; --atomic-support-{ew,scotland,ni}; --atomic-support-sha256-*) sit beside main's --ladder pins; the cross-flag rules moved from parse_args into rowwise_cli.validate_cli_args next to the ladder/pin rules (atomic requires the three supports, legacy takes none, a release candidate refuses legacy and requires the three support digest pins) and the national role refuses the support flags by name in its refusal table. The supports enter `pins` as flat roles named by their graph source, so the Logbook input-pins digest, the candidate identity digest and uk_size_checkpoint_identity (geography binding in atomic mode only) all bind them; the support admission runs after the spine admission. bindings["geography"] reaches the export descriptor and the rowwise manifest projection (geography.assignment). - #971 interplay: main's export carries the engine local_authority enum resolved from local_authority_code, so the atomic path composes a UK-side node uk.full.geography.local_authority (resolve_local_authority_engine_keys, fail-closed on the April 2023 roster) between the shared derive and the gates. The country adapter's raw-source projection check now scopes to the FRS rows and admits the three support rows by role and loader. - The UK spec digest pin in test_spec_engine_country_bundles is dropped (main removed it). Gate-register re-pin: uk_export_surface's parameters moved the full-manifest policy/manifest/fingerprint digests and the release_cut part digests; the live values are pasted into microcosm-data contract.py and its test. The release-input coverage manifest is unchanged. - tools/build_uk_atomic_area_supports.py carries its own _pinned_sources and _verify_pinned_source (main's US PUMA tool no longer has them). The synthetic rowwise staging spine gains household_support_channel, which the identity kernel keys on. docs/uk-full-build-graph.md does not exist on the re-based line, so #932's hunk to it is not carried. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… guide The re-based guide (688dd60) predates the #932 re-stack; this carries #932's geography section onto it: the three support flags and their pins, the identity-keyed assignment and derivation nodes, the local-authority resolve node added for #971's engine key, the shared and UK gates, the legacy measurement mode, and the node table rows. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ased #901: supports, identity kernel, node swap, CLI, export, measurement Source commits (old #932 head, tag uk-932-pre-main-rebase): 3cc384c (rebuild the UK atomic-area supports from published lookups with committed provenance), fef75c3 (assign UK geography on the shared atomic operators, keyed by household lineage), 5ccf1ea (measure the assignment before and after, with committed 1% evidence), 0cd18d5 (name the step-2 evidence after #931 and cite chronicle#269). Applied with `git apply -3` over the re-based #901 head 7eaf6ff; nine files conflicted with main or the re-based series and were merged by hand. What changed against those commits: - Release-role driver: the geography flags (--geography-assignment, default atomic; --atomic-support-{ew,scotland,ni}; --atomic-support-sha256-*) sit beside main's --ladder pins; the cross-flag rules moved from parse_args into rowwise_cli.validate_cli_args next to the ladder/pin rules (atomic requires the three supports, legacy takes none, a release candidate refuses legacy and requires the three support digest pins) and the national role refuses the support flags by name in its refusal table. The supports enter `pins` as flat roles named by their graph source, so the Logbook input-pins digest, the candidate identity digest and uk_size_checkpoint_identity (geography binding in atomic mode only) all bind them; the support admission runs after the spine admission. bindings["geography"] reaches the export descriptor and the rowwise manifest projection (geography.assignment). - #971 interplay: main's export carries the engine local_authority enum resolved from local_authority_code, so the atomic path composes a UK-side node uk.full.geography.local_authority (resolve_local_authority_engine_keys, fail-closed on the April 2023 roster) between the shared derive and the gates. The country adapter's raw-source projection check now scopes to the FRS rows and admits the three support rows by role and loader. - The UK spec digest pin in test_spec_engine_country_bundles is dropped (main removed it). Gate-register re-pin: uk_export_surface's parameters moved the full-manifest policy/manifest/fingerprint digests and the release_cut part digests; the live values are pasted into microcosm-data contract.py and its test. The release-input coverage manifest is unchanged. - tools/build_uk_atomic_area_supports.py carries its own _pinned_sources and _verify_pinned_source (main's US PUMA tool no longer has them). The synthetic rowwise staging spine gains household_support_channel, which the identity kernel keys on. docs/uk-full-build-graph.md does not exist on the re-based line, so #932's hunk to it is not carried. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… guide The re-based guide (688dd60) predates the #932 re-stack; this carries #932's geography section onto it: the three support flags and their pins, the identity-keyed assignment and derivation nodes, the local-authority resolve node added for #971's engine key, the shared and UK gates, the legacy measurement mode, and the node table rows. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…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>
…ased #901: supports, identity kernel, node swap, CLI, export, measurement Source commits (old #932 head, tag uk-932-pre-main-rebase): 3cc384c (rebuild the UK atomic-area supports from published lookups with committed provenance), fef75c3 (assign UK geography on the shared atomic operators, keyed by household lineage), 5ccf1ea (measure the assignment before and after, with committed 1% evidence), 0cd18d5 (name the step-2 evidence after #931 and cite chronicle#269). Applied with `git apply -3` over the re-based #901 head 7eaf6ff; nine files conflicted with main or the re-based series and were merged by hand. What changed against those commits: - Release-role driver: the geography flags (--geography-assignment, default atomic; --atomic-support-{ew,scotland,ni}; --atomic-support-sha256-*) sit beside main's --ladder pins; the cross-flag rules moved from parse_args into rowwise_cli.validate_cli_args next to the ladder/pin rules (atomic requires the three supports, legacy takes none, a release candidate refuses legacy and requires the three support digest pins) and the national role refuses the support flags by name in its refusal table. The supports enter `pins` as flat roles named by their graph source, so the Logbook input-pins digest, the candidate identity digest and uk_size_checkpoint_identity (geography binding in atomic mode only) all bind them; the support admission runs after the spine admission. bindings["geography"] reaches the export descriptor and the rowwise manifest projection (geography.assignment). - #971 interplay: main's export carries the engine local_authority enum resolved from local_authority_code, so the atomic path composes a UK-side node uk.full.geography.local_authority (resolve_local_authority_engine_keys, fail-closed on the April 2023 roster) between the shared derive and the gates. The country adapter's raw-source projection check now scopes to the FRS rows and admits the three support rows by role and loader. - The UK spec digest pin in test_spec_engine_country_bundles is dropped (main removed it). Gate-register re-pin: uk_export_surface's parameters moved the full-manifest policy/manifest/fingerprint digests and the release_cut part digests; the live values are pasted into microcosm-data contract.py and its test. The release-input coverage manifest is unchanged. - tools/build_uk_atomic_area_supports.py carries its own _pinned_sources and _verify_pinned_source (main's US PUMA tool no longer has them). The synthetic rowwise staging spine gains household_support_channel, which the identity kernel keys on. docs/uk-full-build-graph.md does not exist on the re-based line, so #932's hunk to it is not carried. Re-stacked on #901 b2538d1 (main 9e5b0ce with #998's test layout): the new tests live in tests/engine_free/uk/ (test_uk_atomic_area_supports_provenance, _supports_tool, _assignment_measurement, _identity_graph; none imports the country engine), the toy ladder-matched supports helper is test_support/microcosm_build/uk_atomic_support_fixtures.py, and every sibling-test import is a test_support import. Where #901 moved a helper into test_support, this commit's change follows it: build() and the support sources in uk_full_target_graph.py, arguments() plus SUPPORT_ARGUMENTS/RELEASE_PINS in uk_full_build_cli.py, _write_staging_h5/_build_args/_dense_argv plus _SUPPORT_FLAGS/ _SUPPORT_PINS/_toy_support_flags in uk_rowwise_candidate.py, and SOURCE_VINTAGE/ source_node/graph_and_registry in uk_full_population_graph.py. The test bodies follow #901's engine/engine_free split (the full-graph compile of test_uk_country_adapter and the two engine-backed target-graph tests under engine/uk; the rest under engine_free/uk). Tool and evidence paths come from test_support.paths.paths_for, not __file__. Verified on this base: 682 engine-free + 8 engine/uk tests passed; ci_test_groups --verify ok; the gate-register pins in microcosm-data test_contract.py hold their #932 values. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… guide The re-based guide (688dd60) predates the #932 re-stack; this carries #932's geography section onto it: the three support flags and their pins, the identity-keyed assignment and derivation nodes, the local-authority resolve node added for #971's engine key, the shared and UK gates, the legacy measurement mode, and the node table rows. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…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>
…ased #901: supports, identity kernel, node swap, CLI, export, measurement Source commits (old #932 head, tag uk-932-pre-main-rebase): 3cc384c (rebuild the UK atomic-area supports from published lookups with committed provenance), fef75c3 (assign UK geography on the shared atomic operators, keyed by household lineage), 5ccf1ea (measure the assignment before and after, with committed 1% evidence), 0cd18d5 (name the step-2 evidence after #931 and cite chronicle#269). Applied with `git apply -3` over the re-based #901 head 7eaf6ff; nine files conflicted with main or the re-based series and were merged by hand. What changed against those commits: - Release-role driver: the geography flags (--geography-assignment, default atomic; --atomic-support-{ew,scotland,ni}; --atomic-support-sha256-*) sit beside main's --ladder pins; the cross-flag rules moved from parse_args into rowwise_cli.validate_cli_args next to the ladder/pin rules (atomic requires the three supports, legacy takes none, a release candidate refuses legacy and requires the three support digest pins) and the national role refuses the support flags by name in its refusal table. The supports enter `pins` as flat roles named by their graph source, so the Logbook input-pins digest, the candidate identity digest and uk_size_checkpoint_identity (geography binding in atomic mode only) all bind them; the support admission runs after the spine admission. bindings["geography"] reaches the export descriptor and the rowwise manifest projection (geography.assignment). - #971 interplay: main's export carries the engine local_authority enum resolved from local_authority_code, so the atomic path composes a UK-side node uk.full.geography.local_authority (resolve_local_authority_engine_keys, fail-closed on the April 2023 roster) between the shared derive and the gates. The country adapter's raw-source projection check now scopes to the FRS rows and admits the three support rows by role and loader. - The UK spec digest pin in test_spec_engine_country_bundles is dropped (main removed it). Gate-register re-pin: uk_export_surface's parameters moved the full-manifest policy/manifest/fingerprint digests and the release_cut part digests; the live values are pasted into microcosm-data contract.py and its test. The release-input coverage manifest is unchanged. - tools/build_uk_atomic_area_supports.py carries its own _pinned_sources and _verify_pinned_source (main's US PUMA tool no longer has them). The synthetic rowwise staging spine gains household_support_channel, which the identity kernel keys on. docs/uk-full-build-graph.md does not exist on the re-based line, so #932's hunk to it is not carried. Re-stacked on #901 b2538d1 (main 9e5b0ce with #998's test layout): the new tests live in tests/engine_free/uk/ (test_uk_atomic_area_supports_provenance, _supports_tool, _assignment_measurement, _identity_graph; none imports the country engine), the toy ladder-matched supports helper is test_support/microcosm_build/uk_atomic_support_fixtures.py, and every sibling-test import is a test_support import. Where #901 moved a helper into test_support, this commit's change follows it: build() and the support sources in uk_full_target_graph.py, arguments() plus SUPPORT_ARGUMENTS/RELEASE_PINS in uk_full_build_cli.py, _write_staging_h5/_build_args/_dense_argv plus _SUPPORT_FLAGS/ _SUPPORT_PINS/_toy_support_flags in uk_rowwise_candidate.py, and SOURCE_VINTAGE/ source_node/graph_and_registry in uk_full_population_graph.py. The test bodies follow the two engine-backed target-graph tests under engine/uk; the rest under engine_free/uk). Tool and evidence paths come from test_support.paths.paths_for, not __file__. Verified on this base: 682 engine-free + 8 engine/uk tests passed; ci_test_groups --verify ok; the gate-register pins in microcosm-data test_contract.py hold their #932 values. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… guide The re-based guide (688dd60) predates the #932 re-stack; this carries #932's geography section onto it: the three support flags and their pins, the identity-keyed assignment and derivation nodes, the local-authority resolve node added for #971's engine key, the shared and UK gates, the legacy measurement mode, and the node table rows. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…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>
…ased #901: supports, identity kernel, node swap, CLI, export, measurement Source commits (old #932 head, tag uk-932-pre-main-rebase): 3cc384c (rebuild the UK atomic-area supports from published lookups with committed provenance), fef75c3 (assign UK geography on the shared atomic operators, keyed by household lineage), 5ccf1ea (measure the assignment before and after, with committed 1% evidence), 0cd18d5 (name the step-2 evidence after #931 and cite chronicle#269). Applied with `git apply -3` over the re-based #901 head 7eaf6ff; nine files conflicted with main or the re-based series and were merged by hand. What changed against those commits: - Release-role driver: the geography flags (--geography-assignment, default atomic; --atomic-support-{ew,scotland,ni}; --atomic-support-sha256-*) sit beside main's --ladder pins; the cross-flag rules moved from parse_args into rowwise_cli.validate_cli_args next to the ladder/pin rules (atomic requires the three supports, legacy takes none, a release candidate refuses legacy and requires the three support digest pins) and the national role refuses the support flags by name in its refusal table. The supports enter `pins` as flat roles named by their graph source, so the Logbook input-pins digest, the candidate identity digest and uk_size_checkpoint_identity (geography binding in atomic mode only) all bind them; the support admission runs after the spine admission. bindings["geography"] reaches the export descriptor and the rowwise manifest projection (geography.assignment). - #971 interplay: main's export carries the engine local_authority enum resolved from local_authority_code, so the atomic path composes a UK-side node uk.full.geography.local_authority (resolve_local_authority_engine_keys, fail-closed on the April 2023 roster) between the shared derive and the gates. The country adapter's raw-source projection check now scopes to the FRS rows and admits the three support rows by role and loader. - The UK spec digest pin in test_spec_engine_country_bundles is dropped (main removed it). Gate-register re-pin: uk_export_surface's parameters moved the full-manifest policy/manifest/fingerprint digests and the release_cut part digests; the live values are pasted into microcosm-data contract.py and its test. The release-input coverage manifest is unchanged. - tools/build_uk_atomic_area_supports.py carries its own _pinned_sources and _verify_pinned_source (main's US PUMA tool no longer has them). The synthetic rowwise staging spine gains household_support_channel, which the identity kernel keys on. docs/uk-full-build-graph.md does not exist on the re-based line, so #932's hunk to it is not carried. Re-stacked on #901 b2538d1 (main 9e5b0ce with #998's test layout): the new tests live in tests/engine_free/uk/ (test_uk_atomic_area_supports_provenance, _supports_tool, _assignment_measurement, _identity_graph; none imports the country engine), the toy ladder-matched supports helper is test_support/microcosm_build/uk_atomic_support_fixtures.py, and every sibling-test import is a test_support import. Where #901 moved a helper into test_support, this commit's change follows it: build() and the support sources in uk_full_target_graph.py, arguments() plus SUPPORT_ARGUMENTS/RELEASE_PINS in uk_full_build_cli.py, _write_staging_h5/_build_args/_dense_argv plus _SUPPORT_FLAGS/ _SUPPORT_PINS/_toy_support_flags in uk_rowwise_candidate.py, and SOURCE_VINTAGE/ source_node/graph_and_registry in uk_full_population_graph.py. The test bodies follow the two engine-backed target-graph tests under engine/uk; the rest under engine_free/uk). Tool and evidence paths come from test_support.paths.paths_for, not __file__. Verified on this base: 682 engine-free + 8 engine/uk tests passed; ci_test_groups --verify ok; the gate-register pins in microcosm-data test_contract.py hold their #932 values. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… guide The re-based guide (688dd60) predates the #932 re-stack; this carries #932's geography section onto it: the three support flags and their pins, the identity-keyed assignment and derivation nodes, the local-authority resolve node added for #971's engine key, the shared and UK gates, the legacy measurement mode, and the node table rows. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ased #901: supports, identity kernel, node swap, CLI, export, measurement Source commits (old #932 head, tag uk-932-pre-main-rebase): 3cc384c (rebuild the UK atomic-area supports from published lookups with committed provenance), fef75c3 (assign UK geography on the shared atomic operators, keyed by household lineage), 5ccf1ea (measure the assignment before and after, with committed 1% evidence), 0cd18d5 (name the step-2 evidence after #931 and cite chronicle#269). Applied with `git apply -3` over the re-based #901 head 7eaf6ff; nine files conflicted with main or the re-based series and were merged by hand. What changed against those commits: - Release-role driver: the geography flags (--geography-assignment, default atomic; --atomic-support-{ew,scotland,ni}; --atomic-support-sha256-*) sit beside main's --ladder pins; the cross-flag rules moved from parse_args into rowwise_cli.validate_cli_args next to the ladder/pin rules (atomic requires the three supports, legacy takes none, a release candidate refuses legacy and requires the three support digest pins) and the national role refuses the support flags by name in its refusal table. The supports enter `pins` as flat roles named by their graph source, so the Logbook input-pins digest, the candidate identity digest and uk_size_checkpoint_identity (geography binding in atomic mode only) all bind them; the support admission runs after the spine admission. bindings["geography"] reaches the export descriptor and the rowwise manifest projection (geography.assignment). - #971 interplay: main's export carries the engine local_authority enum resolved from local_authority_code, so the atomic path composes a UK-side node uk.full.geography.local_authority (resolve_local_authority_engine_keys, fail-closed on the April 2023 roster) between the shared derive and the gates. The country adapter's raw-source projection check now scopes to the FRS rows and admits the three support rows by role and loader. - The UK spec digest pin in test_spec_engine_country_bundles is dropped (main removed it). Gate-register re-pin: uk_export_surface's parameters moved the full-manifest policy/manifest/fingerprint digests and the release_cut part digests; the live values are pasted into microcosm-data contract.py and its test. The release-input coverage manifest is unchanged. - tools/build_uk_atomic_area_supports.py carries its own _pinned_sources and _verify_pinned_source (main's US PUMA tool no longer has them). The synthetic rowwise staging spine gains household_support_channel, which the identity kernel keys on. docs/uk-full-build-graph.md does not exist on the re-based line, so #932's hunk to it is not carried. Re-stacked on #901 b2538d1 (main 9e5b0ce with #998's test layout): the new tests live in tests/engine_free/uk/ (test_uk_atomic_area_supports_provenance, _supports_tool, _assignment_measurement, _identity_graph; none imports the country engine), the toy ladder-matched supports helper is test_support/microcosm_build/uk_atomic_support_fixtures.py, and every sibling-test import is a test_support import. Where #901 moved a helper into test_support, this commit's change follows it: build() and the support sources in uk_full_target_graph.py, arguments() plus SUPPORT_ARGUMENTS/RELEASE_PINS in uk_full_build_cli.py, _write_staging_h5/_build_args/_dense_argv plus _SUPPORT_FLAGS/ _SUPPORT_PINS/_toy_support_flags in uk_rowwise_candidate.py, and SOURCE_VINTAGE/ source_node/graph_and_registry in uk_full_population_graph.py. The test bodies follow the two engine-backed target-graph tests under engine/uk; the rest under engine_free/uk). Tool and evidence paths come from test_support.paths.paths_for, not __file__. Verified on this base: 682 engine-free + 8 engine/uk tests passed; ci_test_groups --verify ok; the gate-register pins in microcosm-data test_contract.py hold their #932 values. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… guide The re-based guide (688dd60) predates the #932 re-stack; this carries #932's geography section onto it: the three support flags and their pins, the identity-keyed assignment and derivation nodes, the local-authority resolve node added for #971's engine key, the shared and UK gates, the legacy measurement mode, and the node table rows. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…usal)
microcosm#971 compares the ladder's local_authority layer vintage with the
names resource's '2023_april_lad'. tools/build_uk_oa_ladder_artifact.py
writes one composite vintage per full-UK layer
('ew:2023_april_lad;scotland:2019_council_area;ni:2014_lgd'), so every real
ladder was refused and the dense line has been unrunnable on a real ladder
since 2026-09-23 (found by the licensed #901 smoke run; reported on #932).
The April 2023 LAD list is exactly the England and Wales LADs plus the 2019
Scottish council areas plus the 2014 Northern Ireland LGDs, which is what the
names resource enumerates, so the composite is pinned beside the names
constant (UK_LOCAL_AUTHORITY_LADDER_VINTAGE) and the refusal accepts the
plain vintage of an England-and-Wales-only ladder or that composite, and
nothing else. Two tests: the composite is accepted, a foreign composite is
refused; the existing plain-vintage refusal stands.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ased #901: supports, identity kernel, node swap, CLI, export, measurement Source commits (old #932 head, tag uk-932-pre-main-rebase): 3cc384c (rebuild the UK atomic-area supports from published lookups with committed provenance), fef75c3 (assign UK geography on the shared atomic operators, keyed by household lineage), 5ccf1ea (measure the assignment before and after, with committed 1% evidence), 0cd18d5 (name the step-2 evidence after #931 and cite chronicle#269). Applied with `git apply -3` over the re-based #901 head 7eaf6ff; nine files conflicted with main or the re-based series and were merged by hand. What changed against those commits: - Release-role driver: the geography flags (--geography-assignment, default atomic; --atomic-support-{ew,scotland,ni}; --atomic-support-sha256-*) sit beside main's --ladder pins; the cross-flag rules moved from parse_args into rowwise_cli.validate_cli_args next to the ladder/pin rules (atomic requires the three supports, legacy takes none, a release candidate refuses legacy and requires the three support digest pins) and the national role refuses the support flags by name in its refusal table. The supports enter `pins` as flat roles named by their graph source, so the Logbook input-pins digest, the candidate identity digest and uk_size_checkpoint_identity (geography binding in atomic mode only) all bind them; the support admission runs after the spine admission. bindings["geography"] reaches the export descriptor and the rowwise manifest projection (geography.assignment). - #971 interplay: main's export carries the engine local_authority enum resolved from local_authority_code, so the atomic path composes a UK-side node uk.full.geography.local_authority (resolve_local_authority_engine_keys, fail-closed on the April 2023 roster) between the shared derive and the gates. The country adapter's raw-source projection check now scopes to the FRS rows and admits the three support rows by role and loader. - The UK spec digest pin in test_spec_engine_country_bundles is dropped (main removed it). Gate-register re-pin: uk_export_surface's parameters moved the full-manifest policy/manifest/fingerprint digests and the release_cut part digests; the live values are pasted into microcosm-data contract.py and its test. The release-input coverage manifest is unchanged. - tools/build_uk_atomic_area_supports.py carries its own _pinned_sources and _verify_pinned_source (main's US PUMA tool no longer has them). The synthetic rowwise staging spine gains household_support_channel, which the identity kernel keys on. docs/uk-full-build-graph.md does not exist on the re-based line, so #932's hunk to it is not carried. Re-stacked on #901 b2538d1 (main 9e5b0ce with #998's test layout): the new tests live in tests/engine_free/uk/ (test_uk_atomic_area_supports_provenance, _supports_tool, _assignment_measurement, _identity_graph; none imports the country engine), the toy ladder-matched supports helper is test_support/microcosm_build/uk_atomic_support_fixtures.py, and every sibling-test import is a test_support import. Where #901 moved a helper into test_support, this commit's change follows it: build() and the support sources in uk_full_target_graph.py, arguments() plus SUPPORT_ARGUMENTS/RELEASE_PINS in uk_full_build_cli.py, _write_staging_h5/_build_args/_dense_argv plus _SUPPORT_FLAGS/ _SUPPORT_PINS/_toy_support_flags in uk_rowwise_candidate.py, and SOURCE_VINTAGE/ source_node/graph_and_registry in uk_full_population_graph.py. The test bodies follow the two engine-backed target-graph tests under engine/uk; the rest under engine_free/uk). Tool and evidence paths come from test_support.paths.paths_for, not __file__. Verified on this base: 682 engine-free + 8 engine/uk tests passed; ci_test_groups --verify ok; the gate-register pins in microcosm-data test_contract.py hold their #932 values. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… guide The re-based guide (688dd60) predates the #932 re-stack; this carries #932's geography section onto it: the three support flags and their pins, the identity-keyed assignment and derivation nodes, the local-authority resolve node added for #971's engine key, the shared and UK gates, the legacy measurement mode, and the node table rows. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…usal)
microcosm#971 compares the ladder's local_authority layer vintage with the
names resource's '2023_april_lad'. tools/build_uk_oa_ladder_artifact.py
writes one composite vintage per full-UK layer
('ew:2023_april_lad;scotland:2019_council_area;ni:2014_lgd'), so every real
ladder was refused and the dense line has been unrunnable on a real ladder
since 2026-09-23 (found by the licensed #901 smoke run; reported on #932).
The April 2023 LAD list is exactly the England and Wales LADs plus the 2019
Scottish council areas plus the 2014 Northern Ireland LGDs, which is what the
names resource enumerates, so the composite is pinned beside the names
constant (UK_LOCAL_AUTHORITY_LADDER_VINTAGE) and the refusal accepts the
plain vintage of an England-and-Wales-only ladder or that composite, and
nothing else. Two tests: the composite is accepted, a foreign composite is
refused; the existing plain-vintage refusal stands.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Closes the input half of #953: every household row of the UK rowwise build now carries the engine's
local_authorityenum input, resolved from the ladder's April 2023 ONSlocal_authority_code, so council tax and the five bespoke Council Tax Reduction schemes (Merton, Kingston upon Thames, Newham, Oxford, Westminster) stop seeing theMAIDSTONEdefault on Microcosm builds.What changes
tools/generate_uk_local_authority_names.pydownloads (or reads frombuild/uk/) the ONS "Local Authority Districts (April 2023) Names and Codes in the United Kingdom" lookup (iteme8b361ba…, sha2566c2d811f…, 361 rows: E 296, W 22, S 32, N 11) and writes the committed resourceuk/local_authority_names.json(code → ONS name → engine key), registered in the country package.geography_sources.LAD23_NAMES_SHA256pins the lookup bytes: the loader verifies the download, the generator refuses a source whose digest differs (a re-published lookup is a reviewed re-pin), and the resource loader asserts the recorded digest and URL. One file covers the crosswalk's three roster vintages, because Scottish council-area and Northern Irish district codes are unchanged since ca_2019 / lgd_2014.geography_sources.load_lad23_names_lookupis the pinned loader.uk_runtime/local_authority_input.py: upper-case, non-alphanumeric runs to one underscore, strip the ends, reproduces theLocalAuthoritymember name for every roster authority exceptKing's Lynn and West Norfolk(the engine drops the apostrophe), which is the single declared alias. The resource loader refuses any row whose stored key is not the rule's output.assign_uk_geography_ladderwriteslocal_authorityright afterlocal_authority_code;resolve_local_authority_engine_keysraises on any code the roster does not carry (never a default).local_authorityjoinsUK_GEOGRAPHY_LADDER_COLUMNSand the spec'sderive:list, so the non-blank validator, the pre-assigned-geography refusal and the assignment summary pick it up.uk_geography_ladder_gatereports blank inputs, off-roster codes and any row whoselocal_authoritydisagrees with its code. Becauseuk_local_geography_ladder_post_calibrationreruns this gate on the calibrated candidate, the local battery carries the verdict with no driver change.verify_local_authority_engine_domain);test_uk_local_authority_input.pyasserts the whole roster.household.local_authorityis added toUK_ALLOWED_EXTRA_EXPORT_COLUMNSand itsgates.jsonmirror, following the Align UK UC claim, child and period definitions #882 precedent for engine inputs the incumbent never carried.Two corrections to the issue text
local_authoritytorelease_input_coverage_manifest.jsonasrequired. That manifest is locked set-equal to the licensed enhanced-FRS populated surface (assert_uk_release_input_coverage_manifest_current), so a net-new input cannot go there; the allow-list is the declared path.enum_domainbattery gate is declared: that family needs arules_engineevidence artifact the rowwise local battery never supplies, and the existing post-calibration ladder gate already reruns the consistency check.Engine dependency and sequencing
The engine at 2.98.0 lacked the six April 2023 unitaries (North Northamptonshire, West Northamptonshire, Cumberland, Westmorland and Furness, North Yorkshire, Somerset), exactly the six roster codes that did not resolve. PolicyEngine/policyengine-uk#1870 added them (merged 2026-09-22, released as 2.100.0), and this PR now pins that release:
uv.lockmoves policyengine-uk 2.98.0 → 2.100.0 andmicrocosm-build[uk]floors at>=2.100.0, so the roster-wide membership test is green at the pin and no build can run against an engine without the members. Between 2.98.0 and 2.100.0 the engine also added three person-level capital-gains inputs (2.99.0) and changed the relative-poverty line to the median over individuals (2.99.2); the engine-sensitive UK tests (release input coverage, measure simulation, terminal gates, battery bindings, FRS spine, take-up gate, calibration run, the frame adapter) pass on 2.100.0.Expected measured effect at 2.100.0
council_tax_benefit = where(council_tax_reduction_scheme_supported, simulated, reported). At 2.100.0council_tax_reduction_scheme_supportedis the England-pensioner scheme, the Scotland scheme, the Wales scheme, or one of the five working-age bespoke schemes (Merton, Kingston upon Thames, Newham, Westminster, Oxford); only those five terms readlocal_authority, and each also requires England and no pensioner. So supplying the input changescouncil_tax_benefitonly for working-age England households drawn into those five authorities, and HBAI-net-income deltas are confined to them. Nothing else moves until policyengine-uk#1855 lands; the issue's Band D receipts (distinctcouncil_tax_band_d_amountper nation = 296/22/32, the Englandsimulated_council_taxaggregate) are taken on a pin at or past #1855.Verification
-m requires_uk, build + frame) pass on 2.100.0; the engine-sensitive UK files (release input coverage, measure simulation, terminal gates, battery bindings, FRS spine, take-up gate, calibration run, frame adapter) pass.tools/ci_test_groups.py --verifygreen; the new test file lands inspine-ukanduk:build. Generator--checkgreen against the pinned ONS download.test_cloned_local_authority_survives_the_engine_loaderwrites a cloned frame to H5, reads it back, loads it throughMicrosimulationand gets the written member names back decoded.uv.lock, sous_runtime/worker_identity.py'sAPPROVED_UV_LOCK_SHA256is re-pinned to this branch's lock (ee85373f…), as Align UK UC claim, child and period definitions #882's floor bump did; the sealed legacy-campaign digest is a separate identity and stays. If main's lock moves before this merges, that constant re-pins again at rebase. The three_UK_GATE_BATTERY_*digests incontract.pyconflict with UK CGT: interpolate the sub-exempt remainder, anchor the clone incidence, and fence projected entrants (#970) #979; whichever lands second re-pins them.🤖 Generated with Claude Code