From 8ea0a5ecf8fcddc507da86291b4f81b3321d5dd9 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Mon, 28 Sep 2026 17:53:44 -0400 Subject: [PATCH 1/2] Bump policyengine-uk to 2.102.3 for the FYE 2025 absolute poverty line policyengine-uk 2.102.3 rebases the UK absolute poverty line to HBAI's FYE 2025 reference year (PolicyEngine/policyengine-uk#1889): 431.69 BHC / 373.89 AHC a week at FYE 2025. Certify policyengine-uk-data 1.56.16 for 2.102.3 on the publisher's compatibility claim (HF commit 78788372, evidence in its description), as #491 did for 2.90.2. Regenerate the bundle manifest, TRO sidecars and uv.lock. Update the certified-version test pins and refresh the UK model-surface snapshot; the UK household snapshots are unchanged. Fixes #535 Co-Authored-By: Claude Opus 5.5 --- changelog.d/535.changed.md | 1 + ...-uk-policyengine-uk-data-1.56.16.changed.md | 1 + pyproject.toml | 6 +++--- src/policyengine/data/bundle/manifest.json | 18 +++++++++--------- .../data/bundle/uk.trace.tro.jsonld | 18 +++++++++--------- .../data/bundle/us.trace.tro.jsonld | 4 ++-- .../uk_model_surface.json | 4 ++-- tests/test_models.py | 2 +- tests/test_release_manifests.py | 4 ++-- uv.lock | 16 ++++++++-------- 10 files changed, 38 insertions(+), 36 deletions(-) create mode 100644 changelog.d/535.changed.md create mode 100644 changelog.d/certify-uk-policyengine-uk-data-1.56.16.changed.md diff --git a/changelog.d/535.changed.md b/changelog.d/535.changed.md new file mode 100644 index 00000000..9642e7e6 --- /dev/null +++ b/changelog.d/535.changed.md @@ -0,0 +1 @@ +Bump policyengine-uk to 2.102.3, which rebases the absolute poverty line to HBAI's FYE 2025 reference year (431.69 BHC / 373.89 AHC a week at FYE 2025, as DWP has reported it since March 2026). UK absolute poverty rates rise: in 2026-27 on the certified enhanced FRS, by about 4 points overall and about 7 points for children after housing costs. The bump also brings every policyengine-uk change since 2.90.2, including relative poverty measured on the median over individuals (policyengine-uk#1865). diff --git a/changelog.d/certify-uk-policyengine-uk-data-1.56.16.changed.md b/changelog.d/certify-uk-policyengine-uk-data-1.56.16.changed.md new file mode 100644 index 00000000..7301b7aa --- /dev/null +++ b/changelog.d/certify-uk-policyengine-uk-data-1.56.16.changed.md @@ -0,0 +1 @@ +Certify the UK populace data release `policyengine-uk-data-1.56.16` (enhanced_frs_2024_25, policyengine-uk 2.102.3) into the PolicyEngine bundle manifest. diff --git a/pyproject.toml b/pyproject.toml index 20f856fc..800b3c23 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -42,12 +42,12 @@ graph = [ models = [ "policyengine-core==3.32.5", "policyengine-us==2.2.1", - "policyengine-uk==2.90.2", + "policyengine-uk==2.102.3", "spm-calculator==1.0.0", ] uk = [ "policyengine-core==3.32.5", - "policyengine-uk==2.90.2", + "policyengine-uk==2.102.3", ] us = [ "policyengine-core==3.32.5", @@ -71,7 +71,7 @@ dev = [ "hypothesis>=6.100.0", "policyengine-core==3.32.5", "policyengine-us==2.2.1", - "policyengine-uk==2.90.2", + "policyengine-uk==2.102.3", "spm-calculator==1.0.0", ] diff --git a/src/policyengine/data/bundle/manifest.json b/src/policyengine/data/bundle/manifest.json index 87bfbaf6..7db81cb1 100644 --- a/src/policyengine/data/bundle/manifest.json +++ b/src/policyengine/data/bundle/manifest.json @@ -22,7 +22,7 @@ "built_with_model_git_sha": "12a1e028afeef08d8b2d74ee03fd9de3a78b2dd3", "built_with_model_version": "2.89.2", "certified_by": "policyengine.py bundle certification", - "certified_for_model_version": "2.90.2", + "certified_for_model_version": "2.102.3", "compatibility_basis": "legacy_compatible_model_package", "data_build_fingerprint": "sha256:6bfff835b504094c05342d2b4d770d2d94c8c1adcb15c4468931f53b21a89ea9", "data_build_id": "policyengine-uk-data-1.56.16" @@ -41,7 +41,7 @@ "data_package": { "name": "policyengine-uk-data", "release_manifest_path": "releases/1.56.16/release_manifest.json", - "release_manifest_revision": "2966541fca275ab5ccb6cfb659b010b1db37ad49", + "release_manifest_revision": "78788372fec47fc8df835bd32307ef61eaed83c2", "repo_id": "policyengine/policyengine-uk-data-private", "repo_type": "model", "version": "1.56.16" @@ -95,9 +95,9 @@ "default_dataset_uri": "hf://policyengine/policyengine-uk-data-private/enhanced_frs_2024_25.h5@1.56.16", "model_package": { "name": "policyengine-uk", - "sha256": "f100ef97e20b29b84138078f1dbc5b83f8857e6bc74b745fc6abef7ea1eeadf2", - "version": "2.90.2", - "wheel_url": "https://files.pythonhosted.org/packages/ec/da/658bff2df6094bd7bf2b0f561ff60fd41508adbd0a3af29b4553c83bc678/policyengine_uk-2.90.2-py3-none-any.whl" + "sha256": "f02a76712a3edf9983c713c1db42e9653a6e974e4ce335dd4b5676bbc2bcd636", + "version": "2.102.3", + "wheel_url": "https://files.pythonhosted.org/packages/37/e6/e8d9069d498f1510a1380f24a78e957902d01f00b10248c146d6710d5b37/policyengine_uk-2.102.3-py3-none-any.whl" }, "policyengine_version": "6.1.2", "region_datasets": { @@ -105,9 +105,9 @@ "path_template": "enhanced_frs_2024_25.h5" } }, - "release_manifest_uri": "https://huggingface.co/policyengine/policyengine-uk-data-private/resolve/2966541fca275ab5ccb6cfb659b010b1db37ad49/releases/1.56.16/release_manifest.json", + "release_manifest_uri": "https://huggingface.co/policyengine/policyengine-uk-data-private/resolve/78788372fec47fc8df835bd32307ef61eaed83c2/releases/1.56.16/release_manifest.json", "schema_version": 1, - "source_manifest_uri": "hf://model/policyengine/policyengine-uk-data-private@2966541fca275ab5ccb6cfb659b010b1db37ad49/releases/1.56.16/release_manifest.json", + "source_manifest_uri": "hf://model/policyengine/policyengine-uk-data-private@78788372fec47fc8df835bd32307ef61eaed83c2/releases/1.56.16/release_manifest.json", "version": "policyengine-uk-data-1.56.16" }, "us": { @@ -305,10 +305,10 @@ "policyengine-uk": { "country": "uk", "import_name": "policyengine_uk", - "install_requirement": "policyengine-uk==2.90.2", + "install_requirement": "policyengine-uk==2.102.3", "name": "policyengine-uk", "role": "country_model", - "version": "2.90.2" + "version": "2.102.3" }, "policyengine-us": { "country": "us", diff --git a/src/policyengine/data/bundle/uk.trace.tro.jsonld b/src/policyengine/data/bundle/uk.trace.tro.jsonld index d35f658c..32ebdd3c 100644 --- a/src/policyengine/data/bundle/uk.trace.tro.jsonld +++ b/src/policyengine/data/bundle/uk.trace.tro.jsonld @@ -45,7 +45,7 @@ "trov:hasArtifact": { "@id": "composition/1/artifact/data_release_manifest" }, - "trov:hasLocation": "https://huggingface.co/policyengine/policyengine-uk-data-private/resolve/2966541fca275ab5ccb6cfb659b010b1db37ad49/releases/1.56.16/release_manifest.json" + "trov:hasLocation": "https://huggingface.co/policyengine/policyengine-uk-data-private/resolve/78788372fec47fc8df835bd32307ef61eaed83c2/releases/1.56.16/release_manifest.json" }, { "@id": "arrangement/1/location/dataset", @@ -61,7 +61,7 @@ "trov:hasArtifact": { "@id": "composition/1/artifact/model_wheel" }, - "trov:hasLocation": "https://files.pythonhosted.org/packages/ec/da/658bff2df6094bd7bf2b0f561ff60fd41508adbd0a3af29b4553c83bc678/policyengine_uk-2.90.2-py3-none-any.whl" + "trov:hasLocation": "https://files.pythonhosted.org/packages/37/e6/e8d9069d498f1510a1380f24a78e957902d01f00b10248c146d6710d5b37/policyengine_uk-2.102.3-py3-none-any.whl" } ] } @@ -75,14 +75,14 @@ "@type": "trov:ResearchArtifact", "schema:name": "policyengine.py bundle manifest for uk", "trov:mimeType": "application/json", - "trov:sha256": "d7e6308efd9e711f238a4d4a3aa8bc07e0962f3f4c9596e9ad6490ff5c63e45a" + "trov:sha256": "330df26dd0b1b98cf70871b5cf35de1cbe71e42905f07fd1b3d1b2495bbce121" }, { "@id": "composition/1/artifact/data_release_manifest", "@type": "trov:ResearchArtifact", "schema:name": "policyengine-uk-data release manifest 1.56.16", "trov:mimeType": "application/json", - "trov:sha256": "9bfccac472d74b044596205ee153b0c81fcd8d93e84f5820c7081e30f2cab0c5" + "trov:sha256": "cb61e3d897fbfa0cc079edc140aebc8947b1a685f581a420de91170ce2686155" }, { "@id": "composition/1/artifact/dataset", @@ -94,15 +94,15 @@ { "@id": "composition/1/artifact/model_wheel", "@type": "trov:ResearchArtifact", - "schema:name": "policyengine-uk==2.90.2 wheel", + "schema:name": "policyengine-uk==2.102.3 wheel", "trov:mimeType": "application/zip", - "trov:sha256": "f100ef97e20b29b84138078f1dbc5b83f8857e6bc74b745fc6abef7ea1eeadf2" + "trov:sha256": "f02a76712a3edf9983c713c1db42e9653a6e974e4ce335dd4b5676bbc2bcd636" } ], "trov:hasFingerprint": { "@id": "composition/1/fingerprint", "@type": "trov:CompositionFingerprint", - "trov:sha256": "d79d22d81bd1d48bfaf836ab3c03ba79721e77594b9695929cb163b872f00373" + "trov:sha256": "5bd332aeeddba294dbfae7c3640cc6dbee25a022ec5766876b3f706818ca1415" } }, "trov:hasPerformance": { @@ -111,12 +111,12 @@ "pe:builtWithModelGitSha": "12a1e028afeef08d8b2d74ee03fd9de3a78b2dd3", "pe:builtWithModelVersion": "2.89.2", "pe:certifiedBy": "policyengine.py bundle certification", - "pe:certifiedForModelVersion": "2.90.2", + "pe:certifiedForModelVersion": "2.102.3", "pe:compatibilityBasis": "legacy_compatible_model_package", "pe:dataBuildFingerprint": "sha256:6bfff835b504094c05342d2b4d770d2d94c8c1adcb15c4468931f53b21a89ea9", "pe:dataBuildId": "policyengine-uk-data-1.56.16", "pe:emittedIn": "repository-bundle", - "rdfs:comment": "Certification of build policyengine-uk-data-1.56.16 for policyengine-uk 2.90.2.", + "rdfs:comment": "Certification of build policyengine-uk-data-1.56.16 for policyengine-uk 2.102.3.", "trov:accessedArrangement": { "@id": "arrangement/1" }, diff --git a/src/policyengine/data/bundle/us.trace.tro.jsonld b/src/policyengine/data/bundle/us.trace.tro.jsonld index f28abb5d..55c0eab4 100644 --- a/src/policyengine/data/bundle/us.trace.tro.jsonld +++ b/src/policyengine/data/bundle/us.trace.tro.jsonld @@ -74,7 +74,7 @@ "@type": "trov:ResearchArtifact", "schema:name": "policyengine.py bundle manifest for us", "trov:mimeType": "application/json", - "trov:sha256": "d7e6308efd9e711f238a4d4a3aa8bc07e0962f3f4c9596e9ad6490ff5c63e45a" + "trov:sha256": "330df26dd0b1b98cf70871b5cf35de1cbe71e42905f07fd1b3d1b2495bbce121" }, { "@id": "composition/1/artifact/data_release_manifest", @@ -101,7 +101,7 @@ "trov:hasFingerprint": { "@id": "composition/1/fingerprint", "@type": "trov:CompositionFingerprint", - "trov:sha256": "75052afc5a871ead813d47d3a5dd61b7085e963a164e7047870e705919420192" + "trov:sha256": "ccffcc3565d3989d61421729259834e0ff3c990151e533d306a5bce361fb9a60" } }, "trov:hasPerformance": { diff --git a/tests/fixtures/household_calculator_snapshots/uk_model_surface.json b/tests/fixtures/household_calculator_snapshots/uk_model_surface.json index 80334585..dd10f62d 100644 --- a/tests/fixtures/household_calculator_snapshots/uk_model_surface.json +++ b/tests/fixtures/household_calculator_snapshots/uk_model_surface.json @@ -5,7 +5,7 @@ "has_income_tax": true, "has_region_registry": true, "model_package_name": "policyengine-uk", - "num_parameters_bucketed_100s": 23, - "num_variables_bucketed_100s": 8, + "num_parameters_bucketed_100s": 26, + "num_variables_bucketed_100s": 9, "region_registry_country": "uk" } diff --git a/tests/test_models.py b/tests/test_models.py index e9c3e5eb..ea799390 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -43,7 +43,7 @@ def test_has_release_manifest_metadata(self): assert uk_latest.release_manifest is not None assert uk_latest.release_manifest.country_id == "uk" assert uk_latest.model_package.name == "policyengine-uk" - assert uk_latest.model_package.version == "2.90.2" + assert uk_latest.model_package.version == "2.102.3" assert uk_latest.data_package.name == "policyengine-uk-data" assert uk_latest.data_package.version == "1.56.16" assert ( diff --git a/tests/test_release_manifests.py b/tests/test_release_manifests.py index f1c75d17..485cc1d0 100644 --- a/tests/test_release_manifests.py +++ b/tests/test_release_manifests.py @@ -72,11 +72,11 @@ "hf://policyengine/populace-us/populace_us_2024_acs_local.h5" f"@{US_LOCAL_AREA_RELEASE_ID}" ) -UK_MODEL_VERSION = "2.90.2" +UK_MODEL_VERSION = "2.102.3" UK_BUILT_WITH_MODEL_VERSION = "2.89.2" UK_DATA_RELEASE_VERSION = "1.56.16" UK_DATA_RELEASE_ID = "policyengine-uk-data-1.56.16" -UK_DATA_RELEASE_REVISION = "2966541fca275ab5ccb6cfb659b010b1db37ad49" +UK_DATA_RELEASE_REVISION = "78788372fec47fc8df835bd32307ef61eaed83c2" UK_DATA_RELEASE_PATH = "releases/1.56.16/release_manifest.json" # The prior certified default, kept resolvable via dataset_overlays. UK_POPULACE_RELEASE_ID = "populace-uk-2023-dd68c73-4aa4b14-20260619T023711Z" diff --git a/uv.lock b/uv.lock index b353ba9f..7956b450 100644 --- a/uv.lock +++ b/uv.lock @@ -197,7 +197,7 @@ name = "cffi" version = "2.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pycparser" }, + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } wheels = [ @@ -1767,7 +1767,7 @@ name = "pexpect" version = "4.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "ptyprocess" }, + { name = "ptyprocess", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } wheels = [ @@ -1884,9 +1884,9 @@ requires-dist = [ { name = "policyengine-core", marker = "extra == 'models'", specifier = "==3.32.5" }, { name = "policyengine-core", marker = "extra == 'uk'", specifier = "==3.32.5" }, { name = "policyengine-core", marker = "extra == 'us'", specifier = "==3.32.5" }, - { name = "policyengine-uk", marker = "extra == 'dev'", specifier = "==2.90.2" }, - { name = "policyengine-uk", marker = "extra == 'models'", specifier = "==2.90.2" }, - { name = "policyengine-uk", marker = "extra == 'uk'", specifier = "==2.90.2" }, + { name = "policyengine-uk", marker = "extra == 'dev'", specifier = "==2.102.3" }, + { name = "policyengine-uk", marker = "extra == 'models'", specifier = "==2.102.3" }, + { name = "policyengine-uk", marker = "extra == 'uk'", specifier = "==2.102.3" }, { name = "policyengine-us", marker = "extra == 'dev'", specifier = "==2.2.1" }, { name = "policyengine-us", marker = "extra == 'models'", specifier = "==2.2.1" }, { name = "policyengine-us", marker = "extra == 'us'", specifier = "==2.2.1" }, @@ -1935,7 +1935,7 @@ wheels = [ [[package]] name = "policyengine-uk" -version = "2.90.2" +version = "2.102.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "microdf-python" }, @@ -1943,9 +1943,9 @@ dependencies = [ { name = "pydantic" }, { name = "tables" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/40/e1/6652fd4ff8806d81b7c846ce2baeef4b9a8457ed380bb0853419d3cf36d9/policyengine_uk-2.90.2.tar.gz", hash = "sha256:c9baeaded1bb6d6f5ca5fcd962b80a198509513737c194aa867b0ef6d13d6a09", size = 1237478, upload-time = "2026-08-13T05:30:05.961Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/49/1db19a439463f1304e93521debf40794f7b3483d37356c6d99c346112d0f/policyengine_uk-2.102.3.tar.gz", hash = "sha256:cdb0900e78818b46fdb79b2a8299bce6c7d6c14692e26cf38367781beea607be", size = 1314347, upload-time = "2026-09-28T19:50:44.714Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/da/658bff2df6094bd7bf2b0f561ff60fd41508adbd0a3af29b4553c83bc678/policyengine_uk-2.90.2-py3-none-any.whl", hash = "sha256:f100ef97e20b29b84138078f1dbc5b83f8857e6bc74b745fc6abef7ea1eeadf2", size = 2034933, upload-time = "2026-08-13T05:30:03.884Z" }, + { url = "https://files.pythonhosted.org/packages/37/e6/e8d9069d498f1510a1380f24a78e957902d01f00b10248c146d6710d5b37/policyengine_uk-2.102.3-py3-none-any.whl", hash = "sha256:f02a76712a3edf9983c713c1db42e9653a6e974e4ce335dd4b5676bbc2bcd636", size = 2189605, upload-time = "2026-09-28T19:50:42.472Z" }, ] [[package]] From e0d105eedb12905ba57620ea41dd4d610cba9678 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Mon, 28 Sep 2026 18:22:07 -0400 Subject: [PATCH 2/2] Use one changelog fragment; keep uv.lock to the policyengine-uk entries Fold the certify-data fragment into 535.changed.md, as the certification skill asks for one fragment named for the issue. Revert two uv.lock marker changes (cffi/pycparser, pexpect/ptyprocess) that came from a newer uv re-encoding upstream metadata, not from this bump. Co-Authored-By: Claude Opus 5.5 --- changelog.d/535.changed.md | 2 +- .../certify-uk-policyengine-uk-data-1.56.16.changed.md | 1 - uv.lock | 4 ++-- 3 files changed, 3 insertions(+), 4 deletions(-) delete mode 100644 changelog.d/certify-uk-policyengine-uk-data-1.56.16.changed.md diff --git a/changelog.d/535.changed.md b/changelog.d/535.changed.md index 9642e7e6..f5e36998 100644 --- a/changelog.d/535.changed.md +++ b/changelog.d/535.changed.md @@ -1 +1 @@ -Bump policyengine-uk to 2.102.3, which rebases the absolute poverty line to HBAI's FYE 2025 reference year (431.69 BHC / 373.89 AHC a week at FYE 2025, as DWP has reported it since March 2026). UK absolute poverty rates rise: in 2026-27 on the certified enhanced FRS, by about 4 points overall and about 7 points for children after housing costs. The bump also brings every policyengine-uk change since 2.90.2, including relative poverty measured on the median over individuals (policyengine-uk#1865). +Bump policyengine-uk to 2.102.3, which rebases the absolute poverty line to HBAI's FYE 2025 reference year (431.69 BHC / 373.89 AHC a week at FYE 2025, as DWP has reported it since March 2026), and certify the UK data release `policyengine-uk-data-1.56.16` (enhanced_frs_2024_25) for it on the publisher's compatibility claim. UK absolute poverty rates rise: in 2026-27 on the certified enhanced FRS, by about 4 points overall and about 7 points for children after housing costs. The bump also brings every policyengine-uk change since 2.90.2, including relative poverty measured on the median over individuals (policyengine-uk#1865). diff --git a/changelog.d/certify-uk-policyengine-uk-data-1.56.16.changed.md b/changelog.d/certify-uk-policyengine-uk-data-1.56.16.changed.md deleted file mode 100644 index 7301b7aa..00000000 --- a/changelog.d/certify-uk-policyengine-uk-data-1.56.16.changed.md +++ /dev/null @@ -1 +0,0 @@ -Certify the UK populace data release `policyengine-uk-data-1.56.16` (enhanced_frs_2024_25, policyengine-uk 2.102.3) into the PolicyEngine bundle manifest. diff --git a/uv.lock b/uv.lock index 7956b450..1a948765 100644 --- a/uv.lock +++ b/uv.lock @@ -197,7 +197,7 @@ name = "cffi" version = "2.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pycparser", marker = "implementation_name != 'PyPy'" }, + { name = "pycparser" }, ] sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } wheels = [ @@ -1767,7 +1767,7 @@ name = "pexpect" version = "4.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "ptyprocess", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "ptyprocess" }, ] sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } wheels = [