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,557 @@
1
+ """Provider-neutral compilation of memory hypotheses into executable tests.
2
+
3
+ The memory bank owns immutable, evidence-lined hypotheses. A benchmark owns
4
+ the meaning of an action template in its current parent-bound variation
5
+ catalog. This port is the dependency-inversion seam between those two facts:
6
+ trusted benchmark code may bind a hypothesis to exact finite options, but it
7
+ cannot edit the hypothesis, relax the catalog, or observe candidate outcomes.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import hashlib
13
+ import json
14
+ import re
15
+ from dataclasses import dataclass, field
16
+ from enum import Enum
17
+ from typing import Protocol, runtime_checkable
18
+
19
+ from agent_evolve.domain.finite_variation import (
20
+ FiniteVariationContract,
21
+ validate_finite_variation_contract,
22
+ )
23
+ from agent_evolve.domain.ids import CandidateId
24
+ from agent_evolve.domain.insight import InsightRef
25
+ from agent_evolve.domain.patch import require_sha256
26
+ from agent_evolve.ports.agentic_generator import InsightDraft, MetricEffectPrediction
27
+ from agent_evolve.policies.memory.treatment_compliance import TreatmentActionBinding
28
+
29
+
30
+ _TOKEN = re.compile(r"^[a-z][a-z0-9_.-]{0,95}$")
31
+ _PATH = re.compile(
32
+ r"^\$\.[^.\[\]\s]+(?:\.[^.\[\]\s]+|\[(?:0|[1-9][0-9]*)\])*$"
33
+ )
34
+ _COMPILATION_DOMAIN = b"agent-evolve:hypothesis-compilation:v1\x00"
35
+ _SPEC_DOMAIN = b"agent-evolve:executable-hypothesis-test-spec:v1\x00"
36
+
37
+
38
+ def _canonical_json(value: object) -> bytes:
39
+ return json.dumps(
40
+ value,
41
+ ensure_ascii=True,
42
+ allow_nan=False,
43
+ separators=(",", ":"),
44
+ sort_keys=True,
45
+ ).encode("ascii")
46
+
47
+
48
+ def _hash(domain: bytes, value: object) -> str:
49
+ return hashlib.sha256(domain + _canonical_json(value)).hexdigest()
50
+
51
+
52
+ def _canonical_tokens(values: tuple[str, ...], *, name: str) -> None:
53
+ if type(values) is not tuple or any(
54
+ type(value) is not str or _TOKEN.fullmatch(value) is None
55
+ for value in values
56
+ ):
57
+ raise TypeError(f"{name} must contain canonical token strings")
58
+ if values != tuple(sorted(set(values))):
59
+ raise ValueError(f"{name} must be unique and canonically sorted")
60
+
61
+
62
+ def _canonical_paths(values: tuple[str, ...], *, name: str) -> None:
63
+ if type(values) is not tuple or any(
64
+ type(value) is not str or _PATH.fullmatch(value) is None
65
+ for value in values
66
+ ):
67
+ raise TypeError(f"{name} must contain canonical rooted JSON paths")
68
+ if values != tuple(sorted(set(values))):
69
+ raise ValueError(f"{name} must be unique and canonically sorted")
70
+
71
+
72
+ def _path_segments(value: str) -> tuple[str, ...]:
73
+ """Return comparison segments for a canonical rooted JSON path.
74
+
75
+ The executable-hypothesis boundary does not interpret candidate values, but
76
+ it must reject a compiler claiming that ``$.model`` is held fixed while
77
+ mutating ``$.model.width`` (and the converse). Separators are retained only
78
+ as structural boundaries; quoted/escaped JSONPath dialects are deliberately
79
+ outside this closed contract.
80
+ """
81
+
82
+ if _PATH.fullmatch(value) is None:
83
+ raise ValueError("path must be a canonical rooted JSON path")
84
+ tail = value[1:]
85
+ return tuple(
86
+ part
87
+ for part in re.split(r"(?:\.|\[|\])", tail)
88
+ if part
89
+ )
90
+
91
+
92
+ def _paths_overlap(left: str, right: str) -> bool:
93
+ left_segments = _path_segments(left)
94
+ right_segments = _path_segments(right)
95
+ common = min(len(left_segments), len(right_segments))
96
+ return left_segments[:common] == right_segments[:common]
97
+
98
+
99
+ @dataclass(frozen=True, slots=True)
100
+ class HypothesisCompilationRequest:
101
+ """Outcome-blind request to bind one exact hypothesis to one parent."""
102
+
103
+ reference: InsightRef
104
+ insight: InsightDraft
105
+ source_evidence_sha256: str
106
+ requested_operator_kind: str
107
+ source_operator_kinds: tuple[str, ...]
108
+ parent_candidate_id: CandidateId
109
+ parent_configuration_sha256: str
110
+ finite_contract: FiniteVariationContract
111
+ context_projection_sha256: str
112
+ endpoint_definition_sha256: str
113
+
114
+ def __post_init__(self) -> None:
115
+ if type(self.reference) is not InsightRef:
116
+ raise TypeError("reference must be an exact InsightRef")
117
+ InsightRef.__post_init__(self.reference)
118
+ if type(self.insight) is not InsightDraft:
119
+ raise TypeError("insight must be an exact InsightDraft")
120
+ InsightDraft.__post_init__(self.insight)
121
+ if not self.insight.has_intervention_contract:
122
+ raise ValueError(
123
+ "hypothesis compilation requires an intervention-contract insight"
124
+ )
125
+ require_sha256(self.source_evidence_sha256, "source_evidence_sha256")
126
+ if (
127
+ type(self.requested_operator_kind) is not str
128
+ or _TOKEN.fullmatch(self.requested_operator_kind) is None
129
+ ):
130
+ raise ValueError("requested_operator_kind must use the token grammar")
131
+ _canonical_tokens(
132
+ self.source_operator_kinds,
133
+ name="source_operator_kinds",
134
+ )
135
+ if not self.source_operator_kinds:
136
+ raise ValueError("source_operator_kinds must be non-empty")
137
+ if type(self.parent_candidate_id) is not CandidateId:
138
+ raise TypeError("parent_candidate_id must be an exact CandidateId")
139
+ CandidateId.__post_init__(self.parent_candidate_id)
140
+ require_sha256(
141
+ self.parent_configuration_sha256,
142
+ "parent_configuration_sha256",
143
+ )
144
+ validate_finite_variation_contract(self.finite_contract)
145
+ if (
146
+ self.finite_contract.parent_configuration_sha256
147
+ != self.parent_configuration_sha256
148
+ ):
149
+ raise ValueError("finite contract is bound to a different parent")
150
+ require_sha256(
151
+ self.context_projection_sha256,
152
+ "context_projection_sha256",
153
+ )
154
+ require_sha256(
155
+ self.endpoint_definition_sha256,
156
+ "endpoint_definition_sha256",
157
+ )
158
+
159
+ def to_record(self) -> dict[str, object]:
160
+ self.__post_init__()
161
+ return {
162
+ "schema_version": 1,
163
+ "reference": {
164
+ "insight_id": self.reference.insight_id.value,
165
+ "version": self.reference.version,
166
+ },
167
+ "insight_content_sha256": self.insight.content_sha256,
168
+ "source_evidence_sha256": self.source_evidence_sha256,
169
+ "requested_operator_kind": self.requested_operator_kind,
170
+ "source_operator_kinds": list(self.source_operator_kinds),
171
+ "parent_candidate_id": self.parent_candidate_id.value,
172
+ "parent_configuration_sha256": self.parent_configuration_sha256,
173
+ "finite_contract_sha256": self.finite_contract.identity_sha256,
174
+ "context_projection_sha256": self.context_projection_sha256,
175
+ "endpoint_definition_sha256": self.endpoint_definition_sha256,
176
+ }
177
+
178
+ @property
179
+ def request_sha256(self) -> str:
180
+ return _hash(_COMPILATION_DOMAIN, self.to_record())
181
+
182
+
183
+ @dataclass(frozen=True, slots=True)
184
+ class ExecutableHypothesisTestSpec:
185
+ """Exact parent-bound intervention and falsification contract."""
186
+
187
+ request_sha256: str
188
+ reference: InsightRef
189
+ insight_content_sha256: str
190
+ source_evidence_sha256: str
191
+ requested_operator_kind: str
192
+ source_operator_kinds: tuple[str, ...]
193
+ executable_operator_kinds: tuple[str, ...]
194
+ parent_candidate_id: CandidateId
195
+ parent_configuration_sha256: str
196
+ finite_contract_sha256: str
197
+ context_projection_sha256: str
198
+ endpoint_definition_sha256: str
199
+ allowed_actions: tuple[TreatmentActionBinding, ...]
200
+ recommended_option_families: tuple[str, ...]
201
+ affected_paths: tuple[str, ...]
202
+ held_fixed_paths: tuple[str, ...]
203
+ effect_predictions: tuple[MetricEffectPrediction, ...]
204
+ falsification_condition: str
205
+ compiler_policy_id: str
206
+ compiler_policy_version: int
207
+ compiler_definition_sha256: str
208
+ spec_sha256: str = field(init=False)
209
+
210
+ def __post_init__(self) -> None:
211
+ for name in (
212
+ "request_sha256",
213
+ "insight_content_sha256",
214
+ "source_evidence_sha256",
215
+ "parent_configuration_sha256",
216
+ "finite_contract_sha256",
217
+ "context_projection_sha256",
218
+ "endpoint_definition_sha256",
219
+ "compiler_definition_sha256",
220
+ ):
221
+ require_sha256(getattr(self, name), name)
222
+ if type(self.reference) is not InsightRef:
223
+ raise TypeError("reference must be an exact InsightRef")
224
+ InsightRef.__post_init__(self.reference)
225
+ if (
226
+ type(self.requested_operator_kind) is not str
227
+ or _TOKEN.fullmatch(self.requested_operator_kind) is None
228
+ ):
229
+ raise ValueError("requested_operator_kind must use the token grammar")
230
+ _canonical_tokens(
231
+ self.source_operator_kinds,
232
+ name="source_operator_kinds",
233
+ )
234
+ if not self.source_operator_kinds:
235
+ raise ValueError("source_operator_kinds must be non-empty")
236
+ _canonical_tokens(
237
+ self.executable_operator_kinds,
238
+ name="executable_operator_kinds",
239
+ )
240
+ if self.executable_operator_kinds != (self.requested_operator_kind,):
241
+ raise ValueError(
242
+ "executable operator scope must equal the requested singleton"
243
+ )
244
+ if type(self.parent_candidate_id) is not CandidateId:
245
+ raise TypeError("parent_candidate_id must be an exact CandidateId")
246
+ CandidateId.__post_init__(self.parent_candidate_id)
247
+ if type(self.allowed_actions) is not tuple or not self.allowed_actions:
248
+ raise ValueError("an executable hypothesis needs allowed actions")
249
+ if any(
250
+ type(value) is not TreatmentActionBinding
251
+ for value in self.allowed_actions
252
+ ):
253
+ raise TypeError("allowed_actions must contain exact action bindings")
254
+ for action in self.allowed_actions:
255
+ TreatmentActionBinding.__post_init__(action)
256
+ if self.allowed_actions != tuple(
257
+ sorted(
258
+ set(self.allowed_actions),
259
+ key=lambda value: (value.option_id, value.option_identity_sha256),
260
+ )
261
+ ):
262
+ raise ValueError("allowed_actions must be unique and canonical")
263
+ if len({value.option_id for value in self.allowed_actions}) != len(
264
+ self.allowed_actions
265
+ ):
266
+ raise ValueError("allowed action option IDs must be unique")
267
+ _canonical_tokens(
268
+ self.recommended_option_families,
269
+ name="recommended_option_families",
270
+ )
271
+ if not self.recommended_option_families:
272
+ raise ValueError("an executable hypothesis needs an option family")
273
+ _canonical_paths(self.affected_paths, name="affected_paths")
274
+ _canonical_paths(self.held_fixed_paths, name="held_fixed_paths")
275
+ if not self.affected_paths:
276
+ raise ValueError("an executable hypothesis needs affected paths")
277
+ if any(
278
+ _paths_overlap(affected, held_fixed)
279
+ for affected in self.affected_paths
280
+ for held_fixed in self.held_fixed_paths
281
+ ):
282
+ raise ValueError(
283
+ "affected and held-fixed paths must be hierarchically disjoint"
284
+ )
285
+ if type(self.effect_predictions) is not tuple or any(
286
+ type(value) is not MetricEffectPrediction
287
+ for value in self.effect_predictions
288
+ ):
289
+ raise TypeError("effect_predictions must contain exact predictions")
290
+ for prediction in self.effect_predictions:
291
+ MetricEffectPrediction.__post_init__(prediction)
292
+ metric_ids = tuple(value.metric_id for value in self.effect_predictions)
293
+ if metric_ids != tuple(sorted(set(metric_ids))):
294
+ raise ValueError("effect predictions must be unique and canonical")
295
+ if (
296
+ type(self.falsification_condition) is not str
297
+ or not self.falsification_condition.strip()
298
+ or self.falsification_condition != self.falsification_condition.strip()
299
+ ):
300
+ raise ValueError("falsification_condition must be canonical text")
301
+ if (
302
+ type(self.compiler_policy_id) is not str
303
+ or _TOKEN.fullmatch(self.compiler_policy_id) is None
304
+ ):
305
+ raise ValueError("compiler_policy_id must use the token grammar")
306
+ if (
307
+ type(self.compiler_policy_version) is not int
308
+ or self.compiler_policy_version <= 0
309
+ ):
310
+ raise ValueError("compiler_policy_version must be positive")
311
+ object.__setattr__(self, "spec_sha256", _hash(_SPEC_DOMAIN, self.to_record()))
312
+
313
+ def to_record(self) -> dict[str, object]:
314
+ return {
315
+ "schema_version": 1,
316
+ "request_sha256": self.request_sha256,
317
+ "reference": {
318
+ "insight_id": self.reference.insight_id.value,
319
+ "version": self.reference.version,
320
+ },
321
+ "insight_content_sha256": self.insight_content_sha256,
322
+ "source_evidence_sha256": self.source_evidence_sha256,
323
+ "requested_operator_kind": self.requested_operator_kind,
324
+ "source_operator_kinds": list(self.source_operator_kinds),
325
+ "executable_operator_kinds": list(self.executable_operator_kinds),
326
+ "parent_candidate_id": self.parent_candidate_id.value,
327
+ "parent_configuration_sha256": self.parent_configuration_sha256,
328
+ "finite_contract_sha256": self.finite_contract_sha256,
329
+ "context_projection_sha256": self.context_projection_sha256,
330
+ "endpoint_definition_sha256": self.endpoint_definition_sha256,
331
+ "allowed_actions": [value.to_record() for value in self.allowed_actions],
332
+ "recommended_option_families": list(self.recommended_option_families),
333
+ "affected_paths": list(self.affected_paths),
334
+ "held_fixed_paths": list(self.held_fixed_paths),
335
+ "effect_predictions": [
336
+ {
337
+ "metric_id": value.metric_id,
338
+ "direction": value.direction.value,
339
+ }
340
+ for value in self.effect_predictions
341
+ ],
342
+ "falsification_condition": self.falsification_condition,
343
+ "compiler_policy_id": self.compiler_policy_id,
344
+ "compiler_policy_version": self.compiler_policy_version,
345
+ "compiler_definition_sha256": self.compiler_definition_sha256,
346
+ }
347
+
348
+
349
+ class HypothesisApplicabilityStatus(str, Enum):
350
+ APPLICABLE = "applicable"
351
+ INAPPLICABLE = "inapplicable"
352
+
353
+
354
+ @dataclass(frozen=True, slots=True)
355
+ class HypothesisCompilationReceipt:
356
+ """Fail-closed compiler result; only applicable receipts carry a spec."""
357
+
358
+ request_sha256: str
359
+ status: HypothesisApplicabilityStatus
360
+ reason_codes: tuple[str, ...]
361
+ compiler_policy_id: str
362
+ compiler_policy_version: int
363
+ compiler_definition_sha256: str
364
+ spec: ExecutableHypothesisTestSpec | None
365
+ receipt_sha256: str = field(init=False)
366
+
367
+ def __post_init__(self) -> None:
368
+ require_sha256(self.request_sha256, "request_sha256")
369
+ if type(self.status) is not HypothesisApplicabilityStatus:
370
+ raise TypeError("status must be a HypothesisApplicabilityStatus")
371
+ _canonical_tokens(self.reason_codes, name="reason_codes")
372
+ if (
373
+ type(self.compiler_policy_id) is not str
374
+ or _TOKEN.fullmatch(self.compiler_policy_id) is None
375
+ ):
376
+ raise ValueError("compiler_policy_id must use the token grammar")
377
+ if (
378
+ type(self.compiler_policy_version) is not int
379
+ or self.compiler_policy_version <= 0
380
+ ):
381
+ raise ValueError("compiler_policy_version must be positive")
382
+ require_sha256(
383
+ self.compiler_definition_sha256,
384
+ "compiler_definition_sha256",
385
+ )
386
+ if self.status is HypothesisApplicabilityStatus.APPLICABLE:
387
+ if type(self.spec) is not ExecutableHypothesisTestSpec:
388
+ raise ValueError("an applicable receipt requires an exact spec")
389
+ ExecutableHypothesisTestSpec.__post_init__(self.spec)
390
+ if self.reason_codes:
391
+ raise ValueError("an applicable receipt cannot carry failure reasons")
392
+ if (
393
+ self.spec.request_sha256 != self.request_sha256
394
+ or self.spec.compiler_policy_id != self.compiler_policy_id
395
+ or self.spec.compiler_policy_version != self.compiler_policy_version
396
+ or self.spec.compiler_definition_sha256
397
+ != self.compiler_definition_sha256
398
+ ):
399
+ raise ValueError("compiler receipt and executable spec differ")
400
+ elif self.spec is not None or not self.reason_codes:
401
+ raise ValueError("an inapplicable receipt needs reasons and no spec")
402
+ object.__setattr__(
403
+ self,
404
+ "receipt_sha256",
405
+ _hash(_COMPILATION_DOMAIN, self.to_record()),
406
+ )
407
+
408
+ @property
409
+ def applicable(self) -> bool:
410
+ return self.status is HypothesisApplicabilityStatus.APPLICABLE
411
+
412
+ def to_record(self) -> dict[str, object]:
413
+ return {
414
+ "schema_version": 1,
415
+ "request_sha256": self.request_sha256,
416
+ "status": self.status.value,
417
+ "reason_codes": list(self.reason_codes),
418
+ "compiler_policy_id": self.compiler_policy_id,
419
+ "compiler_policy_version": self.compiler_policy_version,
420
+ "compiler_definition_sha256": self.compiler_definition_sha256,
421
+ "spec": None if self.spec is None else self.spec.to_record(),
422
+ "spec_sha256": None if self.spec is None else self.spec.spec_sha256,
423
+ }
424
+
425
+
426
+ @runtime_checkable
427
+ class HypothesisApplicabilityPort(Protocol):
428
+ policy_id: str
429
+ policy_version: int
430
+ definition_sha256: str
431
+
432
+ def compile(
433
+ self,
434
+ request: HypothesisCompilationRequest,
435
+ ) -> HypothesisCompilationReceipt: ...
436
+
437
+
438
+ def validate_hypothesis_compiler_identity(
439
+ compiler: HypothesisApplicabilityPort,
440
+ receipt: HypothesisCompilationReceipt,
441
+ ) -> None:
442
+ """Bind a receipt to the injected compiler instance at the trust boundary."""
443
+
444
+ if not isinstance(compiler, HypothesisApplicabilityPort):
445
+ raise TypeError("compiler must implement HypothesisApplicabilityPort")
446
+ if type(receipt) is not HypothesisCompilationReceipt:
447
+ raise TypeError("receipt must be an exact HypothesisCompilationReceipt")
448
+ receipt.__post_init__()
449
+ observed = (
450
+ compiler.policy_id,
451
+ compiler.policy_version,
452
+ compiler.definition_sha256,
453
+ )
454
+ expected = (
455
+ receipt.compiler_policy_id,
456
+ receipt.compiler_policy_version,
457
+ receipt.compiler_definition_sha256,
458
+ )
459
+ if observed != expected:
460
+ raise ValueError("compiler identity changed across compilation")
461
+
462
+
463
+ def validate_hypothesis_compilation(
464
+ request: HypothesisCompilationRequest,
465
+ receipt: HypothesisCompilationReceipt,
466
+ ) -> None:
467
+ """Independently bind compiler output to the trusted request and catalog."""
468
+
469
+ if type(request) is not HypothesisCompilationRequest:
470
+ raise TypeError("request must be an exact HypothesisCompilationRequest")
471
+ request.__post_init__()
472
+ if type(receipt) is not HypothesisCompilationReceipt:
473
+ raise TypeError("receipt must be an exact HypothesisCompilationReceipt")
474
+ receipt.__post_init__()
475
+ if receipt.request_sha256 != request.request_sha256:
476
+ raise ValueError("compiler receipt is bound to a different request")
477
+ if not receipt.applicable:
478
+ return
479
+ spec = receipt.spec
480
+ assert spec is not None
481
+ expected = (
482
+ request.reference,
483
+ request.insight.content_sha256,
484
+ request.source_evidence_sha256,
485
+ request.requested_operator_kind,
486
+ request.source_operator_kinds,
487
+ request.parent_candidate_id,
488
+ request.parent_configuration_sha256,
489
+ request.finite_contract.identity_sha256,
490
+ request.context_projection_sha256,
491
+ request.endpoint_definition_sha256,
492
+ )
493
+ observed = (
494
+ spec.reference,
495
+ spec.insight_content_sha256,
496
+ spec.source_evidence_sha256,
497
+ spec.requested_operator_kind,
498
+ spec.source_operator_kinds,
499
+ spec.parent_candidate_id,
500
+ spec.parent_configuration_sha256,
501
+ spec.finite_contract_sha256,
502
+ spec.context_projection_sha256,
503
+ spec.endpoint_definition_sha256,
504
+ )
505
+ if observed != expected:
506
+ raise ValueError("executable hypothesis spec changed trusted request identity")
507
+ if spec.executable_operator_kinds != (request.requested_operator_kind,):
508
+ raise ValueError("compiler broadened executable operator authority")
509
+ immutable_families = tuple(request.insight.recommended_option_families)
510
+ immutable_paths = tuple(sorted(set(request.insight.affected_paths)))
511
+ immutable_predictions = request.insight.effect_predictions
512
+ immutable_falsifier = request.insight.falsification_condition
513
+ if spec.recommended_option_families != immutable_families:
514
+ raise ValueError("compiler changed immutable recommended option families")
515
+ if spec.affected_paths != immutable_paths:
516
+ raise ValueError("compiler changed immutable affected paths")
517
+ if spec.effect_predictions != immutable_predictions:
518
+ raise ValueError("compiler changed immutable metric predictions")
519
+ if spec.falsification_condition != immutable_falsifier:
520
+ raise ValueError("compiler changed immutable falsification condition")
521
+ trusted = {
522
+ TreatmentActionBinding(option.option_id, option.identity_sha256)
523
+ for option in request.finite_contract.options
524
+ }
525
+ if not set(spec.allowed_actions).issubset(trusted):
526
+ raise ValueError("compiler introduced an action outside the finite contract")
527
+ families = {
528
+ request.finite_contract.resolve(action.option_id).family
529
+ for action in spec.allowed_actions
530
+ }
531
+ if not families.issubset(immutable_families):
532
+ raise ValueError("compiler mapped the hypothesis to a foreign action family")
533
+ exact_parent_ids = {
534
+ option_id
535
+ for option_id in request.insight.recommended_option_ids
536
+ if any(
537
+ option.option_id == option_id
538
+ for option in request.finite_contract.options
539
+ )
540
+ }
541
+ if exact_parent_ids and not {
542
+ action.option_id for action in spec.allowed_actions
543
+ }.issubset(exact_parent_ids):
544
+ raise ValueError(
545
+ "compiler ignored immutable exact recommendations valid for this parent"
546
+ )
547
+
548
+
549
+ __all__ = [
550
+ "ExecutableHypothesisTestSpec",
551
+ "HypothesisApplicabilityPort",
552
+ "HypothesisApplicabilityStatus",
553
+ "HypothesisCompilationReceipt",
554
+ "HypothesisCompilationRequest",
555
+ "validate_hypothesis_compiler_identity",
556
+ "validate_hypothesis_compilation",
557
+ ]