agentevolve-optimizer 0.5.0__py3-none-any.whl

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 (414) hide show
  1. agent_evolve/__init__.py +722 -0
  2. agent_evolve/agentic.py +2800 -0
  3. agent_evolve/api.py +767 -0
  4. agent_evolve/application/__init__.py +1580 -0
  5. agent_evolve/application/action_allocation.py +744 -0
  6. agent_evolve/application/action_allocation_frame.py +347 -0
  7. agent_evolve/application/action_allocation_frame_commit.py +185 -0
  8. agent_evolve/application/action_allocation_frame_commit_v3.py +184 -0
  9. agent_evolve/application/action_allocation_frame_v3.py +338 -0
  10. agent_evolve/application/action_archive_value.py +497 -0
  11. agent_evolve/application/action_evidence_consistency.py +455 -0
  12. agent_evolve/application/action_forecast_partitioning.py +1471 -0
  13. agent_evolve/application/action_metric_projection.py +211 -0
  14. agent_evolve/application/action_role_value.py +680 -0
  15. agent_evolve/application/action_score_authorities.py +363 -0
  16. agent_evolve/application/action_structural_signature.py +116 -0
  17. agent_evolve/application/action_target_realization.py +402 -0
  18. agent_evolve/application/agentic_evolution.py +7734 -0
  19. agent_evolve/application/agentic_portfolio_residual_expert.py +835 -0
  20. agent_evolve/application/anchor_residual_identification.py +463 -0
  21. agent_evolve/application/archive_conditioned_action_target.py +208 -0
  22. agent_evolve/application/artifact_journal.py +246 -0
  23. agent_evolve/application/artifact_replay.py +347 -0
  24. agent_evolve/application/budgeted_optimizer.py +1828 -0
  25. agent_evolve/application/calibrated_campaign.py +485 -0
  26. agent_evolve/application/calibrated_current_prefix_forecast_opportunity.py +322 -0
  27. agent_evolve/application/calibrated_positive_gain_opportunity.py +1581 -0
  28. agent_evolve/application/campaign_capacity_recourse.py +254 -0
  29. agent_evolve/application/campaign_contextual_outcomes.py +119 -0
  30. agent_evolve/application/campaign_diagnostic_blocks.py +930 -0
  31. agent_evolve/application/campaign_evidence_registry.py +262 -0
  32. agent_evolve/application/campaign_execution.py +2537 -0
  33. agent_evolve/application/campaign_generation_audit.py +942 -0
  34. agent_evolve/application/campaign_learning.py +1812 -0
  35. agent_evolve/application/campaign_learning_runtime.py +1977 -0
  36. agent_evolve/application/campaign_search_phase.py +227 -0
  37. agent_evolve/application/campaign_selector_context_extension.py +220 -0
  38. agent_evolve/application/campaign_variation_envelope.py +649 -0
  39. agent_evolve/application/campaign_variation_trace.py +451 -0
  40. agent_evolve/application/candidate_archive_consequence.py +128 -0
  41. agent_evolve/application/causal_opportunity_portfolio_gate.py +385 -0
  42. agent_evolve/application/composite_outcome_updater.py +145 -0
  43. agent_evolve/application/composition_portfolio_selection.py +363 -0
  44. agent_evolve/application/concurrent_stage.py +144 -0
  45. agent_evolve/application/contextual_action_allocation.py +181 -0
  46. agent_evolve/application/contextual_campaign_outcomes.py +267 -0
  47. agent_evolve/application/contextual_campaign_planning.py +1366 -0
  48. agent_evolve/application/contextual_delayed_credit.py +651 -0
  49. agent_evolve/application/contextual_search_controller.py +2374 -0
  50. agent_evolve/application/current_prefix_forecast_opportunity.py +714 -0
  51. agent_evolve/application/decision_metric_projection.py +112 -0
  52. agent_evolve/application/derived_action_semantics.py +129 -0
  53. agent_evolve/application/detailed_evaluation.py +449 -0
  54. agent_evolve/application/earned_lineage.py +1011 -0
  55. agent_evolve/application/effective_choice_audit.py +484 -0
  56. agent_evolve/application/empirical_consequence_calibration.py +908 -0
  57. agent_evolve/application/evaluation_accounting.py +325 -0
  58. agent_evolve/application/evaluation_cache.py +199 -0
  59. agent_evolve/application/evaluation_escrow.py +547 -0
  60. agent_evolve/application/evaluation_recourse.py +253 -0
  61. agent_evolve/application/event_recorder.py +151 -0
  62. agent_evolve/application/evolution_campaign.py +1840 -0
  63. agent_evolve/application/executable_hypothesis.py +323 -0
  64. agent_evolve/application/factorial_branch_pilot.py +772 -0
  65. agent_evolve/application/finite_acquisition_capacity_recourse.py +672 -0
  66. agent_evolve/application/finite_acquisition_residual_expert.py +373 -0
  67. agent_evolve/application/finite_acquisition_variation_envelope.py +802 -0
  68. agent_evolve/application/finite_action_hypothesis_semantics.py +446 -0
  69. agent_evolve/application/finite_action_selection.py +188 -0
  70. agent_evolve/application/finite_action_set.py +306 -0
  71. agent_evolve/application/finite_action_transition.py +537 -0
  72. agent_evolve/application/finite_variation_eligibility.py +296 -0
  73. agent_evolve/application/forecast_geometry_portfolio.py +799 -0
  74. agent_evolve/application/forecast_opportunity_shadow_calibration.py +316 -0
  75. agent_evolve/application/front_proximity_admission.py +311 -0
  76. agent_evolve/application/front_proximity_parent_basis.py +458 -0
  77. agent_evolve/application/frozen_hurdle_score.py +659 -0
  78. agent_evolve/application/g3_causal_screen.py +2257 -0
  79. agent_evolve/application/g3_causal_validation.py +1046 -0
  80. agent_evolve/application/g3_postseal_curation.py +818 -0
  81. agent_evolve/application/gated_agentic_generator.py +205 -0
  82. agent_evolve/application/generation_feedback.py +293 -0
  83. agent_evolve/application/generative_proposal_journal.py +185 -0
  84. agent_evolve/application/geometry_conditional_elasticity.py +453 -0
  85. agent_evolve/application/global_wave_action_allocation.py +1151 -0
  86. agent_evolve/application/head_mass_conditional_seat.py +268 -0
  87. agent_evolve/application/identifiable_reflection_evidence.py +1147 -0
  88. agent_evolve/application/identifiable_reflection_learning.py +395 -0
  89. agent_evolve/application/identifiable_reflection_request.py +364 -0
  90. agent_evolve/application/in_memory_residual_archive.py +341 -0
  91. agent_evolve/application/insight_memory.py +1804 -0
  92. agent_evolve/application/live_runtime_manifest.py +758 -0
  93. agent_evolve/application/llm_task_queue.py +769 -0
  94. agent_evolve/application/matched_finite_action_block.py +409 -0
  95. agent_evolve/application/materialized_action_broker.py +2328 -0
  96. agent_evolve/application/materialized_action_constraints.py +83 -0
  97. agent_evolve/application/materialized_variation.py +211 -0
  98. agent_evolve/application/multi_option_evolution.py +1536 -0
  99. agent_evolve/application/outcome_adaptive_action_racing.py +2827 -0
  100. agent_evolve/application/outcome_adaptive_residual_campaign_runtime.py +580 -0
  101. agent_evolve/application/outcome_adaptive_residual_portfolio_evolution.py +3671 -0
  102. agent_evolve/application/outcome_conditioned_portfolio_selection.py +1374 -0
  103. agent_evolve/application/outcome_relation.py +193 -0
  104. agent_evolve/application/paired_allocation_comparison.py +241 -0
  105. agent_evolve/application/paired_block_schedule.py +127 -0
  106. agent_evolve/application/parent_measurement.py +226 -0
  107. agent_evolve/application/pareto_archive.py +811 -0
  108. agent_evolve/application/portfolio_campaign_runtime.py +4739 -0
  109. agent_evolve/application/portfolio_evolution.py +2950 -0
  110. agent_evolve/application/portfolio_hypothesis_observations.py +814 -0
  111. agent_evolve/application/portfolio_memory_attribution.py +581 -0
  112. agent_evolve/application/portfolio_memory_dose.py +788 -0
  113. agent_evolve/application/portfolio_memory_matched_control.py +938 -0
  114. agent_evolve/application/portfolio_memory_transfer.py +297 -0
  115. agent_evolve/application/portfolio_optimization_memory.py +363 -0
  116. agent_evolve/application/portfolio_outcome_feedback.py +1613 -0
  117. agent_evolve/application/portfolio_projection.py +335 -0
  118. agent_evolve/application/portfolio_recombination.py +2032 -0
  119. agent_evolve/application/post_evolution_reflection.py +834 -0
  120. agent_evolve/application/postcommit_rank_authority.py +245 -0
  121. agent_evolve/application/precommitted_portfolio_racing.py +2762 -0
  122. agent_evolve/application/prequential_archive_opportunity_calibration.py +1154 -0
  123. agent_evolve/application/prequential_residual_exploration.py +343 -0
  124. agent_evolve/application/prequential_score_portfolio.py +954 -0
  125. agent_evolve/application/projections.py +292 -0
  126. agent_evolve/application/protected_action_committee.py +1027 -0
  127. agent_evolve/application/protected_branch_pilot.py +376 -0
  128. agent_evolve/application/protected_current_prefix_forecast_opportunity.py +552 -0
  129. agent_evolve/application/provider_replay.py +910 -0
  130. agent_evolve/application/rank_balanced_causal_pilot.py +1372 -0
  131. agent_evolve/application/recombination_residual_expert.py +403 -0
  132. agent_evolve/application/reflection_workflow.py +571 -0
  133. agent_evolve/application/region_conditional_credit.py +911 -0
  134. agent_evolve/application/residual_campaign_runtime.py +531 -0
  135. agent_evolve/application/residual_headroom_campaign_runtime.py +459 -0
  136. agent_evolve/application/residual_headroom_ledger.py +1544 -0
  137. agent_evolve/application/residual_learning_transaction.py +396 -0
  138. agent_evolve/application/residual_portfolio_evolution.py +1228 -0
  139. agent_evolve/application/residual_reachability.py +749 -0
  140. agent_evolve/application/residual_stage_credit.py +499 -0
  141. agent_evolve/application/same_prefix_paired_audit.py +1580 -0
  142. agent_evolve/application/semantic_coverage_score_portfolio.py +838 -0
  143. agent_evolve/application/sequential_lineage_allocation.py +1017 -0
  144. agent_evolve/application/sequential_market_replay.py +1395 -0
  145. agent_evolve/application/sequential_residual_campaign_runtime.py +305 -0
  146. agent_evolve/application/sequential_residual_portfolio_evolution.py +940 -0
  147. agent_evolve/application/single_score_action_allocation.py +299 -0
  148. agent_evolve/application/source_exposure_allocation.py +906 -0
  149. agent_evolve/application/staged_memory.py +210 -0
  150. agent_evolve/application/stratified_cold_start_allocation.py +732 -0
  151. agent_evolve/application/support_guarded_hurdle_score.py +549 -0
  152. agent_evolve/application/target_conditioned_action_forecast.py +595 -0
  153. agent_evolve/application/target_conditioned_campaign.py +566 -0
  154. agent_evolve/application/treatment_assignment.py +201 -0
  155. agent_evolve/application/trusted_objective_evidence.py +217 -0
  156. agent_evolve/application/two_stage_action_evolution.py +1131 -0
  157. agent_evolve/application/v8lite_allocation_policy.py +1083 -0
  158. agent_evolve/application/v9_candidate_policy.py +1303 -0
  159. agent_evolve/bootstrap.py +108 -0
  160. agent_evolve/campaign_presets.py +517 -0
  161. agent_evolve/campaign_profiles.py +452 -0
  162. agent_evolve/campaign_variation_topology.py +288 -0
  163. agent_evolve/campaign_workload.py +950 -0
  164. agent_evolve/cli.py +797 -0
  165. agent_evolve/contract.py +241 -0
  166. agent_evolve/core/__init__.py +91 -0
  167. agent_evolve/core/action_semantics.py +411 -0
  168. agent_evolve/core/authored.py +105 -0
  169. agent_evolve/core/formatting.py +286 -0
  170. agent_evolve/core/optimization_semantics.py +324 -0
  171. agent_evolve/core/problem.py +167 -0
  172. agent_evolve/core/results.py +323 -0
  173. agent_evolve/core/stats.py +70 -0
  174. agent_evolve/core/telemetry.py +100 -0
  175. agent_evolve/domain/__init__.py +89 -0
  176. agent_evolve/domain/artifact.py +162 -0
  177. agent_evolve/domain/durable_text.py +68 -0
  178. agent_evolve/domain/event.py +1454 -0
  179. agent_evolve/domain/finite_action_set.py +426 -0
  180. agent_evolve/domain/finite_variation.py +526 -0
  181. agent_evolve/domain/generative_emission.py +559 -0
  182. agent_evolve/domain/ids.py +163 -0
  183. agent_evolve/domain/inline_text.py +106 -0
  184. agent_evolve/domain/insight.py +27 -0
  185. agent_evolve/domain/lineage.py +737 -0
  186. agent_evolve/domain/llm_task_queue.py +960 -0
  187. agent_evolve/domain/outcome.py +96 -0
  188. agent_evolve/domain/patch.py +854 -0
  189. agent_evolve/domain/typed_json.py +542 -0
  190. agent_evolve/domain/variation_space.py +158 -0
  191. agent_evolve/driver.py +1014 -0
  192. agent_evolve/harness/__init__.py +29 -0
  193. agent_evolve/harness/base.py +242 -0
  194. agent_evolve/harness/directives.py +163 -0
  195. agent_evolve/harness/generative_seal.py +479 -0
  196. agent_evolve/harness/registry.py +41 -0
  197. agent_evolve/infrastructure/__init__.py +39 -0
  198. agent_evolve/infrastructure/artifacts/__init__.py +6 -0
  199. agent_evolve/infrastructure/artifacts/_verification.py +67 -0
  200. agent_evolve/infrastructure/artifacts/filesystem.py +343 -0
  201. agent_evolve/infrastructure/artifacts/in_memory.py +73 -0
  202. agent_evolve/infrastructure/asyncio_runtime.py +109 -0
  203. agent_evolve/infrastructure/authored_runtime.py +188 -0
  204. agent_evolve/infrastructure/authored_worker.py +171 -0
  205. agent_evolve/infrastructure/clock.py +53 -0
  206. agent_evolve/infrastructure/events/__init__.py +6 -0
  207. agent_evolve/infrastructure/events/_validation.py +89 -0
  208. agent_evolve/infrastructure/events/in_memory.py +56 -0
  209. agent_evolve/infrastructure/events/jsonl.py +193 -0
  210. agent_evolve/infrastructure/exception_provenance.py +215 -0
  211. agent_evolve/infrastructure/ids.py +118 -0
  212. agent_evolve/infrastructure/lineage_codec.py +1836 -0
  213. agent_evolve/infrastructure/outcome_adaptive_phase_journal.py +170 -0
  214. agent_evolve/infrastructure/residual_headroom_journal.py +221 -0
  215. agent_evolve/infrastructure/resource_lease.py +370 -0
  216. agent_evolve/infrastructure/sanitization/__init__.py +8 -0
  217. agent_evolve/infrastructure/sanitization/strict_json.py +484 -0
  218. agent_evolve/infrastructure/sequential_phase_journal.py +170 -0
  219. agent_evolve/infrastructure/stream_liveness.py +383 -0
  220. agent_evolve/infrastructure/subprocess_boundary.py +136 -0
  221. agent_evolve/integrations/__init__.py +1 -0
  222. agent_evolve/integrations/botorch/__init__.py +28 -0
  223. agent_evolve/integrations/botorch/finite_qlognehvi.py +190 -0
  224. agent_evolve/integrations/botorch/finite_qlognehvi_batch.py +155 -0
  225. agent_evolve/integrations/botorch/finite_qlognehvi_batch_identity.py +20 -0
  226. agent_evolve/integrations/botorch/finite_qlognehvi_batch_worker.py +55 -0
  227. agent_evolve/integrations/botorch/finite_qlognehvi_identity.py +22 -0
  228. agent_evolve/integrations/botorch/finite_qlognehvi_worker.py +55 -0
  229. agent_evolve/integrations/botorch/subprocess_qlognehvi.py +261 -0
  230. agent_evolve/integrations/botorch/subprocess_qlognehvi_batch.py +273 -0
  231. agent_evolve/integrations/completion.py +242 -0
  232. agent_evolve/integrations/pydantic_ai/__init__.py +441 -0
  233. agent_evolve/integrations/pydantic_ai/action_forecast.py +1068 -0
  234. agent_evolve/integrations/pydantic_ai/agentic_generator.py +2308 -0
  235. agent_evolve/integrations/pydantic_ai/async_generator.py +1604 -0
  236. agent_evolve/integrations/pydantic_ai/boundary_codec.py +1526 -0
  237. agent_evolve/integrations/pydantic_ai/calibrated_portfolio_campaign.py +756 -0
  238. agent_evolve/integrations/pydantic_ai/calibrated_portfolio_selection.py +7537 -0
  239. agent_evolve/integrations/pydantic_ai/campaign_acquisition.py +609 -0
  240. agent_evolve/integrations/pydantic_ai/execution_binding.py +138 -0
  241. agent_evolve/integrations/pydantic_ai/forecast_geometry_action_committee.py +217 -0
  242. agent_evolve/integrations/pydantic_ai/harness.py +159 -0
  243. agent_evolve/integrations/pydantic_ai/heterogeneous_model_execution.py +306 -0
  244. agent_evolve/integrations/pydantic_ai/hierarchical_residual_adaptive_semantic_view.py +179 -0
  245. agent_evolve/integrations/pydantic_ai/json_schema_dialect.py +108 -0
  246. agent_evolve/integrations/pydantic_ai/materialized_hierarchical_residual_expert.py +952 -0
  247. agent_evolve/integrations/pydantic_ai/materialized_portfolio_judge.py +520 -0
  248. agent_evolve/integrations/pydantic_ai/model_execution_profile.py +659 -0
  249. agent_evolve/integrations/pydantic_ai/outbound_request_manifest.py +1170 -0
  250. agent_evolve/integrations/pydantic_ai/portable_residual_consequence_features.py +575 -0
  251. agent_evolve/integrations/pydantic_ai/portfolio_selection.py +422 -0
  252. agent_evolve/integrations/pydantic_ai/progress_aware_openrouter.py +416 -0
  253. agent_evolve/integrations/pydantic_ai/provider_attempt_join.py +1523 -0
  254. agent_evolve/integrations/pydantic_ai/provider_free_calibrated_runner.py +607 -0
  255. agent_evolve/integrations/pydantic_ai/queued_runner.py +2634 -0
  256. agent_evolve/integrations/pydantic_ai/reconciled_residual_reachability.py +1417 -0
  257. agent_evolve/integrations/pydantic_ai/residual_forecast_geometry.py +445 -0
  258. agent_evolve/integrations/pydantic_ai/residual_reachability.py +674 -0
  259. agent_evolve/integrations/pydantic_ai/residual_semantic_cells.py +239 -0
  260. agent_evolve/integrations/pydantic_ai/sealed_output_replay.py +1068 -0
  261. agent_evolve/integrations/pydantic_ai/semantic_coverage_residual_portfolio.py +770 -0
  262. agent_evolve/integrations/pydantic_ai/semantic_decision_replay.py +383 -0
  263. agent_evolve/integrations/pydantic_ai/support_adaptive_residual_portfolio.py +135 -0
  264. agent_evolve/integrations/pydantic_ai/trusted_residual_prompt_context.py +143 -0
  265. agent_evolve/integrations/pydantic_ai/validated_openrouter_model.py +107 -0
  266. agent_evolve/integrations/pymoo_adapter.py +242 -0
  267. agent_evolve/policies/__init__.py +17 -0
  268. agent_evolve/policies/check.py +469 -0
  269. agent_evolve/policies/emit_scaffold.py +451 -0
  270. agent_evolve/policies/feedback/__init__.py +37 -0
  271. agent_evolve/policies/feedback/held_out_asn.py +1325 -0
  272. agent_evolve/policies/genetic.py +607 -0
  273. agent_evolve/policies/llm_backoff.py +183 -0
  274. agent_evolve/policies/llm_chooser.py +226 -0
  275. agent_evolve/policies/llm_generator.py +1760 -0
  276. agent_evolve/policies/llm_init.py +267 -0
  277. agent_evolve/policies/llm_operator.py +109 -0
  278. agent_evolve/policies/llm_prior.py +194 -0
  279. agent_evolve/policies/llm_surrogate.py +334 -0
  280. agent_evolve/policies/measurement_evidence.py +704 -0
  281. agent_evolve/policies/memory/__init__.py +223 -0
  282. agent_evolve/policies/memory/balanced_subset_blocks.py +707 -0
  283. agent_evolve/policies/memory/compatibility_matching.py +593 -0
  284. agent_evolve/policies/memory/global_falsification.py +1841 -0
  285. agent_evolve/policies/memory/prompt_shape.py +503 -0
  286. agent_evolve/policies/memory/randomized_subset.py +714 -0
  287. agent_evolve/policies/memory/staged_causal.py +1270 -0
  288. agent_evolve/policies/memory/treatment_compliance.py +759 -0
  289. agent_evolve/policies/objective_resolution/__init__.py +17 -0
  290. agent_evolve/policies/objective_resolution/fixed_grid.py +364 -0
  291. agent_evolve/policies/operator_portfolio.py +407 -0
  292. agent_evolve/policies/reguidance.py +1133 -0
  293. agent_evolve/policies/reward/__init__.py +83 -0
  294. agent_evolve/policies/reward/affine_candidate_consequence.py +156 -0
  295. agent_evolve/policies/reward/affine_candidate_consequence_3d.py +159 -0
  296. agent_evolve/policies/reward/affine_hypervolume.py +490 -0
  297. agent_evolve/policies/reward/affine_hypervolume_3d.py +567 -0
  298. agent_evolve/policies/reward/contextual_marginal_utility.py +318 -0
  299. agent_evolve/policies/reward/frozen_archive.py +360 -0
  300. agent_evolve/policies/reward/frozen_wave_archive.py +368 -0
  301. agent_evolve/policies/search_state.py +208 -0
  302. agent_evolve/policies/selection/__init__.py +345 -0
  303. agent_evolve/policies/selection/acquisition_certified_slate.py +684 -0
  304. agent_evolve/policies/selection/affine_frontier_context.py +330 -0
  305. agent_evolve/policies/selection/affine_frontier_target.py +473 -0
  306. agent_evolve/policies/selection/archive_elite.py +1346 -0
  307. agent_evolve/policies/selection/calibrated_portfolio_binding.py +640 -0
  308. agent_evolve/policies/selection/calibrated_slate.py +1394 -0
  309. agent_evolve/policies/selection/calibrated_slate_codec.py +579 -0
  310. agent_evolve/policies/selection/common_candidate_pool.py +685 -0
  311. agent_evolve/policies/selection/diagnostic_sampling.py +319 -0
  312. agent_evolve/policies/selection/disjoint_pairs.py +479 -0
  313. agent_evolve/policies/selection/elite_explorer.py +719 -0
  314. agent_evolve/policies/selection/finite_action.py +187 -0
  315. agent_evolve/policies/selection/finite_option_prompt_projection.py +377 -0
  316. agent_evolve/policies/selection/finite_palette_evidence.py +247 -0
  317. agent_evolve/policies/selection/forecast_calibration.py +922 -0
  318. agent_evolve/policies/selection/frontier_probe_slate.py +814 -0
  319. agent_evolve/policies/selection/frozen_archive_pairs.py +762 -0
  320. agent_evolve/policies/selection/full_support_slate.py +91 -0
  321. agent_evolve/policies/selection/meaningful_direction.py +240 -0
  322. agent_evolve/policies/selection/memory_dose_feasibility.py +259 -0
  323. agent_evolve/policies/selection/model_anchored_slate.py +826 -0
  324. agent_evolve/policies/selection/phenotype_recourse.py +979 -0
  325. agent_evolve/policies/selection/proposal_support.py +368 -0
  326. agent_evolve/policies/selection/random_portfolio.py +254 -0
  327. agent_evolve/policies/selection/regret_bounded_slate.py +1084 -0
  328. agent_evolve/policies/selection/residual_frontier.py +463 -0
  329. agent_evolve/policies/selection/residual_frontier_target.py +605 -0
  330. agent_evolve/policies/selection/structural_posterior_slate.py +1571 -0
  331. agent_evolve/policies/selection/target_conditioned_allocator.py +648 -0
  332. agent_evolve/policies/selection/target_conditioned_features.py +812 -0
  333. agent_evolve/policies/selection/target_conditioned_prequential.py +1527 -0
  334. agent_evolve/policies/selection/task_keyed_palette.py +906 -0
  335. agent_evolve/policies/semantics.py +147 -0
  336. agent_evolve/policies/structure.py +362 -0
  337. agent_evolve/policies/structured_output_budget.py +62 -0
  338. agent_evolve/policies/surrogate.py +696 -0
  339. agent_evolve/policies/variation/__init__.py +1 -0
  340. agent_evolve/policies/variation/compositional_finite_catalog.py +426 -0
  341. agent_evolve/policies/variation/crossover_inheritance.py +575 -0
  342. agent_evolve/policies/variation/disjoint_recombination.py +611 -0
  343. agent_evolve/policies/variation/exact_composition_capacity.py +214 -0
  344. agent_evolve/policies/variation/exact_parent_crossover.py +950 -0
  345. agent_evolve/policies/variation/multiscale_restart_catalog.py +372 -0
  346. agent_evolve/policies/variation/source_union_finite_catalog.py +403 -0
  347. agent_evolve/policies/variation/typed_patch.py +1981 -0
  348. agent_evolve/policies/weighted_prior.py +394 -0
  349. agent_evolve/ports/__init__.py +383 -0
  350. agent_evolve/ports/action_allocation.py +733 -0
  351. agent_evolve/ports/action_allocation_frame.py +1153 -0
  352. agent_evolve/ports/action_allocation_frame_commit.py +294 -0
  353. agent_evolve/ports/action_allocation_frame_commit_v3.py +432 -0
  354. agent_evolve/ports/action_allocation_frame_v3.py +995 -0
  355. agent_evolve/ports/action_forecast.py +1568 -0
  356. agent_evolve/ports/action_metric_projection.py +165 -0
  357. agent_evolve/ports/agentic_generator.py +1561 -0
  358. agent_evolve/ports/archive_context.py +136 -0
  359. agent_evolve/ports/artifact_sanitizer.py +44 -0
  360. agent_evolve/ports/artifact_store.py +225 -0
  361. agent_evolve/ports/clock.py +13 -0
  362. agent_evolve/ports/contextual_search_allocation.py +827 -0
  363. agent_evolve/ports/decision_metric_projection.py +258 -0
  364. agent_evolve/ports/event_store.py +55 -0
  365. agent_evolve/ports/executable_hypothesis.py +557 -0
  366. agent_evolve/ports/finite_acquisition.py +377 -0
  367. agent_evolve/ports/finite_acquisition_batch.py +296 -0
  368. agent_evolve/ports/finite_acquisition_batch_json.py +164 -0
  369. agent_evolve/ports/finite_acquisition_json.py +247 -0
  370. agent_evolve/ports/finite_acquisition_space.py +168 -0
  371. agent_evolve/ports/finite_action_selection.py +348 -0
  372. agent_evolve/ports/finite_action_set.py +256 -0
  373. agent_evolve/ports/frontier_target.py +396 -0
  374. agent_evolve/ports/generation_failure.py +43 -0
  375. agent_evolve/ports/hard_feasibility.py +233 -0
  376. agent_evolve/ports/id_factory.py +34 -0
  377. agent_evolve/ports/llm_task_queue.py +93 -0
  378. agent_evolve/ports/objective_resolution.py +419 -0
  379. agent_evolve/ports/paired_allocation_comparison.py +401 -0
  380. agent_evolve/ports/paired_block_schedule.py +475 -0
  381. agent_evolve/ports/parent_measurement.py +336 -0
  382. agent_evolve/ports/portfolio_memory_dose.py +643 -0
  383. agent_evolve/ports/portfolio_selection.py +3169 -0
  384. agent_evolve/ports/postcommit_rank_authority.py +467 -0
  385. agent_evolve/ports/presented_action_evidence.py +794 -0
  386. agent_evolve/ports/resource_lease.py +162 -0
  387. agent_evolve/ports/structured_generator.py +734 -0
  388. agent_evolve/ports/structured_output_budget.py +120 -0
  389. agent_evolve/ports/subprocess_boundary.py +138 -0
  390. agent_evolve/ports/treatment_assignment.py +466 -0
  391. agent_evolve/ports/variation_catalog.py +76 -0
  392. agent_evolve/ports/variation_source.py +226 -0
  393. agent_evolve/proposal_mode.py +157 -0
  394. agent_evolve/proposers/__init__.py +10 -0
  395. agent_evolve/proposers/random_proposer.py +188 -0
  396. agent_evolve/provider_accounting.py +163 -0
  397. agent_evolve/py.typed +0 -0
  398. agent_evolve/reference_method.py +1570 -0
  399. agent_evolve/session/__init__.py +11 -0
  400. agent_evolve/session/authorship.py +864 -0
  401. agent_evolve/session/evaluate.py +236 -0
  402. agent_evolve/session/fidelity.py +237 -0
  403. agent_evolve/session/genetic_loop.py +742 -0
  404. agent_evolve/session/loop.py +803 -0
  405. agent_evolve/session/screening.py +671 -0
  406. agent_evolve/settings.py +376 -0
  407. agent_evolve/workload_kit.py +368 -0
  408. agent_evolve/workload_prompt.py +398 -0
  409. agentevolve_optimizer-0.5.0.dist-info/METADATA +599 -0
  410. agentevolve_optimizer-0.5.0.dist-info/RECORD +414 -0
  411. agentevolve_optimizer-0.5.0.dist-info/WHEEL +5 -0
  412. agentevolve_optimizer-0.5.0.dist-info/entry_points.txt +2 -0
  413. agentevolve_optimizer-0.5.0.dist-info/licenses/LICENSE +21 -0
  414. agentevolve_optimizer-0.5.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,484 @@
