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,499 @@
1
+ """Conserved stage closure for mixed-expert residual evolution.
2
+
3
+ The proposal market deliberately ends immediately after the broker-selected
4
+ slate has been evaluated. This module owns the next, workload-neutral
5
+ boundary: authenticate the actual pre/post archive utility receipts, allocate
6
+ their realized joint gain exactly over the evaluated slate, and compile the
7
+ append-only evidence consumed by the broker and earned-lineage ledgers.
8
+
9
+ No proposal expert is allowed to grade itself. Archive utility and admission
10
+ remain inverted ports, while the core sees only objective mappings, immutable
11
+ identities, and real evaluator receipts.
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ import hashlib
17
+ import json
18
+ import math
19
+ from dataclasses import dataclass, field
20
+ from typing import Protocol, runtime_checkable
21
+
22
+ from agent_evolve.application.agentic_evolution import EvolutionCandidate
23
+ from agent_evolve.application.earned_lineage import (
24
+ CandidateConservedCredit,
25
+ CandidateProposalProvenance,
26
+ ConservedStageCreditReceipt,
27
+ ProposalLineageRole,
28
+ )
29
+ from agent_evolve.application.evolution_campaign import ArchiveUtilitySnapshot
30
+ from agent_evolve.application.materialized_action_broker import (
31
+ MaterializedActionOutcome,
32
+ )
33
+ from agent_evolve.application.residual_portfolio_evolution import (
34
+ ResidualPortfolioEvolutionResult,
35
+ )
36
+ from agent_evolve.domain.patch import require_sha256
37
+ from agent_evolve.policies.reward.contextual_marginal_utility import (
38
+ CONTEXTUAL_SHAPLEY_UTILITY_PROJECTOR_DEFINITION_SHA256,
39
+ JointUtilitySnapshot,
40
+ ReplayableArchiveUtility,
41
+ exact_coalition_shapley_values,
42
+ )
43
+
44
+
45
+ RESIDUAL_STAGE_CREDIT_PROJECTOR_ID = "mixed_expert_exact_coalition_stage_credit"
46
+ RESIDUAL_STAGE_CREDIT_PROJECTOR_VERSION = 1
47
+ RESIDUAL_STAGE_CREDIT_PROJECTOR_DEFINITION_SHA256 = hashlib.sha256(
48
+ b"agent-evolve:mixed-expert-exact-coalition-stage-credit:v1;"
49
+ b"cutoff=authenticated-pre-and-post-archive-utility-snapshots;"
50
+ b"players=broker-selected-real-evaluations-only;"
51
+ b"admission=injected-workload-neutral-policy;"
52
+ b"credit=exact-coalition-shapley-joint-archive-gain;"
53
+ b"conservation=post-minus-pre-utility;"
54
+ b"broker-feedback=immediate-realized-feasibility-and-conserved-gain;"
55
+ b"provenance=sealed-proposal-expert-operator-parents-and-cutoff;"
56
+ b"positive-credit=counterfactual-coalition-admission-not-final-front-retention;"
57
+ b"workload-model-provider-branches=false"
58
+ ).hexdigest()
59
+
60
+ STRICT_RESIDUAL_CANDIDATE_ADMISSION_ID = "strict_evaluated_candidate_admission"
61
+ STRICT_RESIDUAL_CANDIDATE_ADMISSION_VERSION = 1
62
+ STRICT_RESIDUAL_CANDIDATE_ADMISSION_DEFINITION_SHA256 = hashlib.sha256(
63
+ b"agent-evolve:strict-evaluated-candidate-admission:v1;"
64
+ b"admissible=valid-and-operator-compliant-and-evidence-compliant;"
65
+ b"objective-contract=archive-utility-replay;"
66
+ b"workload-model-provider-branches=false"
67
+ ).hexdigest()
68
+
69
+ _PROJECTION_DOMAIN = b"agent-evolve:conserved-residual-stage-projection:v1\x00"
70
+
71
+
72
+ def _canonical_json(value: object) -> bytes:
73
+ return json.dumps(
74
+ value,
75
+ allow_nan=False,
76
+ ensure_ascii=True,
77
+ separators=(",", ":"),
78
+ sort_keys=True,
79
+ ).encode("ascii", errors="strict")
80
+
81
+
82
+ def _hash(domain: bytes, value: object) -> str:
83
+ return hashlib.sha256(domain + _canonical_json(value)).hexdigest()
84
+
85
+
86
+ @runtime_checkable
87
+ class ResidualCandidateAdmissionPort(Protocol):
88
+ """Decide whether one real outcome enters the archive coalition game."""
89
+
90
+ admission_id: str
91
+ admission_version: int
92
+ definition_sha256: str
93
+
94
+ def admissible(self, candidate: EvolutionCandidate) -> bool: ...
95
+
96
+
97
+ @dataclass(frozen=True, slots=True)
98
+ class StrictResidualCandidateAdmission:
99
+ """Default archive gate matching the strict Pareto admission policy."""
100
+
101
+ admission_id: str = field(
102
+ init=False,
103
+ default=STRICT_RESIDUAL_CANDIDATE_ADMISSION_ID,
104
+ )
105
+ admission_version: int = field(
106
+ init=False,
107
+ default=STRICT_RESIDUAL_CANDIDATE_ADMISSION_VERSION,
108
+ )
109
+ definition_sha256: str = field(
110
+ init=False,
111
+ default=STRICT_RESIDUAL_CANDIDATE_ADMISSION_DEFINITION_SHA256,
112
+ )
113
+
114
+ def admissible(self, candidate: EvolutionCandidate) -> bool:
115
+ if type(candidate) is not EvolutionCandidate:
116
+ raise TypeError("candidate must be an exact EvolutionCandidate")
117
+ EvolutionCandidate.__post_init__(candidate)
118
+ return bool(
119
+ candidate.valid
120
+ and candidate.operator_compliant
121
+ and candidate.evidence_compliant
122
+ )
123
+
124
+
125
+ def _validate_admission_port(value: ResidualCandidateAdmissionPort) -> None:
126
+ if not isinstance(value, ResidualCandidateAdmissionPort):
127
+ raise TypeError("admission must implement ResidualCandidateAdmissionPort")
128
+ if type(value.admission_id) is not str or not value.admission_id:
129
+ raise ValueError("admission_id must be a non-empty exact string")
130
+ if type(value.admission_version) is not int or value.admission_version <= 0:
131
+ raise ValueError("admission_version must be positive")
132
+ require_sha256(value.definition_sha256, "admission definition_sha256")
133
+
134
+
135
+ @dataclass(frozen=True, slots=True)
136
+ class ConservedResidualStageProjection:
137
+ """Pure, authenticated evidence prepared before ledger publication."""
138
+
139
+ residual_result_sha256: str
140
+ pre_archive_utility_snapshot_sha256: str
141
+ post_archive_utility_snapshot_sha256: str
142
+ admission_id: str
143
+ admission_version: int
144
+ admission_definition_sha256: str
145
+ stage_credit: ConservedStageCreditReceipt
146
+ action_outcomes: tuple[MaterializedActionOutcome, ...]
147
+ candidate_provenance: tuple[CandidateProposalProvenance, ...]
148
+ projector_definition_sha256: str = (
149
+ RESIDUAL_STAGE_CREDIT_PROJECTOR_DEFINITION_SHA256
150
+ )
151
+ projection_sha256: str = field(init=False)
152
+
153
+ def __post_init__(self) -> None:
154
+ for name in (
155
+ "residual_result_sha256",
156
+ "pre_archive_utility_snapshot_sha256",
157
+ "post_archive_utility_snapshot_sha256",
158
+ "admission_definition_sha256",
159
+ "projector_definition_sha256",
160
+ ):
161
+ require_sha256(getattr(self, name), name)
162
+ if type(self.admission_id) is not str or not self.admission_id:
163
+ raise ValueError("admission_id must be a non-empty exact string")
164
+ if type(self.admission_version) is not int or self.admission_version <= 0:
165
+ raise ValueError("admission_version must be positive")
166
+ if type(self.stage_credit) is not ConservedStageCreditReceipt:
167
+ raise TypeError("stage_credit must be exact")
168
+ ConservedStageCreditReceipt.__post_init__(self.stage_credit)
169
+ if type(self.action_outcomes) is not tuple or not self.action_outcomes:
170
+ raise ValueError("action_outcomes must be a non-empty exact tuple")
171
+ for value in self.action_outcomes:
172
+ if type(value) is not MaterializedActionOutcome:
173
+ raise TypeError("action_outcomes must contain exact values")
174
+ value.__post_init__()
175
+ if not value.realized:
176
+ raise ValueError("stage closure cannot contain unrealized outcomes")
177
+ if type(self.candidate_provenance) is not tuple:
178
+ raise TypeError("candidate_provenance must be an exact tuple")
179
+ for value in self.candidate_provenance:
180
+ if type(value) is not CandidateProposalProvenance:
181
+ raise TypeError("candidate_provenance must contain exact values")
182
+ CandidateProposalProvenance.__post_init__(value)
183
+
184
+ outcome_ids = tuple(
185
+ value.action.target_candidate_id.value for value in self.action_outcomes
186
+ )
187
+ if len(set(outcome_ids)) != len(outcome_ids):
188
+ raise ValueError("stage closure repeats a candidate outcome")
189
+ credit_ids = tuple(
190
+ value.candidate_id.value for value in self.stage_credit.candidate_credits
191
+ )
192
+ provenance_ids = tuple(
193
+ value.candidate_id.value for value in self.candidate_provenance
194
+ )
195
+ if tuple(sorted(outcome_ids)) != credit_ids:
196
+ raise ValueError("stage credit does not exactly cover action outcomes")
197
+ if provenance_ids != credit_ids:
198
+ raise ValueError("candidate provenance does not exactly cover stage credit")
199
+ credit_by_id = {
200
+ value.candidate_id: value for value in self.stage_credit.candidate_credits
201
+ }
202
+ for outcome in self.action_outcomes:
203
+ credit = credit_by_id[outcome.action.target_candidate_id]
204
+ if (
205
+ outcome.feasible != credit.admitted_to_archive
206
+ or outcome.normalized_archive_gain != credit.contribution
207
+ ):
208
+ raise ValueError("broker outcome differs from conserved candidate credit")
209
+ object.__setattr__(
210
+ self,
211
+ "projection_sha256",
212
+ _hash(_PROJECTION_DOMAIN, self._unsigned_record()),
213
+ )
214
+
215
+ def _unsigned_record(self) -> dict[str, object]:
216
+ return {
217
+ "schema_version": 1,
218
+ "projector": {
219
+ "projector_id": RESIDUAL_STAGE_CREDIT_PROJECTOR_ID,
220
+ "projector_version": RESIDUAL_STAGE_CREDIT_PROJECTOR_VERSION,
221
+ "definition_sha256": self.projector_definition_sha256,
222
+ },
223
+ "residual_result_sha256": self.residual_result_sha256,
224
+ "pre_archive_utility_snapshot_sha256": (
225
+ self.pre_archive_utility_snapshot_sha256
226
+ ),
227
+ "post_archive_utility_snapshot_sha256": (
228
+ self.post_archive_utility_snapshot_sha256
229
+ ),
230
+ "admission": {
231
+ "admission_id": self.admission_id,
232
+ "admission_version": self.admission_version,
233
+ "definition_sha256": self.admission_definition_sha256,
234
+ },
235
+ "stage_credit_receipt_sha256": self.stage_credit.receipt_sha256,
236
+ "action_outcome_sha256s": [
237
+ value.outcome_sha256 for value in self.action_outcomes
238
+ ],
239
+ "candidate_provenance_sha256s": [
240
+ value.provenance_sha256 for value in self.candidate_provenance
241
+ ],
242
+ "credit_semantics": (
243
+ "counterfactual_archive_coalition_contribution;"
244
+ "final_front_retention_is_delayed_credit"
245
+ ),
246
+ "coalition_value_definition_sha256": (
247
+ CONTEXTUAL_SHAPLEY_UTILITY_PROJECTOR_DEFINITION_SHA256
248
+ ),
249
+ "workload_model_provider_fields_present": False,
250
+ }
251
+
252
+ def to_record(self) -> dict[str, object]:
253
+ self.__post_init__()
254
+ return {
255
+ **self._unsigned_record(),
256
+ "stage_credit": self.stage_credit.to_record(),
257
+ "action_outcomes": [
258
+ value.to_record() for value in self.action_outcomes
259
+ ],
260
+ "candidate_provenance": [
261
+ value.to_record() for value in self.candidate_provenance
262
+ ],
263
+ "projection_sha256": self.projection_sha256,
264
+ }
265
+
266
+
267
+ @dataclass(frozen=True, slots=True)
268
+ class ResidualStageCreditProjector:
269
+ """Project one evaluated residual slate into conserved learning evidence."""
270
+
271
+ archive_utility: ReplayableArchiveUtility = field(repr=False, compare=False)
272
+ admission: ResidualCandidateAdmissionPort = field(
273
+ default_factory=StrictResidualCandidateAdmission,
274
+ repr=False,
275
+ compare=False,
276
+ )
277
+
278
+ def __post_init__(self) -> None:
279
+ if not isinstance(self.archive_utility, ReplayableArchiveUtility):
280
+ raise TypeError("archive_utility must replay utility snapshots")
281
+ _validate_admission_port(self.admission)
282
+
283
+ def project(
284
+ self,
285
+ *,
286
+ pre_snapshot: ArchiveUtilitySnapshot,
287
+ post_snapshot: ArchiveUtilitySnapshot,
288
+ result: ResidualPortfolioEvolutionResult,
289
+ ) -> ConservedResidualStageProjection:
290
+ self.__post_init__()
291
+ if type(pre_snapshot) is not ArchiveUtilitySnapshot:
292
+ raise TypeError("pre_snapshot must be exact")
293
+ if type(post_snapshot) is not ArchiveUtilitySnapshot:
294
+ raise TypeError("post_snapshot must be exact")
295
+ pre_snapshot.__post_init__()
296
+ post_snapshot.__post_init__()
297
+ if type(result) is not ResidualPortfolioEvolutionResult:
298
+ raise TypeError("result must be exact")
299
+ result.__post_init__()
300
+ if (
301
+ pre_snapshot.utility_id,
302
+ pre_snapshot.utility_version,
303
+ pre_snapshot.definition_sha256,
304
+ pre_snapshot.generation,
305
+ pre_snapshot.benchmark_sha256,
306
+ ) != (
307
+ post_snapshot.utility_id,
308
+ post_snapshot.utility_version,
309
+ post_snapshot.definition_sha256,
310
+ post_snapshot.generation,
311
+ post_snapshot.benchmark_sha256,
312
+ ):
313
+ raise ValueError("pre/post archive utility snapshots are not comparable")
314
+ if pre_snapshot.generation != result.request.decision_index:
315
+ raise ValueError("archive utility generation differs from residual decision")
316
+ if pre_snapshot.archive_sha256 == post_snapshot.archive_sha256:
317
+ # A zero-gain stage still records new candidate decisions, so the
318
+ # authenticated archive state (including its ledger) must advance.
319
+ raise ValueError("post archive cutoff did not advance")
320
+ if (
321
+ pre_snapshot.scalar_utility_hex is None
322
+ or post_snapshot.scalar_utility_hex is None
323
+ ):
324
+ raise ValueError("conserved stage credit requires scalar utility receipts")
325
+ pre_utility = float.fromhex(pre_snapshot.scalar_utility_hex)
326
+ post_utility = float.fromhex(post_snapshot.scalar_utility_hex)
327
+ replayed = self.archive_utility.require_snapshot(pre_snapshot)
328
+ if not isinstance(replayed, JointUtilitySnapshot):
329
+ raise TypeError("archive utility returned no joint-gain snapshot")
330
+
331
+ proposal_by_expert = {
332
+ value.expert_id: value for value in result.proposals
333
+ }
334
+ selected = result.broker_decision.selected_actions
335
+ evaluations = result.evaluations
336
+ if len(selected) != len(evaluations): # Defensive; result closes this.
337
+ raise RuntimeError("broker slate differs from real evaluation count")
338
+
339
+ rows: list[
340
+ tuple[
341
+ str,
342
+ int,
343
+ EvolutionCandidate,
344
+ bool,
345
+ ]
346
+ ] = []
347
+ for index, evaluation in enumerate(evaluations):
348
+ candidate = evaluation.candidate
349
+ admissible = self.admission.admissible(candidate)
350
+ if type(admissible) is not bool:
351
+ raise TypeError("admission port must return an exact bool")
352
+ rows.append(
353
+ (
354
+ candidate.candidate_id.value,
355
+ index,
356
+ candidate,
357
+ admissible,
358
+ )
359
+ )
360
+ rows.sort(key=lambda value: value[0])
361
+ if len({value[0] for value in rows}) != len(rows):
362
+ raise ValueError("stage credit cannot repeat a candidate")
363
+ players = tuple(value for value in rows if value[3])
364
+ credits = exact_coalition_shapley_values(
365
+ replayed,
366
+ tuple(value[2].objective_map for value in players),
367
+ )
368
+ credit_by_candidate_id = {
369
+ value[2].candidate_id: credit
370
+ for value, credit in zip(players, credits, strict=True)
371
+ }
372
+ joint_gain = replayed.joint_gain(
373
+ tuple(value[2].objective_map for value in players)
374
+ )
375
+ if type(joint_gain) is not float or not math.isfinite(joint_gain):
376
+ raise TypeError("joint archive gain must be a finite exact float")
377
+ tolerance = 16.0 * math.ulp(max(1.0, pre_utility, post_utility))
378
+ if abs((post_utility - pre_utility) - joint_gain) > tolerance:
379
+ raise ValueError(
380
+ "observed post archive utility differs from the evaluated coalition"
381
+ )
382
+
383
+ candidate_credits = tuple(
384
+ CandidateConservedCredit(
385
+ candidate_id=candidate.candidate_id,
386
+ contribution=float(
387
+ credit_by_candidate_id.get(candidate.candidate_id, 0.0)
388
+ ),
389
+ # This means admission to at least the counterfactual
390
+ # coalition game, not survival on the final stage front.
391
+ admitted_to_archive=admissible,
392
+ outcome_receipt_sha256=(
393
+ result.evaluations[index].evaluation_sha256
394
+ ),
395
+ )
396
+ for _candidate_id, index, candidate, admissible in rows
397
+ )
398
+ stage_credit = ConservedStageCreditReceipt(
399
+ generation=result.request.decision_index,
400
+ utility_id=pre_snapshot.utility_id,
401
+ utility_version=pre_snapshot.utility_version,
402
+ utility_definition_sha256=pre_snapshot.definition_sha256,
403
+ pre_archive_sha256=pre_snapshot.archive_sha256,
404
+ post_archive_sha256=post_snapshot.archive_sha256,
405
+ pre_utility=pre_utility,
406
+ post_utility=post_utility,
407
+ contribution_policy_id=RESIDUAL_STAGE_CREDIT_PROJECTOR_ID,
408
+ contribution_policy_version=RESIDUAL_STAGE_CREDIT_PROJECTOR_VERSION,
409
+ contribution_policy_definition_sha256=(
410
+ RESIDUAL_STAGE_CREDIT_PROJECTOR_DEFINITION_SHA256
411
+ ),
412
+ candidate_credits=candidate_credits,
413
+ )
414
+
415
+ admissible_by_candidate_id = {
416
+ candidate.candidate_id: admissible
417
+ for _candidate_id, _index, candidate, admissible in rows
418
+ }
419
+ action_outcomes = tuple(
420
+ MaterializedActionOutcome(
421
+ action=action,
422
+ realized=True,
423
+ feasible=admissible_by_candidate_id[
424
+ evaluation.candidate.candidate_id
425
+ ],
426
+ normalized_archive_gain=float(
427
+ credit_by_candidate_id.get(
428
+ evaluation.candidate.candidate_id,
429
+ 0.0,
430
+ )
431
+ ),
432
+ positive_marginal_utility=(
433
+ credit_by_candidate_id.get(
434
+ evaluation.candidate.candidate_id,
435
+ 0.0,
436
+ )
437
+ > 0.0
438
+ ),
439
+ )
440
+ for action, evaluation in zip(selected, evaluations, strict=True)
441
+ )
442
+ candidate_provenance = tuple(
443
+ CandidateProposalProvenance(
444
+ candidate_id=evaluation.candidate.candidate_id,
445
+ configuration_sha256=(
446
+ evaluation.candidate.occurrence.configuration_hash
447
+ ),
448
+ generation=evaluation.candidate.generation,
449
+ source_role=(
450
+ ProposalLineageRole.BACKBONE
451
+ if action.reference_action
452
+ else ProposalLineageRole.CHALLENGER
453
+ ),
454
+ proposal_expert_id=action.expert_id,
455
+ proposal_expert_version=(
456
+ proposal_by_expert[action.expert_id].expert_version
457
+ ),
458
+ proposal_expert_definition_sha256=(
459
+ proposal_by_expert[
460
+ action.expert_id
461
+ ].expert_definition_sha256
462
+ ),
463
+ operator_id=action.operator_id,
464
+ parent_candidate_ids=action.parent_ids,
465
+ decision_cutoff_sha256=result.request.prior_state_sha256,
466
+ source_receipt_sha256=(
467
+ proposal_by_expert[action.expert_id].proposal_sha256
468
+ ),
469
+ )
470
+ for action, evaluation in sorted(
471
+ zip(selected, evaluations, strict=True),
472
+ key=lambda value: value[1].candidate.candidate_id.value,
473
+ )
474
+ )
475
+ return ConservedResidualStageProjection(
476
+ residual_result_sha256=result.result_sha256,
477
+ pre_archive_utility_snapshot_sha256=pre_snapshot.snapshot_sha256,
478
+ post_archive_utility_snapshot_sha256=post_snapshot.snapshot_sha256,
479
+ admission_id=self.admission.admission_id,
480
+ admission_version=self.admission.admission_version,
481
+ admission_definition_sha256=self.admission.definition_sha256,
482
+ stage_credit=stage_credit,
483
+ action_outcomes=action_outcomes,
484
+ candidate_provenance=candidate_provenance,
485
+ )
486
+
487
+
488
+ __all__ = [
489
+ "RESIDUAL_STAGE_CREDIT_PROJECTOR_DEFINITION_SHA256",
490
+ "RESIDUAL_STAGE_CREDIT_PROJECTOR_ID",
491
+ "RESIDUAL_STAGE_CREDIT_PROJECTOR_VERSION",
492
+ "STRICT_RESIDUAL_CANDIDATE_ADMISSION_DEFINITION_SHA256",
493
+ "STRICT_RESIDUAL_CANDIDATE_ADMISSION_ID",
494
+ "STRICT_RESIDUAL_CANDIDATE_ADMISSION_VERSION",
495
+ "ConservedResidualStageProjection",
496
+ "ResidualCandidateAdmissionPort",
497
+ "ResidualStageCreditProjector",
498
+ "StrictResidualCandidateAdmission",
499
+ ]