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,772 @@
1
+ """Outcome-blind factorial pilots for heterogeneous proposal branches.
2
+
3
+ Protecting only a generator branch is insufficient when useful proposals can
4
+ occur in different evolutionary roles and at different positions in an
5
+ uncalibrated within-expert ordering. This module constructs a diagnostic
6
+ pilot over portable, pre-evaluation factors:
7
+
8
+ * an opaque source branch supplied by the composition root;
9
+ * the proposal expert and evolutionary role;
10
+ * a quantile layer of the materialized within-expert rank;
11
+ * parent lineage and operator identity; and
12
+ * exact phenotype identity and normalized evaluation cost.
13
+
14
+ The bounded design never observes candidate outcomes, workload identity,
15
+ model/provider names, objective values, prompts, or configuration contents.
16
+ It returns an allocation requirement; the ordinary outcome-adaptive broker
17
+ continues to fill every unprotected evaluation seat.
18
+ """
19
+
20
+ from __future__ import annotations
21
+
22
+ from collections import Counter
23
+ from dataclasses import dataclass, field
24
+ import hashlib
25
+ import json
26
+ import math
27
+ from typing import Iterable
28
+
29
+ from agent_evolve.application.materialized_action_broker import (
30
+ MaterializedActionAllocationRequirement,
31
+ MaterializedActionDescriptor,
32
+ )
33
+ from agent_evolve.application.protected_branch_pilot import (
34
+ ProtectedBranchBinding,
35
+ )
36
+ from agent_evolve.application.residual_portfolio_evolution import (
37
+ MaterializedActionProposalBatch,
38
+ ResidualPortfolioDecisionRequest,
39
+ )
40
+ from agent_evolve.domain.patch import require_sha256
41
+ from agent_evolve.domain.typed_json import freeze_json
42
+
43
+
44
+ FACTORIAL_BRANCH_PILOT_POLICY_ID = "factorial_branch_pilot"
45
+ FACTORIAL_BRANCH_PILOT_POLICY_VERSION = 1
46
+ _DEFINITION_DOMAIN = b"agent-evolve:factorial-branch-pilot-definition:v1\x00"
47
+ _SELECTION_DOMAIN = b"agent-evolve:factorial-branch-pilot-selection:v1\x00"
48
+
49
+
50
+ def _canonical_json(value: object) -> bytes:
51
+ return json.dumps(
52
+ value,
53
+ allow_nan=False,
54
+ ensure_ascii=True,
55
+ separators=(",", ":"),
56
+ sort_keys=True,
57
+ ).encode("ascii", errors="strict")
58
+
59
+
60
+ def _digest(value: object, *, domain: bytes) -> str:
61
+ return hashlib.sha256(domain + _canonical_json(value)).hexdigest()
62
+
63
+
64
+ @dataclass(frozen=True, slots=True)
65
+ class FactorialPilotCandidate:
66
+ """Portable pre-evaluation view of one materialized proposal."""
67
+
68
+ action_sha256: str
69
+ phenotype_identity_sha256: str
70
+ branch_id: str
71
+ expert_id: str
72
+ role_id: str
73
+ operator_id: str
74
+ materialized_lane_rank: int
75
+ lane_support_count: int
76
+ rank_layer_index: int
77
+ parent_ids: tuple[str, ...]
78
+ normalized_evaluation_cost: float
79
+
80
+ def __post_init__(self) -> None:
81
+ require_sha256(self.action_sha256, "action_sha256")
82
+ require_sha256(
83
+ self.phenotype_identity_sha256,
84
+ "phenotype_identity_sha256",
85
+ )
86
+ for name in ("branch_id", "expert_id", "role_id", "operator_id"):
87
+ value = getattr(self, name)
88
+ if type(value) is not str or not value:
89
+ raise ValueError(f"{name} must be a non-empty exact string")
90
+ for name in ("materialized_lane_rank", "lane_support_count"):
91
+ value = getattr(self, name)
92
+ if type(value) is not int or value <= 0:
93
+ raise ValueError(f"{name} must be a positive exact integer")
94
+ if self.materialized_lane_rank > self.lane_support_count:
95
+ raise ValueError("materialized lane rank exceeds lane support")
96
+ if (
97
+ type(self.rank_layer_index) is not int
98
+ or self.rank_layer_index < 0
99
+ ):
100
+ raise ValueError("rank_layer_index must be a non-negative integer")
101
+ if (
102
+ type(self.parent_ids) is not tuple
103
+ or len(self.parent_ids) > 8
104
+ or len(self.parent_ids) != len(set(self.parent_ids))
105
+ or any(type(value) is not str or not value for value in self.parent_ids)
106
+ ):
107
+ raise ValueError("parent_ids must be a unique exact string tuple")
108
+ if (
109
+ type(self.normalized_evaluation_cost) is not float
110
+ or not math.isfinite(self.normalized_evaluation_cost)
111
+ or not 0.0 <= self.normalized_evaluation_cost <= 1.0
112
+ ):
113
+ raise ValueError(
114
+ "normalized_evaluation_cost must be a finite float in [0, 1]"
115
+ )
116
+
117
+ def to_record(self) -> dict[str, object]:
118
+ self.__post_init__()
119
+ return {
120
+ "action_sha256": self.action_sha256,
121
+ "phenotype_identity_sha256": self.phenotype_identity_sha256,
122
+ "branch_id": self.branch_id,
123
+ "expert_id": self.expert_id,
124
+ "role_id": self.role_id,
125
+ "operator_id": self.operator_id,
126
+ "materialized_lane_rank": self.materialized_lane_rank,
127
+ "lane_support_count": self.lane_support_count,
128
+ "rank_layer_index": self.rank_layer_index,
129
+ "parent_ids": list(self.parent_ids),
130
+ "normalized_evaluation_cost_hex": (
131
+ self.normalized_evaluation_cost.hex()
132
+ ),
133
+ }
134
+
135
+
136
+ @dataclass(frozen=True, slots=True)
137
+ class FactorialPilotSelection:
138
+ """One deterministic bounded factorial design."""
139
+
140
+ selected: tuple[FactorialPilotCandidate, ...]
141
+ branch_quotas: tuple[tuple[str, int], ...]
142
+ rank_layer_count: int
143
+ beam_width: int
144
+ decision_scope_sha256: str
145
+ decision_index: int
146
+ anchor_action_sha256s: tuple[str, ...] = ()
147
+ selection_sha256: str = field(init=False)
148
+
149
+ def __post_init__(self) -> None:
150
+ if type(self.selected) is not tuple or not self.selected:
151
+ raise ValueError("selected must be a non-empty exact tuple")
152
+ for value in self.selected:
153
+ if type(value) is not FactorialPilotCandidate:
154
+ raise TypeError(
155
+ "selected must contain exact FactorialPilotCandidate values"
156
+ )
157
+ value.__post_init__()
158
+ require_sha256(self.decision_scope_sha256, "decision_scope_sha256")
159
+ if type(self.decision_index) is not int or self.decision_index <= 0:
160
+ raise ValueError("decision_index must be a positive exact integer")
161
+ if (
162
+ type(self.rank_layer_count) is not int
163
+ or self.rank_layer_count < 2
164
+ ):
165
+ raise ValueError("rank_layer_count must be at least two")
166
+ if type(self.beam_width) is not int or self.beam_width <= 0:
167
+ raise ValueError("beam_width must be a positive exact integer")
168
+ if (
169
+ type(self.branch_quotas) is not tuple
170
+ or not self.branch_quotas
171
+ or tuple(value[0] for value in self.branch_quotas)
172
+ != tuple(sorted({value[0] for value in self.branch_quotas}))
173
+ or any(
174
+ type(branch_id) is not str
175
+ or not branch_id
176
+ or type(quota) is not int
177
+ or quota <= 0
178
+ for branch_id, quota in self.branch_quotas
179
+ )
180
+ ):
181
+ raise ValueError("branch_quotas must be positive and canonical")
182
+ expected = dict(self.branch_quotas)
183
+ observed = Counter(value.branch_id for value in self.selected)
184
+ if observed != expected:
185
+ raise ValueError("selected candidates do not close branch quotas")
186
+ if len(
187
+ {value.phenotype_identity_sha256 for value in self.selected}
188
+ ) != len(self.selected):
189
+ raise ValueError("selected candidates must have unique phenotypes")
190
+ if any(
191
+ not 0 <= value.rank_layer_index < self.rank_layer_count
192
+ for value in self.selected
193
+ ):
194
+ raise ValueError("selected rank layer lies outside the design")
195
+ if (
196
+ type(self.anchor_action_sha256s) is not tuple
197
+ or self.anchor_action_sha256s
198
+ != tuple(sorted(set(self.anchor_action_sha256s)))
199
+ or not set(self.anchor_action_sha256s)
200
+ <= {value.action_sha256 for value in self.selected}
201
+ ):
202
+ raise ValueError(
203
+ "anchor_action_sha256s must be a canonical selected subset"
204
+ )
205
+ for value in self.anchor_action_sha256s:
206
+ require_sha256(value, "anchor_action_sha256s")
207
+ object.__setattr__(
208
+ self,
209
+ "selection_sha256",
210
+ _digest(self._unsigned_record(), domain=_SELECTION_DOMAIN),
211
+ )
212
+
213
+ def _coverage_record(self) -> dict[str, object]:
214
+ values = self.selected
215
+ return {
216
+ "branch_count": len({value.branch_id for value in values}),
217
+ "expert_count": len({value.expert_id for value in values}),
218
+ "role_count": len({value.role_id for value in values}),
219
+ "rank_layer_count": len(
220
+ {value.rank_layer_index for value in values}
221
+ ),
222
+ "operator_count": len({value.operator_id for value in values}),
223
+ "parent_count": len(
224
+ {parent for value in values for parent in value.parent_ids}
225
+ ),
226
+ "branch_role_cell_count": len(
227
+ {(value.branch_id, value.role_id) for value in values}
228
+ ),
229
+ "branch_rank_layer_cell_count": len(
230
+ {
231
+ (value.branch_id, value.rank_layer_index)
232
+ for value in values
233
+ }
234
+ ),
235
+ "role_rank_layer_cell_count": len(
236
+ {
237
+ (value.role_id, value.rank_layer_index)
238
+ for value in values
239
+ }
240
+ ),
241
+ }
242
+
243
+ def _unsigned_record(self) -> dict[str, object]:
244
+ return {
245
+ "schema_version": 1,
246
+ "decision_scope_sha256": self.decision_scope_sha256,
247
+ "decision_index": self.decision_index,
248
+ "branch_quotas": [
249
+ {"branch_id": branch_id, "pilot_slots": quota}
250
+ for branch_id, quota in self.branch_quotas
251
+ ],
252
+ "rank_layer_count": self.rank_layer_count,
253
+ "beam_width": self.beam_width,
254
+ "anchor_action_sha256s": list(self.anchor_action_sha256s),
255
+ "selected": [value.to_record() for value in self.selected],
256
+ "coverage": self._coverage_record(),
257
+ "candidate_outcomes_observed": False,
258
+ }
259
+
260
+ def to_record(self) -> dict[str, object]:
261
+ self.__post_init__()
262
+ return {
263
+ **self._unsigned_record(),
264
+ "selection_sha256": self.selection_sha256,
265
+ }
266
+
267
+
268
+ def factorial_candidates_from_materialized_actions(
269
+ actions: Iterable[MaterializedActionDescriptor],
270
+ *,
271
+ branch_bindings: tuple[ProtectedBranchBinding, ...],
272
+ rank_layer_count: int,
273
+ ) -> tuple[FactorialPilotCandidate, ...]:
274
+ """Project materialized actions into quantile-layered factor candidates."""
275
+
276
+ if (
277
+ type(branch_bindings) is not tuple
278
+ or len(branch_bindings) < 2
279
+ or any(type(value) is not ProtectedBranchBinding for value in branch_bindings)
280
+ ):
281
+ raise TypeError("branch_bindings must contain at least two bindings")
282
+ for value in branch_bindings:
283
+ value.__post_init__()
284
+ if type(rank_layer_count) is not int or rank_layer_count < 2:
285
+ raise ValueError("rank_layer_count must be at least two")
286
+ expert_to_branch: dict[str, str] = {}
287
+ for binding in branch_bindings:
288
+ for expert_id in binding.expert_ids:
289
+ if expert_id in expert_to_branch:
290
+ raise ValueError("one expert cannot belong to two branches")
291
+ expert_to_branch[expert_id] = binding.branch_id
292
+
293
+ values = tuple(actions)
294
+ if not values:
295
+ raise ValueError("actions must be non-empty")
296
+ for value in values:
297
+ if type(value) is not MaterializedActionDescriptor:
298
+ raise TypeError("actions must contain exact descriptors")
299
+ value.__post_init__()
300
+ if len({value.action_sha256 for value in values}) != len(values):
301
+ raise ValueError("actions repeat an action identity")
302
+
303
+ lanes: dict[str, list[MaterializedActionDescriptor]] = {}
304
+ for value in values:
305
+ if value.expert_id in expert_to_branch:
306
+ lanes.setdefault(value.expert_id, []).append(value)
307
+ absent = set(expert_to_branch) - set(lanes)
308
+ if absent:
309
+ raise ValueError(
310
+ "protected branch names absent proposal experts: "
311
+ + ",".join(sorted(absent))
312
+ )
313
+
314
+ projected: list[FactorialPilotCandidate] = []
315
+ for expert_id, lane_values in sorted(lanes.items()):
316
+ lane = tuple(
317
+ sorted(
318
+ lane_values,
319
+ key=lambda value: (value.native_rank, value.action_sha256),
320
+ )
321
+ )
322
+ for position, value in enumerate(lane):
323
+ layer = min(
324
+ rank_layer_count - 1,
325
+ (position * rank_layer_count) // len(lane),
326
+ )
327
+ projected.append(
328
+ FactorialPilotCandidate(
329
+ action_sha256=value.action_sha256,
330
+ phenotype_identity_sha256=(
331
+ value.phenotype_identity_sha256
332
+ ),
333
+ branch_id=expert_to_branch[expert_id],
334
+ expert_id=expert_id,
335
+ role_id=value.role_id,
336
+ operator_id=value.operator_id,
337
+ materialized_lane_rank=position + 1,
338
+ lane_support_count=len(lane),
339
+ rank_layer_index=layer,
340
+ parent_ids=tuple(parent.value for parent in value.parent_ids),
341
+ normalized_evaluation_cost=(
342
+ value.normalized_evaluation_cost
343
+ ),
344
+ )
345
+ )
346
+ return tuple(
347
+ sorted(projected, key=lambda value: value.action_sha256)
348
+ )
349
+
350
+
351
+ def _design_rank_key(
352
+ selected: tuple[FactorialPilotCandidate, ...],
353
+ *,
354
+ decision_scope_sha256: str,
355
+ decision_index: int,
356
+ ) -> tuple[object, ...]:
357
+ """Return an ascending key for a high-coverage, balanced design."""
358
+
359
+ branch_role = {(value.branch_id, value.role_id) for value in selected}
360
+ branch_layer = {
361
+ (value.branch_id, value.rank_layer_index) for value in selected
362
+ }
363
+ role_layer = {
364
+ (value.role_id, value.rank_layer_index) for value in selected
365
+ }
366
+ role_counts = Counter(value.role_id for value in selected)
367
+ layer_counts = Counter(value.rank_layer_index for value in selected)
368
+ parents = {parent for value in selected for parent in value.parent_ids}
369
+ normalized_rank_depth = math.fsum(
370
+ (
371
+ (value.materialized_lane_rank - 1)
372
+ / (value.lane_support_count - 1)
373
+ if value.lane_support_count > 1
374
+ else 0.0
375
+ )
376
+ for value in selected
377
+ )
378
+ tie_sha = _digest(
379
+ {
380
+ "decision_scope_sha256": decision_scope_sha256,
381
+ "decision_index": decision_index,
382
+ "selected_action_sha256s": sorted(
383
+ value.action_sha256 for value in selected
384
+ ),
385
+ },
386
+ domain=_SELECTION_DOMAIN,
387
+ )
388
+ return (
389
+ -len(branch_role),
390
+ -len(branch_layer),
391
+ -len(role_layer),
392
+ -len({value.expert_id for value in selected}),
393
+ -len({value.rank_layer_index for value in selected}),
394
+ -len(parents),
395
+ -len({value.operator_id for value in selected}),
396
+ -normalized_rank_depth,
397
+ sum(value * value for value in role_counts.values()),
398
+ sum(value * value for value in layer_counts.values()),
399
+ math.fsum(value.normalized_evaluation_cost for value in selected),
400
+ tie_sha,
401
+ tuple(sorted(value.action_sha256 for value in selected)),
402
+ )
403
+
404
+
405
+ def select_factorial_pilot_candidates(
406
+ candidates: tuple[FactorialPilotCandidate, ...],
407
+ *,
408
+ branch_quotas: tuple[tuple[str, int], ...],
409
+ rank_layer_count: int,
410
+ beam_width: int,
411
+ decision_scope_sha256: str,
412
+ decision_index: int,
413
+ anchor_action_sha256s: tuple[str, ...] = (),
414
+ ) -> FactorialPilotSelection:
415
+ """Select or extend a deterministic factorial pilot under exact quotas."""
416
+
417
+ require_sha256(decision_scope_sha256, "decision_scope_sha256")
418
+ if type(decision_index) is not int or decision_index <= 0:
419
+ raise ValueError("decision_index must be a positive exact integer")
420
+ if type(candidates) is not tuple or not candidates:
421
+ raise ValueError("candidates must be a non-empty exact tuple")
422
+ for value in candidates:
423
+ if type(value) is not FactorialPilotCandidate:
424
+ raise TypeError("candidates must contain exact candidate views")
425
+ value.__post_init__()
426
+ if len({value.action_sha256 for value in candidates}) != len(candidates):
427
+ raise ValueError("candidate action identities must be unique")
428
+ if (
429
+ type(branch_quotas) is not tuple
430
+ or not branch_quotas
431
+ or tuple(value[0] for value in branch_quotas)
432
+ != tuple(sorted({value[0] for value in branch_quotas}))
433
+ or any(
434
+ type(branch_id) is not str
435
+ or not branch_id
436
+ or type(quota) is not int
437
+ or quota <= 0
438
+ for branch_id, quota in branch_quotas
439
+ )
440
+ ):
441
+ raise ValueError("branch_quotas must be positive and canonical")
442
+ if type(rank_layer_count) is not int or rank_layer_count < 2:
443
+ raise ValueError("rank_layer_count must be at least two")
444
+ if type(beam_width) is not int or beam_width <= 0:
445
+ raise ValueError("beam_width must be a positive exact integer")
446
+ quota_by_branch = dict(branch_quotas)
447
+ candidate_branches = {value.branch_id for value in candidates}
448
+ if candidate_branches != set(quota_by_branch):
449
+ raise ValueError("candidate and quota branch sets must match exactly")
450
+ for branch_id, quota in branch_quotas:
451
+ unique = {
452
+ value.phenotype_identity_sha256
453
+ for value in candidates
454
+ if value.branch_id == branch_id
455
+ }
456
+ if len(unique) < quota:
457
+ raise ValueError(
458
+ f"branch {branch_id} lacks a phenotype-unique quota witness"
459
+ )
460
+
461
+ if (
462
+ type(anchor_action_sha256s) is not tuple
463
+ or anchor_action_sha256s
464
+ != tuple(sorted(set(anchor_action_sha256s)))
465
+ ):
466
+ raise ValueError("anchor_action_sha256s must be a canonical tuple")
467
+ candidate_by_action = {
468
+ value.action_sha256: value for value in candidates
469
+ }
470
+ if not set(anchor_action_sha256s) <= set(candidate_by_action):
471
+ raise ValueError("factorial pilot anchor is absent from candidates")
472
+ anchors = tuple(
473
+ candidate_by_action[value] for value in anchor_action_sha256s
474
+ )
475
+ if len(
476
+ {value.phenotype_identity_sha256 for value in anchors}
477
+ ) != len(anchors):
478
+ raise ValueError("factorial pilot anchors repeat a phenotype")
479
+ anchor_counts = Counter(value.branch_id for value in anchors)
480
+ if any(
481
+ anchor_counts.get(branch_id, 0) > quota
482
+ for branch_id, quota in branch_quotas
483
+ ):
484
+ raise ValueError("factorial pilot anchors exceed a branch quota")
485
+ tickets = tuple(
486
+ branch_id
487
+ for ordinal in range(
488
+ max(
489
+ quota_by_branch[branch_id]
490
+ - anchor_counts.get(branch_id, 0)
491
+ for branch_id in quota_by_branch
492
+ )
493
+ )
494
+ for branch_id, quota in branch_quotas
495
+ if ordinal < quota - anchor_counts.get(branch_id, 0)
496
+ )
497
+ beam: tuple[tuple[FactorialPilotCandidate, ...], ...] = (anchors,)
498
+ candidate_order = tuple(
499
+ sorted(candidates, key=lambda value: value.action_sha256)
500
+ )
501
+ for branch_id in tickets:
502
+ expanded: dict[
503
+ tuple[str, ...],
504
+ tuple[FactorialPilotCandidate, ...],
505
+ ] = {}
506
+ for state in beam:
507
+ used_actions = {value.action_sha256 for value in state}
508
+ used_phenotypes = {
509
+ value.phenotype_identity_sha256 for value in state
510
+ }
511
+ for candidate in candidate_order:
512
+ if (
513
+ candidate.branch_id != branch_id
514
+ or candidate.action_sha256 in used_actions
515
+ or candidate.phenotype_identity_sha256 in used_phenotypes
516
+ ):
517
+ continue
518
+ successor = (*state, candidate)
519
+ key = tuple(
520
+ sorted(value.action_sha256 for value in successor)
521
+ )
522
+ expanded.setdefault(key, successor)
523
+ if not expanded:
524
+ raise ValueError(
525
+ "factorial pilot has no cross-branch unique-phenotype witness"
526
+ )
527
+ beam = tuple(
528
+ sorted(
529
+ expanded.values(),
530
+ key=lambda value: _design_rank_key(
531
+ value,
532
+ decision_scope_sha256=decision_scope_sha256,
533
+ decision_index=decision_index,
534
+ ),
535
+ )[:beam_width]
536
+ )
537
+
538
+ selected = min(
539
+ beam,
540
+ key=lambda value: _design_rank_key(
541
+ value,
542
+ decision_scope_sha256=decision_scope_sha256,
543
+ decision_index=decision_index,
544
+ ),
545
+ )
546
+ return FactorialPilotSelection(
547
+ selected=selected,
548
+ branch_quotas=branch_quotas,
549
+ rank_layer_count=rank_layer_count,
550
+ beam_width=beam_width,
551
+ decision_scope_sha256=decision_scope_sha256,
552
+ decision_index=decision_index,
553
+ anchor_action_sha256s=anchor_action_sha256s,
554
+ )
555
+
556
+
557
+ @dataclass(frozen=True, slots=True)
558
+ class FactorialBranchPilotPolicy:
559
+ """Reserve a portable factorial diagnostic pilot before adaptation."""
560
+
561
+ branch_bindings: tuple[ProtectedBranchBinding, ...]
562
+ rank_layer_count: int = 3
563
+ beam_width: int = 1024
564
+ policy_id: str = FACTORIAL_BRANCH_PILOT_POLICY_ID
565
+ policy_version: int = FACTORIAL_BRANCH_PILOT_POLICY_VERSION
566
+ definition_sha256: str = field(init=False)
567
+
568
+ def __post_init__(self) -> None:
569
+ if (
570
+ type(self.branch_bindings) is not tuple
571
+ or len(self.branch_bindings) < 2
572
+ or any(
573
+ type(value) is not ProtectedBranchBinding
574
+ for value in self.branch_bindings
575
+ )
576
+ ):
577
+ raise TypeError(
578
+ "branch_bindings must contain at least two exact bindings"
579
+ )
580
+ for value in self.branch_bindings:
581
+ value.__post_init__()
582
+ branch_ids = tuple(value.branch_id for value in self.branch_bindings)
583
+ if branch_ids != tuple(sorted(set(branch_ids))):
584
+ raise ValueError("branch bindings must be unique and canonical")
585
+ experts = tuple(
586
+ expert
587
+ for binding in self.branch_bindings
588
+ for expert in binding.expert_ids
589
+ )
590
+ if len(experts) != len(set(experts)):
591
+ raise ValueError("one proposal expert cannot belong to two branches")
592
+ if type(self.rank_layer_count) is not int or self.rank_layer_count < 2:
593
+ raise ValueError("rank_layer_count must be at least two")
594
+ if type(self.beam_width) is not int or self.beam_width <= 0:
595
+ raise ValueError("beam_width must be a positive exact integer")
596
+ if (
597
+ self.policy_id != FACTORIAL_BRANCH_PILOT_POLICY_ID
598
+ or self.policy_version != FACTORIAL_BRANCH_PILOT_POLICY_VERSION
599
+ ):
600
+ raise ValueError("factorial branch policy identity is immutable")
601
+ object.__setattr__(
602
+ self,
603
+ "definition_sha256",
604
+ _digest(
605
+ {
606
+ "schema_version": 1,
607
+ "policy_id": self.policy_id,
608
+ "policy_version": self.policy_version,
609
+ "branch_bindings": [
610
+ value.to_record() for value in self.branch_bindings
611
+ ],
612
+ "rank_layer_count": self.rank_layer_count,
613
+ "beam_width": self.beam_width,
614
+ "design": (
615
+ "exact-branch-quota-round-robin-bounded-beam;"
616
+ "lexicographic-coverage=branch-role,branch-rank-layer,"
617
+ "role-rank-layer,expert,rank-layer,parent,operator;"
618
+ "tail-sentinel=max-normalized-rank-depth-within-equal-"
619
+ "coverage;balance=role-and-rank-layer;"
620
+ "global-phenotype-unique"
621
+ ),
622
+ "rank_semantics": (
623
+ "quantile-layer-of-materialized-within-expert-order"
624
+ ),
625
+ "candidate_outcomes_observed": False,
626
+ "interpreted_fields": [
627
+ "branch_binding",
628
+ "expert_id",
629
+ "role_id",
630
+ "operator_id",
631
+ "native_rank_as_materialized_lane_order",
632
+ "parent_ids",
633
+ "phenotype_identity_sha256",
634
+ "normalized_evaluation_cost",
635
+ "action_sha256",
636
+ ],
637
+ "forbidden_interpretation": [
638
+ "workload",
639
+ "model",
640
+ "provider",
641
+ "objective",
642
+ "prompt",
643
+ "configuration",
644
+ ],
645
+ },
646
+ domain=_DEFINITION_DOMAIN,
647
+ ),
648
+ )
649
+
650
+ @staticmethod
651
+ def _validate_cutoff(
652
+ request: ResidualPortfolioDecisionRequest,
653
+ proposals: tuple[MaterializedActionProposalBatch, ...],
654
+ ) -> None:
655
+ if type(request) is not ResidualPortfolioDecisionRequest:
656
+ raise TypeError("request must be an exact residual request")
657
+ request.__post_init__()
658
+ if type(proposals) is not tuple or not proposals:
659
+ raise ValueError("proposals must be a non-empty exact tuple")
660
+ for proposal in proposals:
661
+ if type(proposal) is not MaterializedActionProposalBatch:
662
+ raise TypeError("proposals must contain exact batches")
663
+ proposal.__post_init__()
664
+ proposal.require_request(request)
665
+ expert_ids = tuple(value.expert_id for value in proposals)
666
+ if expert_ids != tuple(sorted(set(expert_ids))):
667
+ raise ValueError("proposal batches must use canonical expert IDs")
668
+
669
+ async def require(
670
+ self,
671
+ request: ResidualPortfolioDecisionRequest,
672
+ proposals: tuple[MaterializedActionProposalBatch, ...],
673
+ ) -> MaterializedActionAllocationRequirement:
674
+ self.__post_init__()
675
+ self._validate_cutoff(request, proposals)
676
+ pilot_slots = sum(
677
+ value.pilot_slots for value in self.branch_bindings
678
+ )
679
+ if pilot_slots > request.evaluation_slots:
680
+ raise ValueError("factorial pilot floors exceed evaluation capacity")
681
+ actions = tuple(
682
+ action for proposal in proposals for action in proposal.actions
683
+ )
684
+ if len({value.action_sha256 for value in actions}) != len(actions):
685
+ raise ValueError("proposal union repeats an action identity")
686
+ unique_market_phenotypes = {
687
+ value.phenotype_identity_sha256 for value in actions
688
+ }
689
+ if len(unique_market_phenotypes) < request.evaluation_slots:
690
+ raise ValueError(
691
+ "sealed proposal market lacks a global unique-phenotype "
692
+ "completion witness"
693
+ )
694
+ candidates = factorial_candidates_from_materialized_actions(
695
+ actions,
696
+ branch_bindings=self.branch_bindings,
697
+ rank_layer_count=self.rank_layer_count,
698
+ )
699
+ selection = select_factorial_pilot_candidates(
700
+ candidates,
701
+ branch_quotas=tuple(
702
+ (value.branch_id, value.pilot_slots)
703
+ for value in self.branch_bindings
704
+ ),
705
+ rank_layer_count=self.rank_layer_count,
706
+ beam_width=self.beam_width,
707
+ decision_scope_sha256=request.request_sha256,
708
+ decision_index=request.decision_index,
709
+ )
710
+ selected_phenotypes = {
711
+ value.phenotype_identity_sha256 for value in selection.selected
712
+ }
713
+ residual_seats = request.evaluation_slots - len(selection.selected)
714
+ remaining_unique_phenotypes = (
715
+ unique_market_phenotypes - selected_phenotypes
716
+ )
717
+ if len(remaining_unique_phenotypes) < residual_seats:
718
+ raise ValueError(
719
+ "factorial pilots leave no global phenotype completion witness"
720
+ )
721
+ proposal_sha256s = tuple(
722
+ sorted(value.proposal_sha256 for value in proposals)
723
+ )
724
+ selected_action_sha256s = tuple(
725
+ sorted(value.action_sha256 for value in selection.selected)
726
+ )
727
+ evidence = freeze_json(
728
+ {
729
+ "schema_version": 1,
730
+ "candidate_outcomes_observed": False,
731
+ "residual_request_sha256": request.request_sha256,
732
+ "proposal_sha256s": list(proposal_sha256s),
733
+ "factorial_selection": selection.to_record(),
734
+ "market_capacity_certificate": {
735
+ "evaluation_slots": request.evaluation_slots,
736
+ "action_count": len(actions),
737
+ "unique_phenotype_count": len(unique_market_phenotypes),
738
+ "factorial_pilot_count": len(selection.selected),
739
+ "residual_seats": residual_seats,
740
+ "remaining_unique_phenotype_count": len(
741
+ remaining_unique_phenotypes
742
+ ),
743
+ "global_completion_witness": True,
744
+ },
745
+ "ordinary_broker_fills_residual_seats": True,
746
+ "provider_native_rank_available": False,
747
+ "materialized_lane_rank_named_explicitly": True,
748
+ "workload_model_provider_objective_prompt_interpreted": False,
749
+ }
750
+ )
751
+ require_sha256(self.definition_sha256, "definition_sha256")
752
+ return MaterializedActionAllocationRequirement(
753
+ policy_id=self.policy_id,
754
+ policy_version=self.policy_version,
755
+ policy_definition_sha256=self.definition_sha256,
756
+ residual_request_sha256=request.request_sha256,
757
+ proposal_sha256s=proposal_sha256s,
758
+ required_action_sha256s=selected_action_sha256s,
759
+ candidate_outcomes_observed=False,
760
+ evidence=evidence,
761
+ )
762
+
763
+
764
+ __all__ = [
765
+ "FACTORIAL_BRANCH_PILOT_POLICY_ID",
766
+ "FACTORIAL_BRANCH_PILOT_POLICY_VERSION",
767
+ "FactorialBranchPilotPolicy",
768
+ "FactorialPilotCandidate",
769
+ "FactorialPilotSelection",
770
+ "factorial_candidates_from_materialized_actions",
771
+ "select_factorial_pilot_candidates",
772
+ ]