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,411 @@
1
+ """Immutable, prompt-safe semantics for benchmark-owned action axes.
2
+
3
+ Finite variation catalogs remain the executable authority for which children an
4
+ optimizer may evaluate. This module supplies only a descriptive, hash-bound
5
+ companion: benchmarks can state what action coordinates mean, how coordinates
6
+ are coupled, and which tempting interpretations are explicitly incorrect.
7
+
8
+ The value layer deliberately accepts catalog identities and option-family
9
+ vocabularies as primitives. It therefore has no dependency on a particular
10
+ variation implementation and can be bound by any benchmark adapter at its
11
+ composition boundary.
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ import hashlib
17
+ import json
18
+ import re
19
+ from dataclasses import dataclass, field
20
+
21
+ from agent_evolve.domain.patch import require_sha256
22
+
23
+
24
+ CatalogIdentity = tuple[str, int, str]
25
+
26
+ _TOKEN = re.compile(r"^[a-z][a-z0-9_.-]{0,95}$")
27
+ _CANONICAL_JSON_PATH = re.compile(
28
+ r"^\$\.[^.\[\]\s]+(?:\.[^.\[\]\s]+|\[(?:0|[1-9][0-9]*)\])*$"
29
+ )
30
+ _MAX_PROMPT_TEXT_UTF8_BYTES = 4_096
31
+ _SEMANTICS_HASH_DOMAIN = b"agent-evolve:action-space-semantics:v1\x00"
32
+
33
+
34
+ def _token(value: object, name: str) -> str:
35
+ if type(value) is not str or _TOKEN.fullmatch(value) is None:
36
+ raise ValueError(f"{name} must use the closed lowercase token grammar")
37
+ return value
38
+
39
+
40
+ def _prompt_text(value: object, name: str) -> str:
41
+ if type(value) is not str or not value or value != value.strip():
42
+ raise ValueError(f"{name} must be canonical non-empty text")
43
+ if len(value.encode("utf-8", errors="strict")) > _MAX_PROMPT_TEXT_UTF8_BYTES:
44
+ raise ValueError(f"{name} exceeds its UTF-8 byte limit")
45
+ if any(ord(character) < 0x20 or ord(character) == 0x7F for character in value):
46
+ raise ValueError(f"{name} must not contain control characters")
47
+ return value
48
+
49
+
50
+ def _canonical_tokens(values: tuple[str, ...], name: str) -> tuple[str, ...]:
51
+ if type(values) is not tuple or any(type(value) is not str for value in values):
52
+ raise TypeError(f"{name} must be an exact tuple of strings")
53
+ if not values:
54
+ raise ValueError(f"{name} must be non-empty")
55
+ for value in values:
56
+ _token(value, f"{name} entry")
57
+ canonical = tuple(sorted(set(values)))
58
+ if values != canonical:
59
+ raise ValueError(f"{name} must be unique and canonically sorted")
60
+ return values
61
+
62
+
63
+ def _canonical_paths(values: tuple[str, ...]) -> tuple[str, ...]:
64
+ if type(values) is not tuple or any(type(value) is not str for value in values):
65
+ raise TypeError("configuration_paths must be an exact tuple of strings")
66
+ if not values:
67
+ raise ValueError("configuration_paths must be non-empty")
68
+ if any(_CANONICAL_JSON_PATH.fullmatch(value) is None for value in values):
69
+ raise ValueError(
70
+ "configuration_paths must contain canonical JSON paths rooted at '$.'"
71
+ )
72
+ canonical = tuple(sorted(set(values)))
73
+ if values != canonical:
74
+ raise ValueError(
75
+ "configuration_paths must be unique and canonically sorted"
76
+ )
77
+ return values
78
+
79
+
80
+ def _canonical_exclusions(values: tuple[str, ...]) -> tuple[str, ...]:
81
+ if type(values) is not tuple or any(type(value) is not str for value in values):
82
+ raise TypeError("excluded_interpretations must be an exact tuple of strings")
83
+ for index, value in enumerate(values):
84
+ _prompt_text(value, f"excluded_interpretations[{index}]")
85
+ canonical = tuple(sorted(set(values)))
86
+ if values != canonical:
87
+ raise ValueError(
88
+ "excluded_interpretations must be unique and canonically sorted"
89
+ )
90
+ return values
91
+
92
+
93
+ def _catalog_identity(value: object, name: str) -> CatalogIdentity:
94
+ if type(value) is not tuple or len(value) != 3:
95
+ raise TypeError(f"{name} must be an exact (catalog_id, version, hash) tuple")
96
+ catalog_id, version, definition_sha256 = value
97
+ _token(catalog_id, f"{name} catalog_id")
98
+ if type(version) is not int or version <= 0:
99
+ raise ValueError(f"{name} version must be a positive exact integer")
100
+ require_sha256(definition_sha256, f"{name} definition_sha256")
101
+ return catalog_id, version, definition_sha256
102
+
103
+
104
+ def _canonical_catalog_identities(
105
+ values: tuple[CatalogIdentity, ...],
106
+ *,
107
+ require_canonical_order: bool,
108
+ ) -> tuple[CatalogIdentity, ...]:
109
+ if type(values) is not tuple:
110
+ raise TypeError("catalog_identities must be an exact tuple")
111
+ if not values:
112
+ raise ValueError("catalog_identities must be non-empty")
113
+ validated = tuple(
114
+ _catalog_identity(value, f"catalog_identities[{index}]")
115
+ for index, value in enumerate(values)
116
+ )
117
+ catalog_ids = tuple(value[0] for value in validated)
118
+ if len(set(catalog_ids)) != len(catalog_ids):
119
+ raise ValueError("catalog_identities cannot repeat a catalog_id")
120
+ canonical = tuple(sorted(validated, key=lambda value: value[0]))
121
+ if require_canonical_order and validated != canonical:
122
+ raise ValueError("catalog_identities must use canonical catalog_id order")
123
+ return canonical
124
+
125
+
126
+ def _canonical_json(value: object) -> bytes:
127
+ return json.dumps(
128
+ value,
129
+ allow_nan=False,
130
+ ensure_ascii=True,
131
+ separators=(",", ":"),
132
+ sort_keys=True,
133
+ ).encode("ascii")
134
+
135
+
136
+ @dataclass(frozen=True, slots=True)
137
+ class ActionAxisCoordinateSemantics:
138
+ """Meaning of one ordered coordinate within a benchmark action axis."""
139
+
140
+ index: int
141
+ label: str
142
+ definition: str
143
+
144
+ def __post_init__(self) -> None:
145
+ if type(self.index) is not int or self.index < 0:
146
+ raise ValueError("coordinate index must be a non-negative exact integer")
147
+ _prompt_text(self.label, "coordinate label")
148
+ _prompt_text(self.definition, "coordinate definition")
149
+
150
+ def to_record(self) -> dict[str, object]:
151
+ self.__post_init__()
152
+ return {
153
+ "index": self.index,
154
+ "label": self.label,
155
+ "definition": self.definition,
156
+ }
157
+
158
+
159
+ @dataclass(frozen=True, slots=True)
160
+ class ActionAxisSemantics:
161
+ """Prompt-visible meaning and coupling rules for one action-space axis."""
162
+
163
+ axis_id: str
164
+ configuration_paths: tuple[str, ...]
165
+ option_families: tuple[str, ...]
166
+ definition: str
167
+ independence: str
168
+ unit: str | None = None
169
+ coordinates: tuple[ActionAxisCoordinateSemantics, ...] = ()
170
+ excluded_interpretations: tuple[str, ...] = ()
171
+
172
+ def __post_init__(self) -> None:
173
+ _token(self.axis_id, "axis_id")
174
+ _canonical_paths(self.configuration_paths)
175
+ _canonical_tokens(self.option_families, "option_families")
176
+ _prompt_text(self.definition, "axis definition")
177
+ _prompt_text(self.independence, "axis independence")
178
+ if self.unit is not None:
179
+ _prompt_text(self.unit, "axis unit")
180
+ if type(self.coordinates) is not tuple or any(
181
+ type(value) is not ActionAxisCoordinateSemantics
182
+ for value in self.coordinates
183
+ ):
184
+ raise TypeError(
185
+ "coordinates must be an exact tuple of "
186
+ "ActionAxisCoordinateSemantics values"
187
+ )
188
+ for coordinate in self.coordinates:
189
+ ActionAxisCoordinateSemantics.__post_init__(coordinate)
190
+ indices = tuple(value.index for value in self.coordinates)
191
+ if indices and indices != tuple(range(len(indices))):
192
+ raise ValueError(
193
+ "coordinate indices must be contiguous and ordered from zero"
194
+ )
195
+ labels = tuple(value.label for value in self.coordinates)
196
+ if len(set(labels)) != len(labels):
197
+ raise ValueError("coordinate labels must be unique within an axis")
198
+ _canonical_exclusions(self.excluded_interpretations)
199
+
200
+ def to_record(self) -> dict[str, object]:
201
+ self.__post_init__()
202
+ return {
203
+ "axis_id": self.axis_id,
204
+ "configuration_paths": list(self.configuration_paths),
205
+ "option_families": list(self.option_families),
206
+ "definition": self.definition,
207
+ "independence": self.independence,
208
+ "unit": self.unit,
209
+ "coordinates": [value.to_record() for value in self.coordinates],
210
+ "excluded_interpretations": list(self.excluded_interpretations),
211
+ }
212
+
213
+
214
+ @dataclass(frozen=True, slots=True)
215
+ class ActionSpaceSemantics:
216
+ """Versioned action glossary bound to exact finite-catalog identities."""
217
+
218
+ semantics_id: str
219
+ semantics_version: int
220
+ catalog_identities: tuple[CatalogIdentity, ...]
221
+ axes: tuple[ActionAxisSemantics, ...]
222
+ definition_sha256: str = field(init=False)
223
+
224
+ def __post_init__(self) -> None:
225
+ _token(self.semantics_id, "semantics_id")
226
+ if type(self.semantics_version) is not int or self.semantics_version <= 0:
227
+ raise ValueError(
228
+ "semantics_version must be a positive exact integer"
229
+ )
230
+ _canonical_catalog_identities(
231
+ self.catalog_identities,
232
+ require_canonical_order=True,
233
+ )
234
+ if type(self.axes) is not tuple or not self.axes:
235
+ raise ValueError("axes must be a non-empty exact tuple")
236
+ if any(type(value) is not ActionAxisSemantics for value in self.axes):
237
+ raise TypeError("axes must contain exact ActionAxisSemantics values")
238
+ for axis in self.axes:
239
+ ActionAxisSemantics.__post_init__(axis)
240
+ axis_ids = tuple(value.axis_id for value in self.axes)
241
+ if axis_ids != tuple(sorted(set(axis_ids))):
242
+ raise ValueError("axes must use unique canonical axis_id order")
243
+ paths = tuple(
244
+ path for axis in self.axes for path in axis.configuration_paths
245
+ )
246
+ if len(paths) != len(set(paths)):
247
+ raise ValueError(
248
+ "configuration paths cannot be described by multiple action axes"
249
+ )
250
+ object.__setattr__(
251
+ self,
252
+ "definition_sha256",
253
+ hashlib.sha256(
254
+ _SEMANTICS_HASH_DOMAIN + _canonical_json(self._definition_record())
255
+ ).hexdigest(),
256
+ )
257
+
258
+ @property
259
+ def declared_option_families(self) -> tuple[str, ...]:
260
+ """Return the complete family vocabulary covered by at least one axis."""
261
+
262
+ return tuple(
263
+ sorted(
264
+ {
265
+ family
266
+ for axis in self.axes
267
+ for family in axis.option_families
268
+ }
269
+ )
270
+ )
271
+
272
+ def _definition_record(self) -> dict[str, object]:
273
+ return {
274
+ "schema_version": 1,
275
+ "semantics_id": self.semantics_id,
276
+ "semantics_version": self.semantics_version,
277
+ "catalog_identities": [
278
+ {
279
+ "catalog_id": catalog_id,
280
+ "catalog_version": version,
281
+ "definition_sha256": definition_sha256,
282
+ }
283
+ for catalog_id, version, definition_sha256 in self.catalog_identities
284
+ ],
285
+ "declared_option_families": list(self.declared_option_families),
286
+ "axes": [axis.to_record() for axis in self.axes],
287
+ }
288
+
289
+ @property
290
+ def identity(self) -> tuple[str, int, str]:
291
+ self.__post_init__()
292
+ return self.semantics_id, self.semantics_version, self.definition_sha256
293
+
294
+ def to_record(self) -> dict[str, object]:
295
+ self.__post_init__()
296
+ return {
297
+ **self._definition_record(),
298
+ "definition_sha256": self.definition_sha256,
299
+ }
300
+
301
+ def validate_catalog_binding(
302
+ self,
303
+ catalog_identities: tuple[CatalogIdentity, ...],
304
+ option_families: tuple[str, ...],
305
+ ) -> None:
306
+ """Bind prose to exact catalogs and their complete family vocabulary.
307
+
308
+ Catalog declaration order is not semantically meaningful at this seam,
309
+ but every ID, version, and definition hash must match. Likewise, axes
310
+ must cover every executable family and may not invent a prose-only one.
311
+ """
312
+
313
+ self.__post_init__()
314
+ observed_catalogs = _canonical_catalog_identities(
315
+ catalog_identities,
316
+ require_canonical_order=False,
317
+ )
318
+ if observed_catalogs != self.catalog_identities:
319
+ raise ValueError(
320
+ "action semantics catalog identities differ from the bound catalogs"
321
+ )
322
+ if type(option_families) is not tuple or not option_families:
323
+ raise ValueError("option_families must be a non-empty exact tuple")
324
+ if any(type(value) is not str for value in option_families):
325
+ raise TypeError("option_families must contain exact strings")
326
+ for value in option_families:
327
+ _token(value, "option_families entry")
328
+ observed_families = tuple(sorted(set(option_families)))
329
+ if observed_families != self.declared_option_families:
330
+ missing = tuple(
331
+ sorted(set(observed_families) - set(self.declared_option_families))
332
+ )
333
+ prose_only = tuple(
334
+ sorted(set(self.declared_option_families) - set(observed_families))
335
+ )
336
+ details = []
337
+ if missing:
338
+ details.append("uncovered executable families=" + ",".join(missing))
339
+ if prose_only:
340
+ details.append(
341
+ "non-executable declared families=" + ",".join(prose_only)
342
+ )
343
+ raise ValueError(
344
+ "action semantics option-family coverage differs from the bound "
345
+ "catalogs: " + "; ".join(details)
346
+ )
347
+
348
+ def validate_contract_binding(
349
+ self,
350
+ catalog_identity: CatalogIdentity,
351
+ option_families: tuple[str, ...],
352
+ ) -> None:
353
+ """Validate one parent-bound contract against this larger action space.
354
+
355
+ Forecast requests commonly carry one catalog contract while a benchmark
356
+ owns semantics for several catalogs, including union catalogs. This
357
+ narrower check therefore requires the contract's exact catalog identity
358
+ to be a member of the semantics snapshot and every materialized option
359
+ family to be described, without incorrectly requiring one contract to
360
+ exercise the benchmark's complete family vocabulary.
361
+ """
362
+
363
+ self.__post_init__()
364
+ observed_catalog = _catalog_identity(
365
+ catalog_identity,
366
+ "catalog_identity",
367
+ )
368
+ if observed_catalog not in self.catalog_identities:
369
+ raise ValueError(
370
+ "finite contract catalog identity is absent from action semantics"
371
+ )
372
+ if type(option_families) is not tuple or not option_families:
373
+ raise ValueError("option_families must be a non-empty exact tuple")
374
+ if any(type(value) is not str for value in option_families):
375
+ raise TypeError("option_families must contain exact strings")
376
+ for value in option_families:
377
+ _token(value, "option_families entry")
378
+ foreign = tuple(
379
+ sorted(set(option_families) - set(self.declared_option_families))
380
+ )
381
+ if foreign:
382
+ raise ValueError(
383
+ "finite contract contains option families absent from action "
384
+ "semantics: " + ",".join(foreign)
385
+ )
386
+
387
+
388
+ def render_action_space_semantics(semantics: ActionSpaceSemantics) -> str:
389
+ """Render the canonical authoritative block for provider prompts."""
390
+
391
+ if type(semantics) is not ActionSpaceSemantics:
392
+ raise TypeError("semantics must be an exact ActionSpaceSemantics")
393
+ ActionSpaceSemantics.__post_init__(semantics)
394
+ payload = _canonical_json(semantics.to_record()).decode("ascii")
395
+ return "\n".join(
396
+ (
397
+ "ACTION-SPACE SEMANTICS (VERSIONED, AUTHORITATIVE)",
398
+ "Use these exact coordinate meanings and coupling rules; do not "
399
+ "infer geometry, topology, time, or spatial meaning from names.",
400
+ payload,
401
+ )
402
+ )
403
+
404
+
405
+ __all__ = [
406
+ "ActionAxisCoordinateSemantics",
407
+ "ActionAxisSemantics",
408
+ "ActionSpaceSemantics",
409
+ "CatalogIdentity",
410
+ "render_action_space_semantics",
411
+ ]
@@ -0,0 +1,105 @@
1
+ """Model-authored machinery, as data.
2
+
3
+ An authored artifact is SOURCE CODE written -- by a model, or by a shipped
4
+ rule standing in for one -- against a narrow typed contract: a surrogate's
5
+ ``fit_predict``, a variation operator's ``vary``, a generator's ``propose``.
6
+ Here it is only data; nothing in ``core/`` can execute it. Execution lives
7
+ behind ``infrastructure/authored_runtime.py``: out of process, under resource
8
+ limits, imports allowlisted, every outcome typed and counted.
9
+
10
+ The line the widening preserves is not "an artifact never emits a candidate"
11
+ -- a generator plainly does -- but that an artifact never decides what gets
12
+ MEASURED. A surrogate only orders candidates the loop already constructed. An
13
+ operator's output is validated value-by-value against the declared domains
14
+ and the parents' own material, and earns real evaluations only through the
15
+ governed, credit-assigned portfolio. A generator emits into a POOL, validated
16
+ the same way value by value, from a seam that never sees the problem or the
17
+ evaluation cache -- so mass generation is free and the loop still measures
18
+ only what its budget already allowed. Authorship is the model's; arbitration
19
+ is never.
20
+ """
21
+
22
+ from __future__ import annotations
23
+
24
+ import hashlib
25
+ from dataclasses import dataclass
26
+ from typing import Mapping
27
+
28
+ __all__ = ["AuthoredArtifact", "AuthoredContract", "CONTRACTS", "authored_artifact"]
29
+
30
+
31
+ @dataclass(frozen=True, slots=True)
32
+ class AuthoredContract:
33
+ """The narrow surface an authored artifact must implement."""
34
+
35
+ kind: str
36
+ entry_point: str
37
+ positional_arity: int
38
+ #: The exact signature line shown to whoever authors the artifact.
39
+ description: str
40
+
41
+
42
+ CONTRACTS: Mapping[str, AuthoredContract] = {
43
+ "surrogate": AuthoredContract(
44
+ kind="surrogate",
45
+ entry_point="fit_predict",
46
+ positional_arity=3,
47
+ description=(
48
+ "fit_predict(train_x: list[dict], train_y: list[dict], "
49
+ "test_x: list[dict]) -> list[dict] # stateless fit + predict; "
50
+ "one dict of objective_name -> float per test_x row"
51
+ ),
52
+ ),
53
+ "operator": AuthoredContract(
54
+ kind="operator",
55
+ entry_point="vary",
56
+ positional_arity=5,
57
+ description=(
58
+ "vary(parent_a: dict, parent_b: dict, loci: list[str], "
59
+ "domains: dict[str, list], seed: int) -> dict # pure and "
60
+ "deterministic given seed; every value from domains or a parent"
61
+ ),
62
+ ),
63
+ "generator": AuthoredContract(
64
+ kind="generator",
65
+ entry_point="propose",
66
+ positional_arity=4,
67
+ description=(
68
+ "propose(archive: list[dict], n: int, domains: dict[str, list], "
69
+ "seed: int) -> list[dict] # pure and deterministic given seed; "
70
+ "exactly n configurations, every value from domains at that locus"
71
+ ),
72
+ ),
73
+ }
74
+
75
+
76
+ @dataclass(frozen=True, slots=True)
77
+ class AuthoredArtifact:
78
+ """One authored source, hashed so a run can name exactly what it executed."""
79
+
80
+ kind: str
81
+ name: str
82
+ entry_point: str
83
+ source: str
84
+ source_sha256: str
85
+ authored_by: str # "llm" | "rule"
86
+
87
+
88
+ def authored_artifact(
89
+ kind: str, source: str, *, name: str, authored_by: str
90
+ ) -> AuthoredArtifact:
91
+ """Package *source* under the contract for *kind*, hashing it for identity."""
92
+
93
+ contract = CONTRACTS.get(kind)
94
+ if contract is None:
95
+ raise ValueError(
96
+ f"kind must be one of {sorted(CONTRACTS)}, got {kind!r}"
97
+ )
98
+ return AuthoredArtifact(
99
+ kind=kind,
100
+ name=name,
101
+ entry_point=contract.entry_point,
102
+ source=source,
103
+ source_sha256=hashlib.sha256(source.encode()).hexdigest(),
104
+ authored_by=authored_by,
105
+ )