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,347 @@
1
+ """Audited greedy allocation over authenticated forecast frames."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import math
6
+ from dataclasses import dataclass
7
+
8
+ from agent_evolve.application.action_allocation import (
9
+ GREEDY_RISK_DIVERSITY_ALLOCATOR_DEFINITION_SHA256,
10
+ GREEDY_RISK_DIVERSITY_ALLOCATOR_ID,
11
+ GREEDY_RISK_DIVERSITY_ALLOCATOR_VERSION,
12
+ GreedyRiskAdjustedDiversityAllocator,
13
+ )
14
+ from agent_evolve.ports.action_allocation import (
15
+ AllocatedActionMember,
16
+ ForecastPortfolioUtilityInput,
17
+ ForecastQuantile,
18
+ PortfolioAllocationScore,
19
+ )
20
+ from agent_evolve.ports.action_allocation_frame import (
21
+ ActionAllocationSurfaceAudit,
22
+ AllocationCandidateScoreDiagnostic,
23
+ AllocationCandidateScoreDiagnosticInput,
24
+ AllocationScoreDiagnosticBinding,
25
+ AllocationSurfaceGatePolicyBinding,
26
+ AllocationSurfaceStepAudit,
27
+ AuditedFrameActionAllocationResult,
28
+ FrameActionAllocationRequest,
29
+ FrameActionPortfolioDecision,
30
+ allocation_score_multiset_sha256,
31
+ allocation_surface_failure_codes,
32
+ validate_frame_action_portfolio_decision,
33
+ )
34
+ from agent_evolve.ports.action_forecast import ResolvedActionForecast
35
+
36
+
37
+ @dataclass(frozen=True, slots=True)
38
+ class AllocationSurfaceGateRejected(RuntimeError):
39
+ """A complete deterministic attempt whose pre-evaluator gate failed."""
40
+
41
+ result: AuditedFrameActionAllocationResult
42
+
43
+ def __post_init__(self) -> None:
44
+ if type(self.result) is not AuditedFrameActionAllocationResult:
45
+ raise TypeError("result must be an exact audited frame result")
46
+ self.result.__post_init__()
47
+ if self.result.audit.passes:
48
+ raise ValueError("a passing allocation result cannot be rejected")
49
+ RuntimeError.__init__(
50
+ self,
51
+ "allocation surface failed its bound pre-evaluator gate",
52
+ )
53
+
54
+
55
+ @dataclass(frozen=True, slots=True)
56
+ class AuditedGreedyForecastFrameAllocator:
57
+ """Allocator-v2-equivalent scoring over a non-forged forecast frame.
58
+
59
+ The complete-batch allocator exact-type-checks its request, so forwarding a
60
+ partition block would require fabricating global coverage. This service
61
+ instead consumes the authenticated frame port directly while retaining the
62
+ same v2 score, attainable-diversity denominator, canonical tie break, and
63
+ configuration identity.
64
+ """
65
+
66
+ risk_aversion: float
67
+ diversity_weight: float
68
+ score_diagnostic: AllocationScoreDiagnosticBinding
69
+ gate_policy: AllocationSurfaceGatePolicyBinding
70
+
71
+ def __post_init__(self) -> None:
72
+ for name in ("risk_aversion", "diversity_weight"):
73
+ value = getattr(self, name)
74
+ if type(value) is not float or not math.isfinite(value):
75
+ raise TypeError(f"{name} must be a finite canonical float")
76
+ if value < 0.0:
77
+ raise ValueError(f"{name} must be non-negative")
78
+ if type(self.score_diagnostic) is not AllocationScoreDiagnosticBinding:
79
+ raise TypeError("score_diagnostic must be an exact binding")
80
+ self.score_diagnostic.__post_init__()
81
+ if type(self.gate_policy) is not AllocationSurfaceGatePolicyBinding:
82
+ raise TypeError("gate_policy must be an exact binding")
83
+ self.gate_policy.__post_init__()
84
+
85
+ @property
86
+ def configuration_sha256(self) -> str:
87
+ self.__post_init__()
88
+ return GreedyRiskAdjustedDiversityAllocator(
89
+ risk_aversion=self.risk_aversion,
90
+ diversity_weight=self.diversity_weight,
91
+ ).configuration_sha256
92
+
93
+ @staticmethod
94
+ def _utility(
95
+ request: FrameActionAllocationRequest,
96
+ members: tuple[ResolvedActionForecast, ...],
97
+ quantile: ForecastQuantile,
98
+ ) -> float:
99
+ canonical_members = tuple(
100
+ sorted(
101
+ members,
102
+ key=lambda value: (value.option_identity_sha256, value.option_id),
103
+ )
104
+ )
105
+ value = request.utility.utility(
106
+ ForecastPortfolioUtilityInput(
107
+ optimization_semantics=request.frame.request.optimization_semantics,
108
+ parent_metric_values=request.frame.request.parent_metric_values,
109
+ metric_scales=request.frame.request.metric_scales,
110
+ members=canonical_members,
111
+ quantile=quantile,
112
+ )
113
+ )
114
+ if type(value) is not float or not math.isfinite(value):
115
+ raise TypeError("bound portfolio utility must return a finite float")
116
+ return value
117
+
118
+ def _score(
119
+ self,
120
+ request: FrameActionAllocationRequest,
121
+ members: tuple[ResolvedActionForecast, ...],
122
+ *,
123
+ attainable_diversity: int,
124
+ ) -> PortfolioAllocationScore:
125
+ p10 = self._utility(request, members, ForecastQuantile.P10)
126
+ p50 = self._utility(request, members, ForecastQuantile.P50)
127
+ p90 = self._utility(request, members, ForecastQuantile.P90)
128
+ downside = min(p10, p90)
129
+ risk_penalty = self.risk_aversion * max(0.0, p50 - downside)
130
+ diversity_reward = self.diversity_weight * (
131
+ len({member.family for member in members}) / attainable_diversity
132
+ )
133
+ total = p50 - risk_penalty + diversity_reward
134
+ if not all(
135
+ math.isfinite(value)
136
+ for value in (risk_penalty, diversity_reward, total)
137
+ ):
138
+ raise ValueError("allocation score arithmetic became non-finite")
139
+ return PortfolioAllocationScore(
140
+ p10_utility=p10,
141
+ p50_utility=p50,
142
+ p90_utility=p90,
143
+ downside_utility=downside,
144
+ risk_penalty=risk_penalty,
145
+ diversity_reward=diversity_reward,
146
+ total_utility=total,
147
+ )
148
+
149
+ def assess(
150
+ self,
151
+ request: FrameActionAllocationRequest,
152
+ ) -> AuditedFrameActionAllocationResult:
153
+ """Return the complete attempt, including a failing gate receipt."""
154
+
155
+ if type(request) is not FrameActionAllocationRequest:
156
+ raise TypeError("request must be an exact frame allocation request")
157
+ request.__post_init__()
158
+ self.__post_init__()
159
+ # These authenticated identities recursively validate and hash the
160
+ # complete frame/request graph. Compute each exactly once after the
161
+ # explicit validation boundary; candidate scoring must remain O(kn),
162
+ # not repeat graph authentication for every greedy extension.
163
+ allocation_request_sha256 = request.request_sha256
164
+ frame_receipt_sha256 = request.frame.receipt_sha256
165
+ source_forecast_receipt_sha256 = (
166
+ request.frame.source_forecast_receipt_sha256
167
+ )
168
+ eligible_options_sha256 = request.eligible_options_sha256
169
+ allocator_configuration_sha256 = self.configuration_sha256
170
+ by_id = {value.option_id: value for value in request.frame.forecasts}
171
+ global_index_by_id = {
172
+ forecast.option_id: global_index
173
+ for global_index, forecast in zip(
174
+ request.frame.global_row_indices,
175
+ request.frame.forecasts,
176
+ strict=True,
177
+ )
178
+ }
179
+ attainable_diversity = min(
180
+ request.portfolio_size,
181
+ len({by_id[value].family for value in request.eligible_option_ids}),
182
+ )
183
+ remaining = sorted(
184
+ (by_id[value] for value in request.eligible_option_ids),
185
+ key=lambda value: (value.option_identity_sha256, value.option_id),
186
+ )
187
+ selected: list[ResolvedActionForecast] = []
188
+ members: list[AllocatedActionMember] = []
189
+ step_audits: list[AllocationSurfaceStepAudit] = []
190
+ previous_total = 0.0
191
+
192
+ for step in range(1, request.portfolio_size + 1):
193
+ candidates: list[
194
+ tuple[
195
+ ResolvedActionForecast,
196
+ PortfolioAllocationScore,
197
+ float,
198
+ str,
199
+ AllocationCandidateScoreDiagnostic,
200
+ ]
201
+ ] = []
202
+ for candidate in remaining:
203
+ portfolio = tuple((*selected, candidate))
204
+ score = self._score(
205
+ request,
206
+ portfolio,
207
+ attainable_diversity=attainable_diversity,
208
+ )
209
+ marginal = score.total_utility - previous_total
210
+ if not math.isfinite(marginal):
211
+ raise ValueError("marginal allocation score became non-finite")
212
+ label = f"row_{global_index_by_id[candidate.option_id]:08d}"
213
+ diagnostic_input = AllocationCandidateScoreDiagnosticInput(
214
+ allocation_request_sha256=allocation_request_sha256,
215
+ step=step,
216
+ candidate_label=label,
217
+ members=tuple(
218
+ sorted(
219
+ portfolio,
220
+ key=lambda value: (
221
+ value.option_identity_sha256,
222
+ value.option_id,
223
+ ),
224
+ )
225
+ ),
226
+ score=score,
227
+ marginal_total_utility=marginal,
228
+ )
229
+ diagnostic = self.score_diagnostic.diagnostic(diagnostic_input)
230
+ if type(diagnostic) is not AllocationCandidateScoreDiagnostic:
231
+ raise TypeError(
232
+ "score diagnostic returned another result type"
233
+ )
234
+ diagnostic.__post_init__()
235
+ candidates.append((candidate, score, marginal, label, diagnostic))
236
+
237
+ # ``remaining`` is already in allocator-v2 canonical tie order.
238
+ top_score = max(value[2] for value in candidates)
239
+ top = tuple(value for value in candidates if value[2] == top_score)
240
+ winner = top[0]
241
+ ranked_scores = sorted(
242
+ (value[2] for value in candidates),
243
+ reverse=True,
244
+ )
245
+ runner_gap = (
246
+ 0.0
247
+ if len(ranked_scores) == 1
248
+ else ranked_scores[0] - ranked_scores[1]
249
+ )
250
+ boundary_count = sum(
251
+ value[4].boundary_or_extreme for value in candidates
252
+ )
253
+ boundary_share = boundary_count / len(candidates)
254
+ score_values = tuple(value[2] for value in candidates)
255
+ failure_codes = allocation_surface_failure_codes(
256
+ policy=self.gate_policy,
257
+ candidate_count=len(candidates),
258
+ distinct_finite_score_count=len(set(score_values)),
259
+ top_tie_count=len(top),
260
+ winner_runner_gap=runner_gap,
261
+ boundary_or_extreme_share=boundary_share,
262
+ )
263
+ step_audits.append(
264
+ AllocationSurfaceStepAudit(
265
+ step=step,
266
+ candidate_count=len(candidates),
267
+ distinct_finite_score_count=len(set(score_values)),
268
+ top_tie_count=len(top),
269
+ winner_runner_gap=runner_gap,
270
+ boundary_or_extreme_count=boundary_count,
271
+ boundary_or_extreme_share=boundary_share,
272
+ score_multiset_sha256=allocation_score_multiset_sha256(
273
+ score_values
274
+ ),
275
+ winner_candidate_label=winner[3],
276
+ tie_break_used=len(top) > 1,
277
+ failure_codes=failure_codes,
278
+ passes=not failure_codes,
279
+ )
280
+ )
281
+
282
+ best_forecast, best_score, best_marginal, _label, _diagnostic = winner
283
+ selected.append(best_forecast)
284
+ remaining.remove(best_forecast)
285
+ members.append(
286
+ AllocatedActionMember(
287
+ rank=step,
288
+ option_id=best_forecast.option_id,
289
+ option_identity_sha256=best_forecast.option_identity_sha256,
290
+ child_configuration_sha256=(
291
+ best_forecast.child_configuration_sha256
292
+ ),
293
+ family=best_forecast.family,
294
+ greedy_step_score=best_score,
295
+ marginal_total_utility=best_marginal,
296
+ )
297
+ )
298
+ previous_total = best_score.total_utility
299
+
300
+ candidate_evaluations = sum(value.candidate_count for value in step_audits)
301
+ decision = FrameActionPortfolioDecision(
302
+ allocation_request_sha256=allocation_request_sha256,
303
+ frame_receipt_sha256=frame_receipt_sha256,
304
+ source_forecast_receipt_sha256=source_forecast_receipt_sha256,
305
+ eligible_options_sha256=eligible_options_sha256,
306
+ members=tuple(members),
307
+ final_score=members[-1].greedy_step_score,
308
+ candidate_evaluations=candidate_evaluations,
309
+ utility_policy_id=request.utility.policy_id,
310
+ utility_policy_version=request.utility.policy_version,
311
+ utility_definition_sha256=request.utility.definition_sha256,
312
+ allocator_policy_id=GREEDY_RISK_DIVERSITY_ALLOCATOR_ID,
313
+ allocator_policy_version=GREEDY_RISK_DIVERSITY_ALLOCATOR_VERSION,
314
+ allocator_definition_sha256=(
315
+ GREEDY_RISK_DIVERSITY_ALLOCATOR_DEFINITION_SHA256
316
+ ),
317
+ allocator_configuration_sha256=allocator_configuration_sha256,
318
+ )
319
+ validate_frame_action_portfolio_decision(request, decision)
320
+ audit = ActionAllocationSurfaceAudit(
321
+ allocation_request_sha256=allocation_request_sha256,
322
+ decision_receipt_sha256=decision.receipt_sha256,
323
+ frame_receipt_sha256=frame_receipt_sha256,
324
+ score_diagnostic=self.score_diagnostic,
325
+ gate_policy=self.gate_policy,
326
+ steps=tuple(step_audits),
327
+ candidate_score_count=candidate_evaluations,
328
+ passes=all(value.passes for value in step_audits),
329
+ )
330
+ return AuditedFrameActionAllocationResult(decision=decision, audit=audit)
331
+
332
+ def allocate(
333
+ self,
334
+ request: FrameActionAllocationRequest,
335
+ ) -> AuditedFrameActionAllocationResult:
336
+ """Authorize a decision only when every bound surface gate passes."""
337
+
338
+ result = self.assess(request)
339
+ if not result.audit.passes:
340
+ raise AllocationSurfaceGateRejected(result)
341
+ return result
342
+
343
+
344
+ __all__ = [
345
+ "AllocationSurfaceGateRejected",
346
+ "AuditedGreedyForecastFrameAllocator",
347
+ ]
@@ -0,0 +1,185 @@
1
+ """Durable fail-closed commits for audited frame allocation treatments."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from agent_evolve.application.two_stage_action_evolution import (
6
+ TwoStageActionPhase,
7
+ TwoStageActionPhaseCommit,
8
+ TwoStageActionPhaseReceipt,
9
+ )
10
+ from agent_evolve.domain.patch import require_sha256
11
+ from agent_evolve.domain.typed_json import (
12
+ FrozenJsonObject,
13
+ freeze_json,
14
+ thaw_json,
15
+ typed_json_sha256,
16
+ )
17
+ from agent_evolve.ports.action_allocation_frame_commit import (
18
+ FrameActionAllocationCommitInput,
19
+ FrameActionAllocationTreatmentExecution,
20
+ )
21
+ from agent_evolve.ports.treatment_assignment import (
22
+ ProspectiveTreatmentAssignmentReceipt,
23
+ )
24
+
25
+
26
+ _COMMIT_KIND = "audited_frame_action_allocation"
27
+
28
+
29
+ class FrameActionAllocationCommitRejected(RuntimeError):
30
+ """No evaluator authority may open from these allocation executions."""
31
+
32
+
33
+ def _validated_execution_tuple(
34
+ executions: tuple[FrameActionAllocationTreatmentExecution, ...],
35
+ *,
36
+ require_all_pass: bool,
37
+ ) -> ProspectiveTreatmentAssignmentReceipt:
38
+ if type(executions) is not tuple or not executions or any(
39
+ type(value) is not FrameActionAllocationTreatmentExecution
40
+ for value in executions
41
+ ):
42
+ raise ValueError("executions must be a non-empty exact execution tuple")
43
+ for value in executions:
44
+ value.__post_init__()
45
+ assignment = executions[0].treatment_assignment
46
+ if any(
47
+ value.treatment_assignment.receipt_sha256 != assignment.receipt_sha256
48
+ for value in executions
49
+ ):
50
+ raise ValueError("executions name different treatment assignments")
51
+ observed_order = tuple(value.treatment_occurrence for value in executions)
52
+ if observed_order != assignment.occurrence_input_order:
53
+ raise ValueError(
54
+ "executions must use exact treatment occurrence input order"
55
+ )
56
+ if require_all_pass and any(not value.result.audit.passes for value in executions):
57
+ raise FrameActionAllocationCommitRejected(
58
+ "every allocation-surface audit must pass before evaluator authority"
59
+ )
60
+ return assignment
61
+
62
+
63
+ def _frozen_payload(value: dict[str, object]) -> FrozenJsonObject:
64
+ result = freeze_json(value)
65
+ if type(result) is not FrozenJsonObject:
66
+ raise AssertionError("allocation commit payload must freeze as an object")
67
+ return result
68
+
69
+
70
+ def build_frame_action_allocation_phase_commit(
71
+ *,
72
+ upstream_input_sha256: str,
73
+ terminal_provider_ledger_commitment_sha256: str,
74
+ executions: tuple[FrameActionAllocationTreatmentExecution, ...],
75
+ ) -> TwoStageActionPhaseCommit:
76
+ """Build an ALLOCATE commit only from complete passing audit records.
77
+
78
+ The ledger digest is a commitment to a ledger the caller has already
79
+ materialized and fsynced. This pure builder cannot establish filesystem
80
+ durability and its payload states that limitation explicitly.
81
+ """
82
+
83
+ require_sha256(upstream_input_sha256, "upstream_input_sha256")
84
+ require_sha256(
85
+ terminal_provider_ledger_commitment_sha256,
86
+ "terminal_provider_ledger_commitment_sha256",
87
+ )
88
+ assignment = _validated_execution_tuple(executions, require_all_pass=True)
89
+ commit_input = FrameActionAllocationCommitInput(
90
+ upstream_input_sha256=upstream_input_sha256,
91
+ terminal_provider_ledger_commitment_sha256=(
92
+ terminal_provider_ledger_commitment_sha256
93
+ ),
94
+ treatment_assignment=assignment,
95
+ allocation_requests=tuple(value.request for value in executions),
96
+ )
97
+ payload = _frozen_payload(
98
+ {
99
+ "schema_version": 1,
100
+ "phase": TwoStageActionPhase.ALLOCATE.value,
101
+ "commit_kind": _COMMIT_KIND,
102
+ "allocation_input": commit_input.to_record(),
103
+ "terminal_provider_ledger_commitment": (
104
+ commit_input.terminal_provider_ledger_commitment_record
105
+ ),
106
+ "treatment_assignment_receipt_sha256": assignment.receipt_sha256,
107
+ "treatment_occurrence_order": [
108
+ value.to_record() for value in assignment.occurrence_input_order
109
+ ],
110
+ "treatment_executions": [value.to_record() for value in executions],
111
+ "all_allocation_surface_audits_pass": True,
112
+ "evaluator_authority_eligible": True,
113
+ }
114
+ )
115
+ return TwoStageActionPhaseCommit(
116
+ receipt=TwoStageActionPhaseReceipt(
117
+ phase=TwoStageActionPhase.ALLOCATE,
118
+ input_sha256=commit_input.input_sha256,
119
+ output_sha256=typed_json_sha256(payload),
120
+ ),
121
+ payload=payload,
122
+ )
123
+
124
+
125
+ def validate_frame_action_allocation_phase_commit(
126
+ executions: tuple[FrameActionAllocationTreatmentExecution, ...],
127
+ phase_commit: TwoStageActionPhaseCommit,
128
+ ) -> FrameActionAllocationCommitInput:
129
+ """Validate payload equality and return its exact authenticated input."""
130
+
131
+ assignment = _validated_execution_tuple(executions, require_all_pass=True)
132
+ if type(phase_commit) is not TwoStageActionPhaseCommit:
133
+ raise TypeError("phase_commit must be an exact TwoStageActionPhaseCommit")
134
+ phase_commit.__post_init__()
135
+ if phase_commit.receipt.phase is not TwoStageActionPhase.ALLOCATE:
136
+ raise ValueError("only an ALLOCATE phase commit can authorize evaluation")
137
+ payload = thaw_json(phase_commit.payload)
138
+ if (
139
+ type(payload) is not dict
140
+ or payload.get("phase") != TwoStageActionPhase.ALLOCATE.value
141
+ or payload.get("commit_kind") != _COMMIT_KIND
142
+ or type(payload.get("allocation_input")) is not dict
143
+ ):
144
+ raise ValueError("frame-allocation phase payload is malformed")
145
+ raw_input = payload["allocation_input"]
146
+ assert type(raw_input) is dict
147
+ upstream_input_sha256 = raw_input.get("upstream_input_sha256")
148
+ raw_ledger = raw_input.get("terminal_provider_ledger_commitment")
149
+ if type(upstream_input_sha256) is not str or type(raw_ledger) is not dict:
150
+ raise ValueError("frame-allocation input commitment is malformed")
151
+ ledger_sha256 = raw_ledger.get("commitment_sha256")
152
+ if type(ledger_sha256) is not str:
153
+ raise ValueError("terminal-provider-ledger commitment is malformed")
154
+ require_sha256(upstream_input_sha256, "upstream_input_sha256")
155
+ require_sha256(
156
+ ledger_sha256,
157
+ "terminal_provider_ledger_commitment_sha256",
158
+ )
159
+ expected = build_frame_action_allocation_phase_commit(
160
+ upstream_input_sha256=upstream_input_sha256,
161
+ terminal_provider_ledger_commitment_sha256=ledger_sha256,
162
+ executions=executions,
163
+ )
164
+ if (
165
+ phase_commit.receipt.receipt_sha256
166
+ != expected.receipt.receipt_sha256
167
+ or phase_commit.payload != expected.payload
168
+ or phase_commit.to_record() != expected.to_record()
169
+ ):
170
+ raise ValueError(
171
+ "frame-allocation phase commit differs from exact execution payloads"
172
+ )
173
+ return FrameActionAllocationCommitInput(
174
+ upstream_input_sha256=upstream_input_sha256,
175
+ terminal_provider_ledger_commitment_sha256=ledger_sha256,
176
+ treatment_assignment=assignment,
177
+ allocation_requests=tuple(value.request for value in executions),
178
+ )
179
+
180
+
181
+ __all__ = [
182
+ "FrameActionAllocationCommitRejected",
183
+ "build_frame_action_allocation_phase_commit",
184
+ "validate_frame_action_allocation_phase_commit",
185
+ ]