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,451 @@
1
+ """The emit harness: a candidate's SHAPE is the harness's job, not the model's.
2
+
3
+ Wave D measured what happens when it is not. On the assignment-structured
4
+ `upms_j14_m3` instance the authored generator emitted 7,104 candidates and
5
+ the harness could use 23 of them (0.3%); **6,021 of the 7,081 rejects were
6
+ SHAPE** -- the key set, the nesting, the length -- and 1,060 were values
7
+ outside a locus's own declared domain. The same failure had already been
8
+ measured on `upms_j13_m3` (33.9% acceptance, 1,544 shape + 1,172
9
+ out-of-domain), and revision fired on 77 of 80 cells without repairing it.
10
+ Healthy instances on the same substrate run 67.3-96.0%.
11
+
12
+ Shape is the load-bearing half, and it is not a modelling problem: the
13
+ harness already knows the exact key set, the exact nesting and the exact
14
+ admissible value of every locus, because it derives all three from the
15
+ problem's own schema. Asking a model to reproduce that structure by hand --
16
+ fourteen keys named ``job_00``..``job_13``, each with its own eligibility
17
+ subset -- is asking it to re-derive something the caller could simply have
18
+ built, and the failure rate scales with the number of loci exactly as
19
+ transcription errors do.
20
+
21
+ So this module inverts the burden, generically, for ANY structured genome:
22
+
23
+ - :func:`scaffold_prelude` renders a source prelude the sandbox executes
24
+ BEFORE the authored artifact. It defines ``build(picks)`` -- the authored
25
+ code names loci and values, and the harness assembles the configuration.
26
+ A configuration built through ``build`` cannot have the wrong shape,
27
+ because the shape comes from the template rather than from the model, and
28
+ cannot hold an out-of-domain value, because every value is checked against
29
+ that locus's own domain before it is written. Both events are COUNTED and
30
+ reported back through the runtime's notes channel, so "the model got it
31
+ right" and "the harness repaired it" never look alike.
32
+ - :func:`coerce_candidate` is the same assembly, harness-side, for a
33
+ generator that ignored the scaffold and hand-built its dicts anyway. It
34
+ reads whatever loci a member does supply -- flat locus keys, the
35
+ template's own nesting, or a bare sequence aligned with the loci -- and
36
+ repairs the rest. A per-LOCUS fallback strictly dominates the per-
37
+ CANDIDATE fallback it replaces: the run keeps the thirteen loci the model
38
+ chose well instead of throwing all fourteen away because one was wrong.
39
+ - :func:`render_domain_echo` writes the per-locus admissible sets into the
40
+ authoring prompt, so an out-of-domain value is a prompt failure rather
41
+ than a guess. Sequence-valued fields are the case that motivates it: the
42
+ domain card renders a sequence field's SHARED per-element vocabulary,
43
+ while ``domains`` is keyed per position, and only the echo says which.
44
+
45
+ Nothing here knows what a locus means. The template, the loci and the
46
+ domains all arrive from :mod:`agent_evolve.policies.genetic`, which derives
47
+ them from the candidate model's own JSON schema.
48
+ """
49
+
50
+ from __future__ import annotations
51
+
52
+ import json
53
+ import random
54
+ from typing import Any, Dict, List, Mapping, Optional, Sequence, Tuple
55
+
56
+ from agent_evolve.infrastructure.authored_worker import ALLOWED_IMPORTS
57
+ from agent_evolve.policies.genetic import Locus, loci_of, read_locus, write_locus
58
+
59
+ __all__ = [
60
+ "NOTES_GLOBAL",
61
+ "locus_names",
62
+ "scaffold_prelude",
63
+ "coerce_candidate",
64
+ "render_domain_echo",
65
+ "SCAFFOLD_RULES",
66
+ ]
67
+
68
+ #: The name the prelude publishes its counters under. The worker returns
69
+ #: whatever lives here as the call's ``notes``; nothing else crosses back.
70
+ NOTES_GLOBAL = "_AE_EMIT_NOTES"
71
+
72
+ #: How many values of one locus the echo prints before eliding.
73
+ _MAX_VALUES = 12
74
+ #: How many locus lines the echo prints before collapsing the tail.
75
+ _MAX_LINES = 48
76
+ #: How many distinct offending samples a census keeps per reason.
77
+ _MAX_SAMPLES = 4
78
+
79
+
80
+ def locus_names(template: Mapping[str, Any]) -> Tuple[str, ...]:
81
+ """Canonical locus names for *template*, in the harness's own order."""
82
+
83
+ return tuple(str(locus) for locus in loci_of(template))
84
+
85
+
86
+ def _parse(name: str) -> Locus:
87
+ """The inverse of ``str(Locus)``: ``field`` or ``field[i]``."""
88
+
89
+ if name.endswith("]") and "[" in name:
90
+ field, index = name[:-1].split("[", 1)
91
+ try:
92
+ return Locus(field, int(index))
93
+ except ValueError:
94
+ return Locus(name)
95
+ return Locus(name)
96
+
97
+
98
+ # --------------------------------------------------------------- the prelude
99
+
100
+ _PRELUDE = '''\
101
+ {preimports}
102
+ import json as _ae_json
103
+ import random as _ae_random
104
+
105
+ _AE = _ae_json.loads({payload})
106
+ LOCI = tuple(_AE["loci"])
107
+ DOMAINS = {{k: list(v) for k, v in _AE["domains"].items()}}
108
+ _AE_TEMPLATE = _AE["template"]
109
+ {notes} = {{"built": 0, "filled": 0, "out_of_domain": 0, "unknown_locus": 0,
110
+ "by_locus": {{}}, "samples": []}}
111
+ _AE_RNG = _ae_random.Random(_AE["nonce"])
112
+
113
+
114
+ def domain_of(locus):
115
+ """The admissible values at *locus* -- the same list `domains` carries."""
116
+ return list(DOMAINS.get(str(locus), ()))
117
+
118
+
119
+ def _ae_count(kind, locus, value=None):
120
+ {notes}[kind] = {notes}.get(kind, 0) + 1
121
+ row = {notes}["by_locus"].setdefault(str(locus), {{}})
122
+ row[kind] = row.get(kind, 0) + 1
123
+ if kind == "out_of_domain" and len({notes}["samples"]) < 8:
124
+ try:
125
+ _ae_json.dumps(value)
126
+ except Exception:
127
+ value = repr(value)[:80]
128
+ {notes}["samples"].append({{"locus": str(locus), "value": value}})
129
+
130
+
131
+ def _ae_read(config, locus):
132
+ if locus.endswith("]") and "[" in locus:
133
+ field, index = locus[:-1].split("[", 1)
134
+ return config[field][int(index)]
135
+ return config[locus]
136
+
137
+
138
+ def _ae_write(config, locus, value):
139
+ if locus.endswith("]") and "[" in locus:
140
+ field, index = locus[:-1].split("[", 1)
141
+ config[field][int(index)] = value
142
+ else:
143
+ config[locus] = value
144
+
145
+
146
+ def _ae_picks(picks):
147
+ if picks is None:
148
+ return {{}}
149
+ if isinstance(picks, dict):
150
+ flat = {{}}
151
+ for key, value in picks.items():
152
+ key = str(key)
153
+ if key in DOMAINS or key in _AE_TEMPLATE:
154
+ if (isinstance(value, (list, tuple))
155
+ and key not in DOMAINS
156
+ and isinstance(_AE_TEMPLATE.get(key), list)):
157
+ for i, item in enumerate(value):
158
+ flat["%s[%d]" % (key, i)] = item
159
+ else:
160
+ flat[key] = value
161
+ else:
162
+ _ae_count("unknown_locus", key)
163
+ return flat
164
+ try:
165
+ values = list(picks)
166
+ except Exception:
167
+ return {{}}
168
+ return {{LOCI[i]: v for i, v in enumerate(values) if i < len(LOCI)}}
169
+
170
+
171
+ def build(picks=None, seed=None):
172
+ """Assemble ONE configuration, locus by locus, from your choices.
173
+
174
+ *picks* maps a locus name to the value you want there (or is a sequence
175
+ aligned with ``LOCI``). The shape comes from the harness, so it is always
176
+ right; a locus you omit, or set outside ``DOMAINS[locus]``, is filled by
177
+ a seeded draw from that locus's own domain and counted against you.
178
+ """
179
+ rng = _ae_random.Random(seed) if seed is not None else _AE_RNG
180
+ config = _ae_json.loads(_ae_json.dumps(_AE_TEMPLATE))
181
+ chosen = _ae_picks(picks)
182
+ for locus in LOCI:
183
+ domain = DOMAINS.get(locus) or ()
184
+ if locus in chosen:
185
+ value = chosen[locus]
186
+ if not domain:
187
+ # The schema constrains this locus to nothing, so the template
188
+ # value is the only defensible one; overwriting it would be
189
+ # authoring a value the problem never declared.
190
+ if value != _ae_read(config, locus):
191
+ _ae_count("out_of_domain", locus, value)
192
+ continue
193
+ if value in domain:
194
+ _ae_write(config, locus, value)
195
+ continue
196
+ _ae_count("out_of_domain", locus, value)
197
+ elif not domain:
198
+ continue
199
+ else:
200
+ _ae_count("filled", locus)
201
+ _ae_write(config, locus, rng.choice(domain))
202
+ {notes}["built"] += 1
203
+ return config
204
+
205
+
206
+ def build_all(rows, seed=None):
207
+ """``build`` over an iterable of picks -- one configuration per row."""
208
+ return [build(row, seed=seed) for row in rows]
209
+
210
+
211
+ def resample(locus, current=None, seed=None, rng=None):
212
+ """A NEW value at *locus*, or the only one there is.
213
+
214
+ The shipped mutation operator's exact rule. It exists because excluding
215
+ the current value from a domain that holds one value leaves an empty
216
+ sequence, and `random.choice([])` raises -- which is the single largest
217
+ crash class measured in authored generators on heterogeneous genomes.
218
+ """
219
+ domain = list(DOMAINS.get(str(locus)) or ())
220
+ if not domain:
221
+ return current
222
+ others = [v for v in domain if v != current] or domain
223
+ source = rng if rng is not None else (
224
+ _ae_random.Random(seed) if seed is not None else _AE_RNG)
225
+ return source.choice(others)
226
+ '''
227
+
228
+
229
+ #: The paragraph the authoring prompt shows. Kept next to the code it
230
+ #: describes so the two cannot drift.
231
+ SCAFFOLD_RULES = """\
232
+ - Build EVERY configuration through the helper `build(picks)`. It is already
233
+ defined in your module, as are the standard-library modules listed above --
234
+ write `import random` if you like, but `random`, `math` and the rest are
235
+ bound already, and `build` must not be redefined. Do NOT construct
236
+ configuration dicts yourself. `picks` maps a locus name to the
237
+ value you want there -- e.g. `build({"x[0]": 3, "mode": "fast"})` -- or is
238
+ a sequence aligned with the module-level tuple `LOCI`. `build` returns a
239
+ configuration of exactly the right shape; a locus you omit, or set to a
240
+ value outside its domain, is filled by a uniform draw from that locus's
241
+ own domain AND COUNTED AGAINST YOU, so omitting loci wastes the guidance
242
+ you are being paid for. `build_all(rows)` does a whole batch.
243
+ - `LOCI` (tuple of locus names, in order), `DOMAINS` (the same mapping as
244
+ the `domains` argument) and `domain_of(locus)` are available too.
245
+ - LOCI DO NOT SHARE A DOMAIN, and some hold a SINGLE admissible value. So
246
+ `[v for v in domain_of(k) if v != current]` can be EMPTY, and
247
+ `random.choice([])` raises -- which kills the whole batch and forfeits the
248
+ pool. Use `resample(locus, current)` for "change this locus": it returns a
249
+ different value where one exists and the only value where it does not."""
250
+
251
+
252
+ def _preimports() -> str:
253
+ """Bind every ALLOWED module as a global before the artifact runs.
254
+
255
+ A measured failure class, not a convenience. Replaying the DEV probe's
256
+ zero-emission cells showed 18 of 51 crashes were `NameError: name
257
+ 'random'/'math' is not defined` -- an authored function using a module
258
+ the gate already permits, without an import statement. The allowlist is
259
+ the harness's own datum; binding it costs one import per module in a
260
+ process that exists for one batch, and the gate is unchanged, because
261
+ the gate is about what the ARTIFACT may import, not about what the
262
+ harness may hand it.
263
+ """
264
+
265
+ return "\n".join(f"import {name}"
266
+ for name in sorted(ALLOWED_IMPORTS))
267
+
268
+
269
+ def scaffold_prelude(
270
+ template: Mapping[str, Any],
271
+ domains: Mapping[str, Sequence[Any]],
272
+ *,
273
+ nonce: int = 0,
274
+ ) -> Optional[str]:
275
+ """Source the sandbox runs before the artifact, or ``None`` if it cannot.
276
+
277
+ ``None`` is returned when the template or a domain will not survive the
278
+ JSON round trip the runtime already imposes on every argument -- in which
279
+ case the artifact runs exactly as it did before this module existed and
280
+ the harness-side guard is the only line of defence, which is the same
281
+ degradation everything else here makes.
282
+ """
283
+
284
+ try:
285
+ payload = json.dumps({
286
+ "template": dict(template),
287
+ "loci": list(locus_names(template)),
288
+ "domains": {str(k): list(v) for k, v in domains.items()},
289
+ "nonce": int(nonce),
290
+ }, sort_keys=True)
291
+ except (TypeError, ValueError):
292
+ return None
293
+ return _PRELUDE.format(payload=repr(payload), notes=NOTES_GLOBAL,
294
+ preimports=_preimports())
295
+
296
+
297
+ # ------------------------------------------------------- the harness-side twin
298
+
299
+ def _picks_from(
300
+ member: Any,
301
+ *,
302
+ template: Mapping[str, Any],
303
+ domains: Mapping[str, Sequence[Any]],
304
+ loci: Sequence[str],
305
+ ) -> Optional[Dict[str, Any]]:
306
+ """Whatever loci *member* actually supplies, keyed by locus name.
307
+
308
+ Three shapes are read, in the order a generator is likely to emit them:
309
+ flat locus keys (what ``build`` produces), the template's own nesting
310
+ (what a hand-built dict produces), and a bare sequence aligned with the
311
+ loci (what an assignment-structured genome is naturally written as).
312
+ ``None`` means the member supplied nothing addressable at all.
313
+ """
314
+
315
+ if isinstance(member, dict):
316
+ flat: Dict[str, Any] = {}
317
+ for key, value in member.items():
318
+ key = str(key)
319
+ if key in domains and not (
320
+ isinstance(value, (list, tuple))
321
+ and isinstance(template.get(key), (list, tuple))):
322
+ flat[key] = value
323
+ elif isinstance(value, (list, tuple)) and not isinstance(
324
+ value, (str, bytes)):
325
+ for index, item in enumerate(value):
326
+ flat[f"{key}[{index}]"] = item
327
+ elif key in template:
328
+ flat[key] = value
329
+ known = {k: v for k, v in flat.items() if k in domains}
330
+ return known or None
331
+ if isinstance(member, (list, tuple)) and not isinstance(member, (str, bytes)):
332
+ if len(member) != len(loci):
333
+ return None
334
+ return dict(zip(loci, member))
335
+ return None
336
+
337
+
338
+ def coerce_candidate(
339
+ member: Any,
340
+ *,
341
+ template: Mapping[str, Any],
342
+ domains: Mapping[str, Sequence[Any]],
343
+ rng: random.Random,
344
+ loci: Optional[Sequence[Locus]] = None,
345
+ ) -> Tuple[Optional[Dict[str, Any]], Dict[str, List[str]]]:
346
+ """Assemble a valid configuration out of whatever *member* got right.
347
+
348
+ Returns ``(config, repairs)``; ``config`` is ``None`` when the member
349
+ addressed no locus at all, which is the one case a per-locus fallback
350
+ cannot improve on a rejection -- there is nothing of the model's left in
351
+ it. ``repairs`` maps ``"filled"`` / ``"out_of_domain"`` to the loci the
352
+ harness had to decide for.
353
+ """
354
+
355
+ positions = tuple(loci) if loci is not None else loci_of(template)
356
+ names = [str(locus) for locus in positions]
357
+ picks = _picks_from(member, template=template, domains=domains, loci=names)
358
+ if picks is None:
359
+ return None, {}
360
+
361
+ repairs: Dict[str, List[str]] = {"filled": [], "out_of_domain": []}
362
+ config: Dict[str, Any] = dict(template)
363
+ kept = 0
364
+ for locus, name in zip(positions, names):
365
+ domain = tuple(domains.get(name) or ())
366
+ if name in picks:
367
+ value = picks[name]
368
+ if not domain:
369
+ if value != read_locus(template, locus):
370
+ repairs["out_of_domain"].append(name)
371
+ continue
372
+ if value in domain:
373
+ config = write_locus(config, locus, value)
374
+ kept += 1
375
+ continue
376
+ repairs["out_of_domain"].append(name)
377
+ elif not domain:
378
+ continue
379
+ else:
380
+ repairs["filled"].append(name)
381
+ if domain:
382
+ config = write_locus(config, locus, rng.choice(domain))
383
+ if not kept:
384
+ # Nothing the model chose survived. Accepting this would credit the
385
+ # generator with a draw that is schema-uniform in every locus.
386
+ return None, repairs
387
+ return config, repairs
388
+
389
+
390
+ # ------------------------------------------------------------------ the echo
391
+
392
+ def _render_values(values: Sequence[Any]) -> str:
393
+ values = list(values)
394
+ if not values:
395
+ return "unconstrained by the schema (keeps the template's value)"
396
+ if len(values) <= _MAX_VALUES:
397
+ return f"one of {values}"
398
+ head = values[:_MAX_VALUES - 2]
399
+ return f"one of {head + ['...', values[-1]]} ({len(values)} values)"
400
+
401
+
402
+ def render_domain_echo(
403
+ domains: Mapping[str, Sequence[Any]],
404
+ *,
405
+ max_lines: int = _MAX_LINES,
406
+ ) -> str:
407
+ """Every locus's exact admissible set, one line each, runs collapsed.
408
+
409
+ Consecutive loci that share a domain -- the common case for a sequence
410
+ field, and the case the domain card already renders correctly -- collapse
411
+ to one line naming the run, so a 500-position genome costs one line while
412
+ a 14-position genome whose positions differ (per-job eligibility, per-slot
413
+ capability) spends fourteen and says exactly which is which. That
414
+ difference is the whole point: an out-of-domain value must be a prompt
415
+ failure, not a guess.
416
+ """
417
+
418
+ names = list(domains)
419
+ if not names:
420
+ return ""
421
+ runs: List[Tuple[List[str], Sequence[Any]]] = []
422
+ for name in names:
423
+ values = list(domains[name] or ())
424
+ if runs and list(runs[-1][1]) == values:
425
+ runs[-1][0].append(name)
426
+ else:
427
+ runs.append(([name], values))
428
+
429
+ lines: List[str] = []
430
+ for group, values in runs[:max_lines]:
431
+ label = group[0] if len(group) == 1 else f"{group[0]} .. {group[-1]}"
432
+ if len(group) > 1:
433
+ label += f" ({len(group)} loci)"
434
+ lines.append(f" {label}: {_render_values(values)}")
435
+ if len(runs) > max_lines:
436
+ remaining = sum(len(group) for group, _ in runs[max_lines:])
437
+ lines.append(f" ... and {remaining} further loci; the `domains` "
438
+ f"argument carries all of them at call time.")
439
+ singletons = [name for name in names if len(list(domains[name] or ())) == 1]
440
+ if singletons:
441
+ # Called out because it is the shape of a measured crash, not because
442
+ # it is interesting: a locus with one admissible value makes
443
+ # "pick something else here" an empty draw.
444
+ shown = singletons[:8]
445
+ tail = ("" if len(singletons) <= 8
446
+ else f" and {len(singletons) - 8} more")
447
+ lines.append(f" NOTE: {len(singletons)} locus/loci admit exactly ONE "
448
+ f"value ({', '.join(shown)}{tail}) -- they cannot be "
449
+ f"changed, and excluding their current value leaves an "
450
+ f"empty domain.")
451
+ return "\n".join(lines)
@@ -0,0 +1,37 @@
1
+ """Injectable feedback experiment policies built on generic application seams."""
2
+
3
+ from agent_evolve.policies.feedback.held_out_asn import (
4
+ G1ReflectionFeedbackInterceptor,
5
+ HeldOutASNAssignments,
6
+ HeldOutASNPlanSet,
7
+ HeldOutASNPlannerAdapter,
8
+ HeldOutArm,
9
+ HeldOutArmAssignment,
10
+ HeldOutAssignmentUnavailable,
11
+ HeldOutAssignmentUnavailableReason,
12
+ ReflectedCard,
13
+ ReflectedCardBatch,
14
+ ReflectedCardMailbox,
15
+ ReflectiveFeedbackContractError,
16
+ build_reflected_card_batch,
17
+ reflection_contrast_id,
18
+ register_neutral_sham_card,
19
+ )
20
+
21
+ __all__ = [
22
+ "G1ReflectionFeedbackInterceptor",
23
+ "HeldOutASNAssignments",
24
+ "HeldOutASNPlanSet",
25
+ "HeldOutASNPlannerAdapter",
26
+ "HeldOutArm",
27
+ "HeldOutArmAssignment",
28
+ "HeldOutAssignmentUnavailable",
29
+ "HeldOutAssignmentUnavailableReason",
30
+ "ReflectedCard",
31
+ "ReflectedCardBatch",
32
+ "ReflectedCardMailbox",
33
+ "ReflectiveFeedbackContractError",
34
+ "build_reflected_card_batch",
35
+ "reflection_contrast_id",
36
+ "register_neutral_sham_card",
37
+ ]