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,759 @@
|
|
|
1
|
+
"""Generic, evaluator-free administration of assigned insight treatments.
|
|
2
|
+
|
|
3
|
+
The policy operates only on immutable machine evidence: exact insight versions,
|
|
4
|
+
finite-option families, and parent-relative changed paths. It never inspects an
|
|
5
|
+
objective or benchmark-specific field. A rejected model proposal therefore can
|
|
6
|
+
be recorded as no-yield before an expensive evaluator is entered.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import hashlib
|
|
12
|
+
import json
|
|
13
|
+
import re
|
|
14
|
+
from dataclasses import dataclass, field
|
|
15
|
+
from enum import Enum
|
|
16
|
+
from typing import Protocol, runtime_checkable
|
|
17
|
+
|
|
18
|
+
from agent_evolve.domain.insight import InsightRef
|
|
19
|
+
from agent_evolve.domain.patch import require_sha256
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
_TOKEN = re.compile(r"^[a-z][a-z0-9_.-]{0,255}$")
|
|
23
|
+
_POLICY_DEFINITION = (
|
|
24
|
+
b"agent-evolve:treatment-compliance:v2:exact-card-palette-action-claims-before-eval"
|
|
25
|
+
)
|
|
26
|
+
TREATMENT_COMPLIANCE_POLICY_ID = "strict_treatment_compliance"
|
|
27
|
+
TREATMENT_COMPLIANCE_POLICY_VERSION = 2
|
|
28
|
+
TREATMENT_COMPLIANCE_DEFINITION_SHA256 = hashlib.sha256(
|
|
29
|
+
_POLICY_DEFINITION
|
|
30
|
+
).hexdigest()
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _hash(
|
|
34
|
+
domain: str,
|
|
35
|
+
record: dict[str, object],
|
|
36
|
+
*,
|
|
37
|
+
version: int = 1,
|
|
38
|
+
) -> str:
|
|
39
|
+
payload = json.dumps(
|
|
40
|
+
record,
|
|
41
|
+
sort_keys=True,
|
|
42
|
+
separators=(",", ":"),
|
|
43
|
+
ensure_ascii=True,
|
|
44
|
+
allow_nan=False,
|
|
45
|
+
).encode("ascii")
|
|
46
|
+
return hashlib.sha256(
|
|
47
|
+
f"agent-evolve:{domain}:v{version}\x00".encode("ascii") + payload
|
|
48
|
+
).hexdigest()
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def _ref_record(reference: InsightRef) -> dict[str, object]:
|
|
52
|
+
return {
|
|
53
|
+
"insight_id": reference.insight_id.value,
|
|
54
|
+
"version": reference.version,
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def _canonical_strings(values: tuple[str, ...], *, name: str) -> None:
|
|
59
|
+
if type(values) is not tuple or any(
|
|
60
|
+
type(value) is not str or not value for value in values
|
|
61
|
+
):
|
|
62
|
+
raise TypeError(f"{name} must be an exact tuple of non-empty strings")
|
|
63
|
+
if values != tuple(sorted(set(values))):
|
|
64
|
+
raise ValueError(f"{name} must be unique and canonically sorted")
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _paths_overlap(first: str, second: str) -> bool:
|
|
68
|
+
return (
|
|
69
|
+
first == second
|
|
70
|
+
or first.startswith(second + ".")
|
|
71
|
+
or first.startswith(second + "[")
|
|
72
|
+
or second.startswith(first + ".")
|
|
73
|
+
or second.startswith(first + "[")
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def _overlaps_any(first: tuple[str, ...], second: tuple[str, ...]) -> bool:
|
|
78
|
+
return any(_paths_overlap(left, right) for left in first for right in second)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
class TreatmentClaimMode(str, Enum):
|
|
82
|
+
"""How an assigned treatment must be reported by the model."""
|
|
83
|
+
|
|
84
|
+
OPTIONAL_SUBSET = "optional_subset"
|
|
85
|
+
EXACT_REQUIRED = "exact_required"
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
class TreatmentAssignmentRole(str, Enum):
|
|
89
|
+
"""Scientific role of the assigned card, independent of benchmark names."""
|
|
90
|
+
|
|
91
|
+
ACTIVE = "active"
|
|
92
|
+
SHAM_CONTROL = "sham_control"
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
@dataclass(frozen=True, slots=True)
|
|
96
|
+
class TreatmentActionBinding:
|
|
97
|
+
"""One exact parent-bound finite action permitted by a treatment."""
|
|
98
|
+
|
|
99
|
+
option_id: str
|
|
100
|
+
option_identity_sha256: str
|
|
101
|
+
|
|
102
|
+
def __post_init__(self) -> None:
|
|
103
|
+
if type(self.option_id) is not str or _TOKEN.fullmatch(self.option_id) is None:
|
|
104
|
+
raise ValueError("option_id must use the canonical option grammar")
|
|
105
|
+
require_sha256(self.option_identity_sha256, "option_identity_sha256")
|
|
106
|
+
|
|
107
|
+
def to_record(self) -> dict[str, object]:
|
|
108
|
+
return {
|
|
109
|
+
"option_id": self.option_id,
|
|
110
|
+
"option_identity_sha256": self.option_identity_sha256,
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
@dataclass(frozen=True, slots=True)
|
|
115
|
+
class TreatmentInsightBinding:
|
|
116
|
+
"""Plan-hashed identity of one exact insight card and its action claim."""
|
|
117
|
+
|
|
118
|
+
reference: InsightRef
|
|
119
|
+
insight_content_sha256: str
|
|
120
|
+
evidence_sha256: str
|
|
121
|
+
recommended_option_ids: tuple[str, ...]
|
|
122
|
+
|
|
123
|
+
def __post_init__(self) -> None:
|
|
124
|
+
if type(self.reference) is not InsightRef:
|
|
125
|
+
raise TypeError("reference must be an exact InsightRef")
|
|
126
|
+
InsightRef.__post_init__(self.reference)
|
|
127
|
+
require_sha256(self.insight_content_sha256, "insight_content_sha256")
|
|
128
|
+
require_sha256(self.evidence_sha256, "evidence_sha256")
|
|
129
|
+
_canonical_strings(
|
|
130
|
+
self.recommended_option_ids,
|
|
131
|
+
name="recommended_option_ids",
|
|
132
|
+
)
|
|
133
|
+
if any(_TOKEN.fullmatch(value) is None for value in self.recommended_option_ids):
|
|
134
|
+
raise ValueError("recommended_option_ids use the canonical option grammar")
|
|
135
|
+
|
|
136
|
+
def to_record(self) -> dict[str, object]:
|
|
137
|
+
return {
|
|
138
|
+
**_ref_record(self.reference),
|
|
139
|
+
"insight_content_sha256": self.insight_content_sha256,
|
|
140
|
+
"evidence_sha256": self.evidence_sha256,
|
|
141
|
+
"recommended_option_ids": list(self.recommended_option_ids),
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
@dataclass(frozen=True, slots=True)
|
|
146
|
+
class InsightTreatmentRequirement:
|
|
147
|
+
"""Plan-hashed exact card, palette, and parent-bound action contract."""
|
|
148
|
+
|
|
149
|
+
insight_bindings: tuple[TreatmentInsightBinding, ...]
|
|
150
|
+
finite_contract_sha256: str
|
|
151
|
+
allowed_actions: tuple[TreatmentActionBinding, ...]
|
|
152
|
+
claim_mode: TreatmentClaimMode
|
|
153
|
+
assignment_role: TreatmentAssignmentRole = TreatmentAssignmentRole.ACTIVE
|
|
154
|
+
require_option_family_match: bool = True
|
|
155
|
+
require_changed_path_overlap: bool = True
|
|
156
|
+
requirement_sha256: str = field(init=False)
|
|
157
|
+
|
|
158
|
+
def __post_init__(self) -> None:
|
|
159
|
+
if type(self.insight_bindings) is not tuple or not self.insight_bindings:
|
|
160
|
+
raise ValueError("a treatment requirement needs assigned insights")
|
|
161
|
+
if any(
|
|
162
|
+
type(value) is not TreatmentInsightBinding
|
|
163
|
+
for value in self.insight_bindings
|
|
164
|
+
):
|
|
165
|
+
raise TypeError(
|
|
166
|
+
"insight_bindings must contain exact TreatmentInsightBinding values"
|
|
167
|
+
)
|
|
168
|
+
for binding in self.insight_bindings:
|
|
169
|
+
TreatmentInsightBinding.__post_init__(binding)
|
|
170
|
+
references = tuple(value.reference for value in self.insight_bindings)
|
|
171
|
+
if references != tuple(sorted(set(references))):
|
|
172
|
+
raise ValueError("insight_bindings must be unique and canonically sorted")
|
|
173
|
+
ids = tuple(value.insight_id.value for value in references)
|
|
174
|
+
if len(set(ids)) != len(ids):
|
|
175
|
+
raise ValueError(
|
|
176
|
+
"unversioned claimed_insight_ids require distinct logical insight IDs"
|
|
177
|
+
)
|
|
178
|
+
require_sha256(self.finite_contract_sha256, "finite_contract_sha256")
|
|
179
|
+
if type(self.allowed_actions) is not tuple or not self.allowed_actions:
|
|
180
|
+
raise ValueError("a treatment requirement needs exact allowed actions")
|
|
181
|
+
if any(
|
|
182
|
+
type(value) is not TreatmentActionBinding
|
|
183
|
+
for value in self.allowed_actions
|
|
184
|
+
):
|
|
185
|
+
raise TypeError(
|
|
186
|
+
"allowed_actions must contain exact TreatmentActionBinding values"
|
|
187
|
+
)
|
|
188
|
+
for action in self.allowed_actions:
|
|
189
|
+
TreatmentActionBinding.__post_init__(action)
|
|
190
|
+
if self.allowed_actions != tuple(
|
|
191
|
+
sorted(
|
|
192
|
+
set(self.allowed_actions),
|
|
193
|
+
key=lambda value: (value.option_id, value.option_identity_sha256),
|
|
194
|
+
)
|
|
195
|
+
):
|
|
196
|
+
raise ValueError("allowed_actions must be unique and canonically sorted")
|
|
197
|
+
common_option_ids = set.intersection(
|
|
198
|
+
*(set(binding.recommended_option_ids) for binding in self.insight_bindings)
|
|
199
|
+
)
|
|
200
|
+
allowed_option_ids = {action.option_id for action in self.allowed_actions}
|
|
201
|
+
if allowed_option_ids != common_option_ids:
|
|
202
|
+
raise ValueError(
|
|
203
|
+
"allowed action IDs must equal the cards' exact common recommendation"
|
|
204
|
+
)
|
|
205
|
+
if len(allowed_option_ids) != len(self.allowed_actions):
|
|
206
|
+
raise ValueError("allowed action option IDs must be unique")
|
|
207
|
+
if type(self.claim_mode) is not TreatmentClaimMode:
|
|
208
|
+
raise TypeError("claim_mode must be a TreatmentClaimMode")
|
|
209
|
+
if type(self.assignment_role) is not TreatmentAssignmentRole:
|
|
210
|
+
raise TypeError("assignment_role must be a TreatmentAssignmentRole")
|
|
211
|
+
if type(self.require_option_family_match) is not bool or type(
|
|
212
|
+
self.require_changed_path_overlap
|
|
213
|
+
) is not bool:
|
|
214
|
+
raise TypeError("treatment requirement switches must be bool")
|
|
215
|
+
object.__setattr__(
|
|
216
|
+
self,
|
|
217
|
+
"requirement_sha256",
|
|
218
|
+
_hash(
|
|
219
|
+
"insight-treatment-requirement",
|
|
220
|
+
self.to_record(),
|
|
221
|
+
version=2,
|
|
222
|
+
),
|
|
223
|
+
)
|
|
224
|
+
|
|
225
|
+
def to_record(self) -> dict[str, object]:
|
|
226
|
+
return {
|
|
227
|
+
"schema_version": 2,
|
|
228
|
+
"insight_bindings": [
|
|
229
|
+
binding.to_record() for binding in self.insight_bindings
|
|
230
|
+
],
|
|
231
|
+
"finite_contract_sha256": self.finite_contract_sha256,
|
|
232
|
+
"allowed_actions": [
|
|
233
|
+
action.to_record() for action in self.allowed_actions
|
|
234
|
+
],
|
|
235
|
+
"claim_mode": self.claim_mode.value,
|
|
236
|
+
"assignment_role": self.assignment_role.value,
|
|
237
|
+
"require_option_family_match": self.require_option_family_match,
|
|
238
|
+
"require_changed_path_overlap": self.require_changed_path_overlap,
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
@property
|
|
242
|
+
def required_insights(self) -> tuple[InsightRef, ...]:
|
|
243
|
+
return tuple(binding.reference for binding in self.insight_bindings)
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
@dataclass(frozen=True, slots=True)
|
|
247
|
+
class TreatmentInsightEvidence:
|
|
248
|
+
reference: InsightRef
|
|
249
|
+
insight_content_sha256: str
|
|
250
|
+
applicable_operator_kinds: tuple[str, ...]
|
|
251
|
+
affected_paths: tuple[str, ...]
|
|
252
|
+
recommended_option_families: tuple[str, ...]
|
|
253
|
+
recommended_option_ids: tuple[str, ...]
|
|
254
|
+
evidence_sha256: str = field(init=False)
|
|
255
|
+
|
|
256
|
+
def __post_init__(self) -> None:
|
|
257
|
+
if type(self.reference) is not InsightRef:
|
|
258
|
+
raise TypeError("reference must be an exact InsightRef")
|
|
259
|
+
InsightRef.__post_init__(self.reference)
|
|
260
|
+
require_sha256(self.insight_content_sha256, "insight_content_sha256")
|
|
261
|
+
for name in (
|
|
262
|
+
"applicable_operator_kinds",
|
|
263
|
+
"affected_paths",
|
|
264
|
+
"recommended_option_families",
|
|
265
|
+
"recommended_option_ids",
|
|
266
|
+
):
|
|
267
|
+
_canonical_strings(getattr(self, name), name=name)
|
|
268
|
+
if any(_TOKEN.fullmatch(value) is None for value in self.recommended_option_ids):
|
|
269
|
+
raise ValueError("recommended_option_ids use the canonical option grammar")
|
|
270
|
+
object.__setattr__(
|
|
271
|
+
self,
|
|
272
|
+
"evidence_sha256",
|
|
273
|
+
_hash(
|
|
274
|
+
"treatment-insight-evidence",
|
|
275
|
+
self.to_record(),
|
|
276
|
+
version=2,
|
|
277
|
+
),
|
|
278
|
+
)
|
|
279
|
+
|
|
280
|
+
def to_record(self) -> dict[str, object]:
|
|
281
|
+
return {
|
|
282
|
+
"schema_version": 2,
|
|
283
|
+
**_ref_record(self.reference),
|
|
284
|
+
"insight_content_sha256": self.insight_content_sha256,
|
|
285
|
+
"applicable_operator_kinds": list(self.applicable_operator_kinds),
|
|
286
|
+
"affected_paths": list(self.affected_paths),
|
|
287
|
+
"recommended_option_families": list(
|
|
288
|
+
self.recommended_option_families
|
|
289
|
+
),
|
|
290
|
+
"recommended_option_ids": list(self.recommended_option_ids),
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
def binding(self) -> TreatmentInsightBinding:
|
|
294
|
+
return TreatmentInsightBinding(
|
|
295
|
+
reference=self.reference,
|
|
296
|
+
insight_content_sha256=self.insight_content_sha256,
|
|
297
|
+
evidence_sha256=self.evidence_sha256,
|
|
298
|
+
recommended_option_ids=self.recommended_option_ids,
|
|
299
|
+
)
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
@dataclass(frozen=True, slots=True)
|
|
303
|
+
class FiniteTreatmentAction:
|
|
304
|
+
option_id: str
|
|
305
|
+
option_identity_sha256: str
|
|
306
|
+
family: str
|
|
307
|
+
changed_paths: tuple[str, ...]
|
|
308
|
+
|
|
309
|
+
def __post_init__(self) -> None:
|
|
310
|
+
if type(self.option_id) is not str or _TOKEN.fullmatch(self.option_id) is None:
|
|
311
|
+
raise ValueError("option_id must use the canonical option grammar")
|
|
312
|
+
require_sha256(self.option_identity_sha256, "option_identity_sha256")
|
|
313
|
+
if type(self.family) is not str or _TOKEN.fullmatch(self.family) is None:
|
|
314
|
+
raise ValueError("family must use the canonical option grammar")
|
|
315
|
+
_canonical_strings(self.changed_paths, name="changed_paths")
|
|
316
|
+
|
|
317
|
+
def to_record(self) -> dict[str, object]:
|
|
318
|
+
return {
|
|
319
|
+
"option_id": self.option_id,
|
|
320
|
+
"option_identity_sha256": self.option_identity_sha256,
|
|
321
|
+
"family": self.family,
|
|
322
|
+
"changed_paths": list(self.changed_paths),
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
def binding(self) -> TreatmentActionBinding:
|
|
326
|
+
return TreatmentActionBinding(
|
|
327
|
+
option_id=self.option_id,
|
|
328
|
+
option_identity_sha256=self.option_identity_sha256,
|
|
329
|
+
)
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
class TreatmentComplianceViolation(str, Enum):
|
|
333
|
+
ASSIGNMENT_MISMATCH = "assignment_mismatch"
|
|
334
|
+
INSIGHT_EVIDENCE_MISMATCH = "insight_evidence_mismatch"
|
|
335
|
+
FINITE_CONTRACT_MISMATCH = "finite_contract_mismatch"
|
|
336
|
+
EXACT_ACTION_BINDING_MISMATCH = "exact_action_binding_mismatch"
|
|
337
|
+
OPERATOR_INAPPLICABLE = "operator_inapplicable"
|
|
338
|
+
EDITABLE_PATH_DISJOINT = "editable_path_disjoint"
|
|
339
|
+
INTERVENTION_FAMILY_MISSING = "intervention_family_missing"
|
|
340
|
+
NO_COMPATIBLE_FINITE_ACTION = "no_compatible_finite_action"
|
|
341
|
+
OPERATOR_NONCOMPLIANT = "operator_noncompliant"
|
|
342
|
+
DUPLICATE_CLAIM = "duplicate_claim"
|
|
343
|
+
FOREIGN_CLAIM = "foreign_claim"
|
|
344
|
+
EXACT_CLAIM_MISMATCH = "exact_claim_mismatch"
|
|
345
|
+
SELECTED_ACTION_INCOMPATIBLE = "selected_action_incompatible"
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
@dataclass(frozen=True, slots=True)
|
|
349
|
+
class TreatmentPreflightRequest:
|
|
350
|
+
requirement: InsightTreatmentRequirement
|
|
351
|
+
operator_kind: str
|
|
352
|
+
editable_paths: tuple[str, ...]
|
|
353
|
+
insights: tuple[TreatmentInsightEvidence, ...]
|
|
354
|
+
finite_contract_sha256: str
|
|
355
|
+
actions: tuple[FiniteTreatmentAction, ...]
|
|
356
|
+
|
|
357
|
+
def __post_init__(self) -> None:
|
|
358
|
+
if type(self.requirement) is not InsightTreatmentRequirement:
|
|
359
|
+
raise TypeError("requirement must be an InsightTreatmentRequirement")
|
|
360
|
+
InsightTreatmentRequirement.__post_init__(self.requirement)
|
|
361
|
+
if type(self.operator_kind) is not str or not self.operator_kind:
|
|
362
|
+
raise ValueError("operator_kind must be non-empty")
|
|
363
|
+
_canonical_strings(self.editable_paths, name="editable_paths")
|
|
364
|
+
if type(self.insights) is not tuple or any(
|
|
365
|
+
type(value) is not TreatmentInsightEvidence for value in self.insights
|
|
366
|
+
):
|
|
367
|
+
raise TypeError("insights must contain TreatmentInsightEvidence values")
|
|
368
|
+
if type(self.actions) is not tuple or not self.actions or any(
|
|
369
|
+
type(value) is not FiniteTreatmentAction for value in self.actions
|
|
370
|
+
):
|
|
371
|
+
raise TypeError("actions must contain finite treatment actions")
|
|
372
|
+
for action in self.actions:
|
|
373
|
+
FiniteTreatmentAction.__post_init__(action)
|
|
374
|
+
action_bindings = tuple(action.binding() for action in self.actions)
|
|
375
|
+
if len(set(action_bindings)) != len(action_bindings):
|
|
376
|
+
raise ValueError("actions must use unique exact option bindings")
|
|
377
|
+
if len({action.option_id for action in self.actions}) != len(self.actions):
|
|
378
|
+
raise ValueError("actions must use unique option IDs")
|
|
379
|
+
require_sha256(self.finite_contract_sha256, "finite_contract_sha256")
|
|
380
|
+
|
|
381
|
+
|
|
382
|
+
@dataclass(frozen=True, slots=True)
|
|
383
|
+
class TreatmentPreflightReceipt:
|
|
384
|
+
requirement_sha256: str
|
|
385
|
+
finite_contract_sha256: str
|
|
386
|
+
compatible_actions: tuple[FiniteTreatmentAction, ...]
|
|
387
|
+
compatible_families: tuple[str, ...]
|
|
388
|
+
violations: tuple[TreatmentComplianceViolation, ...]
|
|
389
|
+
policy_id: str
|
|
390
|
+
policy_version: int
|
|
391
|
+
policy_definition_sha256: str
|
|
392
|
+
receipt_sha256: str = field(init=False)
|
|
393
|
+
|
|
394
|
+
def __post_init__(self) -> None:
|
|
395
|
+
require_sha256(self.requirement_sha256, "requirement_sha256")
|
|
396
|
+
require_sha256(self.finite_contract_sha256, "finite_contract_sha256")
|
|
397
|
+
if type(self.compatible_actions) is not tuple or any(
|
|
398
|
+
type(value) is not FiniteTreatmentAction
|
|
399
|
+
for value in self.compatible_actions
|
|
400
|
+
):
|
|
401
|
+
raise TypeError("compatible_actions must contain exact actions")
|
|
402
|
+
_canonical_strings(self.compatible_families, name="compatible_families")
|
|
403
|
+
if type(self.violations) is not tuple or any(
|
|
404
|
+
type(value) is not TreatmentComplianceViolation
|
|
405
|
+
for value in self.violations
|
|
406
|
+
):
|
|
407
|
+
raise TypeError("violations must contain exact violation values")
|
|
408
|
+
if self.violations != tuple(sorted(set(self.violations), key=str)):
|
|
409
|
+
raise ValueError("violations must be unique and canonical")
|
|
410
|
+
if type(self.policy_id) is not str or not self.policy_id:
|
|
411
|
+
raise ValueError("policy_id must be non-empty")
|
|
412
|
+
if type(self.policy_version) is not int or self.policy_version <= 0:
|
|
413
|
+
raise ValueError("policy_version must be positive")
|
|
414
|
+
require_sha256(self.policy_definition_sha256, "policy_definition_sha256")
|
|
415
|
+
object.__setattr__(
|
|
416
|
+
self,
|
|
417
|
+
"receipt_sha256",
|
|
418
|
+
_hash("treatment-preflight-receipt", self.to_record()),
|
|
419
|
+
)
|
|
420
|
+
|
|
421
|
+
@property
|
|
422
|
+
def passed(self) -> bool:
|
|
423
|
+
return not self.violations
|
|
424
|
+
|
|
425
|
+
def to_record(self) -> dict[str, object]:
|
|
426
|
+
return {
|
|
427
|
+
"schema_version": 1,
|
|
428
|
+
"requirement_sha256": self.requirement_sha256,
|
|
429
|
+
"finite_contract_sha256": self.finite_contract_sha256,
|
|
430
|
+
"compatible_actions": [
|
|
431
|
+
value.to_record() for value in self.compatible_actions
|
|
432
|
+
],
|
|
433
|
+
"compatible_families": list(self.compatible_families),
|
|
434
|
+
"violations": [value.value for value in self.violations],
|
|
435
|
+
"policy_id": self.policy_id,
|
|
436
|
+
"policy_version": self.policy_version,
|
|
437
|
+
"policy_definition_sha256": self.policy_definition_sha256,
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
|
|
441
|
+
@dataclass(frozen=True, slots=True)
|
|
442
|
+
class TreatmentAdmissionRequest:
|
|
443
|
+
requirement: InsightTreatmentRequirement
|
|
444
|
+
preflight: TreatmentPreflightReceipt
|
|
445
|
+
claimed_insight_ids: tuple[str, ...]
|
|
446
|
+
selected_action: FiniteTreatmentAction
|
|
447
|
+
operator_compliant: bool
|
|
448
|
+
|
|
449
|
+
def __post_init__(self) -> None:
|
|
450
|
+
if type(self.requirement) is not InsightTreatmentRequirement:
|
|
451
|
+
raise TypeError("requirement must be exact")
|
|
452
|
+
InsightTreatmentRequirement.__post_init__(self.requirement)
|
|
453
|
+
if type(self.preflight) is not TreatmentPreflightReceipt:
|
|
454
|
+
raise TypeError("preflight must be exact")
|
|
455
|
+
TreatmentPreflightReceipt.__post_init__(self.preflight)
|
|
456
|
+
if self.preflight.requirement_sha256 != self.requirement.requirement_sha256:
|
|
457
|
+
raise ValueError("preflight is bound to a different requirement")
|
|
458
|
+
if not self.preflight.passed:
|
|
459
|
+
raise ValueError("admission requires a passing preflight receipt")
|
|
460
|
+
if type(self.claimed_insight_ids) is not tuple or any(
|
|
461
|
+
type(value) is not str or not value for value in self.claimed_insight_ids
|
|
462
|
+
):
|
|
463
|
+
raise TypeError(
|
|
464
|
+
"claimed_insight_ids must contain only non-empty strings"
|
|
465
|
+
)
|
|
466
|
+
if type(self.selected_action) is not FiniteTreatmentAction:
|
|
467
|
+
raise TypeError("selected_action must be exact")
|
|
468
|
+
if type(self.operator_compliant) is not bool:
|
|
469
|
+
raise TypeError("operator_compliant must be bool")
|
|
470
|
+
|
|
471
|
+
|
|
472
|
+
@dataclass(frozen=True, slots=True)
|
|
473
|
+
class TreatmentAdmissionReceipt:
|
|
474
|
+
preflight_receipt_sha256: str
|
|
475
|
+
claimed_insight_ids: tuple[str, ...]
|
|
476
|
+
selected_action: FiniteTreatmentAction
|
|
477
|
+
violations: tuple[TreatmentComplianceViolation, ...]
|
|
478
|
+
policy_id: str
|
|
479
|
+
policy_version: int
|
|
480
|
+
policy_definition_sha256: str
|
|
481
|
+
evaluator_entered: bool = False
|
|
482
|
+
receipt_sha256: str = field(init=False)
|
|
483
|
+
|
|
484
|
+
def __post_init__(self) -> None:
|
|
485
|
+
require_sha256(self.preflight_receipt_sha256, "preflight_receipt_sha256")
|
|
486
|
+
if type(self.claimed_insight_ids) is not tuple:
|
|
487
|
+
raise TypeError("claimed_insight_ids must be a tuple")
|
|
488
|
+
if type(self.selected_action) is not FiniteTreatmentAction:
|
|
489
|
+
raise TypeError("selected_action must be exact")
|
|
490
|
+
if type(self.violations) is not tuple or any(
|
|
491
|
+
type(value) is not TreatmentComplianceViolation
|
|
492
|
+
for value in self.violations
|
|
493
|
+
):
|
|
494
|
+
raise TypeError("violations must contain exact values")
|
|
495
|
+
if self.violations != tuple(sorted(set(self.violations), key=str)):
|
|
496
|
+
raise ValueError("violations must be unique and canonical")
|
|
497
|
+
if type(self.policy_id) is not str or not self.policy_id:
|
|
498
|
+
raise ValueError("policy_id must be non-empty")
|
|
499
|
+
if type(self.policy_version) is not int or self.policy_version <= 0:
|
|
500
|
+
raise ValueError("policy_version must be positive")
|
|
501
|
+
require_sha256(self.policy_definition_sha256, "policy_definition_sha256")
|
|
502
|
+
if self.evaluator_entered is not False:
|
|
503
|
+
raise ValueError(
|
|
504
|
+
"treatment admission receipts are issued before evaluator entry"
|
|
505
|
+
)
|
|
506
|
+
object.__setattr__(
|
|
507
|
+
self,
|
|
508
|
+
"receipt_sha256",
|
|
509
|
+
_hash("treatment-admission-receipt", self.to_record()),
|
|
510
|
+
)
|
|
511
|
+
|
|
512
|
+
@property
|
|
513
|
+
def passed(self) -> bool:
|
|
514
|
+
return not self.violations
|
|
515
|
+
|
|
516
|
+
def to_record(self) -> dict[str, object]:
|
|
517
|
+
return {
|
|
518
|
+
"schema_version": 1,
|
|
519
|
+
"preflight_receipt_sha256": self.preflight_receipt_sha256,
|
|
520
|
+
"claimed_insight_ids": list(self.claimed_insight_ids),
|
|
521
|
+
"selected_action": self.selected_action.to_record(),
|
|
522
|
+
"violations": [value.value for value in self.violations],
|
|
523
|
+
"policy_id": self.policy_id,
|
|
524
|
+
"policy_version": self.policy_version,
|
|
525
|
+
"policy_definition_sha256": self.policy_definition_sha256,
|
|
526
|
+
"evaluator_entered": self.evaluator_entered,
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
|
|
530
|
+
class TreatmentComplianceRejected(ValueError):
|
|
531
|
+
"""Expected model-treatment mismatch; the evaluator must not run."""
|
|
532
|
+
|
|
533
|
+
def __init__(self, receipt: TreatmentAdmissionReceipt) -> None:
|
|
534
|
+
if type(receipt) is not TreatmentAdmissionReceipt or receipt.passed:
|
|
535
|
+
raise ValueError("rejection requires a failed admission receipt")
|
|
536
|
+
super().__init__("model proposal failed its assigned treatment contract")
|
|
537
|
+
self.receipt = receipt
|
|
538
|
+
|
|
539
|
+
|
|
540
|
+
@runtime_checkable
|
|
541
|
+
class TreatmentCompliancePolicy(Protocol):
|
|
542
|
+
policy_id: str
|
|
543
|
+
policy_version: int
|
|
544
|
+
definition_sha256: str
|
|
545
|
+
|
|
546
|
+
def preflight(
|
|
547
|
+
self, request: TreatmentPreflightRequest
|
|
548
|
+
) -> TreatmentPreflightReceipt: ...
|
|
549
|
+
|
|
550
|
+
def assess(
|
|
551
|
+
self, request: TreatmentAdmissionRequest
|
|
552
|
+
) -> TreatmentAdmissionReceipt: ...
|
|
553
|
+
|
|
554
|
+
|
|
555
|
+
@dataclass(frozen=True, slots=True)
|
|
556
|
+
class StrictTreatmentCompliancePolicy:
|
|
557
|
+
"""Machine-verifiable treatment fidelity over a shared finite palette."""
|
|
558
|
+
|
|
559
|
+
policy_id: str = TREATMENT_COMPLIANCE_POLICY_ID
|
|
560
|
+
policy_version: int = TREATMENT_COMPLIANCE_POLICY_VERSION
|
|
561
|
+
definition_sha256: str = TREATMENT_COMPLIANCE_DEFINITION_SHA256
|
|
562
|
+
|
|
563
|
+
def preflight(
|
|
564
|
+
self, request: TreatmentPreflightRequest
|
|
565
|
+
) -> TreatmentPreflightReceipt:
|
|
566
|
+
TreatmentPreflightRequest.__post_init__(request)
|
|
567
|
+
violations: set[TreatmentComplianceViolation] = set()
|
|
568
|
+
expected = request.requirement.required_insights
|
|
569
|
+
observed = tuple(value.reference for value in request.insights)
|
|
570
|
+
if observed != expected:
|
|
571
|
+
violations.add(TreatmentComplianceViolation.ASSIGNMENT_MISMATCH)
|
|
572
|
+
observed_bindings = tuple(value.binding() for value in request.insights)
|
|
573
|
+
if observed_bindings != request.requirement.insight_bindings:
|
|
574
|
+
violations.add(
|
|
575
|
+
TreatmentComplianceViolation.INSIGHT_EVIDENCE_MISMATCH
|
|
576
|
+
)
|
|
577
|
+
if (
|
|
578
|
+
request.finite_contract_sha256
|
|
579
|
+
!= request.requirement.finite_contract_sha256
|
|
580
|
+
):
|
|
581
|
+
violations.add(TreatmentComplianceViolation.FINITE_CONTRACT_MISMATCH)
|
|
582
|
+
trusted_action_bindings = {
|
|
583
|
+
action.binding() for action in request.actions
|
|
584
|
+
}
|
|
585
|
+
if not set(request.requirement.allowed_actions).issubset(
|
|
586
|
+
trusted_action_bindings
|
|
587
|
+
):
|
|
588
|
+
violations.add(
|
|
589
|
+
TreatmentComplianceViolation.EXACT_ACTION_BINDING_MISMATCH
|
|
590
|
+
)
|
|
591
|
+
for insight in request.insights:
|
|
592
|
+
if (
|
|
593
|
+
insight.applicable_operator_kinds
|
|
594
|
+
and request.operator_kind not in insight.applicable_operator_kinds
|
|
595
|
+
):
|
|
596
|
+
violations.add(TreatmentComplianceViolation.OPERATOR_INAPPLICABLE)
|
|
597
|
+
if request.requirement.require_changed_path_overlap and not _overlaps_any(
|
|
598
|
+
request.editable_paths, insight.affected_paths
|
|
599
|
+
):
|
|
600
|
+
violations.add(TreatmentComplianceViolation.EDITABLE_PATH_DISJOINT)
|
|
601
|
+
|
|
602
|
+
family_sets = [
|
|
603
|
+
set(insight.recommended_option_families)
|
|
604
|
+
for insight in request.insights
|
|
605
|
+
]
|
|
606
|
+
if request.requirement.require_option_family_match and any(
|
|
607
|
+
not values for values in family_sets
|
|
608
|
+
):
|
|
609
|
+
violations.add(TreatmentComplianceViolation.INTERVENTION_FAMILY_MISSING)
|
|
610
|
+
common_families = (
|
|
611
|
+
set.intersection(*family_sets) if family_sets else set()
|
|
612
|
+
)
|
|
613
|
+
compatible = tuple(
|
|
614
|
+
action
|
|
615
|
+
for action in request.actions
|
|
616
|
+
if action.binding() in request.requirement.allowed_actions
|
|
617
|
+
and (
|
|
618
|
+
not request.requirement.require_option_family_match
|
|
619
|
+
or action.family in common_families
|
|
620
|
+
)
|
|
621
|
+
and (
|
|
622
|
+
not request.requirement.require_changed_path_overlap
|
|
623
|
+
or all(
|
|
624
|
+
_overlaps_any(action.changed_paths, insight.affected_paths)
|
|
625
|
+
for insight in request.insights
|
|
626
|
+
)
|
|
627
|
+
)
|
|
628
|
+
)
|
|
629
|
+
if not compatible:
|
|
630
|
+
violations.add(TreatmentComplianceViolation.NO_COMPATIBLE_FINITE_ACTION)
|
|
631
|
+
return TreatmentPreflightReceipt(
|
|
632
|
+
requirement_sha256=request.requirement.requirement_sha256,
|
|
633
|
+
finite_contract_sha256=request.finite_contract_sha256,
|
|
634
|
+
compatible_actions=compatible,
|
|
635
|
+
compatible_families=tuple(sorted({value.family for value in compatible})),
|
|
636
|
+
violations=tuple(sorted(violations, key=str)),
|
|
637
|
+
policy_id=self.policy_id,
|
|
638
|
+
policy_version=self.policy_version,
|
|
639
|
+
policy_definition_sha256=self.definition_sha256,
|
|
640
|
+
)
|
|
641
|
+
|
|
642
|
+
def assess(
|
|
643
|
+
self, request: TreatmentAdmissionRequest
|
|
644
|
+
) -> TreatmentAdmissionReceipt:
|
|
645
|
+
TreatmentAdmissionRequest.__post_init__(request)
|
|
646
|
+
violations: set[TreatmentComplianceViolation] = set()
|
|
647
|
+
claims = request.claimed_insight_ids
|
|
648
|
+
required_ids = tuple(
|
|
649
|
+
value.insight_id.value for value in request.requirement.required_insights
|
|
650
|
+
)
|
|
651
|
+
if len(set(claims)) != len(claims):
|
|
652
|
+
violations.add(TreatmentComplianceViolation.DUPLICATE_CLAIM)
|
|
653
|
+
if not set(claims).issubset(required_ids):
|
|
654
|
+
violations.add(TreatmentComplianceViolation.FOREIGN_CLAIM)
|
|
655
|
+
if (
|
|
656
|
+
request.requirement.claim_mode is TreatmentClaimMode.EXACT_REQUIRED
|
|
657
|
+
and set(claims) != set(required_ids)
|
|
658
|
+
):
|
|
659
|
+
violations.add(TreatmentComplianceViolation.EXACT_CLAIM_MISMATCH)
|
|
660
|
+
if not request.operator_compliant:
|
|
661
|
+
violations.add(TreatmentComplianceViolation.OPERATOR_NONCOMPLIANT)
|
|
662
|
+
if request.selected_action not in request.preflight.compatible_actions:
|
|
663
|
+
violations.add(TreatmentComplianceViolation.SELECTED_ACTION_INCOMPATIBLE)
|
|
664
|
+
return TreatmentAdmissionReceipt(
|
|
665
|
+
preflight_receipt_sha256=request.preflight.receipt_sha256,
|
|
666
|
+
claimed_insight_ids=claims,
|
|
667
|
+
selected_action=request.selected_action,
|
|
668
|
+
violations=tuple(sorted(violations, key=str)),
|
|
669
|
+
policy_id=self.policy_id,
|
|
670
|
+
policy_version=self.policy_version,
|
|
671
|
+
policy_definition_sha256=self.definition_sha256,
|
|
672
|
+
)
|
|
673
|
+
|
|
674
|
+
|
|
675
|
+
def validate_treatment_preflight_receipt(
|
|
676
|
+
request: TreatmentPreflightRequest,
|
|
677
|
+
receipt: TreatmentPreflightReceipt,
|
|
678
|
+
) -> None:
|
|
679
|
+
"""Independently enforce exact-action invariants on an injected policy."""
|
|
680
|
+
|
|
681
|
+
if type(request) is not TreatmentPreflightRequest:
|
|
682
|
+
raise TypeError("request must be an exact TreatmentPreflightRequest")
|
|
683
|
+
TreatmentPreflightRequest.__post_init__(request)
|
|
684
|
+
if type(receipt) is not TreatmentPreflightReceipt:
|
|
685
|
+
raise TypeError("receipt must be an exact TreatmentPreflightReceipt")
|
|
686
|
+
TreatmentPreflightReceipt.__post_init__(receipt)
|
|
687
|
+
if receipt.requirement_sha256 != request.requirement.requirement_sha256:
|
|
688
|
+
raise ValueError("preflight receipt changed the treatment requirement")
|
|
689
|
+
if receipt.finite_contract_sha256 != request.finite_contract_sha256:
|
|
690
|
+
raise ValueError("preflight receipt changed the finite contract")
|
|
691
|
+
trusted_actions = set(request.actions)
|
|
692
|
+
if any(action not in trusted_actions for action in receipt.compatible_actions):
|
|
693
|
+
raise ValueError("preflight receipt introduced an untrusted finite action")
|
|
694
|
+
if receipt.compatible_families != tuple(
|
|
695
|
+
sorted({action.family for action in receipt.compatible_actions})
|
|
696
|
+
):
|
|
697
|
+
raise ValueError("preflight receipt family projection is inconsistent")
|
|
698
|
+
|
|
699
|
+
core_receipt = StrictTreatmentCompliancePolicy().preflight(request)
|
|
700
|
+
core_violations = set(core_receipt.violations)
|
|
701
|
+
if not core_violations.issubset(receipt.violations):
|
|
702
|
+
raise ValueError("preflight receipt omitted a mandatory core violation")
|
|
703
|
+
if receipt.passed and (
|
|
704
|
+
not receipt.compatible_actions
|
|
705
|
+
or not set(receipt.compatible_actions).issubset(
|
|
706
|
+
core_receipt.compatible_actions
|
|
707
|
+
)
|
|
708
|
+
):
|
|
709
|
+
raise ValueError(
|
|
710
|
+
"passing preflight must retain a nonempty trusted compatible subset"
|
|
711
|
+
)
|
|
712
|
+
|
|
713
|
+
|
|
714
|
+
def validate_treatment_admission_receipt(
|
|
715
|
+
request: TreatmentAdmissionRequest,
|
|
716
|
+
receipt: TreatmentAdmissionReceipt,
|
|
717
|
+
) -> None:
|
|
718
|
+
"""Verify echoed proposal facts and mandatory pre-evaluator violations."""
|
|
719
|
+
|
|
720
|
+
if type(request) is not TreatmentAdmissionRequest:
|
|
721
|
+
raise TypeError("request must be an exact TreatmentAdmissionRequest")
|
|
722
|
+
TreatmentAdmissionRequest.__post_init__(request)
|
|
723
|
+
if type(receipt) is not TreatmentAdmissionReceipt:
|
|
724
|
+
raise TypeError("receipt must be an exact TreatmentAdmissionReceipt")
|
|
725
|
+
TreatmentAdmissionReceipt.__post_init__(receipt)
|
|
726
|
+
if receipt.preflight_receipt_sha256 != request.preflight.receipt_sha256:
|
|
727
|
+
raise ValueError("admission receipt changed the preflight identity")
|
|
728
|
+
if receipt.claimed_insight_ids != request.claimed_insight_ids:
|
|
729
|
+
raise ValueError("admission receipt changed the model's insight claims")
|
|
730
|
+
if receipt.selected_action != request.selected_action:
|
|
731
|
+
raise ValueError("admission receipt changed the selected finite action")
|
|
732
|
+
|
|
733
|
+
core_receipt = StrictTreatmentCompliancePolicy().assess(request)
|
|
734
|
+
if not set(core_receipt.violations).issubset(receipt.violations):
|
|
735
|
+
raise ValueError("admission receipt omitted a mandatory core violation")
|
|
736
|
+
|
|
737
|
+
|
|
738
|
+
__all__ = [
|
|
739
|
+
"FiniteTreatmentAction",
|
|
740
|
+
"InsightTreatmentRequirement",
|
|
741
|
+
"StrictTreatmentCompliancePolicy",
|
|
742
|
+
"TREATMENT_COMPLIANCE_DEFINITION_SHA256",
|
|
743
|
+
"TREATMENT_COMPLIANCE_POLICY_ID",
|
|
744
|
+
"TREATMENT_COMPLIANCE_POLICY_VERSION",
|
|
745
|
+
"TreatmentAdmissionReceipt",
|
|
746
|
+
"TreatmentAdmissionRequest",
|
|
747
|
+
"TreatmentActionBinding",
|
|
748
|
+
"TreatmentAssignmentRole",
|
|
749
|
+
"TreatmentClaimMode",
|
|
750
|
+
"TreatmentCompliancePolicy",
|
|
751
|
+
"TreatmentComplianceRejected",
|
|
752
|
+
"TreatmentComplianceViolation",
|
|
753
|
+
"TreatmentInsightEvidence",
|
|
754
|
+
"TreatmentInsightBinding",
|
|
755
|
+
"TreatmentPreflightReceipt",
|
|
756
|
+
"TreatmentPreflightRequest",
|
|
757
|
+
"validate_treatment_admission_receipt",
|
|
758
|
+
"validate_treatment_preflight_receipt",
|
|
759
|
+
]
|