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,348 @@
1
+ """Matched decision contracts for model and prospective engine selectors."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import hashlib
6
+ import json
7
+ import re
8
+ from dataclasses import dataclass, field
9
+ from enum import Enum
10
+ from typing import Protocol, runtime_checkable
11
+
12
+ from agent_evolve.domain.finite_action_set import FiniteActionSetAuthority
13
+ from agent_evolve.domain.ids import LLMCallId
14
+ from agent_evolve.domain.insight import InsightRef
15
+ from agent_evolve.domain.patch import require_sha256
16
+
17
+
18
+ _TOKEN = re.compile(r"^[a-z][a-z0-9_.-]{0,95}$")
19
+ _RANK_TOKEN_DOMAIN = b"agent-evolve:prospective-uniform-rank-token:v1\x00"
20
+ _DECISION_DOMAIN = b"agent-evolve:finite-action-decision:v1\x00"
21
+
22
+
23
+ def _canonical_json(value: object) -> bytes:
24
+ return json.dumps(
25
+ value,
26
+ ensure_ascii=True,
27
+ allow_nan=False,
28
+ separators=(",", ":"),
29
+ sort_keys=True,
30
+ ).encode("ascii")
31
+
32
+
33
+ def _hash(domain: bytes, value: object) -> str:
34
+ return hashlib.sha256(domain + _canonical_json(value)).hexdigest()
35
+
36
+
37
+ def _policy_identity(
38
+ policy_id: str,
39
+ policy_version: int,
40
+ definition_sha256: str,
41
+ ) -> None:
42
+ if type(policy_id) is not str or _TOKEN.fullmatch(policy_id) is None:
43
+ raise ValueError("selector policy_id must use the token grammar")
44
+ if type(policy_version) is not int or policy_version <= 0:
45
+ raise ValueError("selector policy_version must be positive")
46
+ require_sha256(definition_sha256, "selector definition_sha256")
47
+
48
+
49
+ class FiniteActionSelectorKind(str, Enum):
50
+ MODEL = "model"
51
+ ENGINE = "engine"
52
+
53
+
54
+ @dataclass(frozen=True, slots=True)
55
+ class ProspectiveUniformRankToken:
56
+ """One engine ordinal committed before current-run candidate outcomes."""
57
+
58
+ task_sha256: str
59
+ authority_sha256: str
60
+ support_sha256: str
61
+ card_reference: InsightRef
62
+ card_content_sha256: str
63
+ cardinality: int
64
+ selected_ordinal: int
65
+ schedule_policy_id: str
66
+ schedule_policy_version: int
67
+ schedule_definition_sha256: str
68
+ schedule_state_sha256: str
69
+ pre_outcome_phase_commit_sha256: str
70
+ current_outcome_access: bool = False
71
+ token_sha256: str = field(init=False)
72
+
73
+ def __post_init__(self) -> None:
74
+ for name in (
75
+ "task_sha256",
76
+ "authority_sha256",
77
+ "support_sha256",
78
+ "card_content_sha256",
79
+ "schedule_definition_sha256",
80
+ "schedule_state_sha256",
81
+ "pre_outcome_phase_commit_sha256",
82
+ ):
83
+ require_sha256(getattr(self, name), name)
84
+ if type(self.card_reference) is not InsightRef:
85
+ raise TypeError("card_reference must be an exact InsightRef")
86
+ InsightRef.__post_init__(self.card_reference)
87
+ if type(self.cardinality) is not int or self.cardinality <= 0:
88
+ raise ValueError("cardinality must be positive")
89
+ if type(self.selected_ordinal) is not int or not (
90
+ 0 <= self.selected_ordinal < self.cardinality
91
+ ):
92
+ raise ValueError("selected_ordinal is outside the support")
93
+ _policy_identity(
94
+ self.schedule_policy_id,
95
+ self.schedule_policy_version,
96
+ self.schedule_definition_sha256,
97
+ )
98
+ if type(self.current_outcome_access) is not bool:
99
+ raise TypeError("current_outcome_access must be bool")
100
+ if self.current_outcome_access:
101
+ raise ValueError("prospective engine rank cannot access current outcomes")
102
+ object.__setattr__(
103
+ self,
104
+ "token_sha256",
105
+ _hash(_RANK_TOKEN_DOMAIN, self.to_record()),
106
+ )
107
+
108
+ def to_record(self) -> dict[str, object]:
109
+ return {
110
+ "schema_version": 1,
111
+ "task_sha256": self.task_sha256,
112
+ "authority_sha256": self.authority_sha256,
113
+ "support_sha256": self.support_sha256,
114
+ "card_reference": {
115
+ "insight_id": self.card_reference.insight_id.value,
116
+ "version": self.card_reference.version,
117
+ },
118
+ "card_content_sha256": self.card_content_sha256,
119
+ "cardinality": self.cardinality,
120
+ "selected_ordinal": self.selected_ordinal,
121
+ "schedule_policy_id": self.schedule_policy_id,
122
+ "schedule_policy_version": self.schedule_policy_version,
123
+ "schedule_definition_sha256": self.schedule_definition_sha256,
124
+ "schedule_state_sha256": self.schedule_state_sha256,
125
+ "pre_outcome_phase_commit_sha256": (
126
+ self.pre_outcome_phase_commit_sha256
127
+ ),
128
+ "current_outcome_access": self.current_outcome_access,
129
+ }
130
+
131
+
132
+ @dataclass(frozen=True, slots=True)
133
+ class EngineFiniteActionRequest:
134
+ authority: FiniteActionSetAuthority
135
+ prospective_rank: ProspectiveUniformRankToken
136
+
137
+ def __post_init__(self) -> None:
138
+ if type(self.authority) is not FiniteActionSetAuthority:
139
+ raise TypeError("authority must be an exact FiniteActionSetAuthority")
140
+ FiniteActionSetAuthority.__post_init__(self.authority)
141
+ if type(self.prospective_rank) is not ProspectiveUniformRankToken:
142
+ raise TypeError("prospective_rank must be an exact token")
143
+ ProspectiveUniformRankToken.__post_init__(self.prospective_rank)
144
+ token = self.prospective_rank
145
+ expected = (
146
+ self.authority.authority_sha256,
147
+ self.authority.support.support_sha256,
148
+ self.authority.card.reference,
149
+ self.authority.card.card_content_sha256,
150
+ self.authority.support.cardinality,
151
+ )
152
+ observed = (
153
+ token.authority_sha256,
154
+ token.support_sha256,
155
+ token.card_reference,
156
+ token.card_content_sha256,
157
+ token.cardinality,
158
+ )
159
+ if observed != expected:
160
+ raise ValueError("prospective rank token differs from its authority")
161
+
162
+
163
+ @dataclass(frozen=True, slots=True)
164
+ class FiniteActionDecision:
165
+ """Outcome-free exact selection from one authenticated K-option support."""
166
+
167
+ authority_sha256: str
168
+ support_sha256: str
169
+ selector_kind: FiniteActionSelectorKind
170
+ selected_ordinal: int
171
+ option_id: str
172
+ option_identity_sha256: str
173
+ child_configuration_sha256: str
174
+ phenotype_identity_sha256: str
175
+ selector_policy_id: str
176
+ selector_policy_version: int
177
+ selector_definition_sha256: str
178
+ prospective_token_sha256: str | None
179
+ model_call_id: LLMCallId | None
180
+ model_prompt_sha256: str | None
181
+ model_telemetry_sha256: str | None
182
+ propensity_numerator: int | None
183
+ propensity_denominator: int | None
184
+ current_outcome_access: bool = False
185
+ decision_sha256: str = field(init=False)
186
+
187
+ def __post_init__(self) -> None:
188
+ for name in (
189
+ "authority_sha256",
190
+ "support_sha256",
191
+ "option_identity_sha256",
192
+ "child_configuration_sha256",
193
+ "phenotype_identity_sha256",
194
+ "selector_definition_sha256",
195
+ ):
196
+ require_sha256(getattr(self, name), name)
197
+ if type(self.selector_kind) is not FiniteActionSelectorKind:
198
+ raise TypeError("selector_kind must be an exact FiniteActionSelectorKind")
199
+ if type(self.selected_ordinal) is not int or self.selected_ordinal < 0:
200
+ raise ValueError("selected_ordinal must be non-negative")
201
+ if type(self.option_id) is not str or not self.option_id:
202
+ raise ValueError("option_id must be non-empty")
203
+ _policy_identity(
204
+ self.selector_policy_id,
205
+ self.selector_policy_version,
206
+ self.selector_definition_sha256,
207
+ )
208
+ if type(self.current_outcome_access) is not bool:
209
+ raise TypeError("current_outcome_access must be bool")
210
+ if self.current_outcome_access:
211
+ raise ValueError("finite action decision cannot access current outcomes")
212
+ if self.selector_kind is FiniteActionSelectorKind.ENGINE:
213
+ if self.prospective_token_sha256 is None:
214
+ raise ValueError("engine decision requires a prospective rank token")
215
+ require_sha256(
216
+ self.prospective_token_sha256,
217
+ "prospective_token_sha256",
218
+ )
219
+ if (
220
+ self.model_call_id is not None
221
+ or self.model_prompt_sha256 is not None
222
+ or self.model_telemetry_sha256 is not None
223
+ ):
224
+ raise ValueError("engine decision cannot claim model evidence")
225
+ if (
226
+ type(self.propensity_numerator) is not int
227
+ or type(self.propensity_denominator) is not int
228
+ or self.propensity_numerator != 1
229
+ or self.propensity_denominator <= 0
230
+ ):
231
+ raise ValueError("prospective uniform decision requires propensity 1/K")
232
+ else:
233
+ if self.prospective_token_sha256 is not None:
234
+ raise ValueError("model decision cannot claim an engine rank token")
235
+ if type(self.model_call_id) is not LLMCallId:
236
+ raise ValueError("model decision requires an exact model_call_id")
237
+ LLMCallId.__post_init__(self.model_call_id)
238
+ if self.model_prompt_sha256 is None:
239
+ raise ValueError("model decision requires its exact prompt identity")
240
+ require_sha256(self.model_prompt_sha256, "model_prompt_sha256")
241
+ if self.model_telemetry_sha256 is None:
242
+ raise ValueError("model decision requires authenticated telemetry")
243
+ require_sha256(self.model_telemetry_sha256, "model_telemetry_sha256")
244
+ if self.propensity_numerator is not None or self.propensity_denominator is not None:
245
+ raise ValueError("non-randomized model decision has unknown propensity")
246
+ object.__setattr__(
247
+ self,
248
+ "decision_sha256",
249
+ _hash(_DECISION_DOMAIN, self.to_record()),
250
+ )
251
+
252
+ def to_record(self) -> dict[str, object]:
253
+ return {
254
+ "schema_version": 1,
255
+ "authority_sha256": self.authority_sha256,
256
+ "support_sha256": self.support_sha256,
257
+ "selector_kind": self.selector_kind.value,
258
+ "selected_ordinal": self.selected_ordinal,
259
+ "option_id": self.option_id,
260
+ "option_identity_sha256": self.option_identity_sha256,
261
+ "child_configuration_sha256": self.child_configuration_sha256,
262
+ "phenotype_identity_sha256": self.phenotype_identity_sha256,
263
+ "selector_policy_id": self.selector_policy_id,
264
+ "selector_policy_version": self.selector_policy_version,
265
+ "selector_definition_sha256": self.selector_definition_sha256,
266
+ "prospective_token_sha256": self.prospective_token_sha256,
267
+ "model_call_id": (
268
+ None if self.model_call_id is None else self.model_call_id.value
269
+ ),
270
+ "model_prompt_sha256": self.model_prompt_sha256,
271
+ "model_telemetry_sha256": self.model_telemetry_sha256,
272
+ "propensity": (
273
+ None
274
+ if self.propensity_numerator is None
275
+ else {
276
+ "numerator": self.propensity_numerator,
277
+ "denominator": self.propensity_denominator,
278
+ }
279
+ ),
280
+ "current_outcome_access": self.current_outcome_access,
281
+ }
282
+
283
+
284
+ def validate_finite_action_decision(
285
+ authority: FiniteActionSetAuthority,
286
+ decision: FiniteActionDecision,
287
+ ) -> None:
288
+ if type(authority) is not FiniteActionSetAuthority:
289
+ raise TypeError("authority must be an exact FiniteActionSetAuthority")
290
+ FiniteActionSetAuthority.__post_init__(authority)
291
+ if type(decision) is not FiniteActionDecision:
292
+ raise TypeError("decision must be an exact FiniteActionDecision")
293
+ FiniteActionDecision.__post_init__(decision)
294
+ if (
295
+ decision.authority_sha256 != authority.authority_sha256
296
+ or decision.support_sha256 != authority.support.support_sha256
297
+ ):
298
+ raise ValueError("finite action decision is bound to a different authority")
299
+ if decision.selected_ordinal >= authority.support.cardinality:
300
+ raise ValueError("finite action decision ordinal is outside the support")
301
+ row = authority.support.options[decision.selected_ordinal]
302
+ expected = (
303
+ row.option.option_id,
304
+ row.option.identity_sha256,
305
+ row.option.child_configuration_sha256,
306
+ row.phenotype_identity_sha256,
307
+ )
308
+ observed = (
309
+ decision.option_id,
310
+ decision.option_identity_sha256,
311
+ decision.child_configuration_sha256,
312
+ decision.phenotype_identity_sha256,
313
+ )
314
+ if observed != expected:
315
+ raise ValueError("finite action decision changed the selected support row")
316
+ if (
317
+ decision.selector_kind is FiniteActionSelectorKind.ENGINE
318
+ and decision.propensity_denominator != authority.support.cardinality
319
+ ):
320
+ raise ValueError("engine propensity denominator differs from K")
321
+
322
+
323
+ @runtime_checkable
324
+ class EngineFiniteActionPolicy(Protocol):
325
+ policy_id: str
326
+ policy_version: int
327
+ definition_sha256: str
328
+ schedule_state_sha256: str
329
+
330
+ def freeze_rank(
331
+ self,
332
+ authority: FiniteActionSetAuthority,
333
+ *,
334
+ task_sha256: str,
335
+ pre_outcome_phase_commit_sha256: str,
336
+ ) -> ProspectiveUniformRankToken: ...
337
+
338
+ def choose(self, request: EngineFiniteActionRequest) -> FiniteActionDecision: ...
339
+
340
+
341
+ __all__ = [
342
+ "EngineFiniteActionPolicy",
343
+ "EngineFiniteActionRequest",
344
+ "FiniteActionDecision",
345
+ "FiniteActionSelectorKind",
346
+ "ProspectiveUniformRankToken",
347
+ "validate_finite_action_decision",
348
+ ]
@@ -0,0 +1,256 @@
1
+ """Inverted port for compiling a small local finite-action support.
2
+
3
+ Benchmark code selects opaque option IDs from an already frozen parent-bound
4
+ catalog. Trusted application code resolves the IDs, derives patches and
5
+ phenotypes, and seals the resulting authority. Neither side receives current
6
+ candidate outcomes through this interface.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import hashlib
12
+ import json
13
+ import re
14
+ from dataclasses import dataclass, field
15
+ from typing import Protocol, runtime_checkable
16
+
17
+ from agent_evolve.domain.finite_action_set import (
18
+ MAX_MATCHED_FINITE_ACTIONS,
19
+ MIN_MATCHED_FINITE_ACTIONS,
20
+ )
21
+ from agent_evolve.domain.finite_variation import (
22
+ FiniteVariationContract,
23
+ validate_finite_variation_contract,
24
+ )
25
+ from agent_evolve.domain.ids import CandidateId
26
+ from agent_evolve.domain.insight import InsightRef
27
+ from agent_evolve.domain.patch import require_sha256
28
+
29
+
30
+ _TOKEN = re.compile(r"^[a-z][a-z0-9_.-]{0,95}$")
31
+ _REQUEST_DOMAIN = b"agent-evolve:finite-action-set-compilation-request:v1\x00"
32
+ _DRAFT_DOMAIN = b"agent-evolve:finite-action-set-compilation-draft:v1\x00"
33
+
34
+
35
+ def _canonical_json(value: object) -> bytes:
36
+ return json.dumps(
37
+ value,
38
+ ensure_ascii=True,
39
+ allow_nan=False,
40
+ separators=(",", ":"),
41
+ sort_keys=True,
42
+ ).encode("ascii")
43
+
44
+
45
+ def _hash(domain: bytes, value: object) -> str:
46
+ return hashlib.sha256(domain + _canonical_json(value)).hexdigest()
47
+
48
+
49
+ def _policy_identity(
50
+ policy_id: str,
51
+ policy_version: int,
52
+ definition_sha256: str,
53
+ *,
54
+ name: str,
55
+ ) -> None:
56
+ if type(policy_id) is not str or _TOKEN.fullmatch(policy_id) is None:
57
+ raise ValueError(f"{name} policy_id must use the token grammar")
58
+ if type(policy_version) is not int or policy_version <= 0:
59
+ raise ValueError(f"{name} policy_version must be positive")
60
+ require_sha256(definition_sha256, f"{name} definition_sha256")
61
+
62
+
63
+ @dataclass(frozen=True, slots=True)
64
+ class FiniteActionSetCompilationRequest:
65
+ """Outcome-free request to choose K IDs around one exact anchor."""
66
+
67
+ parent_candidate_id: CandidateId
68
+ finite_contract: FiniteVariationContract
69
+ anchor_option_id: str
70
+ anchor_option_identity_sha256: str
71
+ exact_anchor_requirement_sha256: str
72
+ card_reference: InsightRef
73
+ card_content_sha256: str
74
+ context_projection_sha256: str
75
+ endpoint_definition_sha256: str
76
+ required_cardinality: int
77
+ current_outcome_access: bool = False
78
+ request_sha256: str = field(init=False)
79
+
80
+ def __post_init__(self) -> None:
81
+ if type(self.parent_candidate_id) is not CandidateId:
82
+ raise TypeError("parent_candidate_id must be an exact CandidateId")
83
+ CandidateId.__post_init__(self.parent_candidate_id)
84
+ validate_finite_variation_contract(self.finite_contract)
85
+ if type(self.anchor_option_id) is not str or not self.anchor_option_id:
86
+ raise ValueError("anchor_option_id must be non-empty")
87
+ anchor = self.finite_contract.resolve(self.anchor_option_id)
88
+ require_sha256(
89
+ self.anchor_option_identity_sha256,
90
+ "anchor_option_identity_sha256",
91
+ )
92
+ if anchor.identity_sha256 != self.anchor_option_identity_sha256:
93
+ raise ValueError("anchor option identity differs from the frozen contract")
94
+ require_sha256(
95
+ self.exact_anchor_requirement_sha256,
96
+ "exact_anchor_requirement_sha256",
97
+ )
98
+ if type(self.card_reference) is not InsightRef:
99
+ raise TypeError("card_reference must be an exact InsightRef")
100
+ InsightRef.__post_init__(self.card_reference)
101
+ for name in (
102
+ "card_content_sha256",
103
+ "context_projection_sha256",
104
+ "endpoint_definition_sha256",
105
+ ):
106
+ require_sha256(getattr(self, name), name)
107
+ if type(self.required_cardinality) is not int or not (
108
+ MIN_MATCHED_FINITE_ACTIONS
109
+ <= self.required_cardinality
110
+ <= MAX_MATCHED_FINITE_ACTIONS
111
+ ):
112
+ raise ValueError(
113
+ "required_cardinality must lie in "
114
+ f"[{MIN_MATCHED_FINITE_ACTIONS},{MAX_MATCHED_FINITE_ACTIONS}]"
115
+ )
116
+ if self.required_cardinality > len(self.finite_contract.options):
117
+ raise ValueError("source contract is smaller than the requested support")
118
+ if type(self.current_outcome_access) is not bool:
119
+ raise TypeError("current_outcome_access must be bool")
120
+ if self.current_outcome_access:
121
+ raise ValueError("finite action support compilation must be outcome-blind")
122
+ object.__setattr__(
123
+ self,
124
+ "request_sha256",
125
+ _hash(_REQUEST_DOMAIN, self.to_record()),
126
+ )
127
+
128
+ def to_record(self) -> dict[str, object]:
129
+ return {
130
+ "schema_version": 1,
131
+ "parent_candidate_id": self.parent_candidate_id.value,
132
+ "parent_configuration_sha256": (
133
+ self.finite_contract.parent_configuration_sha256
134
+ ),
135
+ "finite_contract_sha256": self.finite_contract.identity_sha256,
136
+ "anchor_option_id": self.anchor_option_id,
137
+ "anchor_option_identity_sha256": self.anchor_option_identity_sha256,
138
+ "exact_anchor_requirement_sha256": (
139
+ self.exact_anchor_requirement_sha256
140
+ ),
141
+ "card_reference": {
142
+ "insight_id": self.card_reference.insight_id.value,
143
+ "version": self.card_reference.version,
144
+ },
145
+ "card_content_sha256": self.card_content_sha256,
146
+ "context_projection_sha256": self.context_projection_sha256,
147
+ "endpoint_definition_sha256": self.endpoint_definition_sha256,
148
+ "required_cardinality": self.required_cardinality,
149
+ "current_outcome_access": self.current_outcome_access,
150
+ }
151
+
152
+
153
+ @dataclass(frozen=True, slots=True)
154
+ class FiniteActionSetDraft:
155
+ """Untrusted compiler output: IDs and presentation policy, never children."""
156
+
157
+ request_sha256: str
158
+ ordered_option_ids: tuple[str, ...]
159
+ anchor_option_id: str
160
+ presentation_policy_id: str
161
+ presentation_policy_version: int
162
+ presentation_definition_sha256: str
163
+ prompt_shape_sha256: str
164
+ draft_sha256: str = field(init=False)
165
+
166
+ def __post_init__(self) -> None:
167
+ require_sha256(self.request_sha256, "request_sha256")
168
+ if type(self.ordered_option_ids) is not tuple or not self.ordered_option_ids:
169
+ raise ValueError("ordered_option_ids must be a non-empty exact tuple")
170
+ if any(type(value) is not str or not value for value in self.ordered_option_ids):
171
+ raise TypeError("ordered_option_ids must contain non-empty strings")
172
+ if len(set(self.ordered_option_ids)) != len(self.ordered_option_ids):
173
+ raise ValueError("ordered_option_ids must be unique")
174
+ if type(self.anchor_option_id) is not str or self.anchor_option_id not in set(
175
+ self.ordered_option_ids
176
+ ):
177
+ raise ValueError("anchor_option_id must occur in ordered_option_ids")
178
+ _policy_identity(
179
+ self.presentation_policy_id,
180
+ self.presentation_policy_version,
181
+ self.presentation_definition_sha256,
182
+ name="presentation",
183
+ )
184
+ require_sha256(self.prompt_shape_sha256, "prompt_shape_sha256")
185
+ object.__setattr__(
186
+ self,
187
+ "draft_sha256",
188
+ _hash(_DRAFT_DOMAIN, self.to_record()),
189
+ )
190
+
191
+ def to_record(self) -> dict[str, object]:
192
+ return {
193
+ "schema_version": 1,
194
+ "request_sha256": self.request_sha256,
195
+ "ordered_option_ids": list(self.ordered_option_ids),
196
+ "anchor_option_id": self.anchor_option_id,
197
+ "presentation_policy_id": self.presentation_policy_id,
198
+ "presentation_policy_version": self.presentation_policy_version,
199
+ "presentation_definition_sha256": self.presentation_definition_sha256,
200
+ "prompt_shape_sha256": self.prompt_shape_sha256,
201
+ }
202
+
203
+
204
+ @runtime_checkable
205
+ class FiniteActionSetCompiler(Protocol):
206
+ policy_id: str
207
+ policy_version: int
208
+ definition_sha256: str
209
+
210
+ def compile(
211
+ self,
212
+ request: FiniteActionSetCompilationRequest,
213
+ ) -> FiniteActionSetDraft: ...
214
+
215
+
216
+ def validate_finite_action_set_compiler_identity(
217
+ compiler: FiniteActionSetCompiler,
218
+ ) -> tuple[str, int, str]:
219
+ if not isinstance(compiler, FiniteActionSetCompiler):
220
+ raise TypeError("compiler must implement FiniteActionSetCompiler")
221
+ identity = (
222
+ compiler.policy_id,
223
+ compiler.policy_version,
224
+ compiler.definition_sha256,
225
+ )
226
+ _policy_identity(*identity, name="support compiler")
227
+ return identity
228
+
229
+
230
+ def validate_finite_action_set_draft(
231
+ request: FiniteActionSetCompilationRequest,
232
+ draft: FiniteActionSetDraft,
233
+ ) -> None:
234
+ if type(request) is not FiniteActionSetCompilationRequest:
235
+ raise TypeError("request must be an exact FiniteActionSetCompilationRequest")
236
+ FiniteActionSetCompilationRequest.__post_init__(request)
237
+ if type(draft) is not FiniteActionSetDraft:
238
+ raise TypeError("draft must be an exact FiniteActionSetDraft")
239
+ FiniteActionSetDraft.__post_init__(draft)
240
+ if draft.request_sha256 != request.request_sha256:
241
+ raise ValueError("finite action draft is bound to a different request")
242
+ if len(draft.ordered_option_ids) != request.required_cardinality:
243
+ raise ValueError("finite action draft has the wrong cardinality")
244
+ if draft.anchor_option_id != request.anchor_option_id:
245
+ raise ValueError("finite action draft changed the exact anchor")
246
+ for option_id in draft.ordered_option_ids:
247
+ request.finite_contract.resolve(option_id)
248
+
249
+
250
+ __all__ = [
251
+ "FiniteActionSetCompilationRequest",
252
+ "FiniteActionSetCompiler",
253
+ "FiniteActionSetDraft",
254
+ "validate_finite_action_set_compiler_identity",
255
+ "validate_finite_action_set_draft",
256
+ ]