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,814 @@
1
+ """Outcome-blind model anchors with one full-abstention frontier probe.
2
+
3
+ The policy is intentionally small. It keeps the model-ranked top three and,
4
+ when the model fully abstains on every objective for an outside candidate,
5
+ spends the fourth evaluation on the most structurally novel such candidate.
6
+ Partial abstention is not an exploration trigger. In the absence of a full
7
+ abstention the policy evaluates the model top four.
8
+
9
+ Evaluation allocation is a portfolio-learning decision, while pairwise patch
10
+ compatibility and minimum family coverage are mating/recombination concerns.
11
+ Historical requests conflate those stages, so this module makes their removal
12
+ an explicit, authenticated projection. Phenotype uniqueness and bounded
13
+ memory-dose safety remain hard evaluation constraints.
14
+ """
15
+
16
+ from __future__ import annotations
17
+
18
+ import hashlib
19
+ import json
20
+ from dataclasses import dataclass, replace
21
+ from enum import Enum
22
+ from itertools import combinations
23
+ from typing import ClassVar
24
+
25
+ from agent_evolve.domain.patch import require_sha256
26
+ from agent_evolve.policies.selection.calibrated_slate import (
27
+ CalibratedSlateMember,
28
+ SlateAllocationRequest,
29
+ assess_allocated_slate_memory_dose,
30
+ )
31
+ from agent_evolve.ports.agentic_generator import MetricEffectDirection
32
+ from agent_evolve.ports.portfolio_memory_dose import (
33
+ PortfolioMemoryDoseAssessment,
34
+ )
35
+
36
+
37
+ POLICY_ID = "model_anchored_full_abstention_frontier_probe"
38
+ POLICY_VERSION = 1
39
+ POLICY_DEFINITION_SHA256 = hashlib.sha256(
40
+ b"agent-evolve:model-anchored-full-abstention-frontier-probe:v1;"
41
+ b"slate-size=8;portfolio-size=4;model-anchors=3;"
42
+ b"probe-trigger=full-vector-unknown-outside-anchor-prefix;"
43
+ b"partial-abstention-trigger=false;"
44
+ b"probe-rank=mean-archive-novelty-and-structural-coverage;"
45
+ b"no-probe=model-top-four;phenotype-uniqueness=hard;"
46
+ b"bounded-memory-dose=hard;assigned-cards-without-dose=advisory;"
47
+ b"mating-constraints=explicitly-projected-from-evaluation;"
48
+ b"ties=model-rank,option-id;outcome-blind=true;"
49
+ b"benchmark-specific-parameters=none"
50
+ ).hexdigest()
51
+
52
+ PROJECTION_POLICY_ID = "evaluation_allocation_constraint_projection"
53
+ PROJECTION_POLICY_VERSION = 1
54
+ PROJECTION_DEFINITION_SHA256 = hashlib.sha256(
55
+ b"agent-evolve:evaluation-allocation-constraint-projection:v1;"
56
+ b"remove=pairwise-disjoint-option-pairs,min-distinct-families;"
57
+ b"preserve=slate,portfolio-size,objectives,cards,calibration,"
58
+ b"bounded-memory-dose;scope=evaluation-only;"
59
+ b"downstream-mating-compatibility-unchanged=true"
60
+ ).hexdigest()
61
+
62
+ _DECISION_DOMAIN = b"agent-evolve:frontier-probe-slate-decision:v1\x00"
63
+ _PROJECTION_DOMAIN = b"agent-evolve:evaluation-constraint-projection:v1\x00"
64
+ _CONFIGURATION_DOMAIN = b"agent-evolve:frontier-probe-config:v1\x00"
65
+ _SLATE_SIZE = 8
66
+ _PORTFOLIO_SIZE = 4
67
+ _MODEL_ANCHOR_COUNT = 3
68
+
69
+
70
+ def _canonical_json(value: object) -> bytes:
71
+ return json.dumps(
72
+ value,
73
+ allow_nan=False,
74
+ ensure_ascii=True,
75
+ separators=(",", ":"),
76
+ sort_keys=True,
77
+ ).encode("ascii", errors="strict")
78
+
79
+
80
+ def _hash(domain: bytes, value: object) -> str:
81
+ return hashlib.sha256(domain + _canonical_json(value)).hexdigest()
82
+
83
+
84
+ def _configuration_record() -> dict[str, object]:
85
+ return {
86
+ "schema_version": 1,
87
+ "slate_size": _SLATE_SIZE,
88
+ "portfolio_size": _PORTFOLIO_SIZE,
89
+ "model_anchor_count": _MODEL_ANCHOR_COUNT,
90
+ "probe_trigger": "full_vector_abstention_outside_anchor_prefix",
91
+ "probe_structural_score": (
92
+ "mean_archive_novelty_and_structural_coverage"
93
+ ),
94
+ "partial_abstention_is_probe": False,
95
+ "hard_evaluation_constraints": [
96
+ "distinct_option_identity",
97
+ "distinct_phenotype_identity",
98
+ "bounded_memory_dose_when_present",
99
+ ],
100
+ "projected_mating_constraints": [
101
+ "pairwise_disjoint_option_id_pairs",
102
+ "min_distinct_families",
103
+ ],
104
+ "benchmark_specific_parameters": [],
105
+ }
106
+
107
+
108
+ CONFIGURATION_SHA256 = _hash(_CONFIGURATION_DOMAIN, _configuration_record())
109
+
110
+
111
+ @dataclass(frozen=True, slots=True, eq=False)
112
+ class EvaluationAllocationConstraintProjection:
113
+ """Authenticated separation of evaluation and mating constraints."""
114
+
115
+ source_request: SlateAllocationRequest
116
+ projected_request: SlateAllocationRequest
117
+
118
+ policy_id: ClassVar[str] = PROJECTION_POLICY_ID
119
+ policy_version: ClassVar[int] = PROJECTION_POLICY_VERSION
120
+ policy_definition_sha256: ClassVar[str] = PROJECTION_DEFINITION_SHA256
121
+
122
+ def __post_init__(self) -> None:
123
+ if type(self.source_request) is not SlateAllocationRequest:
124
+ raise TypeError("source_request must be exact SlateAllocationRequest")
125
+ if type(self.projected_request) is not SlateAllocationRequest:
126
+ raise TypeError("projected_request must be exact SlateAllocationRequest")
127
+ self.source_request.revalidate()
128
+ self.projected_request.revalidate()
129
+ expected = replace(
130
+ self.source_request,
131
+ pairwise_disjoint_option_id_pairs=None,
132
+ min_distinct_families=None,
133
+ )
134
+ if self.projected_request != expected:
135
+ raise ValueError(
136
+ "projected request differs beyond mating-only constraints"
137
+ )
138
+
139
+ def revalidate(self) -> None:
140
+ if type(self) is not EvaluationAllocationConstraintProjection:
141
+ raise TypeError("projection must be exact")
142
+ EvaluationAllocationConstraintProjection.__post_init__(self)
143
+
144
+ @property
145
+ def removed_pairwise_constraint(self) -> bool:
146
+ self.revalidate()
147
+ return self.source_request.pairwise_disjoint_option_id_pairs is not None
148
+
149
+ @property
150
+ def removed_pair_count(self) -> int:
151
+ self.revalidate()
152
+ pairs = self.source_request.pairwise_disjoint_option_id_pairs
153
+ return 0 if pairs is None else len(pairs)
154
+
155
+ @property
156
+ def removed_min_distinct_families(self) -> int | None:
157
+ self.revalidate()
158
+ return self.source_request.min_distinct_families
159
+
160
+ def _unsigned_record(self) -> dict[str, object]:
161
+ self.revalidate()
162
+ return {
163
+ "schema_version": 1,
164
+ "event_type": "evaluation_allocation_constraints_projected",
165
+ "policy_id": self.policy_id,
166
+ "policy_version": self.policy_version,
167
+ "policy_definition_sha256": self.policy_definition_sha256,
168
+ "source_request_sha256": self.source_request.request_sha256,
169
+ "projected_request_sha256": self.projected_request.request_sha256,
170
+ "removed_pairwise_constraint": self.removed_pairwise_constraint,
171
+ "removed_pair_count": self.removed_pair_count,
172
+ "removed_min_distinct_families": (
173
+ self.removed_min_distinct_families
174
+ ),
175
+ "preserved_memory_dose_contract_sha256": (
176
+ None
177
+ if self.projected_request.memory_dose_contract is None
178
+ else self.projected_request.memory_dose_contract.contract_sha256
179
+ ),
180
+ "scope": (
181
+ "evaluation_allocation_only_downstream_mating_constraints_"
182
+ "remain_authoritative"
183
+ ),
184
+ }
185
+
186
+ @property
187
+ def projection_sha256(self) -> str:
188
+ return _hash(_PROJECTION_DOMAIN, self._unsigned_record())
189
+
190
+ def to_record(self) -> dict[str, object]:
191
+ return {
192
+ **self._unsigned_record(),
193
+ "projection_sha256": self.projection_sha256,
194
+ }
195
+
196
+ def __eq__(self, other: object) -> bool:
197
+ return (
198
+ type(other) is EvaluationAllocationConstraintProjection
199
+ and self.projection_sha256 == other.projection_sha256
200
+ )
201
+
202
+ __hash__ = None
203
+
204
+
205
+ def project_evaluation_allocation_request(
206
+ request: SlateAllocationRequest,
207
+ ) -> EvaluationAllocationConstraintProjection:
208
+ """Remove only mating-specific constraints from an evaluation request."""
209
+
210
+ if type(request) is not SlateAllocationRequest:
211
+ raise TypeError("request must be exact SlateAllocationRequest")
212
+ request.revalidate()
213
+ return EvaluationAllocationConstraintProjection(
214
+ source_request=request,
215
+ projected_request=replace(
216
+ request,
217
+ pairwise_disjoint_option_id_pairs=None,
218
+ min_distinct_families=None,
219
+ ),
220
+ )
221
+
222
+
223
+ class FrontierProbeSlateRole(str, Enum):
224
+ """Engine-owned provenance for each selected evaluation."""
225
+
226
+ MODEL_ANCHOR = "model_anchor"
227
+ MODEL_FILL = "model_fill"
228
+ FULL_ABSTENTION_FRONTIER_PROBE = "full_abstention_frontier_probe"
229
+ SAFETY_RECOURSE = "safety_recourse"
230
+
231
+
232
+ @dataclass(frozen=True, slots=True)
233
+ class FrontierProbeMemberEvidence:
234
+ """Outcome-free evidence used by the allocator for one member."""
235
+
236
+ option_id: str
237
+ option_identity_sha256: str
238
+ phenotype_identity_sha256: str
239
+ model_rank: int
240
+ unknown_metric_ids: tuple[str, ...]
241
+ full_vector_abstention: bool
242
+ structural_frontier_score: float
243
+ supported_assigned_card_keys: tuple[str, ...]
244
+
245
+ def __post_init__(self) -> None:
246
+ if type(self.option_id) is not str or not self.option_id:
247
+ raise ValueError("option_id must be a non-empty string")
248
+ require_sha256(self.option_identity_sha256, "option_identity_sha256")
249
+ require_sha256(
250
+ self.phenotype_identity_sha256,
251
+ "phenotype_identity_sha256",
252
+ )
253
+ if type(self.model_rank) is not int or self.model_rank <= 0:
254
+ raise ValueError("model_rank must be a positive exact integer")
255
+ if type(self.unknown_metric_ids) is not tuple or any(
256
+ type(value) is not str or not value
257
+ for value in self.unknown_metric_ids
258
+ ):
259
+ raise TypeError("unknown_metric_ids must be an exact string tuple")
260
+ if self.unknown_metric_ids != tuple(
261
+ sorted(set(self.unknown_metric_ids))
262
+ ):
263
+ raise ValueError("unknown_metric_ids must be unique and canonical")
264
+ if type(self.full_vector_abstention) is not bool:
265
+ raise TypeError("full_vector_abstention must be exact bool")
266
+ if type(self.structural_frontier_score) is not float or not (
267
+ 0.0 <= self.structural_frontier_score <= 1.0
268
+ ):
269
+ raise ValueError("structural_frontier_score must lie in [0, 1]")
270
+ if type(self.supported_assigned_card_keys) is not tuple or any(
271
+ type(value) is not str or not value
272
+ for value in self.supported_assigned_card_keys
273
+ ):
274
+ raise TypeError(
275
+ "supported_assigned_card_keys must be an exact string tuple"
276
+ )
277
+ if self.supported_assigned_card_keys != tuple(
278
+ sorted(set(self.supported_assigned_card_keys))
279
+ ):
280
+ raise ValueError(
281
+ "supported_assigned_card_keys must be unique and canonical"
282
+ )
283
+
284
+ def to_record(self) -> dict[str, object]:
285
+ self.__post_init__()
286
+ return {
287
+ "option_id": self.option_id,
288
+ "option_identity_sha256": self.option_identity_sha256,
289
+ "phenotype_identity_sha256": self.phenotype_identity_sha256,
290
+ "model_rank": self.model_rank,
291
+ "unknown_metric_ids": list(self.unknown_metric_ids),
292
+ "full_vector_abstention": self.full_vector_abstention,
293
+ "structural_frontier_score_hex": (
294
+ self.structural_frontier_score.hex()
295
+ ),
296
+ "supported_assigned_card_keys": list(
297
+ self.supported_assigned_card_keys
298
+ ),
299
+ }
300
+
301
+
302
+ @dataclass(frozen=True, slots=True)
303
+ class FrontierProbeAllocatedMember:
304
+ """One selected member and its outcome-free selection role."""
305
+
306
+ role: FrontierProbeSlateRole
307
+ option_id: str
308
+ option_identity_sha256: str
309
+ model_rank: int
310
+ full_vector_abstention: bool
311
+ structural_frontier_score: float
312
+
313
+ def __post_init__(self) -> None:
314
+ if type(self.role) is not FrontierProbeSlateRole:
315
+ raise TypeError("role must be exact FrontierProbeSlateRole")
316
+ if type(self.option_id) is not str or not self.option_id:
317
+ raise ValueError("option_id must be a non-empty string")
318
+ require_sha256(self.option_identity_sha256, "option_identity_sha256")
319
+ if type(self.model_rank) is not int or self.model_rank <= 0:
320
+ raise ValueError("model_rank must be a positive exact integer")
321
+ if type(self.full_vector_abstention) is not bool:
322
+ raise TypeError("full_vector_abstention must be exact bool")
323
+ if type(self.structural_frontier_score) is not float or not (
324
+ 0.0 <= self.structural_frontier_score <= 1.0
325
+ ):
326
+ raise ValueError("structural_frontier_score must lie in [0, 1]")
327
+
328
+ def to_record(self) -> dict[str, object]:
329
+ self.__post_init__()
330
+ return {
331
+ "role": self.role.value,
332
+ "option_id": self.option_id,
333
+ "option_identity_sha256": self.option_identity_sha256,
334
+ "model_rank": self.model_rank,
335
+ "full_vector_abstention": self.full_vector_abstention,
336
+ "structural_frontier_score_hex": (
337
+ self.structural_frontier_score.hex()
338
+ ),
339
+ }
340
+
341
+
342
+ @dataclass(frozen=True, slots=True)
343
+ class _FrontierProbeAssignment:
344
+ selected: tuple[FrontierProbeAllocatedMember, ...]
345
+ target_option_ids: tuple[str, ...]
346
+ available_full_abstention_option_ids: tuple[str, ...]
347
+ selected_probe_option_id: str | None
348
+ retained_target_count: int
349
+ ideal_target_feasible: bool
350
+ feasible_subset_count: int
351
+ distinct_family_count: int
352
+ distinct_locus_count: int
353
+ distinct_phenotype_count: int
354
+ administered_card_keys: tuple[str, ...]
355
+ memory_dose_assessment: PortfolioMemoryDoseAssessment | None
356
+
357
+
358
+ def _member_evidence(
359
+ request: SlateAllocationRequest,
360
+ member: CalibratedSlateMember,
361
+ ) -> FrontierProbeMemberEvidence:
362
+ unknown_metric_ids = tuple(
363
+ prediction.metric_id
364
+ for prediction in member.predictions
365
+ if prediction.asserted_direction is MetricEffectDirection.UNKNOWN
366
+ )
367
+ metric_count = len(member.predictions)
368
+ structural_frontier_score = (
369
+ member.structural_evidence.archive_novelty_score
370
+ + member.structural_evidence.structural_coverage_score
371
+ ) / 2.0
372
+ return FrontierProbeMemberEvidence(
373
+ option_id=member.option_id,
374
+ option_identity_sha256=member.option_identity_sha256,
375
+ phenotype_identity_sha256=member.phenotype_identity_sha256,
376
+ model_rank=member.model_rank,
377
+ unknown_metric_ids=unknown_metric_ids,
378
+ full_vector_abstention=(len(unknown_metric_ids) == metric_count),
379
+ structural_frontier_score=structural_frontier_score,
380
+ supported_assigned_card_keys=tuple(
381
+ card
382
+ for card in request.assigned_card_keys
383
+ if card in member.supporting_card_keys
384
+ ),
385
+ )
386
+
387
+
388
+ def _target(
389
+ rows: tuple[FrontierProbeMemberEvidence, ...],
390
+ ) -> tuple[tuple[str, ...], tuple[str, ...], str | None]:
391
+ anchors = rows[:_MODEL_ANCHOR_COUNT]
392
+ outside_abstentions = tuple(
393
+ row
394
+ for row in rows[_MODEL_ANCHOR_COUNT:]
395
+ if row.full_vector_abstention
396
+ )
397
+ probe = (
398
+ None
399
+ if not outside_abstentions
400
+ else min(
401
+ outside_abstentions,
402
+ key=lambda row: (
403
+ -row.structural_frontier_score,
404
+ row.model_rank,
405
+ row.option_id,
406
+ ),
407
+ )
408
+ )
409
+ fourth = rows[_MODEL_ANCHOR_COUNT] if probe is None else probe
410
+ return (
411
+ tuple(row.option_id for row in anchors) + (fourth.option_id,),
412
+ tuple(row.option_id for row in outside_abstentions),
413
+ None if probe is None else probe.option_id,
414
+ )
415
+
416
+
417
+ def _best_assignment(
418
+ request: SlateAllocationRequest,
419
+ rows: tuple[FrontierProbeMemberEvidence, ...],
420
+ ) -> _FrontierProbeAssignment:
421
+ row_by_id = {row.option_id: row for row in rows}
422
+ target_ids, available_abstentions, probe_id = _target(rows)
423
+ target_set = set(target_ids)
424
+ anchor_ids = {row.option_id for row in rows[:_MODEL_ANCHOR_COUNT]}
425
+ feasible: list[
426
+ tuple[
427
+ tuple[object, ...],
428
+ tuple[CalibratedSlateMember, ...],
429
+ PortfolioMemoryDoseAssessment | None,
430
+ tuple[str, ...],
431
+ int,
432
+ int,
433
+ int,
434
+ ]
435
+ ] = []
436
+ for subset in combinations(request.slate.members, request.portfolio_size):
437
+ phenotype_count = len(
438
+ {member.phenotype_identity_sha256 for member in subset}
439
+ )
440
+ if phenotype_count != request.portfolio_size:
441
+ continue
442
+ dose_assessment = (
443
+ None
444
+ if request.memory_dose_contract is None
445
+ else assess_allocated_slate_memory_dose(request, subset)
446
+ )
447
+ if dose_assessment is not None and not dose_assessment.passed:
448
+ continue
449
+ subset_ids = {member.option_id for member in subset}
450
+ retained_target_count = len(target_set & subset_ids)
451
+ retained_anchor_count = len(anchor_ids & subset_ids)
452
+ probe_displaced = probe_id is not None and probe_id not in subset_ids
453
+ ranks = tuple(member.model_rank for member in subset)
454
+ structural_sum = sum(
455
+ row_by_id[member.option_id].structural_frontier_score
456
+ for member in subset
457
+ )
458
+ administered = tuple(
459
+ sorted(
460
+ {
461
+ card
462
+ for member in subset
463
+ for card in row_by_id[
464
+ member.option_id
465
+ ].supported_assigned_card_keys
466
+ }
467
+ )
468
+ )
469
+ family_count = len({member.family for member in subset})
470
+ locus_count = len({member.locus_key for member in subset})
471
+ key: tuple[object, ...] = (
472
+ -retained_target_count,
473
+ -retained_anchor_count,
474
+ probe_displaced,
475
+ sum(ranks),
476
+ ranks,
477
+ -structural_sum,
478
+ tuple(member.option_id for member in subset),
479
+ )
480
+ feasible.append(
481
+ (
482
+ key,
483
+ subset,
484
+ dose_assessment,
485
+ administered,
486
+ family_count,
487
+ locus_count,
488
+ phenotype_count,
489
+ )
490
+ )
491
+ if not feasible:
492
+ raise ValueError(
493
+ "slate has no phenotype-unique K4 satisfying bounded memory dose"
494
+ )
495
+ (
496
+ _,
497
+ subset,
498
+ dose_assessment,
499
+ administered,
500
+ family_count,
501
+ locus_count,
502
+ phenotype_count,
503
+ ) = min(feasible, key=lambda value: value[0])
504
+ selected_ids = {member.option_id for member in subset}
505
+ selected = tuple(
506
+ FrontierProbeAllocatedMember(
507
+ role=(
508
+ FrontierProbeSlateRole.MODEL_ANCHOR
509
+ if member.option_id in anchor_ids
510
+ else (
511
+ FrontierProbeSlateRole.FULL_ABSTENTION_FRONTIER_PROBE
512
+ if member.option_id == probe_id
513
+ else (
514
+ FrontierProbeSlateRole.MODEL_FILL
515
+ if member.option_id in target_set
516
+ else FrontierProbeSlateRole.SAFETY_RECOURSE
517
+ )
518
+ )
519
+ ),
520
+ option_id=member.option_id,
521
+ option_identity_sha256=member.option_identity_sha256,
522
+ model_rank=member.model_rank,
523
+ full_vector_abstention=(
524
+ row_by_id[member.option_id].full_vector_abstention
525
+ ),
526
+ structural_frontier_score=(
527
+ row_by_id[member.option_id].structural_frontier_score
528
+ ),
529
+ )
530
+ for member in subset
531
+ )
532
+ return _FrontierProbeAssignment(
533
+ selected=selected,
534
+ target_option_ids=target_ids,
535
+ available_full_abstention_option_ids=available_abstentions,
536
+ selected_probe_option_id=(
537
+ probe_id if probe_id in selected_ids else None
538
+ ),
539
+ retained_target_count=len(target_set & selected_ids),
540
+ ideal_target_feasible=target_set == selected_ids,
541
+ feasible_subset_count=len(feasible),
542
+ distinct_family_count=family_count,
543
+ distinct_locus_count=locus_count,
544
+ distinct_phenotype_count=phenotype_count,
545
+ administered_card_keys=administered,
546
+ memory_dose_assessment=dose_assessment,
547
+ )
548
+
549
+
550
+ def _validate_request(request: SlateAllocationRequest) -> None:
551
+ if len(request.slate.members) != _SLATE_SIZE:
552
+ raise ValueError("frontier-probe policy requires exactly eight members")
553
+ if request.portfolio_size != _PORTFOLIO_SIZE:
554
+ raise ValueError("frontier-probe policy requires four evaluations")
555
+ snapshot = request.calibration_snapshot
556
+ if snapshot is None:
557
+ return
558
+ if snapshot.cutoff_wave_index_exclusive > request.slate.wave_index:
559
+ raise ValueError("calibration snapshot cutoff reaches beyond current wave")
560
+ if any(
561
+ observation.prediction.wave_index >= request.slate.wave_index
562
+ for observation in snapshot.observations
563
+ ):
564
+ raise ValueError("request carries current-wave outcome evidence")
565
+
566
+
567
+ @dataclass(frozen=True, slots=True, eq=False)
568
+ class FrontierProbeSlateDecision:
569
+ """Replayable receipt for one projected, outcome-blind K8-to-K4 decision."""
570
+
571
+ projection: EvaluationAllocationConstraintProjection
572
+ member_evidence: tuple[FrontierProbeMemberEvidence, ...]
573
+ selected: tuple[FrontierProbeAllocatedMember, ...]
574
+ target_option_ids: tuple[str, ...]
575
+ available_full_abstention_option_ids: tuple[str, ...]
576
+ selected_probe_option_id: str | None
577
+ retained_target_count: int
578
+ ideal_target_feasible: bool
579
+ feasible_subset_count: int
580
+ distinct_family_count: int
581
+ distinct_locus_count: int
582
+ distinct_phenotype_count: int
583
+ administered_card_keys: tuple[str, ...]
584
+ memory_dose_assessment: PortfolioMemoryDoseAssessment | None = None
585
+
586
+ policy_id: ClassVar[str] = POLICY_ID
587
+ policy_version: ClassVar[int] = POLICY_VERSION
588
+ policy_definition_sha256: ClassVar[str] = POLICY_DEFINITION_SHA256
589
+ policy_configuration_sha256: ClassVar[str] = CONFIGURATION_SHA256
590
+
591
+ @property
592
+ def source_request(self) -> SlateAllocationRequest:
593
+ return self.projection.source_request
594
+
595
+ @property
596
+ def request(self) -> SlateAllocationRequest:
597
+ return self.projection.projected_request
598
+
599
+ def __post_init__(self) -> None:
600
+ if type(self.projection) is not EvaluationAllocationConstraintProjection:
601
+ raise TypeError("projection must be exact")
602
+ self.projection.revalidate()
603
+ _validate_request(self.request)
604
+ if type(self.member_evidence) is not tuple or any(
605
+ type(value) is not FrontierProbeMemberEvidence
606
+ for value in self.member_evidence
607
+ ):
608
+ raise TypeError("member_evidence must contain exact rows")
609
+ for value in self.member_evidence:
610
+ value.__post_init__()
611
+ if type(self.selected) is not tuple or any(
612
+ type(value) is not FrontierProbeAllocatedMember
613
+ for value in self.selected
614
+ ):
615
+ raise TypeError("selected must contain exact allocated members")
616
+ for value in self.selected:
617
+ value.__post_init__()
618
+ if self.memory_dose_assessment is not None:
619
+ if type(self.memory_dose_assessment) is not PortfolioMemoryDoseAssessment:
620
+ raise TypeError("memory_dose_assessment must be exact or None")
621
+ self.memory_dose_assessment.__post_init__()
622
+ expected_rows = tuple(
623
+ _member_evidence(self.request, member)
624
+ for member in self.request.slate.members
625
+ )
626
+ if self.member_evidence != expected_rows:
627
+ raise ValueError("member evidence differs from the projected request")
628
+ expected = _best_assignment(self.request, expected_rows)
629
+ observed_values = (
630
+ self.selected,
631
+ self.target_option_ids,
632
+ self.available_full_abstention_option_ids,
633
+ self.selected_probe_option_id,
634
+ self.retained_target_count,
635
+ self.ideal_target_feasible,
636
+ self.feasible_subset_count,
637
+ self.distinct_family_count,
638
+ self.distinct_locus_count,
639
+ self.distinct_phenotype_count,
640
+ self.administered_card_keys,
641
+ self.memory_dose_assessment,
642
+ )
643
+ expected_values = (
644
+ expected.selected,
645
+ expected.target_option_ids,
646
+ expected.available_full_abstention_option_ids,
647
+ expected.selected_probe_option_id,
648
+ expected.retained_target_count,
649
+ expected.ideal_target_feasible,
650
+ expected.feasible_subset_count,
651
+ expected.distinct_family_count,
652
+ expected.distinct_locus_count,
653
+ expected.distinct_phenotype_count,
654
+ expected.administered_card_keys,
655
+ expected.memory_dose_assessment,
656
+ )
657
+ if observed_values != expected_values:
658
+ raise ValueError("decision differs from exact frontier-probe allocation")
659
+
660
+ def revalidate(self) -> None:
661
+ if type(self) is not FrontierProbeSlateDecision:
662
+ raise TypeError("decision must be exact FrontierProbeSlateDecision")
663
+ FrontierProbeSlateDecision.__post_init__(self)
664
+
665
+ @property
666
+ def prior_only(self) -> bool:
667
+ self.revalidate()
668
+ snapshot = self.request.calibration_snapshot
669
+ return snapshot is None or all(
670
+ observation.prediction.wave_index < self.request.slate.wave_index
671
+ for observation in snapshot.observations
672
+ )
673
+
674
+ def _unsigned_record(self) -> dict[str, object]:
675
+ self.revalidate()
676
+ return {
677
+ "schema_version": 1,
678
+ "event_type": "frontier_probe_slate_allocated",
679
+ "policy_id": self.policy_id,
680
+ "policy_version": self.policy_version,
681
+ "policy_definition_sha256": self.policy_definition_sha256,
682
+ "policy_configuration_sha256": (
683
+ self.policy_configuration_sha256
684
+ ),
685
+ "source_request": self.source_request.to_record(),
686
+ "projected_request": self.request.to_record(),
687
+ "constraint_projection": self.projection.to_record(),
688
+ "prior_only": self.prior_only,
689
+ "member_evidence": [
690
+ value.to_record() for value in self.member_evidence
691
+ ],
692
+ "selected": [value.to_record() for value in self.selected],
693
+ "target_option_ids": list(self.target_option_ids),
694
+ "available_full_abstention_option_ids": list(
695
+ self.available_full_abstention_option_ids
696
+ ),
697
+ "selected_probe_option_id": self.selected_probe_option_id,
698
+ "retained_target_count": self.retained_target_count,
699
+ "ideal_target_feasible": self.ideal_target_feasible,
700
+ "feasible_subset_count": self.feasible_subset_count,
701
+ "distinct_family_count": self.distinct_family_count,
702
+ "distinct_locus_count": self.distinct_locus_count,
703
+ "distinct_phenotype_count": self.distinct_phenotype_count,
704
+ "administered_card_keys": list(self.administered_card_keys),
705
+ **(
706
+ {}
707
+ if self.memory_dose_assessment is None
708
+ else {
709
+ "memory_dose_assessment": (
710
+ self.memory_dose_assessment.to_record()
711
+ )
712
+ }
713
+ ),
714
+ "claim_scope": (
715
+ "replayable_outcome_blind_allocation_not_efficacy_or_"
716
+ "outcome_claim"
717
+ ),
718
+ }
719
+
720
+ @property
721
+ def decision_sha256(self) -> str:
722
+ return _hash(_DECISION_DOMAIN, self._unsigned_record())
723
+
724
+ def to_record(self) -> dict[str, object]:
725
+ return {
726
+ **self._unsigned_record(),
727
+ "decision_sha256": self.decision_sha256,
728
+ }
729
+
730
+ def __eq__(self, other: object) -> bool:
731
+ return (
732
+ type(other) is FrontierProbeSlateDecision
733
+ and self.decision_sha256 == other.decision_sha256
734
+ )
735
+
736
+ __hash__ = None
737
+
738
+
739
+ @dataclass(frozen=True, slots=True)
740
+ class FrontierProbeSlatePolicy:
741
+ """Keep model anchors and probe only structurally novel full abstention."""
742
+
743
+ policy_id: ClassVar[str] = POLICY_ID
744
+ policy_version: ClassVar[int] = POLICY_VERSION
745
+ definition_sha256: ClassVar[str] = POLICY_DEFINITION_SHA256
746
+ configuration_sha256: ClassVar[str] = CONFIGURATION_SHA256
747
+
748
+ def __post_init__(self) -> None:
749
+ if type(self) is not FrontierProbeSlatePolicy:
750
+ raise TypeError("policy must be exact FrontierProbeSlatePolicy")
751
+
752
+ def select(self, request: SlateAllocationRequest) -> FrontierProbeSlateDecision:
753
+ self.__post_init__()
754
+ if type(request) is not SlateAllocationRequest:
755
+ raise TypeError("request must be exact SlateAllocationRequest")
756
+ request.revalidate()
757
+ projection = project_evaluation_allocation_request(request)
758
+ _validate_request(projection.projected_request)
759
+ rows = tuple(
760
+ _member_evidence(projection.projected_request, member)
761
+ for member in projection.projected_request.slate.members
762
+ )
763
+ assignment = _best_assignment(projection.projected_request, rows)
764
+ return FrontierProbeSlateDecision(
765
+ projection=projection,
766
+ member_evidence=rows,
767
+ selected=assignment.selected,
768
+ target_option_ids=assignment.target_option_ids,
769
+ available_full_abstention_option_ids=(
770
+ assignment.available_full_abstention_option_ids
771
+ ),
772
+ selected_probe_option_id=assignment.selected_probe_option_id,
773
+ retained_target_count=assignment.retained_target_count,
774
+ ideal_target_feasible=assignment.ideal_target_feasible,
775
+ feasible_subset_count=assignment.feasible_subset_count,
776
+ distinct_family_count=assignment.distinct_family_count,
777
+ distinct_locus_count=assignment.distinct_locus_count,
778
+ distinct_phenotype_count=assignment.distinct_phenotype_count,
779
+ administered_card_keys=assignment.administered_card_keys,
780
+ memory_dose_assessment=assignment.memory_dose_assessment,
781
+ )
782
+
783
+ def to_record(self) -> dict[str, object]:
784
+ self.__post_init__()
785
+ return {
786
+ "policy_id": self.policy_id,
787
+ "policy_version": self.policy_version,
788
+ "definition_sha256": self.definition_sha256,
789
+ "configuration": _configuration_record(),
790
+ "configuration_sha256": self.configuration_sha256,
791
+ "constraint_projection_policy": {
792
+ "policy_id": PROJECTION_POLICY_ID,
793
+ "policy_version": PROJECTION_POLICY_VERSION,
794
+ "definition_sha256": PROJECTION_DEFINITION_SHA256,
795
+ },
796
+ }
797
+
798
+
799
+ __all__ = [
800
+ "CONFIGURATION_SHA256",
801
+ "EvaluationAllocationConstraintProjection",
802
+ "FrontierProbeAllocatedMember",
803
+ "FrontierProbeMemberEvidence",
804
+ "FrontierProbeSlateDecision",
805
+ "FrontierProbeSlatePolicy",
806
+ "FrontierProbeSlateRole",
807
+ "POLICY_DEFINITION_SHA256",
808
+ "POLICY_ID",
809
+ "POLICY_VERSION",
810
+ "PROJECTION_DEFINITION_SHA256",
811
+ "PROJECTION_POLICY_ID",
812
+ "PROJECTION_POLICY_VERSION",
813
+ "project_evaluation_allocation_request",
814
+ ]