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,685 @@
1
+ """Model-independent candidate pools for clean cross-model reranking assays.
2
+
3
+ The calibrated selector historically exposed one feasibility witness whose
4
+ ordering was keyed by the complete provider request. Model execution settings
5
+ therefore changed the candidate slate before a model answered. This module
6
+ owns the replacement scientific control: an oversubscribed pool keyed only by
7
+ the optimization task, replicate seed, wave, parent, finite contract, and hard
8
+ allocation constraints.
9
+
10
+ The policy never reads a model profile, call ID, prompt hash, provider setting,
11
+ option outcome, or prior evaluator value. A model may rank and forecast the
12
+ pool, but may not change its membership. Open proposal generation remains a
13
+ separate acquisition mode so reranking and generation capability can be
14
+ identified independently.
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ import hashlib
20
+ import json
21
+ from dataclasses import dataclass, field
22
+
23
+ from agent_evolve.domain.finite_variation import FiniteVariationContract
24
+ from agent_evolve.domain.patch import require_sha256
25
+ from agent_evolve.ports.portfolio_selection import (
26
+ pairwise_disjoint_parent_patch_witness,
27
+ )
28
+
29
+
30
+ POLICY_ID = "task_keyed_common_candidate_pool"
31
+ POLICY_VERSION = 7
32
+ POLICY_DEFINITION_SHA256 = hashlib.sha256(
33
+ b"agent-evolve:task-keyed-common-candidate-pool:v7;"
34
+ b"sampling-state=replicate-seed,benchmark,wave,parent,finite-contract,constraints,"
35
+ b"required-option-ids;"
36
+ b"sampling-state-excludes=universe-size,model-selection-size;"
37
+ b"decision-task-adds=universe-size,model-selection-size;"
38
+ b"candidate-universe=model-independent;outcomes=false;provider-fields=false;"
39
+ b"model-selection-size=authenticated;universe-size=authenticated;"
40
+ b"nested-universe-prefix-law=true;presentation-relative-order=state-keyed;"
41
+ b"feasible-evaluation-subset=engine-certified;"
42
+ b"certificate-members-not-prefix-positioned;presentation=independently-state-keyed;"
43
+ b"required-options-enter-membership-without-presentation-priority;"
44
+ b"prospective-joint-feasibility-witness=authenticated-current-contract;"
45
+ b"screened-pool-preserves-one-exact-controller-slate;"
46
+ b"complete-finite-contract-mode-resolves-universe-size-at-selection"
47
+ ).hexdigest()
48
+
49
+ _STATE_DOMAIN = b"agent-evolve:common-candidate-pool-state:v1\x00"
50
+ _TASK_DOMAIN = b"agent-evolve:common-candidate-pool-task:v2\x00"
51
+ _OPTION_ORDER_DOMAIN = b"agent-evolve:common-candidate-pool-option-order:v2\x00"
52
+ _PRESENTATION_ORDER_DOMAIN = (
53
+ b"agent-evolve:common-candidate-pool-presentation-order:v2\x00"
54
+ )
55
+ _DECISION_DOMAIN = b"agent-evolve:common-candidate-pool-decision:v2\x00"
56
+ _MAX_SEED = (1 << 63) - 1
57
+
58
+
59
+ def _canonical_json(value: object) -> bytes:
60
+ return json.dumps(
61
+ value,
62
+ allow_nan=False,
63
+ ensure_ascii=True,
64
+ separators=(",", ":"),
65
+ sort_keys=True,
66
+ ).encode("ascii", errors="strict")
67
+
68
+
69
+ def _hash(domain: bytes, value: object) -> str:
70
+ return hashlib.sha256(domain + _canonical_json(value)).hexdigest()
71
+
72
+
73
+ def _state_record(
74
+ *,
75
+ replicate_seed: int,
76
+ benchmark_sha256: str,
77
+ wave_index: int,
78
+ parent_configuration_sha256: str,
79
+ finite_contract_sha256: str,
80
+ evaluation_size: int,
81
+ min_distinct_families: int | None,
82
+ require_pairwise_disjoint_parent_patches: bool,
83
+ required_option_ids: tuple[str, ...],
84
+ certified_feasibility_witness_option_ids: tuple[str, ...],
85
+ ) -> dict[str, object]:
86
+ record = {
87
+ "schema_version": (
88
+ 3 if certified_feasibility_witness_option_ids else 2
89
+ ),
90
+ "replicate_seed": replicate_seed,
91
+ "benchmark_sha256": benchmark_sha256,
92
+ "wave_index": wave_index,
93
+ "parent_configuration_sha256": parent_configuration_sha256,
94
+ "finite_contract_sha256": finite_contract_sha256,
95
+ "evaluation_size": evaluation_size,
96
+ "min_distinct_families": min_distinct_families,
97
+ "require_pairwise_disjoint_parent_patches": (
98
+ require_pairwise_disjoint_parent_patches
99
+ ),
100
+ "required_option_ids": list(required_option_ids),
101
+ }
102
+ if certified_feasibility_witness_option_ids:
103
+ record["certified_feasibility_witness_option_ids"] = list(
104
+ certified_feasibility_witness_option_ids
105
+ )
106
+ return record
107
+
108
+
109
+ def _task_record(
110
+ *,
111
+ replicate_seed: int,
112
+ benchmark_sha256: str,
113
+ wave_index: int,
114
+ parent_configuration_sha256: str,
115
+ finite_contract_sha256: str,
116
+ candidate_pool_size: int,
117
+ model_selection_size: int,
118
+ evaluation_size: int,
119
+ min_distinct_families: int | None,
120
+ require_pairwise_disjoint_parent_patches: bool,
121
+ required_option_ids: tuple[str, ...],
122
+ certified_feasibility_witness_option_ids: tuple[str, ...],
123
+ ) -> dict[str, object]:
124
+ state = _state_record(
125
+ replicate_seed=replicate_seed,
126
+ benchmark_sha256=benchmark_sha256,
127
+ wave_index=wave_index,
128
+ parent_configuration_sha256=parent_configuration_sha256,
129
+ finite_contract_sha256=finite_contract_sha256,
130
+ evaluation_size=evaluation_size,
131
+ min_distinct_families=min_distinct_families,
132
+ require_pairwise_disjoint_parent_patches=(
133
+ require_pairwise_disjoint_parent_patches
134
+ ),
135
+ required_option_ids=required_option_ids,
136
+ certified_feasibility_witness_option_ids=(
137
+ certified_feasibility_witness_option_ids
138
+ ),
139
+ )
140
+ return {
141
+ **state,
142
+ "schema_version": (
143
+ 4 if certified_feasibility_witness_option_ids else 3
144
+ ),
145
+ "state_identity_sha256": _hash(_STATE_DOMAIN, state),
146
+ "candidate_pool_size": candidate_pool_size,
147
+ "model_selection_size": model_selection_size,
148
+ }
149
+
150
+
151
+ def _validate_inputs(
152
+ *,
153
+ replicate_seed: int,
154
+ benchmark_sha256: str,
155
+ wave_index: int,
156
+ parent_configuration_sha256: str,
157
+ contract: FiniteVariationContract,
158
+ candidate_pool_size: int,
159
+ model_selection_size: int,
160
+ evaluation_size: int,
161
+ min_distinct_families: int | None,
162
+ require_pairwise_disjoint_parent_patches: bool,
163
+ required_option_ids: tuple[str, ...],
164
+ certified_feasibility_witness_option_ids: tuple[str, ...],
165
+ ) -> None:
166
+ if type(replicate_seed) is not int or not 0 <= replicate_seed <= _MAX_SEED:
167
+ raise ValueError("replicate_seed must be an exact non-negative int63")
168
+ require_sha256(benchmark_sha256, "benchmark_sha256")
169
+ require_sha256(parent_configuration_sha256, "parent_configuration_sha256")
170
+ if type(contract) is not FiniteVariationContract:
171
+ raise TypeError("contract must be an exact FiniteVariationContract")
172
+ contract.__post_init__()
173
+ if contract.parent_configuration_sha256 != parent_configuration_sha256:
174
+ raise ValueError("common-pool parent differs from the finite contract")
175
+ if type(wave_index) is not int or wave_index <= 0:
176
+ raise ValueError("wave_index must be a positive exact integer")
177
+ if type(candidate_pool_size) is not int or candidate_pool_size <= 0:
178
+ raise ValueError("candidate_pool_size must be a positive exact integer")
179
+ if type(model_selection_size) is not int or not (
180
+ 0 < model_selection_size <= candidate_pool_size
181
+ ):
182
+ raise ValueError(
183
+ "model_selection_size must lie in [1, candidate_pool_size]"
184
+ )
185
+ if type(evaluation_size) is not int or not (
186
+ 0 < evaluation_size <= model_selection_size
187
+ ):
188
+ raise ValueError("evaluation_size must lie in [1, model_selection_size]")
189
+ if candidate_pool_size > len(contract.options):
190
+ raise ValueError("candidate_pool_size exceeds the finite option count")
191
+ if min_distinct_families is not None and (
192
+ type(min_distinct_families) is not int
193
+ or not 1 <= min_distinct_families <= evaluation_size
194
+ ):
195
+ raise ValueError(
196
+ "min_distinct_families must lie within the evaluation size"
197
+ )
198
+ if type(require_pairwise_disjoint_parent_patches) is not bool:
199
+ raise TypeError(
200
+ "require_pairwise_disjoint_parent_patches must be an exact bool"
201
+ )
202
+ if type(required_option_ids) is not tuple or any(
203
+ type(value) is not str for value in required_option_ids
204
+ ):
205
+ raise TypeError("required_option_ids must be an exact string tuple")
206
+ if required_option_ids != tuple(sorted(set(required_option_ids))):
207
+ raise ValueError("required_option_ids must be unique and canonical")
208
+ available = {value.option_id for value in contract.options}
209
+ if not set(required_option_ids).issubset(available):
210
+ raise ValueError("required option IDs escape the finite contract")
211
+ if len(required_option_ids) > candidate_pool_size:
212
+ raise ValueError("required option IDs exceed the candidate-pool size")
213
+ witness = certified_feasibility_witness_option_ids
214
+ if type(witness) is not tuple:
215
+ raise TypeError(
216
+ "certified_feasibility_witness_option_ids must be an exact tuple"
217
+ )
218
+ if witness:
219
+ if len(witness) != evaluation_size or witness != tuple(sorted(set(witness))):
220
+ raise ValueError(
221
+ "certified feasibility witness must contain one canonical unique "
222
+ "option per evaluation slot"
223
+ )
224
+ if not set(witness).issubset(available):
225
+ raise ValueError("certified feasibility witness escapes the finite contract")
226
+ option_by_id = {value.option_id: value for value in contract.options}
227
+ if min_distinct_families is not None and len(
228
+ {option_by_id[value].family for value in witness}
229
+ ) < min_distinct_families:
230
+ raise ValueError("certified feasibility witness violates family coverage")
231
+ if require_pairwise_disjoint_parent_patches and (
232
+ pairwise_disjoint_parent_patch_witness(
233
+ contract,
234
+ witness,
235
+ portfolio_size=evaluation_size,
236
+ min_distinct_families=min_distinct_families,
237
+ ordering_key_sha256=contract.identity_sha256,
238
+ )
239
+ is None
240
+ ):
241
+ raise ValueError(
242
+ "certified feasibility witness violates pairwise patch constraints"
243
+ )
244
+ if len(set(required_option_ids).union(witness)) > candidate_pool_size:
245
+ raise ValueError(
246
+ "candidate pool cannot preserve required options and its certified witness"
247
+ )
248
+
249
+
250
+ @dataclass(frozen=True, slots=True)
251
+ class CommonCandidatePoolDecision:
252
+ """Authenticated exact pool membership and its model-free derivation."""
253
+
254
+ replicate_seed: int
255
+ benchmark_sha256: str
256
+ wave_index: int
257
+ parent_configuration_sha256: str
258
+ finite_contract_sha256: str
259
+ candidate_pool_size: int
260
+ model_selection_size: int
261
+ evaluation_size: int
262
+ min_distinct_families: int | None
263
+ require_pairwise_disjoint_parent_patches: bool
264
+ required_option_ids: tuple[str, ...]
265
+ certified_feasibility_witness_option_ids: tuple[str, ...]
266
+ option_ids: tuple[str, ...]
267
+ feasibility_witness_option_ids: tuple[str, ...]
268
+ policy_id: str = POLICY_ID
269
+ policy_version: int = POLICY_VERSION
270
+ policy_definition_sha256: str = POLICY_DEFINITION_SHA256
271
+ state_identity_sha256: str = field(init=False)
272
+ task_identity_sha256: str = field(init=False)
273
+ decision_sha256: str = field(init=False)
274
+
275
+ def __post_init__(self) -> None:
276
+ if type(self.replicate_seed) is not int or not (
277
+ 0 <= self.replicate_seed <= _MAX_SEED
278
+ ):
279
+ raise ValueError("replicate_seed must be an exact non-negative int63")
280
+ require_sha256(self.benchmark_sha256, "benchmark_sha256")
281
+ require_sha256(
282
+ self.parent_configuration_sha256,
283
+ "parent_configuration_sha256",
284
+ )
285
+ require_sha256(self.finite_contract_sha256, "finite_contract_sha256")
286
+ require_sha256(self.policy_definition_sha256, "policy_definition_sha256")
287
+ if self.policy_id != POLICY_ID or self.policy_version != POLICY_VERSION:
288
+ raise ValueError("common-pool policy identity drifted")
289
+ if self.policy_definition_sha256 != POLICY_DEFINITION_SHA256:
290
+ raise ValueError("common-pool policy definition drifted")
291
+ if type(self.wave_index) is not int or self.wave_index <= 0:
292
+ raise ValueError("wave_index must be a positive exact integer")
293
+ if type(self.candidate_pool_size) is not int or self.candidate_pool_size <= 0:
294
+ raise ValueError("candidate_pool_size must be a positive exact integer")
295
+ if type(self.model_selection_size) is not int or not (
296
+ 0 < self.model_selection_size <= self.candidate_pool_size
297
+ ):
298
+ raise ValueError(
299
+ "model_selection_size must lie in [1, candidate_pool_size]"
300
+ )
301
+ if type(self.evaluation_size) is not int or not (
302
+ 0 < self.evaluation_size <= self.model_selection_size
303
+ ):
304
+ raise ValueError("evaluation_size must lie in [1, model_selection_size]")
305
+ if type(self.option_ids) is not tuple or len(self.option_ids) != (
306
+ self.candidate_pool_size
307
+ ):
308
+ raise ValueError("option_ids must contain the exact candidate-pool size")
309
+ if len(set(self.option_ids)) != len(self.option_ids):
310
+ raise ValueError("common candidate pool cannot repeat an option")
311
+ if type(self.required_option_ids) is not tuple or (
312
+ self.required_option_ids
313
+ != tuple(sorted(set(self.required_option_ids)))
314
+ ):
315
+ raise ValueError("required_option_ids must be unique and canonical")
316
+ if not set(self.required_option_ids).issubset(self.option_ids):
317
+ raise ValueError("required options must enter the common pool")
318
+ certified = self.certified_feasibility_witness_option_ids
319
+ if type(certified) is not tuple:
320
+ raise TypeError(
321
+ "certified_feasibility_witness_option_ids must be an exact tuple"
322
+ )
323
+ if certified and certified != self.feasibility_witness_option_ids:
324
+ raise ValueError(
325
+ "certified feasibility witness differs from the pool certificate"
326
+ )
327
+ if type(self.feasibility_witness_option_ids) is not tuple:
328
+ raise TypeError("feasibility_witness_option_ids must be an exact tuple")
329
+ if len(self.feasibility_witness_option_ids) != self.evaluation_size:
330
+ raise ValueError("feasibility witness must cover the evaluation size")
331
+ if not set(self.feasibility_witness_option_ids).issubset(self.option_ids):
332
+ raise ValueError("feasibility witness escapes the common pool")
333
+ state_identity = _hash(_STATE_DOMAIN, self._state_record())
334
+ task_identity = _hash(_TASK_DOMAIN, self._task_record())
335
+ object.__setattr__(self, "state_identity_sha256", state_identity)
336
+ object.__setattr__(self, "task_identity_sha256", task_identity)
337
+ object.__setattr__(
338
+ self,
339
+ "decision_sha256",
340
+ _hash(_DECISION_DOMAIN, self._unsigned_record()),
341
+ )
342
+
343
+ def _state_record(self) -> dict[str, object]:
344
+ return _state_record(
345
+ replicate_seed=self.replicate_seed,
346
+ benchmark_sha256=self.benchmark_sha256,
347
+ wave_index=self.wave_index,
348
+ parent_configuration_sha256=self.parent_configuration_sha256,
349
+ finite_contract_sha256=self.finite_contract_sha256,
350
+ evaluation_size=self.evaluation_size,
351
+ min_distinct_families=self.min_distinct_families,
352
+ require_pairwise_disjoint_parent_patches=(
353
+ self.require_pairwise_disjoint_parent_patches
354
+ ),
355
+ required_option_ids=self.required_option_ids,
356
+ certified_feasibility_witness_option_ids=(
357
+ self.certified_feasibility_witness_option_ids
358
+ ),
359
+ )
360
+
361
+ def _task_record(self) -> dict[str, object]:
362
+ return _task_record(
363
+ replicate_seed=self.replicate_seed,
364
+ benchmark_sha256=self.benchmark_sha256,
365
+ wave_index=self.wave_index,
366
+ parent_configuration_sha256=self.parent_configuration_sha256,
367
+ finite_contract_sha256=self.finite_contract_sha256,
368
+ candidate_pool_size=self.candidate_pool_size,
369
+ model_selection_size=self.model_selection_size,
370
+ evaluation_size=self.evaluation_size,
371
+ min_distinct_families=self.min_distinct_families,
372
+ require_pairwise_disjoint_parent_patches=(
373
+ self.require_pairwise_disjoint_parent_patches
374
+ ),
375
+ required_option_ids=self.required_option_ids,
376
+ certified_feasibility_witness_option_ids=(
377
+ self.certified_feasibility_witness_option_ids
378
+ ),
379
+ )
380
+
381
+ def _unsigned_record(self) -> dict[str, object]:
382
+ return {
383
+ "schema_version": 4,
384
+ "state": self._state_record(),
385
+ "state_identity_sha256": _hash(
386
+ _STATE_DOMAIN,
387
+ self._state_record(),
388
+ ),
389
+ "task": self._task_record(),
390
+ "task_identity_sha256": _hash(_TASK_DOMAIN, self._task_record()),
391
+ "option_ids": list(self.option_ids),
392
+ "required_option_ids": list(self.required_option_ids),
393
+ "certified_feasibility_witness_option_ids": list(
394
+ self.certified_feasibility_witness_option_ids
395
+ ),
396
+ "feasibility_witness_option_ids": list(
397
+ self.feasibility_witness_option_ids
398
+ ),
399
+ "policy": {
400
+ "policy_id": self.policy_id,
401
+ "policy_version": self.policy_version,
402
+ "definition_sha256": self.policy_definition_sha256,
403
+ },
404
+ "model_or_provider_fields_consulted": False,
405
+ "objective_or_outcome_values_consulted": False,
406
+ }
407
+
408
+ def to_record(self) -> dict[str, object]:
409
+ self.__post_init__()
410
+ return {**self._unsigned_record(), "decision_sha256": self.decision_sha256}
411
+
412
+ def to_prompt_record(self) -> dict[str, object]:
413
+ """Return model-visible membership without the hidden feasible subset."""
414
+
415
+ self.__post_init__()
416
+ return {
417
+ "schema_version": 3,
418
+ "state_identity_sha256": self.state_identity_sha256,
419
+ "task_identity_sha256": self.task_identity_sha256,
420
+ "decision_sha256": self.decision_sha256,
421
+ "option_ids": list(self.option_ids),
422
+ "candidate_pool_size": self.candidate_pool_size,
423
+ "model_selection_size": self.model_selection_size,
424
+ "membership_is_fixed": True,
425
+ "model_must_select_and_rank_exact_count": self.model_selection_size,
426
+ "model_or_provider_fields_consulted": False,
427
+ "objective_or_outcome_values_consulted": False,
428
+ }
429
+
430
+
431
+ @dataclass(frozen=True, slots=True)
432
+ class TaskKeyedCommonCandidatePoolPolicy:
433
+ """Construct one exact candidate universe independently of the model."""
434
+
435
+ replicate_seed: int
436
+ candidate_pool_size: int | None = 8
437
+ model_selection_size: int = 8
438
+ policy_id: str = POLICY_ID
439
+ policy_version: int = POLICY_VERSION
440
+ policy_definition_sha256: str = POLICY_DEFINITION_SHA256
441
+
442
+ def __post_init__(self) -> None:
443
+ if type(self.replicate_seed) is not int or not (
444
+ 0 <= self.replicate_seed <= _MAX_SEED
445
+ ):
446
+ raise ValueError("replicate_seed must be an exact non-negative int63")
447
+ if self.candidate_pool_size is not None and (
448
+ type(self.candidate_pool_size) is not int
449
+ or self.candidate_pool_size <= 0
450
+ ):
451
+ raise ValueError(
452
+ "candidate_pool_size must be a positive exact integer or None"
453
+ )
454
+ if type(self.model_selection_size) is not int or (
455
+ self.model_selection_size <= 0
456
+ or (
457
+ self.candidate_pool_size is not None
458
+ and self.model_selection_size > self.candidate_pool_size
459
+ )
460
+ ):
461
+ raise ValueError(
462
+ "model_selection_size must be positive and fit the candidate pool"
463
+ )
464
+ if self.policy_id != POLICY_ID or self.policy_version != POLICY_VERSION:
465
+ raise ValueError("common-pool policy identity drifted")
466
+ if self.policy_definition_sha256 != POLICY_DEFINITION_SHA256:
467
+ raise ValueError("common-pool policy definition drifted")
468
+
469
+ def select(
470
+ self,
471
+ *,
472
+ benchmark_sha256: str,
473
+ wave_index: int,
474
+ parent_configuration_sha256: str,
475
+ contract: FiniteVariationContract,
476
+ evaluation_size: int,
477
+ min_distinct_families: int | None,
478
+ require_pairwise_disjoint_parent_patches: bool,
479
+ required_option_ids: tuple[str, ...] = (),
480
+ certified_feasibility_witness_option_ids: tuple[str, ...] = (),
481
+ ) -> CommonCandidatePoolDecision:
482
+ self.__post_init__()
483
+ if type(contract) is not FiniteVariationContract:
484
+ raise TypeError("contract must be an exact FiniteVariationContract")
485
+ contract.__post_init__()
486
+ candidate_pool_size = (
487
+ len(contract.options)
488
+ if self.candidate_pool_size is None
489
+ else self.candidate_pool_size
490
+ )
491
+ _validate_inputs(
492
+ replicate_seed=self.replicate_seed,
493
+ benchmark_sha256=benchmark_sha256,
494
+ wave_index=wave_index,
495
+ parent_configuration_sha256=parent_configuration_sha256,
496
+ contract=contract,
497
+ candidate_pool_size=candidate_pool_size,
498
+ model_selection_size=self.model_selection_size,
499
+ evaluation_size=evaluation_size,
500
+ min_distinct_families=min_distinct_families,
501
+ require_pairwise_disjoint_parent_patches=(
502
+ require_pairwise_disjoint_parent_patches
503
+ ),
504
+ required_option_ids=required_option_ids,
505
+ certified_feasibility_witness_option_ids=(
506
+ certified_feasibility_witness_option_ids
507
+ ),
508
+ )
509
+ state = _state_record(
510
+ replicate_seed=self.replicate_seed,
511
+ benchmark_sha256=benchmark_sha256,
512
+ wave_index=wave_index,
513
+ parent_configuration_sha256=parent_configuration_sha256,
514
+ finite_contract_sha256=contract.identity_sha256,
515
+ evaluation_size=evaluation_size,
516
+ min_distinct_families=min_distinct_families,
517
+ require_pairwise_disjoint_parent_patches=(
518
+ require_pairwise_disjoint_parent_patches
519
+ ),
520
+ required_option_ids=required_option_ids,
521
+ certified_feasibility_witness_option_ids=(
522
+ certified_feasibility_witness_option_ids
523
+ ),
524
+ )
525
+ state_identity = _hash(_STATE_DOMAIN, state)
526
+ all_option_ids = tuple(option.option_id for option in contract.options)
527
+ keyed_order = tuple(
528
+ sorted(
529
+ all_option_ids,
530
+ key=lambda option_id: (
531
+ hashlib.sha256(
532
+ _OPTION_ORDER_DOMAIN
533
+ + bytes.fromhex(state_identity)
534
+ + option_id.encode("ascii", errors="strict")
535
+ ).digest(),
536
+ option_id,
537
+ ),
538
+ )
539
+ )
540
+ if certified_feasibility_witness_option_ids:
541
+ witness = certified_feasibility_witness_option_ids
542
+ elif require_pairwise_disjoint_parent_patches:
543
+ witness = pairwise_disjoint_parent_patch_witness(
544
+ contract,
545
+ all_option_ids,
546
+ portfolio_size=evaluation_size,
547
+ min_distinct_families=min_distinct_families,
548
+ ordering_key_sha256=state_identity,
549
+ )
550
+ if witness is None: # The public request should already fail first.
551
+ raise ValueError("finite contract has no common-pool witness")
552
+ else:
553
+ witness = keyed_order[:evaluation_size]
554
+ members = list(witness)
555
+ members.extend(
556
+ option_id for option_id in required_option_ids if option_id not in members
557
+ )
558
+ if len(members) > candidate_pool_size:
559
+ raise ValueError(
560
+ "candidate pool cannot contain both its feasibility witness and "
561
+ "all required options"
562
+ )
563
+ members.extend(
564
+ option_id
565
+ for option_id in keyed_order
566
+ if option_id not in members
567
+ )
568
+ selected_members = frozenset(members[:candidate_pool_size])
569
+ presentation_order = tuple(
570
+ sorted(
571
+ all_option_ids,
572
+ key=lambda option_id: (
573
+ hashlib.sha256(
574
+ _PRESENTATION_ORDER_DOMAIN
575
+ + bytes.fromhex(state_identity)
576
+ + option_id.encode("ascii", errors="strict")
577
+ ).digest(),
578
+ option_id,
579
+ ),
580
+ )
581
+ )
582
+ ordered_members = [
583
+ option_id
584
+ for option_id in presentation_order
585
+ if option_id in selected_members
586
+ ]
587
+ # Every pool larger than the hidden feasibility certificate contains
588
+ # this same state-keyed non-certificate guard. Placing it first keeps
589
+ # the certificate from becoming a visible answer prefix while
590
+ # preserving one relative presentation order for nested M assays.
591
+ witness_set = set(witness)
592
+ required_set = set(required_option_ids)
593
+ presentation_guard = next(
594
+ (
595
+ value
596
+ for value in members
597
+ if value not in witness_set and value not in required_set
598
+ ),
599
+ None,
600
+ )
601
+ if presentation_guard in selected_members:
602
+ ordered_members = [
603
+ presentation_guard,
604
+ *(value for value in ordered_members if value != presentation_guard),
605
+ ]
606
+ option_ids = tuple(ordered_members)
607
+ return CommonCandidatePoolDecision(
608
+ replicate_seed=self.replicate_seed,
609
+ benchmark_sha256=benchmark_sha256,
610
+ wave_index=wave_index,
611
+ parent_configuration_sha256=parent_configuration_sha256,
612
+ finite_contract_sha256=contract.identity_sha256,
613
+ candidate_pool_size=candidate_pool_size,
614
+ model_selection_size=self.model_selection_size,
615
+ evaluation_size=evaluation_size,
616
+ min_distinct_families=min_distinct_families,
617
+ require_pairwise_disjoint_parent_patches=(
618
+ require_pairwise_disjoint_parent_patches
619
+ ),
620
+ required_option_ids=required_option_ids,
621
+ certified_feasibility_witness_option_ids=(
622
+ certified_feasibility_witness_option_ids
623
+ ),
624
+ option_ids=option_ids,
625
+ feasibility_witness_option_ids=tuple(witness),
626
+ )
627
+
628
+ def require_decision(
629
+ self,
630
+ decision: CommonCandidatePoolDecision,
631
+ *,
632
+ benchmark_sha256: str,
633
+ wave_index: int,
634
+ parent_configuration_sha256: str,
635
+ contract: FiniteVariationContract,
636
+ evaluation_size: int,
637
+ min_distinct_families: int | None,
638
+ require_pairwise_disjoint_parent_patches: bool,
639
+ required_option_ids: tuple[str, ...] = (),
640
+ certified_feasibility_witness_option_ids: tuple[str, ...] = (),
641
+ ) -> None:
642
+ if type(decision) is not CommonCandidatePoolDecision:
643
+ raise TypeError("decision must be an exact CommonCandidatePoolDecision")
644
+ expected = self.select(
645
+ benchmark_sha256=benchmark_sha256,
646
+ wave_index=wave_index,
647
+ parent_configuration_sha256=parent_configuration_sha256,
648
+ contract=contract,
649
+ evaluation_size=evaluation_size,
650
+ min_distinct_families=min_distinct_families,
651
+ require_pairwise_disjoint_parent_patches=(
652
+ require_pairwise_disjoint_parent_patches
653
+ ),
654
+ required_option_ids=required_option_ids,
655
+ certified_feasibility_witness_option_ids=(
656
+ certified_feasibility_witness_option_ids
657
+ ),
658
+ )
659
+ if decision.to_record() != expected.to_record():
660
+ raise ValueError("common candidate pool differs from exact policy replay")
661
+
662
+ def to_record(self) -> dict[str, object]:
663
+ self.__post_init__()
664
+ return {
665
+ "policy_id": self.policy_id,
666
+ "policy_version": self.policy_version,
667
+ "definition_sha256": self.policy_definition_sha256,
668
+ "replicate_seed": self.replicate_seed,
669
+ "candidate_pool_size": self.candidate_pool_size,
670
+ "candidate_pool_mode": (
671
+ "complete_finite_contract"
672
+ if self.candidate_pool_size is None
673
+ else "fixed_size"
674
+ ),
675
+ "model_selection_size": self.model_selection_size,
676
+ }
677
+
678
+
679
+ __all__ = [
680
+ "CommonCandidatePoolDecision",
681
+ "POLICY_DEFINITION_SHA256",
682
+ "POLICY_ID",
683
+ "POLICY_VERSION",
684
+ "TaskKeyedCommonCandidatePoolPolicy",
685
+ ]