1
+ """Fail-closed proof that a model call has a real finite choice set.
2
+
3
+ Prompt text can advertise many actions while an exact treatment contract leaves
4
+ only one executable choice. This module audits the application-layer
5
+ ``InvocationPlan`` instead of trusting prose or an adapter schema. A passing
6
+ receipt proves that one outcome-blind ``FiniteActionSetAuthority`` supplies at
7
+ least the configured number of distinct children and phenotypes, that the plan
8
+ uses that exact support contract, and that the authority's card is the plan's
9
+ only explicit memory assignment.
10
+
11
+ The generic generator request currently carries the finite variation contract
12
+ but not the provider adapter's rendered output enum. Consequently this module
13
+ does not claim to validate that enum and deliberately has no PydanticAI import.
14
+ That final adapter/trace equality check belongs at a boundary which exposes the
15
+ rendered schema as a typed value.
16
+ """
17
+
18
+ from __future__ import annotations
19
+
20
+ import hashlib
21
+ import json
22
+ import re
23
+ from dataclasses import dataclass
24
+ from enum import Enum
25
+
26
+ from agent_evolve.application.agentic_evolution import (
27
+ InvocationPlan,
28
+ MutationResponseMode,
29
+ )
30
+ from agent_evolve.domain.finite_action_set import FiniteActionSetAuthority
31
+ from agent_evolve.domain.finite_variation import (
32
+ FiniteVariationContract,
33
+ validate_finite_variation_contract,
34
+ )
35
+ from agent_evolve.domain.ids import CandidateId
36
+ from agent_evolve.domain.insight import InsightRef
37
+ from agent_evolve.domain.patch import require_sha256
38
+ from agent_evolve.policies.memory.staged_causal import ResolvedInsightAssignment
39
+
40
+
41
+ _TOKEN = re.compile(r"^[a-z][a-z0-9_.-]{0,95}$")
42
+ _PLAN_BINDING_DOMAIN = b"agent-evolve:effective-choice-plan-binding:v1\x00"
43
+ _QUARANTINE_BINDING_DOMAIN = b"agent-evolve:effective-choice-quarantine-binding:v1\x00"
44
+ _RECEIPT_DOMAIN = b"agent-evolve:effective-choice-audit-receipt:v1\x00"
45
+
46
+ EFFECTIVE_CHOICE_AUDIT_POLICY_ID = "effective_finite_choice_audit"
47
+ EFFECTIVE_CHOICE_AUDIT_POLICY_VERSION = 1
48
+ EFFECTIVE_CHOICE_AUDIT_DEFINITION_SHA256 = hashlib.sha256(
49
+ b"agent-evolve:effective-finite-choice-audit:v1;authority-required;"
50
+ b"configured-minimum-cardinality;exact-plan-support-contract;"
51
+ b"no-exact-treatment-or-compilation;outcome-blind;single-card-binding;"
52
+ b"unique-option-option-identity-child-and-phenotype-identities"
53
+ ).hexdigest()
54
+
55
+
56
+ def _canonical_json(value: object) -> bytes:
57
+ return json.dumps(
58
+ value,
59
+ ensure_ascii=True,
60
+ allow_nan=False,
61
+ separators=(",", ":"),
62
+ sort_keys=True,
63
+ ).encode("ascii")
64
+
65
+
66
+ def _hash(domain: bytes, record: object) -> str:
67
+ return hashlib.sha256(domain + _canonical_json(record)).hexdigest()
68
+
69
+
70
+ def _ref_record(reference: InsightRef) -> dict[str, object]:
71
+ return {
72
+ "insight_id": reference.insight_id.value,
73
+ "version": reference.version,
74
+ }
75
+
76
+
77
+ class EffectiveChoiceAuditError(ValueError):
78
+ """The admitted plan does not expose the claimed effective choice set."""
79
+
80
+
81
+ class SelectedCardBindingMode(str, Enum):
82
+ """Which explicit, replayable plan field selected the authority's card."""
83
+
84
+ RESOLVED_ASSIGNMENT = "resolved_assignment"
85
+ EXPLICIT_QUARANTINE = "explicit_quarantine"
86
+
87
+
88
+ @dataclass(frozen=True, slots=True)
89
+ class EffectiveChoiceAuditReceipt:
90
+ """Immutable proof of one plan's effective finite-choice cardinality."""
91
+
92
+ configured_minimum_cardinality: int
93
+ generation: int
94
+ invocation_label: str
95
+ parent_candidate_id: CandidateId
96
+ parent_configuration_sha256: str
97
+ selected_card_reference: InsightRef
98
+ selected_card_binding_mode: SelectedCardBindingMode
99
+ selected_card_binding_sha256: str
100
+ authority_sha256: str
101
+ support_sha256: str
102
+ presentation_sha256: str
103
+ plan_contract_sha256: str
104
+ authority_contract_sha256: str
105
+ outcome_blind: bool
106
+ exact_treatment_fields_absent: bool
107
+ effective_cardinality: int
108
+ option_ids: tuple[str, ...]
109
+ option_identity_sha256s: tuple[str, ...]
110
+ child_configuration_sha256s: tuple[str, ...]
111
+ phenotype_identity_sha256s: tuple[str, ...]
112
+ audited_plan_sha256: str
113
+ policy_id: str = EFFECTIVE_CHOICE_AUDIT_POLICY_ID
114
+ policy_version: int = EFFECTIVE_CHOICE_AUDIT_POLICY_VERSION
115
+ policy_definition_sha256: str = EFFECTIVE_CHOICE_AUDIT_DEFINITION_SHA256
116
+ receipt_sha256: str = ""
117
+
118
+ def __post_init__(self) -> None:
119
+ if (
120
+ type(self.configured_minimum_cardinality) is not int
121
+ or self.configured_minimum_cardinality < 2
122
+ ):
123
+ raise ValueError("configured minimum cardinality must be at least two")
124
+ if type(self.generation) is not int or self.generation <= 0:
125
+ raise ValueError("audited generation must be positive")
126
+ if (
127
+ type(self.invocation_label) is not str
128
+ or not self.invocation_label
129
+ or self.invocation_label != self.invocation_label.strip()
130
+ ):
131
+ raise ValueError("audited invocation_label must be canonical")
132
+ if type(self.parent_candidate_id) is not CandidateId:
133
+ raise TypeError("audit parent_candidate_id must be exact")
134
+ CandidateId.__post_init__(self.parent_candidate_id)
135
+ if type(self.selected_card_reference) is not InsightRef:
136
+ raise TypeError("audit selected_card_reference must be exact")
137
+ InsightRef.__post_init__(self.selected_card_reference)
138
+ if type(self.selected_card_binding_mode) is not SelectedCardBindingMode:
139
+ raise TypeError("audit selected_card_binding_mode must be exact")
140
+ for name in (
141
+ "parent_configuration_sha256",
142
+ "selected_card_binding_sha256",
143
+ "authority_sha256",
144
+ "support_sha256",
145
+ "presentation_sha256",
146
+ "plan_contract_sha256",
147
+ "authority_contract_sha256",
148
+ "audited_plan_sha256",
149
+ "policy_definition_sha256",
150
+ ):
151
+ require_sha256(getattr(self, name), f"effective choice audit {name}")
152
+ if self.plan_contract_sha256 != self.authority_contract_sha256:
153
+ raise ValueError("audit plan and authority contract identities differ")
154
+ if type(self.outcome_blind) is not bool or not self.outcome_blind:
155
+ raise ValueError("effective choice audit must prove outcome blindness")
156
+ if (
157
+ type(self.exact_treatment_fields_absent) is not bool
158
+ or not self.exact_treatment_fields_absent
159
+ ):
160
+ raise ValueError("effective choice audit requires absent exact treatments")
161
+ if (
162
+ type(self.effective_cardinality) is not int
163
+ or self.effective_cardinality < self.configured_minimum_cardinality
164
+ ):
165
+ raise ValueError(
166
+ "effective choice cardinality is below its configured minimum"
167
+ )
168
+ count = self.effective_cardinality
169
+ if (
170
+ type(self.option_ids) is not tuple
171
+ or len(self.option_ids) != count
172
+ or any(type(value) is not str or not value for value in self.option_ids)
173
+ ):
174
+ raise ValueError("audit option_ids must cover the effective support")
175
+ if len(set(self.option_ids)) != count:
176
+ raise ValueError("effective option IDs must be unique")
177
+ for name in (
178
+ "option_identity_sha256s",
179
+ "child_configuration_sha256s",
180
+ "phenotype_identity_sha256s",
181
+ ):
182
+ values = getattr(self, name)
183
+ if type(values) is not tuple or len(values) != count:
184
+ raise ValueError(f"audit {name} must cover the effective support")
185
+ for value in values:
186
+ require_sha256(value, f"effective choice audit {name}")
187
+ if len(set(values)) != count:
188
+ raise ValueError(f"effective {name} must be unique")
189
+ if type(self.policy_id) is not str or _TOKEN.fullmatch(self.policy_id) is None:
190
+ raise ValueError("effective choice audit policy_id is invalid")
191
+ if type(self.policy_version) is not int or self.policy_version <= 0:
192
+ raise ValueError("effective choice audit policy_version must be positive")
193
+ expected = _hash(_RECEIPT_DOMAIN, self.to_record())
194
+ if self.receipt_sha256:
195
+ require_sha256(self.receipt_sha256, "effective choice audit receipt_sha256")
196
+ if self.receipt_sha256 != expected:
197
+ raise ValueError("effective choice audit receipt is not authentic")
198
+ else:
199
+ object.__setattr__(self, "receipt_sha256", expected)
200
+
201
+ def to_record(self) -> dict[str, object]:
202
+ return {
203
+ "schema_version": 1,
204
+ "policy_id": self.policy_id,
205
+ "policy_version": self.policy_version,
206
+ "policy_definition_sha256": self.policy_definition_sha256,
207
+ "configured_minimum_cardinality": self.configured_minimum_cardinality,
208
+ "generation": self.generation,
209
+ "invocation_label": self.invocation_label,
210
+ "parent_candidate_id": self.parent_candidate_id.value,
211
+ "parent_configuration_sha256": self.parent_configuration_sha256,
212
+ "selected_card_reference": _ref_record(self.selected_card_reference),
213
+ "selected_card_binding_mode": self.selected_card_binding_mode.value,
214
+ "selected_card_binding_sha256": self.selected_card_binding_sha256,
215
+ "authority_sha256": self.authority_sha256,
216
+ "support_sha256": self.support_sha256,
217
+ "presentation_sha256": self.presentation_sha256,
218
+ "plan_contract_sha256": self.plan_contract_sha256,
219
+ "authority_contract_sha256": self.authority_contract_sha256,
220
+ "outcome_blind": self.outcome_blind,
221
+ "exact_treatment_fields_absent": self.exact_treatment_fields_absent,
222
+ "effective_cardinality": self.effective_cardinality,
223
+ "option_ids": list(self.option_ids),
224
+ "option_identity_sha256s": list(self.option_identity_sha256s),
225
+ "child_configuration_sha256s": list(self.child_configuration_sha256s),
226
+ "phenotype_identity_sha256s": list(self.phenotype_identity_sha256s),
227
+ "audited_plan_sha256": self.audited_plan_sha256,
228
+ }
229
+
230
+
231
+ def _configured_minimum(value: int) -> int:
232
+ if type(value) is not int or value < 2:
233
+ raise ValueError("minimum_cardinality must be an exact integer of at least two")
234
+ return value
235
+
236
+
237
+ def _card_binding(
238
+ plan: InvocationPlan,
239
+ card_reference: InsightRef,
240
+ ) -> tuple[SelectedCardBindingMode, str]:
241
+ resolved = plan.resolved_insight_assignment
242
+ quarantine = plan.quarantine_test_insights
243
+ if resolved is not None:
244
+ if type(resolved) is not ResolvedInsightAssignment:
245
+ raise EffectiveChoiceAuditError("resolved card assignment is not exact")
246
+ ResolvedInsightAssignment.__post_init__(resolved)
247
+ if quarantine or resolved.selection_decision.selected != (card_reference,):
248
+ raise EffectiveChoiceAuditError(
249
+ "resolved assignment does not select exactly the authority card"
250
+ )
251
+ return SelectedCardBindingMode.RESOLVED_ASSIGNMENT, resolved.assignment_sha256
252
+ if quarantine != (card_reference,):
253
+ raise EffectiveChoiceAuditError(
254
+ "explicit quarantine does not select exactly the authority card"
255
+ )
256
+ return (
257
+ SelectedCardBindingMode.EXPLICIT_QUARANTINE,
258
+ _hash(
259
+ _QUARANTINE_BINDING_DOMAIN,
260
+ {
261
+ "mode": SelectedCardBindingMode.EXPLICIT_QUARANTINE.value,
262
+ "reference": _ref_record(card_reference),
263
+ },
264
+ ),
265
+ )
266
+
267
+
268
+ def _plan_binding_record(
269
+ *,
270
+ plan: InvocationPlan,
271
+ authority: FiniteActionSetAuthority,
272
+ binding_mode: SelectedCardBindingMode,
273
+ binding_sha256: str,
274
+ option_ids: tuple[str, ...],
275
+ option_identity_sha256s: tuple[str, ...],
276
+ child_configuration_sha256s: tuple[str, ...],
277
+ phenotype_identity_sha256s: tuple[str, ...],
278
+ ) -> dict[str, object]:
279
+ parent = plan.parents[0]
280
+ contract = plan.finite_variation_contract
281
+ assert contract is not None
282
+ return {
283
+ "schema_version": 1,
284
+ "generation": plan.generation,
285
+ "invocation_label": plan.label,
286
+ "operator_kind": plan.operator_kind.value,
287
+ "mutation_response_mode": plan.mutation_response_mode.value,
288
+ "parent_candidate_id": parent.candidate_id.value,
289
+ "parent_configuration_sha256": parent.occurrence.configuration_hash,
290
+ "plan_contract_sha256": contract.identity_sha256,
291
+ "authority_sha256": authority.authority_sha256,
292
+ "support_sha256": authority.support.support_sha256,
293
+ "presentation_sha256": authority.support.presentation.presentation_sha256,
294
+ "selected_card_reference": _ref_record(authority.card.reference),
295
+ "selected_card_binding_mode": binding_mode.value,
296
+ "selected_card_binding_sha256": binding_sha256,
297
+ "use_memory": plan.use_memory,
298
+ "exact_treatment_fields_present": {
299
+ "insight_treatment_requirement": (
300
+ plan.insight_treatment_requirement is not None
301
+ ),
302
+ "compiled_hypothesis_treatment": (
303
+ plan.compiled_hypothesis_treatment is not None
304
+ ),
305
+ "compiled_hypothesis_eligibility": bool(
306
+ plan.compiled_hypothesis_eligibility
307
+ ),
308
+ },
309
+ "current_outcome_access": authority.current_outcome_access,
310
+ "option_ids": list(option_ids),
311
+ "option_identity_sha256s": list(option_identity_sha256s),
312
+ "child_configuration_sha256s": list(child_configuration_sha256s),
313
+ "phenotype_identity_sha256s": list(phenotype_identity_sha256s),
314
+ }
315
+
316
+
317
+ def audit_effective_choice_plan(
318
+ plan: InvocationPlan,
319
+ *,
320
+ minimum_cardinality: int,
321
+ ) -> EffectiveChoiceAuditReceipt:
322
+ """Validate and seal one real, outcome-blind K-choice plan.
323
+
324
+ The configured minimum is deliberately explicit: an experiment requesting
325
+ K=8 must not silently accept the domain type's lower bound of four.
326
+ """
327
+
328
+ minimum = _configured_minimum(minimum_cardinality)
329
+ if type(plan) is not InvocationPlan:
330
+ raise TypeError("effective choice audit requires an exact InvocationPlan")
331
+ try:
332
+ InvocationPlan.__post_init__(plan)
333
+ except (TypeError, ValueError) as exc:
334
+ raise EffectiveChoiceAuditError(
335
+ "invocation plan failed its application-layer contract"
336
+ ) from exc
337
+ authority = plan.finite_action_set_authority
338
+ if authority is None:
339
+ raise EffectiveChoiceAuditError("finite action authority is absent")
340
+ if type(authority) is not FiniteActionSetAuthority:
341
+ raise EffectiveChoiceAuditError("finite action authority is not exact")
342
+ try:
343
+ FiniteActionSetAuthority.__post_init__(authority)
344
+ except (TypeError, ValueError) as exc:
345
+ raise EffectiveChoiceAuditError("finite action authority is invalid") from exc
346
+ if (
347
+ plan.mutation_response_mode
348
+ is not MutationResponseMode.FINITE_OPTION_SELECTION_V1
349
+ ):
350
+ raise EffectiveChoiceAuditError("plan is not an opaque finite-option selection")
351
+ contract = plan.finite_variation_contract
352
+ if type(contract) is not FiniteVariationContract:
353
+ raise EffectiveChoiceAuditError("plan finite variation contract is absent")
354
+ try:
355
+ validate_finite_variation_contract(contract)
356
+ except (TypeError, ValueError) as exc:
357
+ raise EffectiveChoiceAuditError(
358
+ "plan finite variation contract is invalid"
359
+ ) from exc
360
+ support = authority.support
361
+ authority_contract = support.support_contract
362
+ if (
363
+ contract != authority_contract
364
+ or contract.identity_sha256 != authority_contract.identity_sha256
365
+ ):
366
+ raise EffectiveChoiceAuditError(
367
+ "plan contract differs from the authority support contract"
368
+ )
369
+ if (
370
+ plan.insight_treatment_requirement is not None
371
+ or plan.compiled_hypothesis_treatment is not None
372
+ or plan.compiled_hypothesis_eligibility
373
+ ):
374
+ raise EffectiveChoiceAuditError(
375
+ "finite-choice plan retains an exact treatment or compilation"
376
+ )
377
+ if plan.use_memory:
378
+ raise EffectiveChoiceAuditError(
379
+ "finite-choice plan must bind one explicit card before admission"
380
+ )
381
+ if authority.current_outcome_access is not False:
382
+ raise EffectiveChoiceAuditError("finite action authority is not outcome-blind")
383
+ parent = plan.parents[0]
384
+ if (
385
+ support.parent_candidate_id != parent.candidate_id
386
+ or support.parent_configuration_sha256 != parent.occurrence.configuration_hash
387
+ or support.support_contract.parent_configuration != parent.configuration
388
+ ):
389
+ raise EffectiveChoiceAuditError("finite support is bound to a foreign parent")
390
+ binding_mode, binding_sha256 = _card_binding(plan, authority.card.reference)
391
+ options = support.options
392
+ cardinality = len(options)
393
+ if cardinality < minimum or support.compatible_option_count != cardinality:
394
+ raise EffectiveChoiceAuditError(
395
+ "effective finite-choice cardinality is below its configured minimum"
396
+ )
397
+ option_ids = tuple(value.option.option_id for value in options)
398
+ option_identity_sha256s = tuple(value.option.identity_sha256 for value in options)
399
+ child_configuration_sha256s = tuple(
400
+ value.option.child_configuration_sha256 for value in options
401
+ )
402
+ phenotype_identity_sha256s = tuple(
403
+ value.phenotype_identity_sha256 for value in options
404
+ )
405
+ for name, values in (
406
+ ("option IDs", option_ids),
407
+ ("option identities", option_identity_sha256s),
408
+ ("child configurations", child_configuration_sha256s),
409
+ ("phenotype identities", phenotype_identity_sha256s),
410
+ ):
411
+ if len(values) != cardinality or len(set(values)) != cardinality:
412
+ raise EffectiveChoiceAuditError(
413
+ f"effective finite support does not have K unique {name}"
414
+ )
415
+ if tuple(value.option for value in options) != contract.options:
416
+ raise EffectiveChoiceAuditError(
417
+ "authority option records differ from the plan contract"
418
+ )
419
+ if support.presentation.ordered_option_ids != option_ids:
420
+ raise EffectiveChoiceAuditError(
421
+ "provider presentation does not expose the full authority support"
422
+ )
423
+ plan_record = _plan_binding_record(
424
+ plan=plan,
425
+ authority=authority,
426
+ binding_mode=binding_mode,
427
+ binding_sha256=binding_sha256,
428
+ option_ids=option_ids,
429
+ option_identity_sha256s=option_identity_sha256s,
430
+ child_configuration_sha256s=child_configuration_sha256s,
431
+ phenotype_identity_sha256s=phenotype_identity_sha256s,
432
+ )
433
+ return EffectiveChoiceAuditReceipt(
434
+ configured_minimum_cardinality=minimum,
435
+ generation=plan.generation,
436
+ invocation_label=plan.label,
437
+ parent_candidate_id=parent.candidate_id,
438
+ parent_configuration_sha256=parent.occurrence.configuration_hash,
439
+ selected_card_reference=authority.card.reference,
440
+ selected_card_binding_mode=binding_mode,
441
+ selected_card_binding_sha256=binding_sha256,
442
+ authority_sha256=authority.authority_sha256,
443
+ support_sha256=support.support_sha256,
444
+ presentation_sha256=support.presentation.presentation_sha256,
445
+ plan_contract_sha256=contract.identity_sha256,
446
+ authority_contract_sha256=authority_contract.identity_sha256,
447
+ outcome_blind=True,
448
+ exact_treatment_fields_absent=True,
449
+ effective_cardinality=cardinality,
450
+ option_ids=option_ids,
451
+ option_identity_sha256s=option_identity_sha256s,
452
+ child_configuration_sha256s=child_configuration_sha256s,
453
+ phenotype_identity_sha256s=phenotype_identity_sha256s,
454
+ audited_plan_sha256=_hash(_PLAN_BINDING_DOMAIN, plan_record),
455
+ )
456
+
457
+
458
+ def validate_effective_choice_audit_receipt(
459
+ receipt: EffectiveChoiceAuditReceipt,
460
+ plan: InvocationPlan,
461
+ ) -> None:
462
+ """Re-derive a receipt from its plan and reject any stale or forged proof."""
463
+
464
+ if type(receipt) is not EffectiveChoiceAuditReceipt:
465
+ raise TypeError("receipt must be an exact EffectiveChoiceAuditReceipt")
466
+ EffectiveChoiceAuditReceipt.__post_init__(receipt)
467
+ expected = audit_effective_choice_plan(
468
+ plan,
469
+ minimum_cardinality=receipt.configured_minimum_cardinality,
470
+ )
471
+ if receipt != expected:
472
+ raise ValueError("effective choice receipt differs from the audited plan")
473
+
474
+
475
+ __all__ = [
476
+ "EFFECTIVE_CHOICE_AUDIT_DEFINITION_SHA256",
477
+ "EFFECTIVE_CHOICE_AUDIT_POLICY_ID",
478
+ "EFFECTIVE_CHOICE_AUDIT_POLICY_VERSION",
479
+ "EffectiveChoiceAuditError",
480
+ "EffectiveChoiceAuditReceipt",
481
+ "SelectedCardBindingMode",
482
+ "audit_effective_choice_plan",
483
+ "validate_effective_choice_audit_receipt",
484
+ ]