policyengine 6.2.4__tar.gz → 6.2.5__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 (319) hide show
  1. {policyengine-6.2.4 → policyengine-6.2.5}/CHANGELOG.md +7 -0
  2. {policyengine-6.2.4/src/policyengine.egg-info → policyengine-6.2.5}/PKG-INFO +1 -1
  3. policyengine-6.2.5/docs/engineering/runbooks/acs-local-wic-replacement.md +56 -0
  4. {policyengine-6.2.4 → policyengine-6.2.5}/pyproject.toml +1 -1
  5. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/data/bundle/manifest.json +10 -10
  6. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/data/bundle/uk.trace.tro.jsonld +5 -5
  7. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/data/bundle/us.trace.tro.jsonld +5 -5
  8. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/tax_benefit_models/us/legacy_inputs.py +49 -3
  9. {policyengine-6.2.4 → policyengine-6.2.5/src/policyengine.egg-info}/PKG-INFO +1 -1
  10. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine.egg-info/SOURCES.txt +1 -0
  11. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_us_legacy_inputs.py +185 -0
  12. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_us_legacy_inputs_integration.py +22 -0
  13. {policyengine-6.2.4 → policyengine-6.2.5}/uv.lock +1 -1
  14. {policyengine-6.2.4 → policyengine-6.2.5}/.claude/policyengine-guide.md +0 -0
  15. {policyengine-6.2.4 → policyengine-6.2.5}/.claude/quick-reference.md +0 -0
  16. {policyengine-6.2.4 → policyengine-6.2.5}/.github/CONTRIBUTING.md +0 -0
  17. {policyengine-6.2.4 → policyengine-6.2.5}/.github/bump_version.py +0 -0
  18. {policyengine-6.2.4 → policyengine-6.2.5}/.github/capture-version.sh +0 -0
  19. {policyengine-6.2.4 → policyengine-6.2.5}/.github/changelog_template.md +0 -0
  20. {policyengine-6.2.4 → policyengine-6.2.5}/.github/check-changelog.sh +0 -0
  21. {policyengine-6.2.4 → policyengine-6.2.5}/.github/copilot-instructions.md +0 -0
  22. {policyengine-6.2.4 → policyengine-6.2.5}/.github/dispatch-policyengine-release.sh +0 -0
  23. {policyengine-6.2.4 → policyengine-6.2.5}/.github/fetch_version.py +0 -0
  24. {policyengine-6.2.4 → policyengine-6.2.5}/.github/get-changelog-diff.sh +0 -0
  25. {policyengine-6.2.4 → policyengine-6.2.5}/.github/has-functional-changes.sh +0 -0
  26. {policyengine-6.2.4 → policyengine-6.2.5}/.github/is-version-number-acceptable.sh +0 -0
  27. {policyengine-6.2.4 → policyengine-6.2.5}/.github/publish-git-tag.sh +0 -0
  28. {policyengine-6.2.4 → policyengine-6.2.5}/.github/wait-for-pypi.sh +0 -0
  29. {policyengine-6.2.4 → policyengine-6.2.5}/.github/workflows/draft-pdf.yml +0 -0
  30. {policyengine-6.2.4 → policyengine-6.2.5}/.github/workflows/pr_code_changes.yaml +0 -0
  31. {policyengine-6.2.4 → policyengine-6.2.5}/.github/workflows/pr_docs_changes.yaml +0 -0
  32. {policyengine-6.2.4 → policyengine-6.2.5}/.github/workflows/push.yaml +0 -0
  33. {policyengine-6.2.4 → policyengine-6.2.5}/.gitignore +0 -0
  34. {policyengine-6.2.4 → policyengine-6.2.5}/.python-version +0 -0
  35. {policyengine-6.2.4 → policyengine-6.2.5}/AGENTS.md +0 -0
  36. {policyengine-6.2.4 → policyengine-6.2.5}/CITATION.cff +0 -0
  37. {policyengine-6.2.4 → policyengine-6.2.5}/CLAUDE.md +0 -0
  38. {policyengine-6.2.4 → policyengine-6.2.5}/CODE_OF_CONDUCT.md +0 -0
  39. {policyengine-6.2.4 → policyengine-6.2.5}/CONTRIBUTING.md +0 -0
  40. {policyengine-6.2.4 → policyengine-6.2.5}/LICENSE +0 -0
  41. {policyengine-6.2.4 → policyengine-6.2.5}/Makefile +0 -0
  42. {policyengine-6.2.4 → policyengine-6.2.5}/README.md +0 -0
  43. {policyengine-6.2.4 → policyengine-6.2.5}/architecture.png +0 -0
  44. {policyengine-6.2.4 → policyengine-6.2.5}/architecture.svg +0 -0
  45. {policyengine-6.2.4 → policyengine-6.2.5}/changelog.d/.gitkeep +0 -0
  46. {policyengine-6.2.4 → policyengine-6.2.5}/docs/.gitignore +0 -0
  47. {policyengine-6.2.4 → policyengine-6.2.5}/docs/_generator/README.md +0 -0
  48. {policyengine-6.2.4 → policyengine-6.2.5}/docs/_generator/build_reference.py +0 -0
  49. {policyengine-6.2.4 → policyengine-6.2.5}/docs/_quarto.yml +0 -0
  50. {policyengine-6.2.4 → policyengine-6.2.5}/docs/bundles.md +0 -0
  51. {policyengine-6.2.4 → policyengine-6.2.5}/docs/countries.md +0 -0
  52. {policyengine-6.2.4 → policyengine-6.2.5}/docs/data-publishing-design.md +0 -0
  53. {policyengine-6.2.4 → policyengine-6.2.5}/docs/decile-impact-spec.md +0 -0
  54. {policyengine-6.2.4 → policyengine-6.2.5}/docs/dev.md +0 -0
  55. {policyengine-6.2.4 → policyengine-6.2.5}/docs/engineering/runbooks/build-m-us-populace-certification.md +0 -0
  56. {policyengine-6.2.4 → policyengine-6.2.5}/docs/engineering/runbooks/canonical-spm-development.md +0 -0
  57. {policyengine-6.2.4 → policyengine-6.2.5}/docs/engineering/skills/README.md +0 -0
  58. {policyengine-6.2.4 → policyengine-6.2.5}/docs/engineering/skills/data-certification.md +0 -0
  59. {policyengine-6.2.4 → policyengine-6.2.5}/docs/engineering/skills/github-prs.md +0 -0
  60. {policyengine-6.2.4 → policyengine-6.2.5}/docs/engineering/skills/repository-guidance.md +0 -0
  61. {policyengine-6.2.4 → policyengine-6.2.5}/docs/examples.md +0 -0
  62. {policyengine-6.2.4 → policyengine-6.2.5}/docs/getting-started.md +0 -0
  63. {policyengine-6.2.4 → policyengine-6.2.5}/docs/households.md +0 -0
  64. {policyengine-6.2.4 → policyengine-6.2.5}/docs/impact-analysis.md +0 -0
  65. {policyengine-6.2.4 → policyengine-6.2.5}/docs/index.md +0 -0
  66. {policyengine-6.2.4 → policyengine-6.2.5}/docs/methodology/index.md +0 -0
  67. {policyengine-6.2.4 → policyengine-6.2.5}/docs/methodology/model-architecture.md +0 -0
  68. {policyengine-6.2.4 → policyengine-6.2.5}/docs/methodology/us-health-costs.md +0 -0
  69. {policyengine-6.2.4 → policyengine-6.2.5}/docs/microsim.md +0 -0
  70. {policyengine-6.2.4 → policyengine-6.2.5}/docs/outputs.md +0 -0
  71. {policyengine-6.2.4 → policyengine-6.2.5}/docs/programs/index.md +0 -0
  72. {policyengine-6.2.4 → policyengine-6.2.5}/docs/programs/us-chip.md +0 -0
  73. {policyengine-6.2.4 → policyengine-6.2.5}/docs/reference/index.md +0 -0
  74. {policyengine-6.2.4 → policyengine-6.2.5}/docs/reforms.md +0 -0
  75. {policyengine-6.2.4 → policyengine-6.2.5}/docs/regions.md +0 -0
  76. {policyengine-6.2.4 → policyengine-6.2.5}/docs/release-bundles.md +0 -0
  77. {policyengine-6.2.4 → policyengine-6.2.5}/docs/run-records.md +0 -0
  78. {policyengine-6.2.4 → policyengine-6.2.5}/docs/trace-case-study.md +0 -0
  79. {policyengine-6.2.4 → policyengine-6.2.5}/docs/visualisation.md +0 -0
  80. {policyengine-6.2.4 → policyengine-6.2.5}/examples/belgium_axiom_pilot.py +0 -0
  81. {policyengine-6.2.4 → policyengine-6.2.5}/examples/employment_income_variation_uk.py +0 -0
  82. {policyengine-6.2.4 → policyengine-6.2.5}/examples/employment_income_variation_us.py +0 -0
  83. {policyengine-6.2.4 → policyengine-6.2.5}/examples/household_impact_example.py +0 -0
  84. {policyengine-6.2.4 → policyengine-6.2.5}/examples/income_bands_uk.py +0 -0
  85. {policyengine-6.2.4 → policyengine-6.2.5}/examples/income_distribution_us.py +0 -0
  86. {policyengine-6.2.4 → policyengine-6.2.5}/examples/paper_repro_uk.py +0 -0
  87. {policyengine-6.2.4 → policyengine-6.2.5}/examples/policy_change_uk.py +0 -0
  88. {policyengine-6.2.4 → policyengine-6.2.5}/examples/speedtest_us_simulation.py +0 -0
  89. {policyengine-6.2.4 → policyengine-6.2.5}/examples/us_budgetary_impact.py +0 -0
  90. {policyengine-6.2.4 → policyengine-6.2.5}/paper-preview.html +0 -0
  91. {policyengine-6.2.4 → policyengine-6.2.5}/paper.bib +0 -0
  92. {policyengine-6.2.4 → policyengine-6.2.5}/paper.md +0 -0
  93. {policyengine-6.2.4 → policyengine-6.2.5}/scripts/bundle.py +0 -0
  94. {policyengine-6.2.4 → policyengine-6.2.5}/scripts/certify_data_release.py +0 -0
  95. {policyengine-6.2.4 → policyengine-6.2.5}/scripts/check_data_staleness.py +0 -0
  96. {policyengine-6.2.4 → policyengine-6.2.5}/scripts/check_native_spm_loading.py +0 -0
  97. {policyengine-6.2.4 → policyengine-6.2.5}/scripts/check_release_credentials.py +0 -0
  98. {policyengine-6.2.4 → policyengine-6.2.5}/scripts/export_bundle_release_assets.py +0 -0
  99. {policyengine-6.2.4 → policyengine-6.2.5}/scripts/generate_bundle_artifacts.py +0 -0
  100. {policyengine-6.2.4 → policyengine-6.2.5}/scripts/generate_trace_tros.py +0 -0
  101. {policyengine-6.2.4 → policyengine-6.2.5}/scripts/prepare_package_bundle_update.py +0 -0
  102. {policyengine-6.2.4 → policyengine-6.2.5}/scripts/release_lock.py +0 -0
  103. {policyengine-6.2.4 → policyengine-6.2.5}/scripts/spm_bundle.py +0 -0
  104. {policyengine-6.2.4 → policyengine-6.2.5}/setup.cfg +0 -0
  105. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/__init__.py +0 -0
  106. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/bundle.py +0 -0
  107. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/cli.py +0 -0
  108. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/core/__init__.py +0 -0
  109. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/core/cache.py +0 -0
  110. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/core/dataset.py +0 -0
  111. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/core/dynamic.py +0 -0
  112. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/core/output.py +0 -0
  113. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/core/parameter.py +0 -0
  114. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/core/parameter_node.py +0 -0
  115. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/core/parameter_value.py +0 -0
  116. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/core/policy.py +0 -0
  117. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/core/region.py +0 -0
  118. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/core/run_record.py +0 -0
  119. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/core/scoping_strategy.py +0 -0
  120. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/core/simulation.py +0 -0
  121. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/core/spm.py +0 -0
  122. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/core/tax_benefit_model.py +0 -0
  123. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/core/tax_benefit_model_version.py +0 -0
  124. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/core/variable.py +0 -0
  125. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/countries/__init__.py +0 -0
  126. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/countries/uk/__init__.py +0 -0
  127. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/countries/uk/regions.py +0 -0
  128. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/countries/us/__init__.py +0 -0
  129. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/countries/us/data/__init__.py +0 -0
  130. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/countries/us/data/districts.py +0 -0
  131. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/countries/us/data/places.py +0 -0
  132. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/countries/us/data/states.py +0 -0
  133. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/countries/us/regions.py +0 -0
  134. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/data/__init__.py +0 -0
  135. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/data/schemas/trace_tro.schema.json +0 -0
  136. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/data/uk_geography_assets.py +0 -0
  137. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/derivations/__init__.py +0 -0
  138. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/derivations/narrate.py +0 -0
  139. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/derivations/trace.py +0 -0
  140. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/graph/__init__.py +0 -0
  141. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/graph/extractor.py +0 -0
  142. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/graph/graph.py +0 -0
  143. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/outputs/__init__.py +0 -0
  144. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/outputs/aggregate.py +0 -0
  145. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/outputs/change_aggregate.py +0 -0
  146. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/outputs/cliff_impact.py +0 -0
  147. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/outputs/congressional_district_impact.py +0 -0
  148. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/outputs/constituency_impact.py +0 -0
  149. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/outputs/decile_analysis.py +0 -0
  150. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/outputs/decile_grouping.py +0 -0
  151. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/outputs/decile_impact.py +0 -0
  152. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/outputs/extra_variables.py +0 -0
  153. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/outputs/inequality.py +0 -0
  154. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/outputs/intra_decile_impact.py +0 -0
  155. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/outputs/labor_supply_response.py +0 -0
  156. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/outputs/local_authority_impact.py +0 -0
  157. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/outputs/poverty.py +0 -0
  158. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/outputs/program_statistics.py +0 -0
  159. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/outputs/uk_geography_assets.py +0 -0
  160. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/outputs/uk_geography_impact.py +0 -0
  161. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/provenance/__init__.py +0 -0
  162. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/provenance/bundle_validation.py +0 -0
  163. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/provenance/certification.py +0 -0
  164. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/provenance/dataset_materialization.py +0 -0
  165. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/provenance/manifest.py +0 -0
  166. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/provenance/pyproject_pins.py +0 -0
  167. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/provenance/spm_configuration.py +0 -0
  168. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/provenance/trace.py +0 -0
  169. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/provenance/verify.py +0 -0
  170. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/provenance/zenodo.py +0 -0
  171. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/results/__init__.py +0 -0
  172. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/results/schema.py +0 -0
  173. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/results/trace_tro.py +0 -0
  174. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/results/tracking.py +0 -0
  175. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/tax_benefit_models/be/__init__.py +0 -0
  176. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/tax_benefit_models/be/datasets.py +0 -0
  177. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/tax_benefit_models/be/model.py +0 -0
  178. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/tax_benefit_models/common/__init__.py +0 -0
  179. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/tax_benefit_models/common/axes.py +0 -0
  180. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/tax_benefit_models/common/extra_variables.py +0 -0
  181. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/tax_benefit_models/common/household.py +0 -0
  182. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/tax_benefit_models/common/model_version.py +0 -0
  183. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/tax_benefit_models/common/reform.py +0 -0
  184. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/tax_benefit_models/common/result.py +0 -0
  185. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/tax_benefit_models/uk/__init__.py +0 -0
  186. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/tax_benefit_models/uk/analysis.py +0 -0
  187. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/tax_benefit_models/uk/datasets.py +0 -0
  188. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/tax_benefit_models/uk/household.py +0 -0
  189. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/tax_benefit_models/uk/model.py +0 -0
  190. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/tax_benefit_models/us/__init__.py +0 -0
  191. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/tax_benefit_models/us/analysis.py +0 -0
  192. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/tax_benefit_models/us/datasets.py +0 -0
  193. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/tax_benefit_models/us/household.py +0 -0
  194. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/tax_benefit_models/us/model.py +0 -0
  195. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/tax_benefit_models/us/spm.py +0 -0
  196. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/utils/__init__.py +0 -0
  197. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/utils/dates.py +0 -0
  198. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/utils/design.py +0 -0
  199. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/utils/entity_utils.py +0 -0
  200. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/utils/errors.py +0 -0
  201. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/utils/hashing.py +0 -0
  202. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/utils/household_validation.py +0 -0
  203. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/utils/parameter_labels.py +0 -0
  204. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/utils/parametric_reforms.py +0 -0
  205. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine/utils/plotting.py +0 -0
  206. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine.egg-info/dependency_links.txt +0 -0
  207. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine.egg-info/entry_points.txt +0 -0
  208. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine.egg-info/requires.txt +0 -0
  209. {policyengine-6.2.4 → policyengine-6.2.5}/src/policyengine.egg-info/top_level.txt +0 -0
  210. {policyengine-6.2.4 → policyengine-6.2.5}/tests/__init__.py +0 -0
  211. {policyengine-6.2.4 → policyengine-6.2.5}/tests/conftest.py +0 -0
  212. {policyengine-6.2.4 → policyengine-6.2.5}/tests/fixtures/__init__.py +0 -0
  213. {policyengine-6.2.4 → policyengine-6.2.5}/tests/fixtures/filtering_fixtures.py +0 -0
  214. {policyengine-6.2.4 → policyengine-6.2.5}/tests/fixtures/household_calculator_snapshots/uk_couple_two_kids.json +0 -0
  215. {policyengine-6.2.4 → policyengine-6.2.5}/tests/fixtures/household_calculator_snapshots/uk_model_surface.json +0 -0
  216. {policyengine-6.2.4 → policyengine-6.2.5}/tests/fixtures/household_calculator_snapshots/uk_single_adult_employment_income.json +0 -0
  217. {policyengine-6.2.4 → policyengine-6.2.5}/tests/fixtures/household_calculator_snapshots/uk_single_adult_no_income.json +0 -0
  218. {policyengine-6.2.4 → policyengine-6.2.5}/tests/fixtures/household_calculator_snapshots/uk_single_parent_one_child.json +0 -0
  219. {policyengine-6.2.4 → policyengine-6.2.5}/tests/fixtures/household_calculator_snapshots/us_married_two_kids_high_income.json +0 -0
  220. {policyengine-6.2.4 → policyengine-6.2.5}/tests/fixtures/household_calculator_snapshots/us_model_surface.json +0 -0
  221. {policyengine-6.2.4 → policyengine-6.2.5}/tests/fixtures/household_calculator_snapshots/us_single_adult_employment_income.json +0 -0
  222. {policyengine-6.2.4 → policyengine-6.2.5}/tests/fixtures/household_calculator_snapshots/us_single_adult_no_income.json +0 -0
  223. {policyengine-6.2.4 → policyengine-6.2.5}/tests/fixtures/household_calculator_snapshots/us_single_parent_one_child.json +0 -0
  224. {policyengine-6.2.4 → policyengine-6.2.5}/tests/fixtures/parameter_labels_fixtures.py +0 -0
  225. {policyengine-6.2.4 → policyengine-6.2.5}/tests/fixtures/parametric_reforms_fixtures.py +0 -0
  226. {policyengine-6.2.4 → policyengine-6.2.5}/tests/fixtures/poverty_by_demographics_fixtures.py +0 -0
  227. {policyengine-6.2.4 → policyengine-6.2.5}/tests/fixtures/region_fixtures.py +0 -0
  228. {policyengine-6.2.4 → policyengine-6.2.5}/tests/fixtures/release_tros/README.md +0 -0
  229. {policyengine-6.2.4 → policyengine-6.2.5}/tests/fixtures/release_tros/country-models.lock.toml +0 -0
  230. {policyengine-6.2.4 → policyengine-6.2.5}/tests/fixtures/release_tros/manifest.json +0 -0
  231. {policyengine-6.2.4 → policyengine-6.2.5}/tests/fixtures/release_tros/us-release_manifest.json +0 -0
  232. {policyengine-6.2.4 → policyengine-6.2.5}/tests/fixtures/release_tros/us.trace.tro.jsonld +0 -0
  233. {policyengine-6.2.4 → policyengine-6.2.5}/tests/fixtures/spm_development.py +0 -0
  234. {policyengine-6.2.4 → policyengine-6.2.5}/tests/fixtures/us_reform_fixtures.py +0 -0
  235. {policyengine-6.2.4 → policyengine-6.2.5}/tests/fixtures/variable_label_fixtures.py +0 -0
  236. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_aggregate.py +0 -0
  237. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_be_axiom_pilot.py +0 -0
  238. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_budgetary_impact.py +0 -0
  239. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_bump_version.py +0 -0
  240. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_bundle.py +0 -0
  241. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_bundle_metadata.py +0 -0
  242. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_cache.py +0 -0
  243. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_certify_data_release.py +0 -0
  244. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_change_aggregate.py +0 -0
  245. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_cliff_impact.py +0 -0
  246. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_cliff_impact_analysis.py +0 -0
  247. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_congressional_district_impact.py +0 -0
  248. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_constituency_impact.py +0 -0
  249. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_dataset_materialization.py +0 -0
  250. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_dataset_persistence.py +0 -0
  251. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_dataset_runtime.py +0 -0
  252. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_dataset_source.py +0 -0
  253. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_decile_grouping.py +0 -0
  254. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_derivations.py +0 -0
  255. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_dict_reforms_on_simulation.py +0 -0
  256. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_entity_mapping.py +0 -0
  257. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_entity_utils.py +0 -0
  258. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_entity_utils_characterization.py +0 -0
  259. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_errors.py +0 -0
  260. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_extra_variables.py +0 -0
  261. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_filtering.py +0 -0
  262. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_generate_trace_tros.py +0 -0
  263. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_graph/__init__.py +0 -0
  264. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_graph/conftest.py +0 -0
  265. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_graph/test_extractor.py +0 -0
  266. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_household_calculator_snapshot.py +0 -0
  267. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_household_impact.py +0 -0
  268. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_inequality.py +0 -0
  269. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_intra_decile_impact.py +0 -0
  270. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_labor_supply_response.py +0 -0
  271. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_local_authority_impact.py +0 -0
  272. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_manifest_version_mismatch.py +0 -0
  273. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_models.py +0 -0
  274. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_pandas3_compatibility.py +0 -0
  275. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_parameter_labels.py +0 -0
  276. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_parameter_nodes.py +0 -0
  277. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_parameter_values.py +0 -0
  278. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_parametric_reforms.py +0 -0
  279. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_poverty.py +0 -0
  280. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_poverty_by_demographics.py +0 -0
  281. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_poverty_run.py +0 -0
  282. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_preservation_mirror.py +0 -0
  283. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_program_statistics.py +0 -0
  284. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_pyproject_pins.py +0 -0
  285. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_region.py +0 -0
  286. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_region_group_strategy.py +0 -0
  287. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_release_credentials.py +0 -0
  288. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_release_lock.py +0 -0
  289. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_release_manifests.py +0 -0
  290. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_release_tro_generation.py +0 -0
  291. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_results.py +0 -0
  292. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_run_record.py +0 -0
  293. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_scoping_strategy.py +0 -0
  294. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_small_follow_ups.py +0 -0
  295. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_spm_bundle_bootstrap.py +0 -0
  296. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_spm_bundle_tooling.py +0 -0
  297. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_spm_decile.py +0 -0
  298. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_spm_development_authentication.py +0 -0
  299. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_spm_household.py +0 -0
  300. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_spm_model.py +0 -0
  301. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_spm_selection.py +0 -0
  302. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_spm_selection_schema.py +0 -0
  303. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_trace_tro.py +0 -0
  304. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_trace_tro_verify.py +0 -0
  305. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_uk_analysis.py +0 -0
  306. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_uk_geography_assets.py +0 -0
  307. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_uk_program_statistics.py +0 -0
  308. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_uk_regions.py +0 -0
  309. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_uk_year_file_data_year.py +0 -0
  310. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_us_long_term_datasets.py +0 -0
  311. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_us_microsim_structural_reforms.py +0 -0
  312. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_us_native_alignment.py +0 -0
  313. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_us_native_hdf_weights.py +0 -0
  314. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_us_program_statistics.py +0 -0
  315. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_us_reform_application.py +0 -0
  316. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_us_regions.py +0 -0
  317. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_variable_labels.py +0 -0
  318. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_variable_metadata.py +0 -0
  319. {policyengine-6.2.4 → policyengine-6.2.5}/tests/test_zenodo_mirror.py +0 -0
