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,383 @@
|
|
|
1
|
+
"""Sealed replay of validated hierarchical residual proposal decisions.
|
|
2
|
+
|
|
3
|
+
Provider-wire replay and semantic-decision replay have different authorities.
|
|
4
|
+
An output accepted after a bounded schema-repair prompt must not be presented
|
|
5
|
+
as an output from the original wire prompt. Its validated domain decision can
|
|
6
|
+
nevertheless be replayed for the exact semantic request that produced it.
|
|
7
|
+
This module implements that higher boundary without changing the live policy.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from dataclasses import dataclass, field
|
|
13
|
+
import hashlib
|
|
14
|
+
import json
|
|
15
|
+
import re
|
|
16
|
+
from typing import Any, Callable, cast
|
|
17
|
+
|
|
18
|
+
from agent_evolve.application.residual_reachability import (
|
|
19
|
+
HierarchicalResidualPlan,
|
|
20
|
+
ResidualProposalRole,
|
|
21
|
+
)
|
|
22
|
+
from agent_evolve.domain.ids import CandidateId, LLMCallId
|
|
23
|
+
from agent_evolve.domain.patch import require_sha256
|
|
24
|
+
from agent_evolve.integrations.pydantic_ai.residual_reachability import (
|
|
25
|
+
HierarchicalResidualMetricForecast,
|
|
26
|
+
HierarchicalResidualProposalRequest,
|
|
27
|
+
HierarchicalResidualProposalSelection,
|
|
28
|
+
)
|
|
29
|
+
from agent_evolve.ports.agentic_generator import AgenticCallTelemetry
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
_TOKEN = re.compile(r"^[a-z][a-z0-9_.-]{0,95}$")
|
|
33
|
+
_DECISION_DOMAIN = b"agent-evolve:hierarchical-residual-proposal-decision:v2\x00"
|
|
34
|
+
_REPLAY_DECISION_DOMAIN = (
|
|
35
|
+
b"agent-evolve:sealed-hierarchical-residual-proposal-replay:v1\x00"
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _canonical_bytes(value: object) -> bytes:
|
|
40
|
+
return json.dumps(
|
|
41
|
+
value,
|
|
42
|
+
allow_nan=False,
|
|
43
|
+
ensure_ascii=True,
|
|
44
|
+
separators=(",", ":"),
|
|
45
|
+
sort_keys=True,
|
|
46
|
+
).encode("ascii", errors="strict")
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _hash(domain: bytes, value: object) -> str:
|
|
50
|
+
return hashlib.sha256(domain + _canonical_bytes(value)).hexdigest()
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def hierarchical_residual_proposal_selection_from_record(
|
|
54
|
+
record: object,
|
|
55
|
+
*,
|
|
56
|
+
telemetry: AgenticCallTelemetry,
|
|
57
|
+
) -> HierarchicalResidualProposalSelection:
|
|
58
|
+
"""Rebuild and authenticate one durable semantic proposal decision."""
|
|
59
|
+
|
|
60
|
+
if type(record) is not dict:
|
|
61
|
+
raise TypeError("selection record must be an exact dict")
|
|
62
|
+
if type(telemetry) is not AgenticCallTelemetry:
|
|
63
|
+
raise TypeError("telemetry must be an exact AgenticCallTelemetry")
|
|
64
|
+
AgenticCallTelemetry.__post_init__(telemetry)
|
|
65
|
+
source = cast(dict[str, object], record)
|
|
66
|
+
plan_records = source.get("plans")
|
|
67
|
+
rationale_records = source.get("rationales")
|
|
68
|
+
probability_records = source.get("probability_valid_hex")
|
|
69
|
+
prediction_groups = source.get("effect_predictions")
|
|
70
|
+
if type(plan_records) is not list or not plan_records:
|
|
71
|
+
raise ValueError("selection record plans must be a non-empty exact list")
|
|
72
|
+
if type(rationale_records) is not list:
|
|
73
|
+
raise TypeError("selection record rationales must be an exact list")
|
|
74
|
+
if type(probability_records) is not list:
|
|
75
|
+
raise TypeError(
|
|
76
|
+
"selection record probability_valid_hex must be an exact list"
|
|
77
|
+
)
|
|
78
|
+
if type(prediction_groups) is not list:
|
|
79
|
+
raise TypeError(
|
|
80
|
+
"selection record effect_predictions must be an exact list"
|
|
81
|
+
)
|
|
82
|
+
if not (
|
|
83
|
+
len(plan_records)
|
|
84
|
+
== len(rationale_records)
|
|
85
|
+
== len(probability_records)
|
|
86
|
+
== len(prediction_groups)
|
|
87
|
+
):
|
|
88
|
+
raise ValueError("selection record member fields do not align")
|
|
89
|
+
|
|
90
|
+
decision_sha256 = source.get("decision_sha256")
|
|
91
|
+
request_sha256 = source.get("request_sha256")
|
|
92
|
+
require_sha256(decision_sha256, "decision_sha256")
|
|
93
|
+
require_sha256(request_sha256, "request_sha256")
|
|
94
|
+
plans: list[HierarchicalResidualPlan] = []
|
|
95
|
+
forecasts: list[tuple[HierarchicalResidualMetricForecast, ...]] = []
|
|
96
|
+
probability_valid: list[float] = []
|
|
97
|
+
rationales: list[str] = []
|
|
98
|
+
draft_members: list[dict[str, object]] = []
|
|
99
|
+
for plan_record, rationale, probability_hex, prediction_records in zip(
|
|
100
|
+
plan_records,
|
|
101
|
+
rationale_records,
|
|
102
|
+
probability_records,
|
|
103
|
+
prediction_groups,
|
|
104
|
+
strict=True,
|
|
105
|
+
):
|
|
106
|
+
if type(plan_record) is not dict:
|
|
107
|
+
raise TypeError("selection plan record must be an exact dict")
|
|
108
|
+
if type(rationale) is not str or not rationale:
|
|
109
|
+
raise ValueError("selection rationale must be a non-empty exact str")
|
|
110
|
+
if type(probability_hex) is not str:
|
|
111
|
+
raise TypeError("probability_valid_hex must contain exact strings")
|
|
112
|
+
if type(prediction_records) is not list or not prediction_records:
|
|
113
|
+
raise ValueError(
|
|
114
|
+
"effect prediction group must be a non-empty exact list"
|
|
115
|
+
)
|
|
116
|
+
plan_source = cast(dict[str, object], plan_record)
|
|
117
|
+
component_ids = plan_source.get("component_option_ids")
|
|
118
|
+
if type(component_ids) is not list:
|
|
119
|
+
raise TypeError("component_option_ids must be an exact list")
|
|
120
|
+
plan = HierarchicalResidualPlan(
|
|
121
|
+
parent_candidate_id=CandidateId(
|
|
122
|
+
cast(str, plan_source.get("parent_candidate_id"))
|
|
123
|
+
),
|
|
124
|
+
parent_contract_sha256=cast(
|
|
125
|
+
str, plan_source.get("parent_contract_sha256")
|
|
126
|
+
),
|
|
127
|
+
action_schema_sha256=cast(
|
|
128
|
+
str, plan_source.get("action_schema_sha256")
|
|
129
|
+
),
|
|
130
|
+
component_option_ids=tuple(component_ids),
|
|
131
|
+
role=ResidualProposalRole(cast(str, plan_source.get("role"))),
|
|
132
|
+
expert_id=cast(str, plan_source.get("expert_id")),
|
|
133
|
+
expert_definition_sha256=cast(
|
|
134
|
+
str, plan_source.get("expert_definition_sha256")
|
|
135
|
+
),
|
|
136
|
+
native_rank=cast(int, plan_source.get("native_rank")),
|
|
137
|
+
decision_receipt_sha256=cast(
|
|
138
|
+
str, plan_source.get("decision_receipt_sha256")
|
|
139
|
+
),
|
|
140
|
+
)
|
|
141
|
+
if plan.decision_receipt_sha256 != decision_sha256:
|
|
142
|
+
raise ValueError("plan decision receipt differs from selection")
|
|
143
|
+
parsed_predictions: list[HierarchicalResidualMetricForecast] = []
|
|
144
|
+
draft_predictions: list[dict[str, object]] = []
|
|
145
|
+
for prediction_record in prediction_records:
|
|
146
|
+
if type(prediction_record) is not dict:
|
|
147
|
+
raise TypeError("metric forecast record must be an exact dict")
|
|
148
|
+
prediction_source = cast(dict[str, object], prediction_record)
|
|
149
|
+
metric_id = prediction_source.get("metric_id")
|
|
150
|
+
hex_values = tuple(
|
|
151
|
+
prediction_source.get(name)
|
|
152
|
+
for name in (
|
|
153
|
+
"p10_delta_hex",
|
|
154
|
+
"p50_delta_hex",
|
|
155
|
+
"p90_delta_hex",
|
|
156
|
+
"confidence_hex",
|
|
157
|
+
)
|
|
158
|
+
)
|
|
159
|
+
if type(metric_id) is not str or not metric_id:
|
|
160
|
+
raise ValueError("metric forecast ID must be non-empty")
|
|
161
|
+
if any(type(value) is not str for value in hex_values):
|
|
162
|
+
raise TypeError("metric forecast hex values must be exact strings")
|
|
163
|
+
p10_hex, p50_hex, p90_hex, confidence_hex = cast(
|
|
164
|
+
tuple[str, str, str, str],
|
|
165
|
+
hex_values,
|
|
166
|
+
)
|
|
167
|
+
prediction = HierarchicalResidualMetricForecast(
|
|
168
|
+
metric_id=metric_id,
|
|
169
|
+
p10_delta=float.fromhex(p10_hex),
|
|
170
|
+
p50_delta=float.fromhex(p50_hex),
|
|
171
|
+
p90_delta=float.fromhex(p90_hex),
|
|
172
|
+
confidence=float.fromhex(confidence_hex),
|
|
173
|
+
)
|
|
174
|
+
parsed_predictions.append(prediction)
|
|
175
|
+
draft_predictions.append(
|
|
176
|
+
{
|
|
177
|
+
"metric_id": prediction.metric_id,
|
|
178
|
+
"p10_delta": prediction.p10_delta,
|
|
179
|
+
"p50_delta": prediction.p50_delta,
|
|
180
|
+
"p90_delta": prediction.p90_delta,
|
|
181
|
+
"confidence": prediction.confidence,
|
|
182
|
+
}
|
|
183
|
+
)
|
|
184
|
+
probability = float.fromhex(probability_hex)
|
|
185
|
+
plans.append(plan)
|
|
186
|
+
rationales.append(rationale)
|
|
187
|
+
probability_valid.append(probability)
|
|
188
|
+
forecasts.append(tuple(parsed_predictions))
|
|
189
|
+
draft_members.append(
|
|
190
|
+
{
|
|
191
|
+
"parent_candidate_id": plan.parent_candidate_id.value,
|
|
192
|
+
"component_option_ids": list(plan.component_option_ids),
|
|
193
|
+
"role": plan.role.value,
|
|
194
|
+
"probability_valid": probability,
|
|
195
|
+
"effect_predictions": draft_predictions,
|
|
196
|
+
"interaction_rationale": rationale,
|
|
197
|
+
}
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
slate_rationale = source.get("slate_rationale")
|
|
201
|
+
if type(slate_rationale) is not str or not slate_rationale:
|
|
202
|
+
raise ValueError("slate_rationale must be a non-empty exact str")
|
|
203
|
+
expected_decision_sha256 = _hash(
|
|
204
|
+
_DECISION_DOMAIN,
|
|
205
|
+
{
|
|
206
|
+
"schema_version": 1,
|
|
207
|
+
"request_sha256": request_sha256,
|
|
208
|
+
"members": draft_members,
|
|
209
|
+
"slate_rationale": slate_rationale,
|
|
210
|
+
},
|
|
211
|
+
)
|
|
212
|
+
if expected_decision_sha256 != decision_sha256:
|
|
213
|
+
raise ValueError("selection decision digest does not close")
|
|
214
|
+
result = HierarchicalResidualProposalSelection(
|
|
215
|
+
request_sha256=cast(str, request_sha256),
|
|
216
|
+
decision_sha256=cast(str, decision_sha256),
|
|
217
|
+
plans=tuple(plans),
|
|
218
|
+
rationales=tuple(rationales),
|
|
219
|
+
probability_valid=tuple(probability_valid),
|
|
220
|
+
effect_predictions=tuple(forecasts),
|
|
221
|
+
slate_rationale=slate_rationale,
|
|
222
|
+
telemetry=telemetry,
|
|
223
|
+
)
|
|
224
|
+
if result.to_record() != source:
|
|
225
|
+
raise ValueError("selection record is not exact canonical output")
|
|
226
|
+
return result
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
class HierarchicalResidualProposalReplayError(RuntimeError):
|
|
230
|
+
"""A sealed semantic decision cannot serve the current request."""
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
@dataclass(slots=True)
|
|
234
|
+
class SealedHierarchicalResidualProposalReplayThenLivePolicy:
|
|
235
|
+
"""Replay exact semantic decisions, then allow an explicit live suffix."""
|
|
236
|
+
|
|
237
|
+
source_id: str
|
|
238
|
+
source_identity_sha256: str
|
|
239
|
+
sealed_selections: tuple[HierarchicalResidualProposalSelection, ...]
|
|
240
|
+
live_policy: Any
|
|
241
|
+
allowed_live_call_ids: tuple[str, ...] = ()
|
|
242
|
+
decision_receipt_sink: Callable[[dict[str, object]], None] | None = None
|
|
243
|
+
_remaining: dict[str, HierarchicalResidualProposalSelection] = field(
|
|
244
|
+
init=False,
|
|
245
|
+
repr=False,
|
|
246
|
+
)
|
|
247
|
+
|
|
248
|
+
def __post_init__(self) -> None:
|
|
249
|
+
if type(self.source_id) is not str or _TOKEN.fullmatch(self.source_id) is None:
|
|
250
|
+
raise ValueError("source_id must use the closed token grammar")
|
|
251
|
+
require_sha256(self.source_identity_sha256, "source_identity_sha256")
|
|
252
|
+
if (
|
|
253
|
+
type(self.sealed_selections) is not tuple
|
|
254
|
+
or any(
|
|
255
|
+
type(value) is not HierarchicalResidualProposalSelection
|
|
256
|
+
for value in self.sealed_selections
|
|
257
|
+
)
|
|
258
|
+
):
|
|
259
|
+
raise TypeError("sealed_selections must contain exact selections")
|
|
260
|
+
for value in self.sealed_selections:
|
|
261
|
+
value.__post_init__()
|
|
262
|
+
request_ids = tuple(value.request_sha256 for value in self.sealed_selections)
|
|
263
|
+
if len(set(request_ids)) != len(request_ids):
|
|
264
|
+
raise ValueError("sealed selections repeat a semantic request")
|
|
265
|
+
if not callable(getattr(self.live_policy, "select", None)):
|
|
266
|
+
raise TypeError("live_policy must expose an async select method")
|
|
267
|
+
if (
|
|
268
|
+
type(self.allowed_live_call_ids) is not tuple
|
|
269
|
+
or any(type(value) is not str for value in self.allowed_live_call_ids)
|
|
270
|
+
or len(set(self.allowed_live_call_ids))
|
|
271
|
+
!= len(self.allowed_live_call_ids)
|
|
272
|
+
):
|
|
273
|
+
raise TypeError("allowed_live_call_ids must be a unique exact tuple")
|
|
274
|
+
for value in self.allowed_live_call_ids:
|
|
275
|
+
LLMCallId(value).__post_init__()
|
|
276
|
+
if self.decision_receipt_sink is not None and not callable(
|
|
277
|
+
self.decision_receipt_sink
|
|
278
|
+
):
|
|
279
|
+
raise TypeError("decision_receipt_sink must be callable or None")
|
|
280
|
+
self._remaining = {
|
|
281
|
+
value.request_sha256: value for value in self.sealed_selections
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
@property
|
|
285
|
+
def remaining_selection_count(self) -> int:
|
|
286
|
+
return len(self._remaining)
|
|
287
|
+
|
|
288
|
+
def assert_consumed(self) -> None:
|
|
289
|
+
if self._remaining:
|
|
290
|
+
raise HierarchicalResidualProposalReplayError(
|
|
291
|
+
"sealed semantic proposal decisions remain unconsumed"
|
|
292
|
+
)
|
|
293
|
+
|
|
294
|
+
def _publish(
|
|
295
|
+
self,
|
|
296
|
+
*,
|
|
297
|
+
decision: str,
|
|
298
|
+
request: HierarchicalResidualProposalRequest,
|
|
299
|
+
selection: HierarchicalResidualProposalSelection,
|
|
300
|
+
) -> None:
|
|
301
|
+
if self.decision_receipt_sink is None:
|
|
302
|
+
return
|
|
303
|
+
unsigned: dict[str, object] = {
|
|
304
|
+
"schema_version": 1,
|
|
305
|
+
"decision": decision,
|
|
306
|
+
"source_id": self.source_id,
|
|
307
|
+
"source_identity_sha256": self.source_identity_sha256,
|
|
308
|
+
"current_call_id": request.call_id.value,
|
|
309
|
+
"current_request_sha256": request.request_sha256,
|
|
310
|
+
"selection_decision_sha256": selection.decision_sha256,
|
|
311
|
+
}
|
|
312
|
+
self.decision_receipt_sink(
|
|
313
|
+
{
|
|
314
|
+
**unsigned,
|
|
315
|
+
"decision_receipt_sha256": _hash(
|
|
316
|
+
_REPLAY_DECISION_DOMAIN,
|
|
317
|
+
unsigned,
|
|
318
|
+
),
|
|
319
|
+
}
|
|
320
|
+
)
|
|
321
|
+
|
|
322
|
+
async def select(
|
|
323
|
+
self,
|
|
324
|
+
request: HierarchicalResidualProposalRequest,
|
|
325
|
+
) -> HierarchicalResidualProposalSelection:
|
|
326
|
+
request.__post_init__()
|
|
327
|
+
request_sha256 = request.request_sha256
|
|
328
|
+
replayed = self._remaining.pop(request_sha256, None)
|
|
329
|
+
if replayed is not None:
|
|
330
|
+
for plan in replayed.plans:
|
|
331
|
+
if (
|
|
332
|
+
plan.action_schema_sha256
|
|
333
|
+
!= request.action_schema.schema_sha256
|
|
334
|
+
or plan.expert_id != request.expert_id
|
|
335
|
+
or plan.expert_definition_sha256
|
|
336
|
+
!= request.expert_definition_sha256
|
|
337
|
+
or plan.radius not in request.allowed_radii
|
|
338
|
+
or plan.role not in request.allowed_roles
|
|
339
|
+
):
|
|
340
|
+
raise HierarchicalResidualProposalReplayError(
|
|
341
|
+
"sealed semantic selection differs from current contract"
|
|
342
|
+
)
|
|
343
|
+
expected_contract = request.action_schema.contract_for(
|
|
344
|
+
plan.parent_candidate_id
|
|
345
|
+
)
|
|
346
|
+
if (
|
|
347
|
+
expected_contract.identity_sha256
|
|
348
|
+
!= plan.parent_contract_sha256
|
|
349
|
+
):
|
|
350
|
+
raise HierarchicalResidualProposalReplayError(
|
|
351
|
+
"sealed parent contract differs from current contract"
|
|
352
|
+
)
|
|
353
|
+
self._publish(
|
|
354
|
+
decision="replayed",
|
|
355
|
+
request=request,
|
|
356
|
+
selection=replayed,
|
|
357
|
+
)
|
|
358
|
+
return replayed
|
|
359
|
+
if request.call_id.value not in self.allowed_live_call_ids:
|
|
360
|
+
raise HierarchicalResidualProposalReplayError(
|
|
361
|
+
"no sealed decision exists and live execution is unauthorized"
|
|
362
|
+
)
|
|
363
|
+
live = await self.live_policy.select(request)
|
|
364
|
+
if (
|
|
365
|
+
type(live) is not HierarchicalResidualProposalSelection
|
|
366
|
+
or live.request_sha256 != request_sha256
|
|
367
|
+
):
|
|
368
|
+
raise HierarchicalResidualProposalReplayError(
|
|
369
|
+
"live policy returned a foreign semantic decision"
|
|
370
|
+
)
|
|
371
|
+
self._publish(
|
|
372
|
+
decision="live_after_prefix",
|
|
373
|
+
request=request,
|
|
374
|
+
selection=live,
|
|
375
|
+
)
|
|
376
|
+
return live
|
|
377
|
+
|
|
378
|
+
|
|
379
|
+
__all__ = [
|
|
380
|
+
"HierarchicalResidualProposalReplayError",
|
|
381
|
+
"SealedHierarchicalResidualProposalReplayThenLivePolicy",
|
|
382
|
+
"hierarchical_residual_proposal_selection_from_record",
|
|
383
|
+
]
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"""One workload-neutral composition root for the adaptive residual portfolio."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
|
|
7
|
+
from agent_evolve.application.action_score_authorities import (
|
|
8
|
+
NativeRankMaterializedActionScorer,
|
|
9
|
+
TargetEmpiricalReturnMaterializedActionScorer,
|
|
10
|
+
)
|
|
11
|
+
from agent_evolve.application.frozen_hurdle_score import (
|
|
12
|
+
FrozenHurdleScoreKind,
|
|
13
|
+
FrozenStandardizedLinearModel,
|
|
14
|
+
MaterializedActionFeatureProjectionPort,
|
|
15
|
+
)
|
|
16
|
+
from agent_evolve.application.materialized_action_broker import (
|
|
17
|
+
RegretBrokeredMaterializedActionPolicy,
|
|
18
|
+
)
|
|
19
|
+
from agent_evolve.application.prequential_score_portfolio import (
|
|
20
|
+
ReliabilityAdaptiveScorePortfolioPolicy,
|
|
21
|
+
)
|
|
22
|
+
from agent_evolve.application.support_guarded_hurdle_score import (
|
|
23
|
+
FrozenFeatureSupportGroup,
|
|
24
|
+
SupportGuardedFrozenHurdleMaterializedActionScorer,
|
|
25
|
+
)
|
|
26
|
+
from agent_evolve.ports.hard_feasibility import HardFeasibilityPort
|
|
27
|
+
|
|
28
|
+
from .portable_residual_consequence_features import (
|
|
29
|
+
PORTABLE_RESIDUAL_CONSEQUENCE_FEATURE_GROUPS,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
PRIMARY_SCORER_ID = "portable_positive_probability"
|
|
34
|
+
RELIABILITY_COMPONENT_IDS = (
|
|
35
|
+
"forecast",
|
|
36
|
+
"parent",
|
|
37
|
+
"proposal_structure",
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@dataclass(frozen=True, slots=True)
|
|
42
|
+
class SupportAdaptiveResidualPortfolio:
|
|
43
|
+
"""Authenticated scorer bundle and its prequential allocation policy."""
|
|
44
|
+
|
|
45
|
+
primary: SupportGuardedFrozenHurdleMaterializedActionScorer
|
|
46
|
+
provider_native: NativeRankMaterializedActionScorer
|
|
47
|
+
target_empirical: TargetEmpiricalReturnMaterializedActionScorer
|
|
48
|
+
allocation: ReliabilityAdaptiveScorePortfolioPolicy
|
|
49
|
+
|
|
50
|
+
def __post_init__(self) -> None:
|
|
51
|
+
if (
|
|
52
|
+
type(self.primary)
|
|
53
|
+
is not SupportGuardedFrozenHurdleMaterializedActionScorer
|
|
54
|
+
or type(self.provider_native)
|
|
55
|
+
is not NativeRankMaterializedActionScorer
|
|
56
|
+
or type(self.target_empirical)
|
|
57
|
+
is not TargetEmpiricalReturnMaterializedActionScorer
|
|
58
|
+
or type(self.allocation)
|
|
59
|
+
is not ReliabilityAdaptiveScorePortfolioPolicy
|
|
60
|
+
):
|
|
61
|
+
raise TypeError(
|
|
62
|
+
"support-adaptive portfolio contains a foreign component"
|
|
63
|
+
)
|
|
64
|
+
self.primary.__post_init__()
|
|
65
|
+
self.provider_native.__post_init__()
|
|
66
|
+
self.target_empirical.__post_init__()
|
|
67
|
+
self.allocation.__post_init__()
|
|
68
|
+
if self.allocation.primary_reliability is not self.primary:
|
|
69
|
+
raise ValueError(
|
|
70
|
+
"allocation reliability must be the primary scorer instance"
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def compose_support_adaptive_residual_portfolio(
|
|
75
|
+
*,
|
|
76
|
+
projection: MaterializedActionFeatureProjectionPort,
|
|
77
|
+
positive_model: FrozenStandardizedLinearModel,
|
|
78
|
+
magnitude_model: FrozenStandardizedLinearModel,
|
|
79
|
+
source_fit_sha256: str,
|
|
80
|
+
broker: RegretBrokeredMaterializedActionPolicy,
|
|
81
|
+
minimum_primary_fraction: float = 0.5,
|
|
82
|
+
hard_feasibility: HardFeasibilityPort | None = None,
|
|
83
|
+
) -> SupportAdaptiveResidualPortfolio:
|
|
84
|
+
"""Compose the same outcome-blind authority market for any workload."""
|
|
85
|
+
|
|
86
|
+
groups = tuple(
|
|
87
|
+
FrozenFeatureSupportGroup(
|
|
88
|
+
group_id=group_id,
|
|
89
|
+
feature_names=tuple(feature_names),
|
|
90
|
+
)
|
|
91
|
+
for group_id, feature_names in sorted(
|
|
92
|
+
PORTABLE_RESIDUAL_CONSEQUENCE_FEATURE_GROUPS
|
|
93
|
+
)
|
|
94
|
+
)
|
|
95
|
+
primary = SupportGuardedFrozenHurdleMaterializedActionScorer(
|
|
96
|
+
scorer_id=PRIMARY_SCORER_ID,
|
|
97
|
+
projection=projection,
|
|
98
|
+
positive_model=positive_model,
|
|
99
|
+
magnitude_model=magnitude_model,
|
|
100
|
+
score_kind=FrozenHurdleScoreKind.POSITIVE_PROBABILITY,
|
|
101
|
+
source_fit_sha256=source_fit_sha256,
|
|
102
|
+
support_groups=groups,
|
|
103
|
+
)
|
|
104
|
+
provider_native = NativeRankMaterializedActionScorer()
|
|
105
|
+
target_empirical = TargetEmpiricalReturnMaterializedActionScorer(
|
|
106
|
+
broker=broker
|
|
107
|
+
)
|
|
108
|
+
scorers = tuple(
|
|
109
|
+
sorted(
|
|
110
|
+
(primary, provider_native, target_empirical),
|
|
111
|
+
key=lambda value: value.scorer_id,
|
|
112
|
+
)
|
|
113
|
+
)
|
|
114
|
+
allocation = ReliabilityAdaptiveScorePortfolioPolicy(
|
|
115
|
+
scorers=scorers,
|
|
116
|
+
primary_scorer_id=primary.scorer_id,
|
|
117
|
+
primary_reliability=primary,
|
|
118
|
+
reliability_component_ids=RELIABILITY_COMPONENT_IDS,
|
|
119
|
+
minimum_primary_fraction=minimum_primary_fraction,
|
|
120
|
+
hard_feasibility=hard_feasibility,
|
|
121
|
+
)
|
|
122
|
+
return SupportAdaptiveResidualPortfolio(
|
|
123
|
+
primary=primary,
|
|
124
|
+
provider_native=provider_native,
|
|
125
|
+
target_empirical=target_empirical,
|
|
126
|
+
allocation=allocation,
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
__all__ = [
|
|
131
|
+
"PRIMARY_SCORER_ID",
|
|
132
|
+
"RELIABILITY_COMPONENT_IDS",
|
|
133
|
+
"SupportAdaptiveResidualPortfolio",
|
|
134
|
+
"compose_support_adaptive_residual_portfolio",
|
|
135
|
+
]
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"""Project residual prompt evidence to an unambiguous numeric interface."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import math
|
|
6
|
+
from dataclasses import dataclass, field
|
|
7
|
+
|
|
8
|
+
from agent_evolve.application.trusted_objective_evidence import (
|
|
9
|
+
TRUSTED_OBJECTIVE_EVIDENCE_CODEC_DEFINITION_SHA256,
|
|
10
|
+
TrustedObjectiveEvidenceCodec,
|
|
11
|
+
)
|
|
12
|
+
from agent_evolve.domain.typed_json import (
|
|
13
|
+
FrozenJsonObject,
|
|
14
|
+
freeze_json,
|
|
15
|
+
thaw_json,
|
|
16
|
+
typed_json_sha256,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
_OBJECTIVE_MAP_KEYS = frozenset({"objectives", "real_objectives"})
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _canonical_hex_float(value: object) -> float | None:
|
|
24
|
+
if type(value) is not str:
|
|
25
|
+
return None
|
|
26
|
+
try:
|
|
27
|
+
parsed = float.fromhex(value)
|
|
28
|
+
except ValueError:
|
|
29
|
+
return None
|
|
30
|
+
if not math.isfinite(parsed) or parsed.hex() != value:
|
|
31
|
+
return None
|
|
32
|
+
return parsed
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _hex_collection(value: object) -> object | None:
|
|
36
|
+
scalar = _canonical_hex_float(value)
|
|
37
|
+
if scalar is not None:
|
|
38
|
+
return scalar
|
|
39
|
+
if isinstance(value, list) and value:
|
|
40
|
+
parsed = [_canonical_hex_float(item) for item in value]
|
|
41
|
+
if all(item is not None for item in parsed):
|
|
42
|
+
return parsed
|
|
43
|
+
if isinstance(value, dict) and value:
|
|
44
|
+
parsed_map = {
|
|
45
|
+
str(key): _canonical_hex_float(item)
|
|
46
|
+
for key, item in value.items()
|
|
47
|
+
}
|
|
48
|
+
if all(item is not None for item in parsed_map.values()):
|
|
49
|
+
return parsed_map
|
|
50
|
+
return None
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
@dataclass(frozen=True, slots=True)
|
|
54
|
+
class TrustedResidualPromptContextProjection:
|
|
55
|
+
"""Add numeric twins for disclosed hex values without adding evidence."""
|
|
56
|
+
|
|
57
|
+
codec: TrustedObjectiveEvidenceCodec = field(
|
|
58
|
+
default_factory=TrustedObjectiveEvidenceCodec
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
def project(self, context: FrozenJsonObject) -> FrozenJsonObject:
|
|
62
|
+
if (
|
|
63
|
+
type(context) is not FrozenJsonObject
|
|
64
|
+
or freeze_json(context) is not context
|
|
65
|
+
):
|
|
66
|
+
raise TypeError("context must be an exact frozen object")
|
|
67
|
+
source_sha256 = typed_json_sha256(context)
|
|
68
|
+
conversion_count = 0
|
|
69
|
+
objective_point_count = 0
|
|
70
|
+
|
|
71
|
+
def visit(value: object) -> object:
|
|
72
|
+
nonlocal conversion_count, objective_point_count
|
|
73
|
+
if isinstance(value, list):
|
|
74
|
+
return [visit(item) for item in value]
|
|
75
|
+
if not isinstance(value, dict):
|
|
76
|
+
return value
|
|
77
|
+
rendered: dict[str, object] = {}
|
|
78
|
+
for raw_key, raw_value in value.items():
|
|
79
|
+
key = str(raw_key)
|
|
80
|
+
if (
|
|
81
|
+
key in _OBJECTIVE_MAP_KEYS
|
|
82
|
+
and isinstance(raw_value, dict)
|
|
83
|
+
and raw_value
|
|
84
|
+
):
|
|
85
|
+
point: dict[str, float] = {}
|
|
86
|
+
for metric_id, metric_value in raw_value.items():
|
|
87
|
+
parsed = _canonical_hex_float(metric_value)
|
|
88
|
+
if parsed is None:
|
|
89
|
+
if (
|
|
90
|
+
type(metric_value) is not float
|
|
91
|
+
or not math.isfinite(metric_value)
|
|
92
|
+
):
|
|
93
|
+
raise ValueError(
|
|
94
|
+
"objective prompt values must be finite "
|
|
95
|
+
"floats or canonical binary64 hex"
|
|
96
|
+
)
|
|
97
|
+
parsed = metric_value
|
|
98
|
+
point[str(metric_id)] = parsed
|
|
99
|
+
evidence = thaw_json(self.codec.encode_point(point))
|
|
100
|
+
rendered[key] = evidence["numeric_values"]
|
|
101
|
+
rendered[f"{key}_evidence"] = evidence
|
|
102
|
+
objective_point_count += 1
|
|
103
|
+
continue
|
|
104
|
+
converted = visit(raw_value)
|
|
105
|
+
rendered[key] = converted
|
|
106
|
+
if key.endswith("_hex"):
|
|
107
|
+
numeric = _hex_collection(raw_value)
|
|
108
|
+
if numeric is not None:
|
|
109
|
+
numeric_key = key[:-4]
|
|
110
|
+
if numeric_key in value or numeric_key in rendered:
|
|
111
|
+
raise ValueError(
|
|
112
|
+
"hex prompt evidence collides with an "
|
|
113
|
+
"existing numeric field"
|
|
114
|
+
)
|
|
115
|
+
rendered[numeric_key] = numeric
|
|
116
|
+
conversion_count += 1
|
|
117
|
+
return rendered
|
|
118
|
+
|
|
119
|
+
source = thaw_json(context)
|
|
120
|
+
projected = visit(source)
|
|
121
|
+
if not isinstance(projected, dict):
|
|
122
|
+
raise TypeError("projected context must have an object root")
|
|
123
|
+
projected["trusted_objective_evidence_contract"] = thaw_json(
|
|
124
|
+
self.codec.prompt_contract()
|
|
125
|
+
)
|
|
126
|
+
projected["trusted_prompt_projection"] = {
|
|
127
|
+
"schema_version": 1,
|
|
128
|
+
"source_context_sha256": source_sha256,
|
|
129
|
+
"codec_definition_sha256": (
|
|
130
|
+
TRUSTED_OBJECTIVE_EVIDENCE_CODEC_DEFINITION_SHA256
|
|
131
|
+
),
|
|
132
|
+
"hex_scalar_or_collection_conversion_count": conversion_count,
|
|
133
|
+
"objective_point_conversion_count": objective_point_count,
|
|
134
|
+
"new_candidate_outcomes_disclosed": False,
|
|
135
|
+
"workload_objective_model_provider_branches": False,
|
|
136
|
+
}
|
|
137
|
+
result = freeze_json(projected)
|
|
138
|
+
if type(result) is not FrozenJsonObject:
|
|
139
|
+
raise TypeError("projected context must have an object root")
|
|
140
|
+
return result
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
__all__ = ["TrustedResidualPromptContextProjection"]
|