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,347 @@
|
|
|
1
|
+
"""Audited greedy allocation over authenticated forecast frames."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import math
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
|
|
8
|
+
from agent_evolve.application.action_allocation import (
|
|
9
|
+
GREEDY_RISK_DIVERSITY_ALLOCATOR_DEFINITION_SHA256,
|
|
10
|
+
GREEDY_RISK_DIVERSITY_ALLOCATOR_ID,
|
|
11
|
+
GREEDY_RISK_DIVERSITY_ALLOCATOR_VERSION,
|
|
12
|
+
GreedyRiskAdjustedDiversityAllocator,
|
|
13
|
+
)
|
|
14
|
+
from agent_evolve.ports.action_allocation import (
|
|
15
|
+
AllocatedActionMember,
|
|
16
|
+
ForecastPortfolioUtilityInput,
|
|
17
|
+
ForecastQuantile,
|
|
18
|
+
PortfolioAllocationScore,
|
|
19
|
+
)
|
|
20
|
+
from agent_evolve.ports.action_allocation_frame import (
|
|
21
|
+
ActionAllocationSurfaceAudit,
|
|
22
|
+
AllocationCandidateScoreDiagnostic,
|
|
23
|
+
AllocationCandidateScoreDiagnosticInput,
|
|
24
|
+
AllocationScoreDiagnosticBinding,
|
|
25
|
+
AllocationSurfaceGatePolicyBinding,
|
|
26
|
+
AllocationSurfaceStepAudit,
|
|
27
|
+
AuditedFrameActionAllocationResult,
|
|
28
|
+
FrameActionAllocationRequest,
|
|
29
|
+
FrameActionPortfolioDecision,
|
|
30
|
+
allocation_score_multiset_sha256,
|
|
31
|
+
allocation_surface_failure_codes,
|
|
32
|
+
validate_frame_action_portfolio_decision,
|
|
33
|
+
)
|
|
34
|
+
from agent_evolve.ports.action_forecast import ResolvedActionForecast
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@dataclass(frozen=True, slots=True)
|
|
38
|
+
class AllocationSurfaceGateRejected(RuntimeError):
|
|
39
|
+
"""A complete deterministic attempt whose pre-evaluator gate failed."""
|
|
40
|
+
|
|
41
|
+
result: AuditedFrameActionAllocationResult
|
|
42
|
+
|
|
43
|
+
def __post_init__(self) -> None:
|
|
44
|
+
if type(self.result) is not AuditedFrameActionAllocationResult:
|
|
45
|
+
raise TypeError("result must be an exact audited frame result")
|
|
46
|
+
self.result.__post_init__()
|
|
47
|
+
if self.result.audit.passes:
|
|
48
|
+
raise ValueError("a passing allocation result cannot be rejected")
|
|
49
|
+
RuntimeError.__init__(
|
|
50
|
+
self,
|
|
51
|
+
"allocation surface failed its bound pre-evaluator gate",
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
@dataclass(frozen=True, slots=True)
|
|
56
|
+
class AuditedGreedyForecastFrameAllocator:
|
|
57
|
+
"""Allocator-v2-equivalent scoring over a non-forged forecast frame.
|
|
58
|
+
|
|
59
|
+
The complete-batch allocator exact-type-checks its request, so forwarding a
|
|
60
|
+
partition block would require fabricating global coverage. This service
|
|
61
|
+
instead consumes the authenticated frame port directly while retaining the
|
|
62
|
+
same v2 score, attainable-diversity denominator, canonical tie break, and
|
|
63
|
+
configuration identity.
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
risk_aversion: float
|
|
67
|
+
diversity_weight: float
|
|
68
|
+
score_diagnostic: AllocationScoreDiagnosticBinding
|
|
69
|
+
gate_policy: AllocationSurfaceGatePolicyBinding
|
|
70
|
+
|
|
71
|
+
def __post_init__(self) -> None:
|
|
72
|
+
for name in ("risk_aversion", "diversity_weight"):
|
|
73
|
+
value = getattr(self, name)
|
|
74
|
+
if type(value) is not float or not math.isfinite(value):
|
|
75
|
+
raise TypeError(f"{name} must be a finite canonical float")
|
|
76
|
+
if value < 0.0:
|
|
77
|
+
raise ValueError(f"{name} must be non-negative")
|
|
78
|
+
if type(self.score_diagnostic) is not AllocationScoreDiagnosticBinding:
|
|
79
|
+
raise TypeError("score_diagnostic must be an exact binding")
|
|
80
|
+
self.score_diagnostic.__post_init__()
|
|
81
|
+
if type(self.gate_policy) is not AllocationSurfaceGatePolicyBinding:
|
|
82
|
+
raise TypeError("gate_policy must be an exact binding")
|
|
83
|
+
self.gate_policy.__post_init__()
|
|
84
|
+
|
|
85
|
+
@property
|
|
86
|
+
def configuration_sha256(self) -> str:
|
|
87
|
+
self.__post_init__()
|
|
88
|
+
return GreedyRiskAdjustedDiversityAllocator(
|
|
89
|
+
risk_aversion=self.risk_aversion,
|
|
90
|
+
diversity_weight=self.diversity_weight,
|
|
91
|
+
).configuration_sha256
|
|
92
|
+
|
|
93
|
+
@staticmethod
|
|
94
|
+
def _utility(
|
|
95
|
+
request: FrameActionAllocationRequest,
|
|
96
|
+
members: tuple[ResolvedActionForecast, ...],
|
|
97
|
+
quantile: ForecastQuantile,
|
|
98
|
+
) -> float:
|
|
99
|
+
canonical_members = tuple(
|
|
100
|
+
sorted(
|
|
101
|
+
members,
|
|
102
|
+
key=lambda value: (value.option_identity_sha256, value.option_id),
|
|
103
|
+
)
|
|
104
|
+
)
|
|
105
|
+
value = request.utility.utility(
|
|
106
|
+
ForecastPortfolioUtilityInput(
|
|
107
|
+
optimization_semantics=request.frame.request.optimization_semantics,
|
|
108
|
+
parent_metric_values=request.frame.request.parent_metric_values,
|
|
109
|
+
metric_scales=request.frame.request.metric_scales,
|
|
110
|
+
members=canonical_members,
|
|
111
|
+
quantile=quantile,
|
|
112
|
+
)
|
|
113
|
+
)
|
|
114
|
+
if type(value) is not float or not math.isfinite(value):
|
|
115
|
+
raise TypeError("bound portfolio utility must return a finite float")
|
|
116
|
+
return value
|
|
117
|
+
|
|
118
|
+
def _score(
|
|
119
|
+
self,
|
|
120
|
+
request: FrameActionAllocationRequest,
|
|
121
|
+
members: tuple[ResolvedActionForecast, ...],
|
|
122
|
+
*,
|
|
123
|
+
attainable_diversity: int,
|
|
124
|
+
) -> PortfolioAllocationScore:
|
|
125
|
+
p10 = self._utility(request, members, ForecastQuantile.P10)
|
|
126
|
+
p50 = self._utility(request, members, ForecastQuantile.P50)
|
|
127
|
+
p90 = self._utility(request, members, ForecastQuantile.P90)
|
|
128
|
+
downside = min(p10, p90)
|
|
129
|
+
risk_penalty = self.risk_aversion * max(0.0, p50 - downside)
|
|
130
|
+
diversity_reward = self.diversity_weight * (
|
|
131
|
+
len({member.family for member in members}) / attainable_diversity
|
|
132
|
+
)
|
|
133
|
+
total = p50 - risk_penalty + diversity_reward
|
|
134
|
+
if not all(
|
|
135
|
+
math.isfinite(value)
|
|
136
|
+
for value in (risk_penalty, diversity_reward, total)
|
|
137
|
+
):
|
|
138
|
+
raise ValueError("allocation score arithmetic became non-finite")
|
|
139
|
+
return PortfolioAllocationScore(
|
|
140
|
+
p10_utility=p10,
|
|
141
|
+
p50_utility=p50,
|
|
142
|
+
p90_utility=p90,
|
|
143
|
+
downside_utility=downside,
|
|
144
|
+
risk_penalty=risk_penalty,
|
|
145
|
+
diversity_reward=diversity_reward,
|
|
146
|
+
total_utility=total,
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
def assess(
|
|
150
|
+
self,
|
|
151
|
+
request: FrameActionAllocationRequest,
|
|
152
|
+
) -> AuditedFrameActionAllocationResult:
|
|
153
|
+
"""Return the complete attempt, including a failing gate receipt."""
|
|
154
|
+
|
|
155
|
+
if type(request) is not FrameActionAllocationRequest:
|
|
156
|
+
raise TypeError("request must be an exact frame allocation request")
|
|
157
|
+
request.__post_init__()
|
|
158
|
+
self.__post_init__()
|
|
159
|
+
# These authenticated identities recursively validate and hash the
|
|
160
|
+
# complete frame/request graph. Compute each exactly once after the
|
|
161
|
+
# explicit validation boundary; candidate scoring must remain O(kn),
|
|
162
|
+
# not repeat graph authentication for every greedy extension.
|
|
163
|
+
allocation_request_sha256 = request.request_sha256
|
|
164
|
+
frame_receipt_sha256 = request.frame.receipt_sha256
|
|
165
|
+
source_forecast_receipt_sha256 = (
|
|
166
|
+
request.frame.source_forecast_receipt_sha256
|
|
167
|
+
)
|
|
168
|
+
eligible_options_sha256 = request.eligible_options_sha256
|
|
169
|
+
allocator_configuration_sha256 = self.configuration_sha256
|
|
170
|
+
by_id = {value.option_id: value for value in request.frame.forecasts}
|
|
171
|
+
global_index_by_id = {
|
|
172
|
+
forecast.option_id: global_index
|
|
173
|
+
for global_index, forecast in zip(
|
|
174
|
+
request.frame.global_row_indices,
|
|
175
|
+
request.frame.forecasts,
|
|
176
|
+
strict=True,
|
|
177
|
+
)
|
|
178
|
+
}
|
|
179
|
+
attainable_diversity = min(
|
|
180
|
+
request.portfolio_size,
|
|
181
|
+
len({by_id[value].family for value in request.eligible_option_ids}),
|
|
182
|
+
)
|
|
183
|
+
remaining = sorted(
|
|
184
|
+
(by_id[value] for value in request.eligible_option_ids),
|
|
185
|
+
key=lambda value: (value.option_identity_sha256, value.option_id),
|
|
186
|
+
)
|
|
187
|
+
selected: list[ResolvedActionForecast] = []
|
|
188
|
+
members: list[AllocatedActionMember] = []
|
|
189
|
+
step_audits: list[AllocationSurfaceStepAudit] = []
|
|
190
|
+
previous_total = 0.0
|
|
191
|
+
|
|
192
|
+
for step in range(1, request.portfolio_size + 1):
|
|
193
|
+
candidates: list[
|
|
194
|
+
tuple[
|
|
195
|
+
ResolvedActionForecast,
|
|
196
|
+
PortfolioAllocationScore,
|
|
197
|
+
float,
|
|
198
|
+
str,
|
|
199
|
+
AllocationCandidateScoreDiagnostic,
|
|
200
|
+
]
|
|
201
|
+
] = []
|
|
202
|
+
for candidate in remaining:
|
|
203
|
+
portfolio = tuple((*selected, candidate))
|
|
204
|
+
score = self._score(
|
|
205
|
+
request,
|
|
206
|
+
portfolio,
|
|
207
|
+
attainable_diversity=attainable_diversity,
|
|
208
|
+
)
|
|
209
|
+
marginal = score.total_utility - previous_total
|
|
210
|
+
if not math.isfinite(marginal):
|
|
211
|
+
raise ValueError("marginal allocation score became non-finite")
|
|
212
|
+
label = f"row_{global_index_by_id[candidate.option_id]:08d}"
|
|
213
|
+
diagnostic_input = AllocationCandidateScoreDiagnosticInput(
|
|
214
|
+
allocation_request_sha256=allocation_request_sha256,
|
|
215
|
+
step=step,
|
|
216
|
+
candidate_label=label,
|
|
217
|
+
members=tuple(
|
|
218
|
+
sorted(
|
|
219
|
+
portfolio,
|
|
220
|
+
key=lambda value: (
|
|
221
|
+
value.option_identity_sha256,
|
|
222
|
+
value.option_id,
|
|
223
|
+
),
|
|
224
|
+
)
|
|
225
|
+
),
|
|
226
|
+
score=score,
|
|
227
|
+
marginal_total_utility=marginal,
|
|
228
|
+
)
|
|
229
|
+
diagnostic = self.score_diagnostic.diagnostic(diagnostic_input)
|
|
230
|
+
if type(diagnostic) is not AllocationCandidateScoreDiagnostic:
|
|
231
|
+
raise TypeError(
|
|
232
|
+
"score diagnostic returned another result type"
|
|
233
|
+
)
|
|
234
|
+
diagnostic.__post_init__()
|
|
235
|
+
candidates.append((candidate, score, marginal, label, diagnostic))
|
|
236
|
+
|
|
237
|
+
# ``remaining`` is already in allocator-v2 canonical tie order.
|
|
238
|
+
top_score = max(value[2] for value in candidates)
|
|
239
|
+
top = tuple(value for value in candidates if value[2] == top_score)
|
|
240
|
+
winner = top[0]
|
|
241
|
+
ranked_scores = sorted(
|
|
242
|
+
(value[2] for value in candidates),
|
|
243
|
+
reverse=True,
|
|
244
|
+
)
|
|
245
|
+
runner_gap = (
|
|
246
|
+
0.0
|
|
247
|
+
if len(ranked_scores) == 1
|
|
248
|
+
else ranked_scores[0] - ranked_scores[1]
|
|
249
|
+
)
|
|
250
|
+
boundary_count = sum(
|
|
251
|
+
value[4].boundary_or_extreme for value in candidates
|
|
252
|
+
)
|
|
253
|
+
boundary_share = boundary_count / len(candidates)
|
|
254
|
+
score_values = tuple(value[2] for value in candidates)
|
|
255
|
+
failure_codes = allocation_surface_failure_codes(
|
|
256
|
+
policy=self.gate_policy,
|
|
257
|
+
candidate_count=len(candidates),
|
|
258
|
+
distinct_finite_score_count=len(set(score_values)),
|
|
259
|
+
top_tie_count=len(top),
|
|
260
|
+
winner_runner_gap=runner_gap,
|
|
261
|
+
boundary_or_extreme_share=boundary_share,
|
|
262
|
+
)
|
|
263
|
+
step_audits.append(
|
|
264
|
+
AllocationSurfaceStepAudit(
|
|
265
|
+
step=step,
|
|
266
|
+
candidate_count=len(candidates),
|
|
267
|
+
distinct_finite_score_count=len(set(score_values)),
|
|
268
|
+
top_tie_count=len(top),
|
|
269
|
+
winner_runner_gap=runner_gap,
|
|
270
|
+
boundary_or_extreme_count=boundary_count,
|
|
271
|
+
boundary_or_extreme_share=boundary_share,
|
|
272
|
+
score_multiset_sha256=allocation_score_multiset_sha256(
|
|
273
|
+
score_values
|
|
274
|
+
),
|
|
275
|
+
winner_candidate_label=winner[3],
|
|
276
|
+
tie_break_used=len(top) > 1,
|
|
277
|
+
failure_codes=failure_codes,
|
|
278
|
+
passes=not failure_codes,
|
|
279
|
+
)
|
|
280
|
+
)
|
|
281
|
+
|
|
282
|
+
best_forecast, best_score, best_marginal, _label, _diagnostic = winner
|
|
283
|
+
selected.append(best_forecast)
|
|
284
|
+
remaining.remove(best_forecast)
|
|
285
|
+
members.append(
|
|
286
|
+
AllocatedActionMember(
|
|
287
|
+
rank=step,
|
|
288
|
+
option_id=best_forecast.option_id,
|
|
289
|
+
option_identity_sha256=best_forecast.option_identity_sha256,
|
|
290
|
+
child_configuration_sha256=(
|
|
291
|
+
best_forecast.child_configuration_sha256
|
|
292
|
+
),
|
|
293
|
+
family=best_forecast.family,
|
|
294
|
+
greedy_step_score=best_score,
|
|
295
|
+
marginal_total_utility=best_marginal,
|
|
296
|
+
)
|
|
297
|
+
)
|
|
298
|
+
previous_total = best_score.total_utility
|
|
299
|
+
|
|
300
|
+
candidate_evaluations = sum(value.candidate_count for value in step_audits)
|
|
301
|
+
decision = FrameActionPortfolioDecision(
|
|
302
|
+
allocation_request_sha256=allocation_request_sha256,
|
|
303
|
+
frame_receipt_sha256=frame_receipt_sha256,
|
|
304
|
+
source_forecast_receipt_sha256=source_forecast_receipt_sha256,
|
|
305
|
+
eligible_options_sha256=eligible_options_sha256,
|
|
306
|
+
members=tuple(members),
|
|
307
|
+
final_score=members[-1].greedy_step_score,
|
|
308
|
+
candidate_evaluations=candidate_evaluations,
|
|
309
|
+
utility_policy_id=request.utility.policy_id,
|
|
310
|
+
utility_policy_version=request.utility.policy_version,
|
|
311
|
+
utility_definition_sha256=request.utility.definition_sha256,
|
|
312
|
+
allocator_policy_id=GREEDY_RISK_DIVERSITY_ALLOCATOR_ID,
|
|
313
|
+
allocator_policy_version=GREEDY_RISK_DIVERSITY_ALLOCATOR_VERSION,
|
|
314
|
+
allocator_definition_sha256=(
|
|
315
|
+
GREEDY_RISK_DIVERSITY_ALLOCATOR_DEFINITION_SHA256
|
|
316
|
+
),
|
|
317
|
+
allocator_configuration_sha256=allocator_configuration_sha256,
|
|
318
|
+
)
|
|
319
|
+
validate_frame_action_portfolio_decision(request, decision)
|
|
320
|
+
audit = ActionAllocationSurfaceAudit(
|
|
321
|
+
allocation_request_sha256=allocation_request_sha256,
|
|
322
|
+
decision_receipt_sha256=decision.receipt_sha256,
|
|
323
|
+
frame_receipt_sha256=frame_receipt_sha256,
|
|
324
|
+
score_diagnostic=self.score_diagnostic,
|
|
325
|
+
gate_policy=self.gate_policy,
|
|
326
|
+
steps=tuple(step_audits),
|
|
327
|
+
candidate_score_count=candidate_evaluations,
|
|
328
|
+
passes=all(value.passes for value in step_audits),
|
|
329
|
+
)
|
|
330
|
+
return AuditedFrameActionAllocationResult(decision=decision, audit=audit)
|
|
331
|
+
|
|
332
|
+
def allocate(
|
|
333
|
+
self,
|
|
334
|
+
request: FrameActionAllocationRequest,
|
|
335
|
+
) -> AuditedFrameActionAllocationResult:
|
|
336
|
+
"""Authorize a decision only when every bound surface gate passes."""
|
|
337
|
+
|
|
338
|
+
result = self.assess(request)
|
|
339
|
+
if not result.audit.passes:
|
|
340
|
+
raise AllocationSurfaceGateRejected(result)
|
|
341
|
+
return result
|
|
342
|
+
|
|
343
|
+
|
|
344
|
+
__all__ = [
|
|
345
|
+
"AllocationSurfaceGateRejected",
|
|
346
|
+
"AuditedGreedyForecastFrameAllocator",
|
|
347
|
+
]
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
"""Durable fail-closed commits for audited frame allocation treatments."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from agent_evolve.application.two_stage_action_evolution import (
|
|
6
|
+
TwoStageActionPhase,
|
|
7
|
+
TwoStageActionPhaseCommit,
|
|
8
|
+
TwoStageActionPhaseReceipt,
|
|
9
|
+
)
|
|
10
|
+
from agent_evolve.domain.patch import require_sha256
|
|
11
|
+
from agent_evolve.domain.typed_json import (
|
|
12
|
+
FrozenJsonObject,
|
|
13
|
+
freeze_json,
|
|
14
|
+
thaw_json,
|
|
15
|
+
typed_json_sha256,
|
|
16
|
+
)
|
|
17
|
+
from agent_evolve.ports.action_allocation_frame_commit import (
|
|
18
|
+
FrameActionAllocationCommitInput,
|
|
19
|
+
FrameActionAllocationTreatmentExecution,
|
|
20
|
+
)
|
|
21
|
+
from agent_evolve.ports.treatment_assignment import (
|
|
22
|
+
ProspectiveTreatmentAssignmentReceipt,
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
_COMMIT_KIND = "audited_frame_action_allocation"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class FrameActionAllocationCommitRejected(RuntimeError):
|
|
30
|
+
"""No evaluator authority may open from these allocation executions."""
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _validated_execution_tuple(
|
|
34
|
+
executions: tuple[FrameActionAllocationTreatmentExecution, ...],
|
|
35
|
+
*,
|
|
36
|
+
require_all_pass: bool,
|
|
37
|
+
) -> ProspectiveTreatmentAssignmentReceipt:
|
|
38
|
+
if type(executions) is not tuple or not executions or any(
|
|
39
|
+
type(value) is not FrameActionAllocationTreatmentExecution
|
|
40
|
+
for value in executions
|
|
41
|
+
):
|
|
42
|
+
raise ValueError("executions must be a non-empty exact execution tuple")
|
|
43
|
+
for value in executions:
|
|
44
|
+
value.__post_init__()
|
|
45
|
+
assignment = executions[0].treatment_assignment
|
|
46
|
+
if any(
|
|
47
|
+
value.treatment_assignment.receipt_sha256 != assignment.receipt_sha256
|
|
48
|
+
for value in executions
|
|
49
|
+
):
|
|
50
|
+
raise ValueError("executions name different treatment assignments")
|
|
51
|
+
observed_order = tuple(value.treatment_occurrence for value in executions)
|
|
52
|
+
if observed_order != assignment.occurrence_input_order:
|
|
53
|
+
raise ValueError(
|
|
54
|
+
"executions must use exact treatment occurrence input order"
|
|
55
|
+
)
|
|
56
|
+
if require_all_pass and any(not value.result.audit.passes for value in executions):
|
|
57
|
+
raise FrameActionAllocationCommitRejected(
|
|
58
|
+
"every allocation-surface audit must pass before evaluator authority"
|
|
59
|
+
)
|
|
60
|
+
return assignment
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _frozen_payload(value: dict[str, object]) -> FrozenJsonObject:
|
|
64
|
+
result = freeze_json(value)
|
|
65
|
+
if type(result) is not FrozenJsonObject:
|
|
66
|
+
raise AssertionError("allocation commit payload must freeze as an object")
|
|
67
|
+
return result
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def build_frame_action_allocation_phase_commit(
|
|
71
|
+
*,
|
|
72
|
+
upstream_input_sha256: str,
|
|
73
|
+
terminal_provider_ledger_commitment_sha256: str,
|
|
74
|
+
executions: tuple[FrameActionAllocationTreatmentExecution, ...],
|
|
75
|
+
) -> TwoStageActionPhaseCommit:
|
|
76
|
+
"""Build an ALLOCATE commit only from complete passing audit records.
|
|
77
|
+
|
|
78
|
+
The ledger digest is a commitment to a ledger the caller has already
|
|
79
|
+
materialized and fsynced. This pure builder cannot establish filesystem
|
|
80
|
+
durability and its payload states that limitation explicitly.
|
|
81
|
+
"""
|
|
82
|
+
|
|
83
|
+
require_sha256(upstream_input_sha256, "upstream_input_sha256")
|
|
84
|
+
require_sha256(
|
|
85
|
+
terminal_provider_ledger_commitment_sha256,
|
|
86
|
+
"terminal_provider_ledger_commitment_sha256",
|
|
87
|
+
)
|
|
88
|
+
assignment = _validated_execution_tuple(executions, require_all_pass=True)
|
|
89
|
+
commit_input = FrameActionAllocationCommitInput(
|
|
90
|
+
upstream_input_sha256=upstream_input_sha256,
|
|
91
|
+
terminal_provider_ledger_commitment_sha256=(
|
|
92
|
+
terminal_provider_ledger_commitment_sha256
|
|
93
|
+
),
|
|
94
|
+
treatment_assignment=assignment,
|
|
95
|
+
allocation_requests=tuple(value.request for value in executions),
|
|
96
|
+
)
|
|
97
|
+
payload = _frozen_payload(
|
|
98
|
+
{
|
|
99
|
+
"schema_version": 1,
|
|
100
|
+
"phase": TwoStageActionPhase.ALLOCATE.value,
|
|
101
|
+
"commit_kind": _COMMIT_KIND,
|
|
102
|
+
"allocation_input": commit_input.to_record(),
|
|
103
|
+
"terminal_provider_ledger_commitment": (
|
|
104
|
+
commit_input.terminal_provider_ledger_commitment_record
|
|
105
|
+
),
|
|
106
|
+
"treatment_assignment_receipt_sha256": assignment.receipt_sha256,
|
|
107
|
+
"treatment_occurrence_order": [
|
|
108
|
+
value.to_record() for value in assignment.occurrence_input_order
|
|
109
|
+
],
|
|
110
|
+
"treatment_executions": [value.to_record() for value in executions],
|
|
111
|
+
"all_allocation_surface_audits_pass": True,
|
|
112
|
+
"evaluator_authority_eligible": True,
|
|
113
|
+
}
|
|
114
|
+
)
|
|
115
|
+
return TwoStageActionPhaseCommit(
|
|
116
|
+
receipt=TwoStageActionPhaseReceipt(
|
|
117
|
+
phase=TwoStageActionPhase.ALLOCATE,
|
|
118
|
+
input_sha256=commit_input.input_sha256,
|
|
119
|
+
output_sha256=typed_json_sha256(payload),
|
|
120
|
+
),
|
|
121
|
+
payload=payload,
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def validate_frame_action_allocation_phase_commit(
|
|
126
|
+
executions: tuple[FrameActionAllocationTreatmentExecution, ...],
|
|
127
|
+
phase_commit: TwoStageActionPhaseCommit,
|
|
128
|
+
) -> FrameActionAllocationCommitInput:
|
|
129
|
+
"""Validate payload equality and return its exact authenticated input."""
|
|
130
|
+
|
|
131
|
+
assignment = _validated_execution_tuple(executions, require_all_pass=True)
|
|
132
|
+
if type(phase_commit) is not TwoStageActionPhaseCommit:
|
|
133
|
+
raise TypeError("phase_commit must be an exact TwoStageActionPhaseCommit")
|
|
134
|
+
phase_commit.__post_init__()
|
|
135
|
+
if phase_commit.receipt.phase is not TwoStageActionPhase.ALLOCATE:
|
|
136
|
+
raise ValueError("only an ALLOCATE phase commit can authorize evaluation")
|
|
137
|
+
payload = thaw_json(phase_commit.payload)
|
|
138
|
+
if (
|
|
139
|
+
type(payload) is not dict
|
|
140
|
+
or payload.get("phase") != TwoStageActionPhase.ALLOCATE.value
|
|
141
|
+
or payload.get("commit_kind") != _COMMIT_KIND
|
|
142
|
+
or type(payload.get("allocation_input")) is not dict
|
|
143
|
+
):
|
|
144
|
+
raise ValueError("frame-allocation phase payload is malformed")
|
|
145
|
+
raw_input = payload["allocation_input"]
|
|
146
|
+
assert type(raw_input) is dict
|
|
147
|
+
upstream_input_sha256 = raw_input.get("upstream_input_sha256")
|
|
148
|
+
raw_ledger = raw_input.get("terminal_provider_ledger_commitment")
|
|
149
|
+
if type(upstream_input_sha256) is not str or type(raw_ledger) is not dict:
|
|
150
|
+
raise ValueError("frame-allocation input commitment is malformed")
|
|
151
|
+
ledger_sha256 = raw_ledger.get("commitment_sha256")
|
|
152
|
+
if type(ledger_sha256) is not str:
|
|
153
|
+
raise ValueError("terminal-provider-ledger commitment is malformed")
|
|
154
|
+
require_sha256(upstream_input_sha256, "upstream_input_sha256")
|
|
155
|
+
require_sha256(
|
|
156
|
+
ledger_sha256,
|
|
157
|
+
"terminal_provider_ledger_commitment_sha256",
|
|
158
|
+
)
|
|
159
|
+
expected = build_frame_action_allocation_phase_commit(
|
|
160
|
+
upstream_input_sha256=upstream_input_sha256,
|
|
161
|
+
terminal_provider_ledger_commitment_sha256=ledger_sha256,
|
|
162
|
+
executions=executions,
|
|
163
|
+
)
|
|
164
|
+
if (
|
|
165
|
+
phase_commit.receipt.receipt_sha256
|
|
166
|
+
!= expected.receipt.receipt_sha256
|
|
167
|
+
or phase_commit.payload != expected.payload
|
|
168
|
+
or phase_commit.to_record() != expected.to_record()
|
|
169
|
+
):
|
|
170
|
+
raise ValueError(
|
|
171
|
+
"frame-allocation phase commit differs from exact execution payloads"
|
|
172
|
+
)
|
|
173
|
+
return FrameActionAllocationCommitInput(
|
|
174
|
+
upstream_input_sha256=upstream_input_sha256,
|
|
175
|
+
terminal_provider_ledger_commitment_sha256=ledger_sha256,
|
|
176
|
+
treatment_assignment=assignment,
|
|
177
|
+
allocation_requests=tuple(value.request for value in executions),
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
__all__ = [
|
|
182
|
+
"FrameActionAllocationCommitRejected",
|
|
183
|
+
"build_frame_action_allocation_phase_commit",
|
|
184
|
+
"validate_frame_action_allocation_phase_commit",
|
|
185
|
+
]
|