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,607 @@
1
+ """Outcome-blind typed runner for calibrated-portfolio conformance assays.
2
+
3
+ The production selector exposes a complete finite action contract on its
4
+ dynamic Pydantic output type. This runner derives one legal proposal slate
5
+ from that contract without consulting a workload adapter, objective value,
6
+ model, provider, or hidden evaluator. It is deliberately a transport double:
7
+ its only purpose is to exercise the real prompt, schema, reconciliation, and
8
+ allocation stack before a paid or simulator-backed campaign is admitted.
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ from dataclasses import dataclass
14
+ from decimal import Decimal
15
+ from typing import Any, get_args
16
+
17
+ from pydantic import BaseModel
18
+
19
+ from agent_evolve.policies.variation.compositional_finite_catalog import (
20
+ COMPOSITION_SELECTION_EXPOSURE_METADATA_KEY,
21
+ CompositionSelectionExposure,
22
+ )
23
+ from agent_evolve.ports.portfolio_memory_dose import (
24
+ BoundedPortfolioMemoryDoseContract,
25
+ )
26
+ from agent_evolve.ports.portfolio_selection import (
27
+ pairwise_disjoint_parent_patch_witness,
28
+ )
29
+ from agent_evolve.ports.structured_generator import (
30
+ StructuredGenerationRequest,
31
+ StructuredGenerationResponse,
32
+ )
33
+
34
+
35
+ class ProviderFreeCalibratedConformanceError(RuntimeError):
36
+ """The published calibrated-output contract has no derived legal slate."""
37
+
38
+
39
+ @dataclass(frozen=True, slots=True)
40
+ class ProviderFreeCalibratedCallRecord:
41
+ call_id: str
42
+ proposal_option_ids: tuple[str, ...]
43
+ supporting_card_keys_by_member: tuple[tuple[str, ...], ...]
44
+ assigned_card_keys: tuple[str, ...]
45
+ evaluation_witness_option_ids: tuple[str, ...]
46
+ required_proposal_support_option_ids: tuple[str, ...]
47
+ required_composite_proposals: int
48
+ bounded_memory_dose: bool
49
+
50
+ def to_record(self) -> dict[str, object]:
51
+ return {
52
+ "call_id": self.call_id,
53
+ "proposal_option_ids": list(self.proposal_option_ids),
54
+ "proposal_width": len(self.proposal_option_ids),
55
+ "supporting_card_keys_by_member": [
56
+ list(value) for value in self.supporting_card_keys_by_member
57
+ ],
58
+ # Preserve the established provider-free trace names while also
59
+ # publishing the workload-neutral spelling above.
60
+ "proposal_supporting_card_keys": [
61
+ list(value) for value in self.supporting_card_keys_by_member
62
+ ],
63
+ "assigned_card_keys": list(self.assigned_card_keys),
64
+ "evaluation_witness_option_ids": list(
65
+ self.evaluation_witness_option_ids
66
+ ),
67
+ "required_proposal_support_option_ids": list(
68
+ self.required_proposal_support_option_ids
69
+ ),
70
+ "required_composite_proposals": self.required_composite_proposals,
71
+ "bounded_memory_dose": self.bounded_memory_dose,
72
+ "provider_calls": 0,
73
+ "outcomes_consulted": False,
74
+ }
75
+
76
+
77
+ def _nested_model_types(annotation: object) -> tuple[type[BaseModel], ...]:
78
+ found: list[type[BaseModel]] = []
79
+
80
+ def visit(value: object) -> None:
81
+ if isinstance(value, type) and issubclass(value, BaseModel):
82
+ found.append(value)
83
+ return
84
+ for child in get_args(value):
85
+ visit(child)
86
+
87
+ visit(annotation)
88
+ unique: list[type[BaseModel]] = []
89
+ for value in found:
90
+ if value not in unique:
91
+ unique.append(value)
92
+ return tuple(unique)
93
+
94
+
95
+ def _member_model_types(output_type: type[BaseModel]) -> tuple[type[BaseModel], ...]:
96
+ member_field = output_type.model_fields.get("members")
97
+ if member_field is None:
98
+ raise ProviderFreeCalibratedConformanceError(
99
+ "structured output omits the calibrated members field"
100
+ )
101
+ result = tuple(
102
+ value
103
+ for value in _nested_model_types(member_field.annotation)
104
+ if hasattr(value, "required_metric_ids")
105
+ and (
106
+ hasattr(value, "allowed_option_ids")
107
+ or hasattr(value, "allowed_composite_option_ids")
108
+ )
109
+ )
110
+ if not result:
111
+ raise ProviderFreeCalibratedConformanceError(
112
+ "structured output does not publish calibrated member contracts"
113
+ )
114
+ return result
115
+
116
+
117
+ def _metric_ids(member_types: tuple[type[BaseModel], ...]) -> tuple[str, ...]:
118
+ declarations = {
119
+ tuple(getattr(value, "required_metric_ids")) for value in member_types
120
+ }
121
+ if len(declarations) != 1:
122
+ raise ProviderFreeCalibratedConformanceError(
123
+ "calibrated member variants disagree on required metrics"
124
+ )
125
+ result = next(iter(declarations))
126
+ if not result or any(type(value) is not str or not value for value in result):
127
+ raise ProviderFreeCalibratedConformanceError(
128
+ "calibrated output publishes an invalid metric contract"
129
+ )
130
+ return result
131
+
132
+
133
+ def _composite_bindings(
134
+ member_types: tuple[type[BaseModel], ...],
135
+ ) -> dict[str, tuple[str, str]]:
136
+ result: dict[str, tuple[str, str]] = {}
137
+ for member_type in member_types:
138
+ local = getattr(member_type, "components_by_composite", None)
139
+ if local is None:
140
+ continue
141
+ if type(local) is not dict:
142
+ raise ProviderFreeCalibratedConformanceError(
143
+ "composite member contract published invalid bindings"
144
+ )
145
+ for option_id, components in local.items():
146
+ if (
147
+ type(option_id) is not str
148
+ or type(components) is not tuple
149
+ or len(components) != 2
150
+ or any(type(value) is not str for value in components)
151
+ ):
152
+ raise ProviderFreeCalibratedConformanceError(
153
+ "composite member contract published an invalid binding"
154
+ )
155
+ prior = result.get(option_id)
156
+ if prior is not None and prior != components:
157
+ raise ProviderFreeCalibratedConformanceError(
158
+ "composite member variants disagree on one binding"
159
+ )
160
+ result[option_id] = components
161
+ return result
162
+
163
+
164
+ def _eligible_options(output_type: type[BaseModel]) -> tuple[Any, ...]:
165
+ contract = getattr(output_type, "finite_variation_contract", None)
166
+ if contract is None:
167
+ raise ProviderFreeCalibratedConformanceError(
168
+ "calibrated output omits its finite variation contract"
169
+ )
170
+ contract.__post_init__()
171
+ option_by_id = {value.option_id: value for value in contract.options}
172
+ ordered_pool = getattr(output_type, "ordered_common_pool_option_ids", None)
173
+ option_ids = (
174
+ tuple(option_by_id)
175
+ if ordered_pool is None
176
+ else tuple(ordered_pool)
177
+ )
178
+ if (
179
+ len(option_ids) < 8
180
+ or len(set(option_ids)) != len(option_ids)
181
+ or any(value not in option_by_id for value in option_ids)
182
+ ):
183
+ raise ProviderFreeCalibratedConformanceError(
184
+ "calibrated finite candidate universe cannot supply a unique K8"
185
+ )
186
+ return tuple(option_by_id[value] for value in option_ids)
187
+
188
+
189
+ def _is_composite(option: Any, bindings: dict[str, tuple[str, str]]) -> bool:
190
+ if option.option_id in bindings:
191
+ return True
192
+ exposure = dict(option.metadata).get(
193
+ COMPOSITION_SELECTION_EXPOSURE_METADATA_KEY
194
+ )
195
+ if exposure == CompositionSelectionExposure.HIERARCHICAL_RANKED_UNION.value:
196
+ raise ProviderFreeCalibratedConformanceError(
197
+ "hierarchical composite lacks its exact component binding"
198
+ )
199
+ return False
200
+
201
+
202
+ def _evaluation_witness(
203
+ output_type: type[BaseModel],
204
+ eligible_option_ids: tuple[str, ...],
205
+ ) -> tuple[str, ...]:
206
+ if not getattr(output_type, "enforce_cross_member_constraints", True):
207
+ return ()
208
+ if not getattr(
209
+ output_type,
210
+ "require_pairwise_disjoint_parent_patches",
211
+ False,
212
+ ):
213
+ return ()
214
+ contract = output_type.finite_variation_contract
215
+ witness = pairwise_disjoint_parent_patch_witness(
216
+ contract,
217
+ eligible_option_ids,
218
+ portfolio_size=output_type.evaluation_portfolio_size,
219
+ min_distinct_families=output_type.min_distinct_families,
220
+ family_exposure_bounds=output_type.required_evaluation_family_bounds,
221
+ )
222
+ if witness is None:
223
+ raise ProviderFreeCalibratedConformanceError(
224
+ "finite candidate universe has no legal evaluator witness"
225
+ )
226
+ return witness
227
+
228
+
229
+ def _fits_hierarchy(
230
+ option_id: str,
231
+ *,
232
+ chosen: set[str],
233
+ composite_ids: set[str],
234
+ composite_capacity: int,
235
+ total_capacity: int,
236
+ ) -> bool:
237
+ if option_id in chosen:
238
+ return True
239
+ composite_count = len(chosen.intersection(composite_ids))
240
+ atomic_count = len(chosen) - composite_count
241
+ if option_id in composite_ids:
242
+ composite_count += 1
243
+ else:
244
+ atomic_count += 1
245
+ return (
246
+ composite_count <= composite_capacity
247
+ and atomic_count <= total_capacity - composite_capacity
248
+ and composite_count + atomic_count <= total_capacity
249
+ )
250
+
251
+
252
+ def _memory_support_choices(
253
+ *,
254
+ dose: BoundedPortfolioMemoryDoseContract,
255
+ eligible: tuple[Any, ...],
256
+ chosen: set[str],
257
+ composite_ids: set[str],
258
+ composite_capacity: int,
259
+ total_capacity: int,
260
+ ) -> tuple[str, ...]:
261
+ """Choose enough compatible members without objective or prose ranking."""
262
+
263
+ dose.__post_init__()
264
+ eligible_by_id = {value.option_id: value for value in eligible}
265
+ result: list[str] = []
266
+ occupied: set[str] = set()
267
+ for support in dose.card_supports:
268
+ compatible = tuple(
269
+ option_id
270
+ for option_id, identity in support.compatible_options
271
+ if option_id in eligible_by_id
272
+ and eligible_by_id[option_id].identity_sha256 == identity
273
+ )
274
+ selected = next(
275
+ (value for value in compatible if value in chosen and value not in occupied),
276
+ None,
277
+ )
278
+ if selected is None:
279
+ selected = next(
280
+ (
281
+ value
282
+ for value in compatible
283
+ if value not in occupied
284
+ and _fits_hierarchy(
285
+ value,
286
+ chosen=chosen | set(result),
287
+ composite_ids=composite_ids,
288
+ composite_capacity=composite_capacity,
289
+ total_capacity=total_capacity,
290
+ )
291
+ ),
292
+ None,
293
+ )
294
+ if selected is None:
295
+ raise ProviderFreeCalibratedConformanceError(
296
+ f"no distinct legal support option for assigned card {support.card_key}"
297
+ )
298
+ result.append(selected)
299
+ occupied.add(selected)
300
+
301
+ lower, upper = dose.proposed_supported_member_bounds
302
+ maximum_supported = min(
303
+ upper,
304
+ total_capacity - dose.minimum_unattributed_proposed_members,
305
+ )
306
+ if lower > maximum_supported:
307
+ raise ProviderFreeCalibratedConformanceError(
308
+ "memory-dose bounds cannot fit the calibrated proposal width"
309
+ )
310
+ compatible_union = tuple(
311
+ option_id
312
+ for option in eligible
313
+ for option_id in (option.option_id,)
314
+ if any(
315
+ support.supports(option.option_id, option.identity_sha256)
316
+ for support in dose.card_supports
317
+ )
318
+ )
319
+ for option_id in compatible_union:
320
+ if len(set(result)) >= lower:
321
+ break
322
+ if option_id in result or not _fits_hierarchy(
323
+ option_id,
324
+ chosen=chosen | set(result),
325
+ composite_ids=composite_ids,
326
+ composite_capacity=composite_capacity,
327
+ total_capacity=total_capacity,
328
+ ):
329
+ continue
330
+ result.append(option_id)
331
+ if len(set(result)) < lower:
332
+ raise ProviderFreeCalibratedConformanceError(
333
+ "finite candidate universe cannot realize the memory-dose lower bound"
334
+ )
335
+ return tuple(dict.fromkeys(result))
336
+
337
+
338
+ def _select_option_ids(
339
+ output_type: type[BaseModel],
340
+ eligible: tuple[Any, ...],
341
+ bindings: dict[str, tuple[str, str]],
342
+ ) -> tuple[tuple[str, ...], tuple[str, ...]]:
343
+ proposal_width = 8
344
+ required_composites = getattr(output_type, "required_composite_proposals", 0)
345
+ if type(required_composites) is not int or not (
346
+ 0 <= required_composites < proposal_width
347
+ ):
348
+ raise ProviderFreeCalibratedConformanceError(
349
+ "calibrated output publishes an invalid composite count"
350
+ )
351
+ eligible_ids = tuple(value.option_id for value in eligible)
352
+ composite_ids = {
353
+ value.option_id for value in eligible if _is_composite(value, bindings)
354
+ }
355
+ required_support = tuple(
356
+ sorted(getattr(output_type, "required_proposal_support_option_ids", ()))
357
+ )
358
+ if not set(required_support).issubset(eligible_ids):
359
+ raise ProviderFreeCalibratedConformanceError(
360
+ "proposal-support reservation escapes the finite universe"
361
+ )
362
+ witness = _evaluation_witness(output_type, eligible_ids)
363
+ mandatory = set(required_support) | set(witness)
364
+ if len(mandatory) > proposal_width or any(
365
+ not _fits_hierarchy(
366
+ option_id,
367
+ chosen=mandatory - {option_id},
368
+ composite_ids=composite_ids,
369
+ composite_capacity=required_composites,
370
+ total_capacity=proposal_width,
371
+ )
372
+ for option_id in mandatory
373
+ ):
374
+ raise ProviderFreeCalibratedConformanceError(
375
+ "proposal reservations and evaluator witness exceed K8 capacity"
376
+ )
377
+ dose = getattr(output_type, "memory_dose_contract", None)
378
+ if dose is not None:
379
+ mandatory.update(
380
+ _memory_support_choices(
381
+ dose=dose,
382
+ eligible=eligible,
383
+ chosen=mandatory,
384
+ composite_ids=composite_ids,
385
+ composite_capacity=required_composites,
386
+ total_capacity=proposal_width,
387
+ )
388
+ )
389
+ for target_composite, candidate_ids in (
390
+ (True, tuple(value for value in eligible_ids if value in composite_ids)),
391
+ (False, tuple(value for value in eligible_ids if value not in composite_ids)),
392
+ ):
393
+ target_count = (
394
+ required_composites
395
+ if target_composite
396
+ else proposal_width - required_composites
397
+ )
398
+ current_count = len(
399
+ mandatory.intersection(composite_ids)
400
+ if target_composite
401
+ else mandatory - composite_ids
402
+ )
403
+ for option_id in candidate_ids:
404
+ if current_count == target_count:
405
+ break
406
+ if option_id not in mandatory:
407
+ mandatory.add(option_id)
408
+ current_count += 1
409
+ if current_count != target_count:
410
+ raise ProviderFreeCalibratedConformanceError(
411
+ "finite universe cannot fill the exact hierarchical K8"
412
+ )
413
+ selected = tuple(value for value in eligible_ids if value in mandatory)
414
+ if (
415
+ len(selected) != proposal_width
416
+ or len(set(selected)) != proposal_width
417
+ or len(set(selected).intersection(composite_ids)) != required_composites
418
+ ):
419
+ raise ProviderFreeCalibratedConformanceError(
420
+ "derived calibrated proposal slate does not close"
421
+ )
422
+ return selected, witness
423
+
424
+
425
+ def _supporting_cards_by_option(
426
+ *,
427
+ output_type: type[BaseModel],
428
+ selected: tuple[Any, ...],
429
+ ) -> dict[str, tuple[str, ...]]:
430
+ assigned_cards = tuple(sorted(output_type.assigned_card_keys))
431
+ if not assigned_cards:
432
+ return {option.option_id: () for option in selected}
433
+ dose = output_type.memory_dose_contract
434
+ if dose is None:
435
+ return {
436
+ option.option_id: (
437
+ assigned_cards if index == 0 else (assigned_cards[0],)
438
+ )
439
+ for index, option in enumerate(selected)
440
+ }
441
+ dose.__post_init__()
442
+ assignments: dict[str, list[str]] = {
443
+ option.option_id: [] for option in selected
444
+ }
445
+ for support in dose.card_supports:
446
+ target = next(
447
+ (
448
+ option
449
+ for option in selected
450
+ if len(assignments[option.option_id])
451
+ < dose.maximum_cards_per_member
452
+ and support.supports(option.option_id, option.identity_sha256)
453
+ ),
454
+ None,
455
+ )
456
+ if target is None:
457
+ raise ProviderFreeCalibratedConformanceError(
458
+ f"selected K8 cannot attribute assigned card {support.card_key}"
459
+ )
460
+ assignments[target.option_id].append(support.card_key)
461
+ lower, _ = dose.proposed_supported_member_bounds
462
+ while sum(bool(value) for value in assignments.values()) < lower:
463
+ target_pair = next(
464
+ (
465
+ (option, support)
466
+ for option in selected
467
+ if not assignments[option.option_id]
468
+ for support in dose.card_supports
469
+ if support.supports(option.option_id, option.identity_sha256)
470
+ ),
471
+ None,
472
+ )
473
+ if target_pair is None:
474
+ raise ProviderFreeCalibratedConformanceError(
475
+ "selected K8 cannot realize its supported-member lower bound"
476
+ )
477
+ option, support = target_pair
478
+ assignments[option.option_id].append(support.card_key)
479
+ return {
480
+ option_id: tuple(card_keys)
481
+ for option_id, card_keys in assignments.items()
482
+ }
483
+
484
+
485
+ class ProviderFreeCalibratedPortfolioRunner:
486
+ """Callable local runner over the real calibrated structured-output port."""
487
+
488
+ def __init__(self) -> None:
489
+ self.calls = 0
490
+ self.records: list[dict[str, object]] = []
491
+
492
+ async def __call__(
493
+ self,
494
+ request: StructuredGenerationRequest[Any],
495
+ ) -> StructuredGenerationResponse[Any]:
496
+ request.__post_init__()
497
+ if not issubclass(request.output_type, BaseModel):
498
+ raise ProviderFreeCalibratedConformanceError(
499
+ "calibrated output type must be a Pydantic model"
500
+ )
501
+ output_type = request.output_type
502
+ member_types = _member_model_types(output_type)
503
+ metric_ids = _metric_ids(member_types)
504
+ bindings = _composite_bindings(member_types)
505
+ eligible = _eligible_options(output_type)
506
+ selected_ids, witness = _select_option_ids(
507
+ output_type,
508
+ eligible,
509
+ bindings,
510
+ )
511
+ option_by_id = {value.option_id: value for value in eligible}
512
+ selected = tuple(option_by_id[value] for value in selected_ids)
513
+ cards_by_option = _supporting_cards_by_option(
514
+ output_type=output_type,
515
+ selected=selected,
516
+ )
517
+ # A bounded dose is rank-addressed by the downstream assessment: the
518
+ # supported treatment member must occupy the leading proposal rank so
519
+ # the remaining members are an explicit neutral control stratum. The
520
+ # ordering is derived only from the typed dose contract, remains stable
521
+ # within both strata, and is workload/model/provider independent.
522
+ selected = tuple(
523
+ sorted(
524
+ selected,
525
+ key=lambda option: not bool(cards_by_option[option.option_id]),
526
+ )
527
+ )
528
+ selected_ids = tuple(option.option_id for option in selected)
529
+ members: list[dict[str, object]] = []
530
+ for index, option in enumerate(selected):
531
+ common: dict[str, object] = {
532
+ "supporting_card_keys": list(cards_by_option[option.option_id]),
533
+ "effect_predictions": [
534
+ {
535
+ "metric_id": metric_id,
536
+ "direction": "unknown",
537
+ "confidence": "unknown",
538
+ }
539
+ for metric_id in metric_ids
540
+ ],
541
+ "role_proposal": (
542
+ "exploit" if index < 4 else "falsify" if index < 7 else "coverage"
543
+ ),
544
+ "design_rationale": (
545
+ "Outcome-blind provider-free conformance proposal derived "
546
+ "from the sealed finite action contract."
547
+ ),
548
+ }
549
+ if option.option_id in bindings:
550
+ members.append(
551
+ {
552
+ "action_kind": "compose_r2",
553
+ "composite_option_id": option.option_id,
554
+ "component_option_ids": list(bindings[option.option_id]),
555
+ **common,
556
+ }
557
+ )
558
+ elif bindings:
559
+ members.append(
560
+ {
561
+ "action_kind": "atomic",
562
+ "option_id": option.option_id,
563
+ **common,
564
+ }
565
+ )
566
+ else:
567
+ members.append({"option_id": option.option_id, **common})
568
+ value = output_type.model_validate({"members": members}, strict=True)
569
+ self.calls += 1
570
+ self.records.append(
571
+ ProviderFreeCalibratedCallRecord(
572
+ call_id=request.call_id.value,
573
+ proposal_option_ids=selected_ids,
574
+ supporting_card_keys_by_member=tuple(
575
+ cards_by_option[value] for value in selected_ids
576
+ ),
577
+ assigned_card_keys=tuple(sorted(output_type.assigned_card_keys)),
578
+ evaluation_witness_option_ids=witness,
579
+ required_proposal_support_option_ids=tuple(
580
+ sorted(output_type.required_proposal_support_option_ids)
581
+ ),
582
+ required_composite_proposals=output_type.required_composite_proposals,
583
+ bounded_memory_dose=output_type.memory_dose_contract is not None,
584
+ ).to_record()
585
+ )
586
+ return StructuredGenerationResponse(
587
+ value=value,
588
+ requested_model="provider-free/calibrated-conformance",
589
+ resolved_model="provider-free/calibrated-conformance",
590
+ resolved_provider="local-deterministic-conformance",
591
+ provider_response_id=None,
592
+ finish_reason="policy_completed",
593
+ input_tokens=0,
594
+ output_tokens=0,
595
+ reasoning_tokens=0,
596
+ cache_read_tokens=0,
597
+ cache_write_tokens=0,
598
+ cost_usd=Decimal("0"),
599
+ latency_ns=0,
600
+ )
601
+
602
+
603
+ __all__ = [
604
+ "ProviderFreeCalibratedCallRecord",
605
+ "ProviderFreeCalibratedConformanceError",
606
+ "ProviderFreeCalibratedPortfolioRunner",
607
+ ]