Repository navigation
Conversation
Fleet ops lets budget-certify start once Route A's reservation releases (expected 19:30-20:30Z on 23 Oct), not at a fixed 00:30Z. The reservation check in guard() is now the only start gate; load and disk checks are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#704 dropped its job hand-off note (463c3a9). This merge takes that, and stops tracking the preparation tooling (.job/, pr-body.md, run-heavy.sh) so the certification commit built on this preparation carries only the data-certification skill's re-cut exception and the generated files. The tooling stays in the workspace, untracked; run-heavy.sh reads it from disk. A durable copy is in ~/reviews/uk-hub/jobs/budget-certify-a133/prep/. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…9Z-a133f37a Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This cut is national-only (--drop-regional-release), so the manifest routes no constituency or local-authority regions. The region, manifest and geography-disclosure tests now assert that routing: with no local_area release the area regions are absent and their lookups return nothing; with one, the earlier assertions stand. A new test checks that a routed area's error still names its dataset, whatever the packaged routing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Coordinator decision on the budget-inputs gate (same-line re-cut exception, under d1682 and d1344). This is the explicit decision the exception requires for the 13 newly missing inputs. Accepted for this cut. None is a regression: no Microcosm cut has ever carried any of them. Eleven are new variables in policyengine-uk 2.147.2, and two became inputs there. No critical input is unusable, and the supported years pass. The condition: they must not reach published figures silently. A reform reading one of these inputs gets its default value, not data. On the dashboard, any measure whose figures depend on one of the 13 is therefore held as a data limit until a cut carries the input. The hold follows the measure's own variables, as the existing data-limit checks do. Before the release is adopted, the dashboard registers the 13 as a data limit. The ones most likely to matter this Budget:
Each held measure can be released by a named person at the Treasury check (G3), with the default stated in its public text, or by a later cut that carries the input. This doesn't change the rest of the evidence package. The 2×2 is still required before merge. Corrected 24 Oct ~07:10Z: the PIP and bus lines. The earlier bus line was wrong: a cap change does produce figures, from the fare table. The PIP line understated the problem. Both now follow the UK hub's reading of the policyengine-uk 2.147.2 code, which I checked. |
|
UK hub: the local reruns behind this PR's test claims, at
The final-head CI still has to pass. It is the full-suite evidence the evidence index requires. routing-changed-tests.logrouting-three-files.logreform-contract-83.log🤖 Generated with Claude Code |
|
Coordinator decision on the reform-responsiveness gate (under d1682 and d1344). This resolves its Accepted. The additional-rate reform responds in every year, including the four that are withheld. The gate returns
The standard reforms are the qualification's test of the cut, not Budget measures. This decision says nothing about any dashboard figure. Follow-up for the aggregate-impact tool (policyengine-uk#2335), not blocking: the receipt doesn't say which of With this decision, the evidence index's gates stand as follows:
The budget-inputs condition still applies before adoption, and the independent review of the index is still running. |
|
@juaristi22, for the one-writer check on this PR, which has no action for you unless you're writing to this cut's certification:
|
|
If there's urgency to certify something now, we can, but I'd recommend not dropping local areas. Instead, make the newer build compatible with the 19 Oct local-area cut, through the accepted mismatch in #699 once its dropped-column check is fixed. Dropping them would also break sim-api, not just area results. Since PolicyEngine/policyengine-sim-api#727, sim-api accepts a national file without Nonetheless, I'd recommend using the national I'm building now: |
|
Thanks, María. I checked the sim-api point, and you're right.
Which cut to certify for the Budget is Max's call. Your recommendation (your 2.151.0 national, |
|
Income tax decomposition: five-point bisection (UK hub, 25 Oct, 15:43–15:45Z). The data is the 19 Oct national cut,
Checks
Where the move is. Of the −£1.183bn total, −£1.315bn falls between positions 12 and 36. The income tax merges in that range are #2240 (pos 13, pension relief and the annual allowance charge), #2440 (pos 20, ANI pension relief) and #2441 (pos 36, annual allowance taper income). #2075 (pos 34) changes which benefit awards are simulated, so it could reach taxable income too. On the enhanced FRS, the PRs' own reports put the same range at about +£0.34bn: #2240 −£27m, #2440 −£461m, #2441 +£831m. So the sign conflict is in this range. Not yet known: which of these PRs carries it, and whether it's a defect. One candidate is a change whose effect depends on inputs this cut carries and eFRS doesn't (#2441's body says eFRS 1.58.1 has neither trading-loss nor supplied-ANI input). Nothing here shows a defect, or rules one out. Next: four more points, at pos 13 ( Driver and evidence: the hub's |
Fixes #714
Certifies the 23 October Microcosm UK national cut for the Autumn Budget (28 Oct):
microcosm-uk-2024-25-national-20261023T075039Z-a133f37aonpolicyengine-uk==2.147.2and core 3.33.3, national-only (--drop-regional-release).budget-local-data-manifest,463c3a953), under the same-line re-cut exception thatdocs/engineering/skills/data-certification.mdrecords (the Budget coordinator's 23 October decision under d1682 and d1344).Draft until the items under "Before this leaves draft" are done. The 2×2 attribution ran in Fleet ops' reservation (it passed at 02:19Z on 25 Oct), and its result, the reform responsiveness and the evidence index are reviewed. One item is open: a decision on the 2×2's 948 unattributed flagged moves (below). The one-writer check carries a re-check immediately before merging. The coordinator's dashboard data-limit condition on the 13 budget inputs gates the dashboard's adoption, not this merge, and is tracked in uk-autumn-budget-dashboard-2026#124. Wrapper qualification is recorded below.
Impact: this changes the certified UK default dataset to a new cut of the same Microcosm line, and the UK model pin from 2.132.6 to 2.147.2. Area regions drop out of the default registry until Monday's cut. The new pin also brings in policyengine-uk#2396's default capital gains realisation response, a retention-rate elasticity of 1 (first released in 2.134.0, so 2.132.6 lacks it). On this candidate the reform contract finds that default on every route. The country routes read the elasticity as 1.0, and the wrapper routes' realised gains and CGT changes match an elasticity of 1. So CGT reforms costed through policyengine.py respond by default once this lands. #602 tracks what follows. Its step 6 makes the contract's default-response cases gate (they report as pending until then). Its step 7 updates the app's methodology page with policyengine-api's bump. The 2×2 attribution (in the evidence table below) separates the model and data effects on the Budget headline figures for FY2026-27 to FY2030-31.
Area routing: this bundle routes no area regions, and the a133 national file carries no
la_code_oa. Under policyengine-sim-api#727, every UK run on sim-api would fail itsla_code_oacheck, national runs included. So sim-api must not take a release carrying this bundle until a cut with area routing is certified. The Budget dashboard's constituency views would show "Results by constituency are not available on this release" (src/utils/geography/view.js, gated onarea_routing.py). Its region views are unaffected.Mechanical handoff; wrapper qualification recorded: reviewed receipts cover this exact candidate pair, commit and bundle (see "Before this leaves draft"). Microcosm's 19 producer release-cut gates and passing pytest do not by themselves establish wrapper qualification.
--drop-regional-releasebuilt_with_model_packagetools/certify_uk_cut_in_policyengine_py.pyfrom microcosm#1348 (base61e25de8) with 14 local rehearsal and guard patches: local commit0788c00c7, not pushed (portable copy sha256941df515…).Evidence package (same-line re-cut exception)
docs/engineering/skills/data-certification.md("Same-line re-cut exception") lists what this exception needs. The status of each item ate02d41b:producer-gates.json(producer evidence only)mechanical-uc_floor.json(the tool'scertification.uc_floor.json)bundle.py check --published-spm --include-tros --strict-tros)holds: true; for example, the default elasticity reads 1.0 against an expected 1.0). The 120 unsupported are route and case pairs the contract excludes by design. The counts match the 21 Oct qualification run on the enhanced FRS (job 119239815076). Ran 05:48Z to 09:10Z on 24 Oct (3 h 22 min).reform-contract.jsonbudget-inputs.json6cba5d71on pe-uk 2.132.6, FY2026-27 to FY2030-31attribution.json(sha256e636bc7f…), rebuilt with no rerun from the run's own receipt (sha2562350f67e…;attribution.logshows that receipt's 1,092 unattributed) with the reviewed mappings (sha256aa276b6f…)reform_responsivenessgate (data/qualification/uk.json): the pinned metrics tool costs its ten standard reforms, 2025–2031, and each must move its target in the stated direction by at least its minimum in every year. All ten ran, and the tool's responsive check passes for all ten. Nine are published in every year. The tenth, raise the additional rate by 3pp, is withheld in 2027-28 to 2030-31 under the tool's small-cell rule (reform_withheld: a reform's costing is withheld in a year it would come from a small cell). There the gate can't recompute the tool's verdict, so it returnsneeds_review, notpass. In the published years its income tax change is +£3.9bn to +£5.5bn, against a £0.55bn minimum. Recording which small-cell condition withheld a year is a non-blocking follow-up: policyengine-uk#2654.reform-responsiveness.jsonreplay.jsontestsstage keeps return code 2). The 6 routing failures are fixed ine02d41b, and the 82 tests the run never reached pass when run alone (logs). The full-suite evidence is this PR's CI on the exact head: the evidence index records it infinal-head-ci.jsonand refuses to index unless every check, including the four Test jobs, has passed at the candidate commit. CI one02d41bpassed all 12 checks (run, 24 Oct). The four Test jobs each collected 4,315 tests, with no failures: 3.11 passed 4,275 and skipped 40; 3.12 and 3.14 passed 4,296 and skipped 19; 3.13 passed 4,301 and skipped 14. In each, the qualification-fallback test passed, andtest_uk_budget_reform_contract.pyran 139 tests, all passing.final-head-ci.json(sha256f0fb989f…, written by the evidence index at 05:03Z on 25 Oct)The evidence receipts hold aggregates and digests only; per-record logs stay outside Git. Two harness fixes were needed during the run, and neither touches the repository:
checked_datain the budget-inputs and reform-contract steps resolveddata/old.h5anddata/new.h5to Hugging Face cache blobs, whose names have no.h5suffix, and policyengine-uk refused that path.After the first review, three more harness changes, none in the repository: a
reform-responsivenessstep; an evidence index that requires its receipt and binds the final-head CI; and an atomic write ofattribution.json, so an interrupted write can't leave a truncated receipt. After the 2×2's first pass (02:01Z), a fourth: that pass's whole-year suppression hid every money total, because two heads have fewer than ten cases. The rerun suppresses only those two heads, and the first pass's receipts are kept.Test failures in the certification run, classified
The certification suite ran with four workers (
-n 4) for 4 h 05 m. Its progress line reached 98% after about 2 h 10 m and stayed there for about two hours. The UK hub then interrupted pytest (SIGINT, 05:32Z, 24 Oct), as the Budget coordinator had ruled at 04:50Z.6 failed, 4,211 passed, 14 skipped; 82 never ran. The session collected 4,313 tests.
tests/test_uk_budget_reform_contract.py. Worker gw0 had run that file's first 38 tests in order.test_the_capital_gains_cases_hold_on_every_in_process_routepassed, gw0 reported nothing more.e02d41bin one process, in file order and after the capital-gains test, as gw0 would have run them (-p no:xdist -o faulthandler_timeout=300). All 83 passed in 3 m 54 s (05:41–05:45Z; log), so the stall did not reproduce.All six failures come from the national-only route (
--drop-regional-release). This cut's manifest setsregional_release_kindto none, and itsregion_datasetshold onlynational. Soarea_regions_routed_to_local_release()is false, the default registry holds no constituency or local-authority regions, anduk_area_dataset_hintreturns an empty string. All six tests assumed the previous bundle'slocal_arearouting:test_uk_regions.py::…children_are_countries_and_areas{'country': 4} == {'country': 4, 'constituency': 650, 'local_authority': 361}test_uk_regions.py::…national_and_area_regions_have_datasets1 == 1 + 1011test_uk_regions.py::…countries_and_areas_filter4 == 4 + 1011test_uk_regions.py::…has_1016_regions5 == 5 + 1011test_release_manifests.py::…area_regions_route_to_local_releaseNone == 'local_area'test_uk_geography_disclosure.py::test_a_missing_area_column_names_the_dataset_that_carries_it'microcosm_uk_2024_25_dense' in ''e02d41bmakes each test assert the bundle's own routing, as the coordinator ruled, rather than skipping it:local_arearouting:constituency/E14001063andlocal_authority/N09000011return None;{"national": "microcosm_uk_2024_25.h5"}, and it bundles no dense dataset;local_arearouting: the earlier assertions stand unchanged.test_a_routed_area_names_its_dataset_in_the_errorpatches in a routed manifest. It checks that the error still names the area's dataset, whatever the packaged routing.At
e02d41b, the changed tests pass single-process: 75 passed, and 119 across all three files (logs).ruff formatandruff checkare clean on them.No other failures.
test_uk_qualification_pipeline.py::test_the_certification_environment_falls_back_to_the_packaged_certificatepassed in this run. The log holds one FAILED line for it, from an earlier attempt that started at 21:29Z on 23 Oct. That attempt was stopped before pytest printed its summary, so the line has no traceback. Run on its own, the test's subprocess takes about 14 s of its 60 s budget. Per the coordinator's ruling, it blocks this PR if CI fails it.Budget-inputs gate: needs review
budget_inputsreturns needs_review: the new pair has 13 model inputs that the data doesn't carry and the previous pair didn't flag. None of them is data the earlier cut had and this one lost:previous_input_status:in_datafalse for all 13). The receipt does not reconstruct cuts before that one; its limitations say so.defined_benefit_pension_share,directly_held_shares,early_years_school_start_deferred,is_full_year_category_a_director,non_residential_property_secured_debt,other_residential_property_secured_debt,pension_annual_allowance_taxable_lump_sum_death_benefits,pension_contributions_via_salary_sacrifice_pre_2015,pip_dl_points,pip_m_pointsandunit_and_investment_trusts.local_bus_uncapped_single_fareandsalary_sacrifice_returned_to_incomewere in 2.132.6, but not as inputs.unusable_criticalis empty). The cut supports 2024–2032, which covers the required years 2025–2030 and the Budget horizon 2026–2031 (supported_years: pass).Each of the 13 takes its model default on this cut. What that means differs by input (policyengine-uk 2.147.2):
local_bus_uncapped_single_fare: a bus fare cap change is priced from the parameter table's three uncapped-fare bands,gov.dft.bus.uncapped_single_fares(person_bus_fare_spending.py:89–98), instead of each person's own fare.pip_dl_pointsandpip_m_points: the cut stores PIP categories, and the loader copies them into every later year (data/economic_assumptions.py:216–242).pip_category(utils/pip.py:18–72) runs only when no category is supplied, so a reform to the points thresholds has no effect and raises no error. Reforms to PIP rates are unaffected.salary_sacrifice_returned_to_income: a legacy input that defaults to zero. The salary-sacrifice cap works throughsalary_sacrifice_pension_ni_excess, which doesn't read it.pension_contributions_via_salary_sacrifice_pre_2015: read only bypension_annual_allowance_threshold_income(:29), so it affects only the tapered annual allowance.Receipts (from the certification tool)
scripts/check_uk_uc_floor.py):passed; measured/benchmark ratios: benefit_units=0.925245, spend=0.957813How it was made (the tool's commands)
uv sync --frozen --extra uk --extra dev --python 3.13 /Users/maxghenis/.subfleet/worktrees/20261023-110044-budget-certify-a133-prep/.job/certification/.venv/bin/python scripts/bundle.py certify-data --country uk --data-producer populace --manifest-uri hf://dataset/policyengine/populace-uk-private@microcosm-uk-2024-25-national-20261023T075039Z-a133f37a/releases/microcosm-uk-2024-25-national/release_manifest.json --drop-regional-release --model-version 2.147.2 --core-version 3.33.3 uv lock --no-config --no-sources --default-index https://pypi.org/simple --python /Users/maxghenis/.subfleet/worktrees/20261023-110044-budget-certify-a133-prep/.job/certification/.venv/bin/python uv sync --frozen --extra uk --extra dev --python 3.13 /Users/maxghenis/.subfleet/worktrees/20261023-110044-budget-certify-a133-prep/.job/certification/.venv/bin/python scripts/release_lock.py /Users/maxghenis/.subfleet/worktrees/20261023-110044-budget-certify-a133-prep/.job/certification/.venv/bin/python scripts/bundle.py generate --include-tros /Users/maxghenis/.subfleet/worktrees/20261023-110044-budget-certify-a133-prep/.job/certification/.venv/bin/python -c 'import json, sys; from pathlib import Path; from policyengine.provenance.uk_qualification import certified_constant_replacements as r, rewrite_certified_constants as w; old, new = json.loads(sys.argv[1]), json.loads(sys.argv[2]); print(json.dumps(w(Path('"'"'.'"'"'), r(old, new))))' '{"build_id": "microcosm-uk-2024-25-national-20261019T083323Z-6cba5d71", "bundle_id": "uk-6.10.1", "certification": {"built_with_model_version": "2.132.6", "certified_by": "policyengine.py bundle certification", "certified_for_model_version": "2.132.6", "compatibility_basis": "built_with_model_package", "core_binding": "bundle_pin", "data_build_id": "microcosm-uk-2024-25-national-20261019T083323Z-6cba5d71"}, "certified_data_artifact": {"build_id": "microcosm-uk-2024-25-national-20261019T083323Z-6cba5d71", "data_package": {"name": "microcosm-data", "version": "0.1.0"}, "dataset": "microcosm_uk_2024_25", "sha256": "810ba980005a8b907cb51464279fa5e0125464b7af9a4871b7f6744c30951ece", "uri": "hf://policyengine/populace-uk-private/microcosm_uk_2024_25.h5@microcosm-uk-2024-25-national-20261019T083323Z-6cba5d71"}, "country_id": "uk", "data_package": {"name": "microcosm-data", "release_manifest_path": "releases/microcosm-uk-2024-25-national/release_manifest.json", "release_manifest_revision": "microcosm-uk-2024-25-national-20261019T083323Z-6cba5d71", "repo_id": "policyengine/populace-uk-private", "repo_type": "dataset", "version": "0.1.0"}, "data_producer": "populace", "datasets": {"calibration_diagnostics": {"path": "releases/microcosm-uk-2024-25-national/calibration_diagnostics.json", "repo_id": "policyengine/populace-uk-private", "revision": "microcosm-uk-2024-25-national-20261019T083323Z-6cba5d71", "sha256": "34978e2bfde3f2641769c9c3a8f60455c59ecae5a50524b359d74388d7edc888"}, "microcosm_uk_2024_25": {"path": "microcosm_uk_2024_25.h5", "repo_id": "policyengine/populace-uk-private", "revision": "microcosm-uk-2024-25-national-20261019T083323Z-6cba5d71", "sha256": "810ba980005a8b907cb51464279fa5e0125464b7af9a4871b7f6744c30951ece"}, "microcosm_uk_2024_25_calibration": {"path": "microcosm_uk_2024_25_calibration.npz", "repo_id": "policyengine/populace-uk-private", "revision": "microcosm-uk-2024-25-national-20261019T083323Z-6cba5d71", "sha256": "104a8253bf1aebc91147c9bbb40e2603d1025317ba8c6b991383d5e4d91852c2"}, "microcosm_uk_2024_25_dense": {"path": "microcosm_uk_2024_25_dense.h5", "repo_id": "policyengine/populace-uk-private", "repo_type": "dataset", "revision": "microcosm-uk-2024-25-dense-20261019T000432Z-ee5c2dbe", "sha256": "8e10e130d0260e0b52e2e29902f0502ebdff76a14a3e57d2c876bf4cd8db5872"}, "release_certification": {"path": "releases/microcosm-uk-2024-25-national/release_certification.json", "repo_id": "policyengine/populace-uk-private", "revision": "microcosm-uk-2024-25-national-20261019T083323Z-6cba5d71", "sha256": "6a68cc93595fc5a7ad451d75a902523c25659de27014f50431dd5e19af5bd959"}, "release_cut_gates": {"path": "releases/microcosm-uk-2024-25-national/release_cut_gates.json", "repo_id": "policyengine/populace-uk-private", "revision": "microcosm-uk-2024-25-national-20261019T083323Z-6cba5d71", "sha256": "c91c1364d9c3be98493039d4e1dd8c2256881a434c1f124dd2ed0701bfaf7751"}, "score_vs_enhanced_frs": {"path": "releases/microcosm-uk-2024-25-national/score_vs_enhanced_frs.json", "repo_id": "policyengine/populace-uk-private", "revision": "microcosm-uk-2024-25-national-20261019T083323Z-6cba5d71", "sha256": "ba8a675f36e7c836bf5521e5933e21bb689442734b7340e05cabd3e0cc55323d"}, "spine_gates": {"path": "releases/microcosm-uk-2024-25-national/spine_gates.json", "repo_id": "policyengine/populace-uk-private", "revision": "microcosm-uk-2024-25-national-20261019T083323Z-6cba5d71", "sha256": "6dbba976dd1304c07da531382cecb11c9cb69512de0ee65126b71f032a0f37d6"}, "terminal_gates": {"path": "releases/microcosm-uk-2024-25-national/terminal_gates.json", "repo_id": "policyengine/populace-uk-private", "revision": "microcosm-uk-2024-25-national-20261019T083323Z-6cba5d71", "sha256": "e29439d5ce0ea098d32579284ac06f26f086feba2fb8d12d1e88ac9a54840808"}}, "default_dataset": "microcosm_uk_2024_25", "default_dataset_uri": "hf://policyengine/populace-uk-private/microcosm_uk_2024_25.h5@microcosm-uk-2024-25-national-20261019T083323Z-6cba5d71", "model_package": {"name": "policyengine-uk", "sha256": "cc54025f2a3bc54be4f8d024d1e6f11ed29fed75ca513b214f2d2963c5bf4354", "version": "2.132.6", "wheel_url": "https://files.pythonhosted.org/packages/11/f2/c003cd7a95cb499737a5b8af0d619ba4e759c8bc7e55a2bb5c7efa46abd1/policyengine_uk-2.132.6-py3-none-any.whl"}, "policyengine_version": "6.10.1", "region_datasets": {"constituency": {"path_template": "microcosm_uk_2024_25_dense.h5"}, "local_authority": {"path_template": "microcosm_uk_2024_25_dense.h5"}, "national": {"path_template": "microcosm_uk_2024_25.h5"}}, "regional_release_kind": "local_area", "regional_release_manifest_uri": "https://huggingface.co/datasets/policyengine/populace-uk-private/resolve/microcosm-uk-2024-25-dense-20261019T000432Z-ee5c2dbe/releases/microcosm-uk-2024-25-dense/release_manifest.json", "regional_source_manifest_uri": "hf://dataset/policyengine/populace-uk-private@microcosm-uk-2024-25-dense-20261019T000432Z-ee5c2dbe/releases/microcosm-uk-2024-25-dense/release_manifest.json", "release_manifest_uri": "https://huggingface.co/datasets/policyengine/populace-uk-private/resolve/microcosm-uk-2024-25-national-20261019T083323Z-6cba5d71/releases/microcosm-uk-2024-25-national/release_manifest.json", "schema_version": 1, "source_manifest_uri": "hf://dataset/policyengine/populace-uk-private@microcosm-uk-2024-25-national-20261019T083323Z-6cba5d71/releases/microcosm-uk-2024-25-national/release_manifest.json", "version": "microcosm-uk-2024-25-national-20261019T083323Z-6cba5d71"}' '{"build_id": "microcosm-uk-2024-25-national-20261023T075039Z-a133f37a", "bundle_id": "uk-6.10.1", "certification": {"built_with_model_version": "2.147.2", "certified_by": "policyengine.py bundle certification", "certified_for_core_version": "3.33.3", "certified_for_model_version": "2.147.2", "compatibility_basis": "built_with_model_package", "core_binding": "certified", "data_build_id": "microcosm-uk-2024-25-national-20261023T075039Z-a133f37a"}, "certified_data_artifact": {"build_id": "microcosm-uk-2024-25-national-20261023T075039Z-a133f37a", "data_package": {"name": "microcosm-data", "version": "0.1.0"}, "dataset": "microcosm_uk_2024_25", "sha256": "64f83900ca3a1242fb017585234844ce89f743d32e41cd2b6558057777f914aa", "uri": "hf://policyengine/populace-uk-private/microcosm_uk_2024_25.h5@microcosm-uk-2024-25-national-20261023T075039Z-a133f37a"}, "country_id": "uk", "data_package": {"name": "microcosm-data", "release_manifest_path": "releases/microcosm-uk-2024-25-national/release_manifest.json", "release_manifest_revision": "microcosm-uk-2024-25-national-20261023T075039Z-a133f37a", "repo_id": "policyengine/populace-uk-private", "repo_type": "dataset", "version": "0.1.0"}, "data_producer": "populace", "datasets": {"calibration_diagnostics": {"path": "releases/microcosm-uk-2024-25-national/calibration_diagnostics.json", "repo_id": "policyengine/populace-uk-private", "revision": "microcosm-uk-2024-25-national-20261023T075039Z-a133f37a", "sha256": "0c975ad04a2d1c0207c3be480d68f645c3a1b24f786c3eef76d6e984dfea0637"}, "microcosm_uk_2024_25": {"path": "microcosm_uk_2024_25.h5", "repo_id": "policyengine/populace-uk-private", "revision": "microcosm-uk-2024-25-national-20261023T075039Z-a133f37a", "sha256": "64f83900ca3a1242fb017585234844ce89f743d32e41cd2b6558057777f914aa"}, "microcosm_uk_2024_25_calibration": {"path": "microcosm_uk_2024_25_calibration.npz", "repo_id": "policyengine/populace-uk-private", "revision": "microcosm-uk-2024-25-national-20261023T075039Z-a133f37a", "sha256": "074872730ad5678cdb4e483d0141ece912be65d6bc032d01bf756f2c3868f2a7"}, "release_certification": {"path": "releases/microcosm-uk-2024-25-national/release_certification.json", "repo_id": "policyengine/populace-uk-private", "revision": "microcosm-uk-2024-25-national-20261023T075039Z-a133f37a", "sha256": "633661c40492645236c0d286576c6206d1fe87609ac7ce90234f625397b9260c"}, "release_cut_gates": {"path": "releases/microcosm-uk-2024-25-national/release_cut_gates.json", "repo_id": "policyengine/populace-uk-private", "revision": "microcosm-uk-2024-25-national-20261023T075039Z-a133f37a", "sha256": "19f9b8bde4cafcfd179607541c5c8fa4247c97858a4ace7a1838bbacd223bc17"}, "score_vs_enhanced_frs": {"path": "releases/microcosm-uk-2024-25-national/score_vs_enhanced_frs.json", "repo_id": "policyengine/populace-uk-private", "revision": "microcosm-uk-2024-25-national-20261023T075039Z-a133f37a", "sha256": "cb4dcde88bf016e0646cdc46a9ab9adf9973c77b16a0cb9e1a25987d57b212ab"}, "spine_gates": {"path": "releases/microcosm-uk-2024-25-national/spine_gates.json", "repo_id": "policyengine/populace-uk-private", "revision": "microcosm-uk-2024-25-national-20261023T075039Z-a133f37a", "sha256": "7959f2a19b6535e67f8d9cb2c37ee68f027892ca10d9d8422be18a8261798f34"}, "terminal_gates": {"path": "releases/microcosm-uk-2024-25-national/terminal_gates.json", "repo_id": "policyengine/populace-uk-private", "revision": "microcosm-uk-2024-25-national-20261023T075039Z-a133f37a", "sha256": "dac50ba94464ca4e2b494fd8ffcd04e47da6dd6e49e9f53bdb7384de7983097f"}}, "default_dataset": "microcosm_uk_2024_25", "default_dataset_uri": "hf://policyengine/populace-uk-private/microcosm_uk_2024_25.h5@microcosm-uk-2024-25-national-20261023T075039Z-a133f37a", "model_package": {"name": "policyengine-uk", "sha256": "4b48ab1008b00610abc38192927ac9d4bb22037b6bbd9578926c2899e639f972", "version": "2.147.2", "wheel_url": "https://files.pythonhosted.org/packages/96/dd/54ddc9226756877e630a3f9fcda4dbf2ae142635e96a564cab3a062ced62/policyengine_uk-2.147.2-py3-none-any.whl"}, "policyengine_version": "6.10.1", "region_datasets": {"national": {"path_template": "microcosm_uk_2024_25.h5"}}, "release_manifest_uri": "https://huggingface.co/datasets/policyengine/populace-uk-private/resolve/microcosm-uk-2024-25-national-20261023T075039Z-a133f37a/releases/microcosm-uk-2024-25-national/release_manifest.json", "schema_version": 1, "source_manifest_uri": "hf://dataset/policyengine/populace-uk-private@microcosm-uk-2024-25-national-20261023T075039Z-a133f37a/releases/microcosm-uk-2024-25-national/release_manifest.json", "version": "microcosm-uk-2024-25-national-20261023T075039Z-a133f37a"}' /Users/maxghenis/.subfleet/worktrees/20261023-110044-budget-certify-a133-prep/.job/certification/.venv/bin/python -c 'import faulthandler, os, sys diagnostic_stream = os.fdopen(os.dup(2), '"'"'w'"'"') faulthandler.dump_traceback_later(300.0, repeat=True, file=diagnostic_stream) try: import pytest raise SystemExit(pytest.main(sys.argv[1:])) finally: faulthandler.cancel_dump_traceback_later() diagnostic_stream.close() ' tests/test_household_calculator_snapshot.py -q /Users/maxghenis/.subfleet/worktrees/20261023-110044-budget-certify-a133-prep/.job/certification/.venv/bin/python scripts/bundle.py check --published-spm --include-tros --strict-tros /Users/maxghenis/.subfleet/worktrees/20261023-110044-budget-certify-a133-prep/.job/certification/.venv/bin/python scripts/check_uk_uc_floor.py --dataset microcosm_uk_2024_25 --year 2025 --output /Users/maxghenis/.subfleet/worktrees/20261023-110044-budget-certify-a133-prep/.job/certification.uc_floor.json /Users/maxghenis/.subfleet/worktrees/20261023-110044-budget-certify-a133-prep/.job/certification/.venv/bin/python -c 'import xdist' uv pip install --python /Users/maxghenis/.subfleet/worktrees/20261023-110044-budget-certify-a133-prep/.job/certification/.venv/bin/python pytest-xdist /Users/maxghenis/.subfleet/worktrees/20261023-110044-budget-certify-a133-prep/.job/certification/.venv/bin/python -c 'import faulthandler, os, sys diagnostic_stream = os.fdopen(os.dup(2), '"'"'w'"'"') faulthandler.dump_traceback_later(300.0, repeat=True, file=diagnostic_stream) try: import pytest raise SystemExit(pytest.main(sys.argv[1:])) finally: faulthandler.cancel_dump_traceback_later() diagnostic_stream.close() ' -n 4 -vv --durations=20 -o faulthandler_timeout=300 -p no:cacheproviderBefore this leaves draft
The 2×2 attribution and a review of its result. It passed at 02:19Z on 25 Oct. The reviewed mappings attribute 144 of 1,092 moves and label the rest unattributed, and the independent review approved them after its changes were adopted.
Reform responsiveness on the exact cut (
reform-responsiveness.json), reviewed, with any non-pass resolved by an explicit decision. It returnsneeds_review(the additional-rate reform's withheld years, above); the Budget coordinator accepted it for this cut (comment). Follow-up: policyengine-uk#2654.The reform contract's result in the table above, reviewed, with any non-pass resolved: it passes, and its 34 pending checks all hold at the #2396 default this candidate pins (24 Oct; the independent review covers it with the other receipts).
CI green on this head, including the qualification-fallback test and the 82 reform-contract tests the local run never reached (run 40071835088, 24 Oct).
The evidence index over the exact pair, reviewed. It was written at 05:03Z on 25 Oct (
evidence-index.json: 35 files; status "evidence collected; review required; replay unavailable"). It indexes the mappedattribution.json(e636bc7f…), the reform-responsiveness receipt and Certify Microcosm UK national cut a133f37a for the Autumn Budget #715's CI ate02d41b(run 40071835088,final-head-ci.json). Its gates: budget_inputs needs_review (accepted), supported_years pass, reform_contract pass, reform_responsiveness needs_review. An independent review approved it. Every file's hash and size matches. Every receipt bindse02d41b, bundle manifestd2821345…and the a133f37a cut, and the producer gates bind the preparation commitb59f6c5a. The rebuiltattribution.jsondiffers from the run's unmapped receipt only in its attribution fields. The old cut's pinnedcalibration_diagnostics.jsonrecords its build as810315ac2(build.code_pin).The budget-inputs
needs_review: accepted for this cut, with the dashboard data-limit condition (coordinator decision). The receipt staysneeds_review.The coordinator's condition, before adoption: linked to the work that registers the 13 inputs as dashboard data limits, uk-autumn-budget-dashboard-2026#124. It is owned by the dashboard adoption PR that moves the pin to the policyengine release carrying this PR. Eleven of the 13 are new variables in policyengine-uk 2.147.2, absent at the dashboard's current pin (2.132.6), so they can't be registered earlier. The condition gates the dashboard's adoption, not this merge. Break up
calculate_economy_comparison.py#124 applies the same check at each later adoption, against that cut's own budget-inputs receipt.A decision on the 948 unattributed flagged moves. d1682 accepts a
needs_reviewresult once every flagged move is attributed to an intended model fix (bisected to a release or PR) or to an approved data change. The re-cut exception says to label unmapped moves unattributed and list limitations, but it does not itself accept them. The first review of this PR read them as blocking approval. The reviewed mappings attribute 144 of the 1,092 moves, and the other 948 (712 poverty, 236 money) are unattributed. An explicit decision is needed before merge: accept them for this cut with stated limitations, attribute more, or hold.Wrapper qualification (from the tool): every gate in
src/policyengine/data/qualification/uk.jsonhas a receipt bound to this exact pair: candidatee02d41b, bundle manifestd2821345…, cut a133f37a. The independent review of the evidence index checked those bindings. Status by gate:Scorecard replay stays unavailable under the same-line re-cut exception (
replay.json, under the coordinator's 23 October decision under d1682 and d1344); unavailable is not a pass. This script waives no gate.One writer: the UK hub and María know this PR exists. The UK hub owns it. María was notified on 25 Oct (comment). On 25 Oct this was the only open certification PR or branch for a133f37a in policyengine.py; the hub checked, and the coordinator re-ran the list at about 10:25Z. The coordinator ruled that the notice plus no other writer is enough, since the check exists so that two people never certify the same cut at once. María's own work has moved to the 2.151.0 cut, which gets its own certification. Two conditions apply:
certify-uk. It also confirms that Certify Microcosm builds published side by side in their own release folders #683 (release-build-folders) doesn't write a133's registry entry or theuk.jsonlines this PR changes, and puts the result in the merge's audit comment.🤖 Generated with Claude Code