policyengine 6.4.3__tar.gz → 6.6.0__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 (417) hide show
  1. policyengine-6.6.0/.github/dispatch-policyengine-release.sh +51 -0
  2. policyengine-6.6.0/.github/qualification-ledger.sh +116 -0
  3. policyengine-6.6.0/.github/workflows/certify-uk-release.yaml +581 -0
  4. {policyengine-6.4.3 → policyengine-6.6.0}/.github/workflows/pr_code_changes.yaml +4 -3
  5. {policyengine-6.4.3 → policyengine-6.6.0}/.github/workflows/push.yaml +77 -4
  6. {policyengine-6.4.3 → policyengine-6.6.0}/CHANGELOG.md +41 -0
  7. {policyengine-6.4.3/src/policyengine.egg-info → policyengine-6.6.0}/PKG-INFO +3 -2
  8. {policyengine-6.4.3 → policyengine-6.6.0}/docs/_quarto.yml +1 -0
  9. {policyengine-6.4.3 → policyengine-6.6.0}/docs/dev.md +1 -1
  10. {policyengine-6.4.3 → policyengine-6.6.0}/docs/disclosure.md +55 -2
  11. policyengine-6.6.0/docs/engineering/runbooks/uk-qualification.md +120 -0
  12. {policyengine-6.4.3 → policyengine-6.6.0}/docs/households.md +2 -0
  13. {policyengine-6.4.3 → policyengine-6.6.0}/docs/microsim.md +54 -1
  14. policyengine-6.6.0/docs/receipts.md +185 -0
  15. {policyengine-6.4.3 → policyengine-6.6.0}/docs/run-records.md +1 -1
  16. {policyengine-6.4.3 → policyengine-6.6.0}/pyproject.toml +6 -2
  17. {policyengine-6.4.3 → policyengine-6.6.0}/scripts/bundle.py +12 -0
  18. {policyengine-6.4.3 → policyengine-6.6.0}/scripts/certify_data_release.py +18 -0
  19. policyengine-6.6.0/scripts/check_uk_candidate.py +1305 -0
  20. policyengine-6.6.0/scripts/generate_receipt_schemas.py +60 -0
  21. {policyengine-6.4.3 → policyengine-6.6.0}/scripts/generate_trace_tros.py +22 -1
  22. policyengine-6.6.0/scripts/release_consumers.py +164 -0
  23. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/__init__.py +8 -0
  24. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/core/__init__.py +1 -0
  25. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/core/run_record.py +24 -0
  26. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/core/simulation.py +30 -6
  27. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/core/tax_benefit_model_version.py +12 -0
  28. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/data/bundle/manifest.json +10 -10
  29. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/data/bundle/uk.trace.tro.jsonld +5 -5
  30. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/data/bundle/us.trace.tro.jsonld +5 -5
  31. policyengine-6.6.0/src/policyengine/data/qualification/replay_policy.md +57 -0
  32. policyengine-6.6.0/src/policyengine/data/qualification/uk.json +40 -0
  33. policyengine-6.6.0/src/policyengine/data/qualification/uk_budget_critical_inputs.json +58 -0
  34. policyengine-6.6.0/src/policyengine/data/qualification/uk_review_bounds.json +79 -0
  35. policyengine-6.6.0/src/policyengine/data/schemas/execution_receipt.v1.schema.json +720 -0
  36. policyengine-6.6.0/src/policyengine/data/schemas/vendor/policyengine-scorecard/README.md +9 -0
  37. policyengine-6.6.0/src/policyengine/data/schemas/vendor/policyengine-scorecard/qualification_request.v1.json +145 -0
  38. policyengine-6.6.0/src/policyengine/data/schemas/vendor/policyengine-scorecard/replay_receipt.v1.json +638 -0
  39. policyengine-6.6.0/src/policyengine/data/schemas/vendor/policyengine-scorecard/replay_status.v1.json +36 -0
  40. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/disclosure/release.py +62 -0
  41. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/disclosure/schema.py +5 -1
  42. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/outputs/uk_geography_disclosure.py +112 -7
  43. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/provenance/__init__.py +21 -0
  44. policyengine-6.6.0/src/policyengine/provenance/bytecode.py +179 -0
  45. policyengine-6.6.0/src/policyengine/provenance/canonical.py +200 -0
  46. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/provenance/certification.py +133 -6
  47. policyengine-6.6.0/src/policyengine/provenance/loaded.py +34 -0
  48. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/provenance/manifest.py +87 -1
  49. policyengine-6.6.0/src/policyengine/provenance/qualification.py +1140 -0
  50. policyengine-6.6.0/src/policyengine/provenance/qualification_ledger.py +356 -0
  51. policyengine-6.6.0/src/policyengine/provenance/receipt.py +4066 -0
  52. policyengine-6.6.0/src/policyengine/provenance/uk_candidate.py +3291 -0
  53. policyengine-6.6.0/src/policyengine/provenance/uk_qualification.py +1613 -0
  54. policyengine-6.6.0/src/policyengine/provenance/wheels.py +438 -0
  55. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/tax_benefit_models/common/model_version.py +61 -5
  56. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/tax_benefit_models/uk/budget_reform_contract.py +349 -28
  57. policyengine-6.6.0/src/policyengine/tax_benefit_models/uk/capital_gains_responses.py +321 -0
  58. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/tax_benefit_models/uk/datasets.py +22 -2
  59. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/tax_benefit_models/uk/household.py +13 -4
  60. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/tax_benefit_models/uk/model.py +16 -0
  61. {policyengine-6.4.3 → policyengine-6.6.0/src/policyengine.egg-info}/PKG-INFO +3 -2
  62. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine.egg-info/SOURCES.txt +57 -0
  63. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine.egg-info/requires.txt +2 -1
  64. policyengine-6.6.0/tests/fixtures/uk_contract/README.md +15 -0
  65. policyengine-6.6.0/tests/fixtures/uk_contract/evaluate_case_rows.json +1 -0
  66. policyengine-6.6.0/tests/fixtures/uk_contract/full_released_uk_2.130.1.json +14922 -0
  67. policyengine-6.6.0/tests/fixtures/uk_contract/pinned_uk_2.125.1_defects.json +2050 -0
  68. policyengine-6.6.0/tests/fixtures/uk_contract/population_pass_max_examples_0.json +161 -0
  69. policyengine-6.6.0/tests/fixtures/uk_metrics/README.md +31 -0
  70. policyengine-6.6.0/tests/fixtures/uk_metrics/budget_metrics_report.json +21199 -0
  71. policyengine-6.6.0/tests/fixtures/uk_metrics/standard_reforms.yaml +150 -0
  72. policyengine-6.6.0/tests/fixtures/uk_replay/DIGESTS.json +8 -0
  73. policyengine-6.6.0/tests/fixtures/uk_replay/README.md +17 -0
  74. policyengine-6.6.0/tests/fixtures/uk_replay/qualification_request_golden.jcs +1 -0
  75. policyengine-6.6.0/tests/fixtures/uk_replay/qualification_request_golden.json +72 -0
  76. policyengine-6.6.0/tests/fixtures/uk_replay/receipt_6.4.1_attempt1/REPLAY_RECEIPT.json +4480 -0
  77. policyengine-6.6.0/tests/fixtures/uk_replay/receipt_6.4.1_attempt1/REQUEST.json +59 -0
  78. policyengine-6.6.0/tests/fixtures/uk_replay/replay_receipt_golden.jcs +1 -0
  79. policyengine-6.6.0/tests/fixtures/uk_replay/replay_receipt_golden.json +138 -0
  80. policyengine-6.6.0/tests/qualification_fixtures.py +214 -0
  81. policyengine-6.6.0/tests/receipt_modifiers.py +25 -0
  82. policyengine-6.6.0/tests/receipt_unbindable_modifiers.py +16 -0
  83. policyengine-6.6.0/tests/test_canonical_json.py +231 -0
  84. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_disclosure_release.py +139 -2
  85. policyengine-6.6.0/tests/test_execution_receipt.py +7434 -0
  86. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_household_calculator_snapshot.py +5 -1
  87. policyengine-6.6.0/tests/test_qualification_contracts.py +1202 -0
  88. policyengine-6.6.0/tests/test_qualification_ledger_concurrency.py +515 -0
  89. policyengine-6.6.0/tests/test_qualification_ledger_script.py +111 -0
  90. policyengine-6.6.0/tests/test_qualified_pair_certification.py +594 -0
  91. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_uk_budget_reform_contract.py +289 -0
  92. policyengine-6.6.0/tests/test_uk_candidate_gates.py +3750 -0
  93. policyengine-6.6.0/tests/test_uk_candidate_metric_baselines.py +743 -0
  94. policyengine-6.6.0/tests/test_uk_cgt_response_records.py +231 -0
  95. policyengine-6.6.0/tests/test_uk_cgt_responses.py +432 -0
  96. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_uk_dated_reforms.py +12 -1
  97. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_uk_geography_disclosure.py +196 -7
  98. policyengine-6.6.0/tests/test_uk_qualification_pipeline.py +3338 -0
  99. policyengine-6.6.0/tests/test_uk_qualification_workflow.py +796 -0
  100. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_uk_year_file_data_year.py +10 -0
  101. policyengine-6.6.0/tests/test_wheels.py +853 -0
  102. {policyengine-6.4.3 → policyengine-6.6.0}/uv.lock +13 -2
  103. policyengine-6.4.3/.github/dispatch-policyengine-release.sh +0 -28
  104. policyengine-6.4.3/tests/fixtures/uk_contract/evaluate_case_rows.json +0 -1
  105. {policyengine-6.4.3 → policyengine-6.6.0}/.claude/policyengine-guide.md +0 -0
  106. {policyengine-6.4.3 → policyengine-6.6.0}/.claude/quick-reference.md +0 -0
  107. {policyengine-6.4.3 → policyengine-6.6.0}/.github/CONTRIBUTING.md +0 -0
  108. {policyengine-6.4.3 → policyengine-6.6.0}/.github/bump_version.py +0 -0
  109. {policyengine-6.4.3 → policyengine-6.6.0}/.github/capture-version.sh +0 -0
  110. {policyengine-6.4.3 → policyengine-6.6.0}/.github/changelog_template.md +0 -0
  111. {policyengine-6.4.3 → policyengine-6.6.0}/.github/check-changelog.sh +0 -0
  112. {policyengine-6.4.3 → policyengine-6.6.0}/.github/copilot-instructions.md +0 -0
  113. {policyengine-6.4.3 → policyengine-6.6.0}/.github/fetch_version.py +0 -0
  114. {policyengine-6.4.3 → policyengine-6.6.0}/.github/get-changelog-diff.sh +0 -0
  115. {policyengine-6.4.3 → policyengine-6.6.0}/.github/has-functional-changes.sh +0 -0
  116. {policyengine-6.4.3 → policyengine-6.6.0}/.github/is-version-number-acceptable.sh +0 -0
  117. {policyengine-6.4.3 → policyengine-6.6.0}/.github/publish-git-tag.sh +0 -0
  118. {policyengine-6.4.3 → policyengine-6.6.0}/.github/wait-for-pypi.sh +0 -0
  119. {policyengine-6.4.3 → policyengine-6.6.0}/.github/workflows/draft-pdf.yml +0 -0
  120. {policyengine-6.4.3 → policyengine-6.6.0}/.github/workflows/pr_docs_changes.yaml +0 -0
  121. {policyengine-6.4.3 → policyengine-6.6.0}/.gitignore +0 -0
  122. {policyengine-6.4.3 → policyengine-6.6.0}/.python-version +0 -0
  123. {policyengine-6.4.3 → policyengine-6.6.0}/AGENTS.md +0 -0
  124. {policyengine-6.4.3 → policyengine-6.6.0}/CITATION.cff +0 -0
  125. {policyengine-6.4.3 → policyengine-6.6.0}/CLAUDE.md +0 -0
  126. {policyengine-6.4.3 → policyengine-6.6.0}/CODE_OF_CONDUCT.md +0 -0
  127. {policyengine-6.4.3 → policyengine-6.6.0}/CONTRIBUTING.md +0 -0
  128. {policyengine-6.4.3 → policyengine-6.6.0}/LICENSE +0 -0
  129. {policyengine-6.4.3 → policyengine-6.6.0}/Makefile +0 -0
  130. {policyengine-6.4.3 → policyengine-6.6.0}/README.md +0 -0
  131. {policyengine-6.4.3 → policyengine-6.6.0}/architecture.png +0 -0
  132. {policyengine-6.4.3 → policyengine-6.6.0}/architecture.svg +0 -0
  133. {policyengine-6.4.3 → policyengine-6.6.0}/changelog.d/.gitkeep +0 -0
  134. {policyengine-6.4.3 → policyengine-6.6.0}/docs/.gitignore +0 -0
  135. {policyengine-6.4.3 → policyengine-6.6.0}/docs/_generator/README.md +0 -0
  136. {policyengine-6.4.3 → policyengine-6.6.0}/docs/_generator/build_reference.py +0 -0
  137. {policyengine-6.4.3 → policyengine-6.6.0}/docs/bundles.md +0 -0
  138. {policyengine-6.4.3 → policyengine-6.6.0}/docs/countries.md +0 -0
  139. {policyengine-6.4.3 → policyengine-6.6.0}/docs/data-publishing-design.md +0 -0
  140. {policyengine-6.4.3 → policyengine-6.6.0}/docs/decile-impact-spec.md +0 -0
  141. {policyengine-6.4.3 → policyengine-6.6.0}/docs/engineering/runbooks/acs-local-wic-replacement.md +0 -0
  142. {policyengine-6.4.3 → policyengine-6.6.0}/docs/engineering/runbooks/build-m-us-populace-certification.md +0 -0
  143. {policyengine-6.4.3 → policyengine-6.6.0}/docs/engineering/runbooks/canonical-spm-development.md +0 -0
  144. {policyengine-6.4.3 → policyengine-6.6.0}/docs/engineering/runbooks/us-legacy-spm-sources.md +0 -0
  145. {policyengine-6.4.3 → policyengine-6.6.0}/docs/engineering/skills/README.md +0 -0
  146. {policyengine-6.4.3 → policyengine-6.6.0}/docs/engineering/skills/data-certification.md +0 -0
  147. {policyengine-6.4.3 → policyengine-6.6.0}/docs/engineering/skills/github-prs.md +0 -0
  148. {policyengine-6.4.3 → policyengine-6.6.0}/docs/engineering/skills/repository-guidance.md +0 -0
  149. {policyengine-6.4.3 → policyengine-6.6.0}/docs/examples.md +0 -0
  150. {policyengine-6.4.3 → policyengine-6.6.0}/docs/getting-started.md +0 -0
  151. {policyengine-6.4.3 → policyengine-6.6.0}/docs/impact-analysis.md +0 -0
  152. {policyengine-6.4.3 → policyengine-6.6.0}/docs/index.md +0 -0
  153. {policyengine-6.4.3 → policyengine-6.6.0}/docs/methodology/index.md +0 -0
  154. {policyengine-6.4.3 → policyengine-6.6.0}/docs/methodology/model-architecture.md +0 -0
  155. {policyengine-6.4.3 → policyengine-6.6.0}/docs/methodology/us-health-costs.md +0 -0
  156. {policyengine-6.4.3 → policyengine-6.6.0}/docs/outputs.md +0 -0
  157. {policyengine-6.4.3 → policyengine-6.6.0}/docs/programs/index.md +0 -0
  158. {policyengine-6.4.3 → policyengine-6.6.0}/docs/programs/us-chip.md +0 -0
  159. {policyengine-6.4.3 → policyengine-6.6.0}/docs/reference/index.md +0 -0
  160. {policyengine-6.4.3 → policyengine-6.6.0}/docs/reforms.md +0 -0
  161. {policyengine-6.4.3 → policyengine-6.6.0}/docs/regions.md +0 -0
  162. {policyengine-6.4.3 → policyengine-6.6.0}/docs/release-bundles.md +0 -0
  163. {policyengine-6.4.3 → policyengine-6.6.0}/docs/trace-case-study.md +0 -0
  164. {policyengine-6.4.3 → policyengine-6.6.0}/docs/visualisation.md +0 -0
  165. {policyengine-6.4.3 → policyengine-6.6.0}/examples/belgium_axiom_pilot.py +0 -0
  166. {policyengine-6.4.3 → policyengine-6.6.0}/examples/employment_income_variation_uk.py +0 -0
  167. {policyengine-6.4.3 → policyengine-6.6.0}/examples/employment_income_variation_us.py +0 -0
  168. {policyengine-6.4.3 → policyengine-6.6.0}/examples/household_impact_example.py +0 -0
  169. {policyengine-6.4.3 → policyengine-6.6.0}/examples/income_bands_uk.py +0 -0
  170. {policyengine-6.4.3 → policyengine-6.6.0}/examples/income_distribution_us.py +0 -0
  171. {policyengine-6.4.3 → policyengine-6.6.0}/examples/paper_repro_uk.py +0 -0
  172. {policyengine-6.4.3 → policyengine-6.6.0}/examples/policy_change_uk.py +0 -0
  173. {policyengine-6.4.3 → policyengine-6.6.0}/examples/speedtest_us_simulation.py +0 -0
  174. {policyengine-6.4.3 → policyengine-6.6.0}/examples/uk_geography_disclosure.py +0 -0
  175. {policyengine-6.4.3 → policyengine-6.6.0}/examples/us_budgetary_impact.py +0 -0
  176. {policyengine-6.4.3 → policyengine-6.6.0}/paper-preview.html +0 -0
  177. {policyengine-6.4.3 → policyengine-6.6.0}/paper.bib +0 -0
  178. {policyengine-6.4.3 → policyengine-6.6.0}/paper.md +0 -0
  179. {policyengine-6.4.3 → policyengine-6.6.0}/scripts/check_data_staleness.py +0 -0
  180. {policyengine-6.4.3 → policyengine-6.6.0}/scripts/check_native_spm_loading.py +0 -0
  181. {policyengine-6.4.3 → policyengine-6.6.0}/scripts/check_release_credentials.py +0 -0
  182. {policyengine-6.4.3 → policyengine-6.6.0}/scripts/export_bundle_release_assets.py +0 -0
  183. {policyengine-6.4.3 → policyengine-6.6.0}/scripts/generate_bundle_artifacts.py +0 -0
  184. {policyengine-6.4.3 → policyengine-6.6.0}/scripts/prepare_package_bundle_update.py +0 -0
  185. {policyengine-6.4.3 → policyengine-6.6.0}/scripts/release_lock.py +0 -0
  186. {policyengine-6.4.3 → policyengine-6.6.0}/scripts/spm_bundle.py +0 -0
  187. {policyengine-6.4.3 → policyengine-6.6.0}/setup.cfg +0 -0
  188. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/bundle.py +0 -0
  189. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/cli.py +0 -0
  190. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/core/cache.py +0 -0
  191. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/core/dataset.py +0 -0
  192. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/core/dynamic.py +0 -0
  193. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/core/output.py +0 -0
  194. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/core/parameter.py +0 -0
  195. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/core/parameter_node.py +0 -0
  196. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/core/parameter_value.py +0 -0
  197. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/core/policy.py +0 -0
  198. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/core/region.py +0 -0
  199. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/core/scoping_strategy.py +0 -0
  200. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/core/spm.py +0 -0
  201. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/core/tax_benefit_model.py +0 -0
  202. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/core/variable.py +0 -0
  203. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/countries/__init__.py +0 -0
  204. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/countries/uk/__init__.py +0 -0
  205. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/countries/uk/regions.py +0 -0
  206. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/countries/us/__init__.py +0 -0
  207. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/countries/us/data/__init__.py +0 -0
  208. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/countries/us/data/districts.py +0 -0
  209. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/countries/us/data/places.py +0 -0
  210. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/countries/us/data/states.py +0 -0
  211. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/countries/us/regions.py +0 -0
  212. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/data/__init__.py +0 -0
  213. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/data/schemas/trace_tro.schema.json +0 -0
  214. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/data/uk_geography_assets.py +0 -0
  215. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/derivations/__init__.py +0 -0
  216. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/derivations/narrate.py +0 -0
  217. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/derivations/trace.py +0 -0
  218. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/disclosure/__init__.py +0 -0
  219. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/disclosure/__main__.py +0 -0
  220. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/disclosure/areas.py +0 -0
  221. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/disclosure/estimate.py +0 -0
  222. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/disclosure/noise.py +0 -0
  223. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/disclosure/support.py +0 -0
  224. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/disclosure/validate.py +0 -0
  225. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/graph/__init__.py +0 -0
  226. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/graph/extractor.py +0 -0
  227. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/graph/graph.py +0 -0
  228. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/outputs/__init__.py +0 -0
  229. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/outputs/aggregate.py +0 -0
  230. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/outputs/change_aggregate.py +0 -0
  231. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/outputs/cliff_impact.py +0 -0
  232. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/outputs/congressional_district_impact.py +0 -0
  233. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/outputs/constituency_impact.py +0 -0
  234. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/outputs/decile_analysis.py +0 -0
  235. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/outputs/decile_grouping.py +0 -0
  236. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/outputs/decile_impact.py +0 -0
  237. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/outputs/extra_variables.py +0 -0
  238. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/outputs/inequality.py +0 -0
  239. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/outputs/intra_decile_impact.py +0 -0
  240. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/outputs/labor_supply_response.py +0 -0
  241. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/outputs/local_authority_impact.py +0 -0
  242. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/outputs/poverty.py +0 -0
  243. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/outputs/program_statistics.py +0 -0
  244. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/outputs/uk_geography_assets.py +0 -0
  245. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/outputs/uk_geography_impact.py +0 -0
  246. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/provenance/bundle_validation.py +0 -0
  247. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/provenance/dataset_materialization.py +0 -0
  248. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/provenance/pyproject_pins.py +0 -0
  249. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/provenance/spm_configuration.py +0 -0
  250. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/provenance/trace.py +0 -0
  251. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/provenance/verify.py +0 -0
  252. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/provenance/zenodo.py +0 -0
  253. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/results/__init__.py +0 -0
  254. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/results/schema.py +0 -0
  255. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/results/trace_tro.py +0 -0
  256. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/results/tracking.py +0 -0
  257. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/tax_benefit_models/be/__init__.py +0 -0
  258. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/tax_benefit_models/be/datasets.py +0 -0
  259. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/tax_benefit_models/be/model.py +0 -0
  260. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/tax_benefit_models/common/__init__.py +0 -0
  261. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/tax_benefit_models/common/axes.py +0 -0
  262. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/tax_benefit_models/common/extra_variables.py +0 -0
  263. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/tax_benefit_models/common/household.py +0 -0
  264. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/tax_benefit_models/common/reform.py +0 -0
  265. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/tax_benefit_models/common/result.py +0 -0
  266. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/tax_benefit_models/uk/__init__.py +0 -0
  267. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/tax_benefit_models/uk/analysis.py +0 -0
  268. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/tax_benefit_models/uk/budget_reform_population.py +0 -0
  269. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/tax_benefit_models/us/__init__.py +0 -0
  270. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/tax_benefit_models/us/analysis.py +0 -0
  271. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/tax_benefit_models/us/datasets.py +0 -0
  272. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/tax_benefit_models/us/household.py +0 -0
  273. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/tax_benefit_models/us/legacy_inputs.py +0 -0
  274. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/tax_benefit_models/us/legacy_spm/__init__.py +0 -0
  275. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/tax_benefit_models/us/legacy_spm/declarations.py +0 -0
  276. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/tax_benefit_models/us/legacy_spm/independence.py +0 -0
  277. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/tax_benefit_models/us/legacy_spm/model_adapter.py +0 -0
  278. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/tax_benefit_models/us/legacy_spm/record.py +0 -0
  279. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/tax_benefit_models/us/legacy_spm/registry.py +0 -0
  280. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/tax_benefit_models/us/legacy_spm/runs.py +0 -0
  281. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/tax_benefit_models/us/legacy_spm/universe.py +0 -0
  282. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/tax_benefit_models/us/model.py +0 -0
  283. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/tax_benefit_models/us/spm.py +0 -0
  284. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/utils/__init__.py +0 -0
  285. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/utils/dates.py +0 -0
  286. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/utils/design.py +0 -0
  287. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/utils/entity_utils.py +0 -0
  288. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/utils/errors.py +0 -0
  289. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/utils/hashing.py +0 -0
  290. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/utils/household_validation.py +0 -0
  291. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/utils/parameter_labels.py +0 -0
  292. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/utils/parametric_reforms.py +0 -0
  293. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine/utils/plotting.py +0 -0
  294. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine.egg-info/dependency_links.txt +0 -0
  295. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine.egg-info/entry_points.txt +0 -0
  296. {policyengine-6.4.3 → policyengine-6.6.0}/src/policyengine.egg-info/top_level.txt +0 -0
  297. {policyengine-6.4.3 → policyengine-6.6.0}/tests/__init__.py +0 -0
  298. {policyengine-6.4.3 → policyengine-6.6.0}/tests/conftest.py +0 -0
  299. {policyengine-6.4.3 → policyengine-6.6.0}/tests/fixtures/__init__.py +0 -0
  300. {policyengine-6.4.3 → policyengine-6.6.0}/tests/fixtures/filtering_fixtures.py +0 -0
  301. {policyengine-6.4.3 → policyengine-6.6.0}/tests/fixtures/household_calculator_snapshots/uk_couple_two_kids.json +0 -0
  302. {policyengine-6.4.3 → policyengine-6.6.0}/tests/fixtures/household_calculator_snapshots/uk_model_surface.json +0 -0
  303. {policyengine-6.4.3 → policyengine-6.6.0}/tests/fixtures/household_calculator_snapshots/uk_single_adult_employment_income.json +0 -0
  304. {policyengine-6.4.3 → policyengine-6.6.0}/tests/fixtures/household_calculator_snapshots/uk_single_adult_no_income.json +0 -0
  305. {policyengine-6.4.3 → policyengine-6.6.0}/tests/fixtures/household_calculator_snapshots/uk_single_parent_one_child.json +0 -0
  306. {policyengine-6.4.3 → policyengine-6.6.0}/tests/fixtures/household_calculator_snapshots/us_married_two_kids_high_income.json +0 -0
  307. {policyengine-6.4.3 → policyengine-6.6.0}/tests/fixtures/household_calculator_snapshots/us_model_surface.json +0 -0
  308. {policyengine-6.4.3 → policyengine-6.6.0}/tests/fixtures/household_calculator_snapshots/us_single_adult_employment_income.json +0 -0
  309. {policyengine-6.4.3 → policyengine-6.6.0}/tests/fixtures/household_calculator_snapshots/us_single_adult_no_income.json +0 -0
  310. {policyengine-6.4.3 → policyengine-6.6.0}/tests/fixtures/household_calculator_snapshots/us_single_parent_one_child.json +0 -0
  311. {policyengine-6.4.3 → policyengine-6.6.0}/tests/fixtures/parameter_labels_fixtures.py +0 -0
  312. {policyengine-6.4.3 → policyengine-6.6.0}/tests/fixtures/parametric_reforms_fixtures.py +0 -0
  313. {policyengine-6.4.3 → policyengine-6.6.0}/tests/fixtures/poverty_by_demographics_fixtures.py +0 -0
  314. {policyengine-6.4.3 → policyengine-6.6.0}/tests/fixtures/region_fixtures.py +0 -0
  315. {policyengine-6.4.3 → policyengine-6.6.0}/tests/fixtures/release_tros/README.md +0 -0
  316. {policyengine-6.4.3 → policyengine-6.6.0}/tests/fixtures/release_tros/country-models.lock.toml +0 -0
  317. {policyengine-6.4.3 → policyengine-6.6.0}/tests/fixtures/release_tros/manifest.json +0 -0
  318. {policyengine-6.4.3 → policyengine-6.6.0}/tests/fixtures/release_tros/us-release_manifest.json +0 -0
  319. {policyengine-6.4.3 → policyengine-6.6.0}/tests/fixtures/release_tros/us.trace.tro.jsonld +0 -0
  320. {policyengine-6.4.3 → policyengine-6.6.0}/tests/fixtures/spm_development.py +0 -0
  321. {policyengine-6.4.3 → policyengine-6.6.0}/tests/fixtures/us_reform_fixtures.py +0 -0
  322. {policyengine-6.4.3 → policyengine-6.6.0}/tests/fixtures/variable_label_fixtures.py +0 -0
  323. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_aggregate.py +0 -0
  324. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_be_axiom_pilot.py +0 -0
  325. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_budgetary_impact.py +0 -0
  326. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_bump_version.py +0 -0
  327. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_bundle.py +0 -0
  328. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_bundle_metadata.py +0 -0
  329. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_cache.py +0 -0
  330. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_certify_data_release.py +0 -0
  331. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_change_aggregate.py +0 -0
  332. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_cliff_impact.py +0 -0
  333. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_cliff_impact_analysis.py +0 -0
  334. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_congressional_district_impact.py +0 -0
  335. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_constituency_impact.py +0 -0
  336. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_dataset_materialization.py +0 -0
  337. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_dataset_persistence.py +0 -0
  338. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_dataset_runtime.py +0 -0
  339. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_dataset_source.py +0 -0
  340. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_decile_grouping.py +0 -0
  341. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_derivations.py +0 -0
  342. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_dict_reforms_on_simulation.py +0 -0
  343. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_disclosure_areas.py +0 -0
  344. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_disclosure_estimate.py +0 -0
  345. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_disclosure_noise.py +0 -0
  346. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_disclosure_schema.py +0 -0
  347. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_disclosure_support.py +0 -0
  348. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_disclosure_validate.py +0 -0
  349. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_entity_mapping.py +0 -0
  350. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_entity_utils.py +0 -0
  351. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_entity_utils_characterization.py +0 -0
  352. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_errors.py +0 -0
  353. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_extra_variables.py +0 -0
  354. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_filtering.py +0 -0
  355. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_generate_trace_tros.py +0 -0
  356. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_graph/__init__.py +0 -0
  357. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_graph/conftest.py +0 -0
  358. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_graph/test_extractor.py +0 -0
  359. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_household_impact.py +0 -0
  360. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_inequality.py +0 -0
  361. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_intra_decile_impact.py +0 -0
  362. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_labor_supply_response.py +0 -0
  363. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_local_authority_impact.py +0 -0
  364. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_manifest_version_mismatch.py +0 -0
  365. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_models.py +0 -0
  366. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_pandas3_compatibility.py +0 -0
  367. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_parameter_labels.py +0 -0
  368. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_parameter_nodes.py +0 -0
  369. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_parameter_values.py +0 -0
  370. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_parametric_reforms.py +0 -0
  371. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_poverty.py +0 -0
  372. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_poverty_by_demographics.py +0 -0
  373. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_poverty_run.py +0 -0
  374. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_preservation_mirror.py +0 -0
  375. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_program_statistics.py +0 -0
  376. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_pyproject_pins.py +0 -0
  377. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_region.py +0 -0
  378. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_region_group_strategy.py +0 -0
  379. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_release_credentials.py +0 -0
  380. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_release_lock.py +0 -0
  381. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_release_manifests.py +0 -0
  382. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_release_tro_generation.py +0 -0
  383. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_results.py +0 -0
  384. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_run_record.py +0 -0
  385. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_scoping_strategy.py +0 -0
  386. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_small_follow_ups.py +0 -0
  387. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_spm_bundle_bootstrap.py +0 -0
  388. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_spm_bundle_tooling.py +0 -0
  389. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_spm_decile.py +0 -0
  390. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_spm_development_authentication.py +0 -0
  391. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_spm_household.py +0 -0
  392. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_spm_model.py +0 -0
  393. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_spm_selection.py +0 -0
  394. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_spm_selection_schema.py +0 -0
  395. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_trace_tro.py +0 -0
  396. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_trace_tro_verify.py +0 -0
  397. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_uk_analysis.py +0 -0
  398. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_uk_geography_assets.py +0 -0
  399. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_uk_program_statistics.py +0 -0
  400. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_uk_regions.py +0 -0
  401. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_us_legacy_inputs.py +0 -0
  402. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_us_legacy_inputs_integration.py +0 -0
  403. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_us_legacy_spm.py +0 -0
  404. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_us_legacy_spm_integration.py +0 -0
  405. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_us_legacy_spm_model_contract.py +0 -0
  406. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_us_long_term_datasets.py +0 -0
  407. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_us_microsim_structural_reforms.py +0 -0
  408. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_us_native_alignment.py +0 -0
  409. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_us_native_hdf_weights.py +0 -0
  410. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_us_program_statistics.py +0 -0
  411. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_us_reform_application.py +0 -0
  412. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_us_regions.py +0 -0
  413. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_us_year_file_stamp.py +0 -0
  414. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_variable_labels.py +0 -0
  415. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_variable_metadata.py +0 -0
  416. {policyengine-6.4.3 → policyengine-6.6.0}/tests/test_zenodo_mirror.py +0 -0
  417. {policyengine-6.4.3 → policyengine-6.6.0}/tests/uk_contract_row_scenarios.py +0 -0
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env bash
2
+ #
3
+ # Notify consumer repositories that a policyengine release is available on
4
+ # PyPI by sending a repository dispatch, which triggers their update
5
+ # workflows.
6
+ #
7
+ # Environment:
8
+ # VERSION Exact policyengine version that was released.
9
+ # GH_TOKEN PolicyEngine GitHub App token with Contents write access to
10
+ # the consumer repositories.
11
+ # CONSUMER_REPOS Space-separated repositories to notify (default:
12
+ # policyengine-api policyengine-sim-api).
13
+ # PAYLOAD_FILE Optional JSON file holding the whole dispatch body
14
+ # ({"event_type": ..., "client_payload": {...}}), as written
15
+ # by scripts/release_consumers.py. Without it, a
16
+ # policyengine-release event carrying only the version is sent.
17
+ set -euo pipefail
18
+
19
+ if [[ -z "${VERSION:-}" ]]; then
20
+ echo "ERROR: VERSION must be set." >&2
21
+ exit 1
22
+ fi
23
+
24
+ read -r -a REPOS <<< "${CONSUMER_REPOS:-policyengine-api policyengine-sim-api}"
25
+
26
+ if [[ -n "${PAYLOAD_FILE:-}" ]]; then
27
+ payload_version=$(python - "$PAYLOAD_FILE" <<'PY'
28
+ import json
29
+ import sys
30
+
31
+ payload = json.load(open(sys.argv[1]))["client_payload"]
32
+ request = payload.get("request")
33
+ print(payload.get("version") or request["candidate"]["policyengine"]["version"])
34
+ PY
35
+ )
36
+ if [[ "$payload_version" != "$VERSION" ]]; then
37
+ echo "ERROR: ${PAYLOAD_FILE} is for ${payload_version}, not ${VERSION}." >&2
38
+ exit 1
39
+ fi
40
+ fi
41
+
42
+ for repo in "${REPOS[@]}"; do
43
+ if [[ -n "${PAYLOAD_FILE:-}" ]]; then
44
+ gh api "repos/PolicyEngine/${repo}/dispatches" --method POST --input "$PAYLOAD_FILE"
45
+ else
46
+ gh api "repos/PolicyEngine/${repo}/dispatches" \
47
+ -f event_type=policyengine-release \
48
+ -f "client_payload[version]=${VERSION}"
49
+ fi
50
+ echo "Dispatched policyengine ${VERSION} to PolicyEngine/${repo}."
51
+ done
@@ -0,0 +1,116 @@
1
+ #!/usr/bin/env bash
2
+ #
3
+ # Check out, or publish to, the qualification ledger branch.
4
+ #
5
+ # .github/qualification-ledger.sh checkout <dir>
6
+ # .github/qualification-ledger.sh publish <dir> "<commit message>"
7
+ #
8
+ # The ledger is an orphan branch that only grows. Each attempt writes its own
9
+ # directory (uk/<pair_id>/attempts/<key>/), which concurrent publishes never
10
+ # share. A rejected push is retried by replaying the single new commit on the
11
+ # latest tip; the new commit may be the branch's first (two runs can both find
12
+ # no ledger yet), so it is replayed with cherry-pick, which needs no parent.
13
+ #
14
+ # Two attempts of one pair do share that pair's published files
15
+ # (qualification_receipt.json, latest_attempt.json and pair.json). Git must
16
+ # never merge those line by line: a textual merge of two receipts can produce
17
+ # a valid-looking receipt that is neither (one attempt's harness with another's
18
+ # replay). They are replayed as binary, so a concurrent change to them
19
+ # conflicts. When those are the only conflicts and LEDGER_REDERIVE is set, the
20
+ # tip's copies are kept and "$LEDGER_REDERIVE <dir>" recomputes every pair's
21
+ # published files from its immutable attempts; otherwise the publish fails.
22
+ set -euo pipefail
23
+
24
+ BRANCH="${LEDGER_BRANCH:-uk-qualification-ledger}"
25
+ command="${1:?usage: qualification-ledger.sh checkout|publish <dir> [message]}"
26
+ dir="${2:?ledger directory required}"
27
+
28
+ case "$command" in
29
+ checkout)
30
+ if git ls-remote --exit-code --heads origin "$BRANCH" >/dev/null 2>&1; then
31
+ git fetch --quiet origin "$BRANCH"
32
+ git worktree add --quiet --force -B "$BRANCH" "$dir" FETCH_HEAD
33
+ else
34
+ git worktree add --quiet --detach "$dir"
35
+ (
36
+ cd "$dir"
37
+ git switch --quiet --orphan "$BRANCH"
38
+ cat > README.md <<'README'
39
+ # UK candidate qualification ledger
40
+
41
+ Written by `.github/workflows/certify-uk-release.yaml` in PolicyEngine/policyengine.py.
42
+ Each `uk/<pair_id>/` directory holds a candidate pair, every qualification
43
+ attempt's gate evidence, the replay request and receipt, and the latest
44
+ qualification receipt. Nothing is deleted.
45
+ README
46
+ )
47
+ fi
48
+ ;;
49
+ publish)
50
+ message="${3:?commit message required}"
51
+ cd "$dir"
52
+ git add -A
53
+ if git diff --cached --quiet; then
54
+ echo "Ledger unchanged."
55
+ exit 0
56
+ fi
57
+ identity=(-c user.name="policyengine-qualification[bot]"
58
+ -c user.email="qualification@policyengine.org")
59
+ git "${identity[@]}" commit --quiet -m "$message"
60
+ new_commit="$(git rev-parse HEAD)"
61
+ delay="${LEDGER_RETRY_DELAY:-5}"
62
+ attributes="$(mktemp)"
63
+ trap 'rm -f "$attributes"' EXIT
64
+ printf '%s\n' \
65
+ 'qualification_receipt.json merge=binary' \
66
+ 'latest_attempt.json merge=binary' \
67
+ 'pair.json merge=binary' > "$attributes"
68
+ for attempt in 1 2 3 4 5 6; do
69
+ if git push --quiet origin "HEAD:refs/heads/$BRANCH"; then
70
+ echo "Published ledger: $message"
71
+ exit 0
72
+ fi
73
+ # Someone else published first: replay this one commit on their tip.
74
+ if ! git fetch --quiet origin "$BRANCH"; then
75
+ sleep $((attempt * delay))
76
+ continue
77
+ fi
78
+ git reset --quiet --hard FETCH_HEAD
79
+ if ! git "${identity[@]}" -c core.attributesFile="$attributes" \
80
+ cherry-pick --allow-empty "$new_commit" >/dev/null 2>&1; then
81
+ conflicted="$(git diff --name-only --diff-filter=U)"
82
+ shared_only=true
83
+ while IFS= read -r path; do
84
+ [ -z "$path" ] && continue
85
+ case "$path" in
86
+ uk/*/qualification_receipt.json|uk/*/latest_attempt.json|uk/*/pair.json)
87
+ # Only a pair's published files, never an attempt's own.
88
+ case "$path" in uk/*/*/*) shared_only=false ;; esac ;;
89
+ *) shared_only=false ;;
90
+ esac
91
+ done <<< "$conflicted"
92
+ if [ -z "$conflicted" ] || [ "$shared_only" != true ] \
93
+ || [ -z "${LEDGER_REDERIVE:-}" ]; then
94
+ git cherry-pick --abort || true
95
+ echo "::error::The ledger commit conflicts with a concurrent publish."
96
+ exit 1
97
+ fi
98
+ while IFS= read -r path; do
99
+ git checkout --ours -- "$path"
100
+ done <<< "$conflicted"
101
+ # Recompute published files from the attempts, the tip's and this one's.
102
+ $LEDGER_REDERIVE "$PWD"
103
+ git add -A
104
+ # Completes the cherry-pick, keeping its message, even if empty.
105
+ git "${identity[@]}" commit --quiet --allow-empty --no-edit
106
+ fi
107
+ sleep $((attempt * delay))
108
+ done
109
+ echo "::error::Could not publish the qualification ledger after 6 attempts."
110
+ exit 1
111
+ ;;
112
+ *)
113
+ echo "Unknown command: $command" >&2
114
+ exit 2
115
+ ;;
116
+ esac