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,467 @@
1
+ """Benchmark-neutral contracts for post-commit, rank-only reference releases.
2
+
3
+ The port deliberately separates decision authority from reference evaluation.
4
+ Callers must bind an already-finalized decision, its selected-union release,
5
+ the exact eligible item set, and the endpoint policy before a private reference
6
+ reader can be opened. The public release contains selected-portfolio ranks and
7
+ aggregate counts; it has no field capable of carrying an unselected item value.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ from dataclasses import dataclass
13
+ from enum import Enum
14
+ import hashlib
15
+ import json
16
+ import math
17
+ import re
18
+
19
+ from agent_evolve.domain.patch import require_sha256
20
+
21
+
22
+ _IDENTIFIER = re.compile(r"^[a-z][a-z0-9_.:-]{0,255}$")
23
+ _REQUEST_DOMAIN = b"agent-evolve:postcommit-rank-request:v1\x00"
24
+ _AUTHORIZATION_DOMAIN = b"agent-evolve:postcommit-rank-authorization:v1\x00"
25
+ _RELEASE_DOMAIN = b"agent-evolve:postcommit-rank-release:v1\x00"
26
+
27
+
28
+ def _canonical_json(value: object) -> bytes:
29
+ return json.dumps(
30
+ value,
31
+ allow_nan=False,
32
+ ensure_ascii=True,
33
+ separators=(",", ":"),
34
+ sort_keys=True,
35
+ ).encode("ascii")
36
+
37
+
38
+ def _hash(domain: bytes, value: object) -> str:
39
+ return hashlib.sha256(domain + _canonical_json(value)).hexdigest()
40
+
41
+
42
+ def _require_identifier(value: object, name: str) -> str:
43
+ if type(value) is not str or _IDENTIFIER.fullmatch(value) is None:
44
+ raise ValueError(f"{name} must use the canonical identifier grammar")
45
+ return value
46
+
47
+
48
+ class RankDirection(str, Enum):
49
+ LOWER_IS_BETTER = "lower_is_better"
50
+ HIGHER_IS_BETTER = "higher_is_better"
51
+
52
+
53
+ class PortfolioAggregateKind(str, Enum):
54
+ """Closed aggregation laws supported by the rank-only reference core."""
55
+
56
+ SUM = "sum"
57
+
58
+
59
+ @dataclass(frozen=True, slots=True, eq=False)
60
+ class RankEndpointPolicyBinding:
61
+ policy_id: str
62
+ policy_version: int
63
+ policy_definition_sha256: str
64
+ direction: RankDirection
65
+ aggregate_kind: PortfolioAggregateKind
66
+
67
+ def __post_init__(self) -> None:
68
+ _require_identifier(self.policy_id, "policy_id")
69
+ if type(self.policy_version) is not int or self.policy_version <= 0:
70
+ raise ValueError("policy_version must be a positive exact integer")
71
+ require_sha256(self.policy_definition_sha256, "policy_definition_sha256")
72
+ if type(self.direction) is not RankDirection:
73
+ raise TypeError("direction must be an exact RankDirection")
74
+ if type(self.aggregate_kind) is not PortfolioAggregateKind:
75
+ raise TypeError("aggregate_kind must be exact")
76
+
77
+ def to_record(self) -> dict[str, object]:
78
+ self.__post_init__()
79
+ return {
80
+ "policy_id": self.policy_id,
81
+ "policy_version": self.policy_version,
82
+ "policy_definition_sha256": self.policy_definition_sha256,
83
+ "direction": self.direction.value,
84
+ "aggregate_kind": self.aggregate_kind.value,
85
+ }
86
+
87
+
88
+ @dataclass(frozen=True, slots=True)
89
+ class SelectedPortfolioClaim:
90
+ """One durably selected set, identified without carrying outcomes."""
91
+
92
+ method_id: str
93
+ treatment_id: str
94
+ item_ids: tuple[str, ...]
95
+
96
+ def __post_init__(self) -> None:
97
+ _require_identifier(self.method_id, "method_id")
98
+ _require_identifier(self.treatment_id, "treatment_id")
99
+ if type(self.item_ids) is not tuple or not self.item_ids:
100
+ raise ValueError("item_ids must be a non-empty exact tuple")
101
+ if any(type(value) is not str or not value for value in self.item_ids):
102
+ raise ValueError("item_ids must contain non-empty exact strings")
103
+ if self.item_ids != tuple(sorted(set(self.item_ids))):
104
+ raise ValueError("portfolio item_ids must be unique and canonical")
105
+
106
+ @property
107
+ def claim_id(self) -> str:
108
+ return f"{self.method_id}:{self.treatment_id}"
109
+
110
+ def to_record(self) -> dict[str, object]:
111
+ self.__post_init__()
112
+ return {
113
+ "method_id": self.method_id,
114
+ "treatment_id": self.treatment_id,
115
+ "claim_id": self.claim_id,
116
+ "item_ids": list(self.item_ids),
117
+ }
118
+
119
+
120
+ @dataclass(frozen=True, slots=True, eq=False)
121
+ class PostcommitRankRequest:
122
+ """Closed request frozen only after decisions and selected-union release."""
123
+
124
+ benchmark_id: str
125
+ source_run_finalization_sha256: str
126
+ source_run_recursive_content_sha256: str
127
+ decision_commitment_sha256: str
128
+ selected_union_commitment_sha256: str
129
+ selected_union_release_sha256: str
130
+ eligibility_receipt_sha256: str
131
+ reference_source_sha256: str
132
+ endpoint_policy: RankEndpointPolicyBinding
133
+ eligible_item_ids: tuple[str, ...]
134
+ portfolio_size: int
135
+ selected_portfolios: tuple[SelectedPortfolioClaim, ...]
136
+
137
+ def __post_init__(self) -> None:
138
+ _require_identifier(self.benchmark_id, "benchmark_id")
139
+ for name in (
140
+ "source_run_finalization_sha256",
141
+ "source_run_recursive_content_sha256",
142
+ "decision_commitment_sha256",
143
+ "selected_union_commitment_sha256",
144
+ "selected_union_release_sha256",
145
+ "eligibility_receipt_sha256",
146
+ "reference_source_sha256",
147
+ ):
148
+ require_sha256(getattr(self, name), name)
149
+ if type(self.endpoint_policy) is not RankEndpointPolicyBinding:
150
+ raise TypeError("endpoint_policy must be exact")
151
+ self.endpoint_policy.__post_init__()
152
+ if type(self.eligible_item_ids) is not tuple or not self.eligible_item_ids:
153
+ raise ValueError("eligible_item_ids must be a non-empty exact tuple")
154
+ if any(
155
+ type(value) is not str or not value for value in self.eligible_item_ids
156
+ ):
157
+ raise ValueError("eligible item IDs must be non-empty exact strings")
158
+ if self.eligible_item_ids != tuple(sorted(set(self.eligible_item_ids))):
159
+ raise ValueError("eligible item IDs must be unique and canonical")
160
+ if (
161
+ type(self.portfolio_size) is not int
162
+ or self.portfolio_size <= 0
163
+ or self.portfolio_size > len(self.eligible_item_ids)
164
+ ):
165
+ raise ValueError("portfolio_size is outside the eligible item set")
166
+ if type(self.selected_portfolios) is not tuple or not self.selected_portfolios:
167
+ raise ValueError("selected_portfolios must be a non-empty exact tuple")
168
+ for value in self.selected_portfolios:
169
+ if type(value) is not SelectedPortfolioClaim:
170
+ raise TypeError("selected_portfolios must contain exact claims")
171
+ value.__post_init__()
172
+ if len(value.item_ids) != self.portfolio_size:
173
+ raise ValueError("selected portfolio size differs from the request")
174
+ if not set(value.item_ids).issubset(self.eligible_item_ids):
175
+ raise ValueError("selected portfolio escapes the eligible item set")
176
+ if self.selected_portfolios != tuple(
177
+ sorted(
178
+ self.selected_portfolios,
179
+ key=lambda value: (value.method_id, value.treatment_id),
180
+ )
181
+ ):
182
+ raise ValueError("selected portfolios must use canonical claim order")
183
+ claim_ids = tuple(value.claim_id for value in self.selected_portfolios)
184
+ if len(set(claim_ids)) != len(claim_ids):
185
+ raise ValueError("selected portfolio claim IDs cannot repeat")
186
+
187
+ @property
188
+ def reference_read_count(self) -> int:
189
+ return len(self.eligible_item_ids)
190
+
191
+ @property
192
+ def exact_portfolio_count(self) -> int:
193
+ return math.comb(len(self.eligible_item_ids), self.portfolio_size)
194
+
195
+ def _unsigned_record(self) -> dict[str, object]:
196
+ self.__post_init__()
197
+ return {
198
+ "schema_version": 1,
199
+ "benchmark_id": self.benchmark_id,
200
+ "source_run_finalization_sha256": self.source_run_finalization_sha256,
201
+ "source_run_recursive_content_sha256": (
202
+ self.source_run_recursive_content_sha256
203
+ ),
204
+ "decision_commitment_sha256": self.decision_commitment_sha256,
205
+ "selected_union_commitment_sha256": (
206
+ self.selected_union_commitment_sha256
207
+ ),
208
+ "selected_union_release_sha256": self.selected_union_release_sha256,
209
+ "eligibility_receipt_sha256": self.eligibility_receipt_sha256,
210
+ "reference_source_sha256": self.reference_source_sha256,
211
+ "endpoint_policy": self.endpoint_policy.to_record(),
212
+ "eligible_item_ids": list(self.eligible_item_ids),
213
+ "eligible_item_count": len(self.eligible_item_ids),
214
+ "reference_read_count": self.reference_read_count,
215
+ "portfolio_size": self.portfolio_size,
216
+ "exact_portfolio_count": self.exact_portfolio_count,
217
+ "selected_portfolios": [
218
+ value.to_record() for value in self.selected_portfolios
219
+ ],
220
+ "outcomes_read_while_building_request": False,
221
+ }
222
+
223
+ @property
224
+ def request_sha256(self) -> str:
225
+ return _hash(_REQUEST_DOMAIN, self._unsigned_record())
226
+
227
+ def to_record(self) -> dict[str, object]:
228
+ return {**self._unsigned_record(), "request_sha256": self.request_sha256}
229
+
230
+
231
+ @dataclass(frozen=True, slots=True, eq=False)
232
+ class PostcommitRankAuthorization:
233
+ """Receipt for a caller-durable, read-back prerelease authorization.
234
+
235
+ The generic core binds this receipt. Filesystem durability and chronology
236
+ are verified by the composing run harness before it constructs the private
237
+ reader; a digest alone is not claimed to prove either property.
238
+ """
239
+
240
+ request_sha256: str
241
+ prerelease_file_sha256: str
242
+ authorization_scope: str
243
+
244
+ def __post_init__(self) -> None:
245
+ require_sha256(self.request_sha256, "request_sha256")
246
+ require_sha256(self.prerelease_file_sha256, "prerelease_file_sha256")
247
+ _require_identifier(self.authorization_scope, "authorization_scope")
248
+
249
+ def _unsigned_record(self) -> dict[str, object]:
250
+ self.__post_init__()
251
+ return {
252
+ "schema_version": 1,
253
+ "request_sha256": self.request_sha256,
254
+ "prerelease_file_sha256": self.prerelease_file_sha256,
255
+ "authorization_scope": self.authorization_scope,
256
+ "durability_verified_by_composing_harness": True,
257
+ }
258
+
259
+ @property
260
+ def authorization_sha256(self) -> str:
261
+ return _hash(_AUTHORIZATION_DOMAIN, self._unsigned_record())
262
+
263
+ def to_record(self) -> dict[str, object]:
264
+ return {
265
+ **self._unsigned_record(),
266
+ "authorization_sha256": self.authorization_sha256,
267
+ }
268
+
269
+
270
+ @dataclass(frozen=True, slots=True)
271
+ class RankReferenceObservation:
272
+ """Private scalar contribution returned once per eligible reference item."""
273
+
274
+ item_id: str
275
+ endpoint_component: float
276
+ source_receipt_sha256: str
277
+
278
+ def __post_init__(self) -> None:
279
+ if type(self.item_id) is not str or not self.item_id:
280
+ raise ValueError("item_id must be a non-empty exact string")
281
+ if (
282
+ type(self.endpoint_component) is not float
283
+ or not math.isfinite(self.endpoint_component)
284
+ ):
285
+ raise TypeError("endpoint_component must be a finite canonical float")
286
+ require_sha256(self.source_receipt_sha256, "source_receipt_sha256")
287
+
288
+
289
+ @dataclass(frozen=True, slots=True)
290
+ class SelectedPortfolioRank:
291
+ method_id: str
292
+ treatment_id: str
293
+ item_ids: tuple[str, ...]
294
+ endpoint: float
295
+ competition_rank: int
296
+ strictly_better_count: int
297
+ tied_portfolio_count: int
298
+ strictly_worse_count: int
299
+ denominator_count: int
300
+
301
+ def __post_init__(self) -> None:
302
+ claim = SelectedPortfolioClaim(
303
+ method_id=self.method_id,
304
+ treatment_id=self.treatment_id,
305
+ item_ids=self.item_ids,
306
+ )
307
+ claim.__post_init__()
308
+ if type(self.endpoint) is not float or not math.isfinite(self.endpoint):
309
+ raise TypeError("endpoint must be a finite canonical float")
310
+ integers = (
311
+ self.competition_rank,
312
+ self.strictly_better_count,
313
+ self.tied_portfolio_count,
314
+ self.strictly_worse_count,
315
+ self.denominator_count,
316
+ )
317
+ if any(type(value) is not int for value in integers):
318
+ raise TypeError("rank counts must be exact integers")
319
+ if (
320
+ self.denominator_count <= 0
321
+ or self.strictly_better_count < 0
322
+ or self.tied_portfolio_count <= 0
323
+ or self.strictly_worse_count < 0
324
+ or self.competition_rank != self.strictly_better_count + 1
325
+ or self.strictly_better_count
326
+ + self.tied_portfolio_count
327
+ + self.strictly_worse_count
328
+ != self.denominator_count
329
+ ):
330
+ raise ValueError("portfolio rank counts are inconsistent")
331
+
332
+ @property
333
+ def claim_id(self) -> str:
334
+ return f"{self.method_id}:{self.treatment_id}"
335
+
336
+ def to_record(self) -> dict[str, object]:
337
+ self.__post_init__()
338
+ return {
339
+ "method_id": self.method_id,
340
+ "treatment_id": self.treatment_id,
341
+ "claim_id": self.claim_id,
342
+ "item_ids": list(self.item_ids),
343
+ "selected_portfolio_endpoint": self.endpoint,
344
+ "selected_portfolio_endpoint_hex": self.endpoint.hex(),
345
+ "competition_rank": self.competition_rank,
346
+ "strictly_better_count": self.strictly_better_count,
347
+ "tied_portfolio_count": self.tied_portfolio_count,
348
+ "strictly_worse_count": self.strictly_worse_count,
349
+ "denominator_count": self.denominator_count,
350
+ "best_rank_percentile_0_best": (
351
+ self.strictly_better_count / self.denominator_count
352
+ ),
353
+ }
354
+
355
+
356
+ @dataclass(frozen=True, slots=True, eq=False)
357
+ class PostcommitRankRelease:
358
+ request_sha256: str
359
+ authorization_sha256: str
360
+ private_reference_table_sha256: str
361
+ private_portfolio_endpoint_table_sha256: str
362
+ exact_reference_read_count: int
363
+ exact_portfolio_count: int
364
+ distinct_portfolio_endpoint_count: int
365
+ portfolio_endpoint_tie_group_count: int
366
+ selected_ranks: tuple[SelectedPortfolioRank, ...]
367
+
368
+ def __post_init__(self) -> None:
369
+ for name in (
370
+ "request_sha256",
371
+ "authorization_sha256",
372
+ "private_reference_table_sha256",
373
+ "private_portfolio_endpoint_table_sha256",
374
+ ):
375
+ require_sha256(getattr(self, name), name)
376
+ for name in (
377
+ "exact_reference_read_count",
378
+ "exact_portfolio_count",
379
+ "distinct_portfolio_endpoint_count",
380
+ ):
381
+ value = getattr(self, name)
382
+ if type(value) is not int or value <= 0:
383
+ raise ValueError(f"{name} must be a positive exact integer")
384
+ if (
385
+ type(self.portfolio_endpoint_tie_group_count) is not int
386
+ or self.portfolio_endpoint_tie_group_count < 0
387
+ ):
388
+ raise ValueError(
389
+ "portfolio_endpoint_tie_group_count must be non-negative"
390
+ )
391
+ if self.distinct_portfolio_endpoint_count > self.exact_portfolio_count:
392
+ raise ValueError("distinct endpoint count exceeds portfolio count")
393
+ if self.portfolio_endpoint_tie_group_count > (
394
+ self.distinct_portfolio_endpoint_count
395
+ ):
396
+ raise ValueError("tie-group count exceeds distinct endpoints")
397
+ if type(self.selected_ranks) is not tuple or not self.selected_ranks:
398
+ raise ValueError("selected_ranks must be a non-empty exact tuple")
399
+ for value in self.selected_ranks:
400
+ if type(value) is not SelectedPortfolioRank:
401
+ raise TypeError("selected_ranks must contain exact rows")
402
+ value.__post_init__()
403
+ if value.denominator_count != self.exact_portfolio_count:
404
+ raise ValueError("selected rank denominator differs from release")
405
+ if self.selected_ranks != tuple(
406
+ sorted(
407
+ self.selected_ranks,
408
+ key=lambda value: (value.method_id, value.treatment_id),
409
+ )
410
+ ):
411
+ raise ValueError("selected ranks must use canonical claim order")
412
+
413
+ def _unsigned_record(self) -> dict[str, object]:
414
+ self.__post_init__()
415
+ ranks = tuple(value.competition_rank for value in self.selected_ranks)
416
+ return {
417
+ "schema_version": 1,
418
+ "status": "completed_postcommit_rank_only_release",
419
+ "request_sha256": self.request_sha256,
420
+ "authorization_sha256": self.authorization_sha256,
421
+ "private_reference_table_sha256": self.private_reference_table_sha256,
422
+ "private_portfolio_endpoint_table_sha256": (
423
+ self.private_portfolio_endpoint_table_sha256
424
+ ),
425
+ "exact_reference_read_count": self.exact_reference_read_count,
426
+ "exact_portfolio_count": self.exact_portfolio_count,
427
+ "aggregate_diagnostics": {
428
+ "distinct_portfolio_endpoint_count": (
429
+ self.distinct_portfolio_endpoint_count
430
+ ),
431
+ "portfolio_endpoint_tie_group_count": (
432
+ self.portfolio_endpoint_tie_group_count
433
+ ),
434
+ "selected_claim_count": len(self.selected_ranks),
435
+ "unique_selected_portfolio_count": len(
436
+ {value.item_ids for value in self.selected_ranks}
437
+ ),
438
+ "minimum_selected_competition_rank": min(ranks),
439
+ "maximum_selected_competition_rank": max(ranks),
440
+ },
441
+ "selected_ranks": [value.to_record() for value in self.selected_ranks],
442
+ "raw_reference_values_returned": False,
443
+ "unselected_item_values_returned": False,
444
+ "unselected_portfolio_endpoints_returned": False,
445
+ "provider_calls": 0,
446
+ "new_candidate_evaluations": 0,
447
+ }
448
+
449
+ @property
450
+ def release_sha256(self) -> str:
451
+ return _hash(_RELEASE_DOMAIN, self._unsigned_record())
452
+
453
+ def to_record(self) -> dict[str, object]:
454
+ return {**self._unsigned_record(), "release_sha256": self.release_sha256}
455
+
456
+
457
+ __all__ = [
458
+ "PortfolioAggregateKind",
459
+ "PostcommitRankAuthorization",
460
+ "PostcommitRankRelease",
461
+ "PostcommitRankRequest",
462
+ "RankDirection",
463
+ "RankEndpointPolicyBinding",
464
+ "RankReferenceObservation",
465
+ "SelectedPortfolioClaim",
466
+ "SelectedPortfolioRank",
467
+ ]