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,348 @@
|
|
|
1
|
+
"""Matched decision contracts for model and prospective engine selectors."""
|
|
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
|
+
from typing import Protocol, runtime_checkable
|
|
11
|
+
|
|
12
|
+
from agent_evolve.domain.finite_action_set import FiniteActionSetAuthority
|
|
13
|
+
from agent_evolve.domain.ids import LLMCallId
|
|
14
|
+
from agent_evolve.domain.insight import InsightRef
|
|
15
|
+
from agent_evolve.domain.patch import require_sha256
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
_TOKEN = re.compile(r"^[a-z][a-z0-9_.-]{0,95}$")
|
|
19
|
+
_RANK_TOKEN_DOMAIN = b"agent-evolve:prospective-uniform-rank-token:v1\x00"
|
|
20
|
+
_DECISION_DOMAIN = b"agent-evolve:finite-action-decision:v1\x00"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _canonical_json(value: object) -> bytes:
|
|
24
|
+
return json.dumps(
|
|
25
|
+
value,
|
|
26
|
+
ensure_ascii=True,
|
|
27
|
+
allow_nan=False,
|
|
28
|
+
separators=(",", ":"),
|
|
29
|
+
sort_keys=True,
|
|
30
|
+
).encode("ascii")
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _hash(domain: bytes, value: object) -> str:
|
|
34
|
+
return hashlib.sha256(domain + _canonical_json(value)).hexdigest()
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _policy_identity(
|
|
38
|
+
policy_id: str,
|
|
39
|
+
policy_version: int,
|
|
40
|
+
definition_sha256: str,
|
|
41
|
+
) -> None:
|
|
42
|
+
if type(policy_id) is not str or _TOKEN.fullmatch(policy_id) is None:
|
|
43
|
+
raise ValueError("selector policy_id must use the token grammar")
|
|
44
|
+
if type(policy_version) is not int or policy_version <= 0:
|
|
45
|
+
raise ValueError("selector policy_version must be positive")
|
|
46
|
+
require_sha256(definition_sha256, "selector definition_sha256")
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class FiniteActionSelectorKind(str, Enum):
|
|
50
|
+
MODEL = "model"
|
|
51
|
+
ENGINE = "engine"
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
@dataclass(frozen=True, slots=True)
|
|
55
|
+
class ProspectiveUniformRankToken:
|
|
56
|
+
"""One engine ordinal committed before current-run candidate outcomes."""
|
|
57
|
+
|
|
58
|
+
task_sha256: str
|
|
59
|
+
authority_sha256: str
|
|
60
|
+
support_sha256: str
|
|
61
|
+
card_reference: InsightRef
|
|
62
|
+
card_content_sha256: str
|
|
63
|
+
cardinality: int
|
|
64
|
+
selected_ordinal: int
|
|
65
|
+
schedule_policy_id: str
|
|
66
|
+
schedule_policy_version: int
|
|
67
|
+
schedule_definition_sha256: str
|
|
68
|
+
schedule_state_sha256: str
|
|
69
|
+
pre_outcome_phase_commit_sha256: str
|
|
70
|
+
current_outcome_access: bool = False
|
|
71
|
+
token_sha256: str = field(init=False)
|
|
72
|
+
|
|
73
|
+
def __post_init__(self) -> None:
|
|
74
|
+
for name in (
|
|
75
|
+
"task_sha256",
|
|
76
|
+
"authority_sha256",
|
|
77
|
+
"support_sha256",
|
|
78
|
+
"card_content_sha256",
|
|
79
|
+
"schedule_definition_sha256",
|
|
80
|
+
"schedule_state_sha256",
|
|
81
|
+
"pre_outcome_phase_commit_sha256",
|
|
82
|
+
):
|
|
83
|
+
require_sha256(getattr(self, name), name)
|
|
84
|
+
if type(self.card_reference) is not InsightRef:
|
|
85
|
+
raise TypeError("card_reference must be an exact InsightRef")
|
|
86
|
+
InsightRef.__post_init__(self.card_reference)
|
|
87
|
+
if type(self.cardinality) is not int or self.cardinality <= 0:
|
|
88
|
+
raise ValueError("cardinality must be positive")
|
|
89
|
+
if type(self.selected_ordinal) is not int or not (
|
|
90
|
+
0 <= self.selected_ordinal < self.cardinality
|
|
91
|
+
):
|
|
92
|
+
raise ValueError("selected_ordinal is outside the support")
|
|
93
|
+
_policy_identity(
|
|
94
|
+
self.schedule_policy_id,
|
|
95
|
+
self.schedule_policy_version,
|
|
96
|
+
self.schedule_definition_sha256,
|
|
97
|
+
)
|
|
98
|
+
if type(self.current_outcome_access) is not bool:
|
|
99
|
+
raise TypeError("current_outcome_access must be bool")
|
|
100
|
+
if self.current_outcome_access:
|
|
101
|
+
raise ValueError("prospective engine rank cannot access current outcomes")
|
|
102
|
+
object.__setattr__(
|
|
103
|
+
self,
|
|
104
|
+
"token_sha256",
|
|
105
|
+
_hash(_RANK_TOKEN_DOMAIN, self.to_record()),
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
def to_record(self) -> dict[str, object]:
|
|
109
|
+
return {
|
|
110
|
+
"schema_version": 1,
|
|
111
|
+
"task_sha256": self.task_sha256,
|
|
112
|
+
"authority_sha256": self.authority_sha256,
|
|
113
|
+
"support_sha256": self.support_sha256,
|
|
114
|
+
"card_reference": {
|
|
115
|
+
"insight_id": self.card_reference.insight_id.value,
|
|
116
|
+
"version": self.card_reference.version,
|
|
117
|
+
},
|
|
118
|
+
"card_content_sha256": self.card_content_sha256,
|
|
119
|
+
"cardinality": self.cardinality,
|
|
120
|
+
"selected_ordinal": self.selected_ordinal,
|
|
121
|
+
"schedule_policy_id": self.schedule_policy_id,
|
|
122
|
+
"schedule_policy_version": self.schedule_policy_version,
|
|
123
|
+
"schedule_definition_sha256": self.schedule_definition_sha256,
|
|
124
|
+
"schedule_state_sha256": self.schedule_state_sha256,
|
|
125
|
+
"pre_outcome_phase_commit_sha256": (
|
|
126
|
+
self.pre_outcome_phase_commit_sha256
|
|
127
|
+
),
|
|
128
|
+
"current_outcome_access": self.current_outcome_access,
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
@dataclass(frozen=True, slots=True)
|
|
133
|
+
class EngineFiniteActionRequest:
|
|
134
|
+
authority: FiniteActionSetAuthority
|
|
135
|
+
prospective_rank: ProspectiveUniformRankToken
|
|
136
|
+
|
|
137
|
+
def __post_init__(self) -> None:
|
|
138
|
+
if type(self.authority) is not FiniteActionSetAuthority:
|
|
139
|
+
raise TypeError("authority must be an exact FiniteActionSetAuthority")
|
|
140
|
+
FiniteActionSetAuthority.__post_init__(self.authority)
|
|
141
|
+
if type(self.prospective_rank) is not ProspectiveUniformRankToken:
|
|
142
|
+
raise TypeError("prospective_rank must be an exact token")
|
|
143
|
+
ProspectiveUniformRankToken.__post_init__(self.prospective_rank)
|
|
144
|
+
token = self.prospective_rank
|
|
145
|
+
expected = (
|
|
146
|
+
self.authority.authority_sha256,
|
|
147
|
+
self.authority.support.support_sha256,
|
|
148
|
+
self.authority.card.reference,
|
|
149
|
+
self.authority.card.card_content_sha256,
|
|
150
|
+
self.authority.support.cardinality,
|
|
151
|
+
)
|
|
152
|
+
observed = (
|
|
153
|
+
token.authority_sha256,
|
|
154
|
+
token.support_sha256,
|
|
155
|
+
token.card_reference,
|
|
156
|
+
token.card_content_sha256,
|
|
157
|
+
token.cardinality,
|
|
158
|
+
)
|
|
159
|
+
if observed != expected:
|
|
160
|
+
raise ValueError("prospective rank token differs from its authority")
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
@dataclass(frozen=True, slots=True)
|
|
164
|
+
class FiniteActionDecision:
|
|
165
|
+
"""Outcome-free exact selection from one authenticated K-option support."""
|
|
166
|
+
|
|
167
|
+
authority_sha256: str
|
|
168
|
+
support_sha256: str
|
|
169
|
+
selector_kind: FiniteActionSelectorKind
|
|
170
|
+
selected_ordinal: int
|
|
171
|
+
option_id: str
|
|
172
|
+
option_identity_sha256: str
|
|
173
|
+
child_configuration_sha256: str
|
|
174
|
+
phenotype_identity_sha256: str
|
|
175
|
+
selector_policy_id: str
|
|
176
|
+
selector_policy_version: int
|
|
177
|
+
selector_definition_sha256: str
|
|
178
|
+
prospective_token_sha256: str | None
|
|
179
|
+
model_call_id: LLMCallId | None
|
|
180
|
+
model_prompt_sha256: str | None
|
|
181
|
+
model_telemetry_sha256: str | None
|
|
182
|
+
propensity_numerator: int | None
|
|
183
|
+
propensity_denominator: int | None
|
|
184
|
+
current_outcome_access: bool = False
|
|
185
|
+
decision_sha256: str = field(init=False)
|
|
186
|
+
|
|
187
|
+
def __post_init__(self) -> None:
|
|
188
|
+
for name in (
|
|
189
|
+
"authority_sha256",
|
|
190
|
+
"support_sha256",
|
|
191
|
+
"option_identity_sha256",
|
|
192
|
+
"child_configuration_sha256",
|
|
193
|
+
"phenotype_identity_sha256",
|
|
194
|
+
"selector_definition_sha256",
|
|
195
|
+
):
|
|
196
|
+
require_sha256(getattr(self, name), name)
|
|
197
|
+
if type(self.selector_kind) is not FiniteActionSelectorKind:
|
|
198
|
+
raise TypeError("selector_kind must be an exact FiniteActionSelectorKind")
|
|
199
|
+
if type(self.selected_ordinal) is not int or self.selected_ordinal < 0:
|
|
200
|
+
raise ValueError("selected_ordinal must be non-negative")
|
|
201
|
+
if type(self.option_id) is not str or not self.option_id:
|
|
202
|
+
raise ValueError("option_id must be non-empty")
|
|
203
|
+
_policy_identity(
|
|
204
|
+
self.selector_policy_id,
|
|
205
|
+
self.selector_policy_version,
|
|
206
|
+
self.selector_definition_sha256,
|
|
207
|
+
)
|
|
208
|
+
if type(self.current_outcome_access) is not bool:
|
|
209
|
+
raise TypeError("current_outcome_access must be bool")
|
|
210
|
+
if self.current_outcome_access:
|
|
211
|
+
raise ValueError("finite action decision cannot access current outcomes")
|
|
212
|
+
if self.selector_kind is FiniteActionSelectorKind.ENGINE:
|
|
213
|
+
if self.prospective_token_sha256 is None:
|
|
214
|
+
raise ValueError("engine decision requires a prospective rank token")
|
|
215
|
+
require_sha256(
|
|
216
|
+
self.prospective_token_sha256,
|
|
217
|
+
"prospective_token_sha256",
|
|
218
|
+
)
|
|
219
|
+
if (
|
|
220
|
+
self.model_call_id is not None
|
|
221
|
+
or self.model_prompt_sha256 is not None
|
|
222
|
+
or self.model_telemetry_sha256 is not None
|
|
223
|
+
):
|
|
224
|
+
raise ValueError("engine decision cannot claim model evidence")
|
|
225
|
+
if (
|
|
226
|
+
type(self.propensity_numerator) is not int
|
|
227
|
+
or type(self.propensity_denominator) is not int
|
|
228
|
+
or self.propensity_numerator != 1
|
|
229
|
+
or self.propensity_denominator <= 0
|
|
230
|
+
):
|
|
231
|
+
raise ValueError("prospective uniform decision requires propensity 1/K")
|
|
232
|
+
else:
|
|
233
|
+
if self.prospective_token_sha256 is not None:
|
|
234
|
+
raise ValueError("model decision cannot claim an engine rank token")
|
|
235
|
+
if type(self.model_call_id) is not LLMCallId:
|
|
236
|
+
raise ValueError("model decision requires an exact model_call_id")
|
|
237
|
+
LLMCallId.__post_init__(self.model_call_id)
|
|
238
|
+
if self.model_prompt_sha256 is None:
|
|
239
|
+
raise ValueError("model decision requires its exact prompt identity")
|
|
240
|
+
require_sha256(self.model_prompt_sha256, "model_prompt_sha256")
|
|
241
|
+
if self.model_telemetry_sha256 is None:
|
|
242
|
+
raise ValueError("model decision requires authenticated telemetry")
|
|
243
|
+
require_sha256(self.model_telemetry_sha256, "model_telemetry_sha256")
|
|
244
|
+
if self.propensity_numerator is not None or self.propensity_denominator is not None:
|
|
245
|
+
raise ValueError("non-randomized model decision has unknown propensity")
|
|
246
|
+
object.__setattr__(
|
|
247
|
+
self,
|
|
248
|
+
"decision_sha256",
|
|
249
|
+
_hash(_DECISION_DOMAIN, self.to_record()),
|
|
250
|
+
)
|
|
251
|
+
|
|
252
|
+
def to_record(self) -> dict[str, object]:
|
|
253
|
+
return {
|
|
254
|
+
"schema_version": 1,
|
|
255
|
+
"authority_sha256": self.authority_sha256,
|
|
256
|
+
"support_sha256": self.support_sha256,
|
|
257
|
+
"selector_kind": self.selector_kind.value,
|
|
258
|
+
"selected_ordinal": self.selected_ordinal,
|
|
259
|
+
"option_id": self.option_id,
|
|
260
|
+
"option_identity_sha256": self.option_identity_sha256,
|
|
261
|
+
"child_configuration_sha256": self.child_configuration_sha256,
|
|
262
|
+
"phenotype_identity_sha256": self.phenotype_identity_sha256,
|
|
263
|
+
"selector_policy_id": self.selector_policy_id,
|
|
264
|
+
"selector_policy_version": self.selector_policy_version,
|
|
265
|
+
"selector_definition_sha256": self.selector_definition_sha256,
|
|
266
|
+
"prospective_token_sha256": self.prospective_token_sha256,
|
|
267
|
+
"model_call_id": (
|
|
268
|
+
None if self.model_call_id is None else self.model_call_id.value
|
|
269
|
+
),
|
|
270
|
+
"model_prompt_sha256": self.model_prompt_sha256,
|
|
271
|
+
"model_telemetry_sha256": self.model_telemetry_sha256,
|
|
272
|
+
"propensity": (
|
|
273
|
+
None
|
|
274
|
+
if self.propensity_numerator is None
|
|
275
|
+
else {
|
|
276
|
+
"numerator": self.propensity_numerator,
|
|
277
|
+
"denominator": self.propensity_denominator,
|
|
278
|
+
}
|
|
279
|
+
),
|
|
280
|
+
"current_outcome_access": self.current_outcome_access,
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
def validate_finite_action_decision(
|
|
285
|
+
authority: FiniteActionSetAuthority,
|
|
286
|
+
decision: FiniteActionDecision,
|
|
287
|
+
) -> None:
|
|
288
|
+
if type(authority) is not FiniteActionSetAuthority:
|
|
289
|
+
raise TypeError("authority must be an exact FiniteActionSetAuthority")
|
|
290
|
+
FiniteActionSetAuthority.__post_init__(authority)
|
|
291
|
+
if type(decision) is not FiniteActionDecision:
|
|
292
|
+
raise TypeError("decision must be an exact FiniteActionDecision")
|
|
293
|
+
FiniteActionDecision.__post_init__(decision)
|
|
294
|
+
if (
|
|
295
|
+
decision.authority_sha256 != authority.authority_sha256
|
|
296
|
+
or decision.support_sha256 != authority.support.support_sha256
|
|
297
|
+
):
|
|
298
|
+
raise ValueError("finite action decision is bound to a different authority")
|
|
299
|
+
if decision.selected_ordinal >= authority.support.cardinality:
|
|
300
|
+
raise ValueError("finite action decision ordinal is outside the support")
|
|
301
|
+
row = authority.support.options[decision.selected_ordinal]
|
|
302
|
+
expected = (
|
|
303
|
+
row.option.option_id,
|
|
304
|
+
row.option.identity_sha256,
|
|
305
|
+
row.option.child_configuration_sha256,
|
|
306
|
+
row.phenotype_identity_sha256,
|
|
307
|
+
)
|
|
308
|
+
observed = (
|
|
309
|
+
decision.option_id,
|
|
310
|
+
decision.option_identity_sha256,
|
|
311
|
+
decision.child_configuration_sha256,
|
|
312
|
+
decision.phenotype_identity_sha256,
|
|
313
|
+
)
|
|
314
|
+
if observed != expected:
|
|
315
|
+
raise ValueError("finite action decision changed the selected support row")
|
|
316
|
+
if (
|
|
317
|
+
decision.selector_kind is FiniteActionSelectorKind.ENGINE
|
|
318
|
+
and decision.propensity_denominator != authority.support.cardinality
|
|
319
|
+
):
|
|
320
|
+
raise ValueError("engine propensity denominator differs from K")
|
|
321
|
+
|
|
322
|
+
|
|
323
|
+
@runtime_checkable
|
|
324
|
+
class EngineFiniteActionPolicy(Protocol):
|
|
325
|
+
policy_id: str
|
|
326
|
+
policy_version: int
|
|
327
|
+
definition_sha256: str
|
|
328
|
+
schedule_state_sha256: str
|
|
329
|
+
|
|
330
|
+
def freeze_rank(
|
|
331
|
+
self,
|
|
332
|
+
authority: FiniteActionSetAuthority,
|
|
333
|
+
*,
|
|
334
|
+
task_sha256: str,
|
|
335
|
+
pre_outcome_phase_commit_sha256: str,
|
|
336
|
+
) -> ProspectiveUniformRankToken: ...
|
|
337
|
+
|
|
338
|
+
def choose(self, request: EngineFiniteActionRequest) -> FiniteActionDecision: ...
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
__all__ = [
|
|
342
|
+
"EngineFiniteActionPolicy",
|
|
343
|
+
"EngineFiniteActionRequest",
|
|
344
|
+
"FiniteActionDecision",
|
|
345
|
+
"FiniteActionSelectorKind",
|
|
346
|
+
"ProspectiveUniformRankToken",
|
|
347
|
+
"validate_finite_action_decision",
|
|
348
|
+
]
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
"""Inverted port for compiling a small local finite-action support.
|
|
2
|
+
|
|
3
|
+
Benchmark code selects opaque option IDs from an already frozen parent-bound
|
|
4
|
+
catalog. Trusted application code resolves the IDs, derives patches and
|
|
5
|
+
phenotypes, and seals the resulting authority. Neither side receives current
|
|
6
|
+
candidate outcomes through this interface.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import hashlib
|
|
12
|
+
import json
|
|
13
|
+
import re
|
|
14
|
+
from dataclasses import dataclass, field
|
|
15
|
+
from typing import Protocol, runtime_checkable
|
|
16
|
+
|
|
17
|
+
from agent_evolve.domain.finite_action_set import (
|
|
18
|
+
MAX_MATCHED_FINITE_ACTIONS,
|
|
19
|
+
MIN_MATCHED_FINITE_ACTIONS,
|
|
20
|
+
)
|
|
21
|
+
from agent_evolve.domain.finite_variation import (
|
|
22
|
+
FiniteVariationContract,
|
|
23
|
+
validate_finite_variation_contract,
|
|
24
|
+
)
|
|
25
|
+
from agent_evolve.domain.ids import CandidateId
|
|
26
|
+
from agent_evolve.domain.insight import InsightRef
|
|
27
|
+
from agent_evolve.domain.patch import require_sha256
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
_TOKEN = re.compile(r"^[a-z][a-z0-9_.-]{0,95}$")
|
|
31
|
+
_REQUEST_DOMAIN = b"agent-evolve:finite-action-set-compilation-request:v1\x00"
|
|
32
|
+
_DRAFT_DOMAIN = b"agent-evolve:finite-action-set-compilation-draft:v1\x00"
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _canonical_json(value: object) -> bytes:
|
|
36
|
+
return json.dumps(
|
|
37
|
+
value,
|
|
38
|
+
ensure_ascii=True,
|
|
39
|
+
allow_nan=False,
|
|
40
|
+
separators=(",", ":"),
|
|
41
|
+
sort_keys=True,
|
|
42
|
+
).encode("ascii")
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def _hash(domain: bytes, value: object) -> str:
|
|
46
|
+
return hashlib.sha256(domain + _canonical_json(value)).hexdigest()
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _policy_identity(
|
|
50
|
+
policy_id: str,
|
|
51
|
+
policy_version: int,
|
|
52
|
+
definition_sha256: str,
|
|
53
|
+
*,
|
|
54
|
+
name: str,
|
|
55
|
+
) -> None:
|
|
56
|
+
if type(policy_id) is not str or _TOKEN.fullmatch(policy_id) is None:
|
|
57
|
+
raise ValueError(f"{name} policy_id must use the token grammar")
|
|
58
|
+
if type(policy_version) is not int or policy_version <= 0:
|
|
59
|
+
raise ValueError(f"{name} policy_version must be positive")
|
|
60
|
+
require_sha256(definition_sha256, f"{name} definition_sha256")
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
@dataclass(frozen=True, slots=True)
|
|
64
|
+
class FiniteActionSetCompilationRequest:
|
|
65
|
+
"""Outcome-free request to choose K IDs around one exact anchor."""
|
|
66
|
+
|
|
67
|
+
parent_candidate_id: CandidateId
|
|
68
|
+
finite_contract: FiniteVariationContract
|
|
69
|
+
anchor_option_id: str
|
|
70
|
+
anchor_option_identity_sha256: str
|
|
71
|
+
exact_anchor_requirement_sha256: str
|
|
72
|
+
card_reference: InsightRef
|
|
73
|
+
card_content_sha256: str
|
|
74
|
+
context_projection_sha256: str
|
|
75
|
+
endpoint_definition_sha256: str
|
|
76
|
+
required_cardinality: int
|
|
77
|
+
current_outcome_access: bool = False
|
|
78
|
+
request_sha256: str = field(init=False)
|
|
79
|
+
|
|
80
|
+
def __post_init__(self) -> None:
|
|
81
|
+
if type(self.parent_candidate_id) is not CandidateId:
|
|
82
|
+
raise TypeError("parent_candidate_id must be an exact CandidateId")
|
|
83
|
+
CandidateId.__post_init__(self.parent_candidate_id)
|
|
84
|
+
validate_finite_variation_contract(self.finite_contract)
|
|
85
|
+
if type(self.anchor_option_id) is not str or not self.anchor_option_id:
|
|
86
|
+
raise ValueError("anchor_option_id must be non-empty")
|
|
87
|
+
anchor = self.finite_contract.resolve(self.anchor_option_id)
|
|
88
|
+
require_sha256(
|
|
89
|
+
self.anchor_option_identity_sha256,
|
|
90
|
+
"anchor_option_identity_sha256",
|
|
91
|
+
)
|
|
92
|
+
if anchor.identity_sha256 != self.anchor_option_identity_sha256:
|
|
93
|
+
raise ValueError("anchor option identity differs from the frozen contract")
|
|
94
|
+
require_sha256(
|
|
95
|
+
self.exact_anchor_requirement_sha256,
|
|
96
|
+
"exact_anchor_requirement_sha256",
|
|
97
|
+
)
|
|
98
|
+
if type(self.card_reference) is not InsightRef:
|
|
99
|
+
raise TypeError("card_reference must be an exact InsightRef")
|
|
100
|
+
InsightRef.__post_init__(self.card_reference)
|
|
101
|
+
for name in (
|
|
102
|
+
"card_content_sha256",
|
|
103
|
+
"context_projection_sha256",
|
|
104
|
+
"endpoint_definition_sha256",
|
|
105
|
+
):
|
|
106
|
+
require_sha256(getattr(self, name), name)
|
|
107
|
+
if type(self.required_cardinality) is not int or not (
|
|
108
|
+
MIN_MATCHED_FINITE_ACTIONS
|
|
109
|
+
<= self.required_cardinality
|
|
110
|
+
<= MAX_MATCHED_FINITE_ACTIONS
|
|
111
|
+
):
|
|
112
|
+
raise ValueError(
|
|
113
|
+
"required_cardinality must lie in "
|
|
114
|
+
f"[{MIN_MATCHED_FINITE_ACTIONS},{MAX_MATCHED_FINITE_ACTIONS}]"
|
|
115
|
+
)
|
|
116
|
+
if self.required_cardinality > len(self.finite_contract.options):
|
|
117
|
+
raise ValueError("source contract is smaller than the requested support")
|
|
118
|
+
if type(self.current_outcome_access) is not bool:
|
|
119
|
+
raise TypeError("current_outcome_access must be bool")
|
|
120
|
+
if self.current_outcome_access:
|
|
121
|
+
raise ValueError("finite action support compilation must be outcome-blind")
|
|
122
|
+
object.__setattr__(
|
|
123
|
+
self,
|
|
124
|
+
"request_sha256",
|
|
125
|
+
_hash(_REQUEST_DOMAIN, self.to_record()),
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
def to_record(self) -> dict[str, object]:
|
|
129
|
+
return {
|
|
130
|
+
"schema_version": 1,
|
|
131
|
+
"parent_candidate_id": self.parent_candidate_id.value,
|
|
132
|
+
"parent_configuration_sha256": (
|
|
133
|
+
self.finite_contract.parent_configuration_sha256
|
|
134
|
+
),
|
|
135
|
+
"finite_contract_sha256": self.finite_contract.identity_sha256,
|
|
136
|
+
"anchor_option_id": self.anchor_option_id,
|
|
137
|
+
"anchor_option_identity_sha256": self.anchor_option_identity_sha256,
|
|
138
|
+
"exact_anchor_requirement_sha256": (
|
|
139
|
+
self.exact_anchor_requirement_sha256
|
|
140
|
+
),
|
|
141
|
+
"card_reference": {
|
|
142
|
+
"insight_id": self.card_reference.insight_id.value,
|
|
143
|
+
"version": self.card_reference.version,
|
|
144
|
+
},
|
|
145
|
+
"card_content_sha256": self.card_content_sha256,
|
|
146
|
+
"context_projection_sha256": self.context_projection_sha256,
|
|
147
|
+
"endpoint_definition_sha256": self.endpoint_definition_sha256,
|
|
148
|
+
"required_cardinality": self.required_cardinality,
|
|
149
|
+
"current_outcome_access": self.current_outcome_access,
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
@dataclass(frozen=True, slots=True)
|
|
154
|
+
class FiniteActionSetDraft:
|
|
155
|
+
"""Untrusted compiler output: IDs and presentation policy, never children."""
|
|
156
|
+
|
|
157
|
+
request_sha256: str
|
|
158
|
+
ordered_option_ids: tuple[str, ...]
|
|
159
|
+
anchor_option_id: str
|
|
160
|
+
presentation_policy_id: str
|
|
161
|
+
presentation_policy_version: int
|
|
162
|
+
presentation_definition_sha256: str
|
|
163
|
+
prompt_shape_sha256: str
|
|
164
|
+
draft_sha256: str = field(init=False)
|
|
165
|
+
|
|
166
|
+
def __post_init__(self) -> None:
|
|
167
|
+
require_sha256(self.request_sha256, "request_sha256")
|
|
168
|
+
if type(self.ordered_option_ids) is not tuple or not self.ordered_option_ids:
|
|
169
|
+
raise ValueError("ordered_option_ids must be a non-empty exact tuple")
|
|
170
|
+
if any(type(value) is not str or not value for value in self.ordered_option_ids):
|
|
171
|
+
raise TypeError("ordered_option_ids must contain non-empty strings")
|
|
172
|
+
if len(set(self.ordered_option_ids)) != len(self.ordered_option_ids):
|
|
173
|
+
raise ValueError("ordered_option_ids must be unique")
|
|
174
|
+
if type(self.anchor_option_id) is not str or self.anchor_option_id not in set(
|
|
175
|
+
self.ordered_option_ids
|
|
176
|
+
):
|
|
177
|
+
raise ValueError("anchor_option_id must occur in ordered_option_ids")
|
|
178
|
+
_policy_identity(
|
|
179
|
+
self.presentation_policy_id,
|
|
180
|
+
self.presentation_policy_version,
|
|
181
|
+
self.presentation_definition_sha256,
|
|
182
|
+
name="presentation",
|
|
183
|
+
)
|
|
184
|
+
require_sha256(self.prompt_shape_sha256, "prompt_shape_sha256")
|
|
185
|
+
object.__setattr__(
|
|
186
|
+
self,
|
|
187
|
+
"draft_sha256",
|
|
188
|
+
_hash(_DRAFT_DOMAIN, self.to_record()),
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
def to_record(self) -> dict[str, object]:
|
|
192
|
+
return {
|
|
193
|
+
"schema_version": 1,
|
|
194
|
+
"request_sha256": self.request_sha256,
|
|
195
|
+
"ordered_option_ids": list(self.ordered_option_ids),
|
|
196
|
+
"anchor_option_id": self.anchor_option_id,
|
|
197
|
+
"presentation_policy_id": self.presentation_policy_id,
|
|
198
|
+
"presentation_policy_version": self.presentation_policy_version,
|
|
199
|
+
"presentation_definition_sha256": self.presentation_definition_sha256,
|
|
200
|
+
"prompt_shape_sha256": self.prompt_shape_sha256,
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
@runtime_checkable
|
|
205
|
+
class FiniteActionSetCompiler(Protocol):
|
|
206
|
+
policy_id: str
|
|
207
|
+
policy_version: int
|
|
208
|
+
definition_sha256: str
|
|
209
|
+
|
|
210
|
+
def compile(
|
|
211
|
+
self,
|
|
212
|
+
request: FiniteActionSetCompilationRequest,
|
|
213
|
+
) -> FiniteActionSetDraft: ...
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
def validate_finite_action_set_compiler_identity(
|
|
217
|
+
compiler: FiniteActionSetCompiler,
|
|
218
|
+
) -> tuple[str, int, str]:
|
|
219
|
+
if not isinstance(compiler, FiniteActionSetCompiler):
|
|
220
|
+
raise TypeError("compiler must implement FiniteActionSetCompiler")
|
|
221
|
+
identity = (
|
|
222
|
+
compiler.policy_id,
|
|
223
|
+
compiler.policy_version,
|
|
224
|
+
compiler.definition_sha256,
|
|
225
|
+
)
|
|
226
|
+
_policy_identity(*identity, name="support compiler")
|
|
227
|
+
return identity
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
def validate_finite_action_set_draft(
|
|
231
|
+
request: FiniteActionSetCompilationRequest,
|
|
232
|
+
draft: FiniteActionSetDraft,
|
|
233
|
+
) -> None:
|
|
234
|
+
if type(request) is not FiniteActionSetCompilationRequest:
|
|
235
|
+
raise TypeError("request must be an exact FiniteActionSetCompilationRequest")
|
|
236
|
+
FiniteActionSetCompilationRequest.__post_init__(request)
|
|
237
|
+
if type(draft) is not FiniteActionSetDraft:
|
|
238
|
+
raise TypeError("draft must be an exact FiniteActionSetDraft")
|
|
239
|
+
FiniteActionSetDraft.__post_init__(draft)
|
|
240
|
+
if draft.request_sha256 != request.request_sha256:
|
|
241
|
+
raise ValueError("finite action draft is bound to a different request")
|
|
242
|
+
if len(draft.ordered_option_ids) != request.required_cardinality:
|
|
243
|
+
raise ValueError("finite action draft has the wrong cardinality")
|
|
244
|
+
if draft.anchor_option_id != request.anchor_option_id:
|
|
245
|
+
raise ValueError("finite action draft changed the exact anchor")
|
|
246
|
+
for option_id in draft.ordered_option_ids:
|
|
247
|
+
request.finite_contract.resolve(option_id)
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
__all__ = [
|
|
251
|
+
"FiniteActionSetCompilationRequest",
|
|
252
|
+
"FiniteActionSetCompiler",
|
|
253
|
+
"FiniteActionSetDraft",
|
|
254
|
+
"validate_finite_action_set_compiler_identity",
|
|
255
|
+
"validate_finite_action_set_draft",
|
|
256
|
+
]
|