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,297 @@
1
+ """Deterministic lane-level resolution over the typed memory transfer ladder.
2
+
3
+ This module is deliberately independent of campaign workloads and providers.
4
+ A caller supplies one current finite-action lane plus source-bound card
5
+ semantics. The resolver prefers exact replay support, then local advisory
6
+ support, then path/family advisory support, and uses an authenticated key only
7
+ to break ties inside the best available tier.
8
+
9
+ The result is a retrieval decision, not a causal memory result. Advisory
10
+ support can be rendered into a prompt but cannot become a bounded forced-action
11
+ dose. No tier authorizes causal card credit without a separate exposure design.
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ import hashlib
17
+ import json
18
+ import re
19
+ from dataclasses import dataclass, field
20
+
21
+ from agent_evolve.application.portfolio_memory_dose import (
22
+ PortfolioMemoryDoseCardSemantics,
23
+ PortfolioMemoryTransferLadderAssessment,
24
+ PortfolioMemoryTransferTier,
25
+ assess_portfolio_memory_transfer_ladder,
26
+ derive_portfolio_memory_advisory_card_support,
27
+ )
28
+ from agent_evolve.domain.finite_variation import (
29
+ FiniteVariationContract,
30
+ validate_finite_variation_contract,
31
+ )
32
+ from agent_evolve.domain.patch import require_sha256
33
+ from agent_evolve.ports.portfolio_memory_dose import PortfolioMemoryDoseCardSupport
34
+
35
+
36
+ _TOKEN = re.compile(r"^[a-z][a-z0-9_.:-]{0,255}$")
37
+ PORTFOLIO_MEMORY_TRANSFER_LANE_RESOLVER_ID = (
38
+ "typed_portfolio_memory_transfer_lane_resolver"
39
+ )
40
+ PORTFOLIO_MEMORY_TRANSFER_LANE_RESOLVER_VERSION = 1
41
+ PORTFOLIO_MEMORY_TRANSFER_LANE_RESOLVER_DEFINITION_SHA256 = hashlib.sha256(
42
+ b"agent-evolve:typed-portfolio-memory-transfer-lane-resolver:v1;"
43
+ b"tier-order=exact,local-advisory,path-family-advisory;"
44
+ b"best-tier-only=true;within-tier=authenticated-keyed-order;"
45
+ b"provider-and-outcome-blind=true;causal-memory-credit=false"
46
+ ).hexdigest()
47
+ _SELECTION_DOMAIN = (
48
+ b"agent-evolve:typed-portfolio-memory-transfer-lane-card-order:v1\x00"
49
+ )
50
+ _RECEIPT_DOMAIN = b"agent-evolve:typed-portfolio-memory-transfer-lane:v1\x00"
51
+
52
+
53
+ def _canonical_json(value: object) -> bytes:
54
+ return json.dumps(
55
+ value,
56
+ allow_nan=False,
57
+ ensure_ascii=True,
58
+ separators=(",", ":"),
59
+ sort_keys=True,
60
+ ).encode("ascii", errors="strict")
61
+
62
+
63
+ def _tier_rank(value: PortfolioMemoryTransferTier) -> int:
64
+ return {
65
+ PortfolioMemoryTransferTier.EXACT_ACTION_REPLAY: 0,
66
+ PortfolioMemoryTransferTier.LOCAL_ACTION_ADVISORY: 1,
67
+ PortfolioMemoryTransferTier.PATH_FAMILY_ADVISORY: 2,
68
+ PortfolioMemoryTransferTier.UNSUPPORTED: 3,
69
+ }[value]
70
+
71
+
72
+ @dataclass(frozen=True, slots=True)
73
+ class PortfolioMemoryTransferCard:
74
+ """One source-bound card available for typed transfer into a lane."""
75
+
76
+ card_key: str
77
+ card_identity_sha256: str
78
+ semantics: PortfolioMemoryDoseCardSemantics
79
+
80
+ def __post_init__(self) -> None:
81
+ if type(self.card_key) is not str or _TOKEN.fullmatch(self.card_key) is None:
82
+ raise ValueError("card_key must use the closed token grammar")
83
+ require_sha256(self.card_identity_sha256, "card_identity_sha256")
84
+ if type(self.semantics) is not PortfolioMemoryDoseCardSemantics:
85
+ raise TypeError("semantics must be exact PortfolioMemoryDoseCardSemantics")
86
+ self.semantics.__post_init__()
87
+ if self.semantics.card_key != self.card_key:
88
+ raise ValueError("card and transfer semantics use different keys")
89
+
90
+
91
+ @dataclass(frozen=True, slots=True)
92
+ class PortfolioMemoryTransferLane:
93
+ """One stable lane and its complete current finite-action contract."""
94
+
95
+ lane_id: str
96
+ lane_identity_sha256: str
97
+ finite_variation_contract: FiniteVariationContract
98
+
99
+ def __post_init__(self) -> None:
100
+ if type(self.lane_id) is not str or _TOKEN.fullmatch(self.lane_id) is None:
101
+ raise ValueError("lane_id must use the closed token grammar")
102
+ require_sha256(self.lane_identity_sha256, "lane_identity_sha256")
103
+ if type(self.finite_variation_contract) is not FiniteVariationContract:
104
+ raise TypeError("finite_variation_contract must be exact")
105
+ validate_finite_variation_contract(self.finite_variation_contract)
106
+
107
+
108
+ @dataclass(frozen=True, slots=True)
109
+ class PortfolioMemoryTransferLaneResolution:
110
+ """Replayable result of one best-tier, keyed lane/card resolution."""
111
+
112
+ lane_id: str
113
+ lane_identity_sha256: str
114
+ selection_key_sha256: str
115
+ eligible_assessments: tuple[PortfolioMemoryTransferLadderAssessment, ...]
116
+ selected_card_key: str | None
117
+ selected_assessment: PortfolioMemoryTransferLadderAssessment | None
118
+ selected_support: PortfolioMemoryDoseCardSupport | None
119
+ receipt_sha256: str = field(init=False)
120
+
121
+ def __post_init__(self) -> None:
122
+ if type(self.lane_id) is not str or _TOKEN.fullmatch(self.lane_id) is None:
123
+ raise ValueError("lane_id must use the closed token grammar")
124
+ require_sha256(self.lane_identity_sha256, "lane_identity_sha256")
125
+ require_sha256(self.selection_key_sha256, "selection_key_sha256")
126
+ values = self.eligible_assessments
127
+ if type(values) is not tuple or any(
128
+ type(value) is not PortfolioMemoryTransferLadderAssessment
129
+ for value in values
130
+ ):
131
+ raise TypeError("eligible_assessments must contain exact assessments")
132
+ for value in values:
133
+ value.__post_init__()
134
+ if not value.deliverable_option_ids:
135
+ raise ValueError("eligible assessment is not deliverable")
136
+ if tuple(value.card_key for value in values) != tuple(
137
+ sorted({value.card_key for value in values})
138
+ ):
139
+ raise ValueError("eligible assessments must use canonical unique cards")
140
+ selected = self.selected_assessment
141
+ support = self.selected_support
142
+ if self.selected_card_key is None:
143
+ if values or selected is not None or support is not None:
144
+ raise ValueError("ineligible resolution cannot contain selected evidence")
145
+ else:
146
+ if type(selected) is not PortfolioMemoryTransferLadderAssessment:
147
+ raise TypeError("eligible resolution requires a selected assessment")
148
+ selected.__post_init__()
149
+ if selected.card_key != self.selected_card_key or selected not in values:
150
+ raise ValueError("selected assessment is outside the eligible cards")
151
+ if type(support) is not PortfolioMemoryDoseCardSupport:
152
+ raise TypeError("eligible resolution requires exact selected support")
153
+ support.__post_init__()
154
+ if (
155
+ support.card_key != self.selected_card_key
156
+ or tuple(value[0] for value in support.compatible_options)
157
+ != selected.deliverable_option_ids
158
+ ):
159
+ raise ValueError("selected support differs from its ladder assessment")
160
+ best_rank = min(_tier_rank(value.tier) for value in values)
161
+ if _tier_rank(selected.tier) != best_rank:
162
+ raise ValueError("selected assessment does not use the best tier")
163
+ object.__setattr__(
164
+ self,
165
+ "receipt_sha256",
166
+ hashlib.sha256(_RECEIPT_DOMAIN + _canonical_json(self._unsigned_record()))
167
+ .hexdigest(),
168
+ )
169
+
170
+ @property
171
+ def eligible(self) -> bool:
172
+ return self.selected_card_key is not None
173
+
174
+ def _unsigned_record(self) -> dict[str, object]:
175
+ return {
176
+ "schema_version": 1,
177
+ "lane_id": self.lane_id,
178
+ "lane_identity_sha256": self.lane_identity_sha256,
179
+ "selection_key_sha256": self.selection_key_sha256,
180
+ "eligible": self.eligible,
181
+ "eligible_assessments": [
182
+ value.to_record() for value in self.eligible_assessments
183
+ ],
184
+ "selected_card_key": self.selected_card_key,
185
+ "selected_assessment_sha256": (
186
+ None
187
+ if self.selected_assessment is None
188
+ else self.selected_assessment.assessment_sha256
189
+ ),
190
+ "selected_support": (
191
+ None if self.selected_support is None else self.selected_support.to_record()
192
+ ),
193
+ "policy": {
194
+ "policy_id": PORTFOLIO_MEMORY_TRANSFER_LANE_RESOLVER_ID,
195
+ "policy_version": PORTFOLIO_MEMORY_TRANSFER_LANE_RESOLVER_VERSION,
196
+ "definition_sha256": (
197
+ PORTFOLIO_MEMORY_TRANSFER_LANE_RESOLVER_DEFINITION_SHA256
198
+ ),
199
+ },
200
+ "provider_fields_consulted": False,
201
+ "outcome_values_consulted": False,
202
+ "card_vs_neutral_effect_identified": False,
203
+ "online_causal_credit_allowed": False,
204
+ }
205
+
206
+ def to_record(self) -> dict[str, object]:
207
+ self.__post_init__()
208
+ return {**self._unsigned_record(), "receipt_sha256": self.receipt_sha256}
209
+
210
+
211
+ @dataclass(frozen=True, slots=True)
212
+ class PortfolioMemoryTransferLaneResolver:
213
+ """Resolve one lane using typed authority and deterministic keyed ties."""
214
+
215
+ def resolve(
216
+ self,
217
+ *,
218
+ lane: PortfolioMemoryTransferLane,
219
+ cards: tuple[PortfolioMemoryTransferCard, ...],
220
+ selection_key_sha256: str,
221
+ ) -> PortfolioMemoryTransferLaneResolution:
222
+ if type(lane) is not PortfolioMemoryTransferLane:
223
+ raise TypeError("lane must be exact PortfolioMemoryTransferLane")
224
+ lane.__post_init__()
225
+ if type(cards) is not tuple or not cards or any(
226
+ type(value) is not PortfolioMemoryTransferCard for value in cards
227
+ ):
228
+ raise ValueError("cards must contain exact transfer cards")
229
+ for value in cards:
230
+ value.__post_init__()
231
+ if tuple(value.card_key for value in cards) != tuple(
232
+ sorted({value.card_key for value in cards})
233
+ ):
234
+ raise ValueError("transfer cards must be unique and canonical")
235
+ require_sha256(selection_key_sha256, "selection_key_sha256")
236
+ assessments = tuple(
237
+ assessment
238
+ for card in cards
239
+ if (
240
+ assessment := assess_portfolio_memory_transfer_ladder(
241
+ card.semantics,
242
+ lane.finite_variation_contract,
243
+ )
244
+ ).deliverable_option_ids
245
+ )
246
+ if not assessments:
247
+ return PortfolioMemoryTransferLaneResolution(
248
+ lane_id=lane.lane_id,
249
+ lane_identity_sha256=lane.lane_identity_sha256,
250
+ selection_key_sha256=selection_key_sha256,
251
+ eligible_assessments=(),
252
+ selected_card_key=None,
253
+ selected_assessment=None,
254
+ selected_support=None,
255
+ )
256
+ best_rank = min(_tier_rank(value.tier) for value in assessments)
257
+ best = tuple(value for value in assessments if _tier_rank(value.tier) == best_rank)
258
+ cards_by_key = {value.card_key: value for value in cards}
259
+ selected = min(
260
+ best,
261
+ key=lambda value: (
262
+ hashlib.sha256(
263
+ _SELECTION_DOMAIN
264
+ + bytes.fromhex(selection_key_sha256)
265
+ + bytes.fromhex(lane.lane_identity_sha256)
266
+ + value.card_key.encode("ascii", errors="strict")
267
+ + bytes.fromhex(
268
+ cards_by_key[value.card_key].card_identity_sha256
269
+ )
270
+ ).digest(),
271
+ value.card_key,
272
+ ),
273
+ )
274
+ support = derive_portfolio_memory_advisory_card_support(
275
+ cards_by_key[selected.card_key].semantics,
276
+ lane.finite_variation_contract,
277
+ )
278
+ return PortfolioMemoryTransferLaneResolution(
279
+ lane_id=lane.lane_id,
280
+ lane_identity_sha256=lane.lane_identity_sha256,
281
+ selection_key_sha256=selection_key_sha256,
282
+ eligible_assessments=assessments,
283
+ selected_card_key=selected.card_key,
284
+ selected_assessment=selected,
285
+ selected_support=support,
286
+ )
287
+
288
+
289
+ __all__ = [
290
+ "PORTFOLIO_MEMORY_TRANSFER_LANE_RESOLVER_DEFINITION_SHA256",
291
+ "PORTFOLIO_MEMORY_TRANSFER_LANE_RESOLVER_ID",
292
+ "PORTFOLIO_MEMORY_TRANSFER_LANE_RESOLVER_VERSION",
293
+ "PortfolioMemoryTransferCard",
294
+ "PortfolioMemoryTransferLane",
295
+ "PortfolioMemoryTransferLaneResolution",
296
+ "PortfolioMemoryTransferLaneResolver",
297
+ ]
@@ -0,0 +1,363 @@
1
+ """Workload-neutral signed semantics for optimization-memory consumption.
2
+
3
+ Reflection cards describe hypotheses, while their evidence lineage contains
4
+ engine-authenticated parent-relative metric effects. Optimization must not
5
+ confuse an observed action with a recommendation: a card can be valuable
6
+ because it records an action to avoid. This module therefore derives a
7
+ conservative signed disposition exclusively from authenticated evidence and
8
+ the benchmark's declared metric senses.
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ import hashlib
14
+ from dataclasses import dataclass
15
+ from enum import Enum
16
+
17
+ from agent_evolve.application.identifiable_reflection_request import (
18
+ IDENTIFIABLE_REFLECTION_FACT_SCHEMA_DEFINITION_SHA256,
19
+ IDENTIFIABLE_REFLECTION_FACT_SCHEMA_ID,
20
+ IDENTIFIABLE_REFLECTION_FACT_SCHEMA_VERSION,
21
+ )
22
+ from agent_evolve.application.insight_memory import InsightEvidenceLineage
23
+ from agent_evolve.core.optimization_semantics import (
24
+ MetricRole,
25
+ MetricSense,
26
+ OptimizationSemantics,
27
+ )
28
+ from agent_evolve.domain.typed_json import thaw_json
29
+ from agent_evolve.ports.agentic_generator import MetricEffectDirection
30
+
31
+
32
+ PORTFOLIO_OPTIMIZATION_MEMORY_POLICY_ID = (
33
+ "authenticated_dominance_signed_optimization_memory"
34
+ )
35
+ PORTFOLIO_OPTIMIZATION_MEMORY_POLICY_VERSION = 1
36
+ PORTFOLIO_OPTIMIZATION_MEMORY_POLICY_DEFINITION_SHA256 = hashlib.sha256(
37
+ b"agent-evolve:authenticated-dominance-signed-optimization-memory:v1;"
38
+ b"authenticated-identifiable-evidence-only;declared-objective-senses;"
39
+ b"favorable-dose-only;unfavorable-avoidance-advisory;"
40
+ b"tradeoff-neutral-unresolved-no-forced-dose"
41
+ ).hexdigest()
42
+
43
+
44
+ class PortfolioOptimizationMemoryDisposition(str, Enum):
45
+ """How an empirically observed action relates to declared objectives."""
46
+
47
+ DOMINANCE_FAVORABLE = "dominance_favorable"
48
+ DOMINANCE_UNFAVORABLE = "dominance_unfavorable"
49
+ TRADEOFF = "tradeoff"
50
+ NEUTRAL = "neutral"
51
+ UNRESOLVED = "unresolved"
52
+
53
+
54
+ class PortfolioOptimizationMemoryDirective(str, Enum):
55
+ """Prompt-safe consumption rule derived from a signed disposition."""
56
+
57
+ PREFER_OR_TEST = "prefer_or_test_supported_action"
58
+ AVOID_EXCEPT_FALSIFICATION = (
59
+ "avoid_supported_action_except_explicit_falsification"
60
+ )
61
+ CONSIDER_FOR_FRONTIER_TRADEOFF = "consider_only_for_frontier_tradeoff"
62
+ DO_NOT_PRIORITIZE = "do_not_prioritize_supported_action"
63
+ TREAT_AS_UNVERIFIED = "treat_as_unverified_context"
64
+
65
+
66
+ @dataclass(frozen=True, slots=True)
67
+ class PortfolioOptimizationMetricSign:
68
+ """Authenticated consensus direction for one declared objective."""
69
+
70
+ metric_id: str
71
+ metric_name: str
72
+ sense: MetricSense
73
+ observed_direction: MetricEffectDirection
74
+ signed_effect: int
75
+ observation_count: int
76
+
77
+ def __post_init__(self) -> None:
78
+ if type(self.metric_id) is not str or not self.metric_id:
79
+ raise ValueError("metric_id must be non-empty")
80
+ if type(self.metric_name) is not str or not self.metric_name:
81
+ raise ValueError("metric_name must be non-empty")
82
+ if type(self.sense) is not MetricSense:
83
+ raise TypeError("sense must be an exact MetricSense")
84
+ if type(self.observed_direction) is not MetricEffectDirection:
85
+ raise TypeError("observed_direction must be exact")
86
+ if self.observed_direction is MetricEffectDirection.UNKNOWN:
87
+ raise ValueError("authenticated observations cannot be unknown")
88
+ if type(self.signed_effect) is not int or self.signed_effect not in {-1, 0, 1}:
89
+ raise ValueError("signed_effect must be -1, zero, or one")
90
+ if type(self.observation_count) is not int or self.observation_count <= 0:
91
+ raise ValueError("observation_count must be positive")
92
+
93
+ def to_record(self) -> dict[str, object]:
94
+ self.__post_init__()
95
+ return {
96
+ "metric_id": self.metric_id,
97
+ "metric_name": self.metric_name,
98
+ "sense": self.sense.value,
99
+ "observed_direction": self.observed_direction.value,
100
+ "signed_effect": self.signed_effect,
101
+ "observation_count": self.observation_count,
102
+ }
103
+
104
+
105
+ @dataclass(frozen=True, slots=True)
106
+ class PortfolioOptimizationMemoryAssessment:
107
+ """Auditable signed treatment decision for one reflected-card lineage."""
108
+
109
+ disposition: PortfolioOptimizationMemoryDisposition
110
+ directive: PortfolioOptimizationMemoryDirective
111
+ metric_signs: tuple[PortfolioOptimizationMetricSign, ...]
112
+ lineage_identity_sha256: str
113
+ optimization_semantics_definition_sha256: str
114
+ evidence_snapshot_count: int
115
+ unresolved_reason: str | None = None
116
+
117
+ def __post_init__(self) -> None:
118
+ if type(self.disposition) is not PortfolioOptimizationMemoryDisposition:
119
+ raise TypeError("disposition must be exact")
120
+ if type(self.directive) is not PortfolioOptimizationMemoryDirective:
121
+ raise TypeError("directive must be exact")
122
+ if type(self.metric_signs) is not tuple or any(
123
+ type(value) is not PortfolioOptimizationMetricSign
124
+ for value in self.metric_signs
125
+ ):
126
+ raise TypeError("metric_signs must contain exact values")
127
+ for value in self.metric_signs:
128
+ value.__post_init__()
129
+ if self.metric_signs != tuple(
130
+ sorted(self.metric_signs, key=lambda value: value.metric_id)
131
+ ):
132
+ raise ValueError("metric_signs must use canonical metric order")
133
+ for name in (
134
+ "lineage_identity_sha256",
135
+ "optimization_semantics_definition_sha256",
136
+ ):
137
+ value = getattr(self, name)
138
+ if (
139
+ type(value) is not str
140
+ or len(value) != 64
141
+ or any(character not in "0123456789abcdef" for character in value)
142
+ ):
143
+ raise ValueError(f"{name} must be lowercase SHA-256")
144
+ if type(self.evidence_snapshot_count) is not int or self.evidence_snapshot_count < 0:
145
+ raise ValueError("evidence_snapshot_count must be non-negative")
146
+ if self.disposition is PortfolioOptimizationMemoryDisposition.UNRESOLVED:
147
+ if type(self.unresolved_reason) is not str or not self.unresolved_reason:
148
+ raise ValueError("unresolved assessment requires a reason")
149
+ if self.metric_signs:
150
+ raise ValueError("unresolved assessment cannot publish partial signs")
151
+ elif self.unresolved_reason is not None or not self.metric_signs:
152
+ raise ValueError("resolved assessment requires signs and no reason")
153
+ expected_directive = {
154
+ PortfolioOptimizationMemoryDisposition.DOMINANCE_FAVORABLE: (
155
+ PortfolioOptimizationMemoryDirective.PREFER_OR_TEST
156
+ ),
157
+ PortfolioOptimizationMemoryDisposition.DOMINANCE_UNFAVORABLE: (
158
+ PortfolioOptimizationMemoryDirective.AVOID_EXCEPT_FALSIFICATION
159
+ ),
160
+ PortfolioOptimizationMemoryDisposition.TRADEOFF: (
161
+ PortfolioOptimizationMemoryDirective.CONSIDER_FOR_FRONTIER_TRADEOFF
162
+ ),
163
+ PortfolioOptimizationMemoryDisposition.NEUTRAL: (
164
+ PortfolioOptimizationMemoryDirective.DO_NOT_PRIORITIZE
165
+ ),
166
+ PortfolioOptimizationMemoryDisposition.UNRESOLVED: (
167
+ PortfolioOptimizationMemoryDirective.TREAT_AS_UNVERIFIED
168
+ ),
169
+ }[self.disposition]
170
+ if self.directive is not expected_directive:
171
+ raise ValueError("directive differs from the signed disposition")
172
+
173
+ @property
174
+ def forced_action_dose_allowed(self) -> bool:
175
+ self.__post_init__()
176
+ return self.disposition is (
177
+ PortfolioOptimizationMemoryDisposition.DOMINANCE_FAVORABLE
178
+ )
179
+
180
+ def to_record(self) -> dict[str, object]:
181
+ self.__post_init__()
182
+ return {
183
+ "schema_version": 1,
184
+ "policy": {
185
+ "policy_id": PORTFOLIO_OPTIMIZATION_MEMORY_POLICY_ID,
186
+ "policy_version": PORTFOLIO_OPTIMIZATION_MEMORY_POLICY_VERSION,
187
+ "definition_sha256": (
188
+ PORTFOLIO_OPTIMIZATION_MEMORY_POLICY_DEFINITION_SHA256
189
+ ),
190
+ },
191
+ "disposition": self.disposition.value,
192
+ "directive": self.directive.value,
193
+ "forced_action_dose_allowed": self.forced_action_dose_allowed,
194
+ "metric_signs": [value.to_record() for value in self.metric_signs],
195
+ "lineage_identity_sha256": self.lineage_identity_sha256,
196
+ "optimization_semantics_definition_sha256": (
197
+ self.optimization_semantics_definition_sha256
198
+ ),
199
+ "evidence_snapshot_count": self.evidence_snapshot_count,
200
+ "unresolved_reason": self.unresolved_reason,
201
+ "evidence_authority": "authenticated_empirical_snapshots_only",
202
+ "model_prose_used_for_sign": False,
203
+ }
204
+
205
+
206
+ def _unresolved(
207
+ lineage: InsightEvidenceLineage,
208
+ semantics: OptimizationSemantics,
209
+ reason: str,
210
+ ) -> PortfolioOptimizationMemoryAssessment:
211
+ return PortfolioOptimizationMemoryAssessment(
212
+ disposition=PortfolioOptimizationMemoryDisposition.UNRESOLVED,
213
+ directive=PortfolioOptimizationMemoryDirective.TREAT_AS_UNVERIFIED,
214
+ metric_signs=(),
215
+ lineage_identity_sha256=lineage.identity_sha256,
216
+ optimization_semantics_definition_sha256=semantics.definition_sha256,
217
+ evidence_snapshot_count=len(lineage.empirical_evidence),
218
+ unresolved_reason=reason,
219
+ )
220
+
221
+
222
+ def _signed_effect(
223
+ direction: MetricEffectDirection,
224
+ sense: MetricSense,
225
+ ) -> int | None:
226
+ if direction is MetricEffectDirection.UNCHANGED:
227
+ return 0
228
+ if sense is MetricSense.MINIMIZE:
229
+ return 1 if direction is MetricEffectDirection.DECREASE else -1
230
+ if sense is MetricSense.MAXIMIZE:
231
+ return 1 if direction is MetricEffectDirection.INCREASE else -1
232
+ return None
233
+
234
+
235
+ def assess_portfolio_optimization_memory(
236
+ lineage: InsightEvidenceLineage,
237
+ semantics: OptimizationSemantics,
238
+ ) -> PortfolioOptimizationMemoryAssessment:
239
+ """Classify one card without consulting provider prose or future outcomes."""
240
+
241
+ if type(lineage) is not InsightEvidenceLineage:
242
+ raise TypeError("lineage must be exact")
243
+ if type(semantics) is not OptimizationSemantics:
244
+ raise TypeError("semantics must be exact")
245
+ lineage.__post_init__()
246
+ semantics.__post_init__()
247
+ snapshots = lineage.empirical_evidence
248
+ if not snapshots:
249
+ return _unresolved(lineage, semantics, "no_authenticated_empirical_evidence")
250
+
251
+ objective_metrics = tuple(
252
+ metric for metric in semantics.metrics if metric.role is MetricRole.OBJECTIVE
253
+ )
254
+ if not objective_metrics:
255
+ return _unresolved(lineage, semantics, "no_declared_objectives")
256
+ metric_by_external_id = {}
257
+ for metric in objective_metrics:
258
+ for key in (metric.metric_id, metric.name):
259
+ prior = metric_by_external_id.get(key)
260
+ if prior is not None and prior != metric:
261
+ return _unresolved(lineage, semantics, "ambiguous_metric_identifier")
262
+ metric_by_external_id[key] = metric
263
+
264
+ directions: dict[str, list[MetricEffectDirection]] = {
265
+ metric.metric_id: [] for metric in objective_metrics
266
+ }
267
+ for snapshot in snapshots:
268
+ if (
269
+ snapshot.fact_schema_id != IDENTIFIABLE_REFLECTION_FACT_SCHEMA_ID
270
+ or snapshot.fact_schema_version
271
+ != IDENTIFIABLE_REFLECTION_FACT_SCHEMA_VERSION
272
+ or snapshot.fact_schema_definition_sha256
273
+ != IDENTIFIABLE_REFLECTION_FACT_SCHEMA_DEFINITION_SHA256
274
+ ):
275
+ return _unresolved(lineage, semantics, "foreign_empirical_fact_schema")
276
+ if (
277
+ snapshot.optimization_semantics_definition_sha256
278
+ != semantics.definition_sha256
279
+ ):
280
+ return _unresolved(lineage, semantics, "optimization_semantics_mismatch")
281
+ facts = thaw_json(snapshot.facts)
282
+ rows = facts.get("observed_metric_effects")
283
+ if type(rows) is not list:
284
+ return _unresolved(lineage, semantics, "missing_observed_metric_effects")
285
+ observed_metric_ids: set[str] = set()
286
+ for row in rows:
287
+ if type(row) is not dict:
288
+ return _unresolved(lineage, semantics, "malformed_metric_effect")
289
+ external_id = row.get("metric_id")
290
+ direction_text = row.get("direction")
291
+ if type(external_id) is not str or external_id in observed_metric_ids:
292
+ return _unresolved(lineage, semantics, "duplicate_or_invalid_metric")
293
+ observed_metric_ids.add(external_id)
294
+ metric = metric_by_external_id.get(external_id)
295
+ if metric is None:
296
+ continue
297
+ try:
298
+ direction = MetricEffectDirection(direction_text)
299
+ except (TypeError, ValueError):
300
+ return _unresolved(lineage, semantics, "invalid_metric_direction")
301
+ if direction is MetricEffectDirection.UNKNOWN:
302
+ return _unresolved(lineage, semantics, "unknown_metric_direction")
303
+ directions[metric.metric_id].append(direction)
304
+
305
+ signs: list[PortfolioOptimizationMetricSign] = []
306
+ for metric in objective_metrics:
307
+ values = directions[metric.metric_id]
308
+ if len(values) != len(snapshots):
309
+ return _unresolved(lineage, semantics, "incomplete_objective_coverage")
310
+ unique = set(values)
311
+ if len(unique) != 1:
312
+ return _unresolved(lineage, semantics, "conflicting_observed_directions")
313
+ direction = values[0]
314
+ signed = _signed_effect(direction, metric.sense)
315
+ if signed is None:
316
+ return _unresolved(lineage, semantics, "non_monotone_objective_sense")
317
+ signs.append(
318
+ PortfolioOptimizationMetricSign(
319
+ metric_id=metric.metric_id,
320
+ metric_name=metric.name,
321
+ sense=metric.sense,
322
+ observed_direction=direction,
323
+ signed_effect=signed,
324
+ observation_count=len(values),
325
+ )
326
+ )
327
+
328
+ positive = sum(value.signed_effect > 0 for value in signs)
329
+ negative = sum(value.signed_effect < 0 for value in signs)
330
+ if positive and not negative:
331
+ disposition = PortfolioOptimizationMemoryDisposition.DOMINANCE_FAVORABLE
332
+ directive = PortfolioOptimizationMemoryDirective.PREFER_OR_TEST
333
+ elif negative and not positive:
334
+ disposition = PortfolioOptimizationMemoryDisposition.DOMINANCE_UNFAVORABLE
335
+ directive = PortfolioOptimizationMemoryDirective.AVOID_EXCEPT_FALSIFICATION
336
+ elif positive and negative:
337
+ disposition = PortfolioOptimizationMemoryDisposition.TRADEOFF
338
+ directive = (
339
+ PortfolioOptimizationMemoryDirective.CONSIDER_FOR_FRONTIER_TRADEOFF
340
+ )
341
+ else:
342
+ disposition = PortfolioOptimizationMemoryDisposition.NEUTRAL
343
+ directive = PortfolioOptimizationMemoryDirective.DO_NOT_PRIORITIZE
344
+ return PortfolioOptimizationMemoryAssessment(
345
+ disposition=disposition,
346
+ directive=directive,
347
+ metric_signs=tuple(sorted(signs, key=lambda value: value.metric_id)),
348
+ lineage_identity_sha256=lineage.identity_sha256,
349
+ optimization_semantics_definition_sha256=semantics.definition_sha256,
350
+ evidence_snapshot_count=len(snapshots),
351
+ )
352
+
353
+
354
+ __all__ = [
355
+ "PORTFOLIO_OPTIMIZATION_MEMORY_POLICY_DEFINITION_SHA256",
356
+ "PORTFOLIO_OPTIMIZATION_MEMORY_POLICY_ID",
357
+ "PORTFOLIO_OPTIMIZATION_MEMORY_POLICY_VERSION",
358
+ "PortfolioOptimizationMemoryAssessment",
359
+ "PortfolioOptimizationMemoryDirective",
360
+ "PortfolioOptimizationMemoryDisposition",
361
+ "PortfolioOptimizationMetricSign",
362
+ "assess_portfolio_optimization_memory",
363
+ ]