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,467 @@
|
|
|
1
|
+
"""Benchmark-neutral contracts for post-commit, rank-only reference releases.
|
|
2
|
+
|
|
3
|
+
The port deliberately separates decision authority from reference evaluation.
|
|
4
|
+
Callers must bind an already-finalized decision, its selected-union release,
|
|
5
|
+
the exact eligible item set, and the endpoint policy before a private reference
|
|
6
|
+
reader can be opened. The public release contains selected-portfolio ranks and
|
|
7
|
+
aggregate counts; it has no field capable of carrying an unselected item value.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from dataclasses import dataclass
|
|
13
|
+
from enum import Enum
|
|
14
|
+
import hashlib
|
|
15
|
+
import json
|
|
16
|
+
import math
|
|
17
|
+
import re
|
|
18
|
+
|
|
19
|
+
from agent_evolve.domain.patch import require_sha256
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
_IDENTIFIER = re.compile(r"^[a-z][a-z0-9_.:-]{0,255}$")
|
|
23
|
+
_REQUEST_DOMAIN = b"agent-evolve:postcommit-rank-request:v1\x00"
|
|
24
|
+
_AUTHORIZATION_DOMAIN = b"agent-evolve:postcommit-rank-authorization:v1\x00"
|
|
25
|
+
_RELEASE_DOMAIN = b"agent-evolve:postcommit-rank-release:v1\x00"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _canonical_json(value: object) -> bytes:
|
|
29
|
+
return json.dumps(
|
|
30
|
+
value,
|
|
31
|
+
allow_nan=False,
|
|
32
|
+
ensure_ascii=True,
|
|
33
|
+
separators=(",", ":"),
|
|
34
|
+
sort_keys=True,
|
|
35
|
+
).encode("ascii")
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _hash(domain: bytes, value: object) -> str:
|
|
39
|
+
return hashlib.sha256(domain + _canonical_json(value)).hexdigest()
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _require_identifier(value: object, name: str) -> str:
|
|
43
|
+
if type(value) is not str or _IDENTIFIER.fullmatch(value) is None:
|
|
44
|
+
raise ValueError(f"{name} must use the canonical identifier grammar")
|
|
45
|
+
return value
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class RankDirection(str, Enum):
|
|
49
|
+
LOWER_IS_BETTER = "lower_is_better"
|
|
50
|
+
HIGHER_IS_BETTER = "higher_is_better"
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class PortfolioAggregateKind(str, Enum):
|
|
54
|
+
"""Closed aggregation laws supported by the rank-only reference core."""
|
|
55
|
+
|
|
56
|
+
SUM = "sum"
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
@dataclass(frozen=True, slots=True, eq=False)
|
|
60
|
+
class RankEndpointPolicyBinding:
|
|
61
|
+
policy_id: str
|
|
62
|
+
policy_version: int
|
|
63
|
+
policy_definition_sha256: str
|
|
64
|
+
direction: RankDirection
|
|
65
|
+
aggregate_kind: PortfolioAggregateKind
|
|
66
|
+
|
|
67
|
+
def __post_init__(self) -> None:
|
|
68
|
+
_require_identifier(self.policy_id, "policy_id")
|
|
69
|
+
if type(self.policy_version) is not int or self.policy_version <= 0:
|
|
70
|
+
raise ValueError("policy_version must be a positive exact integer")
|
|
71
|
+
require_sha256(self.policy_definition_sha256, "policy_definition_sha256")
|
|
72
|
+
if type(self.direction) is not RankDirection:
|
|
73
|
+
raise TypeError("direction must be an exact RankDirection")
|
|
74
|
+
if type(self.aggregate_kind) is not PortfolioAggregateKind:
|
|
75
|
+
raise TypeError("aggregate_kind must be exact")
|
|
76
|
+
|
|
77
|
+
def to_record(self) -> dict[str, object]:
|
|
78
|
+
self.__post_init__()
|
|
79
|
+
return {
|
|
80
|
+
"policy_id": self.policy_id,
|
|
81
|
+
"policy_version": self.policy_version,
|
|
82
|
+
"policy_definition_sha256": self.policy_definition_sha256,
|
|
83
|
+
"direction": self.direction.value,
|
|
84
|
+
"aggregate_kind": self.aggregate_kind.value,
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
@dataclass(frozen=True, slots=True)
|
|
89
|
+
class SelectedPortfolioClaim:
|
|
90
|
+
"""One durably selected set, identified without carrying outcomes."""
|
|
91
|
+
|
|
92
|
+
method_id: str
|
|
93
|
+
treatment_id: str
|
|
94
|
+
item_ids: tuple[str, ...]
|
|
95
|
+
|
|
96
|
+
def __post_init__(self) -> None:
|
|
97
|
+
_require_identifier(self.method_id, "method_id")
|
|
98
|
+
_require_identifier(self.treatment_id, "treatment_id")
|
|
99
|
+
if type(self.item_ids) is not tuple or not self.item_ids:
|
|
100
|
+
raise ValueError("item_ids must be a non-empty exact tuple")
|
|
101
|
+
if any(type(value) is not str or not value for value in self.item_ids):
|
|
102
|
+
raise ValueError("item_ids must contain non-empty exact strings")
|
|
103
|
+
if self.item_ids != tuple(sorted(set(self.item_ids))):
|
|
104
|
+
raise ValueError("portfolio item_ids must be unique and canonical")
|
|
105
|
+
|
|
106
|
+
@property
|
|
107
|
+
def claim_id(self) -> str:
|
|
108
|
+
return f"{self.method_id}:{self.treatment_id}"
|
|
109
|
+
|
|
110
|
+
def to_record(self) -> dict[str, object]:
|
|
111
|
+
self.__post_init__()
|
|
112
|
+
return {
|
|
113
|
+
"method_id": self.method_id,
|
|
114
|
+
"treatment_id": self.treatment_id,
|
|
115
|
+
"claim_id": self.claim_id,
|
|
116
|
+
"item_ids": list(self.item_ids),
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
@dataclass(frozen=True, slots=True, eq=False)
|
|
121
|
+
class PostcommitRankRequest:
|
|
122
|
+
"""Closed request frozen only after decisions and selected-union release."""
|
|
123
|
+
|
|
124
|
+
benchmark_id: str
|
|
125
|
+
source_run_finalization_sha256: str
|
|
126
|
+
source_run_recursive_content_sha256: str
|
|
127
|
+
decision_commitment_sha256: str
|
|
128
|
+
selected_union_commitment_sha256: str
|
|
129
|
+
selected_union_release_sha256: str
|
|
130
|
+
eligibility_receipt_sha256: str
|
|
131
|
+
reference_source_sha256: str
|
|
132
|
+
endpoint_policy: RankEndpointPolicyBinding
|
|
133
|
+
eligible_item_ids: tuple[str, ...]
|
|
134
|
+
portfolio_size: int
|
|
135
|
+
selected_portfolios: tuple[SelectedPortfolioClaim, ...]
|
|
136
|
+
|
|
137
|
+
def __post_init__(self) -> None:
|
|
138
|
+
_require_identifier(self.benchmark_id, "benchmark_id")
|
|
139
|
+
for name in (
|
|
140
|
+
"source_run_finalization_sha256",
|
|
141
|
+
"source_run_recursive_content_sha256",
|
|
142
|
+
"decision_commitment_sha256",
|
|
143
|
+
"selected_union_commitment_sha256",
|
|
144
|
+
"selected_union_release_sha256",
|
|
145
|
+
"eligibility_receipt_sha256",
|
|
146
|
+
"reference_source_sha256",
|
|
147
|
+
):
|
|
148
|
+
require_sha256(getattr(self, name), name)
|
|
149
|
+
if type(self.endpoint_policy) is not RankEndpointPolicyBinding:
|
|
150
|
+
raise TypeError("endpoint_policy must be exact")
|
|
151
|
+
self.endpoint_policy.__post_init__()
|
|
152
|
+
if type(self.eligible_item_ids) is not tuple or not self.eligible_item_ids:
|
|
153
|
+
raise ValueError("eligible_item_ids must be a non-empty exact tuple")
|
|
154
|
+
if any(
|
|
155
|
+
type(value) is not str or not value for value in self.eligible_item_ids
|
|
156
|
+
):
|
|
157
|
+
raise ValueError("eligible item IDs must be non-empty exact strings")
|
|
158
|
+
if self.eligible_item_ids != tuple(sorted(set(self.eligible_item_ids))):
|
|
159
|
+
raise ValueError("eligible item IDs must be unique and canonical")
|
|
160
|
+
if (
|
|
161
|
+
type(self.portfolio_size) is not int
|
|
162
|
+
or self.portfolio_size <= 0
|
|
163
|
+
or self.portfolio_size > len(self.eligible_item_ids)
|
|
164
|
+
):
|
|
165
|
+
raise ValueError("portfolio_size is outside the eligible item set")
|
|
166
|
+
if type(self.selected_portfolios) is not tuple or not self.selected_portfolios:
|
|
167
|
+
raise ValueError("selected_portfolios must be a non-empty exact tuple")
|
|
168
|
+
for value in self.selected_portfolios:
|
|
169
|
+
if type(value) is not SelectedPortfolioClaim:
|
|
170
|
+
raise TypeError("selected_portfolios must contain exact claims")
|
|
171
|
+
value.__post_init__()
|
|
172
|
+
if len(value.item_ids) != self.portfolio_size:
|
|
173
|
+
raise ValueError("selected portfolio size differs from the request")
|
|
174
|
+
if not set(value.item_ids).issubset(self.eligible_item_ids):
|
|
175
|
+
raise ValueError("selected portfolio escapes the eligible item set")
|
|
176
|
+
if self.selected_portfolios != tuple(
|
|
177
|
+
sorted(
|
|
178
|
+
self.selected_portfolios,
|
|
179
|
+
key=lambda value: (value.method_id, value.treatment_id),
|
|
180
|
+
)
|
|
181
|
+
):
|
|
182
|
+
raise ValueError("selected portfolios must use canonical claim order")
|
|
183
|
+
claim_ids = tuple(value.claim_id for value in self.selected_portfolios)
|
|
184
|
+
if len(set(claim_ids)) != len(claim_ids):
|
|
185
|
+
raise ValueError("selected portfolio claim IDs cannot repeat")
|
|
186
|
+
|
|
187
|
+
@property
|
|
188
|
+
def reference_read_count(self) -> int:
|
|
189
|
+
return len(self.eligible_item_ids)
|
|
190
|
+
|
|
191
|
+
@property
|
|
192
|
+
def exact_portfolio_count(self) -> int:
|
|
193
|
+
return math.comb(len(self.eligible_item_ids), self.portfolio_size)
|
|
194
|
+
|
|
195
|
+
def _unsigned_record(self) -> dict[str, object]:
|
|
196
|
+
self.__post_init__()
|
|
197
|
+
return {
|
|
198
|
+
"schema_version": 1,
|
|
199
|
+
"benchmark_id": self.benchmark_id,
|
|
200
|
+
"source_run_finalization_sha256": self.source_run_finalization_sha256,
|
|
201
|
+
"source_run_recursive_content_sha256": (
|
|
202
|
+
self.source_run_recursive_content_sha256
|
|
203
|
+
),
|
|
204
|
+
"decision_commitment_sha256": self.decision_commitment_sha256,
|
|
205
|
+
"selected_union_commitment_sha256": (
|
|
206
|
+
self.selected_union_commitment_sha256
|
|
207
|
+
),
|
|
208
|
+
"selected_union_release_sha256": self.selected_union_release_sha256,
|
|
209
|
+
"eligibility_receipt_sha256": self.eligibility_receipt_sha256,
|
|
210
|
+
"reference_source_sha256": self.reference_source_sha256,
|
|
211
|
+
"endpoint_policy": self.endpoint_policy.to_record(),
|
|
212
|
+
"eligible_item_ids": list(self.eligible_item_ids),
|
|
213
|
+
"eligible_item_count": len(self.eligible_item_ids),
|
|
214
|
+
"reference_read_count": self.reference_read_count,
|
|
215
|
+
"portfolio_size": self.portfolio_size,
|
|
216
|
+
"exact_portfolio_count": self.exact_portfolio_count,
|
|
217
|
+
"selected_portfolios": [
|
|
218
|
+
value.to_record() for value in self.selected_portfolios
|
|
219
|
+
],
|
|
220
|
+
"outcomes_read_while_building_request": False,
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
@property
|
|
224
|
+
def request_sha256(self) -> str:
|
|
225
|
+
return _hash(_REQUEST_DOMAIN, self._unsigned_record())
|
|
226
|
+
|
|
227
|
+
def to_record(self) -> dict[str, object]:
|
|
228
|
+
return {**self._unsigned_record(), "request_sha256": self.request_sha256}
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
@dataclass(frozen=True, slots=True, eq=False)
|
|
232
|
+
class PostcommitRankAuthorization:
|
|
233
|
+
"""Receipt for a caller-durable, read-back prerelease authorization.
|
|
234
|
+
|
|
235
|
+
The generic core binds this receipt. Filesystem durability and chronology
|
|
236
|
+
are verified by the composing run harness before it constructs the private
|
|
237
|
+
reader; a digest alone is not claimed to prove either property.
|
|
238
|
+
"""
|
|
239
|
+
|
|
240
|
+
request_sha256: str
|
|
241
|
+
prerelease_file_sha256: str
|
|
242
|
+
authorization_scope: str
|
|
243
|
+
|
|
244
|
+
def __post_init__(self) -> None:
|
|
245
|
+
require_sha256(self.request_sha256, "request_sha256")
|
|
246
|
+
require_sha256(self.prerelease_file_sha256, "prerelease_file_sha256")
|
|
247
|
+
_require_identifier(self.authorization_scope, "authorization_scope")
|
|
248
|
+
|
|
249
|
+
def _unsigned_record(self) -> dict[str, object]:
|
|
250
|
+
self.__post_init__()
|
|
251
|
+
return {
|
|
252
|
+
"schema_version": 1,
|
|
253
|
+
"request_sha256": self.request_sha256,
|
|
254
|
+
"prerelease_file_sha256": self.prerelease_file_sha256,
|
|
255
|
+
"authorization_scope": self.authorization_scope,
|
|
256
|
+
"durability_verified_by_composing_harness": True,
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
@property
|
|
260
|
+
def authorization_sha256(self) -> str:
|
|
261
|
+
return _hash(_AUTHORIZATION_DOMAIN, self._unsigned_record())
|
|
262
|
+
|
|
263
|
+
def to_record(self) -> dict[str, object]:
|
|
264
|
+
return {
|
|
265
|
+
**self._unsigned_record(),
|
|
266
|
+
"authorization_sha256": self.authorization_sha256,
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
@dataclass(frozen=True, slots=True)
|
|
271
|
+
class RankReferenceObservation:
|
|
272
|
+
"""Private scalar contribution returned once per eligible reference item."""
|
|
273
|
+
|
|
274
|
+
item_id: str
|
|
275
|
+
endpoint_component: float
|
|
276
|
+
source_receipt_sha256: str
|
|
277
|
+
|
|
278
|
+
def __post_init__(self) -> None:
|
|
279
|
+
if type(self.item_id) is not str or not self.item_id:
|
|
280
|
+
raise ValueError("item_id must be a non-empty exact string")
|
|
281
|
+
if (
|
|
282
|
+
type(self.endpoint_component) is not float
|
|
283
|
+
or not math.isfinite(self.endpoint_component)
|
|
284
|
+
):
|
|
285
|
+
raise TypeError("endpoint_component must be a finite canonical float")
|
|
286
|
+
require_sha256(self.source_receipt_sha256, "source_receipt_sha256")
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
@dataclass(frozen=True, slots=True)
|
|
290
|
+
class SelectedPortfolioRank:
|
|
291
|
+
method_id: str
|
|
292
|
+
treatment_id: str
|
|
293
|
+
item_ids: tuple[str, ...]
|
|
294
|
+
endpoint: float
|
|
295
|
+
competition_rank: int
|
|
296
|
+
strictly_better_count: int
|
|
297
|
+
tied_portfolio_count: int
|
|
298
|
+
strictly_worse_count: int
|
|
299
|
+
denominator_count: int
|
|
300
|
+
|
|
301
|
+
def __post_init__(self) -> None:
|
|
302
|
+
claim = SelectedPortfolioClaim(
|
|
303
|
+
method_id=self.method_id,
|
|
304
|
+
treatment_id=self.treatment_id,
|
|
305
|
+
item_ids=self.item_ids,
|
|
306
|
+
)
|
|
307
|
+
claim.__post_init__()
|
|
308
|
+
if type(self.endpoint) is not float or not math.isfinite(self.endpoint):
|
|
309
|
+
raise TypeError("endpoint must be a finite canonical float")
|
|
310
|
+
integers = (
|
|
311
|
+
self.competition_rank,
|
|
312
|
+
self.strictly_better_count,
|
|
313
|
+
self.tied_portfolio_count,
|
|
314
|
+
self.strictly_worse_count,
|
|
315
|
+
self.denominator_count,
|
|
316
|
+
)
|
|
317
|
+
if any(type(value) is not int for value in integers):
|
|
318
|
+
raise TypeError("rank counts must be exact integers")
|
|
319
|
+
if (
|
|
320
|
+
self.denominator_count <= 0
|
|
321
|
+
or self.strictly_better_count < 0
|
|
322
|
+
or self.tied_portfolio_count <= 0
|
|
323
|
+
or self.strictly_worse_count < 0
|
|
324
|
+
or self.competition_rank != self.strictly_better_count + 1
|
|
325
|
+
or self.strictly_better_count
|
|
326
|
+
+ self.tied_portfolio_count
|
|
327
|
+
+ self.strictly_worse_count
|
|
328
|
+
!= self.denominator_count
|
|
329
|
+
):
|
|
330
|
+
raise ValueError("portfolio rank counts are inconsistent")
|
|
331
|
+
|
|
332
|
+
@property
|
|
333
|
+
def claim_id(self) -> str:
|
|
334
|
+
return f"{self.method_id}:{self.treatment_id}"
|
|
335
|
+
|
|
336
|
+
def to_record(self) -> dict[str, object]:
|
|
337
|
+
self.__post_init__()
|
|
338
|
+
return {
|
|
339
|
+
"method_id": self.method_id,
|
|
340
|
+
"treatment_id": self.treatment_id,
|
|
341
|
+
"claim_id": self.claim_id,
|
|
342
|
+
"item_ids": list(self.item_ids),
|
|
343
|
+
"selected_portfolio_endpoint": self.endpoint,
|
|
344
|
+
"selected_portfolio_endpoint_hex": self.endpoint.hex(),
|
|
345
|
+
"competition_rank": self.competition_rank,
|
|
346
|
+
"strictly_better_count": self.strictly_better_count,
|
|
347
|
+
"tied_portfolio_count": self.tied_portfolio_count,
|
|
348
|
+
"strictly_worse_count": self.strictly_worse_count,
|
|
349
|
+
"denominator_count": self.denominator_count,
|
|
350
|
+
"best_rank_percentile_0_best": (
|
|
351
|
+
self.strictly_better_count / self.denominator_count
|
|
352
|
+
),
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
@dataclass(frozen=True, slots=True, eq=False)
|
|
357
|
+
class PostcommitRankRelease:
|
|
358
|
+
request_sha256: str
|
|
359
|
+
authorization_sha256: str
|
|
360
|
+
private_reference_table_sha256: str
|
|
361
|
+
private_portfolio_endpoint_table_sha256: str
|
|
362
|
+
exact_reference_read_count: int
|
|
363
|
+
exact_portfolio_count: int
|
|
364
|
+
distinct_portfolio_endpoint_count: int
|
|
365
|
+
portfolio_endpoint_tie_group_count: int
|
|
366
|
+
selected_ranks: tuple[SelectedPortfolioRank, ...]
|
|
367
|
+
|
|
368
|
+
def __post_init__(self) -> None:
|
|
369
|
+
for name in (
|
|
370
|
+
"request_sha256",
|
|
371
|
+
"authorization_sha256",
|
|
372
|
+
"private_reference_table_sha256",
|
|
373
|
+
"private_portfolio_endpoint_table_sha256",
|
|
374
|
+
):
|
|
375
|
+
require_sha256(getattr(self, name), name)
|
|
376
|
+
for name in (
|
|
377
|
+
"exact_reference_read_count",
|
|
378
|
+
"exact_portfolio_count",
|
|
379
|
+
"distinct_portfolio_endpoint_count",
|
|
380
|
+
):
|
|
381
|
+
value = getattr(self, name)
|
|
382
|
+
if type(value) is not int or value <= 0:
|
|
383
|
+
raise ValueError(f"{name} must be a positive exact integer")
|
|
384
|
+
if (
|
|
385
|
+
type(self.portfolio_endpoint_tie_group_count) is not int
|
|
386
|
+
or self.portfolio_endpoint_tie_group_count < 0
|
|
387
|
+
):
|
|
388
|
+
raise ValueError(
|
|
389
|
+
"portfolio_endpoint_tie_group_count must be non-negative"
|
|
390
|
+
)
|
|
391
|
+
if self.distinct_portfolio_endpoint_count > self.exact_portfolio_count:
|
|
392
|
+
raise ValueError("distinct endpoint count exceeds portfolio count")
|
|
393
|
+
if self.portfolio_endpoint_tie_group_count > (
|
|
394
|
+
self.distinct_portfolio_endpoint_count
|
|
395
|
+
):
|
|
396
|
+
raise ValueError("tie-group count exceeds distinct endpoints")
|
|
397
|
+
if type(self.selected_ranks) is not tuple or not self.selected_ranks:
|
|
398
|
+
raise ValueError("selected_ranks must be a non-empty exact tuple")
|
|
399
|
+
for value in self.selected_ranks:
|
|
400
|
+
if type(value) is not SelectedPortfolioRank:
|
|
401
|
+
raise TypeError("selected_ranks must contain exact rows")
|
|
402
|
+
value.__post_init__()
|
|
403
|
+
if value.denominator_count != self.exact_portfolio_count:
|
|
404
|
+
raise ValueError("selected rank denominator differs from release")
|
|
405
|
+
if self.selected_ranks != tuple(
|
|
406
|
+
sorted(
|
|
407
|
+
self.selected_ranks,
|
|
408
|
+
key=lambda value: (value.method_id, value.treatment_id),
|
|
409
|
+
)
|
|
410
|
+
):
|
|
411
|
+
raise ValueError("selected ranks must use canonical claim order")
|
|
412
|
+
|
|
413
|
+
def _unsigned_record(self) -> dict[str, object]:
|
|
414
|
+
self.__post_init__()
|
|
415
|
+
ranks = tuple(value.competition_rank for value in self.selected_ranks)
|
|
416
|
+
return {
|
|
417
|
+
"schema_version": 1,
|
|
418
|
+
"status": "completed_postcommit_rank_only_release",
|
|
419
|
+
"request_sha256": self.request_sha256,
|
|
420
|
+
"authorization_sha256": self.authorization_sha256,
|
|
421
|
+
"private_reference_table_sha256": self.private_reference_table_sha256,
|
|
422
|
+
"private_portfolio_endpoint_table_sha256": (
|
|
423
|
+
self.private_portfolio_endpoint_table_sha256
|
|
424
|
+
),
|
|
425
|
+
"exact_reference_read_count": self.exact_reference_read_count,
|
|
426
|
+
"exact_portfolio_count": self.exact_portfolio_count,
|
|
427
|
+
"aggregate_diagnostics": {
|
|
428
|
+
"distinct_portfolio_endpoint_count": (
|
|
429
|
+
self.distinct_portfolio_endpoint_count
|
|
430
|
+
),
|
|
431
|
+
"portfolio_endpoint_tie_group_count": (
|
|
432
|
+
self.portfolio_endpoint_tie_group_count
|
|
433
|
+
),
|
|
434
|
+
"selected_claim_count": len(self.selected_ranks),
|
|
435
|
+
"unique_selected_portfolio_count": len(
|
|
436
|
+
{value.item_ids for value in self.selected_ranks}
|
|
437
|
+
),
|
|
438
|
+
"minimum_selected_competition_rank": min(ranks),
|
|
439
|
+
"maximum_selected_competition_rank": max(ranks),
|
|
440
|
+
},
|
|
441
|
+
"selected_ranks": [value.to_record() for value in self.selected_ranks],
|
|
442
|
+
"raw_reference_values_returned": False,
|
|
443
|
+
"unselected_item_values_returned": False,
|
|
444
|
+
"unselected_portfolio_endpoints_returned": False,
|
|
445
|
+
"provider_calls": 0,
|
|
446
|
+
"new_candidate_evaluations": 0,
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
@property
|
|
450
|
+
def release_sha256(self) -> str:
|
|
451
|
+
return _hash(_RELEASE_DOMAIN, self._unsigned_record())
|
|
452
|
+
|
|
453
|
+
def to_record(self) -> dict[str, object]:
|
|
454
|
+
return {**self._unsigned_record(), "release_sha256": self.release_sha256}
|
|
455
|
+
|
|
456
|
+
|
|
457
|
+
__all__ = [
|
|
458
|
+
"PortfolioAggregateKind",
|
|
459
|
+
"PostcommitRankAuthorization",
|
|
460
|
+
"PostcommitRankRelease",
|
|
461
|
+
"PostcommitRankRequest",
|
|
462
|
+
"RankDirection",
|
|
463
|
+
"RankEndpointPolicyBinding",
|
|
464
|
+
"RankReferenceObservation",
|
|
465
|
+
"SelectedPortfolioClaim",
|
|
466
|
+
"SelectedPortfolioRank",
|
|
467
|
+
]
|