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,649 @@
|
|
|
1
|
+
"""Generic batch boundary for adding proposal experts to campaign variation.
|
|
2
|
+
|
|
3
|
+
Parent-local benchmark catalogs remain the legal structural foundation. An
|
|
4
|
+
optional envelope policy may add sealed full-child options after observing the
|
|
5
|
+
strictly prior campaign archive. The policy is invoked once per portfolio
|
|
6
|
+
generation, across all parent lanes, so global acquisition and restart experts
|
|
7
|
+
can partition candidates without duplicating them independently in each lane.
|
|
8
|
+
|
|
9
|
+
This boundary owns no workload, model, provider, objective, or acquisition
|
|
10
|
+
implementation. It only authenticates chronology, lane identity, preservation
|
|
11
|
+
of the base legal support, and the exact enriched contracts returned to the
|
|
12
|
+
ordinary portfolio workflow.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import base64
|
|
18
|
+
import binascii
|
|
19
|
+
import hashlib
|
|
20
|
+
import json
|
|
21
|
+
import re
|
|
22
|
+
import zlib
|
|
23
|
+
from dataclasses import dataclass, field
|
|
24
|
+
from typing import Protocol, runtime_checkable
|
|
25
|
+
|
|
26
|
+
from agent_evolve.application.agentic_evolution import EvolutionCandidate
|
|
27
|
+
from agent_evolve.application.budgeted_optimizer import OptimizerState
|
|
28
|
+
from agent_evolve.application.evolution_campaign import (
|
|
29
|
+
ArchiveUtilitySnapshot,
|
|
30
|
+
ParentVariationBinding,
|
|
31
|
+
)
|
|
32
|
+
from agent_evolve.domain.patch import require_sha256
|
|
33
|
+
from agent_evolve.domain.typed_json import FrozenJsonObject, freeze_json, thaw_json
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
_TOKEN = re.compile(r"^[a-z][a-z0-9_.:-]{0,127}$")
|
|
37
|
+
_REQUEST_DOMAIN = b"agent-evolve:campaign-variation-envelope-request:v1\x00"
|
|
38
|
+
_RESULT_DOMAIN = b"agent-evolve:campaign-variation-envelope-result:v1\x00"
|
|
39
|
+
_CONTEXT_DOMAIN = b"agent-evolve:campaign-variation-envelope-context:v1\x00"
|
|
40
|
+
_TRACE_DOMAIN = b"agent-evolve:campaign-variation-envelope-trace:v2\x00"
|
|
41
|
+
_TRACE_PAYLOAD_MAX_UTF8_BYTES = 64 * 1024 * 1024
|
|
42
|
+
_TRACE_PAYLOAD_MAX_COMPRESSED_BYTES = 4 * 1024 * 1024
|
|
43
|
+
_TRACE_PAYLOAD_CHUNK_CHARACTERS = 32 * 1024
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _canonical_json(value: object) -> bytes:
|
|
47
|
+
return json.dumps(
|
|
48
|
+
value,
|
|
49
|
+
allow_nan=False,
|
|
50
|
+
ensure_ascii=True,
|
|
51
|
+
separators=(",", ":"),
|
|
52
|
+
sort_keys=True,
|
|
53
|
+
).encode("ascii", errors="strict")
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _hash(domain: bytes, value: object) -> str:
|
|
57
|
+
return hashlib.sha256(domain + _canonical_json(value)).hexdigest()
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def _policy_identity(value: object) -> tuple[str, int, str]:
|
|
61
|
+
policy_id = getattr(value, "policy_id", None)
|
|
62
|
+
policy_version = getattr(value, "policy_version", None)
|
|
63
|
+
definition_sha256 = getattr(value, "definition_sha256", None)
|
|
64
|
+
if definition_sha256 is None:
|
|
65
|
+
definition_sha256 = getattr(value, "policy_definition_sha256", None)
|
|
66
|
+
if type(policy_id) is not str or _TOKEN.fullmatch(policy_id) is None:
|
|
67
|
+
raise ValueError("variation-envelope policy_id has invalid syntax")
|
|
68
|
+
if type(policy_version) is not int or policy_version <= 0:
|
|
69
|
+
raise ValueError("variation-envelope policy_version must be positive")
|
|
70
|
+
require_sha256(definition_sha256, "variation-envelope definition_sha256")
|
|
71
|
+
return policy_id, policy_version, definition_sha256
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
@dataclass(frozen=True, slots=True)
|
|
75
|
+
class CampaignVariationEnvelopeLane:
|
|
76
|
+
"""One parent lane and its outcome-blind benchmark catalog binding."""
|
|
77
|
+
|
|
78
|
+
lane_id: str
|
|
79
|
+
parent: EvolutionCandidate
|
|
80
|
+
base_variation: ParentVariationBinding
|
|
81
|
+
|
|
82
|
+
def __post_init__(self) -> None:
|
|
83
|
+
if type(self.lane_id) is not str or _TOKEN.fullmatch(self.lane_id) is None:
|
|
84
|
+
raise ValueError("lane_id must use the closed token grammar")
|
|
85
|
+
if type(self.parent) is not EvolutionCandidate:
|
|
86
|
+
raise TypeError("parent must be an exact EvolutionCandidate")
|
|
87
|
+
EvolutionCandidate.__post_init__(self.parent)
|
|
88
|
+
if type(self.base_variation) is not ParentVariationBinding:
|
|
89
|
+
raise TypeError("base_variation must be exact")
|
|
90
|
+
ParentVariationBinding.__post_init__(self.base_variation)
|
|
91
|
+
if (
|
|
92
|
+
self.base_variation.parent_configuration_sha256
|
|
93
|
+
!= self.parent.occurrence.configuration_hash
|
|
94
|
+
):
|
|
95
|
+
raise ValueError("base variation is bound to another parent")
|
|
96
|
+
|
|
97
|
+
def to_record(self) -> dict[str, object]:
|
|
98
|
+
self.__post_init__()
|
|
99
|
+
return {
|
|
100
|
+
"lane_id": self.lane_id,
|
|
101
|
+
"parent_candidate_id": self.parent.candidate_id.value,
|
|
102
|
+
"parent_configuration_sha256": (
|
|
103
|
+
self.parent.occurrence.configuration_hash
|
|
104
|
+
),
|
|
105
|
+
"base_variation": self.base_variation.to_record(),
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
@dataclass(frozen=True, slots=True)
|
|
110
|
+
class CampaignVariationEnvelopeRequest:
|
|
111
|
+
"""Authenticated prior-only input to one global proposal envelope."""
|
|
112
|
+
|
|
113
|
+
campaign_scope_sha256: str
|
|
114
|
+
generation: int
|
|
115
|
+
evaluation_slots_per_lane: int
|
|
116
|
+
state: OptimizerState
|
|
117
|
+
archive_utility: ArchiveUtilitySnapshot
|
|
118
|
+
lanes: tuple[CampaignVariationEnvelopeLane, ...]
|
|
119
|
+
request_sha256: str = field(init=False, default="")
|
|
120
|
+
|
|
121
|
+
def __post_init__(self) -> None:
|
|
122
|
+
require_sha256(self.campaign_scope_sha256, "campaign_scope_sha256")
|
|
123
|
+
if type(self.generation) is not int or self.generation <= 0:
|
|
124
|
+
raise ValueError("generation must be positive")
|
|
125
|
+
if (
|
|
126
|
+
type(self.evaluation_slots_per_lane) is not int
|
|
127
|
+
or self.evaluation_slots_per_lane <= 0
|
|
128
|
+
):
|
|
129
|
+
raise ValueError("evaluation_slots_per_lane must be positive")
|
|
130
|
+
if type(self.state) is not OptimizerState:
|
|
131
|
+
raise TypeError("state must be an exact OptimizerState")
|
|
132
|
+
OptimizerState.__post_init__(self.state)
|
|
133
|
+
if self.state.generation != self.generation - 1:
|
|
134
|
+
raise ValueError("variation envelope received a non-prior state")
|
|
135
|
+
if type(self.archive_utility) is not ArchiveUtilitySnapshot:
|
|
136
|
+
raise TypeError("archive_utility must be exact")
|
|
137
|
+
ArchiveUtilitySnapshot.__post_init__(self.archive_utility)
|
|
138
|
+
if self.archive_utility.generation != self.generation:
|
|
139
|
+
raise ValueError("archive utility is stale for the envelope generation")
|
|
140
|
+
if type(self.lanes) is not tuple or not self.lanes:
|
|
141
|
+
raise ValueError("lanes must be a non-empty exact tuple")
|
|
142
|
+
if any(type(value) is not CampaignVariationEnvelopeLane for value in self.lanes):
|
|
143
|
+
raise TypeError("lanes must contain exact envelope lanes")
|
|
144
|
+
for value in self.lanes:
|
|
145
|
+
CampaignVariationEnvelopeLane.__post_init__(value)
|
|
146
|
+
lane_ids = tuple(value.lane_id for value in self.lanes)
|
|
147
|
+
if lane_ids != tuple(sorted(set(lane_ids))):
|
|
148
|
+
raise ValueError("variation-envelope lanes must be unique and sorted")
|
|
149
|
+
benchmark_ids = {
|
|
150
|
+
value.base_variation.benchmark_sha256 for value in self.lanes
|
|
151
|
+
}
|
|
152
|
+
if len(benchmark_ids) != 1:
|
|
153
|
+
raise ValueError("variation-envelope lanes target different benchmarks")
|
|
154
|
+
if self.archive_utility.benchmark_sha256 not in benchmark_ids:
|
|
155
|
+
raise ValueError("archive utility targets a different benchmark")
|
|
156
|
+
computed = _hash(_REQUEST_DOMAIN, self._unsigned_record())
|
|
157
|
+
if self.request_sha256 not in ("", computed):
|
|
158
|
+
raise ValueError("request_sha256 does not authenticate the request")
|
|
159
|
+
object.__setattr__(self, "request_sha256", computed)
|
|
160
|
+
|
|
161
|
+
def _unsigned_record(self) -> dict[str, object]:
|
|
162
|
+
return {
|
|
163
|
+
"schema_version": 1,
|
|
164
|
+
"campaign_scope_sha256": self.campaign_scope_sha256,
|
|
165
|
+
"generation": self.generation,
|
|
166
|
+
"evaluation_slots_per_lane": self.evaluation_slots_per_lane,
|
|
167
|
+
"optimizer_state": {
|
|
168
|
+
"generation": self.state.generation,
|
|
169
|
+
"archive_snapshot_sha256": self.state.archive_snapshot_hash,
|
|
170
|
+
"unique_evaluations": self.state.unique_evaluations,
|
|
171
|
+
"logical_llm_calls": self.state.logical_llm_calls,
|
|
172
|
+
"candidate_occurrences": [
|
|
173
|
+
{
|
|
174
|
+
"candidate_id": value.candidate_id.value,
|
|
175
|
+
"configuration_sha256": (
|
|
176
|
+
value.occurrence.configuration_hash
|
|
177
|
+
),
|
|
178
|
+
"objectives_hex": [
|
|
179
|
+
[metric_id, metric_value.hex()]
|
|
180
|
+
for metric_id, metric_value in value.objectives
|
|
181
|
+
],
|
|
182
|
+
"valid": value.valid,
|
|
183
|
+
}
|
|
184
|
+
for value in self.state.candidates
|
|
185
|
+
],
|
|
186
|
+
},
|
|
187
|
+
"archive_utility_sha256": self.archive_utility.snapshot_sha256,
|
|
188
|
+
"lanes": [value.to_record() for value in self.lanes],
|
|
189
|
+
"current_generation_outcomes_exposed": False,
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
def to_record(self) -> dict[str, object]:
|
|
193
|
+
self.__post_init__()
|
|
194
|
+
return {**self._unsigned_record(), "request_sha256": self.request_sha256}
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
@dataclass(frozen=True, slots=True)
|
|
198
|
+
class CampaignVariationEnvelopeLaneResult:
|
|
199
|
+
"""One enriched binding, preserving every base option by identity."""
|
|
200
|
+
|
|
201
|
+
lane_id: str
|
|
202
|
+
variation: ParentVariationBinding
|
|
203
|
+
|
|
204
|
+
def __post_init__(self) -> None:
|
|
205
|
+
if type(self.lane_id) is not str or _TOKEN.fullmatch(self.lane_id) is None:
|
|
206
|
+
raise ValueError("lane_id must use the closed token grammar")
|
|
207
|
+
if type(self.variation) is not ParentVariationBinding:
|
|
208
|
+
raise TypeError("variation must be exact")
|
|
209
|
+
ParentVariationBinding.__post_init__(self.variation)
|
|
210
|
+
|
|
211
|
+
def to_record(self) -> dict[str, object]:
|
|
212
|
+
self.__post_init__()
|
|
213
|
+
return {"lane_id": self.lane_id, "variation": self.variation.to_record()}
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
@dataclass(frozen=True, slots=True)
|
|
217
|
+
class CampaignVariationEnvelopeResult:
|
|
218
|
+
"""Exact per-lane enriched contracts and policy evidence."""
|
|
219
|
+
|
|
220
|
+
request_sha256: str
|
|
221
|
+
policy_id: str
|
|
222
|
+
policy_version: int
|
|
223
|
+
policy_definition_sha256: str
|
|
224
|
+
lanes: tuple[CampaignVariationEnvelopeLaneResult, ...]
|
|
225
|
+
evidence: FrozenJsonObject
|
|
226
|
+
result_sha256: str = field(init=False, default="")
|
|
227
|
+
|
|
228
|
+
def __post_init__(self) -> None:
|
|
229
|
+
require_sha256(self.request_sha256, "request_sha256")
|
|
230
|
+
_policy_identity(self)
|
|
231
|
+
if type(self.lanes) is not tuple or not self.lanes:
|
|
232
|
+
raise ValueError("lanes must be a non-empty exact tuple")
|
|
233
|
+
if any(
|
|
234
|
+
type(value) is not CampaignVariationEnvelopeLaneResult
|
|
235
|
+
for value in self.lanes
|
|
236
|
+
):
|
|
237
|
+
raise TypeError("lanes must contain exact result lanes")
|
|
238
|
+
for value in self.lanes:
|
|
239
|
+
CampaignVariationEnvelopeLaneResult.__post_init__(value)
|
|
240
|
+
lane_ids = tuple(value.lane_id for value in self.lanes)
|
|
241
|
+
if lane_ids != tuple(sorted(set(lane_ids))):
|
|
242
|
+
raise ValueError("result lanes must be unique and sorted")
|
|
243
|
+
if type(self.evidence) is not FrozenJsonObject or freeze_json(
|
|
244
|
+
self.evidence
|
|
245
|
+
) is not self.evidence:
|
|
246
|
+
raise TypeError("evidence must be an exact frozen object")
|
|
247
|
+
computed = _hash(_RESULT_DOMAIN, self._unsigned_record())
|
|
248
|
+
if self.result_sha256 not in ("", computed):
|
|
249
|
+
raise ValueError("result_sha256 does not authenticate the result")
|
|
250
|
+
object.__setattr__(self, "result_sha256", computed)
|
|
251
|
+
|
|
252
|
+
def _unsigned_record(self) -> dict[str, object]:
|
|
253
|
+
return {
|
|
254
|
+
"schema_version": 1,
|
|
255
|
+
"request_sha256": self.request_sha256,
|
|
256
|
+
"policy_id": self.policy_id,
|
|
257
|
+
"policy_version": self.policy_version,
|
|
258
|
+
"policy_definition_sha256": self.policy_definition_sha256,
|
|
259
|
+
"lanes": [value.to_record() for value in self.lanes],
|
|
260
|
+
"evidence": thaw_json(self.evidence),
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
def to_record(self) -> dict[str, object]:
|
|
264
|
+
self.__post_init__()
|
|
265
|
+
return {**self._unsigned_record(), "result_sha256": self.result_sha256}
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
@runtime_checkable
|
|
269
|
+
class CampaignVariationEnvelopePolicy(Protocol):
|
|
270
|
+
"""Add globally coordinated proposal support before ordinary selection."""
|
|
271
|
+
|
|
272
|
+
policy_id: str
|
|
273
|
+
policy_version: int
|
|
274
|
+
definition_sha256: str
|
|
275
|
+
|
|
276
|
+
def enrich(
|
|
277
|
+
self,
|
|
278
|
+
request: CampaignVariationEnvelopeRequest,
|
|
279
|
+
) -> CampaignVariationEnvelopeResult: ...
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
def validate_campaign_variation_envelope_result(
|
|
283
|
+
*,
|
|
284
|
+
policy: CampaignVariationEnvelopePolicy,
|
|
285
|
+
request: CampaignVariationEnvelopeRequest,
|
|
286
|
+
result: CampaignVariationEnvelopeResult,
|
|
287
|
+
) -> None:
|
|
288
|
+
"""Revalidate policy identity, chronology, and support preservation."""
|
|
289
|
+
|
|
290
|
+
if not isinstance(policy, CampaignVariationEnvelopePolicy):
|
|
291
|
+
raise TypeError("policy must implement CampaignVariationEnvelopePolicy")
|
|
292
|
+
policy_identity = _policy_identity(policy)
|
|
293
|
+
if type(request) is not CampaignVariationEnvelopeRequest:
|
|
294
|
+
raise TypeError("request must be exact")
|
|
295
|
+
CampaignVariationEnvelopeRequest.__post_init__(request)
|
|
296
|
+
if type(result) is not CampaignVariationEnvelopeResult:
|
|
297
|
+
raise TypeError("result must be exact")
|
|
298
|
+
CampaignVariationEnvelopeResult.__post_init__(result)
|
|
299
|
+
if result.request_sha256 != request.request_sha256:
|
|
300
|
+
raise ValueError("variation-envelope result targets another request")
|
|
301
|
+
if (
|
|
302
|
+
result.policy_id,
|
|
303
|
+
result.policy_version,
|
|
304
|
+
result.policy_definition_sha256,
|
|
305
|
+
) != policy_identity:
|
|
306
|
+
raise ValueError("variation-envelope result has a foreign policy identity")
|
|
307
|
+
if tuple(value.lane_id for value in result.lanes) != tuple(
|
|
308
|
+
value.lane_id for value in request.lanes
|
|
309
|
+
):
|
|
310
|
+
raise ValueError("variation-envelope result changed the lane universe")
|
|
311
|
+
|
|
312
|
+
for source, enriched in zip(request.lanes, result.lanes, strict=True):
|
|
313
|
+
base = source.base_variation
|
|
314
|
+
variation = enriched.variation
|
|
315
|
+
if (
|
|
316
|
+
variation.benchmark_sha256 != base.benchmark_sha256
|
|
317
|
+
or variation.parent_configuration_sha256
|
|
318
|
+
!= base.parent_configuration_sha256
|
|
319
|
+
or variation.known_phenotype_sha256s
|
|
320
|
+
!= base.known_phenotype_sha256s
|
|
321
|
+
):
|
|
322
|
+
raise ValueError("enriched variation escaped its lane binding")
|
|
323
|
+
base_options = {
|
|
324
|
+
value.identity_sha256 for value in base.contract.options
|
|
325
|
+
}
|
|
326
|
+
enriched_options = {
|
|
327
|
+
value.identity_sha256 for value in variation.contract.options
|
|
328
|
+
}
|
|
329
|
+
if not base_options <= enriched_options:
|
|
330
|
+
raise ValueError("variation envelope removed base legal support")
|
|
331
|
+
|
|
332
|
+
|
|
333
|
+
def campaign_variation_envelope_context_record(
|
|
334
|
+
result: CampaignVariationEnvelopeResult,
|
|
335
|
+
) -> dict[str, object]:
|
|
336
|
+
"""Project a result to compact prompt evidence without contract duplication.
|
|
337
|
+
|
|
338
|
+
The selection request already carries the exact enriched contract for its
|
|
339
|
+
lane. Repeating every lane's full options inside the context increases
|
|
340
|
+
model input while revealing no additional fact. This receipt retains the
|
|
341
|
+
authenticated result identity, policy, compact policy evidence, and exact
|
|
342
|
+
per-lane contract identities/counts.
|
|
343
|
+
"""
|
|
344
|
+
|
|
345
|
+
if type(result) is not CampaignVariationEnvelopeResult:
|
|
346
|
+
raise TypeError("result must be an exact variation-envelope result")
|
|
347
|
+
CampaignVariationEnvelopeResult.__post_init__(result)
|
|
348
|
+
unsigned = {
|
|
349
|
+
"schema_version": 1,
|
|
350
|
+
"request_sha256": result.request_sha256,
|
|
351
|
+
"result_sha256": result.result_sha256,
|
|
352
|
+
"policy_id": result.policy_id,
|
|
353
|
+
"policy_version": result.policy_version,
|
|
354
|
+
"policy_definition_sha256": result.policy_definition_sha256,
|
|
355
|
+
"lanes": [
|
|
356
|
+
{
|
|
357
|
+
"lane_id": value.lane_id,
|
|
358
|
+
"parent_configuration_sha256": (
|
|
359
|
+
value.variation.parent_configuration_sha256
|
|
360
|
+
),
|
|
361
|
+
"finite_contract_identity_sha256": (
|
|
362
|
+
value.variation.contract.identity_sha256
|
|
363
|
+
),
|
|
364
|
+
"eligible_option_count": len(value.variation.contract.options),
|
|
365
|
+
}
|
|
366
|
+
for value in result.lanes
|
|
367
|
+
],
|
|
368
|
+
"evidence": thaw_json(result.evidence),
|
|
369
|
+
"full_variation_contracts_repeated_in_context": False,
|
|
370
|
+
}
|
|
371
|
+
return {
|
|
372
|
+
**unsigned,
|
|
373
|
+
"context_receipt_sha256": _hash(_CONTEXT_DOMAIN, unsigned),
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
|
|
377
|
+
def campaign_variation_envelope_trace_record(
|
|
378
|
+
*,
|
|
379
|
+
request: CampaignVariationEnvelopeRequest,
|
|
380
|
+
result: CampaignVariationEnvelopeResult,
|
|
381
|
+
) -> dict[str, object]:
|
|
382
|
+
"""Record the complete eligible expert union for replay and support audits.
|
|
383
|
+
|
|
384
|
+
Prompt context deliberately omits full contracts. The durable stage trace
|
|
385
|
+
has a different purpose: it must preserve external-expert configurations
|
|
386
|
+
that were legal but not selected, otherwise support and displacement regret
|
|
387
|
+
cannot be measured after the run. Both the workload-owned base support and
|
|
388
|
+
options added by external proposal experts are therefore included with an
|
|
389
|
+
explicit origin. Evaluated dispositions remain in the ordinary
|
|
390
|
+
portfolio-wave receipts and join exactly through ``option_identity_sha256``.
|
|
391
|
+
"""
|
|
392
|
+
|
|
393
|
+
if type(request) is not CampaignVariationEnvelopeRequest:
|
|
394
|
+
raise TypeError("request must be an exact variation-envelope request")
|
|
395
|
+
CampaignVariationEnvelopeRequest.__post_init__(request)
|
|
396
|
+
if type(result) is not CampaignVariationEnvelopeResult:
|
|
397
|
+
raise TypeError("result must be an exact variation-envelope result")
|
|
398
|
+
CampaignVariationEnvelopeResult.__post_init__(result)
|
|
399
|
+
if result.request_sha256 != request.request_sha256:
|
|
400
|
+
raise ValueError("variation-envelope trace joins a foreign result")
|
|
401
|
+
if tuple(value.lane_id for value in result.lanes) != tuple(
|
|
402
|
+
value.lane_id for value in request.lanes
|
|
403
|
+
):
|
|
404
|
+
raise ValueError("variation-envelope trace changed the lane universe")
|
|
405
|
+
|
|
406
|
+
lane_records: list[dict[str, object]] = []
|
|
407
|
+
added_count = 0
|
|
408
|
+
eligible_count = 0
|
|
409
|
+
for source, enriched in zip(request.lanes, result.lanes, strict=True):
|
|
410
|
+
base_options = {
|
|
411
|
+
value.identity_sha256 for value in source.base_variation.contract.options
|
|
412
|
+
}
|
|
413
|
+
eligibility = enriched.variation.eligibility_receipt
|
|
414
|
+
phenotype_by_identity = (
|
|
415
|
+
{}
|
|
416
|
+
if eligibility is None
|
|
417
|
+
else {
|
|
418
|
+
value.option_identity_sha256: value.phenotype_identity_sha256
|
|
419
|
+
for value in eligibility.option_phenotypes
|
|
420
|
+
}
|
|
421
|
+
)
|
|
422
|
+
eligible_options = []
|
|
423
|
+
for option in enriched.variation.contract.options:
|
|
424
|
+
support_origin = (
|
|
425
|
+
"base"
|
|
426
|
+
if option.identity_sha256 in base_options
|
|
427
|
+
else "envelope_addition"
|
|
428
|
+
)
|
|
429
|
+
eligible_options.append(
|
|
430
|
+
{
|
|
431
|
+
"option": option.evidence_record(),
|
|
432
|
+
"child_configuration": thaw_json(option.child_configuration),
|
|
433
|
+
"phenotype_identity_sha256": phenotype_by_identity.get(
|
|
434
|
+
option.identity_sha256
|
|
435
|
+
),
|
|
436
|
+
"eligibility_disposition": "eligible",
|
|
437
|
+
"support_origin": support_origin,
|
|
438
|
+
}
|
|
439
|
+
)
|
|
440
|
+
lane_added_count = sum(
|
|
441
|
+
value["support_origin"] == "envelope_addition"
|
|
442
|
+
for value in eligible_options
|
|
443
|
+
)
|
|
444
|
+
added_count += lane_added_count
|
|
445
|
+
eligible_count += len(eligible_options)
|
|
446
|
+
lane_records.append(
|
|
447
|
+
{
|
|
448
|
+
"lane_id": source.lane_id,
|
|
449
|
+
"parent_candidate_id": source.parent.candidate_id.value,
|
|
450
|
+
"parent_configuration_sha256": (
|
|
451
|
+
source.base_variation.parent_configuration_sha256
|
|
452
|
+
),
|
|
453
|
+
"base_contract_identity_sha256": (
|
|
454
|
+
source.base_variation.contract.identity_sha256
|
|
455
|
+
),
|
|
456
|
+
"enriched_contract_identity_sha256": (
|
|
457
|
+
enriched.variation.contract.identity_sha256
|
|
458
|
+
),
|
|
459
|
+
"base_option_count": len(source.base_variation.contract.options),
|
|
460
|
+
"eligible_option_count": len(enriched.variation.contract.options),
|
|
461
|
+
"eligible_added_option_count": lane_added_count,
|
|
462
|
+
"eligible_options": eligible_options,
|
|
463
|
+
}
|
|
464
|
+
)
|
|
465
|
+
|
|
466
|
+
payload = {
|
|
467
|
+
"schema_version": 1,
|
|
468
|
+
"request_sha256": request.request_sha256,
|
|
469
|
+
"result_sha256": result.result_sha256,
|
|
470
|
+
"lanes": lane_records,
|
|
471
|
+
"evidence": thaw_json(result.evidence),
|
|
472
|
+
}
|
|
473
|
+
raw_payload = _canonical_json(payload)
|
|
474
|
+
if len(raw_payload) > _TRACE_PAYLOAD_MAX_UTF8_BYTES:
|
|
475
|
+
raise ValueError("variation-envelope trace payload exceeds its ceiling")
|
|
476
|
+
compressed_payload = zlib.compress(raw_payload, level=9)
|
|
477
|
+
if len(compressed_payload) > _TRACE_PAYLOAD_MAX_COMPRESSED_BYTES:
|
|
478
|
+
raise ValueError("variation-envelope compressed trace exceeds its ceiling")
|
|
479
|
+
encoded_payload = base64.b64encode(compressed_payload).decode("ascii")
|
|
480
|
+
payload_chunks = [
|
|
481
|
+
encoded_payload[offset : offset + _TRACE_PAYLOAD_CHUNK_CHARACTERS]
|
|
482
|
+
for offset in range(0, len(encoded_payload), _TRACE_PAYLOAD_CHUNK_CHARACTERS)
|
|
483
|
+
]
|
|
484
|
+
unsigned = {
|
|
485
|
+
"schema_version": 2,
|
|
486
|
+
"request_sha256": request.request_sha256,
|
|
487
|
+
"result_sha256": result.result_sha256,
|
|
488
|
+
"policy_id": result.policy_id,
|
|
489
|
+
"policy_version": result.policy_version,
|
|
490
|
+
"policy_definition_sha256": result.policy_definition_sha256,
|
|
491
|
+
"generation": request.generation,
|
|
492
|
+
"eligible_option_occurrence_count": eligible_count,
|
|
493
|
+
"eligible_added_option_count": added_count,
|
|
494
|
+
"lanes": [
|
|
495
|
+
{
|
|
496
|
+
key: value
|
|
497
|
+
for key, value in lane.items()
|
|
498
|
+
if key != "eligible_options"
|
|
499
|
+
}
|
|
500
|
+
for lane in lane_records
|
|
501
|
+
],
|
|
502
|
+
"payload_encoding": "zlib_base64_chunks_v1",
|
|
503
|
+
"payload_base64_chunks": payload_chunks,
|
|
504
|
+
"payload_utf8_bytes": len(raw_payload),
|
|
505
|
+
"payload_sha256": hashlib.sha256(raw_payload).hexdigest(),
|
|
506
|
+
"payload_compressed_bytes": len(compressed_payload),
|
|
507
|
+
"payload_compressed_sha256": hashlib.sha256(
|
|
508
|
+
compressed_payload
|
|
509
|
+
).hexdigest(),
|
|
510
|
+
"full_child_configurations_included": True,
|
|
511
|
+
"full_expert_union_included": True,
|
|
512
|
+
"exposed_to_model_prompt": False,
|
|
513
|
+
"evaluated_disposition_join": {
|
|
514
|
+
"record": "portfolio_wave_receipts.action_attributions",
|
|
515
|
+
"key": "option_identity_sha256",
|
|
516
|
+
},
|
|
517
|
+
}
|
|
518
|
+
return {**unsigned, "trace_receipt_sha256": _hash(_TRACE_DOMAIN, unsigned)}
|
|
519
|
+
|
|
520
|
+
|
|
521
|
+
def decode_campaign_variation_envelope_trace_record(
|
|
522
|
+
record: dict[str, object],
|
|
523
|
+
) -> dict[str, object]:
|
|
524
|
+
"""Authenticate and recover one losslessly compressed expert-union trace."""
|
|
525
|
+
|
|
526
|
+
if type(record) is not dict:
|
|
527
|
+
raise TypeError("variation-envelope trace record must be an exact object")
|
|
528
|
+
if record.get("schema_version") != 2:
|
|
529
|
+
raise ValueError("variation-envelope trace record has an unknown schema")
|
|
530
|
+
trace_receipt_sha256 = record.get("trace_receipt_sha256")
|
|
531
|
+
require_sha256(trace_receipt_sha256, "trace_receipt_sha256")
|
|
532
|
+
unsigned = {
|
|
533
|
+
key: value for key, value in record.items() if key != "trace_receipt_sha256"
|
|
534
|
+
}
|
|
535
|
+
if _hash(_TRACE_DOMAIN, unsigned) != trace_receipt_sha256:
|
|
536
|
+
raise ValueError("variation-envelope trace receipt authentication failed")
|
|
537
|
+
if record.get("payload_encoding") != "zlib_base64_chunks_v1":
|
|
538
|
+
raise ValueError("variation-envelope trace payload encoding is unsupported")
|
|
539
|
+
chunks = record.get("payload_base64_chunks")
|
|
540
|
+
if (
|
|
541
|
+
type(chunks) is not list
|
|
542
|
+
or not chunks
|
|
543
|
+
or any(type(value) is not str or not value for value in chunks)
|
|
544
|
+
):
|
|
545
|
+
raise ValueError("variation-envelope trace chunks are malformed")
|
|
546
|
+
try:
|
|
547
|
+
compressed = base64.b64decode("".join(chunks), validate=True)
|
|
548
|
+
except (ValueError, binascii.Error) as exc:
|
|
549
|
+
raise ValueError("variation-envelope trace base64 is malformed") from exc
|
|
550
|
+
expected_compressed_bytes = record.get("payload_compressed_bytes")
|
|
551
|
+
if (
|
|
552
|
+
type(expected_compressed_bytes) is not int
|
|
553
|
+
or isinstance(expected_compressed_bytes, bool)
|
|
554
|
+
or expected_compressed_bytes <= 0
|
|
555
|
+
or expected_compressed_bytes > _TRACE_PAYLOAD_MAX_COMPRESSED_BYTES
|
|
556
|
+
or len(compressed) != expected_compressed_bytes
|
|
557
|
+
or hashlib.sha256(compressed).hexdigest()
|
|
558
|
+
!= record.get("payload_compressed_sha256")
|
|
559
|
+
):
|
|
560
|
+
raise ValueError("variation-envelope compressed payload authentication failed")
|
|
561
|
+
decompressor = zlib.decompressobj()
|
|
562
|
+
try:
|
|
563
|
+
raw = decompressor.decompress(
|
|
564
|
+
compressed,
|
|
565
|
+
_TRACE_PAYLOAD_MAX_UTF8_BYTES + 1,
|
|
566
|
+
)
|
|
567
|
+
except zlib.error as exc:
|
|
568
|
+
raise ValueError("variation-envelope trace compression is malformed") from exc
|
|
569
|
+
if (
|
|
570
|
+
len(raw) > _TRACE_PAYLOAD_MAX_UTF8_BYTES
|
|
571
|
+
or decompressor.unconsumed_tail
|
|
572
|
+
or not decompressor.eof
|
|
573
|
+
or decompressor.unused_data
|
|
574
|
+
):
|
|
575
|
+
raise ValueError("variation-envelope trace payload exceeds or violates framing")
|
|
576
|
+
try:
|
|
577
|
+
raw += decompressor.flush()
|
|
578
|
+
except zlib.error as exc:
|
|
579
|
+
raise ValueError("variation-envelope trace compression is malformed") from exc
|
|
580
|
+
if len(raw) > _TRACE_PAYLOAD_MAX_UTF8_BYTES:
|
|
581
|
+
raise ValueError("variation-envelope trace payload exceeds its ceiling")
|
|
582
|
+
expected_utf8_bytes = record.get("payload_utf8_bytes")
|
|
583
|
+
if (
|
|
584
|
+
type(expected_utf8_bytes) is not int
|
|
585
|
+
or isinstance(expected_utf8_bytes, bool)
|
|
586
|
+
or expected_utf8_bytes <= 0
|
|
587
|
+
or len(raw) != expected_utf8_bytes
|
|
588
|
+
or hashlib.sha256(raw).hexdigest() != record.get("payload_sha256")
|
|
589
|
+
):
|
|
590
|
+
raise ValueError("variation-envelope trace payload authentication failed")
|
|
591
|
+
try:
|
|
592
|
+
payload = json.loads(raw.decode("ascii", errors="strict"))
|
|
593
|
+
except (UnicodeDecodeError, json.JSONDecodeError) as exc:
|
|
594
|
+
raise ValueError("variation-envelope trace payload is not canonical JSON") from exc
|
|
595
|
+
if type(payload) is not dict:
|
|
596
|
+
raise TypeError("variation-envelope trace payload must be an object")
|
|
597
|
+
if _canonical_json(payload) != raw:
|
|
598
|
+
raise ValueError("variation-envelope trace payload is not canonical JSON")
|
|
599
|
+
if (
|
|
600
|
+
payload.get("schema_version") != 1
|
|
601
|
+
or payload.get("request_sha256") != record.get("request_sha256")
|
|
602
|
+
or payload.get("result_sha256") != record.get("result_sha256")
|
|
603
|
+
):
|
|
604
|
+
raise ValueError("variation-envelope trace payload joins a foreign receipt")
|
|
605
|
+
lanes = payload.get("lanes")
|
|
606
|
+
if type(lanes) is not list or any(type(value) is not dict for value in lanes):
|
|
607
|
+
raise TypeError("variation-envelope trace payload lanes are malformed")
|
|
608
|
+
compact_lanes = record.get("lanes")
|
|
609
|
+
if (
|
|
610
|
+
type(compact_lanes) is not list
|
|
611
|
+
or len(compact_lanes) != len(lanes)
|
|
612
|
+
or any(type(value) is not dict for value in compact_lanes)
|
|
613
|
+
):
|
|
614
|
+
raise TypeError("variation-envelope trace lane summaries are malformed")
|
|
615
|
+
eligible_options: list[dict[str, object]] = []
|
|
616
|
+
for lane, compact_lane in zip(lanes, compact_lanes, strict=True):
|
|
617
|
+
raw_options = lane.get("eligible_options")
|
|
618
|
+
if type(raw_options) is not list or any(
|
|
619
|
+
type(value) is not dict for value in raw_options
|
|
620
|
+
):
|
|
621
|
+
raise TypeError("variation-envelope trace eligible options are malformed")
|
|
622
|
+
lane_summary = {key: value for key, value in lane.items() if key != "eligible_options"}
|
|
623
|
+
if lane_summary != compact_lane:
|
|
624
|
+
raise ValueError("variation-envelope trace lane summary is inconsistent")
|
|
625
|
+
eligible_options.extend(raw_options)
|
|
626
|
+
if len(eligible_options) != record.get("eligible_option_occurrence_count"):
|
|
627
|
+
raise ValueError("variation-envelope trace eligible count is inconsistent")
|
|
628
|
+
if (
|
|
629
|
+
sum(
|
|
630
|
+
value.get("support_origin") == "envelope_addition"
|
|
631
|
+
for value in eligible_options
|
|
632
|
+
)
|
|
633
|
+
!= record.get("eligible_added_option_count")
|
|
634
|
+
):
|
|
635
|
+
raise ValueError("variation-envelope trace addition count is inconsistent")
|
|
636
|
+
return payload
|
|
637
|
+
|
|
638
|
+
|
|
639
|
+
__all__ = [
|
|
640
|
+
"CampaignVariationEnvelopeLane",
|
|
641
|
+
"CampaignVariationEnvelopeLaneResult",
|
|
642
|
+
"CampaignVariationEnvelopePolicy",
|
|
643
|
+
"CampaignVariationEnvelopeRequest",
|
|
644
|
+
"CampaignVariationEnvelopeResult",
|
|
645
|
+
"campaign_variation_envelope_context_record",
|
|
646
|
+
"campaign_variation_envelope_trace_record",
|
|
647
|
+
"decode_campaign_variation_envelope_trace_record",
|
|
648
|
+
"validate_campaign_variation_envelope_result",
|
|
649
|
+
]
|