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,818 @@
1
+ """Generic, authority-bound post-G3 reflection and atomic revision.
2
+
3
+ The G3 causal screen seals optimization endpoints before this policy runs.
4
+ This module then performs one optional provider call whose failure cannot erase
5
+ those endpoints. Every accepted result is joined to an engine-issued
6
+ request/provider/publication receipt; interceptor-authored metadata is never
7
+ treated as evidence on its own.
8
+
9
+ Benchmark semantics enter only through an injected ``ReflectionInsightContract``
10
+ and a declarative source-slot scope. This keeps the workflow reusable across
11
+ Airfoil, compiler flows, scheduling, or any future finite-action benchmark.
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ import hashlib
17
+ import json
18
+ import re
19
+ from dataclasses import dataclass, field
20
+ from typing import TYPE_CHECKING
21
+
22
+ from agent_evolve.application.agentic_evolution import (
23
+ AgenticEvolutionEngine,
24
+ InvocationOutcome,
25
+ ReflectionCallExecutionError,
26
+ ReflectionCallReceipt,
27
+ ReflectionCallStatus,
28
+ ReflectionPublicationResult,
29
+ )
30
+ from agent_evolve.application.budgeted_optimizer import GenerationReceipt
31
+ from agent_evolve.application.g3_causal_screen import G3CausalScreenPlanner
32
+ from agent_evolve.application.generation_feedback import (
33
+ GenerationFeedbackContext,
34
+ GenerationFeedbackReservation,
35
+ GenerationFeedbackResult,
36
+ )
37
+ from agent_evolve.application.insight_memory import (
38
+ InsightLifecycleState,
39
+ InsightMemoryBank,
40
+ InsightMemoryEntry,
41
+ InsightOrigin,
42
+ )
43
+ from agent_evolve.domain.ids import OperatorInvocationId
44
+ from agent_evolve.domain.insight import InsightRef
45
+ from agent_evolve.domain.patch import require_sha256
46
+ from agent_evolve.ports.agentic_generator import ReflectionInsightContract
47
+
48
+ if TYPE_CHECKING:
49
+ from agent_evolve.application.g3_causal_validation import (
50
+ G3TerminalStateValidationReceipt,
51
+ )
52
+
53
+
54
+ _TOKEN = re.compile(r"^[a-z][a-z0-9_.-]{0,95}$")
55
+ _SOURCE_SCOPE_DOMAIN = b"agent-evolve:g3-curation-source-scope:v1\x00"
56
+ _SPEC_DOMAIN = b"agent-evolve:g3-postseal-curation-spec:v1\x00"
57
+ _AUTHORITY_DOMAIN = b"agent-evolve:g3-postseal-curation-authority:v1\x00"
58
+ _RECEIPT_DOMAIN = b"agent-evolve:g3-postseal-curation-receipt:v1\x00"
59
+ G3_POSTSEAL_CURATION_DEFINITION_SHA256 = hashlib.sha256(
60
+ b"agent-evolve:g3-postseal-atomic-revision:v1:terminal-gate;"
61
+ b"declarative-source-scope;engine-request-provider-publication-receipt;"
62
+ b"one-zero-prior-quarantined-revision;isolated-provider-failure"
63
+ ).hexdigest()
64
+
65
+
66
+ def _canonical_json(value: object) -> bytes:
67
+ return json.dumps(
68
+ value,
69
+ ensure_ascii=True,
70
+ allow_nan=False,
71
+ separators=(",", ":"),
72
+ sort_keys=True,
73
+ ).encode("ascii")
74
+
75
+
76
+ def _hash(domain: bytes, record: object) -> str:
77
+ return hashlib.sha256(domain + _canonical_json(record)).hexdigest()
78
+
79
+
80
+ def _ref_record(reference: InsightRef) -> dict[str, object]:
81
+ return {
82
+ "insight_id": reference.insight_id.value,
83
+ "version": reference.version,
84
+ }
85
+
86
+
87
+ @dataclass(frozen=True, slots=True)
88
+ class G3CurationSourceScope:
89
+ """Declarative ordered selection of sealed G1--G3 outcome slots.
90
+
91
+ Selecting direct adaptive evidence only is useful when an exact finite
92
+ action contract cannot honestly attribute a composite union. Selecting all
93
+ ten slots is appropriate for family-level reflection. Either choice is
94
+ explicit, versioned, and included in the curation authority.
95
+ """
96
+
97
+ policy_id: str
98
+ policy_version: int
99
+ policy_definition_sha256: str
100
+ slot_ids: tuple[str, ...]
101
+ scope_sha256: str = field(init=False)
102
+
103
+ def __post_init__(self) -> None:
104
+ if type(self.policy_id) is not str or _TOKEN.fullmatch(self.policy_id) is None:
105
+ raise ValueError("source scope policy_id must use the token grammar")
106
+ if type(self.policy_version) is not int or self.policy_version <= 0:
107
+ raise ValueError("source scope policy_version must be positive")
108
+ require_sha256(
109
+ self.policy_definition_sha256,
110
+ "source scope policy_definition_sha256",
111
+ )
112
+ if (
113
+ type(self.slot_ids) is not tuple
114
+ or not self.slot_ids
115
+ or any(
116
+ type(value) is not str
117
+ or not value
118
+ or value != value.strip()
119
+ for value in self.slot_ids
120
+ )
121
+ ):
122
+ raise TypeError("source scope slot_ids must be canonical strings")
123
+ if len(set(self.slot_ids)) != len(self.slot_ids):
124
+ raise ValueError("source scope slot_ids cannot repeat")
125
+ object.__setattr__(
126
+ self,
127
+ "scope_sha256",
128
+ _hash(_SOURCE_SCOPE_DOMAIN, self.to_record()),
129
+ )
130
+
131
+ def to_record(self) -> dict[str, object]:
132
+ return {
133
+ "schema_version": 1,
134
+ "policy_id": self.policy_id,
135
+ "policy_version": self.policy_version,
136
+ "policy_definition_sha256": self.policy_definition_sha256,
137
+ "slot_ids": list(self.slot_ids),
138
+ }
139
+
140
+ def select(
141
+ self,
142
+ receipts: tuple[GenerationReceipt, ...],
143
+ ) -> tuple[InvocationOutcome, ...]:
144
+ """Resolve exact outcome objects from already-sealed receipts."""
145
+
146
+ if type(receipts) is not tuple or len(receipts) != 3:
147
+ raise ValueError("G3 curation requires exactly three generation receipts")
148
+ outcomes_by_slot: dict[str, InvocationOutcome] = {}
149
+ for receipt in receipts:
150
+ if type(receipt) is not GenerationReceipt:
151
+ raise TypeError("source receipts must be exact GenerationReceipt values")
152
+ for slot_result in receipt.slot_results:
153
+ slot_id = slot_result.slot.slot_id
154
+ if slot_id in outcomes_by_slot:
155
+ raise ValueError("generation receipts repeat a source slot ID")
156
+ outcomes_by_slot[slot_id] = slot_result.outcome
157
+ missing = tuple(
158
+ slot_id for slot_id in self.slot_ids if slot_id not in outcomes_by_slot
159
+ )
160
+ if missing:
161
+ raise ValueError("curation source scope names an absent G1--G3 slot")
162
+ return tuple(outcomes_by_slot[slot_id] for slot_id in self.slot_ids)
163
+
164
+
165
+ @dataclass(frozen=True, slots=True)
166
+ class G3PostsealCurationSpec:
167
+ """Benchmark-neutral behavior plus injected reflection vocabulary/scope."""
168
+
169
+ insight_contract: ReflectionInsightContract
170
+ source_scope: G3CurationSourceScope
171
+ policy_id: str = "g3_postseal_atomic_revision"
172
+ policy_version: int = 1
173
+ policy_definition_sha256: str = G3_POSTSEAL_CURATION_DEFINITION_SHA256
174
+ label: str = "g3_postseal_curation"
175
+ spec_sha256: str = field(init=False)
176
+
177
+ def __post_init__(self) -> None:
178
+ if type(self.insight_contract) is not ReflectionInsightContract:
179
+ raise TypeError("curation insight_contract must be exact")
180
+ ReflectionInsightContract.__post_init__(self.insight_contract)
181
+ if type(self.source_scope) is not G3CurationSourceScope:
182
+ raise TypeError("curation source_scope must be exact")
183
+ G3CurationSourceScope.__post_init__(self.source_scope)
184
+ if type(self.policy_id) is not str or _TOKEN.fullmatch(self.policy_id) is None:
185
+ raise ValueError("curation policy_id must use the token grammar")
186
+ if type(self.policy_version) is not int or self.policy_version <= 0:
187
+ raise ValueError("curation policy_version must be positive")
188
+ require_sha256(
189
+ self.policy_definition_sha256,
190
+ "curation policy_definition_sha256",
191
+ )
192
+ if (
193
+ type(self.label) is not str
194
+ or not self.label
195
+ or self.label != self.label.strip()
196
+ ):
197
+ raise ValueError("curation label must be canonical non-empty text")
198
+ object.__setattr__(self, "spec_sha256", _hash(_SPEC_DOMAIN, self.to_record()))
199
+
200
+ def to_record(self) -> dict[str, object]:
201
+ return {
202
+ "schema_version": 1,
203
+ "policy_id": self.policy_id,
204
+ "policy_version": self.policy_version,
205
+ "policy_definition_sha256": self.policy_definition_sha256,
206
+ "label": self.label,
207
+ "insight_contract_sha256": self.insight_contract.identity_sha256,
208
+ "source_scope_sha256": self.source_scope.scope_sha256,
209
+ }
210
+
211
+
212
+ def _adaptive_predecessor(
213
+ planner: G3CausalScreenPlanner,
214
+ memory: InsightMemoryBank,
215
+ ) -> tuple[InsightRef, InsightMemoryEntry]:
216
+ if type(planner) is not G3CausalScreenPlanner:
217
+ raise TypeError("curation predecessor planner must be exact")
218
+ if type(memory) is not InsightMemoryBank:
219
+ raise TypeError("curation predecessor memory must be exact")
220
+ assignments = planner.g2_assignments
221
+ if len(assignments) != 2:
222
+ raise ValueError("curation requires the sealed adaptive assignment")
223
+ selected = assignments[0].selection_decision.selected
224
+ if len(selected) != 1:
225
+ raise ValueError("adaptive assignment must select exactly one card")
226
+ reference = selected[0]
227
+ return reference, memory.entries_for((reference,))[0]
228
+
229
+
230
+ def build_g3_postseal_curation_reservation(
231
+ *,
232
+ spec: G3PostsealCurationSpec,
233
+ planner: G3CausalScreenPlanner,
234
+ memory: InsightMemoryBank,
235
+ generation: int,
236
+ ) -> GenerationFeedbackReservation:
237
+ """Rebuild the expected reservation independently for final validation."""
238
+
239
+ if type(spec) is not G3PostsealCurationSpec:
240
+ raise TypeError("curation reservation spec must be exact")
241
+ G3PostsealCurationSpec.__post_init__(spec)
242
+ if type(generation) is not int or not 1 <= generation <= 3:
243
+ raise ValueError("curation reservation generation must lie in [1,3]")
244
+ if generation < 3:
245
+ metadata = tuple(
246
+ sorted(
247
+ (
248
+ ("curation_spec_sha256", spec.spec_sha256),
249
+ ("stage", "sealed_no_op"),
250
+ )
251
+ )
252
+ )
253
+ else:
254
+ terminal_authority = planner.terminal_validation_authority
255
+ if terminal_authority is None:
256
+ raise ValueError("G3 terminal validation authority is not sealed")
257
+ predecessor, entry = _adaptive_predecessor(planner, memory)
258
+ metadata = tuple(
259
+ sorted(
260
+ (
261
+ ("curation_spec_sha256", spec.spec_sha256),
262
+ (
263
+ "reflection_contract_sha256",
264
+ spec.insight_contract.identity_sha256,
265
+ ),
266
+ (
267
+ "revision_predecessor",
268
+ f"{predecessor.insight_id.value}@{predecessor.version}",
269
+ ),
270
+ (
271
+ "revision_predecessor_content_sha256",
272
+ entry.draft.content_sha256,
273
+ ),
274
+ ("source_scope_sha256", spec.source_scope.scope_sha256),
275
+ ("stage", "post_g3"),
276
+ (
277
+ "terminal_validation_authority_sha256",
278
+ terminal_authority.authority_sha256,
279
+ ),
280
+ )
281
+ )
282
+ )
283
+ return GenerationFeedbackReservation(
284
+ policy_id=spec.policy_id,
285
+ policy_version=spec.policy_version,
286
+ logical_llm_calls=1 if generation == 3 else 0,
287
+ metadata=metadata,
288
+ )
289
+
290
+
291
+ @dataclass(frozen=True, slots=True)
292
+ class G3PostsealCurationAuthority:
293
+ """Pre-provider commitment joining the terminal gate to one request."""
294
+
295
+ spec_sha256: str
296
+ reservation_hash: str
297
+ terminal_validation_receipt_sha256: str
298
+ terminal_validation_authority_sha256: str
299
+ generation_receipt_sha256s: tuple[str, str, str]
300
+ source_scope_sha256: str
301
+ source_slot_ids: tuple[str, ...]
302
+ source_operator_invocation_ids: tuple[OperatorInvocationId, ...]
303
+ revision_predecessor: InsightRef
304
+ revision_predecessor_content_sha256: str
305
+ insight_contract_sha256: str
306
+ reflection_label: str
307
+ authority_sha256: str = ""
308
+
309
+ def __post_init__(self) -> None:
310
+ for name in (
311
+ "spec_sha256",
312
+ "reservation_hash",
313
+ "terminal_validation_receipt_sha256",
314
+ "terminal_validation_authority_sha256",
315
+ "source_scope_sha256",
316
+ "revision_predecessor_content_sha256",
317
+ "insight_contract_sha256",
318
+ ):
319
+ require_sha256(getattr(self, name), f"curation authority {name}")
320
+ if (
321
+ type(self.generation_receipt_sha256s) is not tuple
322
+ or len(self.generation_receipt_sha256s) != 3
323
+ ):
324
+ raise ValueError("curation authority requires G1--G3 receipt hashes")
325
+ for value in self.generation_receipt_sha256s:
326
+ require_sha256(value, "curation source generation receipt")
327
+ if (
328
+ type(self.source_slot_ids) is not tuple
329
+ or not self.source_slot_ids
330
+ or len(set(self.source_slot_ids)) != len(self.source_slot_ids)
331
+ ):
332
+ raise ValueError("curation authority requires unique source slots")
333
+ if type(self.source_operator_invocation_ids) is not tuple or any(
334
+ type(value) is not OperatorInvocationId
335
+ for value in self.source_operator_invocation_ids
336
+ ):
337
+ raise TypeError("curation source operator IDs must be exact")
338
+ for value in self.source_operator_invocation_ids:
339
+ OperatorInvocationId.__post_init__(value)
340
+ if len(self.source_slot_ids) != len(self.source_operator_invocation_ids):
341
+ raise ValueError("curation source slots/operator IDs differ")
342
+ if len(set(self.source_operator_invocation_ids)) != len(
343
+ self.source_operator_invocation_ids
344
+ ):
345
+ raise ValueError("curation source operator IDs cannot repeat")
346
+ if type(self.revision_predecessor) is not InsightRef:
347
+ raise TypeError("curation revision predecessor must be exact")
348
+ InsightRef.__post_init__(self.revision_predecessor)
349
+ if (
350
+ type(self.reflection_label) is not str
351
+ or not self.reflection_label
352
+ or self.reflection_label != self.reflection_label.strip()
353
+ ):
354
+ raise ValueError("curation reflection label must be canonical")
355
+ expected = _hash(_AUTHORITY_DOMAIN, self.to_record())
356
+ if self.authority_sha256:
357
+ require_sha256(self.authority_sha256, "curation authority_sha256")
358
+ if self.authority_sha256 != expected:
359
+ raise ValueError("curation authority hash does not authenticate data")
360
+ else:
361
+ object.__setattr__(self, "authority_sha256", expected)
362
+
363
+ def to_record(self) -> dict[str, object]:
364
+ return {
365
+ "schema_version": 1,
366
+ "spec_sha256": self.spec_sha256,
367
+ "reservation_hash": self.reservation_hash,
368
+ "terminal_validation_receipt_sha256": (
369
+ self.terminal_validation_receipt_sha256
370
+ ),
371
+ "terminal_validation_authority_sha256": (
372
+ self.terminal_validation_authority_sha256
373
+ ),
374
+ "generation_receipt_sha256s": list(
375
+ self.generation_receipt_sha256s
376
+ ),
377
+ "source_scope_sha256": self.source_scope_sha256,
378
+ "source_slot_ids": list(self.source_slot_ids),
379
+ "source_operator_invocation_ids": [
380
+ value.value for value in self.source_operator_invocation_ids
381
+ ],
382
+ "revision_predecessor": _ref_record(self.revision_predecessor),
383
+ "revision_predecessor_content_sha256": (
384
+ self.revision_predecessor_content_sha256
385
+ ),
386
+ "insight_contract_sha256": self.insight_contract_sha256,
387
+ "reflection_label": self.reflection_label,
388
+ "requested_cardinality": {"min": 0, "max": 1},
389
+ }
390
+
391
+
392
+ @dataclass(frozen=True, slots=True)
393
+ class G3PostsealCurationReceipt:
394
+ """Authenticated success/failure result for the isolated sixth call."""
395
+
396
+ authority: G3PostsealCurationAuthority
397
+ call_receipt: ReflectionCallReceipt
398
+ curation_status: str
399
+ failure_type: str | None
400
+ receipt_sha256: str = ""
401
+
402
+ def __post_init__(self) -> None:
403
+ if type(self.authority) is not G3PostsealCurationAuthority:
404
+ raise TypeError("curation receipt authority must be exact")
405
+ G3PostsealCurationAuthority.__post_init__(self.authority)
406
+ if type(self.call_receipt) is not ReflectionCallReceipt:
407
+ raise TypeError("curation call_receipt must be exact")
408
+ ReflectionCallReceipt.__post_init__(self.call_receipt)
409
+ authority = self.authority
410
+ request = self.call_receipt.request
411
+ if (
412
+ request.label != authority.reflection_label
413
+ or request.operation != "extract_insights"
414
+ or request.min_insights != 0
415
+ or request.max_insights != 1
416
+ or request.insight_contract_sha256
417
+ != authority.insight_contract_sha256
418
+ or request.revision_predecessors
419
+ != (authority.revision_predecessor,)
420
+ or request.revision_predecessor_content_sha256s
421
+ != (authority.revision_predecessor_content_sha256,)
422
+ or request.source_receipt_sha256s
423
+ != authority.generation_receipt_sha256s
424
+ or request.source_operator_invocation_ids
425
+ != authority.source_operator_invocation_ids
426
+ or len(request.source_outcome_sha256s)
427
+ != len(authority.source_slot_ids)
428
+ ):
429
+ raise ValueError("engine reflection request differs from curation authority")
430
+ publications = self.call_receipt.publications
431
+ if self.curation_status == "sealed_complete":
432
+ if (
433
+ self.failure_type is not None
434
+ or self.call_receipt.status is not ReflectionCallStatus.COMPLETED
435
+ or len(publications) > 1
436
+ ):
437
+ raise ValueError("completed curation has invalid provider/publication data")
438
+ if publications:
439
+ publication = publications[0]
440
+ predecessor = authority.revision_predecessor
441
+ if (
442
+ publication.revision_predecessor != predecessor
443
+ or publication.reference.insight_id != predecessor.insight_id
444
+ or publication.reference.version != predecessor.version + 1
445
+ or publication.lifecycle_state
446
+ is not InsightLifecycleState.QUARANTINED
447
+ or publication.origin is not InsightOrigin.REFLECTION
448
+ or publication.initial_score != 0.0
449
+ ):
450
+ raise ValueError("curation publication is not one fresh revision")
451
+ elif self.curation_status == "incomplete":
452
+ if (
453
+ type(self.failure_type) is not str
454
+ or not self.failure_type
455
+ or self.call_receipt.status is not ReflectionCallStatus.FAILED
456
+ or self.call_receipt.failure_type != self.failure_type
457
+ or publications
458
+ ):
459
+ raise ValueError("incomplete curation lacks exact failure evidence")
460
+ else:
461
+ raise ValueError("curation_status must be sealed_complete or incomplete")
462
+ expected = _hash(_RECEIPT_DOMAIN, self.to_record())
463
+ if self.receipt_sha256:
464
+ require_sha256(self.receipt_sha256, "curation receipt_sha256")
465
+ if self.receipt_sha256 != expected:
466
+ raise ValueError("curation receipt hash does not authenticate data")
467
+ else:
468
+ object.__setattr__(self, "receipt_sha256", expected)
469
+
470
+ def to_record(self) -> dict[str, object]:
471
+ return {
472
+ "schema_version": 1,
473
+ "authority_sha256": self.authority.authority_sha256,
474
+ "reflection_call_receipt_sha256": self.call_receipt.receipt_sha256,
475
+ "reflection_call_id": self.call_receipt.call_id.value,
476
+ "reflection_request_sha256": self.call_receipt.request.request_sha256,
477
+ "curation_status": self.curation_status,
478
+ "publication_outcome": self.publication_outcome,
479
+ "failure_type": self.failure_type,
480
+ "publication_sha256s": [
481
+ value.publication_sha256
482
+ for value in self.call_receipt.publications
483
+ ],
484
+ }
485
+
486
+ @property
487
+ def publication_outcome(self) -> str:
488
+ if self.curation_status == "incomplete":
489
+ return "failed"
490
+ return (
491
+ "completed_revision"
492
+ if self.call_receipt.publications
493
+ else "completed_abstention"
494
+ )
495
+
496
+
497
+ class G3PostsealCurationInterceptor:
498
+ """One reusable feedback policy for the exact generic G3 screen."""
499
+
500
+ def __init__(
501
+ self,
502
+ *,
503
+ engine: AgenticEvolutionEngine,
504
+ planner: G3CausalScreenPlanner,
505
+ memory: InsightMemoryBank,
506
+ spec: G3PostsealCurationSpec,
507
+ ) -> None:
508
+ if type(engine) is not AgenticEvolutionEngine:
509
+ raise TypeError("curation engine must be exact")
510
+ if type(planner) is not G3CausalScreenPlanner:
511
+ raise TypeError("curation planner must be exact")
512
+ if type(memory) is not InsightMemoryBank:
513
+ raise TypeError("curation memory must be exact")
514
+ if type(spec) is not G3PostsealCurationSpec:
515
+ raise TypeError("curation spec must be exact")
516
+ G3PostsealCurationSpec.__post_init__(spec)
517
+ if planner.engine is not engine or planner.memory is not memory:
518
+ raise ValueError("curation collaborators differ from planner runtime")
519
+ self.engine = engine
520
+ self.planner = planner
521
+ self.memory = memory
522
+ self.spec = spec
523
+ self.policy_id = spec.policy_id
524
+ self.policy_version = spec.policy_version
525
+ self.invoked_generations: list[int] = []
526
+ self.curated_entries: tuple[InsightMemoryEntry, ...] = ()
527
+ self.terminal_validation_receipt: G3TerminalStateValidationReceipt | None = None
528
+ self.curation_authority: G3PostsealCurationAuthority | None = None
529
+ self.curation_receipt: G3PostsealCurationReceipt | None = None
530
+ self.curation_failure_type: str | None = None
531
+ self._reservations: dict[int, GenerationFeedbackReservation] = {}
532
+
533
+ def _predecessor(self) -> tuple[InsightRef, InsightMemoryEntry]:
534
+ return _adaptive_predecessor(self.planner, self.memory)
535
+
536
+ def _reservation_metadata(self, *, generation: int) -> tuple[tuple[str, str], ...]:
537
+ if generation < 3:
538
+ return tuple(
539
+ sorted(
540
+ (
541
+ ("curation_spec_sha256", self.spec.spec_sha256),
542
+ ("stage", "sealed_no_op"),
543
+ )
544
+ )
545
+ )
546
+ if generation != 3:
547
+ raise ValueError("G3 curation cannot reserve a foreign generation")
548
+ terminal_authority = self.planner.terminal_validation_authority
549
+ if terminal_authority is None:
550
+ raise ValueError("G3 terminal validation authority is not sealed")
551
+ predecessor, entry = self._predecessor()
552
+ return tuple(
553
+ sorted(
554
+ (
555
+ ("curation_spec_sha256", self.spec.spec_sha256),
556
+ (
557
+ "reflection_contract_sha256",
558
+ self.spec.insight_contract.identity_sha256,
559
+ ),
560
+ (
561
+ "revision_predecessor",
562
+ f"{predecessor.insight_id.value}@{predecessor.version}",
563
+ ),
564
+ (
565
+ "revision_predecessor_content_sha256",
566
+ entry.draft.content_sha256,
567
+ ),
568
+ ("source_scope_sha256", self.spec.source_scope.scope_sha256),
569
+ ("stage", "post_g3"),
570
+ (
571
+ "terminal_validation_authority_sha256",
572
+ terminal_authority.authority_sha256,
573
+ ),
574
+ )
575
+ )
576
+ )
577
+
578
+ def expected_reservation(self, *, generation: int) -> GenerationFeedbackReservation:
579
+ reservation = build_g3_postseal_curation_reservation(
580
+ spec=self.spec,
581
+ planner=self.planner,
582
+ memory=self.memory,
583
+ generation=generation,
584
+ )
585
+ if reservation.metadata != self._reservation_metadata(generation=generation):
586
+ raise AssertionError("curation reservation implementations diverged")
587
+ return reservation
588
+
589
+ def reserve(self, *, state, plan) -> GenerationFeedbackReservation:
590
+ if state.generation + 1 != plan.generation:
591
+ raise ValueError("feedback reservation observed the wrong generation")
592
+ if plan.generation in self._reservations:
593
+ raise RuntimeError("curation generation was reserved twice")
594
+ reservation = self.expected_reservation(generation=plan.generation)
595
+ self._reservations[plan.generation] = reservation
596
+ return reservation
597
+
598
+ async def after_generation(
599
+ self,
600
+ context: GenerationFeedbackContext,
601
+ ) -> GenerationFeedbackResult:
602
+ generation = context.plan.generation
603
+ self.invoked_generations.append(generation)
604
+ expected_reservation = self._reservations.get(generation)
605
+ if context.reservation != expected_reservation:
606
+ raise ValueError("curation context differs from its frozen reservation")
607
+ if generation < 3:
608
+ if context.reservation.logical_llm_calls != 0:
609
+ raise ValueError("early G3 feedback reservation must be zero")
610
+ return GenerationFeedbackResult(
611
+ logical_llm_calls_used=0,
612
+ metadata=tuple(
613
+ sorted(
614
+ (
615
+ ("curation_spec_sha256", self.spec.spec_sha256),
616
+ ("curation_status", "not_due"),
617
+ )
618
+ )
619
+ ),
620
+ )
621
+ if generation != 3:
622
+ raise ValueError("G3 curation received a foreign generation")
623
+ from agent_evolve.application.g3_causal_validation import (
624
+ validate_g3_terminal_state,
625
+ )
626
+
627
+ self.terminal_validation_receipt = validate_g3_terminal_state(
628
+ state=context.state,
629
+ planner=self.planner,
630
+ evaluation_cache_snapshot=(
631
+ await self.engine.evaluation_cache_snapshot()
632
+ ),
633
+ )
634
+ receipts = context.state.generation_receipts
635
+ if (
636
+ type(receipts) is not tuple
637
+ or len(receipts) != 3
638
+ or receipts[-1] != context.generation_receipt
639
+ ):
640
+ raise ValueError("curation requires sealed G1 through G3 receipts")
641
+ outcomes = self.spec.source_scope.select(receipts)
642
+ predecessor, predecessor_entry = self._predecessor()
643
+ terminal_authority = self.planner.terminal_validation_authority
644
+ if terminal_authority is None:
645
+ raise ValueError("terminal authority disappeared before curation")
646
+ generation_receipt_sha256s = tuple(
647
+ receipt.receipt_hash for receipt in receipts
648
+ )
649
+ if len(generation_receipt_sha256s) != 3: # narrows the tuple type.
650
+ raise AssertionError("G3 receipt cardinality changed")
651
+ authority = G3PostsealCurationAuthority(
652
+ spec_sha256=self.spec.spec_sha256,
653
+ reservation_hash=context.reservation.reservation_hash,
654
+ terminal_validation_receipt_sha256=(
655
+ self.terminal_validation_receipt.receipt_sha256
656
+ ),
657
+ terminal_validation_authority_sha256=(
658
+ terminal_authority.authority_sha256
659
+ ),
660
+ generation_receipt_sha256s=generation_receipt_sha256s,
661
+ source_scope_sha256=self.spec.source_scope.scope_sha256,
662
+ source_slot_ids=self.spec.source_scope.slot_ids,
663
+ source_operator_invocation_ids=tuple(
664
+ outcome.prepared.operator_invocation_id for outcome in outcomes
665
+ ),
666
+ revision_predecessor=predecessor,
667
+ revision_predecessor_content_sha256=(
668
+ predecessor_entry.draft.content_sha256
669
+ ),
670
+ insight_contract_sha256=(
671
+ self.spec.insight_contract.identity_sha256
672
+ ),
673
+ reflection_label=self.spec.label,
674
+ )
675
+ # Publish the authority before crossing the provider boundary. A typed
676
+ # provider/cardinality failure can therefore be isolated and audited.
677
+ self.curation_authority = authority
678
+ try:
679
+ publication_result = await self.engine.reflect_with_receipt(
680
+ outcomes,
681
+ label=self.spec.label,
682
+ max_insights=1,
683
+ min_insights=0,
684
+ insight_contract=self.spec.insight_contract,
685
+ revision_predecessors=(predecessor,),
686
+ source_receipt_sha256s=generation_receipt_sha256s,
687
+ )
688
+ except ReflectionCallExecutionError as exc:
689
+ self.curation_failure_type = exc.failure_type
690
+ receipt = G3PostsealCurationReceipt(
691
+ authority=authority,
692
+ call_receipt=exc.receipt,
693
+ curation_status="incomplete",
694
+ failure_type=exc.failure_type,
695
+ )
696
+ self.curation_receipt = receipt
697
+ return self._feedback_result(receipt)
698
+ if type(publication_result) is not ReflectionPublicationResult:
699
+ raise TypeError("receipt-bearing reflection returned a foreign result")
700
+ ReflectionPublicationResult.__post_init__(publication_result)
701
+ self.curated_entries = publication_result.entries
702
+ receipt = G3PostsealCurationReceipt(
703
+ authority=authority,
704
+ call_receipt=publication_result.receipt,
705
+ curation_status="sealed_complete",
706
+ failure_type=None,
707
+ )
708
+ self.curation_receipt = receipt
709
+ return self._feedback_result(receipt)
710
+
711
+ def _feedback_result(
712
+ self,
713
+ receipt: G3PostsealCurationReceipt,
714
+ ) -> GenerationFeedbackResult:
715
+ metadata = [
716
+ ("curated_entry_count", str(len(receipt.call_receipt.publications))),
717
+ ("curation_authority_sha256", receipt.authority.authority_sha256),
718
+ ("curation_receipt_sha256", receipt.receipt_sha256),
719
+ ("curation_spec_sha256", self.spec.spec_sha256),
720
+ ("curation_status", receipt.curation_status),
721
+ ("curation_publication_outcome", receipt.publication_outcome),
722
+ (
723
+ "reflection_call_receipt_sha256",
724
+ receipt.call_receipt.receipt_sha256,
725
+ ),
726
+ (
727
+ "reflection_call_id",
728
+ receipt.call_receipt.call_id.value,
729
+ ),
730
+ (
731
+ "reflection_max_output_tokens",
732
+ str(receipt.call_receipt.request.max_output_tokens),
733
+ ),
734
+ (
735
+ "reflection_prompt_sha256",
736
+ receipt.call_receipt.request.prompt_sha256,
737
+ ),
738
+ (
739
+ "reflection_request_sha256",
740
+ receipt.call_receipt.request.request_sha256,
741
+ ),
742
+ (
743
+ "reflection_temperature",
744
+ (
745
+ "none"
746
+ if receipt.call_receipt.request.temperature is None
747
+ else float(
748
+ receipt.call_receipt.request.temperature
749
+ ).hex()
750
+ ),
751
+ ),
752
+ (
753
+ "terminal_validation_receipt_sha256",
754
+ receipt.authority.terminal_validation_receipt_sha256,
755
+ ),
756
+ ]
757
+ if receipt.failure_type is not None:
758
+ metadata.append(("curation_failure_type", receipt.failure_type))
759
+ if receipt.call_receipt.telemetry_sha256 is not None:
760
+ metadata.append(
761
+ (
762
+ "reflection_telemetry_sha256",
763
+ receipt.call_receipt.telemetry_sha256,
764
+ )
765
+ )
766
+ return GenerationFeedbackResult(
767
+ logical_llm_calls_used=1,
768
+ metadata=tuple(sorted(metadata)),
769
+ )
770
+
771
+
772
+ class G3PostsealCurationFactory:
773
+ """Deferred public-composition factory for the exact runtime identities."""
774
+
775
+ def __init__(
776
+ self,
777
+ *,
778
+ spec: G3PostsealCurationSpec,
779
+ ) -> None:
780
+ if type(spec) is not G3PostsealCurationSpec:
781
+ raise TypeError("curation factory spec must be exact")
782
+ G3PostsealCurationSpec.__post_init__(spec)
783
+ self.spec = spec
784
+ self.interceptor: G3PostsealCurationInterceptor | None = None
785
+ self.runtime_identities: tuple[object, object, object, object] | None = None
786
+
787
+ def build(self, *, benchmark, engine, id_factory, memory, planner):
788
+ if self.interceptor is not None:
789
+ raise RuntimeError("curation factory may be invoked only once")
790
+ if type(planner) is not G3CausalScreenPlanner:
791
+ raise TypeError("curation factory requires the exact G3 runtime planner")
792
+ if (
793
+ planner.benchmark is not benchmark
794
+ or planner.engine is not engine
795
+ or planner.ids is not id_factory
796
+ or planner.memory is not memory
797
+ ):
798
+ raise ValueError("curation factory received foreign runtime identities")
799
+ self.runtime_identities = (benchmark, engine, id_factory, memory)
800
+ self.interceptor = G3PostsealCurationInterceptor(
801
+ engine=engine,
802
+ planner=planner,
803
+ memory=memory,
804
+ spec=self.spec,
805
+ )
806
+ return self.interceptor
807
+
808
+
809
+ __all__ = [
810
+ "G3CurationSourceScope",
811
+ "G3PostsealCurationAuthority",
812
+ "G3PostsealCurationFactory",
813
+ "G3PostsealCurationInterceptor",
814
+ "G3PostsealCurationReceipt",
815
+ "G3PostsealCurationSpec",
816
+ "G3_POSTSEAL_CURATION_DEFINITION_SHA256",
817
+ "build_g3_postseal_curation_reservation",
818
+ ]