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,193 @@
1
+ """Injected, stateless relations over sealed detailed evaluation evidence."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import hashlib
6
+ import json
7
+ import re
8
+ from collections.abc import Callable, Sequence
9
+ from dataclasses import dataclass
10
+ from enum import Enum
11
+
12
+ from agent_evolve.application.detailed_evaluation import DetailedEvaluation
13
+ from agent_evolve.core.problem import (
14
+ ObjectiveSpec,
15
+ normalize_objective_values,
16
+ validate_objective_specs,
17
+ )
18
+ from agent_evolve.domain.patch import require_sha256
19
+
20
+
21
+ _TOKEN = re.compile(r"^[a-z][a-z0-9_.-]{0,95}$")
22
+ _PARETO_DEFINITION_DOMAIN = b"agent-evolve:objective-pareto-relation:v1\x00"
23
+
24
+
25
+ class OutcomeRelation(str, Enum):
26
+ BETTER = "better"
27
+ WORSE = "worse"
28
+ EQUIVALENT = "equivalent"
29
+ INCOMPARABLE = "incomparable"
30
+
31
+
32
+ OutcomeComparator = Callable[
33
+ [DetailedEvaluation, DetailedEvaluation],
34
+ OutcomeRelation,
35
+ ]
36
+
37
+
38
+ @dataclass(frozen=True, slots=True)
39
+ class OutcomeRelationPolicyBinding:
40
+ """One comparison callable and its immutable published semantics.
41
+
42
+ Archive use requires a deterministic partial order: ``BETTER``/``WORSE``
43
+ are inverse strict relations, ``EQUIVALENT`` is a true transitive
44
+ equivalence relation, and ``INCOMPARABLE`` is symmetric. Resolution bands
45
+ that are not proven transitive should therefore return ``INCOMPARABLE``,
46
+ not ``EQUIVALENT``. Each call verifies determinism and inverse symmetry;
47
+ global transitivity remains a declared policy obligation.
48
+ """
49
+
50
+ compare: OutcomeComparator
51
+ policy_id: str
52
+ policy_version: int
53
+ definition_sha256: str
54
+
55
+ def __post_init__(self) -> None:
56
+ if not callable(self.compare):
57
+ raise TypeError("compare must be callable")
58
+ if type(self.policy_id) is not str or _TOKEN.fullmatch(self.policy_id) is None:
59
+ raise ValueError("policy_id must use the closed token grammar")
60
+ if type(self.policy_version) is not int or self.policy_version <= 0:
61
+ raise ValueError("policy_version must be a positive exact integer")
62
+ require_sha256(self.definition_sha256, "definition_sha256")
63
+
64
+ @property
65
+ def identity(self) -> tuple[str, int, str]:
66
+ return self.policy_id, self.policy_version, self.definition_sha256
67
+
68
+ def relate(
69
+ self,
70
+ left: DetailedEvaluation,
71
+ right: DetailedEvaluation,
72
+ ) -> OutcomeRelation:
73
+ if type(left) is not DetailedEvaluation or type(right) is not DetailedEvaluation:
74
+ raise TypeError("outcome comparison requires exact DetailedEvaluation values")
75
+ DetailedEvaluation.__post_init__(left)
76
+ DetailedEvaluation.__post_init__(right)
77
+ relation = self.compare(left, right)
78
+ repeated = self.compare(left, right)
79
+ inverse = self.compare(right, left)
80
+ inverse_repeated = self.compare(right, left)
81
+ if any(
82
+ type(value) is not OutcomeRelation
83
+ for value in (relation, repeated, inverse, inverse_repeated)
84
+ ):
85
+ raise TypeError("outcome relation policy returned an invalid relation")
86
+ if relation is not repeated or inverse is not inverse_repeated:
87
+ raise ValueError("outcome relation policy must be deterministic")
88
+ expected_inverse = {
89
+ OutcomeRelation.BETTER: OutcomeRelation.WORSE,
90
+ OutcomeRelation.WORSE: OutcomeRelation.BETTER,
91
+ OutcomeRelation.EQUIVALENT: OutcomeRelation.EQUIVALENT,
92
+ OutcomeRelation.INCOMPARABLE: OutcomeRelation.INCOMPARABLE,
93
+ }[relation]
94
+ if inverse is not expected_inverse:
95
+ raise ValueError("outcome relation policy violated inverse consistency")
96
+ return relation
97
+
98
+ def to_record(self) -> dict[str, object]:
99
+ return {
100
+ "policy_id": self.policy_id,
101
+ "policy_version": self.policy_version,
102
+ "definition_sha256": self.definition_sha256,
103
+ }
104
+
105
+
106
+ @dataclass(frozen=True, slots=True)
107
+ class ObjectiveParetoOutcomePolicy:
108
+ """The legacy objective-only partial order, expressed over detailed records."""
109
+
110
+ objectives: tuple[ObjectiveSpec, ...]
111
+
112
+ def __post_init__(self) -> None:
113
+ if type(self.objectives) is not tuple:
114
+ raise TypeError("objectives must be an exact tuple")
115
+ validate_objective_specs(self.objectives)
116
+
117
+ @property
118
+ def definition_sha256(self) -> str:
119
+ record = [
120
+ {"name": objective.name, "goal": objective.goal}
121
+ for objective in self.objectives
122
+ ]
123
+ encoded = json.dumps(
124
+ record,
125
+ allow_nan=False,
126
+ ensure_ascii=True,
127
+ separators=(",", ":"),
128
+ sort_keys=True,
129
+ ).encode("ascii")
130
+ return hashlib.sha256(_PARETO_DEFINITION_DOMAIN + encoded).hexdigest()
131
+
132
+ def compare(
133
+ self,
134
+ left: DetailedEvaluation,
135
+ right: DetailedEvaluation,
136
+ ) -> OutcomeRelation:
137
+ if not left.success or not right.success:
138
+ raise ValueError("objective Pareto comparison requires successful records")
139
+ left_values = normalize_objective_values(
140
+ dict(left.objectives),
141
+ self.objectives,
142
+ )
143
+ right_values = normalize_objective_values(
144
+ dict(right.objectives),
145
+ self.objectives,
146
+ )
147
+ left_weak = True
148
+ left_strict = False
149
+ right_weak = True
150
+ right_strict = False
151
+ for objective in self.objectives:
152
+ left_value = left_values[objective.name]
153
+ right_value = right_values[objective.name]
154
+ if objective.goal == "max":
155
+ left_weak &= left_value >= right_value
156
+ left_strict |= left_value > right_value
157
+ right_weak &= right_value >= left_value
158
+ right_strict |= right_value > left_value
159
+ else:
160
+ left_weak &= left_value <= right_value
161
+ left_strict |= left_value < right_value
162
+ right_weak &= right_value <= left_value
163
+ right_strict |= right_value < left_value
164
+ if left_weak and left_strict:
165
+ return OutcomeRelation.BETTER
166
+ if right_weak and right_strict:
167
+ return OutcomeRelation.WORSE
168
+ if left_weak and right_weak:
169
+ return OutcomeRelation.EQUIVALENT
170
+ return OutcomeRelation.INCOMPARABLE
171
+
172
+ def binding(self) -> OutcomeRelationPolicyBinding:
173
+ return OutcomeRelationPolicyBinding(
174
+ compare=self.compare,
175
+ policy_id="objective_pareto",
176
+ policy_version=1,
177
+ definition_sha256=self.definition_sha256,
178
+ )
179
+
180
+
181
+ def objective_pareto_outcome_binding(
182
+ objectives: Sequence[ObjectiveSpec],
183
+ ) -> OutcomeRelationPolicyBinding:
184
+ return ObjectiveParetoOutcomePolicy(tuple(objectives)).binding()
185
+
186
+
187
+ __all__ = [
188
+ "ObjectiveParetoOutcomePolicy",
189
+ "OutcomeComparator",
190
+ "OutcomeRelation",
191
+ "OutcomeRelationPolicyBinding",
192
+ "objective_pareto_outcome_binding",
193
+ ]
@@ -0,0 +1,241 @@
1
+ """Build and replay paired v2/v3 allocation authority before outcomes."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from dataclasses import dataclass, field
6
+
7
+ from agent_evolve.application.action_allocation_frame_commit import (
8
+ validate_frame_action_allocation_phase_commit,
9
+ )
10
+ from agent_evolve.application.action_allocation_frame_commit_v3 import (
11
+ validate_operational_frame_action_allocation_phase_commit,
12
+ )
13
+ from agent_evolve.application.two_stage_action_evolution import (
14
+ TwoStageActionPhaseCommit,
15
+ )
16
+ from agent_evolve.domain.patch import require_sha256
17
+ from agent_evolve.ports.action_allocation_frame import FrameActionAllocationRequest
18
+ from agent_evolve.ports.action_allocation_frame_commit import (
19
+ FrameActionAllocationTreatmentExecution,
20
+ )
21
+ from agent_evolve.ports.action_allocation_frame_commit_v3 import (
22
+ OperationalFrameActionAllocationTreatmentExecution,
23
+ )
24
+ from agent_evolve.ports.paired_allocation_comparison import (
25
+ AllocationComparisonMethodKind,
26
+ AllocationComparisonMethodReceipt,
27
+ AllocationComparisonSelectedOption,
28
+ PairedAllocationComparisonCommitment,
29
+ frame_allocation_comparison_structure_sha256,
30
+ )
31
+
32
+
33
+ AllocationExecution = (
34
+ FrameActionAllocationTreatmentExecution
35
+ | OperationalFrameActionAllocationTreatmentExecution
36
+ )
37
+
38
+
39
+ @dataclass(frozen=True, slots=True)
40
+ class AllocationComparisonMethodWave:
41
+ """One exact allocator method's already-durable treatment wave.
42
+
43
+ ``schedule_binding_sha256`` is a caller-verifiable receipt for the common
44
+ prospective schedule. This builder binds it but does not claim that a
45
+ bare digest proves materialization or chronology.
46
+ """
47
+
48
+ comparison_method_id: str
49
+ schedule_binding_sha256: str
50
+ executions: tuple[AllocationExecution, ...] = field(
51
+ repr=False,
52
+ compare=False,
53
+ )
54
+ phase_commit: TwoStageActionPhaseCommit = field(repr=False, compare=False)
55
+
56
+ def __post_init__(self) -> None:
57
+ require_sha256(self.schedule_binding_sha256, "schedule_binding_sha256")
58
+ if type(self.executions) is not tuple or not self.executions:
59
+ raise ValueError("executions must be a non-empty exact tuple")
60
+ first_type = type(self.executions[0])
61
+ if first_type not in {
62
+ FrameActionAllocationTreatmentExecution,
63
+ OperationalFrameActionAllocationTreatmentExecution,
64
+ } or any(type(value) is not first_type for value in self.executions):
65
+ raise TypeError("a method wave must contain one exact execution type")
66
+ if type(self.phase_commit) is not TwoStageActionPhaseCommit:
67
+ raise TypeError("phase_commit must be exact")
68
+ self.phase_commit.__post_init__()
69
+
70
+
71
+ def _base_request(execution: AllocationExecution) -> FrameActionAllocationRequest:
72
+ if type(execution) is FrameActionAllocationTreatmentExecution:
73
+ return execution.request
74
+ if type(execution) is OperationalFrameActionAllocationTreatmentExecution:
75
+ return execution.request.allocation
76
+ raise TypeError("execution type is outside the paired comparison")
77
+
78
+
79
+ def _method_request_sha256(execution: AllocationExecution) -> str:
80
+ if type(execution) is FrameActionAllocationTreatmentExecution:
81
+ return execution.request.request_sha256
82
+ if type(execution) is OperationalFrameActionAllocationTreatmentExecution:
83
+ return execution.request.request_sha256
84
+ raise TypeError("execution type is outside the paired comparison")
85
+
86
+
87
+ def _method_receipt(
88
+ wave: AllocationComparisonMethodWave,
89
+ ) -> AllocationComparisonMethodReceipt:
90
+ wave.__post_init__()
91
+ executions = wave.executions
92
+ if type(executions[0]) is FrameActionAllocationTreatmentExecution:
93
+ v2 = executions
94
+ assert all(
95
+ type(value) is FrameActionAllocationTreatmentExecution for value in v2
96
+ )
97
+ commit_input = validate_frame_action_allocation_phase_commit(
98
+ v2, # type: ignore[arg-type]
99
+ wave.phase_commit,
100
+ )
101
+ kind = AllocationComparisonMethodKind.AUDITED_FRAME_V2
102
+ else:
103
+ v3 = executions
104
+ assert all(
105
+ type(value) is OperationalFrameActionAllocationTreatmentExecution
106
+ for value in v3
107
+ )
108
+ commit_input = validate_operational_frame_action_allocation_phase_commit(
109
+ v3, # type: ignore[arg-type]
110
+ wave.phase_commit,
111
+ )
112
+ kind = AllocationComparisonMethodKind.OPERATIONAL_FRAME_V3
113
+
114
+ base_requests = tuple(_base_request(value) for value in executions)
115
+ expected_utility = base_requests[0].utility.utility
116
+ if any(value.utility.utility is not expected_utility for value in base_requests):
117
+ raise ValueError("one method wave must share the same utility executable")
118
+ structures = tuple(
119
+ frame_allocation_comparison_structure_sha256(value)
120
+ for value in base_requests
121
+ )
122
+ if len(set(structures)) != 1:
123
+ raise ValueError(
124
+ "one method wave mixes schedule/frame/eligibility/budget structure"
125
+ )
126
+ decisions = tuple(value.result.decision for value in executions)
127
+ allocator_identities = {
128
+ (
129
+ value.allocator_policy_id,
130
+ value.allocator_policy_version,
131
+ value.allocator_definition_sha256,
132
+ value.allocator_configuration_sha256,
133
+ )
134
+ for value in decisions
135
+ }
136
+ if len(allocator_identities) != 1:
137
+ raise ValueError("one comparison method mixes allocator configurations")
138
+ policy_id, policy_version, definition_sha256, configuration_sha256 = next(
139
+ iter(allocator_identities)
140
+ )
141
+ selected = tuple(
142
+ AllocationComparisonSelectedOption(
143
+ treatment_occurrence_id=(
144
+ execution.treatment_occurrence.occurrence_id.value
145
+ ),
146
+ treatment_id=execution.treatment_occurrence.treatment_id.value,
147
+ rank=member.rank,
148
+ option_id=member.option_id,
149
+ option_identity_sha256=member.option_identity_sha256,
150
+ child_configuration_sha256=member.child_configuration_sha256,
151
+ family=member.family,
152
+ )
153
+ for execution in executions
154
+ for member in execution.result.decision.members
155
+ )
156
+ assignment = executions[0].treatment_assignment
157
+ return AllocationComparisonMethodReceipt(
158
+ comparison_method_id=wave.comparison_method_id,
159
+ method_kind=kind,
160
+ schedule_binding_sha256=wave.schedule_binding_sha256,
161
+ allocation_phase_commit_receipt_sha256=(
162
+ wave.phase_commit.receipt.receipt_sha256
163
+ ),
164
+ allocation_input_sha256=commit_input.input_sha256,
165
+ treatment_assignment_receipt_sha256=assignment.receipt_sha256,
166
+ upstream_input_sha256=commit_input.upstream_input_sha256,
167
+ terminal_provider_ledger_commitment_sha256=(
168
+ commit_input.terminal_provider_ledger_commitment_sha256
169
+ ),
170
+ common_comparison_structure_sha256=structures[0],
171
+ allocator_policy_id=policy_id,
172
+ allocator_policy_version=policy_version,
173
+ allocator_definition_sha256=definition_sha256,
174
+ allocator_configuration_sha256=configuration_sha256,
175
+ ordered_frame_receipt_sha256s=tuple(
176
+ value.frame.receipt_sha256 for value in base_requests
177
+ ),
178
+ ordered_base_request_sha256s=tuple(
179
+ value.request_sha256 for value in base_requests
180
+ ),
181
+ ordered_method_request_sha256s=tuple(
182
+ _method_request_sha256(value) for value in executions
183
+ ),
184
+ ordered_decision_receipt_sha256s=tuple(
185
+ value.receipt_sha256 for value in decisions
186
+ ),
187
+ selected_options=selected,
188
+ )
189
+
190
+
191
+ def build_paired_allocation_comparison_commitment(
192
+ methods: tuple[AllocationComparisonMethodWave, ...],
193
+ ) -> PairedAllocationComparisonCommitment:
194
+ """Validate both durable methods and bind their selected-option union."""
195
+
196
+ if type(methods) is not tuple or len(methods) != 2 or any(
197
+ type(value) is not AllocationComparisonMethodWave for value in methods
198
+ ):
199
+ raise ValueError("methods must contain exactly two exact method waves")
200
+ for value in methods:
201
+ value.__post_init__()
202
+ all_requests = tuple(
203
+ _base_request(execution)
204
+ for method in methods
205
+ for execution in method.executions
206
+ )
207
+ expected_utility = all_requests[0].utility.utility
208
+ if any(value.utility.utility is not expected_utility for value in all_requests):
209
+ raise ValueError("paired methods must share the same utility executable")
210
+ receipts = tuple(
211
+ sorted(
212
+ (_method_receipt(value) for value in methods),
213
+ key=lambda value: value.comparison_method_id,
214
+ )
215
+ )
216
+ return PairedAllocationComparisonCommitment(methods=receipts)
217
+
218
+
219
+ def validate_paired_allocation_comparison_commitment(
220
+ methods: tuple[AllocationComparisonMethodWave, ...],
221
+ commitment: PairedAllocationComparisonCommitment,
222
+ ) -> PairedAllocationComparisonCommitment:
223
+ """Replay both phase commits and reject any post-commit object drift."""
224
+
225
+ if type(commitment) is not PairedAllocationComparisonCommitment:
226
+ raise TypeError("commitment must be exact")
227
+ commitment.__post_init__()
228
+ expected = build_paired_allocation_comparison_commitment(methods)
229
+ if (
230
+ commitment.commitment_sha256 != expected.commitment_sha256
231
+ or commitment.to_record() != expected.to_record()
232
+ ):
233
+ raise ValueError("paired allocation commitment differs from exact methods")
234
+ return expected
235
+
236
+
237
+ __all__ = [
238
+ "AllocationComparisonMethodWave",
239
+ "build_paired_allocation_comparison_commitment",
240
+ "validate_paired_allocation_comparison_commitment",
241
+ ]
@@ -0,0 +1,127 @@
1
+ """Pure hash-ranked paired block scheduling over benchmark-neutral ports."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from collections.abc import Mapping
6
+ import hashlib
7
+ import json
8
+
9
+ from agent_evolve.ports.paired_block_schedule import (
10
+ PairedBlockScheduleRequest,
11
+ PairedBlockSchedulePolicyBinding,
12
+ PairedBlockScheduleResult,
13
+ RankedBlockIdentity,
14
+ )
15
+
16
+
17
+ PAIRED_BLOCK_SCHEDULE_POLICY_ID = "paired_benchmark_block_schedule"
18
+ PAIRED_BLOCK_SCHEDULE_POLICY_VERSION = 2
19
+ PAIRED_BLOCK_SCHEDULE_RANK_DOMAIN = (
20
+ "agent-evolve:paired-benchmark-block-schedule:v2"
21
+ )
22
+ PAIRED_BLOCK_SCHEDULE_POLICY_DEFINITION_SHA256 = hashlib.sha256(
23
+ b"agent-evolve:paired-benchmark-block-schedule-policy:v2;"
24
+ b"inputs=benchmark,task,finite-contract,partition-layout,exact-eligible-mask,"
25
+ b"public-uint64-seed,public-seed-source-sha256,complete-canonical-block-"
26
+ b"identities,replicate-index;public-seed-source=authenticated-provenance-"
27
+ b"not-rank-entropy;"
28
+ b"rank=sha256(domain,schedule-basis,block-index,block-spec-sha256);"
29
+ b"sort=rank-digest-then-block-index;complete-no-replacement-schedule;"
30
+ b"replicate-index=exact-schedule-position;runtime-rng=forbidden;"
31
+ b"method,treatment,provider,prompt,outcome-identities=absent-by-construction"
32
+ ).hexdigest()
33
+
34
+
35
+ class PairedBlockScheduleVerificationError(RuntimeError):
36
+ """A supplied paired schedule differs from deterministic public replay."""
37
+
38
+
39
+ def _canonical_json(value: object) -> bytes:
40
+ return json.dumps(
41
+ value,
42
+ allow_nan=False,
43
+ ensure_ascii=True,
44
+ separators=(",", ":"),
45
+ sort_keys=True,
46
+ ).encode("ascii")
47
+
48
+
49
+ def paired_block_schedule_policy() -> PairedBlockSchedulePolicyBinding:
50
+ """Return the identified benchmark-neutral no-replacement schedule policy."""
51
+
52
+ return PairedBlockSchedulePolicyBinding(
53
+ policy_id=PAIRED_BLOCK_SCHEDULE_POLICY_ID,
54
+ policy_version=PAIRED_BLOCK_SCHEDULE_POLICY_VERSION,
55
+ policy_definition_sha256=(
56
+ PAIRED_BLOCK_SCHEDULE_POLICY_DEFINITION_SHA256
57
+ ),
58
+ rank_domain=PAIRED_BLOCK_SCHEDULE_RANK_DOMAIN,
59
+ )
60
+
61
+
62
+ def rank_paired_benchmark_blocks(
63
+ request: PairedBlockScheduleRequest,
64
+ ) -> PairedBlockScheduleResult:
65
+ """Hash-rank every block once and select the replicate's schedule position."""
66
+
67
+ if type(request) is not PairedBlockScheduleRequest:
68
+ raise TypeError("request must be an exact PairedBlockScheduleRequest")
69
+ request.__post_init__()
70
+ if request.policy != paired_block_schedule_policy():
71
+ raise ValueError("request policy differs from this identified scheduler")
72
+ domain = request.policy.rank_domain.encode("ascii") + b"\x00"
73
+ basis = request.schedule_basis_record()
74
+ ranked: list[tuple[str, int, object]] = []
75
+ for block in request.blocks:
76
+ rank_payload = {
77
+ **basis,
78
+ "block_index": block.block_index,
79
+ "block_spec_sha256": block.block_spec_sha256,
80
+ }
81
+ digest = hashlib.sha256(domain + _canonical_json(rank_payload)).hexdigest()
82
+ ranked.append((digest, block.block_index, block))
83
+ ranked.sort(key=lambda value: (value[0], value[1]))
84
+ return PairedBlockScheduleResult(
85
+ request=request,
86
+ ranked_blocks=tuple(
87
+ RankedBlockIdentity(
88
+ schedule_position=position,
89
+ block=block, # type: ignore[arg-type]
90
+ rank_digest_sha256=digest,
91
+ )
92
+ for position, (digest, _block_index, block) in enumerate(ranked)
93
+ ),
94
+ )
95
+
96
+
97
+ def verify_paired_block_schedule(
98
+ request: PairedBlockScheduleRequest,
99
+ result: PairedBlockScheduleResult | Mapping[str, object],
100
+ ) -> PairedBlockScheduleResult:
101
+ """Fail closed unless an object or canonical record equals public replay."""
102
+
103
+ expected = rank_paired_benchmark_blocks(request)
104
+ if type(result) is PairedBlockScheduleResult:
105
+ result.__post_init__()
106
+ matches = result == expected and result.to_record() == expected.to_record()
107
+ elif isinstance(result, Mapping):
108
+ matches = type(result) is dict and result == expected.to_record()
109
+ else:
110
+ raise TypeError("result must be an exact schedule result or canonical dict")
111
+ if not matches:
112
+ raise PairedBlockScheduleVerificationError(
113
+ "paired block schedule differs from deterministic public replay"
114
+ )
115
+ return expected
116
+
117
+
118
+ __all__ = [
119
+ "PAIRED_BLOCK_SCHEDULE_POLICY_DEFINITION_SHA256",
120
+ "PAIRED_BLOCK_SCHEDULE_POLICY_ID",
121
+ "PAIRED_BLOCK_SCHEDULE_POLICY_VERSION",
122
+ "PAIRED_BLOCK_SCHEDULE_RANK_DOMAIN",
123
+ "PairedBlockScheduleVerificationError",
124
+ "paired_block_schedule_policy",
125
+ "rank_paired_benchmark_blocks",
126
+ "verify_paired_block_schedule",
127
+ ]