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,484 @@
|
|
|
1
|
+
"""Fail-closed proof that a model call has a real finite choice set.
|
|
2
|
+
|
|
3
|
+
Prompt text can advertise many actions while an exact treatment contract leaves
|
|
4
|
+
only one executable choice. This module audits the application-layer
|
|
5
|
+
``InvocationPlan`` instead of trusting prose or an adapter schema. A passing
|
|
6
|
+
receipt proves that one outcome-blind ``FiniteActionSetAuthority`` supplies at
|
|
7
|
+
least the configured number of distinct children and phenotypes, that the plan
|
|
8
|
+
uses that exact support contract, and that the authority's card is the plan's
|
|
9
|
+
only explicit memory assignment.
|
|
10
|
+
|
|
11
|
+
The generic generator request currently carries the finite variation contract
|
|
12
|
+
but not the provider adapter's rendered output enum. Consequently this module
|
|
13
|
+
does not claim to validate that enum and deliberately has no PydanticAI import.
|
|
14
|
+
That final adapter/trace equality check belongs at a boundary which exposes the
|
|
15
|
+
rendered schema as a typed value.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
import hashlib
|
|
21
|
+
import json
|
|
22
|
+
import re
|
|
23
|
+
from dataclasses import dataclass
|
|
24
|
+
from enum import Enum
|
|
25
|
+
|
|
26
|
+
from agent_evolve.application.agentic_evolution import (
|
|
27
|
+
InvocationPlan,
|
|
28
|
+
MutationResponseMode,
|
|
29
|
+
)
|
|
30
|
+
from agent_evolve.domain.finite_action_set import FiniteActionSetAuthority
|
|
31
|
+
from agent_evolve.domain.finite_variation import (
|
|
32
|
+
FiniteVariationContract,
|
|
33
|
+
validate_finite_variation_contract,
|
|
34
|
+
)
|
|
35
|
+
from agent_evolve.domain.ids import CandidateId
|
|
36
|
+
from agent_evolve.domain.insight import InsightRef
|
|
37
|
+
from agent_evolve.domain.patch import require_sha256
|
|
38
|
+
from agent_evolve.policies.memory.staged_causal import ResolvedInsightAssignment
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
_TOKEN = re.compile(r"^[a-z][a-z0-9_.-]{0,95}$")
|
|
42
|
+
_PLAN_BINDING_DOMAIN = b"agent-evolve:effective-choice-plan-binding:v1\x00"
|
|
43
|
+
_QUARANTINE_BINDING_DOMAIN = b"agent-evolve:effective-choice-quarantine-binding:v1\x00"
|
|
44
|
+
_RECEIPT_DOMAIN = b"agent-evolve:effective-choice-audit-receipt:v1\x00"
|
|
45
|
+
|
|
46
|
+
EFFECTIVE_CHOICE_AUDIT_POLICY_ID = "effective_finite_choice_audit"
|
|
47
|
+
EFFECTIVE_CHOICE_AUDIT_POLICY_VERSION = 1
|
|
48
|
+
EFFECTIVE_CHOICE_AUDIT_DEFINITION_SHA256 = hashlib.sha256(
|
|
49
|
+
b"agent-evolve:effective-finite-choice-audit:v1;authority-required;"
|
|
50
|
+
b"configured-minimum-cardinality;exact-plan-support-contract;"
|
|
51
|
+
b"no-exact-treatment-or-compilation;outcome-blind;single-card-binding;"
|
|
52
|
+
b"unique-option-option-identity-child-and-phenotype-identities"
|
|
53
|
+
).hexdigest()
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _canonical_json(value: object) -> bytes:
|
|
57
|
+
return json.dumps(
|
|
58
|
+
value,
|
|
59
|
+
ensure_ascii=True,
|
|
60
|
+
allow_nan=False,
|
|
61
|
+
separators=(",", ":"),
|
|
62
|
+
sort_keys=True,
|
|
63
|
+
).encode("ascii")
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def _hash(domain: bytes, record: object) -> str:
|
|
67
|
+
return hashlib.sha256(domain + _canonical_json(record)).hexdigest()
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _ref_record(reference: InsightRef) -> dict[str, object]:
|
|
71
|
+
return {
|
|
72
|
+
"insight_id": reference.insight_id.value,
|
|
73
|
+
"version": reference.version,
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
class EffectiveChoiceAuditError(ValueError):
|
|
78
|
+
"""The admitted plan does not expose the claimed effective choice set."""
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
class SelectedCardBindingMode(str, Enum):
|
|
82
|
+
"""Which explicit, replayable plan field selected the authority's card."""
|
|
83
|
+
|
|
84
|
+
RESOLVED_ASSIGNMENT = "resolved_assignment"
|
|
85
|
+
EXPLICIT_QUARANTINE = "explicit_quarantine"
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
@dataclass(frozen=True, slots=True)
|
|
89
|
+
class EffectiveChoiceAuditReceipt:
|
|
90
|
+
"""Immutable proof of one plan's effective finite-choice cardinality."""
|
|
91
|
+
|
|
92
|
+
configured_minimum_cardinality: int
|
|
93
|
+
generation: int
|
|
94
|
+
invocation_label: str
|
|
95
|
+
parent_candidate_id: CandidateId
|
|
96
|
+
parent_configuration_sha256: str
|
|
97
|
+
selected_card_reference: InsightRef
|
|
98
|
+
selected_card_binding_mode: SelectedCardBindingMode
|
|
99
|
+
selected_card_binding_sha256: str
|
|
100
|
+
authority_sha256: str
|
|
101
|
+
support_sha256: str
|
|
102
|
+
presentation_sha256: str
|
|
103
|
+
plan_contract_sha256: str
|
|
104
|
+
authority_contract_sha256: str
|
|
105
|
+
outcome_blind: bool
|
|
106
|
+
exact_treatment_fields_absent: bool
|
|
107
|
+
effective_cardinality: int
|
|
108
|
+
option_ids: tuple[str, ...]
|
|
109
|
+
option_identity_sha256s: tuple[str, ...]
|
|
110
|
+
child_configuration_sha256s: tuple[str, ...]
|
|
111
|
+
phenotype_identity_sha256s: tuple[str, ...]
|
|
112
|
+
audited_plan_sha256: str
|
|
113
|
+
policy_id: str = EFFECTIVE_CHOICE_AUDIT_POLICY_ID
|
|
114
|
+
policy_version: int = EFFECTIVE_CHOICE_AUDIT_POLICY_VERSION
|
|
115
|
+
policy_definition_sha256: str = EFFECTIVE_CHOICE_AUDIT_DEFINITION_SHA256
|
|
116
|
+
receipt_sha256: str = ""
|
|
117
|
+
|
|
118
|
+
def __post_init__(self) -> None:
|
|
119
|
+
if (
|
|
120
|
+
type(self.configured_minimum_cardinality) is not int
|
|
121
|
+
or self.configured_minimum_cardinality < 2
|
|
122
|
+
):
|
|
123
|
+
raise ValueError("configured minimum cardinality must be at least two")
|
|
124
|
+
if type(self.generation) is not int or self.generation <= 0:
|
|
125
|
+
raise ValueError("audited generation must be positive")
|
|
126
|
+
if (
|
|
127
|
+
type(self.invocation_label) is not str
|
|
128
|
+
or not self.invocation_label
|
|
129
|
+
or self.invocation_label != self.invocation_label.strip()
|
|
130
|
+
):
|
|
131
|
+
raise ValueError("audited invocation_label must be canonical")
|
|
132
|
+
if type(self.parent_candidate_id) is not CandidateId:
|
|
133
|
+
raise TypeError("audit parent_candidate_id must be exact")
|
|
134
|
+
CandidateId.__post_init__(self.parent_candidate_id)
|
|
135
|
+
if type(self.selected_card_reference) is not InsightRef:
|
|
136
|
+
raise TypeError("audit selected_card_reference must be exact")
|
|
137
|
+
InsightRef.__post_init__(self.selected_card_reference)
|
|
138
|
+
if type(self.selected_card_binding_mode) is not SelectedCardBindingMode:
|
|
139
|
+
raise TypeError("audit selected_card_binding_mode must be exact")
|
|
140
|
+
for name in (
|
|
141
|
+
"parent_configuration_sha256",
|
|
142
|
+
"selected_card_binding_sha256",
|
|
143
|
+
"authority_sha256",
|
|
144
|
+
"support_sha256",
|
|
145
|
+
"presentation_sha256",
|
|
146
|
+
"plan_contract_sha256",
|
|
147
|
+
"authority_contract_sha256",
|
|
148
|
+
"audited_plan_sha256",
|
|
149
|
+
"policy_definition_sha256",
|
|
150
|
+
):
|
|
151
|
+
require_sha256(getattr(self, name), f"effective choice audit {name}")
|
|
152
|
+
if self.plan_contract_sha256 != self.authority_contract_sha256:
|
|
153
|
+
raise ValueError("audit plan and authority contract identities differ")
|
|
154
|
+
if type(self.outcome_blind) is not bool or not self.outcome_blind:
|
|
155
|
+
raise ValueError("effective choice audit must prove outcome blindness")
|
|
156
|
+
if (
|
|
157
|
+
type(self.exact_treatment_fields_absent) is not bool
|
|
158
|
+
or not self.exact_treatment_fields_absent
|
|
159
|
+
):
|
|
160
|
+
raise ValueError("effective choice audit requires absent exact treatments")
|
|
161
|
+
if (
|
|
162
|
+
type(self.effective_cardinality) is not int
|
|
163
|
+
or self.effective_cardinality < self.configured_minimum_cardinality
|
|
164
|
+
):
|
|
165
|
+
raise ValueError(
|
|
166
|
+
"effective choice cardinality is below its configured minimum"
|
|
167
|
+
)
|
|
168
|
+
count = self.effective_cardinality
|
|
169
|
+
if (
|
|
170
|
+
type(self.option_ids) is not tuple
|
|
171
|
+
or len(self.option_ids) != count
|
|
172
|
+
or any(type(value) is not str or not value for value in self.option_ids)
|
|
173
|
+
):
|
|
174
|
+
raise ValueError("audit option_ids must cover the effective support")
|
|
175
|
+
if len(set(self.option_ids)) != count:
|
|
176
|
+
raise ValueError("effective option IDs must be unique")
|
|
177
|
+
for name in (
|
|
178
|
+
"option_identity_sha256s",
|
|
179
|
+
"child_configuration_sha256s",
|
|
180
|
+
"phenotype_identity_sha256s",
|
|
181
|
+
):
|
|
182
|
+
values = getattr(self, name)
|
|
183
|
+
if type(values) is not tuple or len(values) != count:
|
|
184
|
+
raise ValueError(f"audit {name} must cover the effective support")
|
|
185
|
+
for value in values:
|
|
186
|
+
require_sha256(value, f"effective choice audit {name}")
|
|
187
|
+
if len(set(values)) != count:
|
|
188
|
+
raise ValueError(f"effective {name} must be unique")
|
|
189
|
+
if type(self.policy_id) is not str or _TOKEN.fullmatch(self.policy_id) is None:
|
|
190
|
+
raise ValueError("effective choice audit policy_id is invalid")
|
|
191
|
+
if type(self.policy_version) is not int or self.policy_version <= 0:
|
|
192
|
+
raise ValueError("effective choice audit policy_version must be positive")
|
|
193
|
+
expected = _hash(_RECEIPT_DOMAIN, self.to_record())
|
|
194
|
+
if self.receipt_sha256:
|
|
195
|
+
require_sha256(self.receipt_sha256, "effective choice audit receipt_sha256")
|
|
196
|
+
if self.receipt_sha256 != expected:
|
|
197
|
+
raise ValueError("effective choice audit receipt is not authentic")
|
|
198
|
+
else:
|
|
199
|
+
object.__setattr__(self, "receipt_sha256", expected)
|
|
200
|
+
|
|
201
|
+
def to_record(self) -> dict[str, object]:
|
|
202
|
+
return {
|
|
203
|
+
"schema_version": 1,
|
|
204
|
+
"policy_id": self.policy_id,
|
|
205
|
+
"policy_version": self.policy_version,
|
|
206
|
+
"policy_definition_sha256": self.policy_definition_sha256,
|
|
207
|
+
"configured_minimum_cardinality": self.configured_minimum_cardinality,
|
|
208
|
+
"generation": self.generation,
|
|
209
|
+
"invocation_label": self.invocation_label,
|
|
210
|
+
"parent_candidate_id": self.parent_candidate_id.value,
|
|
211
|
+
"parent_configuration_sha256": self.parent_configuration_sha256,
|
|
212
|
+
"selected_card_reference": _ref_record(self.selected_card_reference),
|
|
213
|
+
"selected_card_binding_mode": self.selected_card_binding_mode.value,
|
|
214
|
+
"selected_card_binding_sha256": self.selected_card_binding_sha256,
|
|
215
|
+
"authority_sha256": self.authority_sha256,
|
|
216
|
+
"support_sha256": self.support_sha256,
|
|
217
|
+
"presentation_sha256": self.presentation_sha256,
|
|
218
|
+
"plan_contract_sha256": self.plan_contract_sha256,
|
|
219
|
+
"authority_contract_sha256": self.authority_contract_sha256,
|
|
220
|
+
"outcome_blind": self.outcome_blind,
|
|
221
|
+
"exact_treatment_fields_absent": self.exact_treatment_fields_absent,
|
|
222
|
+
"effective_cardinality": self.effective_cardinality,
|
|
223
|
+
"option_ids": list(self.option_ids),
|
|
224
|
+
"option_identity_sha256s": list(self.option_identity_sha256s),
|
|
225
|
+
"child_configuration_sha256s": list(self.child_configuration_sha256s),
|
|
226
|
+
"phenotype_identity_sha256s": list(self.phenotype_identity_sha256s),
|
|
227
|
+
"audited_plan_sha256": self.audited_plan_sha256,
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
def _configured_minimum(value: int) -> int:
|
|
232
|
+
if type(value) is not int or value < 2:
|
|
233
|
+
raise ValueError("minimum_cardinality must be an exact integer of at least two")
|
|
234
|
+
return value
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
def _card_binding(
|
|
238
|
+
plan: InvocationPlan,
|
|
239
|
+
card_reference: InsightRef,
|
|
240
|
+
) -> tuple[SelectedCardBindingMode, str]:
|
|
241
|
+
resolved = plan.resolved_insight_assignment
|
|
242
|
+
quarantine = plan.quarantine_test_insights
|
|
243
|
+
if resolved is not None:
|
|
244
|
+
if type(resolved) is not ResolvedInsightAssignment:
|
|
245
|
+
raise EffectiveChoiceAuditError("resolved card assignment is not exact")
|
|
246
|
+
ResolvedInsightAssignment.__post_init__(resolved)
|
|
247
|
+
if quarantine or resolved.selection_decision.selected != (card_reference,):
|
|
248
|
+
raise EffectiveChoiceAuditError(
|
|
249
|
+
"resolved assignment does not select exactly the authority card"
|
|
250
|
+
)
|
|
251
|
+
return SelectedCardBindingMode.RESOLVED_ASSIGNMENT, resolved.assignment_sha256
|
|
252
|
+
if quarantine != (card_reference,):
|
|
253
|
+
raise EffectiveChoiceAuditError(
|
|
254
|
+
"explicit quarantine does not select exactly the authority card"
|
|
255
|
+
)
|
|
256
|
+
return (
|
|
257
|
+
SelectedCardBindingMode.EXPLICIT_QUARANTINE,
|
|
258
|
+
_hash(
|
|
259
|
+
_QUARANTINE_BINDING_DOMAIN,
|
|
260
|
+
{
|
|
261
|
+
"mode": SelectedCardBindingMode.EXPLICIT_QUARANTINE.value,
|
|
262
|
+
"reference": _ref_record(card_reference),
|
|
263
|
+
},
|
|
264
|
+
),
|
|
265
|
+
)
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
def _plan_binding_record(
|
|
269
|
+
*,
|
|
270
|
+
plan: InvocationPlan,
|
|
271
|
+
authority: FiniteActionSetAuthority,
|
|
272
|
+
binding_mode: SelectedCardBindingMode,
|
|
273
|
+
binding_sha256: str,
|
|
274
|
+
option_ids: tuple[str, ...],
|
|
275
|
+
option_identity_sha256s: tuple[str, ...],
|
|
276
|
+
child_configuration_sha256s: tuple[str, ...],
|
|
277
|
+
phenotype_identity_sha256s: tuple[str, ...],
|
|
278
|
+
) -> dict[str, object]:
|
|
279
|
+
parent = plan.parents[0]
|
|
280
|
+
contract = plan.finite_variation_contract
|
|
281
|
+
assert contract is not None
|
|
282
|
+
return {
|
|
283
|
+
"schema_version": 1,
|
|
284
|
+
"generation": plan.generation,
|
|
285
|
+
"invocation_label": plan.label,
|
|
286
|
+
"operator_kind": plan.operator_kind.value,
|
|
287
|
+
"mutation_response_mode": plan.mutation_response_mode.value,
|
|
288
|
+
"parent_candidate_id": parent.candidate_id.value,
|
|
289
|
+
"parent_configuration_sha256": parent.occurrence.configuration_hash,
|
|
290
|
+
"plan_contract_sha256": contract.identity_sha256,
|
|
291
|
+
"authority_sha256": authority.authority_sha256,
|
|
292
|
+
"support_sha256": authority.support.support_sha256,
|
|
293
|
+
"presentation_sha256": authority.support.presentation.presentation_sha256,
|
|
294
|
+
"selected_card_reference": _ref_record(authority.card.reference),
|
|
295
|
+
"selected_card_binding_mode": binding_mode.value,
|
|
296
|
+
"selected_card_binding_sha256": binding_sha256,
|
|
297
|
+
"use_memory": plan.use_memory,
|
|
298
|
+
"exact_treatment_fields_present": {
|
|
299
|
+
"insight_treatment_requirement": (
|
|
300
|
+
plan.insight_treatment_requirement is not None
|
|
301
|
+
),
|
|
302
|
+
"compiled_hypothesis_treatment": (
|
|
303
|
+
plan.compiled_hypothesis_treatment is not None
|
|
304
|
+
),
|
|
305
|
+
"compiled_hypothesis_eligibility": bool(
|
|
306
|
+
plan.compiled_hypothesis_eligibility
|
|
307
|
+
),
|
|
308
|
+
},
|
|
309
|
+
"current_outcome_access": authority.current_outcome_access,
|
|
310
|
+
"option_ids": list(option_ids),
|
|
311
|
+
"option_identity_sha256s": list(option_identity_sha256s),
|
|
312
|
+
"child_configuration_sha256s": list(child_configuration_sha256s),
|
|
313
|
+
"phenotype_identity_sha256s": list(phenotype_identity_sha256s),
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
def audit_effective_choice_plan(
|
|
318
|
+
plan: InvocationPlan,
|
|
319
|
+
*,
|
|
320
|
+
minimum_cardinality: int,
|
|
321
|
+
) -> EffectiveChoiceAuditReceipt:
|
|
322
|
+
"""Validate and seal one real, outcome-blind K-choice plan.
|
|
323
|
+
|
|
324
|
+
The configured minimum is deliberately explicit: an experiment requesting
|
|
325
|
+
K=8 must not silently accept the domain type's lower bound of four.
|
|
326
|
+
"""
|
|
327
|
+
|
|
328
|
+
minimum = _configured_minimum(minimum_cardinality)
|
|
329
|
+
if type(plan) is not InvocationPlan:
|
|
330
|
+
raise TypeError("effective choice audit requires an exact InvocationPlan")
|
|
331
|
+
try:
|
|
332
|
+
InvocationPlan.__post_init__(plan)
|
|
333
|
+
except (TypeError, ValueError) as exc:
|
|
334
|
+
raise EffectiveChoiceAuditError(
|
|
335
|
+
"invocation plan failed its application-layer contract"
|
|
336
|
+
) from exc
|
|
337
|
+
authority = plan.finite_action_set_authority
|
|
338
|
+
if authority is None:
|
|
339
|
+
raise EffectiveChoiceAuditError("finite action authority is absent")
|
|
340
|
+
if type(authority) is not FiniteActionSetAuthority:
|
|
341
|
+
raise EffectiveChoiceAuditError("finite action authority is not exact")
|
|
342
|
+
try:
|
|
343
|
+
FiniteActionSetAuthority.__post_init__(authority)
|
|
344
|
+
except (TypeError, ValueError) as exc:
|
|
345
|
+
raise EffectiveChoiceAuditError("finite action authority is invalid") from exc
|
|
346
|
+
if (
|
|
347
|
+
plan.mutation_response_mode
|
|
348
|
+
is not MutationResponseMode.FINITE_OPTION_SELECTION_V1
|
|
349
|
+
):
|
|
350
|
+
raise EffectiveChoiceAuditError("plan is not an opaque finite-option selection")
|
|
351
|
+
contract = plan.finite_variation_contract
|
|
352
|
+
if type(contract) is not FiniteVariationContract:
|
|
353
|
+
raise EffectiveChoiceAuditError("plan finite variation contract is absent")
|
|
354
|
+
try:
|
|
355
|
+
validate_finite_variation_contract(contract)
|
|
356
|
+
except (TypeError, ValueError) as exc:
|
|
357
|
+
raise EffectiveChoiceAuditError(
|
|
358
|
+
"plan finite variation contract is invalid"
|
|
359
|
+
) from exc
|
|
360
|
+
support = authority.support
|
|
361
|
+
authority_contract = support.support_contract
|
|
362
|
+
if (
|
|
363
|
+
contract != authority_contract
|
|
364
|
+
or contract.identity_sha256 != authority_contract.identity_sha256
|
|
365
|
+
):
|
|
366
|
+
raise EffectiveChoiceAuditError(
|
|
367
|
+
"plan contract differs from the authority support contract"
|
|
368
|
+
)
|
|
369
|
+
if (
|
|
370
|
+
plan.insight_treatment_requirement is not None
|
|
371
|
+
or plan.compiled_hypothesis_treatment is not None
|
|
372
|
+
or plan.compiled_hypothesis_eligibility
|
|
373
|
+
):
|
|
374
|
+
raise EffectiveChoiceAuditError(
|
|
375
|
+
"finite-choice plan retains an exact treatment or compilation"
|
|
376
|
+
)
|
|
377
|
+
if plan.use_memory:
|
|
378
|
+
raise EffectiveChoiceAuditError(
|
|
379
|
+
"finite-choice plan must bind one explicit card before admission"
|
|
380
|
+
)
|
|
381
|
+
if authority.current_outcome_access is not False:
|
|
382
|
+
raise EffectiveChoiceAuditError("finite action authority is not outcome-blind")
|
|
383
|
+
parent = plan.parents[0]
|
|
384
|
+
if (
|
|
385
|
+
support.parent_candidate_id != parent.candidate_id
|
|
386
|
+
or support.parent_configuration_sha256 != parent.occurrence.configuration_hash
|
|
387
|
+
or support.support_contract.parent_configuration != parent.configuration
|
|
388
|
+
):
|
|
389
|
+
raise EffectiveChoiceAuditError("finite support is bound to a foreign parent")
|
|
390
|
+
binding_mode, binding_sha256 = _card_binding(plan, authority.card.reference)
|
|
391
|
+
options = support.options
|
|
392
|
+
cardinality = len(options)
|
|
393
|
+
if cardinality < minimum or support.compatible_option_count != cardinality:
|
|
394
|
+
raise EffectiveChoiceAuditError(
|
|
395
|
+
"effective finite-choice cardinality is below its configured minimum"
|
|
396
|
+
)
|
|
397
|
+
option_ids = tuple(value.option.option_id for value in options)
|
|
398
|
+
option_identity_sha256s = tuple(value.option.identity_sha256 for value in options)
|
|
399
|
+
child_configuration_sha256s = tuple(
|
|
400
|
+
value.option.child_configuration_sha256 for value in options
|
|
401
|
+
)
|
|
402
|
+
phenotype_identity_sha256s = tuple(
|
|
403
|
+
value.phenotype_identity_sha256 for value in options
|
|
404
|
+
)
|
|
405
|
+
for name, values in (
|
|
406
|
+
("option IDs", option_ids),
|
|
407
|
+
("option identities", option_identity_sha256s),
|
|
408
|
+
("child configurations", child_configuration_sha256s),
|
|
409
|
+
("phenotype identities", phenotype_identity_sha256s),
|
|
410
|
+
):
|
|
411
|
+
if len(values) != cardinality or len(set(values)) != cardinality:
|
|
412
|
+
raise EffectiveChoiceAuditError(
|
|
413
|
+
f"effective finite support does not have K unique {name}"
|
|
414
|
+
)
|
|
415
|
+
if tuple(value.option for value in options) != contract.options:
|
|
416
|
+
raise EffectiveChoiceAuditError(
|
|
417
|
+
"authority option records differ from the plan contract"
|
|
418
|
+
)
|
|
419
|
+
if support.presentation.ordered_option_ids != option_ids:
|
|
420
|
+
raise EffectiveChoiceAuditError(
|
|
421
|
+
"provider presentation does not expose the full authority support"
|
|
422
|
+
)
|
|
423
|
+
plan_record = _plan_binding_record(
|
|
424
|
+
plan=plan,
|
|
425
|
+
authority=authority,
|
|
426
|
+
binding_mode=binding_mode,
|
|
427
|
+
binding_sha256=binding_sha256,
|
|
428
|
+
option_ids=option_ids,
|
|
429
|
+
option_identity_sha256s=option_identity_sha256s,
|
|
430
|
+
child_configuration_sha256s=child_configuration_sha256s,
|
|
431
|
+
phenotype_identity_sha256s=phenotype_identity_sha256s,
|
|
432
|
+
)
|
|
433
|
+
return EffectiveChoiceAuditReceipt(
|
|
434
|
+
configured_minimum_cardinality=minimum,
|
|
435
|
+
generation=plan.generation,
|
|
436
|
+
invocation_label=plan.label,
|
|
437
|
+
parent_candidate_id=parent.candidate_id,
|
|
438
|
+
parent_configuration_sha256=parent.occurrence.configuration_hash,
|
|
439
|
+
selected_card_reference=authority.card.reference,
|
|
440
|
+
selected_card_binding_mode=binding_mode,
|
|
441
|
+
selected_card_binding_sha256=binding_sha256,
|
|
442
|
+
authority_sha256=authority.authority_sha256,
|
|
443
|
+
support_sha256=support.support_sha256,
|
|
444
|
+
presentation_sha256=support.presentation.presentation_sha256,
|
|
445
|
+
plan_contract_sha256=contract.identity_sha256,
|
|
446
|
+
authority_contract_sha256=authority_contract.identity_sha256,
|
|
447
|
+
outcome_blind=True,
|
|
448
|
+
exact_treatment_fields_absent=True,
|
|
449
|
+
effective_cardinality=cardinality,
|
|
450
|
+
option_ids=option_ids,
|
|
451
|
+
option_identity_sha256s=option_identity_sha256s,
|
|
452
|
+
child_configuration_sha256s=child_configuration_sha256s,
|
|
453
|
+
phenotype_identity_sha256s=phenotype_identity_sha256s,
|
|
454
|
+
audited_plan_sha256=_hash(_PLAN_BINDING_DOMAIN, plan_record),
|
|
455
|
+
)
|
|
456
|
+
|
|
457
|
+
|
|
458
|
+
def validate_effective_choice_audit_receipt(
|
|
459
|
+
receipt: EffectiveChoiceAuditReceipt,
|
|
460
|
+
plan: InvocationPlan,
|
|
461
|
+
) -> None:
|
|
462
|
+
"""Re-derive a receipt from its plan and reject any stale or forged proof."""
|
|
463
|
+
|
|
464
|
+
if type(receipt) is not EffectiveChoiceAuditReceipt:
|
|
465
|
+
raise TypeError("receipt must be an exact EffectiveChoiceAuditReceipt")
|
|
466
|
+
EffectiveChoiceAuditReceipt.__post_init__(receipt)
|
|
467
|
+
expected = audit_effective_choice_plan(
|
|
468
|
+
plan,
|
|
469
|
+
minimum_cardinality=receipt.configured_minimum_cardinality,
|
|
470
|
+
)
|
|
471
|
+
if receipt != expected:
|
|
472
|
+
raise ValueError("effective choice receipt differs from the audited plan")
|
|
473
|
+
|
|
474
|
+
|
|
475
|
+
__all__ = [
|
|
476
|
+
"EFFECTIVE_CHOICE_AUDIT_DEFINITION_SHA256",
|
|
477
|
+
"EFFECTIVE_CHOICE_AUDIT_POLICY_ID",
|
|
478
|
+
"EFFECTIVE_CHOICE_AUDIT_POLICY_VERSION",
|
|
479
|
+
"EffectiveChoiceAuditError",
|
|
480
|
+
"EffectiveChoiceAuditReceipt",
|
|
481
|
+
"SelectedCardBindingMode",
|
|
482
|
+
"audit_effective_choice_plan",
|
|
483
|
+
"validate_effective_choice_audit_receipt",
|
|
484
|
+
]
|