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,649 @@
1
+ """Generic batch boundary for adding proposal experts to campaign variation.
2
+
3
+ Parent-local benchmark catalogs remain the legal structural foundation. An
4
+ optional envelope policy may add sealed full-child options after observing the
5
+ strictly prior campaign archive. The policy is invoked once per portfolio
6
+ generation, across all parent lanes, so global acquisition and restart experts
7
+ can partition candidates without duplicating them independently in each lane.
8
+
9
+ This boundary owns no workload, model, provider, objective, or acquisition
10
+ implementation. It only authenticates chronology, lane identity, preservation
11
+ of the base legal support, and the exact enriched contracts returned to the
12
+ ordinary portfolio workflow.
13
+ """
14
+
15
+ from __future__ import annotations
16
+
17
+ import base64
18
+ import binascii
19
+ import hashlib
20
+ import json
21
+ import re
22
+ import zlib
23
+ from dataclasses import dataclass, field
24
+ from typing import Protocol, runtime_checkable
25
+
26
+ from agent_evolve.application.agentic_evolution import EvolutionCandidate
27
+ from agent_evolve.application.budgeted_optimizer import OptimizerState
28
+ from agent_evolve.application.evolution_campaign import (
29
+ ArchiveUtilitySnapshot,
30
+ ParentVariationBinding,
31
+ )
32
+ from agent_evolve.domain.patch import require_sha256
33
+ from agent_evolve.domain.typed_json import FrozenJsonObject, freeze_json, thaw_json
34
+
35
+
36
+ _TOKEN = re.compile(r"^[a-z][a-z0-9_.:-]{0,127}$")
37
+ _REQUEST_DOMAIN = b"agent-evolve:campaign-variation-envelope-request:v1\x00"
38
+ _RESULT_DOMAIN = b"agent-evolve:campaign-variation-envelope-result:v1\x00"
39
+ _CONTEXT_DOMAIN = b"agent-evolve:campaign-variation-envelope-context:v1\x00"
40
+ _TRACE_DOMAIN = b"agent-evolve:campaign-variation-envelope-trace:v2\x00"
41
+ _TRACE_PAYLOAD_MAX_UTF8_BYTES = 64 * 1024 * 1024
42
+ _TRACE_PAYLOAD_MAX_COMPRESSED_BYTES = 4 * 1024 * 1024
43
+ _TRACE_PAYLOAD_CHUNK_CHARACTERS = 32 * 1024
44
+
45
+
46
+ def _canonical_json(value: object) -> bytes:
47
+ return json.dumps(
48
+ value,
49
+ allow_nan=False,
50
+ ensure_ascii=True,
51
+ separators=(",", ":"),
52
+ sort_keys=True,
53
+ ).encode("ascii", errors="strict")
54
+
55
+
56
+ def _hash(domain: bytes, value: object) -> str:
57
+ return hashlib.sha256(domain + _canonical_json(value)).hexdigest()
58
+
59
+
60
+ def _policy_identity(value: object) -> tuple[str, int, str]:
61
+ policy_id = getattr(value, "policy_id", None)
62
+ policy_version = getattr(value, "policy_version", None)
63
+ definition_sha256 = getattr(value, "definition_sha256", None)
64
+ if definition_sha256 is None:
65
+ definition_sha256 = getattr(value, "policy_definition_sha256", None)
66
+ if type(policy_id) is not str or _TOKEN.fullmatch(policy_id) is None:
67
+ raise ValueError("variation-envelope policy_id has invalid syntax")
68
+ if type(policy_version) is not int or policy_version <= 0:
69
+ raise ValueError("variation-envelope policy_version must be positive")
70
+ require_sha256(definition_sha256, "variation-envelope definition_sha256")
71
+ return policy_id, policy_version, definition_sha256
72
+
73
+
74
+ @dataclass(frozen=True, slots=True)
75
+ class CampaignVariationEnvelopeLane:
76
+ """One parent lane and its outcome-blind benchmark catalog binding."""
77
+
78
+ lane_id: str
79
+ parent: EvolutionCandidate
80
+ base_variation: ParentVariationBinding
81
+
82
+ def __post_init__(self) -> None:
83
+ if type(self.lane_id) is not str or _TOKEN.fullmatch(self.lane_id) is None:
84
+ raise ValueError("lane_id must use the closed token grammar")
85
+ if type(self.parent) is not EvolutionCandidate:
86
+ raise TypeError("parent must be an exact EvolutionCandidate")
87
+ EvolutionCandidate.__post_init__(self.parent)
88
+ if type(self.base_variation) is not ParentVariationBinding:
89
+ raise TypeError("base_variation must be exact")
90
+ ParentVariationBinding.__post_init__(self.base_variation)
91
+ if (
92
+ self.base_variation.parent_configuration_sha256
93
+ != self.parent.occurrence.configuration_hash
94
+ ):
95
+ raise ValueError("base variation is bound to another parent")
96
+
97
+ def to_record(self) -> dict[str, object]:
98
+ self.__post_init__()
99
+ return {
100
+ "lane_id": self.lane_id,
101
+ "parent_candidate_id": self.parent.candidate_id.value,
102
+ "parent_configuration_sha256": (
103
+ self.parent.occurrence.configuration_hash
104
+ ),
105
+ "base_variation": self.base_variation.to_record(),
106
+ }
107
+
108
+
109
+ @dataclass(frozen=True, slots=True)
110
+ class CampaignVariationEnvelopeRequest:
111
+ """Authenticated prior-only input to one global proposal envelope."""
112
+
113
+ campaign_scope_sha256: str
114
+ generation: int
115
+ evaluation_slots_per_lane: int
116
+ state: OptimizerState
117
+ archive_utility: ArchiveUtilitySnapshot
118
+ lanes: tuple[CampaignVariationEnvelopeLane, ...]
119
+ request_sha256: str = field(init=False, default="")
120
+
121
+ def __post_init__(self) -> None:
122
+ require_sha256(self.campaign_scope_sha256, "campaign_scope_sha256")
123
+ if type(self.generation) is not int or self.generation <= 0:
124
+ raise ValueError("generation must be positive")
125
+ if (
126
+ type(self.evaluation_slots_per_lane) is not int
127
+ or self.evaluation_slots_per_lane <= 0
128
+ ):
129
+ raise ValueError("evaluation_slots_per_lane must be positive")
130
+ if type(self.state) is not OptimizerState:
131
+ raise TypeError("state must be an exact OptimizerState")
132
+ OptimizerState.__post_init__(self.state)
133
+ if self.state.generation != self.generation - 1:
134
+ raise ValueError("variation envelope received a non-prior state")
135
+ if type(self.archive_utility) is not ArchiveUtilitySnapshot:
136
+ raise TypeError("archive_utility must be exact")
137
+ ArchiveUtilitySnapshot.__post_init__(self.archive_utility)
138
+ if self.archive_utility.generation != self.generation:
139
+ raise ValueError("archive utility is stale for the envelope generation")
140
+ if type(self.lanes) is not tuple or not self.lanes:
141
+ raise ValueError("lanes must be a non-empty exact tuple")
142
+ if any(type(value) is not CampaignVariationEnvelopeLane for value in self.lanes):
143
+ raise TypeError("lanes must contain exact envelope lanes")
144
+ for value in self.lanes:
145
+ CampaignVariationEnvelopeLane.__post_init__(value)
146
+ lane_ids = tuple(value.lane_id for value in self.lanes)
147
+ if lane_ids != tuple(sorted(set(lane_ids))):
148
+ raise ValueError("variation-envelope lanes must be unique and sorted")
149
+ benchmark_ids = {
150
+ value.base_variation.benchmark_sha256 for value in self.lanes
151
+ }
152
+ if len(benchmark_ids) != 1:
153
+ raise ValueError("variation-envelope lanes target different benchmarks")
154
+ if self.archive_utility.benchmark_sha256 not in benchmark_ids:
155
+ raise ValueError("archive utility targets a different benchmark")
156
+ computed = _hash(_REQUEST_DOMAIN, self._unsigned_record())
157
+ if self.request_sha256 not in ("", computed):
158
+ raise ValueError("request_sha256 does not authenticate the request")
159
+ object.__setattr__(self, "request_sha256", computed)
160
+
161
+ def _unsigned_record(self) -> dict[str, object]:
162
+ return {
163
+ "schema_version": 1,
164
+ "campaign_scope_sha256": self.campaign_scope_sha256,
165
+ "generation": self.generation,
166
+ "evaluation_slots_per_lane": self.evaluation_slots_per_lane,
167
+ "optimizer_state": {
168
+ "generation": self.state.generation,
169
+ "archive_snapshot_sha256": self.state.archive_snapshot_hash,
170
+ "unique_evaluations": self.state.unique_evaluations,
171
+ "logical_llm_calls": self.state.logical_llm_calls,
172
+ "candidate_occurrences": [
173
+ {
174
+ "candidate_id": value.candidate_id.value,
175
+ "configuration_sha256": (
176
+ value.occurrence.configuration_hash
177
+ ),
178
+ "objectives_hex": [
179
+ [metric_id, metric_value.hex()]
180
+ for metric_id, metric_value in value.objectives
181
+ ],
182
+ "valid": value.valid,
183
+ }
184
+ for value in self.state.candidates
185
+ ],
186
+ },
187
+ "archive_utility_sha256": self.archive_utility.snapshot_sha256,
188
+ "lanes": [value.to_record() for value in self.lanes],
189
+ "current_generation_outcomes_exposed": False,
190
+ }
191
+
192
+ def to_record(self) -> dict[str, object]:
193
+ self.__post_init__()
194
+ return {**self._unsigned_record(), "request_sha256": self.request_sha256}
195
+
196
+
197
+ @dataclass(frozen=True, slots=True)
198
+ class CampaignVariationEnvelopeLaneResult:
199
+ """One enriched binding, preserving every base option by identity."""
200
+
201
+ lane_id: str
202
+ variation: ParentVariationBinding
203
+
204
+ def __post_init__(self) -> None:
205
+ if type(self.lane_id) is not str or _TOKEN.fullmatch(self.lane_id) is None:
206
+ raise ValueError("lane_id must use the closed token grammar")
207
+ if type(self.variation) is not ParentVariationBinding:
208
+ raise TypeError("variation must be exact")
209
+ ParentVariationBinding.__post_init__(self.variation)
210
+
211
+ def to_record(self) -> dict[str, object]:
212
+ self.__post_init__()
213
+ return {"lane_id": self.lane_id, "variation": self.variation.to_record()}
214
+
215
+
216
+ @dataclass(frozen=True, slots=True)
217
+ class CampaignVariationEnvelopeResult:
218
+ """Exact per-lane enriched contracts and policy evidence."""
219
+
220
+ request_sha256: str
221
+ policy_id: str
222
+ policy_version: int
223
+ policy_definition_sha256: str
224
+ lanes: tuple[CampaignVariationEnvelopeLaneResult, ...]
225
+ evidence: FrozenJsonObject
226
+ result_sha256: str = field(init=False, default="")
227
+
228
+ def __post_init__(self) -> None:
229
+ require_sha256(self.request_sha256, "request_sha256")
230
+ _policy_identity(self)
231
+ if type(self.lanes) is not tuple or not self.lanes:
232
+ raise ValueError("lanes must be a non-empty exact tuple")
233
+ if any(
234
+ type(value) is not CampaignVariationEnvelopeLaneResult
235
+ for value in self.lanes
236
+ ):
237
+ raise TypeError("lanes must contain exact result lanes")
238
+ for value in self.lanes:
239
+ CampaignVariationEnvelopeLaneResult.__post_init__(value)
240
+ lane_ids = tuple(value.lane_id for value in self.lanes)
241
+ if lane_ids != tuple(sorted(set(lane_ids))):
242
+ raise ValueError("result lanes must be unique and sorted")
243
+ if type(self.evidence) is not FrozenJsonObject or freeze_json(
244
+ self.evidence
245
+ ) is not self.evidence:
246
+ raise TypeError("evidence must be an exact frozen object")
247
+ computed = _hash(_RESULT_DOMAIN, self._unsigned_record())
248
+ if self.result_sha256 not in ("", computed):
249
+ raise ValueError("result_sha256 does not authenticate the result")
250
+ object.__setattr__(self, "result_sha256", computed)
251
+
252
+ def _unsigned_record(self) -> dict[str, object]:
253
+ return {
254
+ "schema_version": 1,
255
+ "request_sha256": self.request_sha256,
256
+ "policy_id": self.policy_id,
257
+ "policy_version": self.policy_version,
258
+ "policy_definition_sha256": self.policy_definition_sha256,
259
+ "lanes": [value.to_record() for value in self.lanes],
260
+ "evidence": thaw_json(self.evidence),
261
+ }
262
+
263
+ def to_record(self) -> dict[str, object]:
264
+ self.__post_init__()
265
+ return {**self._unsigned_record(), "result_sha256": self.result_sha256}
266
+
267
+
268
+ @runtime_checkable
269
+ class CampaignVariationEnvelopePolicy(Protocol):
270
+ """Add globally coordinated proposal support before ordinary selection."""
271
+
272
+ policy_id: str
273
+ policy_version: int
274
+ definition_sha256: str
275
+
276
+ def enrich(
277
+ self,
278
+ request: CampaignVariationEnvelopeRequest,
279
+ ) -> CampaignVariationEnvelopeResult: ...
280
+
281
+
282
+ def validate_campaign_variation_envelope_result(
283
+ *,
284
+ policy: CampaignVariationEnvelopePolicy,
285
+ request: CampaignVariationEnvelopeRequest,
286
+ result: CampaignVariationEnvelopeResult,
287
+ ) -> None:
288
+ """Revalidate policy identity, chronology, and support preservation."""
289
+
290
+ if not isinstance(policy, CampaignVariationEnvelopePolicy):
291
+ raise TypeError("policy must implement CampaignVariationEnvelopePolicy")
292
+ policy_identity = _policy_identity(policy)
293
+ if type(request) is not CampaignVariationEnvelopeRequest:
294
+ raise TypeError("request must be exact")
295
+ CampaignVariationEnvelopeRequest.__post_init__(request)
296
+ if type(result) is not CampaignVariationEnvelopeResult:
297
+ raise TypeError("result must be exact")
298
+ CampaignVariationEnvelopeResult.__post_init__(result)
299
+ if result.request_sha256 != request.request_sha256:
300
+ raise ValueError("variation-envelope result targets another request")
301
+ if (
302
+ result.policy_id,
303
+ result.policy_version,
304
+ result.policy_definition_sha256,
305
+ ) != policy_identity:
306
+ raise ValueError("variation-envelope result has a foreign policy identity")
307
+ if tuple(value.lane_id for value in result.lanes) != tuple(
308
+ value.lane_id for value in request.lanes
309
+ ):
310
+ raise ValueError("variation-envelope result changed the lane universe")
311
+
312
+ for source, enriched in zip(request.lanes, result.lanes, strict=True):
313
+ base = source.base_variation
314
+ variation = enriched.variation
315
+ if (
316
+ variation.benchmark_sha256 != base.benchmark_sha256
317
+ or variation.parent_configuration_sha256
318
+ != base.parent_configuration_sha256
319
+ or variation.known_phenotype_sha256s
320
+ != base.known_phenotype_sha256s
321
+ ):
322
+ raise ValueError("enriched variation escaped its lane binding")
323
+ base_options = {
324
+ value.identity_sha256 for value in base.contract.options
325
+ }
326
+ enriched_options = {
327
+ value.identity_sha256 for value in variation.contract.options
328
+ }
329
+ if not base_options <= enriched_options:
330
+ raise ValueError("variation envelope removed base legal support")
331
+
332
+
333
+ def campaign_variation_envelope_context_record(
334
+ result: CampaignVariationEnvelopeResult,
335
+ ) -> dict[str, object]:
336
+ """Project a result to compact prompt evidence without contract duplication.
337
+
338
+ The selection request already carries the exact enriched contract for its
339
+ lane. Repeating every lane's full options inside the context increases
340
+ model input while revealing no additional fact. This receipt retains the
341
+ authenticated result identity, policy, compact policy evidence, and exact
342
+ per-lane contract identities/counts.
343
+ """
344
+
345
+ if type(result) is not CampaignVariationEnvelopeResult:
346
+ raise TypeError("result must be an exact variation-envelope result")
347
+ CampaignVariationEnvelopeResult.__post_init__(result)
348
+ unsigned = {
349
+ "schema_version": 1,
350
+ "request_sha256": result.request_sha256,
351
+ "result_sha256": result.result_sha256,
352
+ "policy_id": result.policy_id,
353
+ "policy_version": result.policy_version,
354
+ "policy_definition_sha256": result.policy_definition_sha256,
355
+ "lanes": [
356
+ {
357
+ "lane_id": value.lane_id,
358
+ "parent_configuration_sha256": (
359
+ value.variation.parent_configuration_sha256
360
+ ),
361
+ "finite_contract_identity_sha256": (
362
+ value.variation.contract.identity_sha256
363
+ ),
364
+ "eligible_option_count": len(value.variation.contract.options),
365
+ }
366
+ for value in result.lanes
367
+ ],
368
+ "evidence": thaw_json(result.evidence),
369
+ "full_variation_contracts_repeated_in_context": False,
370
+ }
371
+ return {
372
+ **unsigned,
373
+ "context_receipt_sha256": _hash(_CONTEXT_DOMAIN, unsigned),
374
+ }
375
+
376
+
377
+ def campaign_variation_envelope_trace_record(
378
+ *,
379
+ request: CampaignVariationEnvelopeRequest,
380
+ result: CampaignVariationEnvelopeResult,
381
+ ) -> dict[str, object]:
382
+ """Record the complete eligible expert union for replay and support audits.
383
+
384
+ Prompt context deliberately omits full contracts. The durable stage trace
385
+ has a different purpose: it must preserve external-expert configurations
386
+ that were legal but not selected, otherwise support and displacement regret
387
+ cannot be measured after the run. Both the workload-owned base support and
388
+ options added by external proposal experts are therefore included with an
389
+ explicit origin. Evaluated dispositions remain in the ordinary
390
+ portfolio-wave receipts and join exactly through ``option_identity_sha256``.
391
+ """
392
+
393
+ if type(request) is not CampaignVariationEnvelopeRequest:
394
+ raise TypeError("request must be an exact variation-envelope request")
395
+ CampaignVariationEnvelopeRequest.__post_init__(request)
396
+ if type(result) is not CampaignVariationEnvelopeResult:
397
+ raise TypeError("result must be an exact variation-envelope result")
398
+ CampaignVariationEnvelopeResult.__post_init__(result)
399
+ if result.request_sha256 != request.request_sha256:
400
+ raise ValueError("variation-envelope trace joins a foreign result")
401
+ if tuple(value.lane_id for value in result.lanes) != tuple(
402
+ value.lane_id for value in request.lanes
403
+ ):
404
+ raise ValueError("variation-envelope trace changed the lane universe")
405
+
406
+ lane_records: list[dict[str, object]] = []
407
+ added_count = 0
408
+ eligible_count = 0
409
+ for source, enriched in zip(request.lanes, result.lanes, strict=True):
410
+ base_options = {
411
+ value.identity_sha256 for value in source.base_variation.contract.options
412
+ }
413
+ eligibility = enriched.variation.eligibility_receipt
414
+ phenotype_by_identity = (
415
+ {}
416
+ if eligibility is None
417
+ else {
418
+ value.option_identity_sha256: value.phenotype_identity_sha256
419
+ for value in eligibility.option_phenotypes
420
+ }
421
+ )
422
+ eligible_options = []
423
+ for option in enriched.variation.contract.options:
424
+ support_origin = (
425
+ "base"
426
+ if option.identity_sha256 in base_options
427
+ else "envelope_addition"
428
+ )
429
+ eligible_options.append(
430
+ {
431
+ "option": option.evidence_record(),
432
+ "child_configuration": thaw_json(option.child_configuration),
433
+ "phenotype_identity_sha256": phenotype_by_identity.get(
434
+ option.identity_sha256
435
+ ),
436
+ "eligibility_disposition": "eligible",
437
+ "support_origin": support_origin,
438
+ }
439
+ )
440
+ lane_added_count = sum(
441
+ value["support_origin"] == "envelope_addition"
442
+ for value in eligible_options
443
+ )
444
+ added_count += lane_added_count
445
+ eligible_count += len(eligible_options)
446
+ lane_records.append(
447
+ {
448
+ "lane_id": source.lane_id,
449
+ "parent_candidate_id": source.parent.candidate_id.value,
450
+ "parent_configuration_sha256": (
451
+ source.base_variation.parent_configuration_sha256
452
+ ),
453
+ "base_contract_identity_sha256": (
454
+ source.base_variation.contract.identity_sha256
455
+ ),
456
+ "enriched_contract_identity_sha256": (
457
+ enriched.variation.contract.identity_sha256
458
+ ),
459
+ "base_option_count": len(source.base_variation.contract.options),
460
+ "eligible_option_count": len(enriched.variation.contract.options),
461
+ "eligible_added_option_count": lane_added_count,
462
+ "eligible_options": eligible_options,
463
+ }
464
+ )
465
+
466
+ payload = {
467
+ "schema_version": 1,
468
+ "request_sha256": request.request_sha256,
469
+ "result_sha256": result.result_sha256,
470
+ "lanes": lane_records,
471
+ "evidence": thaw_json(result.evidence),
472
+ }
473
+ raw_payload = _canonical_json(payload)
474
+ if len(raw_payload) > _TRACE_PAYLOAD_MAX_UTF8_BYTES:
475
+ raise ValueError("variation-envelope trace payload exceeds its ceiling")
476
+ compressed_payload = zlib.compress(raw_payload, level=9)
477
+ if len(compressed_payload) > _TRACE_PAYLOAD_MAX_COMPRESSED_BYTES:
478
+ raise ValueError("variation-envelope compressed trace exceeds its ceiling")
479
+ encoded_payload = base64.b64encode(compressed_payload).decode("ascii")
480
+ payload_chunks = [
481
+ encoded_payload[offset : offset + _TRACE_PAYLOAD_CHUNK_CHARACTERS]
482
+ for offset in range(0, len(encoded_payload), _TRACE_PAYLOAD_CHUNK_CHARACTERS)
483
+ ]
484
+ unsigned = {
485
+ "schema_version": 2,
486
+ "request_sha256": request.request_sha256,
487
+ "result_sha256": result.result_sha256,
488
+ "policy_id": result.policy_id,
489
+ "policy_version": result.policy_version,
490
+ "policy_definition_sha256": result.policy_definition_sha256,
491
+ "generation": request.generation,
492
+ "eligible_option_occurrence_count": eligible_count,
493
+ "eligible_added_option_count": added_count,
494
+ "lanes": [
495
+ {
496
+ key: value
497
+ for key, value in lane.items()
498
+ if key != "eligible_options"
499
+ }
500
+ for lane in lane_records
501
+ ],
502
+ "payload_encoding": "zlib_base64_chunks_v1",
503
+ "payload_base64_chunks": payload_chunks,
504
+ "payload_utf8_bytes": len(raw_payload),
505
+ "payload_sha256": hashlib.sha256(raw_payload).hexdigest(),
506
+ "payload_compressed_bytes": len(compressed_payload),
507
+ "payload_compressed_sha256": hashlib.sha256(
508
+ compressed_payload
509
+ ).hexdigest(),
510
+ "full_child_configurations_included": True,
511
+ "full_expert_union_included": True,
512
+ "exposed_to_model_prompt": False,
513
+ "evaluated_disposition_join": {
514
+ "record": "portfolio_wave_receipts.action_attributions",
515
+ "key": "option_identity_sha256",
516
+ },
517
+ }
518
+ return {**unsigned, "trace_receipt_sha256": _hash(_TRACE_DOMAIN, unsigned)}
519
+
520
+
521
+ def decode_campaign_variation_envelope_trace_record(
522
+ record: dict[str, object],
523
+ ) -> dict[str, object]:
524
+ """Authenticate and recover one losslessly compressed expert-union trace."""
525
+
526
+ if type(record) is not dict:
527
+ raise TypeError("variation-envelope trace record must be an exact object")
528
+ if record.get("schema_version") != 2:
529
+ raise ValueError("variation-envelope trace record has an unknown schema")
530
+ trace_receipt_sha256 = record.get("trace_receipt_sha256")
531
+ require_sha256(trace_receipt_sha256, "trace_receipt_sha256")
532
+ unsigned = {
533
+ key: value for key, value in record.items() if key != "trace_receipt_sha256"
534
+ }
535
+ if _hash(_TRACE_DOMAIN, unsigned) != trace_receipt_sha256:
536
+ raise ValueError("variation-envelope trace receipt authentication failed")
537
+ if record.get("payload_encoding") != "zlib_base64_chunks_v1":
538
+ raise ValueError("variation-envelope trace payload encoding is unsupported")
539
+ chunks = record.get("payload_base64_chunks")
540
+ if (
541
+ type(chunks) is not list
542
+ or not chunks
543
+ or any(type(value) is not str or not value for value in chunks)
544
+ ):
545
+ raise ValueError("variation-envelope trace chunks are malformed")
546
+ try:
547
+ compressed = base64.b64decode("".join(chunks), validate=True)
548
+ except (ValueError, binascii.Error) as exc:
549
+ raise ValueError("variation-envelope trace base64 is malformed") from exc
550
+ expected_compressed_bytes = record.get("payload_compressed_bytes")
551
+ if (
552
+ type(expected_compressed_bytes) is not int
553
+ or isinstance(expected_compressed_bytes, bool)
554
+ or expected_compressed_bytes <= 0
555
+ or expected_compressed_bytes > _TRACE_PAYLOAD_MAX_COMPRESSED_BYTES
556
+ or len(compressed) != expected_compressed_bytes
557
+ or hashlib.sha256(compressed).hexdigest()
558
+ != record.get("payload_compressed_sha256")
559
+ ):
560
+ raise ValueError("variation-envelope compressed payload authentication failed")
561
+ decompressor = zlib.decompressobj()
562
+ try:
563
+ raw = decompressor.decompress(
564
+ compressed,
565
+ _TRACE_PAYLOAD_MAX_UTF8_BYTES + 1,
566
+ )
567
+ except zlib.error as exc:
568
+ raise ValueError("variation-envelope trace compression is malformed") from exc
569
+ if (
570
+ len(raw) > _TRACE_PAYLOAD_MAX_UTF8_BYTES
571
+ or decompressor.unconsumed_tail
572
+ or not decompressor.eof
573
+ or decompressor.unused_data
574
+ ):
575
+ raise ValueError("variation-envelope trace payload exceeds or violates framing")
576
+ try:
577
+ raw += decompressor.flush()
578
+ except zlib.error as exc:
579
+ raise ValueError("variation-envelope trace compression is malformed") from exc
580
+ if len(raw) > _TRACE_PAYLOAD_MAX_UTF8_BYTES:
581
+ raise ValueError("variation-envelope trace payload exceeds its ceiling")
582
+ expected_utf8_bytes = record.get("payload_utf8_bytes")
583
+ if (
584
+ type(expected_utf8_bytes) is not int
585
+ or isinstance(expected_utf8_bytes, bool)
586
+ or expected_utf8_bytes <= 0
587
+ or len(raw) != expected_utf8_bytes
588
+ or hashlib.sha256(raw).hexdigest() != record.get("payload_sha256")
589
+ ):
590
+ raise ValueError("variation-envelope trace payload authentication failed")
591
+ try:
592
+ payload = json.loads(raw.decode("ascii", errors="strict"))
593
+ except (UnicodeDecodeError, json.JSONDecodeError) as exc:
594
+ raise ValueError("variation-envelope trace payload is not canonical JSON") from exc
595
+ if type(payload) is not dict:
596
+ raise TypeError("variation-envelope trace payload must be an object")
597
+ if _canonical_json(payload) != raw:
598
+ raise ValueError("variation-envelope trace payload is not canonical JSON")
599
+ if (
600
+ payload.get("schema_version") != 1
601
+ or payload.get("request_sha256") != record.get("request_sha256")
602
+ or payload.get("result_sha256") != record.get("result_sha256")
603
+ ):
604
+ raise ValueError("variation-envelope trace payload joins a foreign receipt")
605
+ lanes = payload.get("lanes")
606
+ if type(lanes) is not list or any(type(value) is not dict for value in lanes):
607
+ raise TypeError("variation-envelope trace payload lanes are malformed")
608
+ compact_lanes = record.get("lanes")
609
+ if (
610
+ type(compact_lanes) is not list
611
+ or len(compact_lanes) != len(lanes)
612
+ or any(type(value) is not dict for value in compact_lanes)
613
+ ):
614
+ raise TypeError("variation-envelope trace lane summaries are malformed")
615
+ eligible_options: list[dict[str, object]] = []
616
+ for lane, compact_lane in zip(lanes, compact_lanes, strict=True):
617
+ raw_options = lane.get("eligible_options")
618
+ if type(raw_options) is not list or any(
619
+ type(value) is not dict for value in raw_options
620
+ ):
621
+ raise TypeError("variation-envelope trace eligible options are malformed")
622
+ lane_summary = {key: value for key, value in lane.items() if key != "eligible_options"}
623
+ if lane_summary != compact_lane:
624
+ raise ValueError("variation-envelope trace lane summary is inconsistent")
625
+ eligible_options.extend(raw_options)
626
+ if len(eligible_options) != record.get("eligible_option_occurrence_count"):
627
+ raise ValueError("variation-envelope trace eligible count is inconsistent")
628
+ if (
629
+ sum(
630
+ value.get("support_origin") == "envelope_addition"
631
+ for value in eligible_options
632
+ )
633
+ != record.get("eligible_added_option_count")
634
+ ):
635
+ raise ValueError("variation-envelope trace addition count is inconsistent")
636
+ return payload
637
+
638
+
639
+ __all__ = [
640
+ "CampaignVariationEnvelopeLane",
641
+ "CampaignVariationEnvelopeLaneResult",
642
+ "CampaignVariationEnvelopePolicy",
643
+ "CampaignVariationEnvelopeRequest",
644
+ "CampaignVariationEnvelopeResult",
645
+ "campaign_variation_envelope_context_record",
646
+ "campaign_variation_envelope_trace_record",
647
+ "decode_campaign_variation_envelope_trace_record",
648
+ "validate_campaign_variation_envelope_result",
649
+ ]