@@ -1,3 +1,10 @@
1
+ ## [6.2.5] - 2026-10-09
2
+
3
+ ### Fixed
4
+
5
+ - Add opt-in verified US state/year preparation and temporarily assume WIC claiming only for missing participation decisions on identified ACS people, preserving donor decisions and country-model eligibility.
6
+
7
+
1
8
  ## [6.2.4] - 2026-10-09
2
9
 
3
10
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: policyengine
3
- Version: 6.2.4
3
+ Version: 6.2.5
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
@@ -0,0 +1,56 @@
1
+ # Replace the temporary ACS WIC assumption
2
+
3
+ ## Temporary compatibility fix
4
+
5
+ The certified local-area release
6
+ `populace-us-2024-buildo-acs-local-767312d60-20260923T074941Z` stores donor
7
+ participation decisions as `would_claim_wic`, with missing decisions on ACS
8
+ people. The current model consumes the monthly person input
9
+ `takes_up_wic_if_eligible`.
10
+
11
+ The wrapper preserves all valid existing decisions and sets only missing
12
+ decisions on people whose `person_support_channel` is `acs_2024_1yr` to `True`.
13
+ This explicitly assumes that every eligible affected ACS person claims WIC;
14
+ it does not change eligibility. Missing donor decisions, missing identifying
15
+ provenance, and malformed values remain errors. Source H5 files are unchanged.
16
+
17
+ The existing loader applies this before calculation and year preparation,
18
+ including baseline and reform branches. The fix does not add partitioning,
19
+ state/year preparation APIs, new dataset defaults, or deployment behavior.
20
+
21
+ ## Replacement ownership
22
+
23
+ [Microcosm #1154](https://github.com/PolicyEngine/microcosm/issues/1154) tracks
24
+ the code repair, a dataset rebuild and publication by a separate dataset owner,
25
+ certification in this repository, and removal of the exception. Merging the
26
+ [code repair](https://github.com/PolicyEngine/microcosm/pull/1156) does not
27
+ publish a replacement population or complete that issue.
28
+
29
+ The repair generates ACS participation after completing demographic inputs and
30
+ before combining ACS records with donors. It reuses the existing WIC generator,
31
+ preserves donor decisions, writes complete boolean participation inputs, and
32
+ rejects missing decisions. The dataset owner must rebuild the affected outputs
33
+ and satisfy the existing release checks.
34
+
35
+ ## Remove the exception
36
+
37
+ The separate stacked [removal PR #563](https://github.com/PolicyEngine/policyengine.py/pull/563)
38
+ must remain a draft until the replacement dataset has been published and
39
+ certified. Do not invent its revision or hash or relax its failing check.
40
+
41
+ Once the replacement is available:
42
+
43
+ 1. Follow the [US certification runbook](build-m-us-populace-certification.md)
44
+ with its actual immutable regional manifest. Keep national defaults and
45
+ model pins unchanged unless separately approved.
46
+ 2. Verify complete current-name participation on the replacement and record
47
+ its revision and hashes.
48
+ 3. Add the real certification changes to the removal PR and rebase it onto
49
+ `main` after the temporary compatibility fix merges.
50
+ 4. Delete only the ACS missing-value exception. Keep ordinary legacy-name
51
+ mapping while other certified datasets require it.
52
+ 5. Run the focused mapping and country-model integration tests and validate
53
+ preparation against the actual replacement dataset.
54
+
55
+ This fix does not rebuild or publish data, deploy services, or introduce
56
+ environment variables or database changes.
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "policyengine"
7
- version = "6.2.4"
7
+ version = "6.2.5"
8
8
  description = "A package to conduct policy analysis using PolicyEngine tax-benefit models."
9
9
  readme = "README.md"
10
10
  authors = [
@@ -1,10 +1,10 @@
1
1
  {
2
- "bundle_version": "6.2.4",
2
+ "bundle_version": "6.2.5",
3
3
  "citation": {
4
4
  "publisher": "PolicyEngine",
5
- "title": "PolicyEngine bundle 6.2.4",
5
+ "title": "PolicyEngine bundle 6.2.5",
6
6
  "type": "software-bundle",
7
- "version": "6.2.4"
7
+ "version": "6.2.5"
8
8
  },
9
9
  "countries": {
10
10
  "uk": {
@@ -17,7 +17,7 @@
17
17
  "data_releases": {
18
18
  "uk": {
19
19
  "build_id": "policyengine-uk-data-1.56.16",
20
- "bundle_id": "uk-6.2.4",
20
+ "bundle_id": "uk-6.2.5",
21
21
  "certification": {
22
22
  "built_with_model_git_sha": "12a1e028afeef08d8b2d74ee03fd9de3a78b2dd3",
23
23
  "built_with_model_version": "2.89.2",
@@ -99,7 +99,7 @@
99
99
  "version": "2.102.3",
100
100
  "wheel_url": "https://files.pythonhosted.org/packages/37/e6/e8d9069d498f1510a1380f24a78e957902d01f00b10248c146d6710d5b37/policyengine_uk-2.102.3-py3-none-any.whl"
101
101
  },
102
- "policyengine_version": "6.2.4",
102
+ "policyengine_version": "6.2.5",
103
103
  "region_datasets": {
104
104
  "national": {
105
105
  "path_template": "enhanced_frs_2024_25.h5"
@@ -112,7 +112,7 @@
112
112
  },
113
113
  "us": {
114
114
  "build_id": "populace-us-2024-spm-20260915",
115
- "bundle_id": "us-6.2.4",
115
+ "bundle_id": "us-6.2.5",
116
116
  "certification": {
117
117
  "built_with_model_version": "2.2.1",
118
118
  "certified_by": "policyengine.py bundle certification",
@@ -217,7 +217,7 @@
217
217
  "version": "2.2.1",
218
218
  "wheel_url": "https://files.pythonhosted.org/packages/5e/09/86ac3968d2a18e28fce3ba1186fc21728e9f299b96a806d6f204f1e0aaed/policyengine_us-2.2.1-py3-none-any.whl"
219
219
  },
220
- "policyengine_version": "6.2.4",
220
+ "policyengine_version": "6.2.5",
221
221
  "region_datasets": {
222
222
  "congressional_district": {
223
223
  "path_template": "populace_us_2024_acs_local.h5"
@@ -295,10 +295,10 @@
295
295
  "packages": {
296
296
  "policyengine": {
297
297
  "import_name": "policyengine",
298
- "install_requirement": "policyengine==6.2.4",
298
+ "install_requirement": "policyengine==6.2.5",
299
299
  "name": "policyengine",
300
300
  "role": "bundle_carrier",
301
- "version": "6.2.4"
301
+ "version": "6.2.5"
302
302
  },
303
303
  "policyengine-core": {
304
304
  "import_name": "policyengine_core",
@@ -334,6 +334,6 @@
334
334
  "wheel_url": "https://files.pythonhosted.org/packages/19/a0/c484f69a0ebf88a9b9fd0ac28176f8df66550f46714f1b0c5ec0b360824e/spm_calculator-1.0.0-py3-none-any.whl"
335
335
  }
336
336
  },
337
- "policyengine_version": "6.2.4",
337
+ "policyengine_version": "6.2.5",
338
338
  "schema_version": 2
339
339
  }
@@ -18,18 +18,18 @@
18
18
  "schema:url": "https://policyengine.org"
19
19
  },
20
20
  "schema:dateCreated": "2026-08-18T14:20:32.100961Z",
21
- "schema:description": "TRACE TRO for certified runtime bundle uk-6.2.4 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-6.2.5 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": "6.2.4"
26
+ "schema:softwareVersion": "6.2.5"
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-6.2.4.",
32
+ "rdfs:comment": "Certified arrangement for bundle uk-6.2.5.",
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": "4e830a845f54782daed05f1331203c68fa138396025f2da49d34b34ba7ac3c42"
78
+ "trov:sha256": "41db4dcd0a64e37901493ffb2235e159892b4e2cb45224d5f83b696dee9d56ea"
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": "d238f72a1fe43bb3b1c8c92c27eb3bf717f2c00527da1cab6277f65ccf382606"
105
+ "trov:sha256": "2014602b75a33b7be85717d3ee86056dea50d0b7d37f802b89b0372fb7a80546"
106
106
  }
107
107
  },
108
108
  "trov:hasPerformance": {
@@ -17,18 +17,18 @@
17
17
  "schema:name": "PolicyEngine",
18
18
  "schema:url": "https://policyengine.org"
19
19
  },
20
- "schema:description": "TRACE TRO for certified runtime bundle us-6.2.4 covering the bundle manifest, the certified dataset artifact, the country model wheel, and the country data release manifest when it is available.",
20
+ "schema:description": "TRACE TRO for certified runtime bundle us-6.2.5 covering the bundle manifest, the certified dataset artifact, the country model wheel, and the country data release manifest when it is available.",
21
21
  "schema:name": "policyengine us certified bundle TRO",
22
22
  "trov:createdWith": {
23
23
  "@type": "schema:SoftwareApplication",
24
24
  "schema:name": "policyengine",
25
- "schema:softwareVersion": "6.2.4"
25
+ "schema:softwareVersion": "6.2.5"
26
26
  },
27
27
  "trov:hasArrangement": [
28
28
  {
29
29
  "@id": "arrangement/1",
30
30
  "@type": "trov:ArtifactArrangement",
31
- "rdfs:comment": "Certified arrangement for bundle us-6.2.4.",
31
+ "rdfs:comment": "Certified arrangement for bundle us-6.2.5.",
32
32
  "trov:hasArtifactLocation": [
33
33
  {
34
34
  "@id": "arrangement/1/location/bundle_manifest",
@@ -74,7 +74,7 @@
74
74
  "@type": "trov:ResearchArtifact",
75
75
  "schema:name": "policyengine.py bundle manifest for us",
76
76
  "trov:mimeType": "application/json",
77
- "trov:sha256": "4e830a845f54782daed05f1331203c68fa138396025f2da49d34b34ba7ac3c42"
77
+ "trov:sha256": "41db4dcd0a64e37901493ffb2235e159892b4e2cb45224d5f83b696dee9d56ea"
78
78
  },
79
79
  {
80
80
  "@id": "composition/1/artifact/data_release_manifest",
@@ -101,7 +101,7 @@
101
101
  "trov:hasFingerprint": {
102
102
  "@id": "composition/1/fingerprint",
103
103
  "@type": "trov:CompositionFingerprint",
104
- "trov:sha256": "122720c1301231fb4ff791dd2e80120dd7c64633e34aff5583aaac56c34c10bb"
104
+ "trov:sha256": "a6b92e608e8ae897ad3e3f3e2fbbf14eefb50b9a21a2e0fa458b8693c00710cf"
105
105
  }
106
106
  },
107
107
  "trov:hasPerformance": {
@@ -146,8 +146,9 @@ def apply_legacy_input_renames(
146
146
  Every mapped table is checked before anything is set. Its ``{entity}_id``
147
147
  column must list the simulation's entity IDs in the simulation's order,
148
148
  and its stored values must be complete and, for a boolean live input,
149
- boolean. Otherwise this raises ``ValueError`` rather than set misaligned
150
- or invented values.
149
+ boolean. A temporary WIC-only exception assumes claiming for missing
150
+ decisions on explicitly identified ACS people. Missing donor decisions
151
+ and malformed stored values still raise ``ValueError``.
151
152
 
152
153
  Applying the mapping again sets the same values, so it is idempotent.
153
154
 
@@ -165,7 +166,15 @@ def apply_legacy_input_renames(
165
166
  continue
166
167
  context = f"Cannot map stored {legacy!r} onto {live!r} for {year}"
167
168
  _check_order(simulation, table, entity, context)
168
- values = _live_values(table[legacy], variable, context)
169
+ stored = table[legacy]
170
+ if (
171
+ legacy == "would_claim_wic"
172
+ and live == "takes_up_wic_if_eligible"
173
+ and entity == "person"
174
+ and variable.value_type is bool
175
+ ):
176
+ stored = _temporary_acs_wic_values(table, context)
177
+ values = _live_values(stored, variable, context)
169
178
  periods = _periods_of_year(int(year), variable.definition_period, context)
170
179
  planned.append((legacy, live, periods, values))
171
180
 
@@ -347,6 +356,34 @@ def _check_order(simulation, table: pd.DataFrame, entity: str, context: str) ->
347
356
  )
348
357
 
349
358
 
359
+ def _temporary_acs_wic_values(table: pd.DataFrame, context: str) -> pd.Series:
360
+ """Preserve stored decisions; assume claiming only for missing ACS cells."""
361
+ stored = table["would_claim_wic"]
362
+ missing = stored.isna()
363
+ if not missing.any():
364
+ return stored
365
+ channel = "person_support_channel"
366
+ if channel not in table or not (
367
+ table.loc[missing, channel].eq("acs_2024_1yr").fillna(False).all()
368
+ ):
369
+ raise ValueError(
370
+ f"{context}: the stored column has missing values outside "
371
+ "explicitly identified ACS people."
372
+ )
373
+ # TEMPORARY ACS WIC COMPATIBILITY — REMOVE AS SOON AS POSSIBLE.
374
+ # Replacement dataset: https://github.com/PolicyEngine/microcosm/issues/1154
375
+ # Prepared removal: https://github.com/PolicyEngine/policyengine.py/pull/563
376
+ # The currently certified ACS-local dataset did not generate WIC
377
+ # participation decisions for ACS people. For missing ACS decisions only,
378
+ # assume that every eligible person claims WIC.
379
+ # This is an explicit modelling assumption, not observed participation.
380
+ # Replace the dataset with a corrected Microcosm release and DELETE
381
+ # this exception immediately after that replacement is certified.
382
+ # Nullable numeric columns reject boolean replacement values. Preserve the
383
+ # original decisions as objects; _live_values still validates before casting.
384
+ return stored.astype(object).mask(missing, True)
385
+
386
+
350
387
  def _live_values(stored: pd.Series, variable: Any, context: str) -> np.ndarray:
351
388
  if stored.isna().any():
352
389
  raise ValueError(f"{context}: the stored column has missing values.")
@@ -356,6 +393,15 @@ def _live_values(stored: pd.Series, variable: Any, context: str) -> np.ndarray:
356
393
  return np.asarray(stored.to_numpy(dtype=bool))
357
394
  if pd.api.types.is_numeric_dtype(stored.dtype) and stored.isin((0, 1)).all():
358
395
  return np.asarray(stored.to_numpy(), dtype=bool)
396
+ # Nullable legacy H5 columns may contain genuine booleans and numeric 0/1
397
+ # as objects. Validate each value before casting: bool("False") is True.
398
+ if stored.map(
399
+ lambda value: (
400
+ isinstance(value, bool | np.bool_ | int | np.integer | float | np.floating)
401
+ and value in (0, 1)
402
+ )
403
+ ).all():
404
+ return np.asarray(stored.to_numpy(), dtype=bool)
359
405
  raise ValueError(f"{context}: the stored values are not boolean.")
360
406
 
361
407
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: policyengine
3
- Version: 6.2.4
3
+ Version: 6.2.5
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
@@ -58,6 +58,7 @@ docs/trace-case-study.md
58
58
  docs/visualisation.md
59
59
  docs/_generator/README.md
60
60
  docs/_generator/build_reference.py
61
+ docs/engineering/runbooks/acs-local-wic-replacement.md
61
62
  docs/engineering/runbooks/build-m-us-populace-certification.md
62
63
  docs/engineering/runbooks/canonical-spm-development.md
63
64
  docs/engineering/skills/README.md
@@ -322,6 +322,103 @@ def test_a_draw_that_is_not_a_complete_boolean_is_refused(draw, message):
322
322
  assert simulation.inputs == {}
323
323
 
324
324
 
325
+ @pytest.mark.parametrize(
326
+ "draw",
327
+ [
328
+ [False, np.bool_(True), None, False],
329
+ [0, 1.0, np.nan, np.bool_(False)],
330
+ pd.array([False, True, pd.NA, False], dtype="boolean"),
331
+ ],
332
+ )
333
+ def test_missing_acs_wic_decisions_assume_claiming_without_changing_stored_draws(draw):
334
+ """Only a missing ACS decision uses the temporary 100% take-up assumption."""
335
+ ids = [1, 2, 3, 4]
336
+ person = _person(
337
+ ids,
338
+ draw,
339
+ person_support_channel=[
340
+ "asec",
341
+ "puf_tax_detail",
342
+ "acs_2024_1yr",
343
+ "acs_2024_1yr",
344
+ ],
345
+ )
346
+ original = person.copy(deep=True)
347
+ simulation = FakeSimulation(_variables(LIVE), ids)
348
+
349
+ assert apply_legacy_input_renames(simulation, _tables({2024: person})) == {
350
+ LEGACY: LIVE
351
+ }
352
+ for month in _months(2024):
353
+ assert simulation.inputs[(LIVE, month)].tolist() == [False, True, True, False]
354
+ assert simulation.inputs[(LIVE, month)].dtype == bool
355
+ pd.testing.assert_frame_equal(person, original)
356
+
357
+
358
+ @pytest.mark.parametrize("channel", ["asec", "puf_tax_detail", "acs", "unknown", None])
359
+ def test_missing_wic_decisions_outside_identified_acs_people_are_refused(channel):
360
+ person = _person(
361
+ [1, 2], [None, None], person_support_channel=["acs_2024_1yr", channel]
362
+ )
363
+ simulation = FakeSimulation(_variables(LIVE), [1, 2])
364
+ with pytest.raises(ValueError, match="missing values"):
365
+ apply_legacy_input_renames(simulation, _tables({2024: person}))
366
+ assert simulation.inputs == {}
367
+
368
+
369
+ @pytest.mark.parametrize("invalid", ["False", "True", "0", 2, -1, np.inf])
370
+ def test_acs_missing_value_does_not_hide_an_invalid_stored_wic_decision(invalid):
371
+ person = _person(
372
+ [1, 2], [invalid, None], person_support_channel=["asec", "acs_2024_1yr"]
373
+ )
374
+ simulation = FakeSimulation(_variables(LIVE), [1, 2])
375
+ with pytest.raises(ValueError, match="not boolean"):
376
+ apply_legacy_input_renames(simulation, _tables({2024: person}))
377
+ assert simulation.inputs == {}
378
+
379
+
380
+ def test_a_later_invalid_year_prevents_earlier_acs_assignments():
381
+ valid = _person([1], [None], person_support_channel=["acs_2024_1yr"])
382
+ invalid = _person([1], [None], person_support_channel=["asec"])
383
+ simulation = FakeSimulation(_variables(LIVE), [1])
384
+ with pytest.raises(ValueError, match="missing values"):
385
+ apply_legacy_input_renames(simulation, _tables({2024: valid, 2025: invalid}))
386
+ assert simulation.inputs == {}
387
+
388
+
389
+ def test_the_temporary_acs_assumption_reaches_each_existing_branch_idempotently():
390
+ person = _person(
391
+ [1, 2], [False, None], person_support_channel=["asec", "acs_2024_1yr"]
392
+ )
393
+ dataset = _multi_year_dataset({2024: person})
394
+ simulation = FakeSimulation(_variables(LIVE), [1, 2], dataset=dataset)
395
+ baseline = FakeSimulation(_variables(LIVE), [1, 2], dataset=dataset)
396
+ simulation.branches["baseline"] = baseline
397
+ apply_legacy_input_renames_to_microsimulation(simulation)
398
+ before = _snapshot(simulation)
399
+ apply_legacy_input_renames_to_microsimulation(simulation)
400
+ assert _snapshot(simulation) == _snapshot(baseline) == before
401
+ for month in _months(2024):
402
+ assert simulation.inputs[(LIVE, month)].tolist() == [False, True]
403
+
404
+
405
+ def test_current_name_wic_decisions_are_not_overridden_by_the_acs_assumption():
406
+ person = _person(
407
+ [1], [None], person_support_channel=["acs_2024_1yr"], **{LIVE: [False]}
408
+ )
409
+ simulation = FakeSimulation(_variables(LIVE), [1])
410
+ assert apply_legacy_input_renames(simulation, _tables({2024: person})) == {}
411
+ assert simulation.inputs == {}
412
+
413
+
414
+ def test_boolean_values_in_an_object_column_are_preserved():
415
+ person = _person([1, 2], pd.Series([False, np.bool_(True)], dtype=object))
416
+ person[LEGACY] = person[LEGACY].astype(object)
417
+ simulation = FakeSimulation(_variables(LIVE), [1, 2])
418
+ apply_legacy_input_renames(simulation, _tables({2024: person}))
419
+ assert simulation.inputs[(LIVE, "2024-01")].tolist() == [False, True]
420
+
421
+
325
422
  def test_a_non_boolean_live_input_keeps_the_stored_values():
326
423
  variables = {LIVE: _variable(value_type=float)}
327
424
  simulation = FakeSimulation(variables, [1, 2])
@@ -654,3 +751,91 @@ def test_a_part_year_period_is_refused(period):
654
751
  def test_yearly_periods_are_accepted():
655
752
  check_yearly_periods(LEGACY, ["2024", 2025, np.int64(2026)], "source.h5")
656
753
  check_yearly_periods(LEGACY, [], "source.h5")
754
+
755
+
756
+ @pytest.mark.parametrize("dtype", ["Int64", "Float64"])
757
+ @pytest.mark.parametrize(
758
+ ("draw", "channels", "expected"),
759
+ [
760
+ ([0, pd.NA], ["asec", "acs_2024_1yr"], [False, True]),
761
+ (
762
+ [0, 1, pd.NA, 0, 1],
763
+ ["asec", "puf_tax_detail", "acs_2024_1yr", "acs_2024_1yr", "acs_2024_1yr"],
764
+ [False, True, True, False, True],
765
+ ),
766
+ ],
767
+ )
768
+ def test_nullable_numeric_wic_decisions_fill_only_missing_acs_cells(
769
+ dtype, draw, channels, expected
770
+ ):
771
+ """Keep nullable numeric storage and preserve existing donor/ACS decisions."""
772
+ ids = list(range(1, len(draw) + 1))
773
+ person = pd.DataFrame(
774
+ {
775
+ "person_id": ids,
776
+ LEGACY: pd.Series(draw, dtype=dtype),
777
+ "person_support_channel": channels,
778
+ }
779
+ )
780
+ original = person.copy(deep=True)
781
+ assert str(person[LEGACY].dtype) == dtype
782
+ simulation = FakeSimulation(_variables(LIVE), ids)
783
+
784
+ assert apply_legacy_input_renames(simulation, _tables({2024: person})) == {
785
+ LEGACY: LIVE
786
+ }
787
+ for month in _months(2024):
788
+ assert simulation.inputs[(LIVE, month)].tolist() == expected
789
+ assert simulation.inputs[(LIVE, month)].dtype == bool
790
+ pd.testing.assert_frame_equal(person, original)
791
+
792
+
793
+ @pytest.mark.parametrize(
794
+ ("dtype", "invalid"),
795
+ [
796
+ ("Int64", 2),
797
+ ("Int64", -1),
798
+ ("Float64", 2),
799
+ ("Float64", -1),
800
+ ("Float64", 0.5),
801
+ ("Float64", np.inf),
802
+ ],
803
+ )
804
+ def test_nullable_numeric_acs_fill_does_not_hide_invalid_wic_decisions(dtype, invalid):
805
+ person = pd.DataFrame(
806
+ {
807
+ "person_id": [1, 2],
808
+ LEGACY: pd.Series([invalid, pd.NA], dtype=dtype),
809
+ "person_support_channel": ["asec", "acs_2024_1yr"],
810
+ }
811
+ )
812
+ original = person.copy(deep=True)
813
+ simulation = FakeSimulation(_variables(LIVE), [1, 2])
814
+
815
+ with pytest.raises(ValueError, match="not boolean"):
816
+ apply_legacy_input_renames(simulation, _tables({2024: person}))
817
+ assert simulation.inputs == {}
818
+ assert simulation.input_variables == []
819
+ pd.testing.assert_frame_equal(person, original)
820
+
821
+
822
+ @pytest.mark.parametrize("dtype", ["Int64", "Float64"])
823
+ @pytest.mark.parametrize("channel", ["asec", None])
824
+ def test_nullable_numeric_missing_non_acs_wic_decisions_fail_before_writes(
825
+ dtype, channel
826
+ ):
827
+ person = pd.DataFrame(
828
+ {
829
+ "person_id": [1, 2],
830
+ LEGACY: pd.Series([pd.NA, pd.NA], dtype=dtype),
831
+ "person_support_channel": ["acs_2024_1yr", channel],
832
+ }
833
+ )
834
+ original = person.copy(deep=True)
835
+ simulation = FakeSimulation(_variables(LIVE), [1, 2])
836
+
837
+ with pytest.raises(ValueError, match="missing values"):
838
+ apply_legacy_input_renames(simulation, _tables({2024: person}))
839
+ assert simulation.inputs == {}
840
+ assert simulation.input_variables == []
841
+ pd.testing.assert_frame_equal(person, original)
@@ -177,6 +177,28 @@ def test_run_keeps_a_stored_false_draw(mapped_run):
177
177
  assert mapped_run.release_bundle["legacy_input_renames"] == RENAME
178
178
 
179
179
 
180
+ def test_missing_acs_claim_decisions_do_not_make_ineligible_people_wic_eligible(
181
+ tmp_path,
182
+ ):
183
+ frames = _frames()
184
+ # Keep the donor infant's False and the ACS toddler's existing True.
185
+ # Only the ACS adult is missing a participation decision.
186
+ frames["person"][LEGACY] = pd.Series([None, False, True], dtype=object)
187
+ frames["person"]["person_support_channel"] = [
188
+ "acs_2024_1yr",
189
+ "asec",
190
+ "acs_2024_1yr",
191
+ ]
192
+ person = _person_outputs(_run(_in_memory_dataset(tmp_path, frames)))
193
+
194
+ assert person[LIVE].tolist() == [True, False, True]
195
+ assert not person["is_wic_eligible"].iloc[0]
196
+ assert person["wic"].iloc[0] == 0
197
+ assert person["is_wic_eligible"].iloc[INFANT]
198
+ assert person["wic"].iloc[INFANT] == 0
199
+ assert person["wic"].iloc[TODDLER] > 0
200
+
201
+
180
202
  def test_run_over_a_core_h5_keeps_a_stored_false_draw(tmp_path):
181
203
  """Path 1 over a policyengine-core ``variable/period`` file.
182
204
 
@@ -1807,7 +1807,7 @@ wheels = [
1807
1807
 
1808
1808
  [[package]]
1809
1809
  name = "policyengine"
1810
- version = "6.2.4"
1810
+ version = "6.2.5"
1811
1811
  source = { editable = "." }
1812
1812
  dependencies = [
1813
1813
  { name = "h5py" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes