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,503 @@
1
+ """Treatment-blinded prompt-shape commitments for causal memory arms.
2
+
3
+ An exact rendered-prompt hash cannot match across adaptive and control arms:
4
+ the selected insight text is the treatment. This policy instead commits to a
5
+ closed projection of every non-treatment input plus only the treatment payload
6
+ cardinality. Application code owns projection of rich parent/schema objects
7
+ to the exact hashes accepted here; the renderer pairing remains explicit and
8
+ versioned.
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ import hashlib
14
+ import json
15
+ import math
16
+ import re
17
+ from dataclasses import dataclass, field, replace
18
+ from typing import Protocol, runtime_checkable
19
+
20
+
21
+ _SHA256 = re.compile(r"^[0-9a-f]{64}$")
22
+ _TOKEN = re.compile(r"^[a-z][a-z0-9_.-]{0,95}$")
23
+ _COMMITMENT_DOMAIN = b"agent-evolve:prompt-shape-commitment:v1\x00"
24
+ _RENDERED_STRUCTURE_DOMAIN = b"agent-evolve:rendered-prompt-structure:v1\x00"
25
+ _RENDERED_RECEIPT_DOMAIN = b"agent-evolve:matched-prompt-structure-receipt:v1\x00"
26
+
27
+
28
+ def _require_sha256(value: str, name: str) -> None:
29
+ if type(value) is not str or _SHA256.fullmatch(value) is None:
30
+ raise ValueError(f"{name} must be a lowercase SHA-256 digest")
31
+
32
+
33
+ def _require_token(value: str, name: str) -> None:
34
+ if type(value) is not str or _TOKEN.fullmatch(value) is None:
35
+ raise ValueError(f"{name} must use the closed lowercase token grammar")
36
+
37
+
38
+ def _canonical_json(value: object) -> bytes:
39
+ return json.dumps(
40
+ value,
41
+ ensure_ascii=True,
42
+ allow_nan=False,
43
+ separators=(",", ":"),
44
+ sort_keys=True,
45
+ ).encode("ascii")
46
+
47
+
48
+ def _json_shape(value: object) -> object:
49
+ """Project JSON to keys/cardinalities/scalar types, never scalar values."""
50
+
51
+ if type(value) is dict:
52
+ return {key: _json_shape(value[key]) for key in sorted(value)}
53
+ if type(value) is list:
54
+ return {
55
+ "kind": "array",
56
+ "length": len(value),
57
+ "items": [_json_shape(item) for item in value],
58
+ }
59
+ if value is None:
60
+ return "null"
61
+ if type(value) is bool:
62
+ return "boolean"
63
+ if type(value) is int:
64
+ return "integer"
65
+ if type(value) is float:
66
+ if not math.isfinite(value): # json.loads rejects no values by itself.
67
+ raise ValueError("rendered prompt JSON must contain finite numbers")
68
+ return "number"
69
+ if type(value) is str:
70
+ return "string"
71
+ raise TypeError("rendered prompt contains an unsupported JSON value")
72
+
73
+
74
+ def rendered_prompt_structure(prompt: str) -> tuple[object, ...]:
75
+ """Return the renderer-bound structural projection of one actual prompt.
76
+
77
+ The default renderer emits each structured payload as compact JSON on one
78
+ line. Those payloads are compared by object keys, array cardinalities, and
79
+ scalar types; all surrounding renderer text remains exact. This catches
80
+ arm-specific headings, fields, optional values, and list lengths without
81
+ hashing the treatment prose itself into the matched-arm estimand.
82
+ """
83
+
84
+ if type(prompt) is not str or not prompt:
85
+ raise ValueError("prompt must be non-empty exact text")
86
+ rows: list[object] = []
87
+ for line in prompt.split("\n"):
88
+ if line == "":
89
+ rows.append(("blank",))
90
+ continue
91
+ try:
92
+ parsed = json.loads(line)
93
+ except json.JSONDecodeError:
94
+ rows.append(("text", line))
95
+ else:
96
+ rows.append(("json", _json_shape(parsed)))
97
+ return tuple(rows)
98
+
99
+
100
+ @dataclass(frozen=True, slots=True)
101
+ class MatchedPromptStructureReceipt:
102
+ """Receipt proving actual rendered prompts share one structural shape."""
103
+
104
+ renderer_policy_id: str
105
+ renderer_policy_version: int
106
+ prompt_sha256s: tuple[str, ...]
107
+ structure_sha256: str
108
+ receipt_sha256: str = field(init=False)
109
+
110
+ def __post_init__(self) -> None:
111
+ _require_token(self.renderer_policy_id, "renderer_policy_id")
112
+ if (
113
+ type(self.renderer_policy_version) is not int
114
+ or self.renderer_policy_version <= 0
115
+ ):
116
+ raise ValueError("renderer_policy_version must be positive")
117
+ if type(self.prompt_sha256s) is not tuple or not self.prompt_sha256s:
118
+ raise ValueError("prompt_sha256s must be a non-empty exact tuple")
119
+ for value in self.prompt_sha256s:
120
+ _require_sha256(value, "prompt_sha256s entry")
121
+ if len(set(self.prompt_sha256s)) != len(self.prompt_sha256s):
122
+ raise ValueError("matched prompts must be distinct rendered treatments")
123
+ _require_sha256(self.structure_sha256, "structure_sha256")
124
+ record = self.to_record()
125
+ object.__setattr__(
126
+ self,
127
+ "receipt_sha256",
128
+ hashlib.sha256(
129
+ _RENDERED_RECEIPT_DOMAIN + _canonical_json(record)
130
+ ).hexdigest(),
131
+ )
132
+
133
+ def to_record(self) -> dict[str, object]:
134
+ return {
135
+ "schema_version": 1,
136
+ "renderer_policy_id": self.renderer_policy_id,
137
+ "renderer_policy_version": self.renderer_policy_version,
138
+ "prompt_sha256s": list(self.prompt_sha256s),
139
+ "structure_sha256": self.structure_sha256,
140
+ }
141
+
142
+
143
+ def seal_matched_prompt_structure(
144
+ prompts: tuple[str, ...],
145
+ *,
146
+ renderer_policy_id: str = "default_evidence_prompt",
147
+ renderer_policy_version: int = 1,
148
+ ) -> MatchedPromptStructureReceipt:
149
+ """Fail closed unless distinct actual prompts have identical structure."""
150
+
151
+ if type(prompts) is not tuple or not prompts:
152
+ raise ValueError("prompts must be a non-empty exact tuple")
153
+ if any(type(prompt) is not str or not prompt for prompt in prompts):
154
+ raise TypeError("prompts must contain non-empty exact strings")
155
+ structures = tuple(rendered_prompt_structure(prompt) for prompt in prompts)
156
+ structure_hashes = tuple(
157
+ hashlib.sha256(
158
+ _RENDERED_STRUCTURE_DOMAIN + _canonical_json(structure)
159
+ ).hexdigest()
160
+ for structure in structures
161
+ )
162
+ if len(set(structure_hashes)) != 1:
163
+ raise ValueError("rendered treatment prompts do not share one structure")
164
+ return MatchedPromptStructureReceipt(
165
+ renderer_policy_id=renderer_policy_id,
166
+ renderer_policy_version=renderer_policy_version,
167
+ prompt_sha256s=tuple(
168
+ hashlib.sha256(prompt.encode("utf-8", errors="strict")).hexdigest()
169
+ for prompt in prompts
170
+ ),
171
+ structure_sha256=structure_hashes[0],
172
+ )
173
+
174
+
175
+ @dataclass(frozen=True, slots=True)
176
+ class PromptShapeInputs:
177
+ """Complete non-treatment facts required to render one variation prompt.
178
+
179
+ Hash fields are deliberately computed outside this pure policy. In
180
+ particular, ``parent_evidence_sha256s`` must identify the exact ordered
181
+ parent projections exposed by the renderer, while
182
+ ``candidate_schema_sha256`` identifies the candidate-validation boundary.
183
+ Restricted output representations are additionally bound by their mode
184
+ and finite/exact contract identities. No insight ID, text, score, arm,
185
+ block, or randomization result is accepted by this type.
186
+ """
187
+
188
+ problem_description_sha256: str
189
+ exact_context_hash: str
190
+ parent_evidence_sha256s: tuple[str, ...]
191
+ common_ancestor_evidence_sha256: str | None
192
+ operator_kind: str
193
+ operator_version: int
194
+ phase: str
195
+ allowed_top_level: tuple[str, ...]
196
+ mutation_contract_sha256: str | None
197
+ mutation_response_mode: str
198
+ atomic_replacement_option_sha256s: tuple[str, ...]
199
+ candidate_schema_sha256: str
200
+ selected_insight_count: int
201
+ reward_definition_hash: str
202
+ max_output_tokens: int
203
+ temperature: float | None
204
+ finite_variation_contract_sha256: str | None = None
205
+ crossover_response_mode: str = "full_configuration"
206
+ exact_parent_crossover_contract_sha256: str | None = None
207
+ exact_parent_import_exclusions_sha256: str | None = None
208
+
209
+ def __post_init__(self) -> None:
210
+ for name in (
211
+ "problem_description_sha256",
212
+ "exact_context_hash",
213
+ "candidate_schema_sha256",
214
+ "reward_definition_hash",
215
+ ):
216
+ _require_sha256(getattr(self, name), name)
217
+ if (
218
+ type(self.parent_evidence_sha256s) is not tuple
219
+ or not self.parent_evidence_sha256s
220
+ ):
221
+ raise ValueError("parent_evidence_sha256s must be a non-empty exact tuple")
222
+ for value in self.parent_evidence_sha256s:
223
+ _require_sha256(value, "parent_evidence_sha256s entry")
224
+ if self.common_ancestor_evidence_sha256 is not None:
225
+ _require_sha256(
226
+ self.common_ancestor_evidence_sha256,
227
+ "common_ancestor_evidence_sha256",
228
+ )
229
+ for name in (
230
+ "operator_kind",
231
+ "mutation_response_mode",
232
+ "crossover_response_mode",
233
+ ):
234
+ _require_token(getattr(self, name), name)
235
+ if type(self.operator_version) is not int or self.operator_version <= 0:
236
+ raise ValueError("operator_version must be a positive exact integer")
237
+ if (
238
+ type(self.phase) is not str
239
+ or not self.phase
240
+ or self.phase != self.phase.strip()
241
+ ):
242
+ raise ValueError("phase must be canonical non-empty text")
243
+ if type(self.allowed_top_level) is not tuple or any(
244
+ type(value) is not str or not value or value != value.strip()
245
+ for value in self.allowed_top_level
246
+ ):
247
+ raise TypeError(
248
+ "allowed_top_level must be an exact tuple of canonical strings"
249
+ )
250
+ if len(set(self.allowed_top_level)) != len(self.allowed_top_level):
251
+ raise ValueError("allowed_top_level cannot contain duplicates")
252
+ if self.mutation_contract_sha256 is not None:
253
+ _require_sha256(
254
+ self.mutation_contract_sha256,
255
+ "mutation_contract_sha256",
256
+ )
257
+ if type(self.atomic_replacement_option_sha256s) is not tuple:
258
+ raise TypeError("atomic_replacement_option_sha256s must be an exact tuple")
259
+ for value in self.atomic_replacement_option_sha256s:
260
+ _require_sha256(value, "atomic replacement option digest")
261
+ if len(set(self.atomic_replacement_option_sha256s)) != len(
262
+ self.atomic_replacement_option_sha256s
263
+ ):
264
+ raise ValueError("atomic replacement option digests cannot repeat")
265
+ if self.finite_variation_contract_sha256 is not None:
266
+ _require_sha256(
267
+ self.finite_variation_contract_sha256,
268
+ "finite_variation_contract_sha256",
269
+ )
270
+ if self.exact_parent_crossover_contract_sha256 is not None:
271
+ _require_sha256(
272
+ self.exact_parent_crossover_contract_sha256,
273
+ "exact_parent_crossover_contract_sha256",
274
+ )
275
+ if self.exact_parent_import_exclusions_sha256 is not None:
276
+ _require_sha256(
277
+ self.exact_parent_import_exclusions_sha256,
278
+ "exact_parent_import_exclusions_sha256",
279
+ )
280
+ if self.crossover_response_mode == "exact_parent_import_v1":
281
+ if self.exact_parent_crossover_contract_sha256 is None:
282
+ raise ValueError(
283
+ "exact parent import requires a crossover contract digest"
284
+ )
285
+ if self.exact_parent_import_exclusions_sha256 is None:
286
+ raise ValueError("exact parent import requires an exclusions digest")
287
+ elif (
288
+ self.exact_parent_crossover_contract_sha256 is not None
289
+ or self.exact_parent_import_exclusions_sha256 is not None
290
+ ):
291
+ raise ValueError("an exact crossover digest requires exact parent import")
292
+ if type(self.selected_insight_count) is not int:
293
+ raise TypeError("selected_insight_count must be an exact integer")
294
+ if self.selected_insight_count < 0:
295
+ raise ValueError("selected_insight_count cannot be negative")
296
+ if type(self.max_output_tokens) is not int or self.max_output_tokens <= 0:
297
+ raise ValueError("max_output_tokens must be a positive exact integer")
298
+ if self.temperature is not None and (
299
+ isinstance(self.temperature, bool)
300
+ or not isinstance(self.temperature, (int, float))
301
+ or not math.isfinite(float(self.temperature))
302
+ ):
303
+ raise ValueError("temperature must be finite or None")
304
+
305
+ def to_record(self) -> dict[str, object]:
306
+ """Return the complete treatment-blinded JSON-ready projection."""
307
+
308
+ record: dict[str, object] = {
309
+ "problem_description_sha256": self.problem_description_sha256,
310
+ "exact_context_hash": self.exact_context_hash,
311
+ "parent_evidence_sha256s": list(self.parent_evidence_sha256s),
312
+ "common_ancestor_evidence_sha256": (self.common_ancestor_evidence_sha256),
313
+ "operator_kind": self.operator_kind,
314
+ "operator_version": self.operator_version,
315
+ "phase": self.phase,
316
+ "allowed_top_level": list(self.allowed_top_level),
317
+ "mutation_contract_sha256": self.mutation_contract_sha256,
318
+ "mutation_response_mode": self.mutation_response_mode,
319
+ "atomic_replacement_option_sha256s": list(
320
+ self.atomic_replacement_option_sha256s
321
+ ),
322
+ "candidate_schema_sha256": self.candidate_schema_sha256,
323
+ "selected_insight_count": self.selected_insight_count,
324
+ "reward_definition_hash": self.reward_definition_hash,
325
+ "max_output_tokens": self.max_output_tokens,
326
+ "temperature_hex": (
327
+ None if self.temperature is None else float(self.temperature).hex()
328
+ ),
329
+ }
330
+ # Optional extension preserves byte-identical commitments for all
331
+ # pre-existing full-configuration and atomic plans.
332
+ if self.finite_variation_contract_sha256 is not None:
333
+ record["finite_variation_contract_sha256"] = (
334
+ self.finite_variation_contract_sha256
335
+ )
336
+ # The historical omission is the canonical full-configuration mode.
337
+ # Keeping it implicit preserves byte-identical commitments for every
338
+ # pre-existing plan. Any bounded crossover representation is explicit
339
+ # and therefore cannot collide with that legacy meaning.
340
+ if self.crossover_response_mode != "full_configuration":
341
+ record["crossover_response_mode"] = self.crossover_response_mode
342
+ if self.exact_parent_crossover_contract_sha256 is not None:
343
+ record["exact_parent_crossover_contract_sha256"] = (
344
+ self.exact_parent_crossover_contract_sha256
345
+ )
346
+ if self.exact_parent_import_exclusions_sha256 is not None:
347
+ record["exact_parent_import_exclusions_sha256"] = (
348
+ self.exact_parent_import_exclusions_sha256
349
+ )
350
+ return record
351
+
352
+
353
+ @runtime_checkable
354
+ class PromptShapeCommitmentPolicy(Protocol):
355
+ """Versioned pure policy paired with one trusted prompt renderer."""
356
+
357
+ policy_id: str
358
+ policy_version: int
359
+ renderer_policy_id: str
360
+ renderer_policy_version: int
361
+
362
+ def commit(self, inputs: PromptShapeInputs) -> str: ...
363
+
364
+
365
+ @dataclass(frozen=True, slots=True)
366
+ class DefaultEvidencePromptShapePolicyV1:
367
+ """Shape policy paired exclusively with ``default_evidence_prompt`` v1."""
368
+
369
+ policy_id: str = "treatment_blinded_prompt_shape"
370
+ policy_version: int = 1
371
+ renderer_policy_id: str = "default_evidence_prompt"
372
+ renderer_policy_version: int = 1
373
+
374
+ def __post_init__(self) -> None:
375
+ if self.policy_id != "treatment_blinded_prompt_shape":
376
+ raise ValueError("unsupported prompt-shape policy_id")
377
+ if self.policy_version != 1:
378
+ raise ValueError("unsupported prompt-shape policy_version")
379
+ if self.renderer_policy_id != "default_evidence_prompt":
380
+ raise ValueError("shape policy is paired with default_evidence_prompt")
381
+ if self.renderer_policy_version != 1:
382
+ raise ValueError("unsupported renderer_policy_version")
383
+
384
+ def commit(self, inputs: PromptShapeInputs) -> str:
385
+ if type(inputs) is not PromptShapeInputs:
386
+ raise TypeError("inputs must be exact PromptShapeInputs")
387
+ PromptShapeInputs.__post_init__(inputs)
388
+ record = {
389
+ "schema_version": 1,
390
+ "policy_id": self.policy_id,
391
+ "policy_version": self.policy_version,
392
+ "renderer_policy_id": self.renderer_policy_id,
393
+ "renderer_policy_version": self.renderer_policy_version,
394
+ "treatment_payload": {
395
+ "kind": "selected_insight_records",
396
+ "committed_property": "cardinality_only",
397
+ "cardinality": inputs.selected_insight_count,
398
+ },
399
+ "non_treatment_inputs": inputs.to_record(),
400
+ }
401
+ return hashlib.sha256(_COMMITMENT_DOMAIN + _canonical_json(record)).hexdigest()
402
+
403
+
404
+ @dataclass(frozen=True, slots=True)
405
+ class DefaultEvidencePromptShapePolicyV2:
406
+ """Shape policy paired with rooted candidate-component paths in renderer v2."""
407
+
408
+ policy_id: str = "treatment_blinded_prompt_shape"
409
+ policy_version: int = 2
410
+ renderer_policy_id: str = "default_evidence_prompt"
411
+ renderer_policy_version: int = 2
412
+
413
+ def __post_init__(self) -> None:
414
+ if self.policy_id != "treatment_blinded_prompt_shape":
415
+ raise ValueError("unsupported prompt-shape policy_id")
416
+ if self.policy_version != 2:
417
+ raise ValueError("unsupported prompt-shape policy_version")
418
+ if self.renderer_policy_id != "default_evidence_prompt":
419
+ raise ValueError("shape policy is paired with default_evidence_prompt")
420
+ if self.renderer_policy_version != 2:
421
+ raise ValueError("unsupported renderer_policy_version")
422
+
423
+ def commit(self, inputs: PromptShapeInputs) -> str:
424
+ if type(inputs) is not PromptShapeInputs:
425
+ raise TypeError("inputs must be exact PromptShapeInputs")
426
+ PromptShapeInputs.__post_init__(inputs)
427
+ record = {
428
+ "schema_version": 1,
429
+ "policy_id": self.policy_id,
430
+ "policy_version": self.policy_version,
431
+ "renderer_policy_id": self.renderer_policy_id,
432
+ "renderer_policy_version": self.renderer_policy_version,
433
+ "treatment_payload": {
434
+ "kind": "selected_insight_records",
435
+ "committed_property": "cardinality_only",
436
+ "cardinality": inputs.selected_insight_count,
437
+ },
438
+ "non_treatment_inputs": inputs.to_record(),
439
+ }
440
+ return hashlib.sha256(_COMMITMENT_DOMAIN + _canonical_json(record)).hexdigest()
441
+
442
+
443
+ @dataclass(frozen=True, slots=True)
444
+ class DefaultEvidencePromptShapePolicyV3:
445
+ """Shape policy paired with discriminating crossover evidence in renderer v3."""
446
+
447
+ policy_id: str = "treatment_blinded_prompt_shape"
448
+ policy_version: int = 3
449
+ renderer_policy_id: str = "default_evidence_prompt"
450
+ renderer_policy_version: int = 3
451
+
452
+ def __post_init__(self) -> None:
453
+ if self.policy_id != "treatment_blinded_prompt_shape":
454
+ raise ValueError("unsupported prompt-shape policy_id")
455
+ if self.policy_version != 3:
456
+ raise ValueError("unsupported prompt-shape policy_version")
457
+ if self.renderer_policy_id != "default_evidence_prompt":
458
+ raise ValueError("shape policy is paired with default_evidence_prompt")
459
+ if self.renderer_policy_version != 3:
460
+ raise ValueError("unsupported renderer_policy_version")
461
+
462
+ def commit(self, inputs: PromptShapeInputs) -> str:
463
+ if type(inputs) is not PromptShapeInputs:
464
+ raise TypeError("inputs must be exact PromptShapeInputs")
465
+ PromptShapeInputs.__post_init__(inputs)
466
+ record = {
467
+ "schema_version": 1,
468
+ "policy_id": self.policy_id,
469
+ "policy_version": self.policy_version,
470
+ "renderer_policy_id": self.renderer_policy_id,
471
+ "renderer_policy_version": self.renderer_policy_version,
472
+ "treatment_payload": {
473
+ "kind": "selected_insight_records",
474
+ "committed_property": "cardinality_only",
475
+ "cardinality": inputs.selected_insight_count,
476
+ },
477
+ "non_treatment_inputs": inputs.to_record(),
478
+ }
479
+ return hashlib.sha256(_COMMITMENT_DOMAIN + _canonical_json(record)).hexdigest()
480
+
481
+
482
+ def with_selected_insight_count(
483
+ inputs: PromptShapeInputs,
484
+ selected_insight_count: int,
485
+ ) -> PromptShapeInputs:
486
+ """Return an immutable cardinality variant without exposing treatment data."""
487
+
488
+ if type(inputs) is not PromptShapeInputs:
489
+ raise TypeError("inputs must be exact PromptShapeInputs")
490
+ return replace(inputs, selected_insight_count=selected_insight_count)
491
+
492
+
493
+ __all__ = [
494
+ "DefaultEvidencePromptShapePolicyV1",
495
+ "DefaultEvidencePromptShapePolicyV2",
496
+ "DefaultEvidencePromptShapePolicyV3",
497
+ "MatchedPromptStructureReceipt",
498
+ "PromptShapeCommitmentPolicy",
499
+ "PromptShapeInputs",
500
+ "rendered_prompt_structure",
501
+ "seal_matched_prompt_structure",
502
+ "with_selected_insight_count",
503
+ ]