policyengine 4.17.2__tar.gz → 4.17.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. {policyengine-4.17.2 → policyengine-4.17.4}/CHANGELOG.md +14 -0
  2. {policyengine-4.17.2/src/policyengine.egg-info → policyengine-4.17.4}/PKG-INFO +3 -3
  3. {policyengine-4.17.2 → policyengine-4.17.4}/pyproject.toml +3 -3
  4. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/data/release_manifests/uk.json +2 -2
  5. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/data/release_manifests/uk.trace.tro.jsonld +7 -7
  6. policyengine-4.17.4/src/policyengine/data/release_manifests/us.json +65 -0
  7. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/data/release_manifests/us.trace.tro.jsonld +22 -22
  8. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/provenance/certification.py +78 -4
  9. {policyengine-4.17.2 → policyengine-4.17.4/src/policyengine.egg-info}/PKG-INFO +3 -3
  10. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine.egg-info/requires.txt +2 -2
  11. {policyengine-4.17.2 → policyengine-4.17.4}/tests/fixtures/household_calculator_snapshots/us_model_surface.json +2 -2
  12. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_certify_data_release.py +83 -1
  13. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_models.py +2 -2
  14. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_release_manifests.py +9 -19
  15. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_us_regions.py +10 -25
  16. {policyengine-4.17.2 → policyengine-4.17.4}/uv.lock +6 -6
  17. policyengine-4.17.2/src/policyengine/data/release_manifests/us.json +0 -3477
  18. {policyengine-4.17.2 → policyengine-4.17.4}/.claude/policyengine-guide.md +0 -0
  19. {policyengine-4.17.2 → policyengine-4.17.4}/.claude/quick-reference.md +0 -0
  20. {policyengine-4.17.2 → policyengine-4.17.4}/.github/CONTRIBUTING.md +0 -0
  21. {policyengine-4.17.2 → policyengine-4.17.4}/.github/bump_version.py +0 -0
  22. {policyengine-4.17.2 → policyengine-4.17.4}/.github/changelog_template.md +0 -0
  23. {policyengine-4.17.2 → policyengine-4.17.4}/.github/check-changelog.sh +0 -0
  24. {policyengine-4.17.2 → policyengine-4.17.4}/.github/copilot-instructions.md +0 -0
  25. {policyengine-4.17.2 → policyengine-4.17.4}/.github/fetch_version.py +0 -0
  26. {policyengine-4.17.2 → policyengine-4.17.4}/.github/get-changelog-diff.sh +0 -0
  27. {policyengine-4.17.2 → policyengine-4.17.4}/.github/has-functional-changes.sh +0 -0
  28. {policyengine-4.17.2 → policyengine-4.17.4}/.github/is-version-number-acceptable.sh +0 -0
  29. {policyengine-4.17.2 → policyengine-4.17.4}/.github/publish-git-tag.sh +0 -0
  30. {policyengine-4.17.2 → policyengine-4.17.4}/.github/workflows/draft-pdf.yml +0 -0
  31. {policyengine-4.17.2 → policyengine-4.17.4}/.github/workflows/pr_code_changes.yaml +0 -0
  32. {policyengine-4.17.2 → policyengine-4.17.4}/.github/workflows/pr_docs_changes.yaml +0 -0
  33. {policyengine-4.17.2 → policyengine-4.17.4}/.github/workflows/push.yaml +0 -0
  34. {policyengine-4.17.2 → policyengine-4.17.4}/.gitignore +0 -0
  35. {policyengine-4.17.2 → policyengine-4.17.4}/.python-version +0 -0
  36. {policyengine-4.17.2 → policyengine-4.17.4}/AGENTS.md +0 -0
  37. {policyengine-4.17.2 → policyengine-4.17.4}/CITATION.cff +0 -0
  38. {policyengine-4.17.2 → policyengine-4.17.4}/CLAUDE.md +0 -0
  39. {policyengine-4.17.2 → policyengine-4.17.4}/CODE_OF_CONDUCT.md +0 -0
  40. {policyengine-4.17.2 → policyengine-4.17.4}/LICENSE +0 -0
  41. {policyengine-4.17.2 → policyengine-4.17.4}/Makefile +0 -0
  42. {policyengine-4.17.2 → policyengine-4.17.4}/README.md +0 -0
  43. {policyengine-4.17.2 → policyengine-4.17.4}/architecture.png +0 -0
  44. {policyengine-4.17.2 → policyengine-4.17.4}/architecture.svg +0 -0
  45. {policyengine-4.17.2 → policyengine-4.17.4}/changelog.d/.gitkeep +0 -0
  46. {policyengine-4.17.2 → policyengine-4.17.4}/docs/.gitignore +0 -0
  47. {policyengine-4.17.2 → policyengine-4.17.4}/docs/_generator/README.md +0 -0
  48. {policyengine-4.17.2 → policyengine-4.17.4}/docs/_generator/build_reference.py +0 -0
  49. {policyengine-4.17.2 → policyengine-4.17.4}/docs/_quarto.yml +0 -0
  50. {policyengine-4.17.2 → policyengine-4.17.4}/docs/countries.md +0 -0
  51. {policyengine-4.17.2 → policyengine-4.17.4}/docs/data-publishing-design.md +0 -0
  52. {policyengine-4.17.2 → policyengine-4.17.4}/docs/dev.md +0 -0
  53. {policyengine-4.17.2 → policyengine-4.17.4}/docs/engineering/skills/README.md +0 -0
  54. {policyengine-4.17.2 → policyengine-4.17.4}/docs/engineering/skills/data-certification.md +0 -0
  55. {policyengine-4.17.2 → policyengine-4.17.4}/docs/engineering/skills/github-prs.md +0 -0
  56. {policyengine-4.17.2 → policyengine-4.17.4}/docs/engineering/skills/repository-guidance.md +0 -0
  57. {policyengine-4.17.2 → policyengine-4.17.4}/docs/examples.md +0 -0
  58. {policyengine-4.17.2 → policyengine-4.17.4}/docs/getting-started.md +0 -0
  59. {policyengine-4.17.2 → policyengine-4.17.4}/docs/households.md +0 -0
  60. {policyengine-4.17.2 → policyengine-4.17.4}/docs/impact-analysis.md +0 -0
  61. {policyengine-4.17.2 → policyengine-4.17.4}/docs/index.md +0 -0
  62. {policyengine-4.17.2 → policyengine-4.17.4}/docs/methodology/index.md +0 -0
  63. {policyengine-4.17.2 → policyengine-4.17.4}/docs/methodology/model-architecture.md +0 -0
  64. {policyengine-4.17.2 → policyengine-4.17.4}/docs/methodology/us-health-costs.md +0 -0
  65. {policyengine-4.17.2 → policyengine-4.17.4}/docs/microsim.md +0 -0
  66. {policyengine-4.17.2 → policyengine-4.17.4}/docs/outputs.md +0 -0
  67. {policyengine-4.17.2 → policyengine-4.17.4}/docs/programs/index.md +0 -0
  68. {policyengine-4.17.2 → policyengine-4.17.4}/docs/programs/us-chip.md +0 -0
  69. {policyengine-4.17.2 → policyengine-4.17.4}/docs/reference/index.md +0 -0
  70. {policyengine-4.17.2 → policyengine-4.17.4}/docs/reforms.md +0 -0
  71. {policyengine-4.17.2 → policyengine-4.17.4}/docs/regions.md +0 -0
  72. {policyengine-4.17.2 → policyengine-4.17.4}/docs/release-bundles.md +0 -0
  73. {policyengine-4.17.2 → policyengine-4.17.4}/docs/run-records.md +0 -0
  74. {policyengine-4.17.2 → policyengine-4.17.4}/docs/trace-case-study.md +0 -0
  75. {policyengine-4.17.2 → policyengine-4.17.4}/docs/visualisation.md +0 -0
  76. {policyengine-4.17.2 → policyengine-4.17.4}/examples/employment_income_variation_uk.py +0 -0
  77. {policyengine-4.17.2 → policyengine-4.17.4}/examples/employment_income_variation_us.py +0 -0
  78. {policyengine-4.17.2 → policyengine-4.17.4}/examples/household_impact_example.py +0 -0
  79. {policyengine-4.17.2 → policyengine-4.17.4}/examples/income_bands_uk.py +0 -0
  80. {policyengine-4.17.2 → policyengine-4.17.4}/examples/income_distribution_us.py +0 -0
  81. {policyengine-4.17.2 → policyengine-4.17.4}/examples/paper_repro_uk.py +0 -0
  82. {policyengine-4.17.2 → policyengine-4.17.4}/examples/policy_change_uk.py +0 -0
  83. {policyengine-4.17.2 → policyengine-4.17.4}/examples/speedtest_us_simulation.py +0 -0
  84. {policyengine-4.17.2 → policyengine-4.17.4}/examples/us_budgetary_impact.py +0 -0
  85. {policyengine-4.17.2 → policyengine-4.17.4}/paper-preview.html +0 -0
  86. {policyengine-4.17.2 → policyengine-4.17.4}/paper.bib +0 -0
  87. {policyengine-4.17.2 → policyengine-4.17.4}/paper.md +0 -0
  88. {policyengine-4.17.2 → policyengine-4.17.4}/scripts/certify_data_release.py +0 -0
  89. {policyengine-4.17.2 → policyengine-4.17.4}/scripts/check_data_staleness.py +0 -0
  90. {policyengine-4.17.2 → policyengine-4.17.4}/scripts/generate_trace_tros.py +0 -0
  91. {policyengine-4.17.2 → policyengine-4.17.4}/scripts/refresh_release_bundle.py +0 -0
  92. {policyengine-4.17.2 → policyengine-4.17.4}/setup.cfg +0 -0
  93. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/__init__.py +0 -0
  94. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/cli.py +0 -0
  95. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/core/__init__.py +0 -0
  96. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/core/cache.py +0 -0
  97. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/core/dataset.py +0 -0
  98. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/core/dynamic.py +0 -0
  99. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/core/output.py +0 -0
  100. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/core/parameter.py +0 -0
  101. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/core/parameter_node.py +0 -0
  102. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/core/parameter_value.py +0 -0
  103. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/core/policy.py +0 -0
  104. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/core/region.py +0 -0
  105. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/core/run_record.py +0 -0
  106. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/core/scoping_strategy.py +0 -0
  107. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/core/simulation.py +0 -0
  108. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/core/tax_benefit_model.py +0 -0
  109. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/core/tax_benefit_model_version.py +0 -0
  110. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/core/variable.py +0 -0
  111. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/countries/__init__.py +0 -0
  112. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/countries/uk/__init__.py +0 -0
  113. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/countries/uk/regions.py +0 -0
  114. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/countries/us/__init__.py +0 -0
  115. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/countries/us/data/__init__.py +0 -0
  116. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/countries/us/data/districts.py +0 -0
  117. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/countries/us/data/places.py +0 -0
  118. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/countries/us/data/states.py +0 -0
  119. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/countries/us/regions.py +0 -0
  120. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/data/__init__.py +0 -0
  121. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/data/schemas/trace_tro.schema.json +0 -0
  122. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/data/uk_geography_assets.py +0 -0
  123. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/derivations/__init__.py +0 -0
  124. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/derivations/narrate.py +0 -0
  125. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/derivations/trace.py +0 -0
  126. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/graph/__init__.py +0 -0
  127. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/graph/extractor.py +0 -0
  128. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/graph/graph.py +0 -0
  129. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/outputs/__init__.py +0 -0
  130. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/outputs/aggregate.py +0 -0
  131. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/outputs/change_aggregate.py +0 -0
  132. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/outputs/cliff_impact.py +0 -0
  133. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/outputs/congressional_district_impact.py +0 -0
  134. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/outputs/constituency_impact.py +0 -0
  135. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/outputs/decile_impact.py +0 -0
  136. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/outputs/extra_variables.py +0 -0
  137. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/outputs/inequality.py +0 -0
  138. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/outputs/intra_decile_impact.py +0 -0
  139. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/outputs/labor_supply_response.py +0 -0
  140. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/outputs/local_authority_impact.py +0 -0
  141. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/outputs/poverty.py +0 -0
  142. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/outputs/program_statistics.py +0 -0
  143. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/outputs/uk_geography_assets.py +0 -0
  144. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/provenance/__init__.py +0 -0
  145. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/provenance/bundle.py +0 -0
  146. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/provenance/dataset_sources.py +0 -0
  147. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/provenance/manifest.py +0 -0
  148. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/provenance/pyproject_pins.py +0 -0
  149. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/provenance/trace.py +0 -0
  150. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/provenance/verify.py +0 -0
  151. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/results/__init__.py +0 -0
  152. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/results/schema.py +0 -0
  153. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/results/trace_tro.py +0 -0
  154. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/results/tracking.py +0 -0
  155. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/tax_benefit_models/common/__init__.py +0 -0
  156. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/tax_benefit_models/common/extra_variables.py +0 -0
  157. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/tax_benefit_models/common/household.py +0 -0
  158. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/tax_benefit_models/common/model_version.py +0 -0
  159. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/tax_benefit_models/common/reform.py +0 -0
  160. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/tax_benefit_models/common/result.py +0 -0
  161. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/tax_benefit_models/uk/__init__.py +0 -0
  162. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/tax_benefit_models/uk/analysis.py +0 -0
  163. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/tax_benefit_models/uk/datasets.py +0 -0
  164. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/tax_benefit_models/uk/household.py +0 -0
  165. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/tax_benefit_models/uk/model.py +0 -0
  166. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/tax_benefit_models/us/__init__.py +0 -0
  167. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/tax_benefit_models/us/analysis.py +0 -0
  168. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/tax_benefit_models/us/datasets.py +0 -0
  169. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/tax_benefit_models/us/household.py +0 -0
  170. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/tax_benefit_models/us/model.py +0 -0
  171. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/utils/__init__.py +0 -0
  172. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/utils/data/__init__.py +0 -0
  173. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/utils/data/caching_google_storage_client.py +0 -0
  174. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/utils/data/version_aware_storage_client.py +0 -0
  175. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/utils/dates.py +0 -0
  176. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/utils/design.py +0 -0
  177. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/utils/entity_utils.py +0 -0
  178. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/utils/errors.py +0 -0
  179. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/utils/google_cloud_bucket.py +0 -0
  180. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/utils/household_validation.py +0 -0
  181. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/utils/parameter_labels.py +0 -0
  182. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/utils/parametric_reforms.py +0 -0
  183. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/utils/plotting.py +0 -0
  184. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine.egg-info/SOURCES.txt +0 -0
  185. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine.egg-info/dependency_links.txt +0 -0
  186. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine.egg-info/entry_points.txt +0 -0
  187. {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine.egg-info/top_level.txt +0 -0
  188. {policyengine-4.17.2 → policyengine-4.17.4}/tests/__init__.py +0 -0
  189. {policyengine-4.17.2 → policyengine-4.17.4}/tests/conftest.py +0 -0
  190. {policyengine-4.17.2 → policyengine-4.17.4}/tests/fixtures/__init__.py +0 -0
  191. {policyengine-4.17.2 → policyengine-4.17.4}/tests/fixtures/filtering_fixtures.py +0 -0
  192. {policyengine-4.17.2 → policyengine-4.17.4}/tests/fixtures/household_calculator_snapshots/uk_couple_two_kids.json +0 -0
  193. {policyengine-4.17.2 → policyengine-4.17.4}/tests/fixtures/household_calculator_snapshots/uk_model_surface.json +0 -0
  194. {policyengine-4.17.2 → policyengine-4.17.4}/tests/fixtures/household_calculator_snapshots/uk_single_adult_employment_income.json +0 -0
  195. {policyengine-4.17.2 → policyengine-4.17.4}/tests/fixtures/household_calculator_snapshots/uk_single_adult_no_income.json +0 -0
  196. {policyengine-4.17.2 → policyengine-4.17.4}/tests/fixtures/household_calculator_snapshots/uk_single_parent_one_child.json +0 -0
  197. {policyengine-4.17.2 → policyengine-4.17.4}/tests/fixtures/household_calculator_snapshots/us_married_two_kids_high_income.json +0 -0
  198. {policyengine-4.17.2 → policyengine-4.17.4}/tests/fixtures/household_calculator_snapshots/us_single_adult_employment_income.json +0 -0
  199. {policyengine-4.17.2 → policyengine-4.17.4}/tests/fixtures/household_calculator_snapshots/us_single_adult_no_income.json +0 -0
  200. {policyengine-4.17.2 → policyengine-4.17.4}/tests/fixtures/household_calculator_snapshots/us_single_parent_one_child.json +0 -0
  201. {policyengine-4.17.2 → policyengine-4.17.4}/tests/fixtures/parameter_labels_fixtures.py +0 -0
  202. {policyengine-4.17.2 → policyengine-4.17.4}/tests/fixtures/parametric_reforms_fixtures.py +0 -0
  203. {policyengine-4.17.2 → policyengine-4.17.4}/tests/fixtures/poverty_by_demographics_fixtures.py +0 -0
  204. {policyengine-4.17.2 → policyengine-4.17.4}/tests/fixtures/region_fixtures.py +0 -0
  205. {policyengine-4.17.2 → policyengine-4.17.4}/tests/fixtures/us_reform_fixtures.py +0 -0
  206. {policyengine-4.17.2 → policyengine-4.17.4}/tests/fixtures/variable_label_fixtures.py +0 -0
  207. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_aggregate.py +0 -0
  208. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_bump_version.py +0 -0
  209. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_bundle_refresh.py +0 -0
  210. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_cache.py +0 -0
  211. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_change_aggregate.py +0 -0
  212. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_cliff_impact.py +0 -0
  213. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_cliff_impact_analysis.py +0 -0
  214. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_congressional_district_impact.py +0 -0
  215. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_constituency_impact.py +0 -0
  216. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_dataset_sources.py +0 -0
  217. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_derivations.py +0 -0
  218. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_dict_reforms_on_simulation.py +0 -0
  219. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_entity_mapping.py +0 -0
  220. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_entity_utils.py +0 -0
  221. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_errors.py +0 -0
  222. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_extra_variables.py +0 -0
  223. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_filtering.py +0 -0
  224. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_graph/__init__.py +0 -0
  225. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_graph/conftest.py +0 -0
  226. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_graph/test_extractor.py +0 -0
  227. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_household_calculator_snapshot.py +0 -0
  228. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_household_impact.py +0 -0
  229. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_inequality.py +0 -0
  230. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_intra_decile_impact.py +0 -0
  231. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_labor_supply_response.py +0 -0
  232. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_local_authority_impact.py +0 -0
  233. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_manifest_version_mismatch.py +0 -0
  234. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_pandas3_compatibility.py +0 -0
  235. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_parameter_labels.py +0 -0
  236. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_parametric_reforms.py +0 -0
  237. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_poverty.py +0 -0
  238. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_poverty_by_demographics.py +0 -0
  239. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_poverty_run.py +0 -0
  240. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_preservation_mirror.py +0 -0
  241. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_pyproject_pins.py +0 -0
  242. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_region.py +0 -0
  243. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_results.py +0 -0
  244. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_run_record.py +0 -0
  245. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_scoping_strategy.py +0 -0
  246. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_small_follow_ups.py +0 -0
  247. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_trace_tro.py +0 -0
  248. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_trace_tro_verify.py +0 -0
  249. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_uk_analysis.py +0 -0
  250. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_uk_geography_assets.py +0 -0
  251. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_uk_program_statistics.py +0 -0
  252. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_uk_regions.py +0 -0
  253. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_us_long_term_datasets.py +0 -0
  254. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_us_microsim_structural_reforms.py +0 -0
  255. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_us_program_statistics.py +0 -0
  256. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_us_reform_application.py +0 -0
  257. {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_variable_labels.py +0 -0
@@ -1,3 +1,17 @@
1
+ ## [4.17.4] - 2026-06-16
2
+
3
+ ### Changed
4
+
5
+ - Certify the US data release `populace-us-2024-f32c2e5-0c38bc47db89-20260616T124451Z` (populace_us_2024, policyengine-us 1.729.0) directly from its data release manifest.
6
+
7
+
8
+ ## [4.17.3] - 2026-06-15
9
+
10
+ ### Changed
11
+
12
+ - Certify the US data release `populace-us-2024-0cdbb27-c239dfe51c11-20260615T201302Z` (populace_us_2024, policyengine-us 1.729.0) directly from its data release manifest.
13
+
14
+
1
15
  ## [4.17.2] - 2026-06-15
2
16
 
3
17
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: policyengine
3
- Version: 4.17.2
3
+ Version: 4.17.4
4
4
  Summary: A package to conduct policy analysis using PolicyEngine tax-benefit models.
5
5
  Author-email: PolicyEngine <hello@policyengine.org>
6
6
  License: GNU AFFERO GENERAL PUBLIC LICENSE
@@ -693,7 +693,7 @@ Requires-Dist: policyengine_core>=3.26.1; extra == "uk"
693
693
  Requires-Dist: policyengine-uk==2.88.20; extra == "uk"
694
694
  Provides-Extra: us
695
695
  Requires-Dist: policyengine_core>=3.27.1; extra == "us"
696
- Requires-Dist: policyengine-us==1.726.0; extra == "us"
696
+ Requires-Dist: policyengine-us==1.729.0; extra == "us"
697
697
  Provides-Extra: dev
698
698
  Requires-Dist: pytest; extra == "dev"
699
699
  Requires-Dist: furo; extra == "dev"
@@ -707,7 +707,7 @@ Requires-Dist: pytest-asyncio>=0.26.0; extra == "dev"
707
707
  Requires-Dist: ruff>=0.9.0; extra == "dev"
708
708
  Requires-Dist: policyengine_core>=3.27.1; extra == "dev"
709
709
  Requires-Dist: policyengine-uk==2.88.20; extra == "dev"
710
- Requires-Dist: policyengine-us==1.726.0; extra == "dev"
710
+ Requires-Dist: policyengine-us==1.729.0; extra == "dev"
711
711
  Requires-Dist: towncrier>=24.8.0; extra == "dev"
712
712
  Requires-Dist: mypy>=1.11.0; extra == "dev"
713
713
  Requires-Dist: pytest-cov>=5.0.0; extra == "dev"
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "policyengine"
7
- version = "4.17.2"
7
+ version = "4.17.4"
8
8
  description = "A package to conduct policy analysis using PolicyEngine tax-benefit models."
9
9
  readme = "README.md"
10
10
  authors = [
@@ -49,7 +49,7 @@ uk = [
49
49
  ]
50
50
  us = [
51
51
  "policyengine_core>=3.27.1",
52
- "policyengine-us==1.726.0",
52
+ "policyengine-us==1.729.0",
53
53
  ]
54
54
  dev = [
55
55
  "pytest",
@@ -64,7 +64,7 @@ dev = [
64
64
  "ruff>=0.9.0",
65
65
  "policyengine_core>=3.27.1",
66
66
  "policyengine-uk==2.88.20",
67
- "policyengine-us==1.726.0",
67
+ "policyengine-us==1.729.0",
68
68
  "towncrier>=24.8.0",
69
69
  "mypy>=1.11.0",
70
70
  "pytest-cov>=5.0.0",
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schema_version": 1,
3
- "bundle_id": "uk-4.17.2",
3
+ "bundle_id": "uk-4.17.4",
4
4
  "country_id": "uk",
5
- "policyengine_version": "4.17.2",
5
+ "policyengine_version": "4.17.4",
6
6
  "model_package": {
7
7
  "name": "policyengine-uk",
8
8
  "version": "2.88.20",
@@ -18,18 +18,18 @@
18
18
  "schema:url": "https://policyengine.org"
19
19
  },
20
20
  "schema:dateCreated": "2026-05-20T20:16:50.641086Z",
21
- "schema:description": "TRACE TRO for certified runtime bundle uk-4.17.2 covering the bundle manifest, the certified dataset artifact, the country model wheel, and the country data release manifest when it is available.",
21
+ "schema:description": "TRACE TRO for certified runtime bundle uk-4.17.4 covering the bundle manifest, the certified dataset artifact, the country model wheel, and the country data release manifest when it is available.",
22
22
  "schema:name": "policyengine uk certified bundle TRO",
23
23
  "trov:createdWith": {
24
24
  "@type": "schema:SoftwareApplication",
25
25
  "schema:name": "policyengine",
26
- "schema:softwareVersion": "4.17.2"
26
+ "schema:softwareVersion": "4.17.4"
27
27
  },
28
28
  "trov:hasArrangement": [
29
29
  {
30
30
  "@id": "arrangement/1",
31
31
  "@type": "trov:ArtifactArrangement",
32
- "rdfs:comment": "Certified arrangement for bundle uk-4.17.2.",
32
+ "rdfs:comment": "Certified arrangement for bundle uk-4.17.4.",
33
33
  "trov:hasArtifactLocation": [
34
34
  {
35
35
  "@id": "arrangement/1/location/bundle_manifest",
@@ -75,7 +75,7 @@
75
75
  "@type": "trov:ResearchArtifact",
76
76
  "schema:name": "policyengine.py bundle manifest for uk",
77
77
  "trov:mimeType": "application/json",
78
- "trov:sha256": "9f284293d897307e4976ca7f8c6bf02c2f25cd82c590e22749874bb84df5db49"
78
+ "trov:sha256": "6eec54f7707fc44dd0b2fc7630cf44897e6d3e18c61a414ea1ea3a4c13678c05"
79
79
  },
80
80
  {
81
81
  "@id": "composition/1/artifact/data_release_manifest",
@@ -102,7 +102,7 @@
102
102
  "trov:hasFingerprint": {
103
103
  "@id": "composition/1/fingerprint",
104
104
  "@type": "trov:CompositionFingerprint",
105
- "trov:sha256": "da5744543b8fde1af9e2a1e6c110a5828a7d51b1e8eb2ee75226d3bb5bf41de6"
105
+ "trov:sha256": "ee58fee6ad2be7dfafd4f612775276551438f0f26a9985f4c390d3a657f88864"
106
106
  }
107
107
  },
108
108
  "trov:hasPerformance": {
@@ -112,8 +112,8 @@
112
112
  "pe:certifiedBy": "policyengine.py bundled manifest",
113
113
  "pe:certifiedForModelVersion": "2.88.20",
114
114
  "pe:ciGitRef": "refs/heads/main",
115
- "pe:ciGitSha": "04d858e4e0c9922c6b3e2a69e7a1935e06b84d6e",
116
- "pe:ciRunUrl": "https://github.com/PolicyEngine/policyengine.py/actions/runs/27522136180",
115
+ "pe:ciGitSha": "e27453d8e0532d2394896570b7a1383f96930c69",
116
+ "pe:ciRunUrl": "https://github.com/PolicyEngine/policyengine.py/actions/runs/27622227038",
117
117
  "pe:compatibilityBasis": "exact_build_model_version",
118
118
  "pe:dataBuildFingerprint": "sha256:77f149725a36055fd89961855230401852b0712d301c6e26d6d16565c6b23809",
119
119
  "pe:dataBuildId": "policyengine-uk-data-1.55.10",
@@ -0,0 +1,65 @@
1
+ {
2
+ "bundle_id": "us-4.17.4",
3
+ "certification": {
4
+ "built_with_model_version": "1.729.0",
5
+ "certified_by": "policyengine.py certification",
6
+ "certified_for_model_version": "1.729.0",
7
+ "compatibility_basis": "built_with_model_package",
8
+ "data_build_id": "populace-us-2024-f32c2e5-0c38bc47db89-20260616T124451Z"
9
+ },
10
+ "certified_data_artifact": {
11
+ "build_id": "populace-us-2024-f32c2e5-0c38bc47db89-20260616T124451Z",
12
+ "data_package": {
13
+ "name": "populace-data",
14
+ "version": "0.1.0"
15
+ },
16
+ "dataset": "populace_us_2024",
17
+ "sha256": "a912aea0ca0c27bb5225516bf859d4937cad0579a2f3971d7306086bc61cbfd7",
18
+ "uri": "hf://policyengine/populace-us/populace_us_2024.h5@populace-us-2024-f32c2e5-0c38bc47db89-20260616T124451Z"
19
+ },
20
+ "country_id": "us",
21
+ "data_package": {
22
+ "name": "populace-data",
23
+ "release_manifest_path": "releases/populace-us-2024-f32c2e5-0c38bc47db89-20260616T124451Z/release_manifest.json",
24
+ "release_manifest_revision": "populace-us-2024-f32c2e5-0c38bc47db89-20260616T124451Z",
25
+ "repo_id": "policyengine/populace-us",
26
+ "repo_type": "dataset",
27
+ "version": "0.1.0"
28
+ },
29
+ "datasets": {
30
+ "calibration_diagnostics": {
31
+ "path": "releases/populace-us-2024-f32c2e5-0c38bc47db89-20260616T124451Z/calibration_diagnostics.json",
32
+ "repo_id": "policyengine/populace-us",
33
+ "revision": "populace-us-2024-f32c2e5-0c38bc47db89-20260616T124451Z",
34
+ "sha256": "4c363816bce3decabb392c6d61002420fd60de85beec30022c3d81684765763b"
35
+ },
36
+ "populace_us_2024": {
37
+ "path": "populace_us_2024.h5",
38
+ "repo_id": "policyengine/populace-us",
39
+ "revision": "populace-us-2024-f32c2e5-0c38bc47db89-20260616T124451Z",
40
+ "sha256": "a912aea0ca0c27bb5225516bf859d4937cad0579a2f3971d7306086bc61cbfd7"
41
+ },
42
+ "populace_us_2024_calibration": {
43
+ "path": "populace_us_2024_calibration.npz",
44
+ "repo_id": "policyengine/populace-us",
45
+ "revision": "populace-us-2024-f32c2e5-0c38bc47db89-20260616T124451Z",
46
+ "sha256": "f701d36341c5d6c39862acef14db074027bdcd289d3523571020c94892f33ccb"
47
+ },
48
+ "us_source_coverage": {
49
+ "path": "releases/populace-us-2024-f32c2e5-0c38bc47db89-20260616T124451Z/us_source_coverage.json",
50
+ "repo_id": "policyengine/populace-us",
51
+ "revision": "populace-us-2024-f32c2e5-0c38bc47db89-20260616T124451Z",
52
+ "sha256": "66c3749e39d324ae892b3482341468b6205d06e69140c19b7c5136f69e0cb0b3"
53
+ }
54
+ },
55
+ "default_dataset": "populace_us_2024",
56
+ "model_package": {
57
+ "name": "policyengine-us",
58
+ "sha256": "8d21d3f7c0e82a9415edffe8ea53939330a63d9c8f6bd334299bddb697cf2c00",
59
+ "version": "1.729.0",
60
+ "wheel_url": "https://files.pythonhosted.org/packages/b9/7d/778f92ae94997b00c3c9ac34b345f6c9333435f905670ee4eeb2f5e19809/policyengine_us-1.729.0-py3-none-any.whl"
61
+ },
62
+ "policyengine_version": "4.17.4",
63
+ "region_datasets": {},
64
+ "schema_version": 1
65
+ }
@@ -17,19 +17,19 @@
17
17
  "schema:name": "PolicyEngine",
18
18
  "schema:url": "https://policyengine.org"
19
19
  },
20
- "schema:dateCreated": "2026-06-11T15:30:09.602534Z",
21
- "schema:description": "TRACE TRO for certified runtime bundle us-4.17.2 covering the bundle manifest, the certified dataset artifact, the country model wheel, and the country data release manifest when it is available.",
20
+ "schema:dateCreated": "2026-06-16T13:15:11.179501+00:00",
21
+ "schema:description": "TRACE TRO for certified runtime bundle us-4.17.4 covering the bundle manifest, the certified dataset artifact, the country model wheel, and the country data release manifest when it is available.",
22
22
  "schema:name": "policyengine us certified bundle TRO",
23
23
  "trov:createdWith": {
24
24
  "@type": "schema:SoftwareApplication",
25
25
  "schema:name": "policyengine",
26
- "schema:softwareVersion": "4.17.2"
26
+ "schema:softwareVersion": "4.17.4"
27
27
  },
28
28
  "trov:hasArrangement": [
29
29
  {
30
30
  "@id": "arrangement/1",
31
31
  "@type": "trov:ArtifactArrangement",
32
- "rdfs:comment": "Certified arrangement for bundle us-4.17.2.",
32
+ "rdfs:comment": "Certified arrangement for bundle us-4.17.4.",
33
33
  "trov:hasArtifactLocation": [
34
34
  {
35
35
  "@id": "arrangement/1/location/bundle_manifest",
@@ -45,7 +45,7 @@
45
45
  "trov:hasArtifact": {
46
46
  "@id": "composition/1/artifact/data_release_manifest"
47
47
  },
48
- "trov:hasLocation": "https://huggingface.co/datasets/policyengine/populace-us/resolve/afa2748b79a139404a1c477e3a7a9ca8729c22ab/releases/populace-us-2024-5da5a95-20260611/release_manifest.json"
48
+ "trov:hasLocation": "https://huggingface.co/datasets/policyengine/populace-us/resolve/populace-us-2024-f32c2e5-0c38bc47db89-20260616T124451Z/releases/populace-us-2024-f32c2e5-0c38bc47db89-20260616T124451Z/release_manifest.json"
49
49
  },
50
50
  {
51
51
  "@id": "arrangement/1/location/dataset",
@@ -53,7 +53,7 @@
53
53
  "trov:hasArtifact": {
54
54
  "@id": "composition/1/artifact/dataset"
55
55
  },
56
- "trov:hasLocation": "https://huggingface.co/policyengine/populace-us/resolve/populace-us-2024-5da5a95-20260611/populace_us_2024.h5"
56
+ "trov:hasLocation": "https://huggingface.co/policyengine/populace-us/resolve/populace-us-2024-f32c2e5-0c38bc47db89-20260616T124451Z/populace_us_2024.h5"
57
57
  },
58
58
  {
59
59
  "@id": "arrangement/1/location/model_wheel",
@@ -61,7 +61,7 @@
61
61
  "trov:hasArtifact": {
62
62
  "@id": "composition/1/artifact/model_wheel"
63
63
  },
64
- "trov:hasLocation": "https://files.pythonhosted.org/packages/27/dd/a6a62280c6289e6da669410e97c90da99e6585c39d4fa6fe81b9910a1e3c/policyengine_us-1.726.0-py3-none-any.whl"
64
+ "trov:hasLocation": "https://files.pythonhosted.org/packages/b9/7d/778f92ae94997b00c3c9ac34b345f6c9333435f905670ee4eeb2f5e19809/policyengine_us-1.729.0-py3-none-any.whl"
65
65
  }
66
66
  ]
67
67
  }
@@ -75,53 +75,53 @@
75
75
  "@type": "trov:ResearchArtifact",
76
76
  "schema:name": "policyengine.py bundle manifest for us",
77
77
  "trov:mimeType": "application/json",
78
- "trov:sha256": "7ffa584ce1d2e0faaa040c2c16d14067d1e04c034ce2fc1098bb89a0aeefab70"
78
+ "trov:sha256": "e9f9542464d4a73257b0a926463676122ac860ec5e217393d5c043bbc3185444"
79
79
  },
80
80
  {
81
81
  "@id": "composition/1/artifact/data_release_manifest",
82
82
  "@type": "trov:ResearchArtifact",
83
83
  "schema:name": "populace-data release manifest 0.1.0",
84
84
  "trov:mimeType": "application/json",
85
- "trov:sha256": "e1870fdef83d0cb5caef38187face74b7335bd6aae56e18d5ab715331e35e744"
85
+ "trov:sha256": "d2506e739a20ab4cdb8a709a93fb9c766e36566028e36b946e5f2f7d6714c061"
86
86
  },
87
87
  {
88
88
  "@id": "composition/1/artifact/dataset",
89
89
  "@type": "trov:ResearchArtifact",
90
90
  "schema:name": "populace_us_2024",
91
91
  "trov:mimeType": "application/x-hdf5",
92
- "trov:sha256": "f32c2e5e9098bc6540724fdd5debf963af495da4c29b3a7a63fb53c2a4bb5a34"
92
+ "trov:sha256": "a912aea0ca0c27bb5225516bf859d4937cad0579a2f3971d7306086bc61cbfd7"
93
93
  },
94
94
  {
95
95
  "@id": "composition/1/artifact/model_wheel",
96
96
  "@type": "trov:ResearchArtifact",
97
- "schema:name": "policyengine-us==1.726.0 wheel",
97
+ "schema:name": "policyengine-us==1.729.0 wheel",
98
98
  "trov:mimeType": "application/zip",
99
- "trov:sha256": "1acc74d1f5431f7872c5500ad93604455aa7b98bcc87399218bc459b393386be"
99
+ "trov:sha256": "8d21d3f7c0e82a9415edffe8ea53939330a63d9c8f6bd334299bddb697cf2c00"
100
100
  }
101
101
  ],
102
102
  "trov:hasFingerprint": {
103
103
  "@id": "composition/1/fingerprint",
104
104
  "@type": "trov:CompositionFingerprint",
105
- "trov:sha256": "036b2a210012d209b7356c54a72774f571301a0a73b6dd702386c29c8e5ecebc"
105
+ "trov:sha256": "9ec19a4d5c7074985ba476ebf0f7dff1eb4edb096a7e69857fa53f3c05bed2b5"
106
106
  }
107
107
  },
108
108
  "trov:hasPerformance": {
109
109
  "@id": "trp/1",
110
110
  "@type": "trov:TransparentResearchPerformance",
111
- "pe:builtWithModelVersion": "1.723.0",
112
- "pe:certifiedBy": "populace-data release manifest",
113
- "pe:certifiedForModelVersion": "1.726.0",
111
+ "pe:builtWithModelVersion": "1.729.0",
112
+ "pe:certifiedBy": "policyengine.py certification",
113
+ "pe:certifiedForModelVersion": "1.729.0",
114
114
  "pe:ciGitRef": "refs/heads/main",
115
- "pe:ciGitSha": "04d858e4e0c9922c6b3e2a69e7a1935e06b84d6e",
116
- "pe:ciRunUrl": "https://github.com/PolicyEngine/policyengine.py/actions/runs/27522136180",
117
- "pe:compatibilityBasis": "legacy_compatible_model_package",
118
- "pe:dataBuildId": "populace-us-2024-5da5a95-20260611",
115
+ "pe:ciGitSha": "e27453d8e0532d2394896570b7a1383f96930c69",
116
+ "pe:ciRunUrl": "https://github.com/PolicyEngine/policyengine.py/actions/runs/27622227038",
117
+ "pe:compatibilityBasis": "built_with_model_package",
118
+ "pe:dataBuildId": "populace-us-2024-f32c2e5-0c38bc47db89-20260616T124451Z",
119
119
  "pe:emittedIn": "github-actions",
120
- "rdfs:comment": "Certification of build populace-us-2024-5da5a95-20260611 for policyengine-us 1.726.0.",
120
+ "rdfs:comment": "Certification of build populace-us-2024-f32c2e5-0c38bc47db89-20260616T124451Z for policyengine-us 1.729.0.",
121
121
  "trov:accessedArrangement": {
122
122
  "@id": "arrangement/1"
123
123
  },
124
- "trov:startedAtTime": "2026-06-11T15:30:09.602534Z",
124
+ "trov:startedAtTime": "2026-06-16T13:15:11.179501+00:00",
125
125
  "trov:wasConductedBy": {
126
126
  "@id": "trs"
127
127
  }
@@ -18,8 +18,9 @@ an assertion the test suite then exercises on the exact pair.
18
18
  country="us",
19
19
  manifest_uri=(
20
20
  "hf://dataset/policyengine/populace-us"
21
- "@populace-us-2024-5da5a95-20260611"
22
- "/releases/populace-us-2024-5da5a95-20260611/release_manifest.json"
21
+ "@populace-us-2024-0cdbb27-c239dfe51c11-20260615T201302Z"
22
+ "/releases/populace-us-2024-0cdbb27-c239dfe51c11-20260615T201302Z"
23
+ "/release_manifest.json"
23
24
  ),
24
25
  )
25
26
  print(result.summary())
@@ -117,13 +118,17 @@ def https_manifest_url(parts: dict) -> str:
117
118
 
118
119
  def https_release_file_url(parts: dict, filename: str) -> str:
119
120
  prefix = "datasets/" if parts["repo_type"] == "dataset" else ""
120
- release_dir = parts["path"].rsplit("/", 1)[0]
121
+ release_dir = release_manifest_dir(parts)
121
122
  return (
122
123
  f"https://huggingface.co/{prefix}{parts['repo_id']}/resolve/"
123
124
  f"{parts['revision']}/{release_dir}/{filename}"
124
125
  )
125
126
 
126
127
 
128
+ def release_manifest_dir(parts: dict) -> str:
129
+ return parts["path"].rsplit("/", 1)[0]
130
+
131
+
127
132
  def fetch_release_manifest(
128
133
  manifest_uri: str,
129
134
  token: Optional[str] = None,
@@ -248,6 +253,51 @@ def head_release_file(
248
253
  return response.status_code == 200
249
254
 
250
255
 
256
+ def artifact_path_for_country_manifest(artifact, uri_parts: dict) -> str:
257
+ path = artifact.path
258
+ release_dir = release_manifest_dir(uri_parts)
259
+ if (
260
+ artifact.kind == "diagnostics"
261
+ and artifact.repo_id == uri_parts["repo_id"]
262
+ and artifact.revision == uri_parts["revision"]
263
+ and not path.startswith(f"{release_dir}/")
264
+ ):
265
+ return f"{release_dir}/{path}"
266
+ return path
267
+
268
+
269
+ def artifact_reference_url(
270
+ reference: dict, uri_parts: dict, prefix: str = "datasets/"
271
+ ) -> str:
272
+ repo_id = reference.get("repo_id") or uri_parts["repo_id"]
273
+ revision = reference.get("revision") or uri_parts["revision"]
274
+ return (
275
+ f"https://huggingface.co/{prefix}{repo_id}/resolve/"
276
+ f"{revision}/{reference['path']}"
277
+ )
278
+
279
+
280
+ def head_artifact_reference(
281
+ reference: dict,
282
+ uri_parts: dict,
283
+ token: Optional[str] = None,
284
+ ) -> bool:
285
+ headers = {"Authorization": f"Bearer {token}"} if token else {}
286
+ for prefix in ("datasets/", ""):
287
+ try:
288
+ response = requests.head(
289
+ artifact_reference_url(reference, uri_parts, prefix=prefix),
290
+ headers=headers,
291
+ timeout=HF_REQUEST_TIMEOUT_SECONDS,
292
+ allow_redirects=True,
293
+ )
294
+ except requests.RequestException:
295
+ continue
296
+ if response.status_code == 200:
297
+ return True
298
+ return False
299
+
300
+
251
301
  def required_supplemental_release_files(
252
302
  country: str,
253
303
  manifest: DataReleaseManifest,
@@ -262,6 +312,18 @@ def required_supplemental_release_files(
262
312
  return ()
263
313
 
264
314
 
315
+ def should_validate_vendored_artifacts(
316
+ country: str,
317
+ manifest: DataReleaseManifest,
318
+ uri_parts: dict,
319
+ ) -> bool:
320
+ return (
321
+ country == "us"
322
+ and manifest.data_package.name == "populace-data"
323
+ and uri_parts["repo_id"] == "policyengine/populace-us"
324
+ )
325
+
326
+
265
327
  def build_country_manifest_payload(
266
328
  *,
267
329
  country: str,
@@ -284,7 +346,10 @@ def build_country_manifest_payload(
284
346
 
285
347
  datasets: dict[str, dict] = {}
286
348
  for name, artifact in manifest.artifacts.items():
287
- payload: dict = {"path": artifact.path, "revision": artifact.revision}
349
+ payload: dict = {
350
+ "path": artifact_path_for_country_manifest(artifact, uri_parts),
351
+ "revision": artifact.revision,
352
+ }
288
353
  if artifact.sha256:
289
354
  payload["sha256"] = artifact.sha256
290
355
  if artifact.repo_id:
@@ -413,6 +478,15 @@ def certify_data_release(
413
478
  model_wheel=model_wheel or {},
414
479
  compatibility_basis=compatibility_basis,
415
480
  )
481
+ if check_artifacts and should_validate_vendored_artifacts(
482
+ country, manifest, uri_parts
483
+ ):
484
+ for name, reference in payload["datasets"].items():
485
+ if not head_artifact_reference(reference, uri_parts, token=token):
486
+ raise CertificationError(
487
+ f"Vendored artifact {name!r} is not reachable at "
488
+ f"{artifact_reference_url(reference, uri_parts)}"
489
+ )
416
490
 
417
491
  if output_dir is None:
418
492
  output_dir = Path(str(files("policyengine"))) / "data" / "release_manifests"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: policyengine
3
- Version: 4.17.2
3
+ Version: 4.17.4
4
4
  Summary: A package to conduct policy analysis using PolicyEngine tax-benefit models.
5
5
  Author-email: PolicyEngine <hello@policyengine.org>
6
6
  License: GNU AFFERO GENERAL PUBLIC LICENSE
@@ -693,7 +693,7 @@ Requires-Dist: policyengine_core>=3.26.1; extra == "uk"
693
693
  Requires-Dist: policyengine-uk==2.88.20; extra == "uk"
694
694
  Provides-Extra: us
695
695
  Requires-Dist: policyengine_core>=3.27.1; extra == "us"
696
- Requires-Dist: policyengine-us==1.726.0; extra == "us"
696
+ Requires-Dist: policyengine-us==1.729.0; extra == "us"
697
697
  Provides-Extra: dev
698
698
  Requires-Dist: pytest; extra == "dev"
699
699
  Requires-Dist: furo; extra == "dev"
@@ -707,7 +707,7 @@ Requires-Dist: pytest-asyncio>=0.26.0; extra == "dev"
707
707
  Requires-Dist: ruff>=0.9.0; extra == "dev"
708
708
  Requires-Dist: policyengine_core>=3.27.1; extra == "dev"
709
709
  Requires-Dist: policyengine-uk==2.88.20; extra == "dev"
710
- Requires-Dist: policyengine-us==1.726.0; extra == "dev"
710
+ Requires-Dist: policyengine-us==1.729.0; extra == "dev"
711
711
  Requires-Dist: towncrier>=24.8.0; extra == "dev"
712
712
  Requires-Dist: mypy>=1.11.0; extra == "dev"
713
713
  Requires-Dist: pytest-cov>=5.0.0; extra == "dev"
@@ -22,7 +22,7 @@ pytest-asyncio>=0.26.0
22
22
  ruff>=0.9.0
23
23
  policyengine_core>=3.27.1
24
24
  policyengine-uk==2.88.20
25
- policyengine-us==1.726.0
25
+ policyengine-us==1.729.0
26
26
  towncrier>=24.8.0
27
27
  mypy>=1.11.0
28
28
  pytest-cov>=5.0.0
@@ -39,4 +39,4 @@ policyengine-uk==2.88.20
39
39
 
40
40
  [us]
41
41
  policyengine_core>=3.27.1
42
- policyengine-us==1.726.0
42
+ policyengine-us==1.729.0
@@ -5,7 +5,7 @@
5
5
  "has_income_tax": true,
6
6
  "has_region_registry": true,
7
7
  "model_package_name": "policyengine-us",
8
- "num_parameters_bucketed_100s": 898,
9
- "num_variables_bucketed_100s": 53,
8
+ "num_parameters_bucketed_100s": 917,
9
+ "num_variables_bucketed_100s": 54,
10
10
  "region_registry_country": "us"
11
11
  }
@@ -55,6 +55,30 @@ def _release_manifest_payload() -> dict:
55
55
  "sha256": "a" * 64,
56
56
  "size_bytes": 1,
57
57
  },
58
+ "populace_us_2024_calibration": {
59
+ "kind": "calibration",
60
+ "path": "populace_us_2024_calibration.npz",
61
+ "repo_id": "policyengine/populace-us",
62
+ "revision": TAG,
63
+ "sha256": "c" * 64,
64
+ "size_bytes": 1,
65
+ },
66
+ "calibration_diagnostics": {
67
+ "kind": "diagnostics",
68
+ "path": "calibration_diagnostics.json",
69
+ "repo_id": "policyengine/populace-us",
70
+ "revision": TAG,
71
+ "sha256": "e" * 64,
72
+ "size_bytes": 1,
73
+ },
74
+ "us_source_coverage": {
75
+ "kind": "diagnostics",
76
+ "path": "us_source_coverage.json",
77
+ "repo_id": "policyengine/populace-us",
78
+ "revision": TAG,
79
+ "sha256": "f" * 64,
80
+ "size_bytes": 1,
81
+ },
58
82
  "states/AK": {
59
83
  "kind": "microdata",
60
84
  "path": "states/AK.h5",
@@ -170,6 +194,21 @@ class TestBuildCountryManifestPayload:
170
194
  "repo_id": "policyengine/policyengine-us-data",
171
195
  }
172
196
 
197
+ def test__given_release_scoped_diagnostics__then_rewrites_paths(self):
198
+ payload = self._payload()
199
+
200
+ assert payload["datasets"]["populace_us_2024"]["path"] == "populace_us_2024.h5"
201
+ assert (
202
+ payload["datasets"]["populace_us_2024_calibration"]["path"]
203
+ == "populace_us_2024_calibration.npz"
204
+ )
205
+ assert payload["datasets"]["calibration_diagnostics"]["path"] == (
206
+ f"releases/{TAG}/calibration_diagnostics.json"
207
+ )
208
+ assert payload["datasets"]["us_source_coverage"]["path"] == (
209
+ f"releases/{TAG}/us_source_coverage.json"
210
+ )
211
+
173
212
  def test__given_region_templates__then_carried_through(self):
174
213
  payload = self._payload()
175
214
 
@@ -211,6 +250,10 @@ class TestCertifyDataRelease:
211
250
  "policyengine.provenance.certification.head_release_file",
212
251
  return_value=True,
213
252
  ),
253
+ patch(
254
+ "policyengine.provenance.certification.head_artifact_reference",
255
+ return_value=True,
256
+ ),
214
257
  patch(
215
258
  "policyengine.provenance.certification.fetch_pypi_wheel_metadata",
216
259
  return_value={"sha256": "d" * 64, "url": "https://example"},
@@ -226,7 +269,7 @@ class TestCertifyDataRelease:
226
269
  written = json.loads((tmp_path / "us.json").read_text())
227
270
  assert written["default_dataset"] == "populace_us_2024"
228
271
  assert written["certification"]["data_build_id"] == TAG
229
- assert result.dataset_count == 2
272
+ assert result.dataset_count == 5
230
273
  assert result.build_id == TAG
231
274
 
232
275
  def test__given_missing_populace_us_source_coverage__then_raises(self, tmp_path):
@@ -270,6 +313,10 @@ class TestCertifyDataRelease:
270
313
  "policyengine.provenance.certification.head_release_file",
271
314
  return_value=True,
272
315
  ),
316
+ patch(
317
+ "policyengine.provenance.certification.head_artifact_reference",
318
+ return_value=True,
319
+ ),
273
320
  pytest.raises(CertificationError, match="not reachable"),
274
321
  ):
275
322
  certify_data_release(
@@ -279,6 +326,41 @@ class TestCertifyDataRelease:
279
326
  output_dir=tmp_path,
280
327
  )
281
328
 
329
+ def test__given_unreachable_vendored_artifact__then_raises(self, tmp_path):
330
+ response = MagicMock()
331
+ response.status_code = 200
332
+ response.content = json.dumps(_release_manifest_payload()).encode()
333
+
334
+ with (
335
+ patch(
336
+ "policyengine.provenance.certification.requests.get",
337
+ return_value=response,
338
+ ),
339
+ patch(
340
+ "policyengine.provenance.certification.head_artifact",
341
+ return_value=True,
342
+ ),
343
+ patch(
344
+ "policyengine.provenance.certification.head_release_file",
345
+ return_value=True,
346
+ ),
347
+ patch(
348
+ "policyengine.provenance.certification.fetch_pypi_wheel_metadata",
349
+ return_value={"sha256": "d" * 64, "url": "https://example"},
350
+ ),
351
+ patch(
352
+ "policyengine.provenance.certification.head_artifact_reference",
353
+ return_value=False,
354
+ ),
355
+ pytest.raises(CertificationError, match="Vendored artifact"),
356
+ ):
357
+ certify_data_release(
358
+ country="us",
359
+ manifest_uri=MANIFEST_URI,
360
+ model_version="1.723.0",
361
+ output_dir=tmp_path,
362
+ )
363
+
282
364
 
283
365
  class TestVendoredSidecarBinding:
284
366
  def test__given_vendored_us_manifest__then_tro_sidecar_binds_it(self):
@@ -113,13 +113,13 @@ class TestUSModel:
113
113
  assert us_latest.release_manifest is not None
114
114
  assert us_latest.release_manifest.country_id == "us"
115
115
  assert us_latest.model_package.name == "policyengine-us"
116
- assert us_latest.model_package.version == "1.726.0"
116
+ assert us_latest.model_package.version == "1.729.0"
117
117
  assert us_latest.data_package.name == "populace-data"
118
118
  assert us_latest.data_package.version == "0.1.0"
119
119
  assert (
120
120
  us_latest.default_dataset_uri
121
121
  == "hf://policyengine/populace-us/populace_us_2024.h5"
122
- "@populace-us-2024-5da5a95-20260611"
122
+ "@populace-us-2024-f32c2e5-0c38bc47db89-20260616T124451Z"
123
123
  )
124
124
 
125
125
  def test_has_hundreds_of_parameters(self):