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.
- agent_evolve/__init__.py +722 -0
- agent_evolve/agentic.py +2800 -0
- agent_evolve/api.py +767 -0
- agent_evolve/application/__init__.py +1580 -0
- agent_evolve/application/action_allocation.py +744 -0
- agent_evolve/application/action_allocation_frame.py +347 -0
- agent_evolve/application/action_allocation_frame_commit.py +185 -0
- agent_evolve/application/action_allocation_frame_commit_v3.py +184 -0
- agent_evolve/application/action_allocation_frame_v3.py +338 -0
- agent_evolve/application/action_archive_value.py +497 -0
- agent_evolve/application/action_evidence_consistency.py +455 -0
- agent_evolve/application/action_forecast_partitioning.py +1471 -0
- agent_evolve/application/action_metric_projection.py +211 -0
- agent_evolve/application/action_role_value.py +680 -0
- agent_evolve/application/action_score_authorities.py +363 -0
- agent_evolve/application/action_structural_signature.py +116 -0
- agent_evolve/application/action_target_realization.py +402 -0
- agent_evolve/application/agentic_evolution.py +7734 -0
- agent_evolve/application/agentic_portfolio_residual_expert.py +835 -0
- agent_evolve/application/anchor_residual_identification.py +463 -0
- agent_evolve/application/archive_conditioned_action_target.py +208 -0
- agent_evolve/application/artifact_journal.py +246 -0
- agent_evolve/application/artifact_replay.py +347 -0
- agent_evolve/application/budgeted_optimizer.py +1828 -0
- agent_evolve/application/calibrated_campaign.py +485 -0
- agent_evolve/application/calibrated_current_prefix_forecast_opportunity.py +322 -0
- agent_evolve/application/calibrated_positive_gain_opportunity.py +1581 -0
- agent_evolve/application/campaign_capacity_recourse.py +254 -0
- agent_evolve/application/campaign_contextual_outcomes.py +119 -0
- agent_evolve/application/campaign_diagnostic_blocks.py +930 -0
- agent_evolve/application/campaign_evidence_registry.py +262 -0
- agent_evolve/application/campaign_execution.py +2537 -0
- agent_evolve/application/campaign_generation_audit.py +942 -0
- agent_evolve/application/campaign_learning.py +1812 -0
- agent_evolve/application/campaign_learning_runtime.py +1977 -0
- agent_evolve/application/campaign_search_phase.py +227 -0
- agent_evolve/application/campaign_selector_context_extension.py +220 -0
- agent_evolve/application/campaign_variation_envelope.py +649 -0
- agent_evolve/application/campaign_variation_trace.py +451 -0
- agent_evolve/application/candidate_archive_consequence.py +128 -0
- agent_evolve/application/causal_opportunity_portfolio_gate.py +385 -0
- agent_evolve/application/composite_outcome_updater.py +145 -0
- agent_evolve/application/composition_portfolio_selection.py +363 -0
- agent_evolve/application/concurrent_stage.py +144 -0
- agent_evolve/application/contextual_action_allocation.py +181 -0
- agent_evolve/application/contextual_campaign_outcomes.py +267 -0
- agent_evolve/application/contextual_campaign_planning.py +1366 -0
- agent_evolve/application/contextual_delayed_credit.py +651 -0
- agent_evolve/application/contextual_search_controller.py +2374 -0
- agent_evolve/application/current_prefix_forecast_opportunity.py +714 -0
- agent_evolve/application/decision_metric_projection.py +112 -0
- agent_evolve/application/derived_action_semantics.py +129 -0
- agent_evolve/application/detailed_evaluation.py +449 -0
- agent_evolve/application/earned_lineage.py +1011 -0
- agent_evolve/application/effective_choice_audit.py +484 -0
- agent_evolve/application/empirical_consequence_calibration.py +908 -0
- agent_evolve/application/evaluation_accounting.py +325 -0
- agent_evolve/application/evaluation_cache.py +199 -0
- agent_evolve/application/evaluation_escrow.py +547 -0
- agent_evolve/application/evaluation_recourse.py +253 -0
- agent_evolve/application/event_recorder.py +151 -0
- agent_evolve/application/evolution_campaign.py +1840 -0
- agent_evolve/application/executable_hypothesis.py +323 -0
- agent_evolve/application/factorial_branch_pilot.py +772 -0
- agent_evolve/application/finite_acquisition_capacity_recourse.py +672 -0
- agent_evolve/application/finite_acquisition_residual_expert.py +373 -0
- agent_evolve/application/finite_acquisition_variation_envelope.py +802 -0
- agent_evolve/application/finite_action_hypothesis_semantics.py +446 -0
- agent_evolve/application/finite_action_selection.py +188 -0
- agent_evolve/application/finite_action_set.py +306 -0
- agent_evolve/application/finite_action_transition.py +537 -0
- agent_evolve/application/finite_variation_eligibility.py +296 -0
- agent_evolve/application/forecast_geometry_portfolio.py +799 -0
- agent_evolve/application/forecast_opportunity_shadow_calibration.py +316 -0
- agent_evolve/application/front_proximity_admission.py +311 -0
- agent_evolve/application/front_proximity_parent_basis.py +458 -0
- agent_evolve/application/frozen_hurdle_score.py +659 -0
- agent_evolve/application/g3_causal_screen.py +2257 -0
- agent_evolve/application/g3_causal_validation.py +1046 -0
- agent_evolve/application/g3_postseal_curation.py +818 -0
- agent_evolve/application/gated_agentic_generator.py +205 -0
- agent_evolve/application/generation_feedback.py +293 -0
- agent_evolve/application/generative_proposal_journal.py +185 -0
- agent_evolve/application/geometry_conditional_elasticity.py +453 -0
- agent_evolve/application/global_wave_action_allocation.py +1151 -0
- agent_evolve/application/head_mass_conditional_seat.py +268 -0
- agent_evolve/application/identifiable_reflection_evidence.py +1147 -0
- agent_evolve/application/identifiable_reflection_learning.py +395 -0
- agent_evolve/application/identifiable_reflection_request.py +364 -0
- agent_evolve/application/in_memory_residual_archive.py +341 -0
- agent_evolve/application/insight_memory.py +1804 -0
- agent_evolve/application/live_runtime_manifest.py +758 -0
- agent_evolve/application/llm_task_queue.py +769 -0
- agent_evolve/application/matched_finite_action_block.py +409 -0
- agent_evolve/application/materialized_action_broker.py +2328 -0
- agent_evolve/application/materialized_action_constraints.py +83 -0
- agent_evolve/application/materialized_variation.py +211 -0
- agent_evolve/application/multi_option_evolution.py +1536 -0
- agent_evolve/application/outcome_adaptive_action_racing.py +2827 -0
- agent_evolve/application/outcome_adaptive_residual_campaign_runtime.py +580 -0
- agent_evolve/application/outcome_adaptive_residual_portfolio_evolution.py +3671 -0
- agent_evolve/application/outcome_conditioned_portfolio_selection.py +1374 -0
- agent_evolve/application/outcome_relation.py +193 -0
- agent_evolve/application/paired_allocation_comparison.py +241 -0
- agent_evolve/application/paired_block_schedule.py +127 -0
- agent_evolve/application/parent_measurement.py +226 -0
- agent_evolve/application/pareto_archive.py +811 -0
- agent_evolve/application/portfolio_campaign_runtime.py +4739 -0
- agent_evolve/application/portfolio_evolution.py +2950 -0
- agent_evolve/application/portfolio_hypothesis_observations.py +814 -0
- agent_evolve/application/portfolio_memory_attribution.py +581 -0
- agent_evolve/application/portfolio_memory_dose.py +788 -0
- agent_evolve/application/portfolio_memory_matched_control.py +938 -0
- agent_evolve/application/portfolio_memory_transfer.py +297 -0
- agent_evolve/application/portfolio_optimization_memory.py +363 -0
- agent_evolve/application/portfolio_outcome_feedback.py +1613 -0
- agent_evolve/application/portfolio_projection.py +335 -0
- agent_evolve/application/portfolio_recombination.py +2032 -0
- agent_evolve/application/post_evolution_reflection.py +834 -0
- agent_evolve/application/postcommit_rank_authority.py +245 -0
- agent_evolve/application/precommitted_portfolio_racing.py +2762 -0
- agent_evolve/application/prequential_archive_opportunity_calibration.py +1154 -0
- agent_evolve/application/prequential_residual_exploration.py +343 -0
- agent_evolve/application/prequential_score_portfolio.py +954 -0
- agent_evolve/application/projections.py +292 -0
- agent_evolve/application/protected_action_committee.py +1027 -0
- agent_evolve/application/protected_branch_pilot.py +376 -0
- agent_evolve/application/protected_current_prefix_forecast_opportunity.py +552 -0
- agent_evolve/application/provider_replay.py +910 -0
- agent_evolve/application/rank_balanced_causal_pilot.py +1372 -0
- agent_evolve/application/recombination_residual_expert.py +403 -0
- agent_evolve/application/reflection_workflow.py +571 -0
- agent_evolve/application/region_conditional_credit.py +911 -0
- agent_evolve/application/residual_campaign_runtime.py +531 -0
- agent_evolve/application/residual_headroom_campaign_runtime.py +459 -0
- agent_evolve/application/residual_headroom_ledger.py +1544 -0
- agent_evolve/application/residual_learning_transaction.py +396 -0
- agent_evolve/application/residual_portfolio_evolution.py +1228 -0
- agent_evolve/application/residual_reachability.py +749 -0
- agent_evolve/application/residual_stage_credit.py +499 -0
- agent_evolve/application/same_prefix_paired_audit.py +1580 -0
- agent_evolve/application/semantic_coverage_score_portfolio.py +838 -0
- agent_evolve/application/sequential_lineage_allocation.py +1017 -0
- agent_evolve/application/sequential_market_replay.py +1395 -0
- agent_evolve/application/sequential_residual_campaign_runtime.py +305 -0
- agent_evolve/application/sequential_residual_portfolio_evolution.py +940 -0
- agent_evolve/application/single_score_action_allocation.py +299 -0
- agent_evolve/application/source_exposure_allocation.py +906 -0
- agent_evolve/application/staged_memory.py +210 -0
- agent_evolve/application/stratified_cold_start_allocation.py +732 -0
- agent_evolve/application/support_guarded_hurdle_score.py +549 -0
- agent_evolve/application/target_conditioned_action_forecast.py +595 -0
- agent_evolve/application/target_conditioned_campaign.py +566 -0
- agent_evolve/application/treatment_assignment.py +201 -0
- agent_evolve/application/trusted_objective_evidence.py +217 -0
- agent_evolve/application/two_stage_action_evolution.py +1131 -0
- agent_evolve/application/v8lite_allocation_policy.py +1083 -0
- agent_evolve/application/v9_candidate_policy.py +1303 -0
- agent_evolve/bootstrap.py +108 -0
- agent_evolve/campaign_presets.py +517 -0
- agent_evolve/campaign_profiles.py +452 -0
- agent_evolve/campaign_variation_topology.py +288 -0
- agent_evolve/campaign_workload.py +950 -0
- agent_evolve/cli.py +797 -0
- agent_evolve/contract.py +241 -0
- agent_evolve/core/__init__.py +91 -0
- agent_evolve/core/action_semantics.py +411 -0
- agent_evolve/core/authored.py +105 -0
- agent_evolve/core/formatting.py +286 -0
- agent_evolve/core/optimization_semantics.py +324 -0
- agent_evolve/core/problem.py +167 -0
- agent_evolve/core/results.py +323 -0
- agent_evolve/core/stats.py +70 -0
- agent_evolve/core/telemetry.py +100 -0
- agent_evolve/domain/__init__.py +89 -0
- agent_evolve/domain/artifact.py +162 -0
- agent_evolve/domain/durable_text.py +68 -0
- agent_evolve/domain/event.py +1454 -0
- agent_evolve/domain/finite_action_set.py +426 -0
- agent_evolve/domain/finite_variation.py +526 -0
- agent_evolve/domain/generative_emission.py +559 -0
- agent_evolve/domain/ids.py +163 -0
- agent_evolve/domain/inline_text.py +106 -0
- agent_evolve/domain/insight.py +27 -0
- agent_evolve/domain/lineage.py +737 -0
- agent_evolve/domain/llm_task_queue.py +960 -0
- agent_evolve/domain/outcome.py +96 -0
- agent_evolve/domain/patch.py +854 -0
- agent_evolve/domain/typed_json.py +542 -0
- agent_evolve/domain/variation_space.py +158 -0
- agent_evolve/driver.py +1014 -0
- agent_evolve/harness/__init__.py +29 -0
- agent_evolve/harness/base.py +242 -0
- agent_evolve/harness/directives.py +163 -0
- agent_evolve/harness/generative_seal.py +479 -0
- agent_evolve/harness/registry.py +41 -0
- agent_evolve/infrastructure/__init__.py +39 -0
- agent_evolve/infrastructure/artifacts/__init__.py +6 -0
- agent_evolve/infrastructure/artifacts/_verification.py +67 -0
- agent_evolve/infrastructure/artifacts/filesystem.py +343 -0
- agent_evolve/infrastructure/artifacts/in_memory.py +73 -0
- agent_evolve/infrastructure/asyncio_runtime.py +109 -0
- agent_evolve/infrastructure/authored_runtime.py +188 -0
- agent_evolve/infrastructure/authored_worker.py +171 -0
- agent_evolve/infrastructure/clock.py +53 -0
- agent_evolve/infrastructure/events/__init__.py +6 -0
- agent_evolve/infrastructure/events/_validation.py +89 -0
- agent_evolve/infrastructure/events/in_memory.py +56 -0
- agent_evolve/infrastructure/events/jsonl.py +193 -0
- agent_evolve/infrastructure/exception_provenance.py +215 -0
- agent_evolve/infrastructure/ids.py +118 -0
- agent_evolve/infrastructure/lineage_codec.py +1836 -0
- agent_evolve/infrastructure/outcome_adaptive_phase_journal.py +170 -0
- agent_evolve/infrastructure/residual_headroom_journal.py +221 -0
- agent_evolve/infrastructure/resource_lease.py +370 -0
- agent_evolve/infrastructure/sanitization/__init__.py +8 -0
- agent_evolve/infrastructure/sanitization/strict_json.py +484 -0
- agent_evolve/infrastructure/sequential_phase_journal.py +170 -0
- agent_evolve/infrastructure/stream_liveness.py +383 -0
- agent_evolve/infrastructure/subprocess_boundary.py +136 -0
- agent_evolve/integrations/__init__.py +1 -0
- agent_evolve/integrations/botorch/__init__.py +28 -0
- agent_evolve/integrations/botorch/finite_qlognehvi.py +190 -0
- agent_evolve/integrations/botorch/finite_qlognehvi_batch.py +155 -0
- agent_evolve/integrations/botorch/finite_qlognehvi_batch_identity.py +20 -0
- agent_evolve/integrations/botorch/finite_qlognehvi_batch_worker.py +55 -0
- agent_evolve/integrations/botorch/finite_qlognehvi_identity.py +22 -0
- agent_evolve/integrations/botorch/finite_qlognehvi_worker.py +55 -0
- agent_evolve/integrations/botorch/subprocess_qlognehvi.py +261 -0
- agent_evolve/integrations/botorch/subprocess_qlognehvi_batch.py +273 -0
- agent_evolve/integrations/completion.py +242 -0
- agent_evolve/integrations/pydantic_ai/__init__.py +441 -0
- agent_evolve/integrations/pydantic_ai/action_forecast.py +1068 -0
- agent_evolve/integrations/pydantic_ai/agentic_generator.py +2308 -0
- agent_evolve/integrations/pydantic_ai/async_generator.py +1604 -0
- agent_evolve/integrations/pydantic_ai/boundary_codec.py +1526 -0
- agent_evolve/integrations/pydantic_ai/calibrated_portfolio_campaign.py +756 -0
- agent_evolve/integrations/pydantic_ai/calibrated_portfolio_selection.py +7537 -0
- agent_evolve/integrations/pydantic_ai/campaign_acquisition.py +609 -0
- agent_evolve/integrations/pydantic_ai/execution_binding.py +138 -0
- agent_evolve/integrations/pydantic_ai/forecast_geometry_action_committee.py +217 -0
- agent_evolve/integrations/pydantic_ai/harness.py +159 -0
- agent_evolve/integrations/pydantic_ai/heterogeneous_model_execution.py +306 -0
- agent_evolve/integrations/pydantic_ai/hierarchical_residual_adaptive_semantic_view.py +179 -0
- agent_evolve/integrations/pydantic_ai/json_schema_dialect.py +108 -0
- agent_evolve/integrations/pydantic_ai/materialized_hierarchical_residual_expert.py +952 -0
- agent_evolve/integrations/pydantic_ai/materialized_portfolio_judge.py +520 -0
- agent_evolve/integrations/pydantic_ai/model_execution_profile.py +659 -0
- agent_evolve/integrations/pydantic_ai/outbound_request_manifest.py +1170 -0
- agent_evolve/integrations/pydantic_ai/portable_residual_consequence_features.py +575 -0
- agent_evolve/integrations/pydantic_ai/portfolio_selection.py +422 -0
- agent_evolve/integrations/pydantic_ai/progress_aware_openrouter.py +416 -0
- agent_evolve/integrations/pydantic_ai/provider_attempt_join.py +1523 -0
- agent_evolve/integrations/pydantic_ai/provider_free_calibrated_runner.py +607 -0
- agent_evolve/integrations/pydantic_ai/queued_runner.py +2634 -0
- agent_evolve/integrations/pydantic_ai/reconciled_residual_reachability.py +1417 -0
- agent_evolve/integrations/pydantic_ai/residual_forecast_geometry.py +445 -0
- agent_evolve/integrations/pydantic_ai/residual_reachability.py +674 -0
- agent_evolve/integrations/pydantic_ai/residual_semantic_cells.py +239 -0
- agent_evolve/integrations/pydantic_ai/sealed_output_replay.py +1068 -0
- agent_evolve/integrations/pydantic_ai/semantic_coverage_residual_portfolio.py +770 -0
- agent_evolve/integrations/pydantic_ai/semantic_decision_replay.py +383 -0
- agent_evolve/integrations/pydantic_ai/support_adaptive_residual_portfolio.py +135 -0
- agent_evolve/integrations/pydantic_ai/trusted_residual_prompt_context.py +143 -0
- agent_evolve/integrations/pydantic_ai/validated_openrouter_model.py +107 -0
- agent_evolve/integrations/pymoo_adapter.py +242 -0
- agent_evolve/policies/__init__.py +17 -0
- agent_evolve/policies/check.py +469 -0
- agent_evolve/policies/emit_scaffold.py +451 -0
- agent_evolve/policies/feedback/__init__.py +37 -0
- agent_evolve/policies/feedback/held_out_asn.py +1325 -0
- agent_evolve/policies/genetic.py +607 -0
- agent_evolve/policies/llm_backoff.py +183 -0
- agent_evolve/policies/llm_chooser.py +226 -0
- agent_evolve/policies/llm_generator.py +1760 -0
- agent_evolve/policies/llm_init.py +267 -0
- agent_evolve/policies/llm_operator.py +109 -0
- agent_evolve/policies/llm_prior.py +194 -0
- agent_evolve/policies/llm_surrogate.py +334 -0
- agent_evolve/policies/measurement_evidence.py +704 -0
- agent_evolve/policies/memory/__init__.py +223 -0
- agent_evolve/policies/memory/balanced_subset_blocks.py +707 -0
- agent_evolve/policies/memory/compatibility_matching.py +593 -0
- agent_evolve/policies/memory/global_falsification.py +1841 -0
- agent_evolve/policies/memory/prompt_shape.py +503 -0
- agent_evolve/policies/memory/randomized_subset.py +714 -0
- agent_evolve/policies/memory/staged_causal.py +1270 -0
- agent_evolve/policies/memory/treatment_compliance.py +759 -0
- agent_evolve/policies/objective_resolution/__init__.py +17 -0
- agent_evolve/policies/objective_resolution/fixed_grid.py +364 -0
- agent_evolve/policies/operator_portfolio.py +407 -0
- agent_evolve/policies/reguidance.py +1133 -0
- agent_evolve/policies/reward/__init__.py +83 -0
- agent_evolve/policies/reward/affine_candidate_consequence.py +156 -0
- agent_evolve/policies/reward/affine_candidate_consequence_3d.py +159 -0
- agent_evolve/policies/reward/affine_hypervolume.py +490 -0
- agent_evolve/policies/reward/affine_hypervolume_3d.py +567 -0
- agent_evolve/policies/reward/contextual_marginal_utility.py +318 -0
- agent_evolve/policies/reward/frozen_archive.py +360 -0
- agent_evolve/policies/reward/frozen_wave_archive.py +368 -0
- agent_evolve/policies/search_state.py +208 -0
- agent_evolve/policies/selection/__init__.py +345 -0
- agent_evolve/policies/selection/acquisition_certified_slate.py +684 -0
- agent_evolve/policies/selection/affine_frontier_context.py +330 -0
- agent_evolve/policies/selection/affine_frontier_target.py +473 -0
- agent_evolve/policies/selection/archive_elite.py +1346 -0
- agent_evolve/policies/selection/calibrated_portfolio_binding.py +640 -0
- agent_evolve/policies/selection/calibrated_slate.py +1394 -0
- agent_evolve/policies/selection/calibrated_slate_codec.py +579 -0
- agent_evolve/policies/selection/common_candidate_pool.py +685 -0
- agent_evolve/policies/selection/diagnostic_sampling.py +319 -0
- agent_evolve/policies/selection/disjoint_pairs.py +479 -0
- agent_evolve/policies/selection/elite_explorer.py +719 -0
- agent_evolve/policies/selection/finite_action.py +187 -0
- agent_evolve/policies/selection/finite_option_prompt_projection.py +377 -0
- agent_evolve/policies/selection/finite_palette_evidence.py +247 -0
- agent_evolve/policies/selection/forecast_calibration.py +922 -0
- agent_evolve/policies/selection/frontier_probe_slate.py +814 -0
- agent_evolve/policies/selection/frozen_archive_pairs.py +762 -0
- agent_evolve/policies/selection/full_support_slate.py +91 -0
- agent_evolve/policies/selection/meaningful_direction.py +240 -0
- agent_evolve/policies/selection/memory_dose_feasibility.py +259 -0
- agent_evolve/policies/selection/model_anchored_slate.py +826 -0
- agent_evolve/policies/selection/phenotype_recourse.py +979 -0
- agent_evolve/policies/selection/proposal_support.py +368 -0
- agent_evolve/policies/selection/random_portfolio.py +254 -0
- agent_evolve/policies/selection/regret_bounded_slate.py +1084 -0
- agent_evolve/policies/selection/residual_frontier.py +463 -0
- agent_evolve/policies/selection/residual_frontier_target.py +605 -0
- agent_evolve/policies/selection/structural_posterior_slate.py +1571 -0
- agent_evolve/policies/selection/target_conditioned_allocator.py +648 -0
- agent_evolve/policies/selection/target_conditioned_features.py +812 -0
- agent_evolve/policies/selection/target_conditioned_prequential.py +1527 -0
- agent_evolve/policies/selection/task_keyed_palette.py +906 -0
- agent_evolve/policies/semantics.py +147 -0
- agent_evolve/policies/structure.py +362 -0
- agent_evolve/policies/structured_output_budget.py +62 -0
- agent_evolve/policies/surrogate.py +696 -0
- agent_evolve/policies/variation/__init__.py +1 -0
- agent_evolve/policies/variation/compositional_finite_catalog.py +426 -0
- agent_evolve/policies/variation/crossover_inheritance.py +575 -0
- agent_evolve/policies/variation/disjoint_recombination.py +611 -0
- agent_evolve/policies/variation/exact_composition_capacity.py +214 -0
- agent_evolve/policies/variation/exact_parent_crossover.py +950 -0
- agent_evolve/policies/variation/multiscale_restart_catalog.py +372 -0
- agent_evolve/policies/variation/source_union_finite_catalog.py +403 -0
- agent_evolve/policies/variation/typed_patch.py +1981 -0
- agent_evolve/policies/weighted_prior.py +394 -0
- agent_evolve/ports/__init__.py +383 -0
- agent_evolve/ports/action_allocation.py +733 -0
- agent_evolve/ports/action_allocation_frame.py +1153 -0
- agent_evolve/ports/action_allocation_frame_commit.py +294 -0
- agent_evolve/ports/action_allocation_frame_commit_v3.py +432 -0
- agent_evolve/ports/action_allocation_frame_v3.py +995 -0
- agent_evolve/ports/action_forecast.py +1568 -0
- agent_evolve/ports/action_metric_projection.py +165 -0
- agent_evolve/ports/agentic_generator.py +1561 -0
- agent_evolve/ports/archive_context.py +136 -0
- agent_evolve/ports/artifact_sanitizer.py +44 -0
- agent_evolve/ports/artifact_store.py +225 -0
- agent_evolve/ports/clock.py +13 -0
- agent_evolve/ports/contextual_search_allocation.py +827 -0
- agent_evolve/ports/decision_metric_projection.py +258 -0
- agent_evolve/ports/event_store.py +55 -0
- agent_evolve/ports/executable_hypothesis.py +557 -0
- agent_evolve/ports/finite_acquisition.py +377 -0
- agent_evolve/ports/finite_acquisition_batch.py +296 -0
- agent_evolve/ports/finite_acquisition_batch_json.py +164 -0
- agent_evolve/ports/finite_acquisition_json.py +247 -0
- agent_evolve/ports/finite_acquisition_space.py +168 -0
- agent_evolve/ports/finite_action_selection.py +348 -0
- agent_evolve/ports/finite_action_set.py +256 -0
- agent_evolve/ports/frontier_target.py +396 -0
- agent_evolve/ports/generation_failure.py +43 -0
- agent_evolve/ports/hard_feasibility.py +233 -0
- agent_evolve/ports/id_factory.py +34 -0
- agent_evolve/ports/llm_task_queue.py +93 -0
- agent_evolve/ports/objective_resolution.py +419 -0
- agent_evolve/ports/paired_allocation_comparison.py +401 -0
- agent_evolve/ports/paired_block_schedule.py +475 -0
- agent_evolve/ports/parent_measurement.py +336 -0
- agent_evolve/ports/portfolio_memory_dose.py +643 -0
- agent_evolve/ports/portfolio_selection.py +3169 -0
- agent_evolve/ports/postcommit_rank_authority.py +467 -0
- agent_evolve/ports/presented_action_evidence.py +794 -0
- agent_evolve/ports/resource_lease.py +162 -0
- agent_evolve/ports/structured_generator.py +734 -0
- agent_evolve/ports/structured_output_budget.py +120 -0
- agent_evolve/ports/subprocess_boundary.py +138 -0
- agent_evolve/ports/treatment_assignment.py +466 -0
- agent_evolve/ports/variation_catalog.py +76 -0
- agent_evolve/ports/variation_source.py +226 -0
- agent_evolve/proposal_mode.py +157 -0
- agent_evolve/proposers/__init__.py +10 -0
- agent_evolve/proposers/random_proposer.py +188 -0
- agent_evolve/provider_accounting.py +163 -0
- agent_evolve/py.typed +0 -0
- agent_evolve/reference_method.py +1570 -0
- agent_evolve/session/__init__.py +11 -0
- agent_evolve/session/authorship.py +864 -0
- agent_evolve/session/evaluate.py +236 -0
- agent_evolve/session/fidelity.py +237 -0
- agent_evolve/session/genetic_loop.py +742 -0
- agent_evolve/session/loop.py +803 -0
- agent_evolve/session/screening.py +671 -0
- agent_evolve/settings.py +376 -0
- agent_evolve/workload_kit.py +368 -0
- agent_evolve/workload_prompt.py +398 -0
- agentevolve_optimizer-0.5.0.dist-info/METADATA +599 -0
- agentevolve_optimizer-0.5.0.dist-info/RECORD +414 -0
- agentevolve_optimizer-0.5.0.dist-info/WHEEL +5 -0
- agentevolve_optimizer-0.5.0.dist-info/entry_points.txt +2 -0
- agentevolve_optimizer-0.5.0.dist-info/licenses/LICENSE +21 -0
- 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
|
+
]
|