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 |
|
Income tax trace: the per-PR split (UK hub, 25 Oct, run 18:50–19:43Z). This follows the five-point bisection. Aggregates only. Twelve runs measured income tax and its components for 2026 at pe-uk positions 12, 13, 19, 20, 35 and 36 on main's first-parent line. They used two datasets, the old cut
|
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. This PR is now the fallback. Max ruled on 25 Oct (d2011, option A) to certify María's 2.151.0 national and local-area pair (microcosm#1396) instead. This PR goes ahead only if that pair isn't certified by Tue 27 Oct 18:00Z, and then with #699's area routing. Until then it stays draft and isn't merged. María had recommended keeping local areas (comment). A national-only bundle breaks sim-api: since policyengine-sim-api#727, a UK national file without
la_code_oais admitted only when the bundle routes constituency and local-authority regions to a local-area release. This cut's national file has no area codes, so every UK sim-api run, national ones included, would fail once sim-api'spolicyenginepin moves to a release carrying this bundle. sim-api must not take a release carrying any national-only bundle, this one included, until compatible area routing or a reviewed sim-api change is available. Under d2011, unattributed moves are disclosed rather than attributed first (see the open item 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. So sim-api must not take a release carrying it (see the hold at the top). 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.Max's ruling on the cut (d2011, 25 Oct): option A, María's 2.151.0 national and local-area pair (microcosm#1396). This PR is the fallback if that pair isn't certified by Tue 27 Oct 18:00Z, and then it goes ahead with #699's area routing. sim-api stays off any national-only bundle, and that hold is recorded on the sim-api bump that would carry it.
If the fallback is used: #699's area routing integrated and reviewed here, with the receipts it affects rerun or rebound.
Integration and evidence at the merge head: after Support bundle-pinned local data release manifests #704 lands and its release/version updates settle, retarget this PR to
main, resolve the bundle/TRO conflicts and review the delta frome02d41b. Record the new head and manifest digest, confirm the cut/data/model/core pins, and review which receipts can carry through a documented rebinding and which affected gates must rerun. Preserve the original receipts. Obtain green CI, including documentation checks, at the resulting head and update the index/checklist. Run any needed qualification work only after Fleet ops permits it.The 948 unattributed flagged moves (fallback only). Max's ruling d2011 (25 Oct) has unattributed moves disclosed, since d1682's full attribution can't be met. If this fallback is used, the disclosure goes here, bound to
attribution.json(e636bc7f…). It covers the 948 of 1,092 flagged comparisons (712 poverty, 236 money), FY2026-27 to FY2030-31, and the income tax disposition above (the per-PR trace). Then this item is ticked. The original text follows. d1682 accepts aneeds_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. Before merge, link Max's explicit ruling on accepting these 948 despite d1682's attribution condition, or a coordinator decision with explicit delegated authority or Max's ratification. Identify the exact receipt and binding, accepted metrics/years/sizes and limitations, and the disposition of the income-tax diagnostic. If the ruling requires further attribution or investigation, that evidence must be here before this item is ticked.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 the bundle manifest'sdata_releases.ukentry, and puts the result in the merge's audit comment.🤖 Generated with Claude Code