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,552 @@
1
+ """Protected current-prefix forecast opportunity for causal continuations.
2
+
3
+ The challenger composes two existing policies without weakening either
4
+ boundary:
5
+
6
+ * an incumbent outcome-adaptive policy authors a complete fallback decision;
7
+ * a sealed forecast-geometry policy may replace that one action when it
8
+ identifies positive conditional archive opportunity against the real
9
+ evaluated prefix.
10
+
11
+ No eligible candidate outcome is visible to the challenger. If forecast
12
+ geometry is absent, exhausted, or has no positive opportunity, the incumbent
13
+ decision is returned under an authenticated composite receipt.
14
+ """
15
+
16
+ from __future__ import annotations
17
+
18
+ import hashlib
19
+ import json
20
+ import math
21
+ import re
22
+ from dataclasses import dataclass, field
23
+
24
+ from agent_evolve.application.agentic_evolution import EvolutionCandidate
25
+ from agent_evolve.application.current_prefix_forecast_opportunity import (
26
+ CurrentPrefixForecastOpportunityPolicyPort,
27
+ validate_current_prefix_forecast_opportunity_policy,
28
+ )
29
+ from agent_evolve.application.forecast_geometry_portfolio import (
30
+ MaterializedForecastGeometryBatch,
31
+ MaterializedForecastGeometryProjectionPort,
32
+ )
33
+ from agent_evolve.application.outcome_adaptive_action_racing import (
34
+ AdaptiveActionDescriptor,
35
+ AdaptiveActionRacingDecision,
36
+ AdaptiveActionWave,
37
+ )
38
+ from agent_evolve.application.prequential_archive_opportunity_calibration import (
39
+ ArchiveOpportunityActionContext,
40
+ )
41
+ from agent_evolve.application.residual_portfolio_evolution import (
42
+ MaterializedActionEvaluation,
43
+ MaterializedActionProposalBatch,
44
+ ResidualPortfolioDecisionRequest,
45
+ )
46
+ from agent_evolve.domain.patch import require_sha256
47
+ from agent_evolve.domain.typed_json import freeze_json
48
+
49
+
50
+ PROTECTED_CURRENT_PREFIX_FORECAST_OPPORTUNITY_ID = (
51
+ "protected_current_prefix_forecast_opportunity"
52
+ )
53
+ PROTECTED_CURRENT_PREFIX_FORECAST_OPPORTUNITY_VERSION = 2
54
+ _TOKEN = re.compile(r"^[a-z][a-z0-9_.:-]{0,255}$")
55
+ _DEFINITION_DOMAIN = (
56
+ b"agent-evolve:protected-current-prefix-forecast-opportunity:v2\x00"
57
+ )
58
+ _PRIOR_DOMAIN = (
59
+ b"agent-evolve:protected-current-prefix-forecast-prior:v1\x00"
60
+ )
61
+
62
+
63
+ def _canonical_json(value: object) -> bytes:
64
+ return json.dumps(
65
+ value,
66
+ allow_nan=False,
67
+ ensure_ascii=True,
68
+ separators=(",", ":"),
69
+ sort_keys=True,
70
+ ).encode("ascii", errors="strict")
71
+
72
+
73
+ def _hash(domain: bytes, value: object) -> str:
74
+ return hashlib.sha256(domain + _canonical_json(value)).hexdigest()
75
+
76
+
77
+ def _require_token(value: str, *, name: str) -> None:
78
+ if type(value) is not str or _TOKEN.fullmatch(value) is None:
79
+ raise ValueError(f"{name} must use the closed token grammar")
80
+
81
+
82
+ def _prior_sha256(
83
+ candidates: tuple[EvolutionCandidate, ...],
84
+ ) -> str:
85
+ return _hash(
86
+ _PRIOR_DOMAIN,
87
+ [
88
+ {
89
+ "candidate_id": value.candidate_id.value,
90
+ "configuration_sha256": value.occurrence.configuration_hash,
91
+ "generation": value.generation,
92
+ "valid": value.valid,
93
+ "operator_compliant": value.operator_compliant,
94
+ "evidence_compliant": value.evidence_compliant,
95
+ "objectives": [
96
+ {
97
+ "metric_id": metric_id,
98
+ "value_hex": number.hex(),
99
+ }
100
+ for metric_id, number in value.objectives
101
+ ],
102
+ }
103
+ for value in candidates
104
+ ],
105
+ )
106
+
107
+
108
+ @dataclass(frozen=True, slots=True)
109
+ class ProtectedCurrentPrefixForecastOpportunityChallenger:
110
+ """Challenge one incumbent continuation while preserving abstention."""
111
+
112
+ prior_candidates: tuple[EvolutionCandidate, ...]
113
+ opportunity_policy: CurrentPrefixForecastOpportunityPolicyPort = field(
114
+ repr=False,
115
+ compare=False,
116
+ )
117
+ geometry_projection: MaterializedForecastGeometryProjectionPort = field(
118
+ repr=False,
119
+ compare=False,
120
+ )
121
+ fallback_policy_id: str
122
+ fallback_policy_version: int
123
+ fallback_policy_definition_sha256: str
124
+ challenger_id: str = PROTECTED_CURRENT_PREFIX_FORECAST_OPPORTUNITY_ID
125
+ challenger_version: int = (
126
+ PROTECTED_CURRENT_PREFIX_FORECAST_OPPORTUNITY_VERSION
127
+ )
128
+ definition_sha256: str = field(init=False)
129
+
130
+ def __post_init__(self) -> None:
131
+ if (
132
+ type(self.prior_candidates) is not tuple
133
+ or not self.prior_candidates
134
+ or any(
135
+ type(value) is not EvolutionCandidate
136
+ for value in self.prior_candidates
137
+ )
138
+ ):
139
+ raise TypeError(
140
+ "prior_candidates must contain exact non-empty candidates"
141
+ )
142
+ for value in self.prior_candidates:
143
+ value.__post_init__()
144
+ candidate_ids = tuple(
145
+ value.candidate_id for value in self.prior_candidates
146
+ )
147
+ if len(candidate_ids) != len(set(candidate_ids)):
148
+ raise ValueError("prior candidate IDs must be unique")
149
+ opportunity_identity = (
150
+ validate_current_prefix_forecast_opportunity_policy(
151
+ self.opportunity_policy
152
+ )
153
+ )
154
+ if not isinstance(
155
+ self.geometry_projection,
156
+ MaterializedForecastGeometryProjectionPort,
157
+ ):
158
+ raise TypeError(
159
+ "geometry_projection must implement its application port"
160
+ )
161
+ _require_token(
162
+ self.geometry_projection.projection_id,
163
+ name="geometry projection_id",
164
+ )
165
+ if (
166
+ type(self.geometry_projection.projection_version) is not int
167
+ or self.geometry_projection.projection_version <= 0
168
+ ):
169
+ raise ValueError("geometry projection_version must be positive")
170
+ require_sha256(
171
+ self.geometry_projection.definition_sha256,
172
+ "geometry projection definition_sha256",
173
+ )
174
+ _require_token(
175
+ self.fallback_policy_id,
176
+ name="fallback_policy_id",
177
+ )
178
+ if (
179
+ type(self.fallback_policy_version) is not int
180
+ or self.fallback_policy_version <= 0
181
+ ):
182
+ raise ValueError("fallback_policy_version must be positive")
183
+ require_sha256(
184
+ self.fallback_policy_definition_sha256,
185
+ "fallback_policy_definition_sha256",
186
+ )
187
+ if (
188
+ self.challenger_id
189
+ != PROTECTED_CURRENT_PREFIX_FORECAST_OPPORTUNITY_ID
190
+ or self.challenger_version
191
+ != PROTECTED_CURRENT_PREFIX_FORECAST_OPPORTUNITY_VERSION
192
+ ):
193
+ raise ValueError("challenger identity is immutable")
194
+ object.__setattr__(
195
+ self,
196
+ "definition_sha256",
197
+ _hash(
198
+ _DEFINITION_DOMAIN,
199
+ {
200
+ "schema_version": 1,
201
+ "challenger_id": self.challenger_id,
202
+ "challenger_version": self.challenger_version,
203
+ "prior_sha256": _prior_sha256(
204
+ self.prior_candidates
205
+ ),
206
+ "opportunity_policy": {
207
+ "policy_id": opportunity_identity[0],
208
+ "policy_version": opportunity_identity[1],
209
+ "definition_sha256": opportunity_identity[2],
210
+ },
211
+ "geometry_projection": {
212
+ "projection_id": (
213
+ self.geometry_projection.projection_id
214
+ ),
215
+ "projection_version": (
216
+ self.geometry_projection.projection_version
217
+ ),
218
+ "definition_sha256": (
219
+ self.geometry_projection.definition_sha256
220
+ ),
221
+ },
222
+ "fallback_policy": {
223
+ "policy_id": self.fallback_policy_id,
224
+ "policy_version": self.fallback_policy_version,
225
+ "definition_sha256": (
226
+ self.fallback_policy_definition_sha256
227
+ ),
228
+ },
229
+ "selection": (
230
+ "positive_current_prefix_opportunity_else_fallback"
231
+ ),
232
+ "forecast_geometry_market_relation": (
233
+ "sealed_authored_geometry_intersected_with_"
234
+ "phenotype_projected_adaptive_market"
235
+ ),
236
+ "out_of_adaptive_market_forecasts": "ignored_and_logged",
237
+ "eligible_candidate_outcomes_observed": False,
238
+ "workload_objective_model_provider_prompt_config_"
239
+ "branches": False,
240
+ },
241
+ ),
242
+ )
243
+
244
+ async def freeze_geometry(
245
+ self,
246
+ *,
247
+ request: ResidualPortfolioDecisionRequest,
248
+ proposals: tuple[MaterializedActionProposalBatch, ...],
249
+ ) -> MaterializedForecastGeometryBatch:
250
+ """Freeze one complete forecast market before current outcomes."""
251
+
252
+ self.__post_init__()
253
+ geometry = await self.geometry_projection.project(
254
+ request,
255
+ proposals,
256
+ )
257
+ if type(geometry) is not MaterializedForecastGeometryBatch:
258
+ raise TypeError("geometry projection returned a foreign batch")
259
+ geometry.__post_init__()
260
+ proposal_sha256s = tuple(
261
+ sorted(value.proposal_sha256 for value in proposals)
262
+ )
263
+ if (
264
+ geometry.residual_request_sha256 != request.request_sha256
265
+ or geometry.proposal_sha256s != proposal_sha256s
266
+ ):
267
+ raise ValueError("geometry changed the sealed proposal cutoff")
268
+ return geometry
269
+
270
+ def challenge(
271
+ self,
272
+ *,
273
+ fallback: AdaptiveActionRacingDecision,
274
+ geometry: MaterializedForecastGeometryBatch,
275
+ adaptive_actions: tuple[AdaptiveActionDescriptor, ...],
276
+ selected_evaluations: tuple[MaterializedActionEvaluation, ...],
277
+ excluded_action_sha256s: tuple[str, ...] = (),
278
+ ) -> AdaptiveActionRacingDecision:
279
+ """Select a positive forecast opportunity or preserve the fallback."""
280
+
281
+ self.__post_init__()
282
+ if type(fallback) is not AdaptiveActionRacingDecision:
283
+ raise TypeError("fallback must be an exact racing decision")
284
+ fallback.__post_init__()
285
+ if (
286
+ fallback.policy_id != self.fallback_policy_id
287
+ or fallback.policy_version != self.fallback_policy_version
288
+ or fallback.policy_definition_sha256
289
+ != self.fallback_policy_definition_sha256
290
+ ):
291
+ raise ValueError("fallback decision changed policy identity")
292
+ if fallback.wave is AdaptiveActionWave.DIAGNOSTIC:
293
+ raise ValueError("diagnostic decisions cannot be challenged")
294
+ if len(fallback.selected_action_sha256s) != 1:
295
+ raise ValueError("continuation fallback must select one action")
296
+ if type(geometry) is not MaterializedForecastGeometryBatch:
297
+ raise TypeError("geometry must be an exact batch")
298
+ geometry.__post_init__()
299
+ if (
300
+ geometry.residual_request_sha256
301
+ != fallback.residual_request_sha256
302
+ ):
303
+ raise ValueError("geometry and fallback cutoffs differ")
304
+ if (
305
+ type(adaptive_actions) is not tuple
306
+ or not adaptive_actions
307
+ or any(
308
+ type(value) is not AdaptiveActionDescriptor
309
+ for value in adaptive_actions
310
+ )
311
+ ):
312
+ raise TypeError("adaptive_actions must contain exact descriptors")
313
+ action_by_sha256: dict[str, AdaptiveActionDescriptor] = {}
314
+ for value in adaptive_actions:
315
+ value.__post_init__()
316
+ if value.action_sha256 in action_by_sha256:
317
+ raise ValueError("adaptive market repeats an action")
318
+ action_by_sha256[value.action_sha256] = value
319
+ if (
320
+ type(excluded_action_sha256s) is not tuple
321
+ or excluded_action_sha256s
322
+ != tuple(sorted(set(excluded_action_sha256s)))
323
+ ):
324
+ raise ValueError(
325
+ "excluded action hashes must be unique and canonical"
326
+ )
327
+ for value in excluded_action_sha256s:
328
+ require_sha256(value, "excluded_action_sha256")
329
+ if (
330
+ not set(excluded_action_sha256s) <= set(action_by_sha256)
331
+ or set(excluded_action_sha256s)
332
+ & (
333
+ set(fallback.prior_selected_action_sha256s)
334
+ | set(fallback.selected_action_sha256s)
335
+ )
336
+ ):
337
+ raise ValueError(
338
+ "excluded actions must be open non-fallback market members"
339
+ )
340
+ if (
341
+ type(selected_evaluations) is not tuple
342
+ or not selected_evaluations
343
+ or any(
344
+ type(value) is not MaterializedActionEvaluation
345
+ for value in selected_evaluations
346
+ )
347
+ ):
348
+ raise TypeError(
349
+ "selected_evaluations must contain the real non-empty prefix"
350
+ )
351
+ evaluation_by_action: dict[str, MaterializedActionEvaluation] = {}
352
+ for value in selected_evaluations:
353
+ value.__post_init__()
354
+ action_sha256 = value.action.action_sha256
355
+ if action_sha256 in evaluation_by_action:
356
+ raise ValueError("selected evaluations repeat an action")
357
+ evaluation_by_action[action_sha256] = value
358
+ selected_ids = tuple(sorted(evaluation_by_action))
359
+ if selected_ids != fallback.prior_selected_action_sha256s:
360
+ raise ValueError("fallback and real selected prefixes differ")
361
+ expected_outcomes = tuple(
362
+ sorted(
363
+ value.evaluation_sha256
364
+ for value in selected_evaluations
365
+ )
366
+ )
367
+ # A fallback binds projected outcome hashes, while this challenger sees
368
+ # evaluation receipts. The caller validates the projected cutoff; here
369
+ # we only require the same action prefix and non-empty observed hashes.
370
+ if not fallback.observed_outcome_sha256s or not expected_outcomes:
371
+ raise ValueError("continuation challenge requires observed outcomes")
372
+
373
+ geometry_by_action = {
374
+ value.action_sha256: value for value in geometry.members
375
+ }
376
+ intersecting_action_ids = tuple(
377
+ sorted(set(geometry_by_action) & set(action_by_sha256))
378
+ )
379
+ for action_sha256 in intersecting_action_ids:
380
+ member = geometry_by_action[action_sha256]
381
+ if (
382
+ member.phenotype_identity_sha256
383
+ != action_by_sha256[action_sha256].phenotype_sha256
384
+ ):
385
+ raise ValueError(
386
+ "geometry and adaptive phenotype identities differ"
387
+ )
388
+ selected_phenotypes = {
389
+ action_by_sha256[value].phenotype_sha256
390
+ for value in selected_ids
391
+ }
392
+ eligible = tuple(
393
+ sorted(
394
+ action_sha256
395
+ for action_sha256 in intersecting_action_ids
396
+ if (
397
+ action_sha256 not in evaluation_by_action
398
+ and action_sha256
399
+ not in set(excluded_action_sha256s)
400
+ and geometry_by_action[
401
+ action_sha256
402
+ ].phenotype_identity_sha256
403
+ not in selected_phenotypes
404
+ )
405
+ )
406
+ )
407
+ consumed_geometry = tuple(
408
+ sorted(set(selected_ids) & set(geometry_by_action))
409
+ )
410
+ current_generations = {
411
+ value.candidate.generation
412
+ for value in selected_evaluations
413
+ }
414
+ if (
415
+ len(current_generations) != 1
416
+ or next(iter(current_generations)) <= 0
417
+ ):
418
+ raise ValueError(
419
+ "selected prefix must identify one positive decision index"
420
+ )
421
+ decision_index = next(iter(current_generations))
422
+ ranking = self.opportunity_policy.rank(
423
+ prior_candidates=self.prior_candidates,
424
+ current_prefix_candidates=tuple(
425
+ sorted(
426
+ (
427
+ value.candidate
428
+ for value in selected_evaluations
429
+ ),
430
+ key=lambda value: value.candidate_id.value,
431
+ )
432
+ ),
433
+ geometry=geometry,
434
+ consumed_action_sha256s=consumed_geometry,
435
+ eligible_action_sha256s=eligible,
436
+ recommendation_count=1,
437
+ action_contexts=tuple(
438
+ ArchiveOpportunityActionContext(
439
+ action_sha256=action_sha256,
440
+ decision_index=decision_index,
441
+ lane_id=action_by_sha256[action_sha256].lane_id,
442
+ operator_id=(
443
+ action_by_sha256[action_sha256].operator_id
444
+ ),
445
+ native_rank=(
446
+ action_by_sha256[action_sha256].native_rank
447
+ ),
448
+ lane_size=(
449
+ action_by_sha256[action_sha256].lane_size
450
+ ),
451
+ prior_score=(
452
+ action_by_sha256[action_sha256].prior_score
453
+ ),
454
+ parent_generated_in_current_run=(
455
+ action_by_sha256[
456
+ action_sha256
457
+ ].parent_generated_in_current_run
458
+ ),
459
+ )
460
+ for action_sha256 in eligible
461
+ ),
462
+ )
463
+ if ranking.recommended_action_sha256s:
464
+ selected_action_sha256s = (
465
+ ranking.recommended_action_sha256s
466
+ )
467
+ selection_source = (
468
+ "current_prefix_forecast_opportunity"
469
+ )
470
+ propensity = 1.0
471
+ else:
472
+ selected_action_sha256s = (
473
+ fallback.selected_action_sha256s
474
+ )
475
+ selection_source = "protected_fallback"
476
+ propensity = fallback.selection_propensity
477
+ if not set(selected_action_sha256s) <= (
478
+ set(action_by_sha256) - set(selected_ids)
479
+ ):
480
+ raise ValueError("challenger selected outside the open market")
481
+ if (
482
+ type(propensity) is not float
483
+ or not math.isfinite(propensity)
484
+ or not 0.0 < propensity <= 1.0
485
+ ):
486
+ raise ValueError("composite selection propensity is invalid")
487
+ return AdaptiveActionRacingDecision(
488
+ policy_id=self.challenger_id,
489
+ policy_version=self.challenger_version,
490
+ policy_definition_sha256=self.definition_sha256,
491
+ residual_request_sha256=(
492
+ fallback.residual_request_sha256
493
+ ),
494
+ wave=fallback.wave,
495
+ selected_action_sha256s=selected_action_sha256s,
496
+ prior_selected_action_sha256s=(
497
+ fallback.prior_selected_action_sha256s
498
+ ),
499
+ observed_outcome_sha256s=(
500
+ fallback.observed_outcome_sha256s
501
+ ),
502
+ observed_set_outcome_sha256s=(
503
+ fallback.observed_set_outcome_sha256s
504
+ ),
505
+ selection_propensity=float(propensity),
506
+ evidence=freeze_json(
507
+ {
508
+ "selection_source": selection_source,
509
+ "fallback_decision": fallback.to_record(
510
+ include_evidence=True
511
+ ),
512
+ "opportunity_ranking": ranking.to_record(
513
+ include_scores=True
514
+ ),
515
+ "geometry_batch_sha256": geometry.batch_sha256,
516
+ "geometry_member_count": len(geometry_by_action),
517
+ "adaptive_market_action_count": len(
518
+ action_by_sha256
519
+ ),
520
+ "intersecting_forecast_action_sha256s": list(
521
+ intersecting_action_ids
522
+ ),
523
+ "ignored_out_of_market_forecast_action_sha256s": list(
524
+ sorted(
525
+ set(geometry_by_action)
526
+ - set(action_by_sha256)
527
+ )
528
+ ),
529
+ "selected_real_prefix_action_sha256s": list(
530
+ selected_ids
531
+ ),
532
+ "selected_evaluation_sha256s": list(
533
+ expected_outcomes
534
+ ),
535
+ "excluded_action_sha256s": list(
536
+ excluded_action_sha256s
537
+ ),
538
+ "excluded_action_outcomes_used_for_selection": False,
539
+ "eligible_candidate_outcomes_observed": False,
540
+ "fallback_preserved_on_abstention": True,
541
+ "workload_objective_model_provider_prompt_config_"
542
+ "branches": False,
543
+ }
544
+ ),
545
+ )
546
+
547
+
548
+ __all__ = [
549
+ "PROTECTED_CURRENT_PREFIX_FORECAST_OPPORTUNITY_ID",
550
+ "PROTECTED_CURRENT_PREFIX_FORECAST_OPPORTUNITY_VERSION",
551
+ "ProtectedCurrentPrefixForecastOpportunityChallenger",
552
+ ]