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,759 @@
1
+ """Generic, evaluator-free administration of assigned insight treatments.
2
+
3
+ The policy operates only on immutable machine evidence: exact insight versions,
4
+ finite-option families, and parent-relative changed paths. It never inspects an
5
+ objective or benchmark-specific field. A rejected model proposal therefore can
6
+ be recorded as no-yield before an expensive evaluator is entered.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import hashlib
12
+ import json
13
+ import re
14
+ from dataclasses import dataclass, field
15
+ from enum import Enum
16
+ from typing import Protocol, runtime_checkable
17
+
18
+ from agent_evolve.domain.insight import InsightRef
19
+ from agent_evolve.domain.patch import require_sha256
20
+
21
+
22
+ _TOKEN = re.compile(r"^[a-z][a-z0-9_.-]{0,255}$")
23
+ _POLICY_DEFINITION = (
24
+ b"agent-evolve:treatment-compliance:v2:exact-card-palette-action-claims-before-eval"
25
+ )
26
+ TREATMENT_COMPLIANCE_POLICY_ID = "strict_treatment_compliance"
27
+ TREATMENT_COMPLIANCE_POLICY_VERSION = 2
28
+ TREATMENT_COMPLIANCE_DEFINITION_SHA256 = hashlib.sha256(
29
+ _POLICY_DEFINITION
30
+ ).hexdigest()
31
+
32
+
33
+ def _hash(
34
+ domain: str,
35
+ record: dict[str, object],
36
+ *,
37
+ version: int = 1,
38
+ ) -> str:
39
+ payload = json.dumps(
40
+ record,
41
+ sort_keys=True,
42
+ separators=(",", ":"),
43
+ ensure_ascii=True,
44
+ allow_nan=False,
45
+ ).encode("ascii")
46
+ return hashlib.sha256(
47
+ f"agent-evolve:{domain}:v{version}\x00".encode("ascii") + payload
48
+ ).hexdigest()
49
+
50
+
51
+ def _ref_record(reference: InsightRef) -> dict[str, object]:
52
+ return {
53
+ "insight_id": reference.insight_id.value,
54
+ "version": reference.version,
55
+ }
56
+
57
+
58
+ def _canonical_strings(values: tuple[str, ...], *, name: str) -> None:
59
+ if type(values) is not tuple or any(
60
+ type(value) is not str or not value for value in values
61
+ ):
62
+ raise TypeError(f"{name} must be an exact tuple of non-empty strings")
63
+ if values != tuple(sorted(set(values))):
64
+ raise ValueError(f"{name} must be unique and canonically sorted")
65
+
66
+
67
+ def _paths_overlap(first: str, second: str) -> bool:
68
+ return (
69
+ first == second
70
+ or first.startswith(second + ".")
71
+ or first.startswith(second + "[")
72
+ or second.startswith(first + ".")
73
+ or second.startswith(first + "[")
74
+ )
75
+
76
+
77
+ def _overlaps_any(first: tuple[str, ...], second: tuple[str, ...]) -> bool:
78
+ return any(_paths_overlap(left, right) for left in first for right in second)
79
+
80
+
81
+ class TreatmentClaimMode(str, Enum):
82
+ """How an assigned treatment must be reported by the model."""
83
+
84
+ OPTIONAL_SUBSET = "optional_subset"
85
+ EXACT_REQUIRED = "exact_required"
86
+
87
+
88
+ class TreatmentAssignmentRole(str, Enum):
89
+ """Scientific role of the assigned card, independent of benchmark names."""
90
+
91
+ ACTIVE = "active"
92
+ SHAM_CONTROL = "sham_control"
93
+
94
+
95
+ @dataclass(frozen=True, slots=True)
96
+ class TreatmentActionBinding:
97
+ """One exact parent-bound finite action permitted by a treatment."""
98
+
99
+ option_id: str
100
+ option_identity_sha256: str
101
+
102
+ def __post_init__(self) -> None:
103
+ if type(self.option_id) is not str or _TOKEN.fullmatch(self.option_id) is None:
104
+ raise ValueError("option_id must use the canonical option grammar")
105
+ require_sha256(self.option_identity_sha256, "option_identity_sha256")
106
+
107
+ def to_record(self) -> dict[str, object]:
108
+ return {
109
+ "option_id": self.option_id,
110
+ "option_identity_sha256": self.option_identity_sha256,
111
+ }
112
+
113
+
114
+ @dataclass(frozen=True, slots=True)
115
+ class TreatmentInsightBinding:
116
+ """Plan-hashed identity of one exact insight card and its action claim."""
117
+
118
+ reference: InsightRef
119
+ insight_content_sha256: str
120
+ evidence_sha256: str
121
+ recommended_option_ids: tuple[str, ...]
122
+
123
+ def __post_init__(self) -> None:
124
+ if type(self.reference) is not InsightRef:
125
+ raise TypeError("reference must be an exact InsightRef")
126
+ InsightRef.__post_init__(self.reference)
127
+ require_sha256(self.insight_content_sha256, "insight_content_sha256")
128
+ require_sha256(self.evidence_sha256, "evidence_sha256")
129
+ _canonical_strings(
130
+ self.recommended_option_ids,
131
+ name="recommended_option_ids",
132
+ )
133
+ if any(_TOKEN.fullmatch(value) is None for value in self.recommended_option_ids):
134
+ raise ValueError("recommended_option_ids use the canonical option grammar")
135
+
136
+ def to_record(self) -> dict[str, object]:
137
+ return {
138
+ **_ref_record(self.reference),
139
+ "insight_content_sha256": self.insight_content_sha256,
140
+ "evidence_sha256": self.evidence_sha256,
141
+ "recommended_option_ids": list(self.recommended_option_ids),
142
+ }
143
+
144
+
145
+ @dataclass(frozen=True, slots=True)
146
+ class InsightTreatmentRequirement:
147
+ """Plan-hashed exact card, palette, and parent-bound action contract."""
148
+
149
+ insight_bindings: tuple[TreatmentInsightBinding, ...]
150
+ finite_contract_sha256: str
151
+ allowed_actions: tuple[TreatmentActionBinding, ...]
152
+ claim_mode: TreatmentClaimMode
153
+ assignment_role: TreatmentAssignmentRole = TreatmentAssignmentRole.ACTIVE
154
+ require_option_family_match: bool = True
155
+ require_changed_path_overlap: bool = True
156
+ requirement_sha256: str = field(init=False)
157
+
158
+ def __post_init__(self) -> None:
159
+ if type(self.insight_bindings) is not tuple or not self.insight_bindings:
160
+ raise ValueError("a treatment requirement needs assigned insights")
161
+ if any(
162
+ type(value) is not TreatmentInsightBinding
163
+ for value in self.insight_bindings
164
+ ):
165
+ raise TypeError(
166
+ "insight_bindings must contain exact TreatmentInsightBinding values"
167
+ )
168
+ for binding in self.insight_bindings:
169
+ TreatmentInsightBinding.__post_init__(binding)
170
+ references = tuple(value.reference for value in self.insight_bindings)
171
+ if references != tuple(sorted(set(references))):
172
+ raise ValueError("insight_bindings must be unique and canonically sorted")
173
+ ids = tuple(value.insight_id.value for value in references)
174
+ if len(set(ids)) != len(ids):
175
+ raise ValueError(
176
+ "unversioned claimed_insight_ids require distinct logical insight IDs"
177
+ )
178
+ require_sha256(self.finite_contract_sha256, "finite_contract_sha256")
179
+ if type(self.allowed_actions) is not tuple or not self.allowed_actions:
180
+ raise ValueError("a treatment requirement needs exact allowed actions")
181
+ if any(
182
+ type(value) is not TreatmentActionBinding
183
+ for value in self.allowed_actions
184
+ ):
185
+ raise TypeError(
186
+ "allowed_actions must contain exact TreatmentActionBinding values"
187
+ )
188
+ for action in self.allowed_actions:
189
+ TreatmentActionBinding.__post_init__(action)
190
+ if self.allowed_actions != tuple(
191
+ sorted(
192
+ set(self.allowed_actions),
193
+ key=lambda value: (value.option_id, value.option_identity_sha256),
194
+ )
195
+ ):
196
+ raise ValueError("allowed_actions must be unique and canonically sorted")
197
+ common_option_ids = set.intersection(
198
+ *(set(binding.recommended_option_ids) for binding in self.insight_bindings)
199
+ )
200
+ allowed_option_ids = {action.option_id for action in self.allowed_actions}
201
+ if allowed_option_ids != common_option_ids:
202
+ raise ValueError(
203
+ "allowed action IDs must equal the cards' exact common recommendation"
204
+ )
205
+ if len(allowed_option_ids) != len(self.allowed_actions):
206
+ raise ValueError("allowed action option IDs must be unique")
207
+ if type(self.claim_mode) is not TreatmentClaimMode:
208
+ raise TypeError("claim_mode must be a TreatmentClaimMode")
209
+ if type(self.assignment_role) is not TreatmentAssignmentRole:
210
+ raise TypeError("assignment_role must be a TreatmentAssignmentRole")
211
+ if type(self.require_option_family_match) is not bool or type(
212
+ self.require_changed_path_overlap
213
+ ) is not bool:
214
+ raise TypeError("treatment requirement switches must be bool")
215
+ object.__setattr__(
216
+ self,
217
+ "requirement_sha256",
218
+ _hash(
219
+ "insight-treatment-requirement",
220
+ self.to_record(),
221
+ version=2,
222
+ ),
223
+ )
224
+
225
+ def to_record(self) -> dict[str, object]:
226
+ return {
227
+ "schema_version": 2,
228
+ "insight_bindings": [
229
+ binding.to_record() for binding in self.insight_bindings
230
+ ],
231
+ "finite_contract_sha256": self.finite_contract_sha256,
232
+ "allowed_actions": [
233
+ action.to_record() for action in self.allowed_actions
234
+ ],
235
+ "claim_mode": self.claim_mode.value,
236
+ "assignment_role": self.assignment_role.value,
237
+ "require_option_family_match": self.require_option_family_match,
238
+ "require_changed_path_overlap": self.require_changed_path_overlap,
239
+ }
240
+
241
+ @property
242
+ def required_insights(self) -> tuple[InsightRef, ...]:
243
+ return tuple(binding.reference for binding in self.insight_bindings)
244
+
245
+
246
+ @dataclass(frozen=True, slots=True)
247
+ class TreatmentInsightEvidence:
248
+ reference: InsightRef
249
+ insight_content_sha256: str
250
+ applicable_operator_kinds: tuple[str, ...]
251
+ affected_paths: tuple[str, ...]
252
+ recommended_option_families: tuple[str, ...]
253
+ recommended_option_ids: tuple[str, ...]
254
+ evidence_sha256: str = field(init=False)
255
+
256
+ def __post_init__(self) -> None:
257
+ if type(self.reference) is not InsightRef:
258
+ raise TypeError("reference must be an exact InsightRef")
259
+ InsightRef.__post_init__(self.reference)
260
+ require_sha256(self.insight_content_sha256, "insight_content_sha256")
261
+ for name in (
262
+ "applicable_operator_kinds",
263
+ "affected_paths",
264
+ "recommended_option_families",
265
+ "recommended_option_ids",
266
+ ):
267
+ _canonical_strings(getattr(self, name), name=name)
268
+ if any(_TOKEN.fullmatch(value) is None for value in self.recommended_option_ids):
269
+ raise ValueError("recommended_option_ids use the canonical option grammar")
270
+ object.__setattr__(
271
+ self,
272
+ "evidence_sha256",
273
+ _hash(
274
+ "treatment-insight-evidence",
275
+ self.to_record(),
276
+ version=2,
277
+ ),
278
+ )
279
+
280
+ def to_record(self) -> dict[str, object]:
281
+ return {
282
+ "schema_version": 2,
283
+ **_ref_record(self.reference),
284
+ "insight_content_sha256": self.insight_content_sha256,
285
+ "applicable_operator_kinds": list(self.applicable_operator_kinds),
286
+ "affected_paths": list(self.affected_paths),
287
+ "recommended_option_families": list(
288
+ self.recommended_option_families
289
+ ),
290
+ "recommended_option_ids": list(self.recommended_option_ids),
291
+ }
292
+
293
+ def binding(self) -> TreatmentInsightBinding:
294
+ return TreatmentInsightBinding(
295
+ reference=self.reference,
296
+ insight_content_sha256=self.insight_content_sha256,
297
+ evidence_sha256=self.evidence_sha256,
298
+ recommended_option_ids=self.recommended_option_ids,
299
+ )
300
+
301
+
302
+ @dataclass(frozen=True, slots=True)
303
+ class FiniteTreatmentAction:
304
+ option_id: str
305
+ option_identity_sha256: str
306
+ family: str
307
+ changed_paths: tuple[str, ...]
308
+
309
+ def __post_init__(self) -> None:
310
+ if type(self.option_id) is not str or _TOKEN.fullmatch(self.option_id) is None:
311
+ raise ValueError("option_id must use the canonical option grammar")
312
+ require_sha256(self.option_identity_sha256, "option_identity_sha256")
313
+ if type(self.family) is not str or _TOKEN.fullmatch(self.family) is None:
314
+ raise ValueError("family must use the canonical option grammar")
315
+ _canonical_strings(self.changed_paths, name="changed_paths")
316
+
317
+ def to_record(self) -> dict[str, object]:
318
+ return {
319
+ "option_id": self.option_id,
320
+ "option_identity_sha256": self.option_identity_sha256,
321
+ "family": self.family,
322
+ "changed_paths": list(self.changed_paths),
323
+ }
324
+
325
+ def binding(self) -> TreatmentActionBinding:
326
+ return TreatmentActionBinding(
327
+ option_id=self.option_id,
328
+ option_identity_sha256=self.option_identity_sha256,
329
+ )
330
+
331
+
332
+ class TreatmentComplianceViolation(str, Enum):
333
+ ASSIGNMENT_MISMATCH = "assignment_mismatch"
334
+ INSIGHT_EVIDENCE_MISMATCH = "insight_evidence_mismatch"
335
+ FINITE_CONTRACT_MISMATCH = "finite_contract_mismatch"
336
+ EXACT_ACTION_BINDING_MISMATCH = "exact_action_binding_mismatch"
337
+ OPERATOR_INAPPLICABLE = "operator_inapplicable"
338
+ EDITABLE_PATH_DISJOINT = "editable_path_disjoint"
339
+ INTERVENTION_FAMILY_MISSING = "intervention_family_missing"
340
+ NO_COMPATIBLE_FINITE_ACTION = "no_compatible_finite_action"
341
+ OPERATOR_NONCOMPLIANT = "operator_noncompliant"
342
+ DUPLICATE_CLAIM = "duplicate_claim"
343
+ FOREIGN_CLAIM = "foreign_claim"
344
+ EXACT_CLAIM_MISMATCH = "exact_claim_mismatch"
345
+ SELECTED_ACTION_INCOMPATIBLE = "selected_action_incompatible"
346
+
347
+
348
+ @dataclass(frozen=True, slots=True)
349
+ class TreatmentPreflightRequest:
350
+ requirement: InsightTreatmentRequirement
351
+ operator_kind: str
352
+ editable_paths: tuple[str, ...]
353
+ insights: tuple[TreatmentInsightEvidence, ...]
354
+ finite_contract_sha256: str
355
+ actions: tuple[FiniteTreatmentAction, ...]
356
+
357
+ def __post_init__(self) -> None:
358
+ if type(self.requirement) is not InsightTreatmentRequirement:
359
+ raise TypeError("requirement must be an InsightTreatmentRequirement")
360
+ InsightTreatmentRequirement.__post_init__(self.requirement)
361
+ if type(self.operator_kind) is not str or not self.operator_kind:
362
+ raise ValueError("operator_kind must be non-empty")
363
+ _canonical_strings(self.editable_paths, name="editable_paths")
364
+ if type(self.insights) is not tuple or any(
365
+ type(value) is not TreatmentInsightEvidence for value in self.insights
366
+ ):
367
+ raise TypeError("insights must contain TreatmentInsightEvidence values")
368
+ if type(self.actions) is not tuple or not self.actions or any(
369
+ type(value) is not FiniteTreatmentAction for value in self.actions
370
+ ):
371
+ raise TypeError("actions must contain finite treatment actions")
372
+ for action in self.actions:
373
+ FiniteTreatmentAction.__post_init__(action)
374
+ action_bindings = tuple(action.binding() for action in self.actions)
375
+ if len(set(action_bindings)) != len(action_bindings):
376
+ raise ValueError("actions must use unique exact option bindings")
377
+ if len({action.option_id for action in self.actions}) != len(self.actions):
378
+ raise ValueError("actions must use unique option IDs")
379
+ require_sha256(self.finite_contract_sha256, "finite_contract_sha256")
380
+
381
+
382
+ @dataclass(frozen=True, slots=True)
383
+ class TreatmentPreflightReceipt:
384
+ requirement_sha256: str
385
+ finite_contract_sha256: str
386
+ compatible_actions: tuple[FiniteTreatmentAction, ...]
387
+ compatible_families: tuple[str, ...]
388
+ violations: tuple[TreatmentComplianceViolation, ...]
389
+ policy_id: str
390
+ policy_version: int
391
+ policy_definition_sha256: str
392
+ receipt_sha256: str = field(init=False)
393
+
394
+ def __post_init__(self) -> None:
395
+ require_sha256(self.requirement_sha256, "requirement_sha256")
396
+ require_sha256(self.finite_contract_sha256, "finite_contract_sha256")
397
+ if type(self.compatible_actions) is not tuple or any(
398
+ type(value) is not FiniteTreatmentAction
399
+ for value in self.compatible_actions
400
+ ):
401
+ raise TypeError("compatible_actions must contain exact actions")
402
+ _canonical_strings(self.compatible_families, name="compatible_families")
403
+ if type(self.violations) is not tuple or any(
404
+ type(value) is not TreatmentComplianceViolation
405
+ for value in self.violations
406
+ ):
407
+ raise TypeError("violations must contain exact violation values")
408
+ if self.violations != tuple(sorted(set(self.violations), key=str)):
409
+ raise ValueError("violations must be unique and canonical")
410
+ if type(self.policy_id) is not str or not self.policy_id:
411
+ raise ValueError("policy_id must be non-empty")
412
+ if type(self.policy_version) is not int or self.policy_version <= 0:
413
+ raise ValueError("policy_version must be positive")
414
+ require_sha256(self.policy_definition_sha256, "policy_definition_sha256")
415
+ object.__setattr__(
416
+ self,
417
+ "receipt_sha256",
418
+ _hash("treatment-preflight-receipt", self.to_record()),
419
+ )
420
+
421
+ @property
422
+ def passed(self) -> bool:
423
+ return not self.violations
424
+
425
+ def to_record(self) -> dict[str, object]:
426
+ return {
427
+ "schema_version": 1,
428
+ "requirement_sha256": self.requirement_sha256,
429
+ "finite_contract_sha256": self.finite_contract_sha256,
430
+ "compatible_actions": [
431
+ value.to_record() for value in self.compatible_actions
432
+ ],
433
+ "compatible_families": list(self.compatible_families),
434
+ "violations": [value.value for value in self.violations],
435
+ "policy_id": self.policy_id,
436
+ "policy_version": self.policy_version,
437
+ "policy_definition_sha256": self.policy_definition_sha256,
438
+ }
439
+
440
+
441
+ @dataclass(frozen=True, slots=True)
442
+ class TreatmentAdmissionRequest:
443
+ requirement: InsightTreatmentRequirement
444
+ preflight: TreatmentPreflightReceipt
445
+ claimed_insight_ids: tuple[str, ...]
446
+ selected_action: FiniteTreatmentAction
447
+ operator_compliant: bool
448
+
449
+ def __post_init__(self) -> None:
450
+ if type(self.requirement) is not InsightTreatmentRequirement:
451
+ raise TypeError("requirement must be exact")
452
+ InsightTreatmentRequirement.__post_init__(self.requirement)
453
+ if type(self.preflight) is not TreatmentPreflightReceipt:
454
+ raise TypeError("preflight must be exact")
455
+ TreatmentPreflightReceipt.__post_init__(self.preflight)
456
+ if self.preflight.requirement_sha256 != self.requirement.requirement_sha256:
457
+ raise ValueError("preflight is bound to a different requirement")
458
+ if not self.preflight.passed:
459
+ raise ValueError("admission requires a passing preflight receipt")
460
+ if type(self.claimed_insight_ids) is not tuple or any(
461
+ type(value) is not str or not value for value in self.claimed_insight_ids
462
+ ):
463
+ raise TypeError(
464
+ "claimed_insight_ids must contain only non-empty strings"
465
+ )
466
+ if type(self.selected_action) is not FiniteTreatmentAction:
467
+ raise TypeError("selected_action must be exact")
468
+ if type(self.operator_compliant) is not bool:
469
+ raise TypeError("operator_compliant must be bool")
470
+
471
+
472
+ @dataclass(frozen=True, slots=True)
473
+ class TreatmentAdmissionReceipt:
474
+ preflight_receipt_sha256: str
475
+ claimed_insight_ids: tuple[str, ...]
476
+ selected_action: FiniteTreatmentAction
477
+ violations: tuple[TreatmentComplianceViolation, ...]
478
+ policy_id: str
479
+ policy_version: int
480
+ policy_definition_sha256: str
481
+ evaluator_entered: bool = False
482
+ receipt_sha256: str = field(init=False)
483
+
484
+ def __post_init__(self) -> None:
485
+ require_sha256(self.preflight_receipt_sha256, "preflight_receipt_sha256")
486
+ if type(self.claimed_insight_ids) is not tuple:
487
+ raise TypeError("claimed_insight_ids must be a tuple")
488
+ if type(self.selected_action) is not FiniteTreatmentAction:
489
+ raise TypeError("selected_action must be exact")
490
+ if type(self.violations) is not tuple or any(
491
+ type(value) is not TreatmentComplianceViolation
492
+ for value in self.violations
493
+ ):
494
+ raise TypeError("violations must contain exact values")
495
+ if self.violations != tuple(sorted(set(self.violations), key=str)):
496
+ raise ValueError("violations must be unique and canonical")
497
+ if type(self.policy_id) is not str or not self.policy_id:
498
+ raise ValueError("policy_id must be non-empty")
499
+ if type(self.policy_version) is not int or self.policy_version <= 0:
500
+ raise ValueError("policy_version must be positive")
501
+ require_sha256(self.policy_definition_sha256, "policy_definition_sha256")
502
+ if self.evaluator_entered is not False:
503
+ raise ValueError(
504
+ "treatment admission receipts are issued before evaluator entry"
505
+ )
506
+ object.__setattr__(
507
+ self,
508
+ "receipt_sha256",
509
+ _hash("treatment-admission-receipt", self.to_record()),
510
+ )
511
+
512
+ @property
513
+ def passed(self) -> bool:
514
+ return not self.violations
515
+
516
+ def to_record(self) -> dict[str, object]:
517
+ return {
518
+ "schema_version": 1,
519
+ "preflight_receipt_sha256": self.preflight_receipt_sha256,
520
+ "claimed_insight_ids": list(self.claimed_insight_ids),
521
+ "selected_action": self.selected_action.to_record(),
522
+ "violations": [value.value for value in self.violations],
523
+ "policy_id": self.policy_id,
524
+ "policy_version": self.policy_version,
525
+ "policy_definition_sha256": self.policy_definition_sha256,
526
+ "evaluator_entered": self.evaluator_entered,
527
+ }
528
+
529
+
530
+ class TreatmentComplianceRejected(ValueError):
531
+ """Expected model-treatment mismatch; the evaluator must not run."""
532
+
533
+ def __init__(self, receipt: TreatmentAdmissionReceipt) -> None:
534
+ if type(receipt) is not TreatmentAdmissionReceipt or receipt.passed:
535
+ raise ValueError("rejection requires a failed admission receipt")
536
+ super().__init__("model proposal failed its assigned treatment contract")
537
+ self.receipt = receipt
538
+
539
+
540
+ @runtime_checkable
541
+ class TreatmentCompliancePolicy(Protocol):
542
+ policy_id: str
543
+ policy_version: int
544
+ definition_sha256: str
545
+
546
+ def preflight(
547
+ self, request: TreatmentPreflightRequest
548
+ ) -> TreatmentPreflightReceipt: ...
549
+
550
+ def assess(
551
+ self, request: TreatmentAdmissionRequest
552
+ ) -> TreatmentAdmissionReceipt: ...
553
+
554
+
555
+ @dataclass(frozen=True, slots=True)
556
+ class StrictTreatmentCompliancePolicy:
557
+ """Machine-verifiable treatment fidelity over a shared finite palette."""
558
+
559
+ policy_id: str = TREATMENT_COMPLIANCE_POLICY_ID
560
+ policy_version: int = TREATMENT_COMPLIANCE_POLICY_VERSION
561
+ definition_sha256: str = TREATMENT_COMPLIANCE_DEFINITION_SHA256
562
+
563
+ def preflight(
564
+ self, request: TreatmentPreflightRequest
565
+ ) -> TreatmentPreflightReceipt:
566
+ TreatmentPreflightRequest.__post_init__(request)
567
+ violations: set[TreatmentComplianceViolation] = set()
568
+ expected = request.requirement.required_insights
569
+ observed = tuple(value.reference for value in request.insights)
570
+ if observed != expected:
571
+ violations.add(TreatmentComplianceViolation.ASSIGNMENT_MISMATCH)
572
+ observed_bindings = tuple(value.binding() for value in request.insights)
573
+ if observed_bindings != request.requirement.insight_bindings:
574
+ violations.add(
575
+ TreatmentComplianceViolation.INSIGHT_EVIDENCE_MISMATCH
576
+ )
577
+ if (
578
+ request.finite_contract_sha256
579
+ != request.requirement.finite_contract_sha256
580
+ ):
581
+ violations.add(TreatmentComplianceViolation.FINITE_CONTRACT_MISMATCH)
582
+ trusted_action_bindings = {
583
+ action.binding() for action in request.actions
584
+ }
585
+ if not set(request.requirement.allowed_actions).issubset(
586
+ trusted_action_bindings
587
+ ):
588
+ violations.add(
589
+ TreatmentComplianceViolation.EXACT_ACTION_BINDING_MISMATCH
590
+ )
591
+ for insight in request.insights:
592
+ if (
593
+ insight.applicable_operator_kinds
594
+ and request.operator_kind not in insight.applicable_operator_kinds
595
+ ):
596
+ violations.add(TreatmentComplianceViolation.OPERATOR_INAPPLICABLE)
597
+ if request.requirement.require_changed_path_overlap and not _overlaps_any(
598
+ request.editable_paths, insight.affected_paths
599
+ ):
600
+ violations.add(TreatmentComplianceViolation.EDITABLE_PATH_DISJOINT)
601
+
602
+ family_sets = [
603
+ set(insight.recommended_option_families)
604
+ for insight in request.insights
605
+ ]
606
+ if request.requirement.require_option_family_match and any(
607
+ not values for values in family_sets
608
+ ):
609
+ violations.add(TreatmentComplianceViolation.INTERVENTION_FAMILY_MISSING)
610
+ common_families = (
611
+ set.intersection(*family_sets) if family_sets else set()
612
+ )
613
+ compatible = tuple(
614
+ action
615
+ for action in request.actions
616
+ if action.binding() in request.requirement.allowed_actions
617
+ and (
618
+ not request.requirement.require_option_family_match
619
+ or action.family in common_families
620
+ )
621
+ and (
622
+ not request.requirement.require_changed_path_overlap
623
+ or all(
624
+ _overlaps_any(action.changed_paths, insight.affected_paths)
625
+ for insight in request.insights
626
+ )
627
+ )
628
+ )
629
+ if not compatible:
630
+ violations.add(TreatmentComplianceViolation.NO_COMPATIBLE_FINITE_ACTION)
631
+ return TreatmentPreflightReceipt(
632
+ requirement_sha256=request.requirement.requirement_sha256,
633
+ finite_contract_sha256=request.finite_contract_sha256,
634
+ compatible_actions=compatible,
635
+ compatible_families=tuple(sorted({value.family for value in compatible})),
636
+ violations=tuple(sorted(violations, key=str)),
637
+ policy_id=self.policy_id,
638
+ policy_version=self.policy_version,
639
+ policy_definition_sha256=self.definition_sha256,
640
+ )
641
+
642
+ def assess(
643
+ self, request: TreatmentAdmissionRequest
644
+ ) -> TreatmentAdmissionReceipt:
645
+ TreatmentAdmissionRequest.__post_init__(request)
646
+ violations: set[TreatmentComplianceViolation] = set()
647
+ claims = request.claimed_insight_ids
648
+ required_ids = tuple(
649
+ value.insight_id.value for value in request.requirement.required_insights
650
+ )
651
+ if len(set(claims)) != len(claims):
652
+ violations.add(TreatmentComplianceViolation.DUPLICATE_CLAIM)
653
+ if not set(claims).issubset(required_ids):
654
+ violations.add(TreatmentComplianceViolation.FOREIGN_CLAIM)
655
+ if (
656
+ request.requirement.claim_mode is TreatmentClaimMode.EXACT_REQUIRED
657
+ and set(claims) != set(required_ids)
658
+ ):
659
+ violations.add(TreatmentComplianceViolation.EXACT_CLAIM_MISMATCH)
660
+ if not request.operator_compliant:
661
+ violations.add(TreatmentComplianceViolation.OPERATOR_NONCOMPLIANT)
662
+ if request.selected_action not in request.preflight.compatible_actions:
663
+ violations.add(TreatmentComplianceViolation.SELECTED_ACTION_INCOMPATIBLE)
664
+ return TreatmentAdmissionReceipt(
665
+ preflight_receipt_sha256=request.preflight.receipt_sha256,
666
+ claimed_insight_ids=claims,
667
+ selected_action=request.selected_action,
668
+ violations=tuple(sorted(violations, key=str)),
669
+ policy_id=self.policy_id,
670
+ policy_version=self.policy_version,
671
+ policy_definition_sha256=self.definition_sha256,
672
+ )
673
+
674
+
675
+ def validate_treatment_preflight_receipt(
676
+ request: TreatmentPreflightRequest,
677
+ receipt: TreatmentPreflightReceipt,
678
+ ) -> None:
679
+ """Independently enforce exact-action invariants on an injected policy."""
680
+
681
+ if type(request) is not TreatmentPreflightRequest:
682
+ raise TypeError("request must be an exact TreatmentPreflightRequest")
683
+ TreatmentPreflightRequest.__post_init__(request)
684
+ if type(receipt) is not TreatmentPreflightReceipt:
685
+ raise TypeError("receipt must be an exact TreatmentPreflightReceipt")
686
+ TreatmentPreflightReceipt.__post_init__(receipt)
687
+ if receipt.requirement_sha256 != request.requirement.requirement_sha256:
688
+ raise ValueError("preflight receipt changed the treatment requirement")
689
+ if receipt.finite_contract_sha256 != request.finite_contract_sha256:
690
+ raise ValueError("preflight receipt changed the finite contract")
691
+ trusted_actions = set(request.actions)
692
+ if any(action not in trusted_actions for action in receipt.compatible_actions):
693
+ raise ValueError("preflight receipt introduced an untrusted finite action")
694
+ if receipt.compatible_families != tuple(
695
+ sorted({action.family for action in receipt.compatible_actions})
696
+ ):
697
+ raise ValueError("preflight receipt family projection is inconsistent")
698
+
699
+ core_receipt = StrictTreatmentCompliancePolicy().preflight(request)
700
+ core_violations = set(core_receipt.violations)
701
+ if not core_violations.issubset(receipt.violations):
702
+ raise ValueError("preflight receipt omitted a mandatory core violation")
703
+ if receipt.passed and (
704
+ not receipt.compatible_actions
705
+ or not set(receipt.compatible_actions).issubset(
706
+ core_receipt.compatible_actions
707
+ )
708
+ ):
709
+ raise ValueError(
710
+ "passing preflight must retain a nonempty trusted compatible subset"
711
+ )
712
+
713
+
714
+ def validate_treatment_admission_receipt(
715
+ request: TreatmentAdmissionRequest,
716
+ receipt: TreatmentAdmissionReceipt,
717
+ ) -> None:
718
+ """Verify echoed proposal facts and mandatory pre-evaluator violations."""
719
+
720
+ if type(request) is not TreatmentAdmissionRequest:
721
+ raise TypeError("request must be an exact TreatmentAdmissionRequest")
722
+ TreatmentAdmissionRequest.__post_init__(request)
723
+ if type(receipt) is not TreatmentAdmissionReceipt:
724
+ raise TypeError("receipt must be an exact TreatmentAdmissionReceipt")
725
+ TreatmentAdmissionReceipt.__post_init__(receipt)
726
+ if receipt.preflight_receipt_sha256 != request.preflight.receipt_sha256:
727
+ raise ValueError("admission receipt changed the preflight identity")
728
+ if receipt.claimed_insight_ids != request.claimed_insight_ids:
729
+ raise ValueError("admission receipt changed the model's insight claims")
730
+ if receipt.selected_action != request.selected_action:
731
+ raise ValueError("admission receipt changed the selected finite action")
732
+
733
+ core_receipt = StrictTreatmentCompliancePolicy().assess(request)
734
+ if not set(core_receipt.violations).issubset(receipt.violations):
735
+ raise ValueError("admission receipt omitted a mandatory core violation")
736
+
737
+
738
+ __all__ = [
739
+ "FiniteTreatmentAction",
740
+ "InsightTreatmentRequirement",
741
+ "StrictTreatmentCompliancePolicy",
742
+ "TREATMENT_COMPLIANCE_DEFINITION_SHA256",
743
+ "TREATMENT_COMPLIANCE_POLICY_ID",
744
+ "TREATMENT_COMPLIANCE_POLICY_VERSION",
745
+ "TreatmentAdmissionReceipt",
746
+ "TreatmentAdmissionRequest",
747
+ "TreatmentActionBinding",
748
+ "TreatmentAssignmentRole",
749
+ "TreatmentClaimMode",
750
+ "TreatmentCompliancePolicy",
751
+ "TreatmentComplianceRejected",
752
+ "TreatmentComplianceViolation",
753
+ "TreatmentInsightEvidence",
754
+ "TreatmentInsightBinding",
755
+ "TreatmentPreflightReceipt",
756
+ "TreatmentPreflightRequest",
757
+ "validate_treatment_admission_receipt",
758
+ "validate_treatment_preflight_receipt",
759
+ ]