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,383 @@
1
+ """Sealed replay of validated hierarchical residual proposal decisions.
2
+
3
+ Provider-wire replay and semantic-decision replay have different authorities.
4
+ An output accepted after a bounded schema-repair prompt must not be presented
5
+ as an output from the original wire prompt. Its validated domain decision can
6
+ nevertheless be replayed for the exact semantic request that produced it.
7
+ This module implements that higher boundary without changing the live policy.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ from dataclasses import dataclass, field
13
+ import hashlib
14
+ import json
15
+ import re
16
+ from typing import Any, Callable, cast
17
+
18
+ from agent_evolve.application.residual_reachability import (
19
+ HierarchicalResidualPlan,
20
+ ResidualProposalRole,
21
+ )
22
+ from agent_evolve.domain.ids import CandidateId, LLMCallId
23
+ from agent_evolve.domain.patch import require_sha256
24
+ from agent_evolve.integrations.pydantic_ai.residual_reachability import (
25
+ HierarchicalResidualMetricForecast,
26
+ HierarchicalResidualProposalRequest,
27
+ HierarchicalResidualProposalSelection,
28
+ )
29
+ from agent_evolve.ports.agentic_generator import AgenticCallTelemetry
30
+
31
+
32
+ _TOKEN = re.compile(r"^[a-z][a-z0-9_.-]{0,95}$")
33
+ _DECISION_DOMAIN = b"agent-evolve:hierarchical-residual-proposal-decision:v2\x00"
34
+ _REPLAY_DECISION_DOMAIN = (
35
+ b"agent-evolve:sealed-hierarchical-residual-proposal-replay:v1\x00"
36
+ )
37
+
38
+
39
+ def _canonical_bytes(value: object) -> bytes:
40
+ return json.dumps(
41
+ value,
42
+ allow_nan=False,
43
+ ensure_ascii=True,
44
+ separators=(",", ":"),
45
+ sort_keys=True,
46
+ ).encode("ascii", errors="strict")
47
+
48
+
49
+ def _hash(domain: bytes, value: object) -> str:
50
+ return hashlib.sha256(domain + _canonical_bytes(value)).hexdigest()
51
+
52
+
53
+ def hierarchical_residual_proposal_selection_from_record(
54
+ record: object,
55
+ *,
56
+ telemetry: AgenticCallTelemetry,
57
+ ) -> HierarchicalResidualProposalSelection:
58
+ """Rebuild and authenticate one durable semantic proposal decision."""
59
+
60
+ if type(record) is not dict:
61
+ raise TypeError("selection record must be an exact dict")
62
+ if type(telemetry) is not AgenticCallTelemetry:
63
+ raise TypeError("telemetry must be an exact AgenticCallTelemetry")
64
+ AgenticCallTelemetry.__post_init__(telemetry)
65
+ source = cast(dict[str, object], record)
66
+ plan_records = source.get("plans")
67
+ rationale_records = source.get("rationales")
68
+ probability_records = source.get("probability_valid_hex")
69
+ prediction_groups = source.get("effect_predictions")
70
+ if type(plan_records) is not list or not plan_records:
71
+ raise ValueError("selection record plans must be a non-empty exact list")
72
+ if type(rationale_records) is not list:
73
+ raise TypeError("selection record rationales must be an exact list")
74
+ if type(probability_records) is not list:
75
+ raise TypeError(
76
+ "selection record probability_valid_hex must be an exact list"
77
+ )
78
+ if type(prediction_groups) is not list:
79
+ raise TypeError(
80
+ "selection record effect_predictions must be an exact list"
81
+ )
82
+ if not (
83
+ len(plan_records)
84
+ == len(rationale_records)
85
+ == len(probability_records)
86
+ == len(prediction_groups)
87
+ ):
88
+ raise ValueError("selection record member fields do not align")
89
+
90
+ decision_sha256 = source.get("decision_sha256")
91
+ request_sha256 = source.get("request_sha256")
92
+ require_sha256(decision_sha256, "decision_sha256")
93
+ require_sha256(request_sha256, "request_sha256")
94
+ plans: list[HierarchicalResidualPlan] = []
95
+ forecasts: list[tuple[HierarchicalResidualMetricForecast, ...]] = []
96
+ probability_valid: list[float] = []
97
+ rationales: list[str] = []
98
+ draft_members: list[dict[str, object]] = []
99
+ for plan_record, rationale, probability_hex, prediction_records in zip(
100
+ plan_records,
101
+ rationale_records,
102
+ probability_records,
103
+ prediction_groups,
104
+ strict=True,
105
+ ):
106
+ if type(plan_record) is not dict:
107
+ raise TypeError("selection plan record must be an exact dict")
108
+ if type(rationale) is not str or not rationale:
109
+ raise ValueError("selection rationale must be a non-empty exact str")
110
+ if type(probability_hex) is not str:
111
+ raise TypeError("probability_valid_hex must contain exact strings")
112
+ if type(prediction_records) is not list or not prediction_records:
113
+ raise ValueError(
114
+ "effect prediction group must be a non-empty exact list"
115
+ )
116
+ plan_source = cast(dict[str, object], plan_record)
117
+ component_ids = plan_source.get("component_option_ids")
118
+ if type(component_ids) is not list:
119
+ raise TypeError("component_option_ids must be an exact list")
120
+ plan = HierarchicalResidualPlan(
121
+ parent_candidate_id=CandidateId(
122
+ cast(str, plan_source.get("parent_candidate_id"))
123
+ ),
124
+ parent_contract_sha256=cast(
125
+ str, plan_source.get("parent_contract_sha256")
126
+ ),
127
+ action_schema_sha256=cast(
128
+ str, plan_source.get("action_schema_sha256")
129
+ ),
130
+ component_option_ids=tuple(component_ids),
131
+ role=ResidualProposalRole(cast(str, plan_source.get("role"))),
132
+ expert_id=cast(str, plan_source.get("expert_id")),
133
+ expert_definition_sha256=cast(
134
+ str, plan_source.get("expert_definition_sha256")
135
+ ),
136
+ native_rank=cast(int, plan_source.get("native_rank")),
137
+ decision_receipt_sha256=cast(
138
+ str, plan_source.get("decision_receipt_sha256")
139
+ ),
140
+ )
141
+ if plan.decision_receipt_sha256 != decision_sha256:
142
+ raise ValueError("plan decision receipt differs from selection")
143
+ parsed_predictions: list[HierarchicalResidualMetricForecast] = []
144
+ draft_predictions: list[dict[str, object]] = []
145
+ for prediction_record in prediction_records:
146
+ if type(prediction_record) is not dict:
147
+ raise TypeError("metric forecast record must be an exact dict")
148
+ prediction_source = cast(dict[str, object], prediction_record)
149
+ metric_id = prediction_source.get("metric_id")
150
+ hex_values = tuple(
151
+ prediction_source.get(name)
152
+ for name in (
153
+ "p10_delta_hex",
154
+ "p50_delta_hex",
155
+ "p90_delta_hex",
156
+ "confidence_hex",
157
+ )
158
+ )
159
+ if type(metric_id) is not str or not metric_id:
160
+ raise ValueError("metric forecast ID must be non-empty")
161
+ if any(type(value) is not str for value in hex_values):
162
+ raise TypeError("metric forecast hex values must be exact strings")
163
+ p10_hex, p50_hex, p90_hex, confidence_hex = cast(
164
+ tuple[str, str, str, str],
165
+ hex_values,
166
+ )
167
+ prediction = HierarchicalResidualMetricForecast(
168
+ metric_id=metric_id,
169
+ p10_delta=float.fromhex(p10_hex),
170
+ p50_delta=float.fromhex(p50_hex),
171
+ p90_delta=float.fromhex(p90_hex),
172
+ confidence=float.fromhex(confidence_hex),
173
+ )
174
+ parsed_predictions.append(prediction)
175
+ draft_predictions.append(
176
+ {
177
+ "metric_id": prediction.metric_id,
178
+ "p10_delta": prediction.p10_delta,
179
+ "p50_delta": prediction.p50_delta,
180
+ "p90_delta": prediction.p90_delta,
181
+ "confidence": prediction.confidence,
182
+ }
183
+ )
184
+ probability = float.fromhex(probability_hex)
185
+ plans.append(plan)
186
+ rationales.append(rationale)
187
+ probability_valid.append(probability)
188
+ forecasts.append(tuple(parsed_predictions))
189
+ draft_members.append(
190
+ {
191
+ "parent_candidate_id": plan.parent_candidate_id.value,
192
+ "component_option_ids": list(plan.component_option_ids),
193
+ "role": plan.role.value,
194
+ "probability_valid": probability,
195
+ "effect_predictions": draft_predictions,
196
+ "interaction_rationale": rationale,
197
+ }
198
+ )
199
+
200
+ slate_rationale = source.get("slate_rationale")
201
+ if type(slate_rationale) is not str or not slate_rationale:
202
+ raise ValueError("slate_rationale must be a non-empty exact str")
203
+ expected_decision_sha256 = _hash(
204
+ _DECISION_DOMAIN,
205
+ {
206
+ "schema_version": 1,
207
+ "request_sha256": request_sha256,
208
+ "members": draft_members,
209
+ "slate_rationale": slate_rationale,
210
+ },
211
+ )
212
+ if expected_decision_sha256 != decision_sha256:
213
+ raise ValueError("selection decision digest does not close")
214
+ result = HierarchicalResidualProposalSelection(
215
+ request_sha256=cast(str, request_sha256),
216
+ decision_sha256=cast(str, decision_sha256),
217
+ plans=tuple(plans),
218
+ rationales=tuple(rationales),
219
+ probability_valid=tuple(probability_valid),
220
+ effect_predictions=tuple(forecasts),
221
+ slate_rationale=slate_rationale,
222
+ telemetry=telemetry,
223
+ )
224
+ if result.to_record() != source:
225
+ raise ValueError("selection record is not exact canonical output")
226
+ return result
227
+
228
+
229
+ class HierarchicalResidualProposalReplayError(RuntimeError):
230
+ """A sealed semantic decision cannot serve the current request."""
231
+
232
+
233
+ @dataclass(slots=True)
234
+ class SealedHierarchicalResidualProposalReplayThenLivePolicy:
235
+ """Replay exact semantic decisions, then allow an explicit live suffix."""
236
+
237
+ source_id: str
238
+ source_identity_sha256: str
239
+ sealed_selections: tuple[HierarchicalResidualProposalSelection, ...]
240
+ live_policy: Any
241
+ allowed_live_call_ids: tuple[str, ...] = ()
242
+ decision_receipt_sink: Callable[[dict[str, object]], None] | None = None
243
+ _remaining: dict[str, HierarchicalResidualProposalSelection] = field(
244
+ init=False,
245
+ repr=False,
246
+ )
247
+
248
+ def __post_init__(self) -> None:
249
+ if type(self.source_id) is not str or _TOKEN.fullmatch(self.source_id) is None:
250
+ raise ValueError("source_id must use the closed token grammar")
251
+ require_sha256(self.source_identity_sha256, "source_identity_sha256")
252
+ if (
253
+ type(self.sealed_selections) is not tuple
254
+ or any(
255
+ type(value) is not HierarchicalResidualProposalSelection
256
+ for value in self.sealed_selections
257
+ )
258
+ ):
259
+ raise TypeError("sealed_selections must contain exact selections")
260
+ for value in self.sealed_selections:
261
+ value.__post_init__()
262
+ request_ids = tuple(value.request_sha256 for value in self.sealed_selections)
263
+ if len(set(request_ids)) != len(request_ids):
264
+ raise ValueError("sealed selections repeat a semantic request")
265
+ if not callable(getattr(self.live_policy, "select", None)):
266
+ raise TypeError("live_policy must expose an async select method")
267
+ if (
268
+ type(self.allowed_live_call_ids) is not tuple
269
+ or any(type(value) is not str for value in self.allowed_live_call_ids)
270
+ or len(set(self.allowed_live_call_ids))
271
+ != len(self.allowed_live_call_ids)
272
+ ):
273
+ raise TypeError("allowed_live_call_ids must be a unique exact tuple")
274
+ for value in self.allowed_live_call_ids:
275
+ LLMCallId(value).__post_init__()
276
+ if self.decision_receipt_sink is not None and not callable(
277
+ self.decision_receipt_sink
278
+ ):
279
+ raise TypeError("decision_receipt_sink must be callable or None")
280
+ self._remaining = {
281
+ value.request_sha256: value for value in self.sealed_selections
282
+ }
283
+
284
+ @property
285
+ def remaining_selection_count(self) -> int:
286
+ return len(self._remaining)
287
+
288
+ def assert_consumed(self) -> None:
289
+ if self._remaining:
290
+ raise HierarchicalResidualProposalReplayError(
291
+ "sealed semantic proposal decisions remain unconsumed"
292
+ )
293
+
294
+ def _publish(
295
+ self,
296
+ *,
297
+ decision: str,
298
+ request: HierarchicalResidualProposalRequest,
299
+ selection: HierarchicalResidualProposalSelection,
300
+ ) -> None:
301
+ if self.decision_receipt_sink is None:
302
+ return
303
+ unsigned: dict[str, object] = {
304
+ "schema_version": 1,
305
+ "decision": decision,
306
+ "source_id": self.source_id,
307
+ "source_identity_sha256": self.source_identity_sha256,
308
+ "current_call_id": request.call_id.value,
309
+ "current_request_sha256": request.request_sha256,
310
+ "selection_decision_sha256": selection.decision_sha256,
311
+ }
312
+ self.decision_receipt_sink(
313
+ {
314
+ **unsigned,
315
+ "decision_receipt_sha256": _hash(
316
+ _REPLAY_DECISION_DOMAIN,
317
+ unsigned,
318
+ ),
319
+ }
320
+ )
321
+
322
+ async def select(
323
+ self,
324
+ request: HierarchicalResidualProposalRequest,
325
+ ) -> HierarchicalResidualProposalSelection:
326
+ request.__post_init__()
327
+ request_sha256 = request.request_sha256
328
+ replayed = self._remaining.pop(request_sha256, None)
329
+ if replayed is not None:
330
+ for plan in replayed.plans:
331
+ if (
332
+ plan.action_schema_sha256
333
+ != request.action_schema.schema_sha256
334
+ or plan.expert_id != request.expert_id
335
+ or plan.expert_definition_sha256
336
+ != request.expert_definition_sha256
337
+ or plan.radius not in request.allowed_radii
338
+ or plan.role not in request.allowed_roles
339
+ ):
340
+ raise HierarchicalResidualProposalReplayError(
341
+ "sealed semantic selection differs from current contract"
342
+ )
343
+ expected_contract = request.action_schema.contract_for(
344
+ plan.parent_candidate_id
345
+ )
346
+ if (
347
+ expected_contract.identity_sha256
348
+ != plan.parent_contract_sha256
349
+ ):
350
+ raise HierarchicalResidualProposalReplayError(
351
+ "sealed parent contract differs from current contract"
352
+ )
353
+ self._publish(
354
+ decision="replayed",
355
+ request=request,
356
+ selection=replayed,
357
+ )
358
+ return replayed
359
+ if request.call_id.value not in self.allowed_live_call_ids:
360
+ raise HierarchicalResidualProposalReplayError(
361
+ "no sealed decision exists and live execution is unauthorized"
362
+ )
363
+ live = await self.live_policy.select(request)
364
+ if (
365
+ type(live) is not HierarchicalResidualProposalSelection
366
+ or live.request_sha256 != request_sha256
367
+ ):
368
+ raise HierarchicalResidualProposalReplayError(
369
+ "live policy returned a foreign semantic decision"
370
+ )
371
+ self._publish(
372
+ decision="live_after_prefix",
373
+ request=request,
374
+ selection=live,
375
+ )
376
+ return live
377
+
378
+
379
+ __all__ = [
380
+ "HierarchicalResidualProposalReplayError",
381
+ "SealedHierarchicalResidualProposalReplayThenLivePolicy",
382
+ "hierarchical_residual_proposal_selection_from_record",
383
+ ]
@@ -0,0 +1,135 @@
1
+ """One workload-neutral composition root for the adaptive residual portfolio."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from dataclasses import dataclass
6
+
7
+ from agent_evolve.application.action_score_authorities import (
8
+ NativeRankMaterializedActionScorer,
9
+ TargetEmpiricalReturnMaterializedActionScorer,
10
+ )
11
+ from agent_evolve.application.frozen_hurdle_score import (
12
+ FrozenHurdleScoreKind,
13
+ FrozenStandardizedLinearModel,
14
+ MaterializedActionFeatureProjectionPort,
15
+ )
16
+ from agent_evolve.application.materialized_action_broker import (
17
+ RegretBrokeredMaterializedActionPolicy,
18
+ )
19
+ from agent_evolve.application.prequential_score_portfolio import (
20
+ ReliabilityAdaptiveScorePortfolioPolicy,
21
+ )
22
+ from agent_evolve.application.support_guarded_hurdle_score import (
23
+ FrozenFeatureSupportGroup,
24
+ SupportGuardedFrozenHurdleMaterializedActionScorer,
25
+ )
26
+ from agent_evolve.ports.hard_feasibility import HardFeasibilityPort
27
+
28
+ from .portable_residual_consequence_features import (
29
+ PORTABLE_RESIDUAL_CONSEQUENCE_FEATURE_GROUPS,
30
+ )
31
+
32
+
33
+ PRIMARY_SCORER_ID = "portable_positive_probability"
34
+ RELIABILITY_COMPONENT_IDS = (
35
+ "forecast",
36
+ "parent",
37
+ "proposal_structure",
38
+ )
39
+
40
+
41
+ @dataclass(frozen=True, slots=True)
42
+ class SupportAdaptiveResidualPortfolio:
43
+ """Authenticated scorer bundle and its prequential allocation policy."""
44
+
45
+ primary: SupportGuardedFrozenHurdleMaterializedActionScorer
46
+ provider_native: NativeRankMaterializedActionScorer
47
+ target_empirical: TargetEmpiricalReturnMaterializedActionScorer
48
+ allocation: ReliabilityAdaptiveScorePortfolioPolicy
49
+
50
+ def __post_init__(self) -> None:
51
+ if (
52
+ type(self.primary)
53
+ is not SupportGuardedFrozenHurdleMaterializedActionScorer
54
+ or type(self.provider_native)
55
+ is not NativeRankMaterializedActionScorer
56
+ or type(self.target_empirical)
57
+ is not TargetEmpiricalReturnMaterializedActionScorer
58
+ or type(self.allocation)
59
+ is not ReliabilityAdaptiveScorePortfolioPolicy
60
+ ):
61
+ raise TypeError(
62
+ "support-adaptive portfolio contains a foreign component"
63
+ )
64
+ self.primary.__post_init__()
65
+ self.provider_native.__post_init__()
66
+ self.target_empirical.__post_init__()
67
+ self.allocation.__post_init__()
68
+ if self.allocation.primary_reliability is not self.primary:
69
+ raise ValueError(
70
+ "allocation reliability must be the primary scorer instance"
71
+ )
72
+
73
+
74
+ def compose_support_adaptive_residual_portfolio(
75
+ *,
76
+ projection: MaterializedActionFeatureProjectionPort,
77
+ positive_model: FrozenStandardizedLinearModel,
78
+ magnitude_model: FrozenStandardizedLinearModel,
79
+ source_fit_sha256: str,
80
+ broker: RegretBrokeredMaterializedActionPolicy,
81
+ minimum_primary_fraction: float = 0.5,
82
+ hard_feasibility: HardFeasibilityPort | None = None,
83
+ ) -> SupportAdaptiveResidualPortfolio:
84
+ """Compose the same outcome-blind authority market for any workload."""
85
+
86
+ groups = tuple(
87
+ FrozenFeatureSupportGroup(
88
+ group_id=group_id,
89
+ feature_names=tuple(feature_names),
90
+ )
91
+ for group_id, feature_names in sorted(
92
+ PORTABLE_RESIDUAL_CONSEQUENCE_FEATURE_GROUPS
93
+ )
94
+ )
95
+ primary = SupportGuardedFrozenHurdleMaterializedActionScorer(
96
+ scorer_id=PRIMARY_SCORER_ID,
97
+ projection=projection,
98
+ positive_model=positive_model,
99
+ magnitude_model=magnitude_model,
100
+ score_kind=FrozenHurdleScoreKind.POSITIVE_PROBABILITY,
101
+ source_fit_sha256=source_fit_sha256,
102
+ support_groups=groups,
103
+ )
104
+ provider_native = NativeRankMaterializedActionScorer()
105
+ target_empirical = TargetEmpiricalReturnMaterializedActionScorer(
106
+ broker=broker
107
+ )
108
+ scorers = tuple(
109
+ sorted(
110
+ (primary, provider_native, target_empirical),
111
+ key=lambda value: value.scorer_id,
112
+ )
113
+ )
114
+ allocation = ReliabilityAdaptiveScorePortfolioPolicy(
115
+ scorers=scorers,
116
+ primary_scorer_id=primary.scorer_id,
117
+ primary_reliability=primary,
118
+ reliability_component_ids=RELIABILITY_COMPONENT_IDS,
119
+ minimum_primary_fraction=minimum_primary_fraction,
120
+ hard_feasibility=hard_feasibility,
121
+ )
122
+ return SupportAdaptiveResidualPortfolio(
123
+ primary=primary,
124
+ provider_native=provider_native,
125
+ target_empirical=target_empirical,
126
+ allocation=allocation,
127
+ )
128
+
129
+
130
+ __all__ = [
131
+ "PRIMARY_SCORER_ID",
132
+ "RELIABILITY_COMPONENT_IDS",
133
+ "SupportAdaptiveResidualPortfolio",
134
+ "compose_support_adaptive_residual_portfolio",
135
+ ]
@@ -0,0 +1,143 @@
1
+ """Project residual prompt evidence to an unambiguous numeric interface."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import math
6
+ from dataclasses import dataclass, field
7
+
8
+ from agent_evolve.application.trusted_objective_evidence import (
9
+ TRUSTED_OBJECTIVE_EVIDENCE_CODEC_DEFINITION_SHA256,
10
+ TrustedObjectiveEvidenceCodec,
11
+ )
12
+ from agent_evolve.domain.typed_json import (
13
+ FrozenJsonObject,
14
+ freeze_json,
15
+ thaw_json,
16
+ typed_json_sha256,
17
+ )
18
+
19
+
20
+ _OBJECTIVE_MAP_KEYS = frozenset({"objectives", "real_objectives"})
21
+
22
+
23
+ def _canonical_hex_float(value: object) -> float | None:
24
+ if type(value) is not str:
25
+ return None
26
+ try:
27
+ parsed = float.fromhex(value)
28
+ except ValueError:
29
+ return None
30
+ if not math.isfinite(parsed) or parsed.hex() != value:
31
+ return None
32
+ return parsed
33
+
34
+
35
+ def _hex_collection(value: object) -> object | None:
36
+ scalar = _canonical_hex_float(value)
37
+ if scalar is not None:
38
+ return scalar
39
+ if isinstance(value, list) and value:
40
+ parsed = [_canonical_hex_float(item) for item in value]
41
+ if all(item is not None for item in parsed):
42
+ return parsed
43
+ if isinstance(value, dict) and value:
44
+ parsed_map = {
45
+ str(key): _canonical_hex_float(item)
46
+ for key, item in value.items()
47
+ }
48
+ if all(item is not None for item in parsed_map.values()):
49
+ return parsed_map
50
+ return None
51
+
52
+
53
+ @dataclass(frozen=True, slots=True)
54
+ class TrustedResidualPromptContextProjection:
55
+ """Add numeric twins for disclosed hex values without adding evidence."""
56
+
57
+ codec: TrustedObjectiveEvidenceCodec = field(
58
+ default_factory=TrustedObjectiveEvidenceCodec
59
+ )
60
+
61
+ def project(self, context: FrozenJsonObject) -> FrozenJsonObject:
62
+ if (
63
+ type(context) is not FrozenJsonObject
64
+ or freeze_json(context) is not context
65
+ ):
66
+ raise TypeError("context must be an exact frozen object")
67
+ source_sha256 = typed_json_sha256(context)
68
+ conversion_count = 0
69
+ objective_point_count = 0
70
+
71
+ def visit(value: object) -> object:
72
+ nonlocal conversion_count, objective_point_count
73
+ if isinstance(value, list):
74
+ return [visit(item) for item in value]
75
+ if not isinstance(value, dict):
76
+ return value
77
+ rendered: dict[str, object] = {}
78
+ for raw_key, raw_value in value.items():
79
+ key = str(raw_key)
80
+ if (
81
+ key in _OBJECTIVE_MAP_KEYS
82
+ and isinstance(raw_value, dict)
83
+ and raw_value
84
+ ):
85
+ point: dict[str, float] = {}
86
+ for metric_id, metric_value in raw_value.items():
87
+ parsed = _canonical_hex_float(metric_value)
88
+ if parsed is None:
89
+ if (
90
+ type(metric_value) is not float
91
+ or not math.isfinite(metric_value)
92
+ ):
93
+ raise ValueError(
94
+ "objective prompt values must be finite "
95
+ "floats or canonical binary64 hex"
96
+ )
97
+ parsed = metric_value
98
+ point[str(metric_id)] = parsed
99
+ evidence = thaw_json(self.codec.encode_point(point))
100
+ rendered[key] = evidence["numeric_values"]
101
+ rendered[f"{key}_evidence"] = evidence
102
+ objective_point_count += 1
103
+ continue
104
+ converted = visit(raw_value)
105
+ rendered[key] = converted
106
+ if key.endswith("_hex"):
107
+ numeric = _hex_collection(raw_value)
108
+ if numeric is not None:
109
+ numeric_key = key[:-4]
110
+ if numeric_key in value or numeric_key in rendered:
111
+ raise ValueError(
112
+ "hex prompt evidence collides with an "
113
+ "existing numeric field"
114
+ )
115
+ rendered[numeric_key] = numeric
116
+ conversion_count += 1
117
+ return rendered
118
+
119
+ source = thaw_json(context)
120
+ projected = visit(source)
121
+ if not isinstance(projected, dict):
122
+ raise TypeError("projected context must have an object root")
123
+ projected["trusted_objective_evidence_contract"] = thaw_json(
124
+ self.codec.prompt_contract()
125
+ )
126
+ projected["trusted_prompt_projection"] = {
127
+ "schema_version": 1,
128
+ "source_context_sha256": source_sha256,
129
+ "codec_definition_sha256": (
130
+ TRUSTED_OBJECTIVE_EVIDENCE_CODEC_DEFINITION_SHA256
131
+ ),
132
+ "hex_scalar_or_collection_conversion_count": conversion_count,
133
+ "objective_point_conversion_count": objective_point_count,
134
+ "new_candidate_outcomes_disclosed": False,
135
+ "workload_objective_model_provider_branches": False,
136
+ }
137
+ result = freeze_json(projected)
138
+ if type(result) is not FrozenJsonObject:
139
+ raise TypeError("projected context must have an object root")
140
+ return result
141
+
142
+
143
+ __all__ = ["TrustedResidualPromptContextProjection"]