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,557 @@
|
|
|
1
|
+
"""Provider-neutral compilation of memory hypotheses into executable tests.
|
|
2
|
+
|
|
3
|
+
The memory bank owns immutable, evidence-lined hypotheses. A benchmark owns
|
|
4
|
+
the meaning of an action template in its current parent-bound variation
|
|
5
|
+
catalog. This port is the dependency-inversion seam between those two facts:
|
|
6
|
+
trusted benchmark code may bind a hypothesis to exact finite options, but it
|
|
7
|
+
cannot edit the hypothesis, relax the catalog, or observe candidate outcomes.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import hashlib
|
|
13
|
+
import json
|
|
14
|
+
import re
|
|
15
|
+
from dataclasses import dataclass, field
|
|
16
|
+
from enum import Enum
|
|
17
|
+
from typing import Protocol, runtime_checkable
|
|
18
|
+
|
|
19
|
+
from agent_evolve.domain.finite_variation import (
|
|
20
|
+
FiniteVariationContract,
|
|
21
|
+
validate_finite_variation_contract,
|
|
22
|
+
)
|
|
23
|
+
from agent_evolve.domain.ids import CandidateId
|
|
24
|
+
from agent_evolve.domain.insight import InsightRef
|
|
25
|
+
from agent_evolve.domain.patch import require_sha256
|
|
26
|
+
from agent_evolve.ports.agentic_generator import InsightDraft, MetricEffectPrediction
|
|
27
|
+
from agent_evolve.policies.memory.treatment_compliance import TreatmentActionBinding
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
_TOKEN = re.compile(r"^[a-z][a-z0-9_.-]{0,95}$")
|
|
31
|
+
_PATH = re.compile(
|
|
32
|
+
r"^\$\.[^.\[\]\s]+(?:\.[^.\[\]\s]+|\[(?:0|[1-9][0-9]*)\])*$"
|
|
33
|
+
)
|
|
34
|
+
_COMPILATION_DOMAIN = b"agent-evolve:hypothesis-compilation:v1\x00"
|
|
35
|
+
_SPEC_DOMAIN = b"agent-evolve:executable-hypothesis-test-spec:v1\x00"
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _canonical_json(value: object) -> bytes:
|
|
39
|
+
return json.dumps(
|
|
40
|
+
value,
|
|
41
|
+
ensure_ascii=True,
|
|
42
|
+
allow_nan=False,
|
|
43
|
+
separators=(",", ":"),
|
|
44
|
+
sort_keys=True,
|
|
45
|
+
).encode("ascii")
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def _hash(domain: bytes, value: object) -> str:
|
|
49
|
+
return hashlib.sha256(domain + _canonical_json(value)).hexdigest()
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _canonical_tokens(values: tuple[str, ...], *, name: str) -> None:
|
|
53
|
+
if type(values) is not tuple or any(
|
|
54
|
+
type(value) is not str or _TOKEN.fullmatch(value) is None
|
|
55
|
+
for value in values
|
|
56
|
+
):
|
|
57
|
+
raise TypeError(f"{name} must contain canonical token strings")
|
|
58
|
+
if values != tuple(sorted(set(values))):
|
|
59
|
+
raise ValueError(f"{name} must be unique and canonically sorted")
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def _canonical_paths(values: tuple[str, ...], *, name: str) -> None:
|
|
63
|
+
if type(values) is not tuple or any(
|
|
64
|
+
type(value) is not str or _PATH.fullmatch(value) is None
|
|
65
|
+
for value in values
|
|
66
|
+
):
|
|
67
|
+
raise TypeError(f"{name} must contain canonical rooted JSON paths")
|
|
68
|
+
if values != tuple(sorted(set(values))):
|
|
69
|
+
raise ValueError(f"{name} must be unique and canonically sorted")
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def _path_segments(value: str) -> tuple[str, ...]:
|
|
73
|
+
"""Return comparison segments for a canonical rooted JSON path.
|
|
74
|
+
|
|
75
|
+
The executable-hypothesis boundary does not interpret candidate values, but
|
|
76
|
+
it must reject a compiler claiming that ``$.model`` is held fixed while
|
|
77
|
+
mutating ``$.model.width`` (and the converse). Separators are retained only
|
|
78
|
+
as structural boundaries; quoted/escaped JSONPath dialects are deliberately
|
|
79
|
+
outside this closed contract.
|
|
80
|
+
"""
|
|
81
|
+
|
|
82
|
+
if _PATH.fullmatch(value) is None:
|
|
83
|
+
raise ValueError("path must be a canonical rooted JSON path")
|
|
84
|
+
tail = value[1:]
|
|
85
|
+
return tuple(
|
|
86
|
+
part
|
|
87
|
+
for part in re.split(r"(?:\.|\[|\])", tail)
|
|
88
|
+
if part
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def _paths_overlap(left: str, right: str) -> bool:
|
|
93
|
+
left_segments = _path_segments(left)
|
|
94
|
+
right_segments = _path_segments(right)
|
|
95
|
+
common = min(len(left_segments), len(right_segments))
|
|
96
|
+
return left_segments[:common] == right_segments[:common]
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
@dataclass(frozen=True, slots=True)
|
|
100
|
+
class HypothesisCompilationRequest:
|
|
101
|
+
"""Outcome-blind request to bind one exact hypothesis to one parent."""
|
|
102
|
+
|
|
103
|
+
reference: InsightRef
|
|
104
|
+
insight: InsightDraft
|
|
105
|
+
source_evidence_sha256: str
|
|
106
|
+
requested_operator_kind: str
|
|
107
|
+
source_operator_kinds: tuple[str, ...]
|
|
108
|
+
parent_candidate_id: CandidateId
|
|
109
|
+
parent_configuration_sha256: str
|
|
110
|
+
finite_contract: FiniteVariationContract
|
|
111
|
+
context_projection_sha256: str
|
|
112
|
+
endpoint_definition_sha256: str
|
|
113
|
+
|
|
114
|
+
def __post_init__(self) -> None:
|
|
115
|
+
if type(self.reference) is not InsightRef:
|
|
116
|
+
raise TypeError("reference must be an exact InsightRef")
|
|
117
|
+
InsightRef.__post_init__(self.reference)
|
|
118
|
+
if type(self.insight) is not InsightDraft:
|
|
119
|
+
raise TypeError("insight must be an exact InsightDraft")
|
|
120
|
+
InsightDraft.__post_init__(self.insight)
|
|
121
|
+
if not self.insight.has_intervention_contract:
|
|
122
|
+
raise ValueError(
|
|
123
|
+
"hypothesis compilation requires an intervention-contract insight"
|
|
124
|
+
)
|
|
125
|
+
require_sha256(self.source_evidence_sha256, "source_evidence_sha256")
|
|
126
|
+
if (
|
|
127
|
+
type(self.requested_operator_kind) is not str
|
|
128
|
+
or _TOKEN.fullmatch(self.requested_operator_kind) is None
|
|
129
|
+
):
|
|
130
|
+
raise ValueError("requested_operator_kind must use the token grammar")
|
|
131
|
+
_canonical_tokens(
|
|
132
|
+
self.source_operator_kinds,
|
|
133
|
+
name="source_operator_kinds",
|
|
134
|
+
)
|
|
135
|
+
if not self.source_operator_kinds:
|
|
136
|
+
raise ValueError("source_operator_kinds must be non-empty")
|
|
137
|
+
if type(self.parent_candidate_id) is not CandidateId:
|
|
138
|
+
raise TypeError("parent_candidate_id must be an exact CandidateId")
|
|
139
|
+
CandidateId.__post_init__(self.parent_candidate_id)
|
|
140
|
+
require_sha256(
|
|
141
|
+
self.parent_configuration_sha256,
|
|
142
|
+
"parent_configuration_sha256",
|
|
143
|
+
)
|
|
144
|
+
validate_finite_variation_contract(self.finite_contract)
|
|
145
|
+
if (
|
|
146
|
+
self.finite_contract.parent_configuration_sha256
|
|
147
|
+
!= self.parent_configuration_sha256
|
|
148
|
+
):
|
|
149
|
+
raise ValueError("finite contract is bound to a different parent")
|
|
150
|
+
require_sha256(
|
|
151
|
+
self.context_projection_sha256,
|
|
152
|
+
"context_projection_sha256",
|
|
153
|
+
)
|
|
154
|
+
require_sha256(
|
|
155
|
+
self.endpoint_definition_sha256,
|
|
156
|
+
"endpoint_definition_sha256",
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
def to_record(self) -> dict[str, object]:
|
|
160
|
+
self.__post_init__()
|
|
161
|
+
return {
|
|
162
|
+
"schema_version": 1,
|
|
163
|
+
"reference": {
|
|
164
|
+
"insight_id": self.reference.insight_id.value,
|
|
165
|
+
"version": self.reference.version,
|
|
166
|
+
},
|
|
167
|
+
"insight_content_sha256": self.insight.content_sha256,
|
|
168
|
+
"source_evidence_sha256": self.source_evidence_sha256,
|
|
169
|
+
"requested_operator_kind": self.requested_operator_kind,
|
|
170
|
+
"source_operator_kinds": list(self.source_operator_kinds),
|
|
171
|
+
"parent_candidate_id": self.parent_candidate_id.value,
|
|
172
|
+
"parent_configuration_sha256": self.parent_configuration_sha256,
|
|
173
|
+
"finite_contract_sha256": self.finite_contract.identity_sha256,
|
|
174
|
+
"context_projection_sha256": self.context_projection_sha256,
|
|
175
|
+
"endpoint_definition_sha256": self.endpoint_definition_sha256,
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
@property
|
|
179
|
+
def request_sha256(self) -> str:
|
|
180
|
+
return _hash(_COMPILATION_DOMAIN, self.to_record())
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
@dataclass(frozen=True, slots=True)
|
|
184
|
+
class ExecutableHypothesisTestSpec:
|
|
185
|
+
"""Exact parent-bound intervention and falsification contract."""
|
|
186
|
+
|
|
187
|
+
request_sha256: str
|
|
188
|
+
reference: InsightRef
|
|
189
|
+
insight_content_sha256: str
|
|
190
|
+
source_evidence_sha256: str
|
|
191
|
+
requested_operator_kind: str
|
|
192
|
+
source_operator_kinds: tuple[str, ...]
|
|
193
|
+
executable_operator_kinds: tuple[str, ...]
|
|
194
|
+
parent_candidate_id: CandidateId
|
|
195
|
+
parent_configuration_sha256: str
|
|
196
|
+
finite_contract_sha256: str
|
|
197
|
+
context_projection_sha256: str
|
|
198
|
+
endpoint_definition_sha256: str
|
|
199
|
+
allowed_actions: tuple[TreatmentActionBinding, ...]
|
|
200
|
+
recommended_option_families: tuple[str, ...]
|
|
201
|
+
affected_paths: tuple[str, ...]
|
|
202
|
+
held_fixed_paths: tuple[str, ...]
|
|
203
|
+
effect_predictions: tuple[MetricEffectPrediction, ...]
|
|
204
|
+
falsification_condition: str
|
|
205
|
+
compiler_policy_id: str
|
|
206
|
+
compiler_policy_version: int
|
|
207
|
+
compiler_definition_sha256: str
|
|
208
|
+
spec_sha256: str = field(init=False)
|
|
209
|
+
|
|
210
|
+
def __post_init__(self) -> None:
|
|
211
|
+
for name in (
|
|
212
|
+
"request_sha256",
|
|
213
|
+
"insight_content_sha256",
|
|
214
|
+
"source_evidence_sha256",
|
|
215
|
+
"parent_configuration_sha256",
|
|
216
|
+
"finite_contract_sha256",
|
|
217
|
+
"context_projection_sha256",
|
|
218
|
+
"endpoint_definition_sha256",
|
|
219
|
+
"compiler_definition_sha256",
|
|
220
|
+
):
|
|
221
|
+
require_sha256(getattr(self, name), name)
|
|
222
|
+
if type(self.reference) is not InsightRef:
|
|
223
|
+
raise TypeError("reference must be an exact InsightRef")
|
|
224
|
+
InsightRef.__post_init__(self.reference)
|
|
225
|
+
if (
|
|
226
|
+
type(self.requested_operator_kind) is not str
|
|
227
|
+
or _TOKEN.fullmatch(self.requested_operator_kind) is None
|
|
228
|
+
):
|
|
229
|
+
raise ValueError("requested_operator_kind must use the token grammar")
|
|
230
|
+
_canonical_tokens(
|
|
231
|
+
self.source_operator_kinds,
|
|
232
|
+
name="source_operator_kinds",
|
|
233
|
+
)
|
|
234
|
+
if not self.source_operator_kinds:
|
|
235
|
+
raise ValueError("source_operator_kinds must be non-empty")
|
|
236
|
+
_canonical_tokens(
|
|
237
|
+
self.executable_operator_kinds,
|
|
238
|
+
name="executable_operator_kinds",
|
|
239
|
+
)
|
|
240
|
+
if self.executable_operator_kinds != (self.requested_operator_kind,):
|
|
241
|
+
raise ValueError(
|
|
242
|
+
"executable operator scope must equal the requested singleton"
|
|
243
|
+
)
|
|
244
|
+
if type(self.parent_candidate_id) is not CandidateId:
|
|
245
|
+
raise TypeError("parent_candidate_id must be an exact CandidateId")
|
|
246
|
+
CandidateId.__post_init__(self.parent_candidate_id)
|
|
247
|
+
if type(self.allowed_actions) is not tuple or not self.allowed_actions:
|
|
248
|
+
raise ValueError("an executable hypothesis needs allowed actions")
|
|
249
|
+
if any(
|
|
250
|
+
type(value) is not TreatmentActionBinding
|
|
251
|
+
for value in self.allowed_actions
|
|
252
|
+
):
|
|
253
|
+
raise TypeError("allowed_actions must contain exact action bindings")
|
|
254
|
+
for action in self.allowed_actions:
|
|
255
|
+
TreatmentActionBinding.__post_init__(action)
|
|
256
|
+
if self.allowed_actions != tuple(
|
|
257
|
+
sorted(
|
|
258
|
+
set(self.allowed_actions),
|
|
259
|
+
key=lambda value: (value.option_id, value.option_identity_sha256),
|
|
260
|
+
)
|
|
261
|
+
):
|
|
262
|
+
raise ValueError("allowed_actions must be unique and canonical")
|
|
263
|
+
if len({value.option_id for value in self.allowed_actions}) != len(
|
|
264
|
+
self.allowed_actions
|
|
265
|
+
):
|
|
266
|
+
raise ValueError("allowed action option IDs must be unique")
|
|
267
|
+
_canonical_tokens(
|
|
268
|
+
self.recommended_option_families,
|
|
269
|
+
name="recommended_option_families",
|
|
270
|
+
)
|
|
271
|
+
if not self.recommended_option_families:
|
|
272
|
+
raise ValueError("an executable hypothesis needs an option family")
|
|
273
|
+
_canonical_paths(self.affected_paths, name="affected_paths")
|
|
274
|
+
_canonical_paths(self.held_fixed_paths, name="held_fixed_paths")
|
|
275
|
+
if not self.affected_paths:
|
|
276
|
+
raise ValueError("an executable hypothesis needs affected paths")
|
|
277
|
+
if any(
|
|
278
|
+
_paths_overlap(affected, held_fixed)
|
|
279
|
+
for affected in self.affected_paths
|
|
280
|
+
for held_fixed in self.held_fixed_paths
|
|
281
|
+
):
|
|
282
|
+
raise ValueError(
|
|
283
|
+
"affected and held-fixed paths must be hierarchically disjoint"
|
|
284
|
+
)
|
|
285
|
+
if type(self.effect_predictions) is not tuple or any(
|
|
286
|
+
type(value) is not MetricEffectPrediction
|
|
287
|
+
for value in self.effect_predictions
|
|
288
|
+
):
|
|
289
|
+
raise TypeError("effect_predictions must contain exact predictions")
|
|
290
|
+
for prediction in self.effect_predictions:
|
|
291
|
+
MetricEffectPrediction.__post_init__(prediction)
|
|
292
|
+
metric_ids = tuple(value.metric_id for value in self.effect_predictions)
|
|
293
|
+
if metric_ids != tuple(sorted(set(metric_ids))):
|
|
294
|
+
raise ValueError("effect predictions must be unique and canonical")
|
|
295
|
+
if (
|
|
296
|
+
type(self.falsification_condition) is not str
|
|
297
|
+
or not self.falsification_condition.strip()
|
|
298
|
+
or self.falsification_condition != self.falsification_condition.strip()
|
|
299
|
+
):
|
|
300
|
+
raise ValueError("falsification_condition must be canonical text")
|
|
301
|
+
if (
|
|
302
|
+
type(self.compiler_policy_id) is not str
|
|
303
|
+
or _TOKEN.fullmatch(self.compiler_policy_id) is None
|
|
304
|
+
):
|
|
305
|
+
raise ValueError("compiler_policy_id must use the token grammar")
|
|
306
|
+
if (
|
|
307
|
+
type(self.compiler_policy_version) is not int
|
|
308
|
+
or self.compiler_policy_version <= 0
|
|
309
|
+
):
|
|
310
|
+
raise ValueError("compiler_policy_version must be positive")
|
|
311
|
+
object.__setattr__(self, "spec_sha256", _hash(_SPEC_DOMAIN, self.to_record()))
|
|
312
|
+
|
|
313
|
+
def to_record(self) -> dict[str, object]:
|
|
314
|
+
return {
|
|
315
|
+
"schema_version": 1,
|
|
316
|
+
"request_sha256": self.request_sha256,
|
|
317
|
+
"reference": {
|
|
318
|
+
"insight_id": self.reference.insight_id.value,
|
|
319
|
+
"version": self.reference.version,
|
|
320
|
+
},
|
|
321
|
+
"insight_content_sha256": self.insight_content_sha256,
|
|
322
|
+
"source_evidence_sha256": self.source_evidence_sha256,
|
|
323
|
+
"requested_operator_kind": self.requested_operator_kind,
|
|
324
|
+
"source_operator_kinds": list(self.source_operator_kinds),
|
|
325
|
+
"executable_operator_kinds": list(self.executable_operator_kinds),
|
|
326
|
+
"parent_candidate_id": self.parent_candidate_id.value,
|
|
327
|
+
"parent_configuration_sha256": self.parent_configuration_sha256,
|
|
328
|
+
"finite_contract_sha256": self.finite_contract_sha256,
|
|
329
|
+
"context_projection_sha256": self.context_projection_sha256,
|
|
330
|
+
"endpoint_definition_sha256": self.endpoint_definition_sha256,
|
|
331
|
+
"allowed_actions": [value.to_record() for value in self.allowed_actions],
|
|
332
|
+
"recommended_option_families": list(self.recommended_option_families),
|
|
333
|
+
"affected_paths": list(self.affected_paths),
|
|
334
|
+
"held_fixed_paths": list(self.held_fixed_paths),
|
|
335
|
+
"effect_predictions": [
|
|
336
|
+
{
|
|
337
|
+
"metric_id": value.metric_id,
|
|
338
|
+
"direction": value.direction.value,
|
|
339
|
+
}
|
|
340
|
+
for value in self.effect_predictions
|
|
341
|
+
],
|
|
342
|
+
"falsification_condition": self.falsification_condition,
|
|
343
|
+
"compiler_policy_id": self.compiler_policy_id,
|
|
344
|
+
"compiler_policy_version": self.compiler_policy_version,
|
|
345
|
+
"compiler_definition_sha256": self.compiler_definition_sha256,
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
class HypothesisApplicabilityStatus(str, Enum):
|
|
350
|
+
APPLICABLE = "applicable"
|
|
351
|
+
INAPPLICABLE = "inapplicable"
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
@dataclass(frozen=True, slots=True)
|
|
355
|
+
class HypothesisCompilationReceipt:
|
|
356
|
+
"""Fail-closed compiler result; only applicable receipts carry a spec."""
|
|
357
|
+
|
|
358
|
+
request_sha256: str
|
|
359
|
+
status: HypothesisApplicabilityStatus
|
|
360
|
+
reason_codes: tuple[str, ...]
|
|
361
|
+
compiler_policy_id: str
|
|
362
|
+
compiler_policy_version: int
|
|
363
|
+
compiler_definition_sha256: str
|
|
364
|
+
spec: ExecutableHypothesisTestSpec | None
|
|
365
|
+
receipt_sha256: str = field(init=False)
|
|
366
|
+
|
|
367
|
+
def __post_init__(self) -> None:
|
|
368
|
+
require_sha256(self.request_sha256, "request_sha256")
|
|
369
|
+
if type(self.status) is not HypothesisApplicabilityStatus:
|
|
370
|
+
raise TypeError("status must be a HypothesisApplicabilityStatus")
|
|
371
|
+
_canonical_tokens(self.reason_codes, name="reason_codes")
|
|
372
|
+
if (
|
|
373
|
+
type(self.compiler_policy_id) is not str
|
|
374
|
+
or _TOKEN.fullmatch(self.compiler_policy_id) is None
|
|
375
|
+
):
|
|
376
|
+
raise ValueError("compiler_policy_id must use the token grammar")
|
|
377
|
+
if (
|
|
378
|
+
type(self.compiler_policy_version) is not int
|
|
379
|
+
or self.compiler_policy_version <= 0
|
|
380
|
+
):
|
|
381
|
+
raise ValueError("compiler_policy_version must be positive")
|
|
382
|
+
require_sha256(
|
|
383
|
+
self.compiler_definition_sha256,
|
|
384
|
+
"compiler_definition_sha256",
|
|
385
|
+
)
|
|
386
|
+
if self.status is HypothesisApplicabilityStatus.APPLICABLE:
|
|
387
|
+
if type(self.spec) is not ExecutableHypothesisTestSpec:
|
|
388
|
+
raise ValueError("an applicable receipt requires an exact spec")
|
|
389
|
+
ExecutableHypothesisTestSpec.__post_init__(self.spec)
|
|
390
|
+
if self.reason_codes:
|
|
391
|
+
raise ValueError("an applicable receipt cannot carry failure reasons")
|
|
392
|
+
if (
|
|
393
|
+
self.spec.request_sha256 != self.request_sha256
|
|
394
|
+
or self.spec.compiler_policy_id != self.compiler_policy_id
|
|
395
|
+
or self.spec.compiler_policy_version != self.compiler_policy_version
|
|
396
|
+
or self.spec.compiler_definition_sha256
|
|
397
|
+
!= self.compiler_definition_sha256
|
|
398
|
+
):
|
|
399
|
+
raise ValueError("compiler receipt and executable spec differ")
|
|
400
|
+
elif self.spec is not None or not self.reason_codes:
|
|
401
|
+
raise ValueError("an inapplicable receipt needs reasons and no spec")
|
|
402
|
+
object.__setattr__(
|
|
403
|
+
self,
|
|
404
|
+
"receipt_sha256",
|
|
405
|
+
_hash(_COMPILATION_DOMAIN, self.to_record()),
|
|
406
|
+
)
|
|
407
|
+
|
|
408
|
+
@property
|
|
409
|
+
def applicable(self) -> bool:
|
|
410
|
+
return self.status is HypothesisApplicabilityStatus.APPLICABLE
|
|
411
|
+
|
|
412
|
+
def to_record(self) -> dict[str, object]:
|
|
413
|
+
return {
|
|
414
|
+
"schema_version": 1,
|
|
415
|
+
"request_sha256": self.request_sha256,
|
|
416
|
+
"status": self.status.value,
|
|
417
|
+
"reason_codes": list(self.reason_codes),
|
|
418
|
+
"compiler_policy_id": self.compiler_policy_id,
|
|
419
|
+
"compiler_policy_version": self.compiler_policy_version,
|
|
420
|
+
"compiler_definition_sha256": self.compiler_definition_sha256,
|
|
421
|
+
"spec": None if self.spec is None else self.spec.to_record(),
|
|
422
|
+
"spec_sha256": None if self.spec is None else self.spec.spec_sha256,
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
|
|
426
|
+
@runtime_checkable
|
|
427
|
+
class HypothesisApplicabilityPort(Protocol):
|
|
428
|
+
policy_id: str
|
|
429
|
+
policy_version: int
|
|
430
|
+
definition_sha256: str
|
|
431
|
+
|
|
432
|
+
def compile(
|
|
433
|
+
self,
|
|
434
|
+
request: HypothesisCompilationRequest,
|
|
435
|
+
) -> HypothesisCompilationReceipt: ...
|
|
436
|
+
|
|
437
|
+
|
|
438
|
+
def validate_hypothesis_compiler_identity(
|
|
439
|
+
compiler: HypothesisApplicabilityPort,
|
|
440
|
+
receipt: HypothesisCompilationReceipt,
|
|
441
|
+
) -> None:
|
|
442
|
+
"""Bind a receipt to the injected compiler instance at the trust boundary."""
|
|
443
|
+
|
|
444
|
+
if not isinstance(compiler, HypothesisApplicabilityPort):
|
|
445
|
+
raise TypeError("compiler must implement HypothesisApplicabilityPort")
|
|
446
|
+
if type(receipt) is not HypothesisCompilationReceipt:
|
|
447
|
+
raise TypeError("receipt must be an exact HypothesisCompilationReceipt")
|
|
448
|
+
receipt.__post_init__()
|
|
449
|
+
observed = (
|
|
450
|
+
compiler.policy_id,
|
|
451
|
+
compiler.policy_version,
|
|
452
|
+
compiler.definition_sha256,
|
|
453
|
+
)
|
|
454
|
+
expected = (
|
|
455
|
+
receipt.compiler_policy_id,
|
|
456
|
+
receipt.compiler_policy_version,
|
|
457
|
+
receipt.compiler_definition_sha256,
|
|
458
|
+
)
|
|
459
|
+
if observed != expected:
|
|
460
|
+
raise ValueError("compiler identity changed across compilation")
|
|
461
|
+
|
|
462
|
+
|
|
463
|
+
def validate_hypothesis_compilation(
|
|
464
|
+
request: HypothesisCompilationRequest,
|
|
465
|
+
receipt: HypothesisCompilationReceipt,
|
|
466
|
+
) -> None:
|
|
467
|
+
"""Independently bind compiler output to the trusted request and catalog."""
|
|
468
|
+
|
|
469
|
+
if type(request) is not HypothesisCompilationRequest:
|
|
470
|
+
raise TypeError("request must be an exact HypothesisCompilationRequest")
|
|
471
|
+
request.__post_init__()
|
|
472
|
+
if type(receipt) is not HypothesisCompilationReceipt:
|
|
473
|
+
raise TypeError("receipt must be an exact HypothesisCompilationReceipt")
|
|
474
|
+
receipt.__post_init__()
|
|
475
|
+
if receipt.request_sha256 != request.request_sha256:
|
|
476
|
+
raise ValueError("compiler receipt is bound to a different request")
|
|
477
|
+
if not receipt.applicable:
|
|
478
|
+
return
|
|
479
|
+
spec = receipt.spec
|
|
480
|
+
assert spec is not None
|
|
481
|
+
expected = (
|
|
482
|
+
request.reference,
|
|
483
|
+
request.insight.content_sha256,
|
|
484
|
+
request.source_evidence_sha256,
|
|
485
|
+
request.requested_operator_kind,
|
|
486
|
+
request.source_operator_kinds,
|
|
487
|
+
request.parent_candidate_id,
|
|
488
|
+
request.parent_configuration_sha256,
|
|
489
|
+
request.finite_contract.identity_sha256,
|
|
490
|
+
request.context_projection_sha256,
|
|
491
|
+
request.endpoint_definition_sha256,
|
|
492
|
+
)
|
|
493
|
+
observed = (
|
|
494
|
+
spec.reference,
|
|
495
|
+
spec.insight_content_sha256,
|
|
496
|
+
spec.source_evidence_sha256,
|
|
497
|
+
spec.requested_operator_kind,
|
|
498
|
+
spec.source_operator_kinds,
|
|
499
|
+
spec.parent_candidate_id,
|
|
500
|
+
spec.parent_configuration_sha256,
|
|
501
|
+
spec.finite_contract_sha256,
|
|
502
|
+
spec.context_projection_sha256,
|
|
503
|
+
spec.endpoint_definition_sha256,
|
|
504
|
+
)
|
|
505
|
+
if observed != expected:
|
|
506
|
+
raise ValueError("executable hypothesis spec changed trusted request identity")
|
|
507
|
+
if spec.executable_operator_kinds != (request.requested_operator_kind,):
|
|
508
|
+
raise ValueError("compiler broadened executable operator authority")
|
|
509
|
+
immutable_families = tuple(request.insight.recommended_option_families)
|
|
510
|
+
immutable_paths = tuple(sorted(set(request.insight.affected_paths)))
|
|
511
|
+
immutable_predictions = request.insight.effect_predictions
|
|
512
|
+
immutable_falsifier = request.insight.falsification_condition
|
|
513
|
+
if spec.recommended_option_families != immutable_families:
|
|
514
|
+
raise ValueError("compiler changed immutable recommended option families")
|
|
515
|
+
if spec.affected_paths != immutable_paths:
|
|
516
|
+
raise ValueError("compiler changed immutable affected paths")
|
|
517
|
+
if spec.effect_predictions != immutable_predictions:
|
|
518
|
+
raise ValueError("compiler changed immutable metric predictions")
|
|
519
|
+
if spec.falsification_condition != immutable_falsifier:
|
|
520
|
+
raise ValueError("compiler changed immutable falsification condition")
|
|
521
|
+
trusted = {
|
|
522
|
+
TreatmentActionBinding(option.option_id, option.identity_sha256)
|
|
523
|
+
for option in request.finite_contract.options
|
|
524
|
+
}
|
|
525
|
+
if not set(spec.allowed_actions).issubset(trusted):
|
|
526
|
+
raise ValueError("compiler introduced an action outside the finite contract")
|
|
527
|
+
families = {
|
|
528
|
+
request.finite_contract.resolve(action.option_id).family
|
|
529
|
+
for action in spec.allowed_actions
|
|
530
|
+
}
|
|
531
|
+
if not families.issubset(immutable_families):
|
|
532
|
+
raise ValueError("compiler mapped the hypothesis to a foreign action family")
|
|
533
|
+
exact_parent_ids = {
|
|
534
|
+
option_id
|
|
535
|
+
for option_id in request.insight.recommended_option_ids
|
|
536
|
+
if any(
|
|
537
|
+
option.option_id == option_id
|
|
538
|
+
for option in request.finite_contract.options
|
|
539
|
+
)
|
|
540
|
+
}
|
|
541
|
+
if exact_parent_ids and not {
|
|
542
|
+
action.option_id for action in spec.allowed_actions
|
|
543
|
+
}.issubset(exact_parent_ids):
|
|
544
|
+
raise ValueError(
|
|
545
|
+
"compiler ignored immutable exact recommendations valid for this parent"
|
|
546
|
+
)
|
|
547
|
+
|
|
548
|
+
|
|
549
|
+
__all__ = [
|
|
550
|
+
"ExecutableHypothesisTestSpec",
|
|
551
|
+
"HypothesisApplicabilityPort",
|
|
552
|
+
"HypothesisApplicabilityStatus",
|
|
553
|
+
"HypothesisCompilationReceipt",
|
|
554
|
+
"HypothesisCompilationRequest",
|
|
555
|
+
"validate_hypothesis_compiler_identity",
|
|
556
|
+
"validate_hypothesis_compilation",
|
|
557
|
+
]
|