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,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
|
+
]
|