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,788 @@
1
+ """Trusted derivation of card-to-finite-option support for bounded memory dose."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import hashlib
6
+ import json
7
+ import re
8
+ from dataclasses import dataclass, field
9
+ from enum import Enum
10
+
11
+ from agent_evolve.application.finite_action_transition import (
12
+ EmpiricalFiniteActionTransition,
13
+ empirical_finite_action_transitions_for_insight,
14
+ )
15
+ from agent_evolve.application.insight_memory import InsightEvidenceLineage
16
+ from agent_evolve.domain.finite_variation import (
17
+ FiniteVariationContract,
18
+ validate_finite_variation_contract,
19
+ )
20
+ from agent_evolve.domain.ids import CandidateId
21
+ from agent_evolve.domain.patch import ArrayIndex, JsonPath, ObjectKey, require_sha256
22
+ from agent_evolve.domain.typed_json import typed_json_sha256
23
+ from agent_evolve.policies.variation.typed_patch import derive_patch
24
+ from agent_evolve.ports.agentic_generator import InsightDraft
25
+ from agent_evolve.ports.portfolio_memory_dose import PortfolioMemoryDoseCardSupport
26
+
27
+
28
+ _TOKEN = re.compile(r"^[a-z][a-z0-9_.:-]{0,255}$")
29
+ _OPTION_ID = re.compile(r"^[a-z][a-z0-9_.-]{0,255}$")
30
+
31
+ PORTFOLIO_MEMORY_DOSE_SUPPORT_POLICY_ID = "semantic_finite_option_memory_support"
32
+ PORTFOLIO_MEMORY_DOSE_SUPPORT_POLICY_VERSION = 2
33
+ PORTFOLIO_MEMORY_DOSE_SUPPORT_POLICY_DEFINITION_SHA256 = hashlib.sha256(
34
+ b"agent-evolve:semantic-finite-option-memory-support:v2;"
35
+ b"trusted-card-content;current-finite-contract;family-match;"
36
+ b"all-parent-relative-changed-paths-within-card-paths;"
37
+ b"optional-exact-recommended-option-filter;"
38
+ b"authenticated-direct-evidence-requires-stable-action-and-exact-local-"
39
+ b"parent-child-transition;foreign-evidence-legacy-fallback"
40
+ ).hexdigest()
41
+ EXACT_PARENT_PORTFOLIO_MEMORY_DOSE_SUPPORT_POLICY_ID = (
42
+ "exact_parent_semantic_finite_option_memory_support"
43
+ )
44
+ EXACT_PARENT_PORTFOLIO_MEMORY_DOSE_SUPPORT_POLICY_VERSION = 1
45
+ EXACT_PARENT_PORTFOLIO_MEMORY_DOSE_SUPPORT_POLICY_DEFINITION_SHA256 = hashlib.sha256(
46
+ b"agent-evolve:exact-parent-semantic-finite-option-memory-support:v1;"
47
+ b"trusted-card-content;current-finite-contract;family-and-path-match;"
48
+ b"authenticated-direct-transition;complete-source-parent-sha256-match;"
49
+ b"exact-local-child-transition;forced-transfer-authority-only"
50
+ ).hexdigest()
51
+ PORTFOLIO_MEMORY_CONTEXT_TRANSFER_POLICY_ID = "portfolio_memory_context_transfer"
52
+ PORTFOLIO_MEMORY_CONTEXT_TRANSFER_POLICY_VERSION = 1
53
+ PORTFOLIO_MEMORY_CONTEXT_TRANSFER_POLICY_DEFINITION_SHA256 = hashlib.sha256(
54
+ b"agent-evolve:portfolio-memory-context-transfer:v1;"
55
+ b"authenticated-transition-source-parents;current-parent-sha256;"
56
+ b"exact-source-parent-authorizes-action-replay;"
57
+ b"local-intervention-match-is-advisory-only;provider-and-outcome-blind"
58
+ ).hexdigest()
59
+ _CONTEXT_TRANSFER_DOMAIN = b"agent-evolve:portfolio-memory-context-transfer:v1\x00"
60
+ PORTFOLIO_MEMORY_TRANSFER_LADDER_POLICY_ID = (
61
+ "portfolio_memory_typed_transfer_ladder"
62
+ )
63
+ PORTFOLIO_MEMORY_TRANSFER_LADDER_POLICY_VERSION = 1
64
+ PORTFOLIO_MEMORY_TRANSFER_LADDER_POLICY_DEFINITION_SHA256 = hashlib.sha256(
65
+ b"agent-evolve:portfolio-memory-typed-transfer-ladder:v1;"
66
+ b"exact-source-parent-and-action=executable-replay;"
67
+ b"same-local-precondition-and-action=advisory-only;"
68
+ b"affected-path-and-action-family=uncalibrated-advisory-only;"
69
+ b"unsupported=no-delivery;causal-memory-credit=false;"
70
+ b"provider-and-outcome-blind=true"
71
+ ).hexdigest()
72
+ _TRANSFER_LADDER_DOMAIN = (
73
+ b"agent-evolve:portfolio-memory-typed-transfer-ladder:v1\x00"
74
+ )
75
+
76
+
77
+ def _canonical_json(value: object) -> bytes:
78
+ return json.dumps(
79
+ value,
80
+ allow_nan=False,
81
+ ensure_ascii=True,
82
+ separators=(",", ":"),
83
+ sort_keys=True,
84
+ ).encode("ascii", errors="strict")
85
+
86
+
87
+ class PortfolioMemoryDoseSupportScope(str, Enum):
88
+ """How much source context is required before an action is executable."""
89
+
90
+ LOCAL_INTERVENTION = "local_intervention"
91
+ EXACT_SOURCE_PARENT = "exact_source_parent"
92
+
93
+
94
+ class PortfolioMemoryTransferTier(str, Enum):
95
+ """Closed authority levels for transferring one empirical action rule."""
96
+
97
+ EXACT_ACTION_REPLAY = "exact_action_replay"
98
+ LOCAL_ACTION_ADVISORY = "local_action_advisory"
99
+ PATH_FAMILY_ADVISORY = "path_family_advisory"
100
+ UNSUPPORTED = "unsupported"
101
+
102
+
103
+ @dataclass(frozen=True, slots=True)
104
+ class PortfolioMemoryTransferLadderAssessment:
105
+ """Typed transfer evidence without silently converting analogy into action.
106
+
107
+ ``exact_replay_option_ids`` are the only options that may be forced by a
108
+ bounded dose. The two advisory sets are prompt evidence only. In
109
+ particular, a path/family match deliberately relaxes the historical option
110
+ identity and is labelled uncalibrated until a future held-out transfer model
111
+ earns a quantitative shrinkage law.
112
+
113
+ Retrieval is not a causal memory experiment. Consequently this assessment
114
+ never authorizes card-level causal credit, including at the exact tier.
115
+ """
116
+
117
+ card_key: str
118
+ card_content_sha256: str
119
+ finite_contract_identity_sha256: str
120
+ current_parent_configuration_sha256: str
121
+ source_transition_sha256s: tuple[str, ...]
122
+ exact_replay_option_ids: tuple[str, ...]
123
+ local_advisory_option_ids: tuple[str, ...]
124
+ path_family_advisory_option_ids: tuple[str, ...]
125
+ tier: PortfolioMemoryTransferTier
126
+ assessment_sha256: str = field(init=False)
127
+
128
+ def __post_init__(self) -> None:
129
+ if type(self.card_key) is not str or _TOKEN.fullmatch(self.card_key) is None:
130
+ raise ValueError("card_key must use the closed token grammar")
131
+ for name in (
132
+ "card_content_sha256",
133
+ "finite_contract_identity_sha256",
134
+ "current_parent_configuration_sha256",
135
+ ):
136
+ require_sha256(getattr(self, name), name)
137
+ for name in (
138
+ "source_transition_sha256s",
139
+ "exact_replay_option_ids",
140
+ "local_advisory_option_ids",
141
+ "path_family_advisory_option_ids",
142
+ ):
143
+ values = getattr(self, name)
144
+ if type(values) is not tuple or values != tuple(sorted(set(values))):
145
+ raise ValueError(f"{name} must be unique and canonical")
146
+ for value in values:
147
+ if name == "source_transition_sha256s":
148
+ require_sha256(value, "source_transition_sha256")
149
+ elif type(value) is not str or _OPTION_ID.fullmatch(value) is None:
150
+ raise ValueError(f"{name} contains an invalid option ID")
151
+ if type(self.tier) is not PortfolioMemoryTransferTier:
152
+ raise TypeError("tier must be exact PortfolioMemoryTransferTier")
153
+ expected_tier = (
154
+ PortfolioMemoryTransferTier.EXACT_ACTION_REPLAY
155
+ if self.exact_replay_option_ids
156
+ else PortfolioMemoryTransferTier.LOCAL_ACTION_ADVISORY
157
+ if self.local_advisory_option_ids
158
+ else PortfolioMemoryTransferTier.PATH_FAMILY_ADVISORY
159
+ if self.path_family_advisory_option_ids
160
+ else PortfolioMemoryTransferTier.UNSUPPORTED
161
+ )
162
+ if self.tier is not expected_tier:
163
+ raise ValueError("transfer tier differs from its authenticated support")
164
+ if set(self.exact_replay_option_ids).difference(
165
+ self.local_advisory_option_ids
166
+ ):
167
+ raise ValueError("exact replay options must also have local support")
168
+ object.__setattr__(
169
+ self,
170
+ "assessment_sha256",
171
+ hashlib.sha256(
172
+ _TRANSFER_LADDER_DOMAIN + _canonical_json(self._unsigned_record())
173
+ ).hexdigest(),
174
+ )
175
+
176
+ @property
177
+ def exact_action_replay_authorized(self) -> bool:
178
+ return self.tier is PortfolioMemoryTransferTier.EXACT_ACTION_REPLAY
179
+
180
+ @property
181
+ def advisory_delivery_authorized(self) -> bool:
182
+ return self.tier in {
183
+ PortfolioMemoryTransferTier.LOCAL_ACTION_ADVISORY,
184
+ PortfolioMemoryTransferTier.PATH_FAMILY_ADVISORY,
185
+ }
186
+
187
+ @property
188
+ def causal_memory_credit_authorized(self) -> bool:
189
+ return False
190
+
191
+ @property
192
+ def deliverable_option_ids(self) -> tuple[str, ...]:
193
+ if self.exact_replay_option_ids:
194
+ return self.exact_replay_option_ids
195
+ if self.local_advisory_option_ids:
196
+ return self.local_advisory_option_ids
197
+ return self.path_family_advisory_option_ids
198
+
199
+ def _unsigned_record(self) -> dict[str, object]:
200
+ return {
201
+ "schema_version": 1,
202
+ "card_key": self.card_key,
203
+ "card_content_sha256": self.card_content_sha256,
204
+ "finite_contract_identity_sha256": (
205
+ self.finite_contract_identity_sha256
206
+ ),
207
+ "current_parent_configuration_sha256": (
208
+ self.current_parent_configuration_sha256
209
+ ),
210
+ "source_transition_sha256s": list(self.source_transition_sha256s),
211
+ "exact_replay_option_ids": list(self.exact_replay_option_ids),
212
+ "local_advisory_option_ids": list(self.local_advisory_option_ids),
213
+ "path_family_advisory_option_ids": list(
214
+ self.path_family_advisory_option_ids
215
+ ),
216
+ "tier": self.tier.value,
217
+ "exact_action_replay_authorized": (
218
+ self.exact_action_replay_authorized
219
+ ),
220
+ "advisory_delivery_authorized": self.advisory_delivery_authorized,
221
+ "causal_memory_credit_authorized": False,
222
+ "transfer_calibration": (
223
+ "not_applicable_exact_replay"
224
+ if self.exact_action_replay_authorized
225
+ else "uncalibrated_advisory"
226
+ if self.advisory_delivery_authorized
227
+ else "not_deliverable"
228
+ ),
229
+ "historical_option_identity_relaxed": (
230
+ self.tier is PortfolioMemoryTransferTier.PATH_FAMILY_ADVISORY
231
+ ),
232
+ "policy": {
233
+ "policy_id": PORTFOLIO_MEMORY_TRANSFER_LADDER_POLICY_ID,
234
+ "policy_version": PORTFOLIO_MEMORY_TRANSFER_LADDER_POLICY_VERSION,
235
+ "definition_sha256": (
236
+ PORTFOLIO_MEMORY_TRANSFER_LADDER_POLICY_DEFINITION_SHA256
237
+ ),
238
+ },
239
+ "provider_fields_consulted": False,
240
+ "outcome_values_consulted": False,
241
+ }
242
+
243
+ def to_record(self) -> dict[str, object]:
244
+ self.__post_init__()
245
+ return {**self._unsigned_record(), "assessment_sha256": self.assessment_sha256}
246
+
247
+
248
+ @dataclass(frozen=True, slots=True)
249
+ class PortfolioMemoryContextTransferAssessment:
250
+ """Outcome-blind authority check for transferring one empirical action.
251
+
252
+ An authenticated local transition remains useful as advisory evidence when
253
+ its local precondition matches. Hard replay authority is narrower: at
254
+ present it is granted only when the complete current parent equals an
255
+ observed source parent. Later learned transfer models can implement a new
256
+ versioned policy instead of silently weakening this boundary.
257
+ """
258
+
259
+ card_key: str
260
+ card_content_sha256: str
261
+ finite_contract_identity_sha256: str
262
+ current_parent_configuration_sha256: str
263
+ source_parent_configuration_sha256s: tuple[str, ...]
264
+ local_intervention_support_available: bool
265
+ exact_source_parent_match: bool
266
+ exact_action_replay_authorized: bool
267
+ assessment_sha256: str = field(init=False)
268
+
269
+ def __post_init__(self) -> None:
270
+ if type(self.card_key) is not str or _TOKEN.fullmatch(self.card_key) is None:
271
+ raise ValueError("card_key must use the closed token grammar")
272
+ for name in (
273
+ "card_content_sha256",
274
+ "finite_contract_identity_sha256",
275
+ "current_parent_configuration_sha256",
276
+ ):
277
+ require_sha256(getattr(self, name), name)
278
+ if (
279
+ type(self.source_parent_configuration_sha256s) is not tuple
280
+ or self.source_parent_configuration_sha256s
281
+ != tuple(sorted(set(self.source_parent_configuration_sha256s)))
282
+ ):
283
+ raise ValueError("source parent hashes must be unique and canonical")
284
+ for value in self.source_parent_configuration_sha256s:
285
+ require_sha256(value, "source_parent_configuration_sha256")
286
+ for name in (
287
+ "local_intervention_support_available",
288
+ "exact_source_parent_match",
289
+ "exact_action_replay_authorized",
290
+ ):
291
+ if type(getattr(self, name)) is not bool:
292
+ raise TypeError(f"{name} must be an exact bool")
293
+ if self.exact_source_parent_match != (
294
+ self.current_parent_configuration_sha256
295
+ in self.source_parent_configuration_sha256s
296
+ ):
297
+ raise ValueError("exact source-parent verdict differs from its hashes")
298
+ if self.exact_action_replay_authorized != (
299
+ self.local_intervention_support_available
300
+ and self.exact_source_parent_match
301
+ ):
302
+ raise ValueError("exact replay authority differs from trusted evidence")
303
+ object.__setattr__(
304
+ self,
305
+ "assessment_sha256",
306
+ hashlib.sha256(
307
+ _CONTEXT_TRANSFER_DOMAIN + _canonical_json(self._unsigned_record())
308
+ ).hexdigest(),
309
+ )
310
+
311
+ def _unsigned_record(self) -> dict[str, object]:
312
+ return {
313
+ "schema_version": 1,
314
+ "card_key": self.card_key,
315
+ "card_content_sha256": self.card_content_sha256,
316
+ "finite_contract_identity_sha256": (
317
+ self.finite_contract_identity_sha256
318
+ ),
319
+ "current_parent_configuration_sha256": (
320
+ self.current_parent_configuration_sha256
321
+ ),
322
+ "source_parent_configuration_sha256s": list(
323
+ self.source_parent_configuration_sha256s
324
+ ),
325
+ "local_intervention_support_available": (
326
+ self.local_intervention_support_available
327
+ ),
328
+ "exact_source_parent_match": self.exact_source_parent_match,
329
+ "exact_action_replay_authorized": self.exact_action_replay_authorized,
330
+ "transfer_authority": (
331
+ "exact_source_parent_action_replay"
332
+ if self.exact_action_replay_authorized
333
+ else "advisory_only"
334
+ ),
335
+ "policy": {
336
+ "policy_id": PORTFOLIO_MEMORY_CONTEXT_TRANSFER_POLICY_ID,
337
+ "policy_version": PORTFOLIO_MEMORY_CONTEXT_TRANSFER_POLICY_VERSION,
338
+ "definition_sha256": (
339
+ PORTFOLIO_MEMORY_CONTEXT_TRANSFER_POLICY_DEFINITION_SHA256
340
+ ),
341
+ },
342
+ "provider_fields_consulted": False,
343
+ "outcome_values_consulted": False,
344
+ }
345
+
346
+ def to_record(self) -> dict[str, object]:
347
+ self.__post_init__()
348
+ return {**self._unsigned_record(), "assessment_sha256": self.assessment_sha256}
349
+
350
+
351
+ def _path_text(path: JsonPath) -> str:
352
+ parts = ["$"]
353
+ for segment in path.segments:
354
+ if type(segment) is ObjectKey:
355
+ parts.append(f".{segment.value}")
356
+ elif type(segment) is ArrayIndex:
357
+ parts.append(f"[{segment.value}]")
358
+ else: # pragma: no cover - JsonPath closes the segment union.
359
+ raise AssertionError("unsupported JSON path segment")
360
+ return "".join(parts)
361
+
362
+
363
+ def _path_segments(path: str) -> tuple[str, ...]:
364
+ if type(path) is not str or not path.startswith("$."):
365
+ raise ValueError("affected paths must be canonical object-root JSON paths")
366
+ # Existing semantic contracts use object paths in this workload-neutral
367
+ # boundary. Treat array notation as a segment delimiter without parsing
368
+ # values; descendant containment remains conservative and deterministic.
369
+ body = path[2:].replace("[", ".[")
370
+ parts = tuple(value for value in body.split(".") if value)
371
+ if not parts:
372
+ raise ValueError("affected paths cannot name the root")
373
+ return parts
374
+
375
+
376
+ def _changed_path_is_within_affected_path(changed: str, affected: str) -> bool:
377
+ changed_segments = _path_segments(changed)
378
+ affected_segments = _path_segments(affected)
379
+ return changed_segments[: len(affected_segments)] == affected_segments
380
+
381
+
382
+ @dataclass(frozen=True, slots=True)
383
+ class PortfolioMemoryDoseCardSemantics:
384
+ """Trusted card semantics needed to derive current-palette compatibility."""
385
+
386
+ card_key: str
387
+ card_content_sha256: str
388
+ affected_paths: tuple[str, ...]
389
+ recommended_option_families: tuple[str, ...]
390
+ recommended_option_ids: tuple[str, ...] = ()
391
+ empirical_transitions: tuple[EmpiricalFiniteActionTransition, ...] = ()
392
+ support_scope: PortfolioMemoryDoseSupportScope = (
393
+ PortfolioMemoryDoseSupportScope.LOCAL_INTERVENTION
394
+ )
395
+
396
+ def __post_init__(self) -> None:
397
+ if type(self.card_key) is not str or _TOKEN.fullmatch(self.card_key) is None:
398
+ raise ValueError("card_key must use the closed token grammar")
399
+ require_sha256(self.card_content_sha256, "card_content_sha256")
400
+ if (
401
+ type(self.affected_paths) is not tuple
402
+ or not self.affected_paths
403
+ or self.affected_paths != tuple(sorted(set(self.affected_paths)))
404
+ ):
405
+ raise ValueError("affected_paths must be non-empty and canonical")
406
+ for value in self.affected_paths:
407
+ _path_segments(value)
408
+ if (
409
+ type(self.recommended_option_families) is not tuple
410
+ or not self.recommended_option_families
411
+ or self.recommended_option_families
412
+ != tuple(sorted(set(self.recommended_option_families)))
413
+ ):
414
+ raise ValueError(
415
+ "recommended_option_families must be non-empty and canonical"
416
+ )
417
+ for value in self.recommended_option_families:
418
+ if type(value) is not str or _TOKEN.fullmatch(value) is None:
419
+ raise ValueError("recommended option family is invalid")
420
+ if (
421
+ type(self.recommended_option_ids) is not tuple
422
+ or self.recommended_option_ids
423
+ != tuple(sorted(set(self.recommended_option_ids)))
424
+ ):
425
+ raise ValueError("recommended_option_ids must be canonical")
426
+ for value in self.recommended_option_ids:
427
+ if type(value) is not str or _OPTION_ID.fullmatch(value) is None:
428
+ raise ValueError("recommended option ID is invalid")
429
+ if type(self.empirical_transitions) is not tuple or any(
430
+ type(value) is not EmpiricalFiniteActionTransition
431
+ for value in self.empirical_transitions
432
+ ):
433
+ raise TypeError(
434
+ "empirical_transitions must contain exact transition values"
435
+ )
436
+ if type(self.support_scope) is not PortfolioMemoryDoseSupportScope:
437
+ raise TypeError("support_scope must be exact PortfolioMemoryDoseSupportScope")
438
+ for value in self.empirical_transitions:
439
+ value.__post_init__()
440
+ if value.affected_path not in self.affected_paths:
441
+ raise ValueError("empirical transition path differs from the card")
442
+ if value.option_family not in self.recommended_option_families:
443
+ raise ValueError("empirical transition family differs from the card")
444
+ if (
445
+ self.recommended_option_ids
446
+ and value.option_id not in self.recommended_option_ids
447
+ ):
448
+ raise ValueError("empirical transition action differs from the card")
449
+ if self.empirical_transitions != tuple(
450
+ sorted(
451
+ self.empirical_transitions,
452
+ key=lambda value: value.transition_sha256,
453
+ )
454
+ ):
455
+ raise ValueError("empirical_transitions must be canonical")
456
+ if len(
457
+ {value.transition_sha256 for value in self.empirical_transitions}
458
+ ) != len(self.empirical_transitions):
459
+ raise ValueError("empirical_transitions must be unique")
460
+
461
+ @classmethod
462
+ def from_insight(
463
+ cls,
464
+ *,
465
+ card_key: str,
466
+ card_content_sha256: str,
467
+ draft: InsightDraft,
468
+ evidence_lineage: InsightEvidenceLineage,
469
+ support_scope: PortfolioMemoryDoseSupportScope = (
470
+ PortfolioMemoryDoseSupportScope.LOCAL_INTERVENTION
471
+ ),
472
+ ) -> "PortfolioMemoryDoseCardSemantics":
473
+ """Build executable card semantics from structured, trusted lineage."""
474
+
475
+ if type(draft) is not InsightDraft:
476
+ raise TypeError("draft must be exact")
477
+ if type(evidence_lineage) is not InsightEvidenceLineage:
478
+ raise TypeError("evidence_lineage must be exact")
479
+ draft.__post_init__()
480
+ evidence_lineage.__post_init__()
481
+ return cls(
482
+ card_key=card_key,
483
+ card_content_sha256=card_content_sha256,
484
+ affected_paths=tuple(sorted(set(draft.affected_paths))),
485
+ recommended_option_families=tuple(
486
+ sorted(set(draft.recommended_option_families))
487
+ ),
488
+ recommended_option_ids=tuple(
489
+ sorted(set(draft.recommended_option_ids))
490
+ ),
491
+ empirical_transitions=(
492
+ empirical_finite_action_transitions_for_insight(
493
+ draft,
494
+ evidence_lineage,
495
+ )
496
+ ),
497
+ support_scope=support_scope,
498
+ )
499
+
500
+
501
+ def assess_portfolio_memory_context_transfer(
502
+ semantics: PortfolioMemoryDoseCardSemantics,
503
+ contract: FiniteVariationContract,
504
+ ) -> PortfolioMemoryContextTransferAssessment:
505
+ """Assess source-context authority without consuming provider outputs."""
506
+
507
+ if type(semantics) is not PortfolioMemoryDoseCardSemantics:
508
+ raise TypeError("semantics must be exact PortfolioMemoryDoseCardSemantics")
509
+ semantics.__post_init__()
510
+ validate_finite_variation_contract(contract)
511
+ source_parents = tuple(
512
+ sorted(
513
+ {
514
+ value.parent_configuration_sha256
515
+ for value in semantics.empirical_transitions
516
+ }
517
+ )
518
+ )
519
+ current_parent = typed_json_sha256(contract.parent_configuration)
520
+ local_support = False
521
+ if semantics.empirical_transitions:
522
+ for option in contract.options:
523
+ if any(
524
+ transition.option_id == option.option_id
525
+ and transition.option_family == option.family
526
+ and transition.parent_matches(contract.parent_configuration)
527
+ and transition.child_matches(option.child_configuration)
528
+ for transition in semantics.empirical_transitions
529
+ ):
530
+ local_support = True
531
+ break
532
+ exact_match = current_parent in source_parents
533
+ return PortfolioMemoryContextTransferAssessment(
534
+ card_key=semantics.card_key,
535
+ card_content_sha256=semantics.card_content_sha256,
536
+ finite_contract_identity_sha256=contract.identity_sha256,
537
+ current_parent_configuration_sha256=current_parent,
538
+ source_parent_configuration_sha256s=source_parents,
539
+ local_intervention_support_available=local_support,
540
+ exact_source_parent_match=exact_match,
541
+ exact_action_replay_authorized=local_support and exact_match,
542
+ )
543
+
544
+
545
+ def assess_portfolio_memory_transfer_ladder(
546
+ semantics: PortfolioMemoryDoseCardSemantics,
547
+ contract: FiniteVariationContract,
548
+ ) -> PortfolioMemoryTransferLadderAssessment:
549
+ """Resolve exact, local, and path/family transfer authority in one pass.
550
+
551
+ The first two tiers require authenticated empirical transitions. The
552
+ path/family tier uses only the card's declared affected paths and action
553
+ families against the current finite contract. It is useful for exposing a
554
+ mechanism after parent drift, but it cannot force an action or receive
555
+ causal credit.
556
+ """
557
+
558
+ if type(semantics) is not PortfolioMemoryDoseCardSemantics:
559
+ raise TypeError("semantics must be exact PortfolioMemoryDoseCardSemantics")
560
+ semantics.__post_init__()
561
+ validate_finite_variation_contract(contract)
562
+ base = CandidateId("candidate_memory_transfer_parent")
563
+ target = CandidateId("candidate_memory_transfer_child")
564
+ path_family_ids: list[str] = []
565
+ local_ids: list[str] = []
566
+ exact_ids: list[str] = []
567
+ for option in contract.options:
568
+ if option.family not in semantics.recommended_option_families:
569
+ continue
570
+ patch = derive_patch(
571
+ contract.parent_configuration,
572
+ option.child_configuration,
573
+ base_candidate_id=base,
574
+ target_candidate_id=target,
575
+ )
576
+ changed_paths = tuple(_path_text(value.path) for value in patch.operations)
577
+ if not changed_paths or not all(
578
+ any(
579
+ _changed_path_is_within_affected_path(changed, affected)
580
+ for affected in semantics.affected_paths
581
+ )
582
+ for changed in changed_paths
583
+ ):
584
+ continue
585
+ path_family_ids.append(option.option_id)
586
+ matching_transitions = tuple(
587
+ transition
588
+ for transition in semantics.empirical_transitions
589
+ if transition.option_id == option.option_id
590
+ and transition.option_family == option.family
591
+ and changed_paths == (transition.affected_path,)
592
+ and transition.parent_matches(contract.parent_configuration)
593
+ and transition.child_matches(option.child_configuration)
594
+ )
595
+ if not matching_transitions:
596
+ continue
597
+ local_ids.append(option.option_id)
598
+ if any(
599
+ transition.exact_parent_matches(contract.parent_configuration)
600
+ for transition in matching_transitions
601
+ ):
602
+ exact_ids.append(option.option_id)
603
+ exact = tuple(sorted(set(exact_ids)))
604
+ local = tuple(sorted(set(local_ids)))
605
+ path_family = tuple(sorted(set(path_family_ids)))
606
+ tier = (
607
+ PortfolioMemoryTransferTier.EXACT_ACTION_REPLAY
608
+ if exact
609
+ else PortfolioMemoryTransferTier.LOCAL_ACTION_ADVISORY
610
+ if local
611
+ else PortfolioMemoryTransferTier.PATH_FAMILY_ADVISORY
612
+ if path_family
613
+ else PortfolioMemoryTransferTier.UNSUPPORTED
614
+ )
615
+ return PortfolioMemoryTransferLadderAssessment(
616
+ card_key=semantics.card_key,
617
+ card_content_sha256=semantics.card_content_sha256,
618
+ finite_contract_identity_sha256=contract.identity_sha256,
619
+ current_parent_configuration_sha256=typed_json_sha256(
620
+ contract.parent_configuration
621
+ ),
622
+ source_transition_sha256s=tuple(
623
+ sorted(
624
+ transition.transition_sha256
625
+ for transition in semantics.empirical_transitions
626
+ )
627
+ ),
628
+ exact_replay_option_ids=exact,
629
+ local_advisory_option_ids=local,
630
+ path_family_advisory_option_ids=path_family,
631
+ tier=tier,
632
+ )
633
+
634
+
635
+ def derive_portfolio_memory_advisory_card_support(
636
+ semantics: PortfolioMemoryDoseCardSemantics,
637
+ contract: FiniteVariationContract,
638
+ ) -> PortfolioMemoryDoseCardSupport:
639
+ """Project the ladder's deliverable options into existing support tooling.
640
+
641
+ This support object is for deterministic card/lane matching and prompt
642
+ attribution. Callers must consult the paired ladder assessment before
643
+ deciding whether it can become a hard bounded dose; advisory tiers remain
644
+ non-executable by construction.
645
+ """
646
+
647
+ assessment = assess_portfolio_memory_transfer_ladder(semantics, contract)
648
+ if not assessment.deliverable_option_ids:
649
+ raise ValueError("card has no deliverable transfer tier in the finite contract")
650
+ identity_by_id = {
651
+ option.option_id: option.identity_sha256 for option in contract.options
652
+ }
653
+ return PortfolioMemoryDoseCardSupport(
654
+ card_key=semantics.card_key,
655
+ card_content_sha256=semantics.card_content_sha256,
656
+ finite_contract_identity_sha256=contract.identity_sha256,
657
+ compatible_options=tuple(
658
+ (option_id, identity_by_id[option_id])
659
+ for option_id in assessment.deliverable_option_ids
660
+ ),
661
+ support_policy_id=PORTFOLIO_MEMORY_TRANSFER_LADDER_POLICY_ID,
662
+ support_policy_version=PORTFOLIO_MEMORY_TRANSFER_LADDER_POLICY_VERSION,
663
+ support_policy_definition_sha256=(
664
+ PORTFOLIO_MEMORY_TRANSFER_LADDER_POLICY_DEFINITION_SHA256
665
+ ),
666
+ )
667
+
668
+
669
+ def derive_portfolio_memory_dose_card_support(
670
+ semantics: PortfolioMemoryDoseCardSemantics,
671
+ contract: FiniteVariationContract,
672
+ ) -> PortfolioMemoryDoseCardSupport:
673
+ """Seal the exact current-parent actions compatible with one card.
674
+
675
+ Every changed path must overlap a declared affected path. This prevents a
676
+ multi-coordinate option from being attributed to a single-coordinate card
677
+ merely because one of its edits happens to overlap.
678
+ """
679
+
680
+ if type(semantics) is not PortfolioMemoryDoseCardSemantics:
681
+ raise TypeError("semantics must be exact PortfolioMemoryDoseCardSemantics")
682
+ PortfolioMemoryDoseCardSemantics.__post_init__(semantics)
683
+ validate_finite_variation_contract(contract)
684
+ if (
685
+ semantics.support_scope is PortfolioMemoryDoseSupportScope.EXACT_SOURCE_PARENT
686
+ and not semantics.empirical_transitions
687
+ ):
688
+ raise ValueError(
689
+ "exact source-parent support requires authenticated empirical transitions"
690
+ )
691
+ recommended_ids = set(semantics.recommended_option_ids)
692
+ available_ids = {value.option_id for value in contract.options}
693
+ if not recommended_ids.issubset(available_ids):
694
+ raise ValueError("recommended option IDs escape the finite contract")
695
+ base = CandidateId("candidate_memory_dose_parent")
696
+ target = CandidateId("candidate_memory_dose_child")
697
+ compatible: list[tuple[str, str]] = []
698
+ for option in contract.options:
699
+ if option.family not in semantics.recommended_option_families:
700
+ continue
701
+ if recommended_ids and option.option_id not in recommended_ids:
702
+ continue
703
+ patch = derive_patch(
704
+ contract.parent_configuration,
705
+ option.child_configuration,
706
+ base_candidate_id=base,
707
+ target_candidate_id=target,
708
+ )
709
+ changed_paths = tuple(_path_text(value.path) for value in patch.operations)
710
+ if not changed_paths:
711
+ continue
712
+ paths_compatible = all(
713
+ any(
714
+ _changed_path_is_within_affected_path(changed, affected)
715
+ for affected in semantics.affected_paths
716
+ )
717
+ for changed in changed_paths
718
+ )
719
+ if not paths_compatible:
720
+ continue
721
+ if semantics.empirical_transitions and not any(
722
+ transition.option_id == option.option_id
723
+ and transition.option_family == option.family
724
+ and changed_paths == (transition.affected_path,)
725
+ and transition.parent_matches(contract.parent_configuration)
726
+ and (
727
+ semantics.support_scope
728
+ is PortfolioMemoryDoseSupportScope.LOCAL_INTERVENTION
729
+ or transition.exact_parent_matches(contract.parent_configuration)
730
+ )
731
+ and transition.child_matches(option.child_configuration)
732
+ for transition in semantics.empirical_transitions
733
+ ):
734
+ continue
735
+ if paths_compatible:
736
+ compatible.append((option.option_id, option.identity_sha256))
737
+ if not compatible:
738
+ raise ValueError("card has no compatible action in the finite contract")
739
+ if (
740
+ semantics.support_scope is PortfolioMemoryDoseSupportScope.EXACT_SOURCE_PARENT
741
+ ):
742
+ support_policy_id = EXACT_PARENT_PORTFOLIO_MEMORY_DOSE_SUPPORT_POLICY_ID
743
+ support_policy_version = (
744
+ EXACT_PARENT_PORTFOLIO_MEMORY_DOSE_SUPPORT_POLICY_VERSION
745
+ )
746
+ support_policy_definition_sha256 = (
747
+ EXACT_PARENT_PORTFOLIO_MEMORY_DOSE_SUPPORT_POLICY_DEFINITION_SHA256
748
+ )
749
+ else:
750
+ support_policy_id = PORTFOLIO_MEMORY_DOSE_SUPPORT_POLICY_ID
751
+ support_policy_version = PORTFOLIO_MEMORY_DOSE_SUPPORT_POLICY_VERSION
752
+ support_policy_definition_sha256 = (
753
+ PORTFOLIO_MEMORY_DOSE_SUPPORT_POLICY_DEFINITION_SHA256
754
+ )
755
+ return PortfolioMemoryDoseCardSupport(
756
+ card_key=semantics.card_key,
757
+ card_content_sha256=semantics.card_content_sha256,
758
+ finite_contract_identity_sha256=contract.identity_sha256,
759
+ compatible_options=tuple(sorted(compatible)),
760
+ support_policy_id=support_policy_id,
761
+ support_policy_version=support_policy_version,
762
+ support_policy_definition_sha256=support_policy_definition_sha256,
763
+ )
764
+
765
+
766
+ __all__ = [
767
+ "EXACT_PARENT_PORTFOLIO_MEMORY_DOSE_SUPPORT_POLICY_DEFINITION_SHA256",
768
+ "EXACT_PARENT_PORTFOLIO_MEMORY_DOSE_SUPPORT_POLICY_ID",
769
+ "EXACT_PARENT_PORTFOLIO_MEMORY_DOSE_SUPPORT_POLICY_VERSION",
770
+ "PORTFOLIO_MEMORY_DOSE_SUPPORT_POLICY_DEFINITION_SHA256",
771
+ "PORTFOLIO_MEMORY_DOSE_SUPPORT_POLICY_ID",
772
+ "PORTFOLIO_MEMORY_DOSE_SUPPORT_POLICY_VERSION",
773
+ "PORTFOLIO_MEMORY_CONTEXT_TRANSFER_POLICY_DEFINITION_SHA256",
774
+ "PORTFOLIO_MEMORY_CONTEXT_TRANSFER_POLICY_ID",
775
+ "PORTFOLIO_MEMORY_CONTEXT_TRANSFER_POLICY_VERSION",
776
+ "PORTFOLIO_MEMORY_TRANSFER_LADDER_POLICY_DEFINITION_SHA256",
777
+ "PORTFOLIO_MEMORY_TRANSFER_LADDER_POLICY_ID",
778
+ "PORTFOLIO_MEMORY_TRANSFER_LADDER_POLICY_VERSION",
779
+ "PortfolioMemoryContextTransferAssessment",
780
+ "PortfolioMemoryDoseCardSemantics",
781
+ "PortfolioMemoryDoseSupportScope",
782
+ "PortfolioMemoryTransferLadderAssessment",
783
+ "PortfolioMemoryTransferTier",
784
+ "assess_portfolio_memory_context_transfer",
785
+ "assess_portfolio_memory_transfer_ladder",
786
+ "derive_portfolio_memory_advisory_card_support",
787
+ "derive_portfolio_memory_dose_card_support",
788
+ ]