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,685 @@
|
|
|
1
|
+
"""Model-independent candidate pools for clean cross-model reranking assays.
|
|
2
|
+
|
|
3
|
+
The calibrated selector historically exposed one feasibility witness whose
|
|
4
|
+
ordering was keyed by the complete provider request. Model execution settings
|
|
5
|
+
therefore changed the candidate slate before a model answered. This module
|
|
6
|
+
owns the replacement scientific control: an oversubscribed pool keyed only by
|
|
7
|
+
the optimization task, replicate seed, wave, parent, finite contract, and hard
|
|
8
|
+
allocation constraints.
|
|
9
|
+
|
|
10
|
+
The policy never reads a model profile, call ID, prompt hash, provider setting,
|
|
11
|
+
option outcome, or prior evaluator value. A model may rank and forecast the
|
|
12
|
+
pool, but may not change its membership. Open proposal generation remains a
|
|
13
|
+
separate acquisition mode so reranking and generation capability can be
|
|
14
|
+
identified independently.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
import hashlib
|
|
20
|
+
import json
|
|
21
|
+
from dataclasses import dataclass, field
|
|
22
|
+
|
|
23
|
+
from agent_evolve.domain.finite_variation import FiniteVariationContract
|
|
24
|
+
from agent_evolve.domain.patch import require_sha256
|
|
25
|
+
from agent_evolve.ports.portfolio_selection import (
|
|
26
|
+
pairwise_disjoint_parent_patch_witness,
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
POLICY_ID = "task_keyed_common_candidate_pool"
|
|
31
|
+
POLICY_VERSION = 7
|
|
32
|
+
POLICY_DEFINITION_SHA256 = hashlib.sha256(
|
|
33
|
+
b"agent-evolve:task-keyed-common-candidate-pool:v7;"
|
|
34
|
+
b"sampling-state=replicate-seed,benchmark,wave,parent,finite-contract,constraints,"
|
|
35
|
+
b"required-option-ids;"
|
|
36
|
+
b"sampling-state-excludes=universe-size,model-selection-size;"
|
|
37
|
+
b"decision-task-adds=universe-size,model-selection-size;"
|
|
38
|
+
b"candidate-universe=model-independent;outcomes=false;provider-fields=false;"
|
|
39
|
+
b"model-selection-size=authenticated;universe-size=authenticated;"
|
|
40
|
+
b"nested-universe-prefix-law=true;presentation-relative-order=state-keyed;"
|
|
41
|
+
b"feasible-evaluation-subset=engine-certified;"
|
|
42
|
+
b"certificate-members-not-prefix-positioned;presentation=independently-state-keyed;"
|
|
43
|
+
b"required-options-enter-membership-without-presentation-priority;"
|
|
44
|
+
b"prospective-joint-feasibility-witness=authenticated-current-contract;"
|
|
45
|
+
b"screened-pool-preserves-one-exact-controller-slate;"
|
|
46
|
+
b"complete-finite-contract-mode-resolves-universe-size-at-selection"
|
|
47
|
+
).hexdigest()
|
|
48
|
+
|
|
49
|
+
_STATE_DOMAIN = b"agent-evolve:common-candidate-pool-state:v1\x00"
|
|
50
|
+
_TASK_DOMAIN = b"agent-evolve:common-candidate-pool-task:v2\x00"
|
|
51
|
+
_OPTION_ORDER_DOMAIN = b"agent-evolve:common-candidate-pool-option-order:v2\x00"
|
|
52
|
+
_PRESENTATION_ORDER_DOMAIN = (
|
|
53
|
+
b"agent-evolve:common-candidate-pool-presentation-order:v2\x00"
|
|
54
|
+
)
|
|
55
|
+
_DECISION_DOMAIN = b"agent-evolve:common-candidate-pool-decision:v2\x00"
|
|
56
|
+
_MAX_SEED = (1 << 63) - 1
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def _canonical_json(value: object) -> bytes:
|
|
60
|
+
return json.dumps(
|
|
61
|
+
value,
|
|
62
|
+
allow_nan=False,
|
|
63
|
+
ensure_ascii=True,
|
|
64
|
+
separators=(",", ":"),
|
|
65
|
+
sort_keys=True,
|
|
66
|
+
).encode("ascii", errors="strict")
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def _hash(domain: bytes, value: object) -> str:
|
|
70
|
+
return hashlib.sha256(domain + _canonical_json(value)).hexdigest()
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def _state_record(
|
|
74
|
+
*,
|
|
75
|
+
replicate_seed: int,
|
|
76
|
+
benchmark_sha256: str,
|
|
77
|
+
wave_index: int,
|
|
78
|
+
parent_configuration_sha256: str,
|
|
79
|
+
finite_contract_sha256: str,
|
|
80
|
+
evaluation_size: int,
|
|
81
|
+
min_distinct_families: int | None,
|
|
82
|
+
require_pairwise_disjoint_parent_patches: bool,
|
|
83
|
+
required_option_ids: tuple[str, ...],
|
|
84
|
+
certified_feasibility_witness_option_ids: tuple[str, ...],
|
|
85
|
+
) -> dict[str, object]:
|
|
86
|
+
record = {
|
|
87
|
+
"schema_version": (
|
|
88
|
+
3 if certified_feasibility_witness_option_ids else 2
|
|
89
|
+
),
|
|
90
|
+
"replicate_seed": replicate_seed,
|
|
91
|
+
"benchmark_sha256": benchmark_sha256,
|
|
92
|
+
"wave_index": wave_index,
|
|
93
|
+
"parent_configuration_sha256": parent_configuration_sha256,
|
|
94
|
+
"finite_contract_sha256": finite_contract_sha256,
|
|
95
|
+
"evaluation_size": evaluation_size,
|
|
96
|
+
"min_distinct_families": min_distinct_families,
|
|
97
|
+
"require_pairwise_disjoint_parent_patches": (
|
|
98
|
+
require_pairwise_disjoint_parent_patches
|
|
99
|
+
),
|
|
100
|
+
"required_option_ids": list(required_option_ids),
|
|
101
|
+
}
|
|
102
|
+
if certified_feasibility_witness_option_ids:
|
|
103
|
+
record["certified_feasibility_witness_option_ids"] = list(
|
|
104
|
+
certified_feasibility_witness_option_ids
|
|
105
|
+
)
|
|
106
|
+
return record
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def _task_record(
|
|
110
|
+
*,
|
|
111
|
+
replicate_seed: int,
|
|
112
|
+
benchmark_sha256: str,
|
|
113
|
+
wave_index: int,
|
|
114
|
+
parent_configuration_sha256: str,
|
|
115
|
+
finite_contract_sha256: str,
|
|
116
|
+
candidate_pool_size: int,
|
|
117
|
+
model_selection_size: int,
|
|
118
|
+
evaluation_size: int,
|
|
119
|
+
min_distinct_families: int | None,
|
|
120
|
+
require_pairwise_disjoint_parent_patches: bool,
|
|
121
|
+
required_option_ids: tuple[str, ...],
|
|
122
|
+
certified_feasibility_witness_option_ids: tuple[str, ...],
|
|
123
|
+
) -> dict[str, object]:
|
|
124
|
+
state = _state_record(
|
|
125
|
+
replicate_seed=replicate_seed,
|
|
126
|
+
benchmark_sha256=benchmark_sha256,
|
|
127
|
+
wave_index=wave_index,
|
|
128
|
+
parent_configuration_sha256=parent_configuration_sha256,
|
|
129
|
+
finite_contract_sha256=finite_contract_sha256,
|
|
130
|
+
evaluation_size=evaluation_size,
|
|
131
|
+
min_distinct_families=min_distinct_families,
|
|
132
|
+
require_pairwise_disjoint_parent_patches=(
|
|
133
|
+
require_pairwise_disjoint_parent_patches
|
|
134
|
+
),
|
|
135
|
+
required_option_ids=required_option_ids,
|
|
136
|
+
certified_feasibility_witness_option_ids=(
|
|
137
|
+
certified_feasibility_witness_option_ids
|
|
138
|
+
),
|
|
139
|
+
)
|
|
140
|
+
return {
|
|
141
|
+
**state,
|
|
142
|
+
"schema_version": (
|
|
143
|
+
4 if certified_feasibility_witness_option_ids else 3
|
|
144
|
+
),
|
|
145
|
+
"state_identity_sha256": _hash(_STATE_DOMAIN, state),
|
|
146
|
+
"candidate_pool_size": candidate_pool_size,
|
|
147
|
+
"model_selection_size": model_selection_size,
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def _validate_inputs(
|
|
152
|
+
*,
|
|
153
|
+
replicate_seed: int,
|
|
154
|
+
benchmark_sha256: str,
|
|
155
|
+
wave_index: int,
|
|
156
|
+
parent_configuration_sha256: str,
|
|
157
|
+
contract: FiniteVariationContract,
|
|
158
|
+
candidate_pool_size: int,
|
|
159
|
+
model_selection_size: int,
|
|
160
|
+
evaluation_size: int,
|
|
161
|
+
min_distinct_families: int | None,
|
|
162
|
+
require_pairwise_disjoint_parent_patches: bool,
|
|
163
|
+
required_option_ids: tuple[str, ...],
|
|
164
|
+
certified_feasibility_witness_option_ids: tuple[str, ...],
|
|
165
|
+
) -> None:
|
|
166
|
+
if type(replicate_seed) is not int or not 0 <= replicate_seed <= _MAX_SEED:
|
|
167
|
+
raise ValueError("replicate_seed must be an exact non-negative int63")
|
|
168
|
+
require_sha256(benchmark_sha256, "benchmark_sha256")
|
|
169
|
+
require_sha256(parent_configuration_sha256, "parent_configuration_sha256")
|
|
170
|
+
if type(contract) is not FiniteVariationContract:
|
|
171
|
+
raise TypeError("contract must be an exact FiniteVariationContract")
|
|
172
|
+
contract.__post_init__()
|
|
173
|
+
if contract.parent_configuration_sha256 != parent_configuration_sha256:
|
|
174
|
+
raise ValueError("common-pool parent differs from the finite contract")
|
|
175
|
+
if type(wave_index) is not int or wave_index <= 0:
|
|
176
|
+
raise ValueError("wave_index must be a positive exact integer")
|
|
177
|
+
if type(candidate_pool_size) is not int or candidate_pool_size <= 0:
|
|
178
|
+
raise ValueError("candidate_pool_size must be a positive exact integer")
|
|
179
|
+
if type(model_selection_size) is not int or not (
|
|
180
|
+
0 < model_selection_size <= candidate_pool_size
|
|
181
|
+
):
|
|
182
|
+
raise ValueError(
|
|
183
|
+
"model_selection_size must lie in [1, candidate_pool_size]"
|
|
184
|
+
)
|
|
185
|
+
if type(evaluation_size) is not int or not (
|
|
186
|
+
0 < evaluation_size <= model_selection_size
|
|
187
|
+
):
|
|
188
|
+
raise ValueError("evaluation_size must lie in [1, model_selection_size]")
|
|
189
|
+
if candidate_pool_size > len(contract.options):
|
|
190
|
+
raise ValueError("candidate_pool_size exceeds the finite option count")
|
|
191
|
+
if min_distinct_families is not None and (
|
|
192
|
+
type(min_distinct_families) is not int
|
|
193
|
+
or not 1 <= min_distinct_families <= evaluation_size
|
|
194
|
+
):
|
|
195
|
+
raise ValueError(
|
|
196
|
+
"min_distinct_families must lie within the evaluation size"
|
|
197
|
+
)
|
|
198
|
+
if type(require_pairwise_disjoint_parent_patches) is not bool:
|
|
199
|
+
raise TypeError(
|
|
200
|
+
"require_pairwise_disjoint_parent_patches must be an exact bool"
|
|
201
|
+
)
|
|
202
|
+
if type(required_option_ids) is not tuple or any(
|
|
203
|
+
type(value) is not str for value in required_option_ids
|
|
204
|
+
):
|
|
205
|
+
raise TypeError("required_option_ids must be an exact string tuple")
|
|
206
|
+
if required_option_ids != tuple(sorted(set(required_option_ids))):
|
|
207
|
+
raise ValueError("required_option_ids must be unique and canonical")
|
|
208
|
+
available = {value.option_id for value in contract.options}
|
|
209
|
+
if not set(required_option_ids).issubset(available):
|
|
210
|
+
raise ValueError("required option IDs escape the finite contract")
|
|
211
|
+
if len(required_option_ids) > candidate_pool_size:
|
|
212
|
+
raise ValueError("required option IDs exceed the candidate-pool size")
|
|
213
|
+
witness = certified_feasibility_witness_option_ids
|
|
214
|
+
if type(witness) is not tuple:
|
|
215
|
+
raise TypeError(
|
|
216
|
+
"certified_feasibility_witness_option_ids must be an exact tuple"
|
|
217
|
+
)
|
|
218
|
+
if witness:
|
|
219
|
+
if len(witness) != evaluation_size or witness != tuple(sorted(set(witness))):
|
|
220
|
+
raise ValueError(
|
|
221
|
+
"certified feasibility witness must contain one canonical unique "
|
|
222
|
+
"option per evaluation slot"
|
|
223
|
+
)
|
|
224
|
+
if not set(witness).issubset(available):
|
|
225
|
+
raise ValueError("certified feasibility witness escapes the finite contract")
|
|
226
|
+
option_by_id = {value.option_id: value for value in contract.options}
|
|
227
|
+
if min_distinct_families is not None and len(
|
|
228
|
+
{option_by_id[value].family for value in witness}
|
|
229
|
+
) < min_distinct_families:
|
|
230
|
+
raise ValueError("certified feasibility witness violates family coverage")
|
|
231
|
+
if require_pairwise_disjoint_parent_patches and (
|
|
232
|
+
pairwise_disjoint_parent_patch_witness(
|
|
233
|
+
contract,
|
|
234
|
+
witness,
|
|
235
|
+
portfolio_size=evaluation_size,
|
|
236
|
+
min_distinct_families=min_distinct_families,
|
|
237
|
+
ordering_key_sha256=contract.identity_sha256,
|
|
238
|
+
)
|
|
239
|
+
is None
|
|
240
|
+
):
|
|
241
|
+
raise ValueError(
|
|
242
|
+
"certified feasibility witness violates pairwise patch constraints"
|
|
243
|
+
)
|
|
244
|
+
if len(set(required_option_ids).union(witness)) > candidate_pool_size:
|
|
245
|
+
raise ValueError(
|
|
246
|
+
"candidate pool cannot preserve required options and its certified witness"
|
|
247
|
+
)
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
@dataclass(frozen=True, slots=True)
|
|
251
|
+
class CommonCandidatePoolDecision:
|
|
252
|
+
"""Authenticated exact pool membership and its model-free derivation."""
|
|
253
|
+
|
|
254
|
+
replicate_seed: int
|
|
255
|
+
benchmark_sha256: str
|
|
256
|
+
wave_index: int
|
|
257
|
+
parent_configuration_sha256: str
|
|
258
|
+
finite_contract_sha256: str
|
|
259
|
+
candidate_pool_size: int
|
|
260
|
+
model_selection_size: int
|
|
261
|
+
evaluation_size: int
|
|
262
|
+
min_distinct_families: int | None
|
|
263
|
+
require_pairwise_disjoint_parent_patches: bool
|
|
264
|
+
required_option_ids: tuple[str, ...]
|
|
265
|
+
certified_feasibility_witness_option_ids: tuple[str, ...]
|
|
266
|
+
option_ids: tuple[str, ...]
|
|
267
|
+
feasibility_witness_option_ids: tuple[str, ...]
|
|
268
|
+
policy_id: str = POLICY_ID
|
|
269
|
+
policy_version: int = POLICY_VERSION
|
|
270
|
+
policy_definition_sha256: str = POLICY_DEFINITION_SHA256
|
|
271
|
+
state_identity_sha256: str = field(init=False)
|
|
272
|
+
task_identity_sha256: str = field(init=False)
|
|
273
|
+
decision_sha256: str = field(init=False)
|
|
274
|
+
|
|
275
|
+
def __post_init__(self) -> None:
|
|
276
|
+
if type(self.replicate_seed) is not int or not (
|
|
277
|
+
0 <= self.replicate_seed <= _MAX_SEED
|
|
278
|
+
):
|
|
279
|
+
raise ValueError("replicate_seed must be an exact non-negative int63")
|
|
280
|
+
require_sha256(self.benchmark_sha256, "benchmark_sha256")
|
|
281
|
+
require_sha256(
|
|
282
|
+
self.parent_configuration_sha256,
|
|
283
|
+
"parent_configuration_sha256",
|
|
284
|
+
)
|
|
285
|
+
require_sha256(self.finite_contract_sha256, "finite_contract_sha256")
|
|
286
|
+
require_sha256(self.policy_definition_sha256, "policy_definition_sha256")
|
|
287
|
+
if self.policy_id != POLICY_ID or self.policy_version != POLICY_VERSION:
|
|
288
|
+
raise ValueError("common-pool policy identity drifted")
|
|
289
|
+
if self.policy_definition_sha256 != POLICY_DEFINITION_SHA256:
|
|
290
|
+
raise ValueError("common-pool policy definition drifted")
|
|
291
|
+
if type(self.wave_index) is not int or self.wave_index <= 0:
|
|
292
|
+
raise ValueError("wave_index must be a positive exact integer")
|
|
293
|
+
if type(self.candidate_pool_size) is not int or self.candidate_pool_size <= 0:
|
|
294
|
+
raise ValueError("candidate_pool_size must be a positive exact integer")
|
|
295
|
+
if type(self.model_selection_size) is not int or not (
|
|
296
|
+
0 < self.model_selection_size <= self.candidate_pool_size
|
|
297
|
+
):
|
|
298
|
+
raise ValueError(
|
|
299
|
+
"model_selection_size must lie in [1, candidate_pool_size]"
|
|
300
|
+
)
|
|
301
|
+
if type(self.evaluation_size) is not int or not (
|
|
302
|
+
0 < self.evaluation_size <= self.model_selection_size
|
|
303
|
+
):
|
|
304
|
+
raise ValueError("evaluation_size must lie in [1, model_selection_size]")
|
|
305
|
+
if type(self.option_ids) is not tuple or len(self.option_ids) != (
|
|
306
|
+
self.candidate_pool_size
|
|
307
|
+
):
|
|
308
|
+
raise ValueError("option_ids must contain the exact candidate-pool size")
|
|
309
|
+
if len(set(self.option_ids)) != len(self.option_ids):
|
|
310
|
+
raise ValueError("common candidate pool cannot repeat an option")
|
|
311
|
+
if type(self.required_option_ids) is not tuple or (
|
|
312
|
+
self.required_option_ids
|
|
313
|
+
!= tuple(sorted(set(self.required_option_ids)))
|
|
314
|
+
):
|
|
315
|
+
raise ValueError("required_option_ids must be unique and canonical")
|
|
316
|
+
if not set(self.required_option_ids).issubset(self.option_ids):
|
|
317
|
+
raise ValueError("required options must enter the common pool")
|
|
318
|
+
certified = self.certified_feasibility_witness_option_ids
|
|
319
|
+
if type(certified) is not tuple:
|
|
320
|
+
raise TypeError(
|
|
321
|
+
"certified_feasibility_witness_option_ids must be an exact tuple"
|
|
322
|
+
)
|
|
323
|
+
if certified and certified != self.feasibility_witness_option_ids:
|
|
324
|
+
raise ValueError(
|
|
325
|
+
"certified feasibility witness differs from the pool certificate"
|
|
326
|
+
)
|
|
327
|
+
if type(self.feasibility_witness_option_ids) is not tuple:
|
|
328
|
+
raise TypeError("feasibility_witness_option_ids must be an exact tuple")
|
|
329
|
+
if len(self.feasibility_witness_option_ids) != self.evaluation_size:
|
|
330
|
+
raise ValueError("feasibility witness must cover the evaluation size")
|
|
331
|
+
if not set(self.feasibility_witness_option_ids).issubset(self.option_ids):
|
|
332
|
+
raise ValueError("feasibility witness escapes the common pool")
|
|
333
|
+
state_identity = _hash(_STATE_DOMAIN, self._state_record())
|
|
334
|
+
task_identity = _hash(_TASK_DOMAIN, self._task_record())
|
|
335
|
+
object.__setattr__(self, "state_identity_sha256", state_identity)
|
|
336
|
+
object.__setattr__(self, "task_identity_sha256", task_identity)
|
|
337
|
+
object.__setattr__(
|
|
338
|
+
self,
|
|
339
|
+
"decision_sha256",
|
|
340
|
+
_hash(_DECISION_DOMAIN, self._unsigned_record()),
|
|
341
|
+
)
|
|
342
|
+
|
|
343
|
+
def _state_record(self) -> dict[str, object]:
|
|
344
|
+
return _state_record(
|
|
345
|
+
replicate_seed=self.replicate_seed,
|
|
346
|
+
benchmark_sha256=self.benchmark_sha256,
|
|
347
|
+
wave_index=self.wave_index,
|
|
348
|
+
parent_configuration_sha256=self.parent_configuration_sha256,
|
|
349
|
+
finite_contract_sha256=self.finite_contract_sha256,
|
|
350
|
+
evaluation_size=self.evaluation_size,
|
|
351
|
+
min_distinct_families=self.min_distinct_families,
|
|
352
|
+
require_pairwise_disjoint_parent_patches=(
|
|
353
|
+
self.require_pairwise_disjoint_parent_patches
|
|
354
|
+
),
|
|
355
|
+
required_option_ids=self.required_option_ids,
|
|
356
|
+
certified_feasibility_witness_option_ids=(
|
|
357
|
+
self.certified_feasibility_witness_option_ids
|
|
358
|
+
),
|
|
359
|
+
)
|
|
360
|
+
|
|
361
|
+
def _task_record(self) -> dict[str, object]:
|
|
362
|
+
return _task_record(
|
|
363
|
+
replicate_seed=self.replicate_seed,
|
|
364
|
+
benchmark_sha256=self.benchmark_sha256,
|
|
365
|
+
wave_index=self.wave_index,
|
|
366
|
+
parent_configuration_sha256=self.parent_configuration_sha256,
|
|
367
|
+
finite_contract_sha256=self.finite_contract_sha256,
|
|
368
|
+
candidate_pool_size=self.candidate_pool_size,
|
|
369
|
+
model_selection_size=self.model_selection_size,
|
|
370
|
+
evaluation_size=self.evaluation_size,
|
|
371
|
+
min_distinct_families=self.min_distinct_families,
|
|
372
|
+
require_pairwise_disjoint_parent_patches=(
|
|
373
|
+
self.require_pairwise_disjoint_parent_patches
|
|
374
|
+
),
|
|
375
|
+
required_option_ids=self.required_option_ids,
|
|
376
|
+
certified_feasibility_witness_option_ids=(
|
|
377
|
+
self.certified_feasibility_witness_option_ids
|
|
378
|
+
),
|
|
379
|
+
)
|
|
380
|
+
|
|
381
|
+
def _unsigned_record(self) -> dict[str, object]:
|
|
382
|
+
return {
|
|
383
|
+
"schema_version": 4,
|
|
384
|
+
"state": self._state_record(),
|
|
385
|
+
"state_identity_sha256": _hash(
|
|
386
|
+
_STATE_DOMAIN,
|
|
387
|
+
self._state_record(),
|
|
388
|
+
),
|
|
389
|
+
"task": self._task_record(),
|
|
390
|
+
"task_identity_sha256": _hash(_TASK_DOMAIN, self._task_record()),
|
|
391
|
+
"option_ids": list(self.option_ids),
|
|
392
|
+
"required_option_ids": list(self.required_option_ids),
|
|
393
|
+
"certified_feasibility_witness_option_ids": list(
|
|
394
|
+
self.certified_feasibility_witness_option_ids
|
|
395
|
+
),
|
|
396
|
+
"feasibility_witness_option_ids": list(
|
|
397
|
+
self.feasibility_witness_option_ids
|
|
398
|
+
),
|
|
399
|
+
"policy": {
|
|
400
|
+
"policy_id": self.policy_id,
|
|
401
|
+
"policy_version": self.policy_version,
|
|
402
|
+
"definition_sha256": self.policy_definition_sha256,
|
|
403
|
+
},
|
|
404
|
+
"model_or_provider_fields_consulted": False,
|
|
405
|
+
"objective_or_outcome_values_consulted": False,
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
def to_record(self) -> dict[str, object]:
|
|
409
|
+
self.__post_init__()
|
|
410
|
+
return {**self._unsigned_record(), "decision_sha256": self.decision_sha256}
|
|
411
|
+
|
|
412
|
+
def to_prompt_record(self) -> dict[str, object]:
|
|
413
|
+
"""Return model-visible membership without the hidden feasible subset."""
|
|
414
|
+
|
|
415
|
+
self.__post_init__()
|
|
416
|
+
return {
|
|
417
|
+
"schema_version": 3,
|
|
418
|
+
"state_identity_sha256": self.state_identity_sha256,
|
|
419
|
+
"task_identity_sha256": self.task_identity_sha256,
|
|
420
|
+
"decision_sha256": self.decision_sha256,
|
|
421
|
+
"option_ids": list(self.option_ids),
|
|
422
|
+
"candidate_pool_size": self.candidate_pool_size,
|
|
423
|
+
"model_selection_size": self.model_selection_size,
|
|
424
|
+
"membership_is_fixed": True,
|
|
425
|
+
"model_must_select_and_rank_exact_count": self.model_selection_size,
|
|
426
|
+
"model_or_provider_fields_consulted": False,
|
|
427
|
+
"objective_or_outcome_values_consulted": False,
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
|
|
431
|
+
@dataclass(frozen=True, slots=True)
|
|
432
|
+
class TaskKeyedCommonCandidatePoolPolicy:
|
|
433
|
+
"""Construct one exact candidate universe independently of the model."""
|
|
434
|
+
|
|
435
|
+
replicate_seed: int
|
|
436
|
+
candidate_pool_size: int | None = 8
|
|
437
|
+
model_selection_size: int = 8
|
|
438
|
+
policy_id: str = POLICY_ID
|
|
439
|
+
policy_version: int = POLICY_VERSION
|
|
440
|
+
policy_definition_sha256: str = POLICY_DEFINITION_SHA256
|
|
441
|
+
|
|
442
|
+
def __post_init__(self) -> None:
|
|
443
|
+
if type(self.replicate_seed) is not int or not (
|
|
444
|
+
0 <= self.replicate_seed <= _MAX_SEED
|
|
445
|
+
):
|
|
446
|
+
raise ValueError("replicate_seed must be an exact non-negative int63")
|
|
447
|
+
if self.candidate_pool_size is not None and (
|
|
448
|
+
type(self.candidate_pool_size) is not int
|
|
449
|
+
or self.candidate_pool_size <= 0
|
|
450
|
+
):
|
|
451
|
+
raise ValueError(
|
|
452
|
+
"candidate_pool_size must be a positive exact integer or None"
|
|
453
|
+
)
|
|
454
|
+
if type(self.model_selection_size) is not int or (
|
|
455
|
+
self.model_selection_size <= 0
|
|
456
|
+
or (
|
|
457
|
+
self.candidate_pool_size is not None
|
|
458
|
+
and self.model_selection_size > self.candidate_pool_size
|
|
459
|
+
)
|
|
460
|
+
):
|
|
461
|
+
raise ValueError(
|
|
462
|
+
"model_selection_size must be positive and fit the candidate pool"
|
|
463
|
+
)
|
|
464
|
+
if self.policy_id != POLICY_ID or self.policy_version != POLICY_VERSION:
|
|
465
|
+
raise ValueError("common-pool policy identity drifted")
|
|
466
|
+
if self.policy_definition_sha256 != POLICY_DEFINITION_SHA256:
|
|
467
|
+
raise ValueError("common-pool policy definition drifted")
|
|
468
|
+
|
|
469
|
+
def select(
|
|
470
|
+
self,
|
|
471
|
+
*,
|
|
472
|
+
benchmark_sha256: str,
|
|
473
|
+
wave_index: int,
|
|
474
|
+
parent_configuration_sha256: str,
|
|
475
|
+
contract: FiniteVariationContract,
|
|
476
|
+
evaluation_size: int,
|
|
477
|
+
min_distinct_families: int | None,
|
|
478
|
+
require_pairwise_disjoint_parent_patches: bool,
|
|
479
|
+
required_option_ids: tuple[str, ...] = (),
|
|
480
|
+
certified_feasibility_witness_option_ids: tuple[str, ...] = (),
|
|
481
|
+
) -> CommonCandidatePoolDecision:
|
|
482
|
+
self.__post_init__()
|
|
483
|
+
if type(contract) is not FiniteVariationContract:
|
|
484
|
+
raise TypeError("contract must be an exact FiniteVariationContract")
|
|
485
|
+
contract.__post_init__()
|
|
486
|
+
candidate_pool_size = (
|
|
487
|
+
len(contract.options)
|
|
488
|
+
if self.candidate_pool_size is None
|
|
489
|
+
else self.candidate_pool_size
|
|
490
|
+
)
|
|
491
|
+
_validate_inputs(
|
|
492
|
+
replicate_seed=self.replicate_seed,
|
|
493
|
+
benchmark_sha256=benchmark_sha256,
|
|
494
|
+
wave_index=wave_index,
|
|
495
|
+
parent_configuration_sha256=parent_configuration_sha256,
|
|
496
|
+
contract=contract,
|
|
497
|
+
candidate_pool_size=candidate_pool_size,
|
|
498
|
+
model_selection_size=self.model_selection_size,
|
|
499
|
+
evaluation_size=evaluation_size,
|
|
500
|
+
min_distinct_families=min_distinct_families,
|
|
501
|
+
require_pairwise_disjoint_parent_patches=(
|
|
502
|
+
require_pairwise_disjoint_parent_patches
|
|
503
|
+
),
|
|
504
|
+
required_option_ids=required_option_ids,
|
|
505
|
+
certified_feasibility_witness_option_ids=(
|
|
506
|
+
certified_feasibility_witness_option_ids
|
|
507
|
+
),
|
|
508
|
+
)
|
|
509
|
+
state = _state_record(
|
|
510
|
+
replicate_seed=self.replicate_seed,
|
|
511
|
+
benchmark_sha256=benchmark_sha256,
|
|
512
|
+
wave_index=wave_index,
|
|
513
|
+
parent_configuration_sha256=parent_configuration_sha256,
|
|
514
|
+
finite_contract_sha256=contract.identity_sha256,
|
|
515
|
+
evaluation_size=evaluation_size,
|
|
516
|
+
min_distinct_families=min_distinct_families,
|
|
517
|
+
require_pairwise_disjoint_parent_patches=(
|
|
518
|
+
require_pairwise_disjoint_parent_patches
|
|
519
|
+
),
|
|
520
|
+
required_option_ids=required_option_ids,
|
|
521
|
+
certified_feasibility_witness_option_ids=(
|
|
522
|
+
certified_feasibility_witness_option_ids
|
|
523
|
+
),
|
|
524
|
+
)
|
|
525
|
+
state_identity = _hash(_STATE_DOMAIN, state)
|
|
526
|
+
all_option_ids = tuple(option.option_id for option in contract.options)
|
|
527
|
+
keyed_order = tuple(
|
|
528
|
+
sorted(
|
|
529
|
+
all_option_ids,
|
|
530
|
+
key=lambda option_id: (
|
|
531
|
+
hashlib.sha256(
|
|
532
|
+
_OPTION_ORDER_DOMAIN
|
|
533
|
+
+ bytes.fromhex(state_identity)
|
|
534
|
+
+ option_id.encode("ascii", errors="strict")
|
|
535
|
+
).digest(),
|
|
536
|
+
option_id,
|
|
537
|
+
),
|
|
538
|
+
)
|
|
539
|
+
)
|
|
540
|
+
if certified_feasibility_witness_option_ids:
|
|
541
|
+
witness = certified_feasibility_witness_option_ids
|
|
542
|
+
elif require_pairwise_disjoint_parent_patches:
|
|
543
|
+
witness = pairwise_disjoint_parent_patch_witness(
|
|
544
|
+
contract,
|
|
545
|
+
all_option_ids,
|
|
546
|
+
portfolio_size=evaluation_size,
|
|
547
|
+
min_distinct_families=min_distinct_families,
|
|
548
|
+
ordering_key_sha256=state_identity,
|
|
549
|
+
)
|
|
550
|
+
if witness is None: # The public request should already fail first.
|
|
551
|
+
raise ValueError("finite contract has no common-pool witness")
|
|
552
|
+
else:
|
|
553
|
+
witness = keyed_order[:evaluation_size]
|
|
554
|
+
members = list(witness)
|
|
555
|
+
members.extend(
|
|
556
|
+
option_id for option_id in required_option_ids if option_id not in members
|
|
557
|
+
)
|
|
558
|
+
if len(members) > candidate_pool_size:
|
|
559
|
+
raise ValueError(
|
|
560
|
+
"candidate pool cannot contain both its feasibility witness and "
|
|
561
|
+
"all required options"
|
|
562
|
+
)
|
|
563
|
+
members.extend(
|
|
564
|
+
option_id
|
|
565
|
+
for option_id in keyed_order
|
|
566
|
+
if option_id not in members
|
|
567
|
+
)
|
|
568
|
+
selected_members = frozenset(members[:candidate_pool_size])
|
|
569
|
+
presentation_order = tuple(
|
|
570
|
+
sorted(
|
|
571
|
+
all_option_ids,
|
|
572
|
+
key=lambda option_id: (
|
|
573
|
+
hashlib.sha256(
|
|
574
|
+
_PRESENTATION_ORDER_DOMAIN
|
|
575
|
+
+ bytes.fromhex(state_identity)
|
|
576
|
+
+ option_id.encode("ascii", errors="strict")
|
|
577
|
+
).digest(),
|
|
578
|
+
option_id,
|
|
579
|
+
),
|
|
580
|
+
)
|
|
581
|
+
)
|
|
582
|
+
ordered_members = [
|
|
583
|
+
option_id
|
|
584
|
+
for option_id in presentation_order
|
|
585
|
+
if option_id in selected_members
|
|
586
|
+
]
|
|
587
|
+
# Every pool larger than the hidden feasibility certificate contains
|
|
588
|
+
# this same state-keyed non-certificate guard. Placing it first keeps
|
|
589
|
+
# the certificate from becoming a visible answer prefix while
|
|
590
|
+
# preserving one relative presentation order for nested M assays.
|
|
591
|
+
witness_set = set(witness)
|
|
592
|
+
required_set = set(required_option_ids)
|
|
593
|
+
presentation_guard = next(
|
|
594
|
+
(
|
|
595
|
+
value
|
|
596
|
+
for value in members
|
|
597
|
+
if value not in witness_set and value not in required_set
|
|
598
|
+
),
|
|
599
|
+
None,
|
|
600
|
+
)
|
|
601
|
+
if presentation_guard in selected_members:
|
|
602
|
+
ordered_members = [
|
|
603
|
+
presentation_guard,
|
|
604
|
+
*(value for value in ordered_members if value != presentation_guard),
|
|
605
|
+
]
|
|
606
|
+
option_ids = tuple(ordered_members)
|
|
607
|
+
return CommonCandidatePoolDecision(
|
|
608
|
+
replicate_seed=self.replicate_seed,
|
|
609
|
+
benchmark_sha256=benchmark_sha256,
|
|
610
|
+
wave_index=wave_index,
|
|
611
|
+
parent_configuration_sha256=parent_configuration_sha256,
|
|
612
|
+
finite_contract_sha256=contract.identity_sha256,
|
|
613
|
+
candidate_pool_size=candidate_pool_size,
|
|
614
|
+
model_selection_size=self.model_selection_size,
|
|
615
|
+
evaluation_size=evaluation_size,
|
|
616
|
+
min_distinct_families=min_distinct_families,
|
|
617
|
+
require_pairwise_disjoint_parent_patches=(
|
|
618
|
+
require_pairwise_disjoint_parent_patches
|
|
619
|
+
),
|
|
620
|
+
required_option_ids=required_option_ids,
|
|
621
|
+
certified_feasibility_witness_option_ids=(
|
|
622
|
+
certified_feasibility_witness_option_ids
|
|
623
|
+
),
|
|
624
|
+
option_ids=option_ids,
|
|
625
|
+
feasibility_witness_option_ids=tuple(witness),
|
|
626
|
+
)
|
|
627
|
+
|
|
628
|
+
def require_decision(
|
|
629
|
+
self,
|
|
630
|
+
decision: CommonCandidatePoolDecision,
|
|
631
|
+
*,
|
|
632
|
+
benchmark_sha256: str,
|
|
633
|
+
wave_index: int,
|
|
634
|
+
parent_configuration_sha256: str,
|
|
635
|
+
contract: FiniteVariationContract,
|
|
636
|
+
evaluation_size: int,
|
|
637
|
+
min_distinct_families: int | None,
|
|
638
|
+
require_pairwise_disjoint_parent_patches: bool,
|
|
639
|
+
required_option_ids: tuple[str, ...] = (),
|
|
640
|
+
certified_feasibility_witness_option_ids: tuple[str, ...] = (),
|
|
641
|
+
) -> None:
|
|
642
|
+
if type(decision) is not CommonCandidatePoolDecision:
|
|
643
|
+
raise TypeError("decision must be an exact CommonCandidatePoolDecision")
|
|
644
|
+
expected = self.select(
|
|
645
|
+
benchmark_sha256=benchmark_sha256,
|
|
646
|
+
wave_index=wave_index,
|
|
647
|
+
parent_configuration_sha256=parent_configuration_sha256,
|
|
648
|
+
contract=contract,
|
|
649
|
+
evaluation_size=evaluation_size,
|
|
650
|
+
min_distinct_families=min_distinct_families,
|
|
651
|
+
require_pairwise_disjoint_parent_patches=(
|
|
652
|
+
require_pairwise_disjoint_parent_patches
|
|
653
|
+
),
|
|
654
|
+
required_option_ids=required_option_ids,
|
|
655
|
+
certified_feasibility_witness_option_ids=(
|
|
656
|
+
certified_feasibility_witness_option_ids
|
|
657
|
+
),
|
|
658
|
+
)
|
|
659
|
+
if decision.to_record() != expected.to_record():
|
|
660
|
+
raise ValueError("common candidate pool differs from exact policy replay")
|
|
661
|
+
|
|
662
|
+
def to_record(self) -> dict[str, object]:
|
|
663
|
+
self.__post_init__()
|
|
664
|
+
return {
|
|
665
|
+
"policy_id": self.policy_id,
|
|
666
|
+
"policy_version": self.policy_version,
|
|
667
|
+
"definition_sha256": self.policy_definition_sha256,
|
|
668
|
+
"replicate_seed": self.replicate_seed,
|
|
669
|
+
"candidate_pool_size": self.candidate_pool_size,
|
|
670
|
+
"candidate_pool_mode": (
|
|
671
|
+
"complete_finite_contract"
|
|
672
|
+
if self.candidate_pool_size is None
|
|
673
|
+
else "fixed_size"
|
|
674
|
+
),
|
|
675
|
+
"model_selection_size": self.model_selection_size,
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
|
|
679
|
+
__all__ = [
|
|
680
|
+
"CommonCandidatePoolDecision",
|
|
681
|
+
"POLICY_DEFINITION_SHA256",
|
|
682
|
+
"POLICY_ID",
|
|
683
|
+
"POLICY_VERSION",
|
|
684
|
+
"TaskKeyedCommonCandidatePoolPolicy",
|
|
685
|
+
]
|