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,814 @@
|
|
|
1
|
+
"""Outcome-blind model anchors with one full-abstention frontier probe.
|
|
2
|
+
|
|
3
|
+
The policy is intentionally small. It keeps the model-ranked top three and,
|
|
4
|
+
when the model fully abstains on every objective for an outside candidate,
|
|
5
|
+
spends the fourth evaluation on the most structurally novel such candidate.
|
|
6
|
+
Partial abstention is not an exploration trigger. In the absence of a full
|
|
7
|
+
abstention the policy evaluates the model top four.
|
|
8
|
+
|
|
9
|
+
Evaluation allocation is a portfolio-learning decision, while pairwise patch
|
|
10
|
+
compatibility and minimum family coverage are mating/recombination concerns.
|
|
11
|
+
Historical requests conflate those stages, so this module makes their removal
|
|
12
|
+
an explicit, authenticated projection. Phenotype uniqueness and bounded
|
|
13
|
+
memory-dose safety remain hard evaluation constraints.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import hashlib
|
|
19
|
+
import json
|
|
20
|
+
from dataclasses import dataclass, replace
|
|
21
|
+
from enum import Enum
|
|
22
|
+
from itertools import combinations
|
|
23
|
+
from typing import ClassVar
|
|
24
|
+
|
|
25
|
+
from agent_evolve.domain.patch import require_sha256
|
|
26
|
+
from agent_evolve.policies.selection.calibrated_slate import (
|
|
27
|
+
CalibratedSlateMember,
|
|
28
|
+
SlateAllocationRequest,
|
|
29
|
+
assess_allocated_slate_memory_dose,
|
|
30
|
+
)
|
|
31
|
+
from agent_evolve.ports.agentic_generator import MetricEffectDirection
|
|
32
|
+
from agent_evolve.ports.portfolio_memory_dose import (
|
|
33
|
+
PortfolioMemoryDoseAssessment,
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
POLICY_ID = "model_anchored_full_abstention_frontier_probe"
|
|
38
|
+
POLICY_VERSION = 1
|
|
39
|
+
POLICY_DEFINITION_SHA256 = hashlib.sha256(
|
|
40
|
+
b"agent-evolve:model-anchored-full-abstention-frontier-probe:v1;"
|
|
41
|
+
b"slate-size=8;portfolio-size=4;model-anchors=3;"
|
|
42
|
+
b"probe-trigger=full-vector-unknown-outside-anchor-prefix;"
|
|
43
|
+
b"partial-abstention-trigger=false;"
|
|
44
|
+
b"probe-rank=mean-archive-novelty-and-structural-coverage;"
|
|
45
|
+
b"no-probe=model-top-four;phenotype-uniqueness=hard;"
|
|
46
|
+
b"bounded-memory-dose=hard;assigned-cards-without-dose=advisory;"
|
|
47
|
+
b"mating-constraints=explicitly-projected-from-evaluation;"
|
|
48
|
+
b"ties=model-rank,option-id;outcome-blind=true;"
|
|
49
|
+
b"benchmark-specific-parameters=none"
|
|
50
|
+
).hexdigest()
|
|
51
|
+
|
|
52
|
+
PROJECTION_POLICY_ID = "evaluation_allocation_constraint_projection"
|
|
53
|
+
PROJECTION_POLICY_VERSION = 1
|
|
54
|
+
PROJECTION_DEFINITION_SHA256 = hashlib.sha256(
|
|
55
|
+
b"agent-evolve:evaluation-allocation-constraint-projection:v1;"
|
|
56
|
+
b"remove=pairwise-disjoint-option-pairs,min-distinct-families;"
|
|
57
|
+
b"preserve=slate,portfolio-size,objectives,cards,calibration,"
|
|
58
|
+
b"bounded-memory-dose;scope=evaluation-only;"
|
|
59
|
+
b"downstream-mating-compatibility-unchanged=true"
|
|
60
|
+
).hexdigest()
|
|
61
|
+
|
|
62
|
+
_DECISION_DOMAIN = b"agent-evolve:frontier-probe-slate-decision:v1\x00"
|
|
63
|
+
_PROJECTION_DOMAIN = b"agent-evolve:evaluation-constraint-projection:v1\x00"
|
|
64
|
+
_CONFIGURATION_DOMAIN = b"agent-evolve:frontier-probe-config:v1\x00"
|
|
65
|
+
_SLATE_SIZE = 8
|
|
66
|
+
_PORTFOLIO_SIZE = 4
|
|
67
|
+
_MODEL_ANCHOR_COUNT = 3
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _canonical_json(value: object) -> bytes:
|
|
71
|
+
return json.dumps(
|
|
72
|
+
value,
|
|
73
|
+
allow_nan=False,
|
|
74
|
+
ensure_ascii=True,
|
|
75
|
+
separators=(",", ":"),
|
|
76
|
+
sort_keys=True,
|
|
77
|
+
).encode("ascii", errors="strict")
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def _hash(domain: bytes, value: object) -> str:
|
|
81
|
+
return hashlib.sha256(domain + _canonical_json(value)).hexdigest()
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def _configuration_record() -> dict[str, object]:
|
|
85
|
+
return {
|
|
86
|
+
"schema_version": 1,
|
|
87
|
+
"slate_size": _SLATE_SIZE,
|
|
88
|
+
"portfolio_size": _PORTFOLIO_SIZE,
|
|
89
|
+
"model_anchor_count": _MODEL_ANCHOR_COUNT,
|
|
90
|
+
"probe_trigger": "full_vector_abstention_outside_anchor_prefix",
|
|
91
|
+
"probe_structural_score": (
|
|
92
|
+
"mean_archive_novelty_and_structural_coverage"
|
|
93
|
+
),
|
|
94
|
+
"partial_abstention_is_probe": False,
|
|
95
|
+
"hard_evaluation_constraints": [
|
|
96
|
+
"distinct_option_identity",
|
|
97
|
+
"distinct_phenotype_identity",
|
|
98
|
+
"bounded_memory_dose_when_present",
|
|
99
|
+
],
|
|
100
|
+
"projected_mating_constraints": [
|
|
101
|
+
"pairwise_disjoint_option_id_pairs",
|
|
102
|
+
"min_distinct_families",
|
|
103
|
+
],
|
|
104
|
+
"benchmark_specific_parameters": [],
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
CONFIGURATION_SHA256 = _hash(_CONFIGURATION_DOMAIN, _configuration_record())
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
@dataclass(frozen=True, slots=True, eq=False)
|
|
112
|
+
class EvaluationAllocationConstraintProjection:
|
|
113
|
+
"""Authenticated separation of evaluation and mating constraints."""
|
|
114
|
+
|
|
115
|
+
source_request: SlateAllocationRequest
|
|
116
|
+
projected_request: SlateAllocationRequest
|
|
117
|
+
|
|
118
|
+
policy_id: ClassVar[str] = PROJECTION_POLICY_ID
|
|
119
|
+
policy_version: ClassVar[int] = PROJECTION_POLICY_VERSION
|
|
120
|
+
policy_definition_sha256: ClassVar[str] = PROJECTION_DEFINITION_SHA256
|
|
121
|
+
|
|
122
|
+
def __post_init__(self) -> None:
|
|
123
|
+
if type(self.source_request) is not SlateAllocationRequest:
|
|
124
|
+
raise TypeError("source_request must be exact SlateAllocationRequest")
|
|
125
|
+
if type(self.projected_request) is not SlateAllocationRequest:
|
|
126
|
+
raise TypeError("projected_request must be exact SlateAllocationRequest")
|
|
127
|
+
self.source_request.revalidate()
|
|
128
|
+
self.projected_request.revalidate()
|
|
129
|
+
expected = replace(
|
|
130
|
+
self.source_request,
|
|
131
|
+
pairwise_disjoint_option_id_pairs=None,
|
|
132
|
+
min_distinct_families=None,
|
|
133
|
+
)
|
|
134
|
+
if self.projected_request != expected:
|
|
135
|
+
raise ValueError(
|
|
136
|
+
"projected request differs beyond mating-only constraints"
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
def revalidate(self) -> None:
|
|
140
|
+
if type(self) is not EvaluationAllocationConstraintProjection:
|
|
141
|
+
raise TypeError("projection must be exact")
|
|
142
|
+
EvaluationAllocationConstraintProjection.__post_init__(self)
|
|
143
|
+
|
|
144
|
+
@property
|
|
145
|
+
def removed_pairwise_constraint(self) -> bool:
|
|
146
|
+
self.revalidate()
|
|
147
|
+
return self.source_request.pairwise_disjoint_option_id_pairs is not None
|
|
148
|
+
|
|
149
|
+
@property
|
|
150
|
+
def removed_pair_count(self) -> int:
|
|
151
|
+
self.revalidate()
|
|
152
|
+
pairs = self.source_request.pairwise_disjoint_option_id_pairs
|
|
153
|
+
return 0 if pairs is None else len(pairs)
|
|
154
|
+
|
|
155
|
+
@property
|
|
156
|
+
def removed_min_distinct_families(self) -> int | None:
|
|
157
|
+
self.revalidate()
|
|
158
|
+
return self.source_request.min_distinct_families
|
|
159
|
+
|
|
160
|
+
def _unsigned_record(self) -> dict[str, object]:
|
|
161
|
+
self.revalidate()
|
|
162
|
+
return {
|
|
163
|
+
"schema_version": 1,
|
|
164
|
+
"event_type": "evaluation_allocation_constraints_projected",
|
|
165
|
+
"policy_id": self.policy_id,
|
|
166
|
+
"policy_version": self.policy_version,
|
|
167
|
+
"policy_definition_sha256": self.policy_definition_sha256,
|
|
168
|
+
"source_request_sha256": self.source_request.request_sha256,
|
|
169
|
+
"projected_request_sha256": self.projected_request.request_sha256,
|
|
170
|
+
"removed_pairwise_constraint": self.removed_pairwise_constraint,
|
|
171
|
+
"removed_pair_count": self.removed_pair_count,
|
|
172
|
+
"removed_min_distinct_families": (
|
|
173
|
+
self.removed_min_distinct_families
|
|
174
|
+
),
|
|
175
|
+
"preserved_memory_dose_contract_sha256": (
|
|
176
|
+
None
|
|
177
|
+
if self.projected_request.memory_dose_contract is None
|
|
178
|
+
else self.projected_request.memory_dose_contract.contract_sha256
|
|
179
|
+
),
|
|
180
|
+
"scope": (
|
|
181
|
+
"evaluation_allocation_only_downstream_mating_constraints_"
|
|
182
|
+
"remain_authoritative"
|
|
183
|
+
),
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
@property
|
|
187
|
+
def projection_sha256(self) -> str:
|
|
188
|
+
return _hash(_PROJECTION_DOMAIN, self._unsigned_record())
|
|
189
|
+
|
|
190
|
+
def to_record(self) -> dict[str, object]:
|
|
191
|
+
return {
|
|
192
|
+
**self._unsigned_record(),
|
|
193
|
+
"projection_sha256": self.projection_sha256,
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
def __eq__(self, other: object) -> bool:
|
|
197
|
+
return (
|
|
198
|
+
type(other) is EvaluationAllocationConstraintProjection
|
|
199
|
+
and self.projection_sha256 == other.projection_sha256
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
__hash__ = None
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
def project_evaluation_allocation_request(
|
|
206
|
+
request: SlateAllocationRequest,
|
|
207
|
+
) -> EvaluationAllocationConstraintProjection:
|
|
208
|
+
"""Remove only mating-specific constraints from an evaluation request."""
|
|
209
|
+
|
|
210
|
+
if type(request) is not SlateAllocationRequest:
|
|
211
|
+
raise TypeError("request must be exact SlateAllocationRequest")
|
|
212
|
+
request.revalidate()
|
|
213
|
+
return EvaluationAllocationConstraintProjection(
|
|
214
|
+
source_request=request,
|
|
215
|
+
projected_request=replace(
|
|
216
|
+
request,
|
|
217
|
+
pairwise_disjoint_option_id_pairs=None,
|
|
218
|
+
min_distinct_families=None,
|
|
219
|
+
),
|
|
220
|
+
)
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
class FrontierProbeSlateRole(str, Enum):
|
|
224
|
+
"""Engine-owned provenance for each selected evaluation."""
|
|
225
|
+
|
|
226
|
+
MODEL_ANCHOR = "model_anchor"
|
|
227
|
+
MODEL_FILL = "model_fill"
|
|
228
|
+
FULL_ABSTENTION_FRONTIER_PROBE = "full_abstention_frontier_probe"
|
|
229
|
+
SAFETY_RECOURSE = "safety_recourse"
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
@dataclass(frozen=True, slots=True)
|
|
233
|
+
class FrontierProbeMemberEvidence:
|
|
234
|
+
"""Outcome-free evidence used by the allocator for one member."""
|
|
235
|
+
|
|
236
|
+
option_id: str
|
|
237
|
+
option_identity_sha256: str
|
|
238
|
+
phenotype_identity_sha256: str
|
|
239
|
+
model_rank: int
|
|
240
|
+
unknown_metric_ids: tuple[str, ...]
|
|
241
|
+
full_vector_abstention: bool
|
|
242
|
+
structural_frontier_score: float
|
|
243
|
+
supported_assigned_card_keys: tuple[str, ...]
|
|
244
|
+
|
|
245
|
+
def __post_init__(self) -> None:
|
|
246
|
+
if type(self.option_id) is not str or not self.option_id:
|
|
247
|
+
raise ValueError("option_id must be a non-empty string")
|
|
248
|
+
require_sha256(self.option_identity_sha256, "option_identity_sha256")
|
|
249
|
+
require_sha256(
|
|
250
|
+
self.phenotype_identity_sha256,
|
|
251
|
+
"phenotype_identity_sha256",
|
|
252
|
+
)
|
|
253
|
+
if type(self.model_rank) is not int or self.model_rank <= 0:
|
|
254
|
+
raise ValueError("model_rank must be a positive exact integer")
|
|
255
|
+
if type(self.unknown_metric_ids) is not tuple or any(
|
|
256
|
+
type(value) is not str or not value
|
|
257
|
+
for value in self.unknown_metric_ids
|
|
258
|
+
):
|
|
259
|
+
raise TypeError("unknown_metric_ids must be an exact string tuple")
|
|
260
|
+
if self.unknown_metric_ids != tuple(
|
|
261
|
+
sorted(set(self.unknown_metric_ids))
|
|
262
|
+
):
|
|
263
|
+
raise ValueError("unknown_metric_ids must be unique and canonical")
|
|
264
|
+
if type(self.full_vector_abstention) is not bool:
|
|
265
|
+
raise TypeError("full_vector_abstention must be exact bool")
|
|
266
|
+
if type(self.structural_frontier_score) is not float or not (
|
|
267
|
+
0.0 <= self.structural_frontier_score <= 1.0
|
|
268
|
+
):
|
|
269
|
+
raise ValueError("structural_frontier_score must lie in [0, 1]")
|
|
270
|
+
if type(self.supported_assigned_card_keys) is not tuple or any(
|
|
271
|
+
type(value) is not str or not value
|
|
272
|
+
for value in self.supported_assigned_card_keys
|
|
273
|
+
):
|
|
274
|
+
raise TypeError(
|
|
275
|
+
"supported_assigned_card_keys must be an exact string tuple"
|
|
276
|
+
)
|
|
277
|
+
if self.supported_assigned_card_keys != tuple(
|
|
278
|
+
sorted(set(self.supported_assigned_card_keys))
|
|
279
|
+
):
|
|
280
|
+
raise ValueError(
|
|
281
|
+
"supported_assigned_card_keys must be unique and canonical"
|
|
282
|
+
)
|
|
283
|
+
|
|
284
|
+
def to_record(self) -> dict[str, object]:
|
|
285
|
+
self.__post_init__()
|
|
286
|
+
return {
|
|
287
|
+
"option_id": self.option_id,
|
|
288
|
+
"option_identity_sha256": self.option_identity_sha256,
|
|
289
|
+
"phenotype_identity_sha256": self.phenotype_identity_sha256,
|
|
290
|
+
"model_rank": self.model_rank,
|
|
291
|
+
"unknown_metric_ids": list(self.unknown_metric_ids),
|
|
292
|
+
"full_vector_abstention": self.full_vector_abstention,
|
|
293
|
+
"structural_frontier_score_hex": (
|
|
294
|
+
self.structural_frontier_score.hex()
|
|
295
|
+
),
|
|
296
|
+
"supported_assigned_card_keys": list(
|
|
297
|
+
self.supported_assigned_card_keys
|
|
298
|
+
),
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
@dataclass(frozen=True, slots=True)
|
|
303
|
+
class FrontierProbeAllocatedMember:
|
|
304
|
+
"""One selected member and its outcome-free selection role."""
|
|
305
|
+
|
|
306
|
+
role: FrontierProbeSlateRole
|
|
307
|
+
option_id: str
|
|
308
|
+
option_identity_sha256: str
|
|
309
|
+
model_rank: int
|
|
310
|
+
full_vector_abstention: bool
|
|
311
|
+
structural_frontier_score: float
|
|
312
|
+
|
|
313
|
+
def __post_init__(self) -> None:
|
|
314
|
+
if type(self.role) is not FrontierProbeSlateRole:
|
|
315
|
+
raise TypeError("role must be exact FrontierProbeSlateRole")
|
|
316
|
+
if type(self.option_id) is not str or not self.option_id:
|
|
317
|
+
raise ValueError("option_id must be a non-empty string")
|
|
318
|
+
require_sha256(self.option_identity_sha256, "option_identity_sha256")
|
|
319
|
+
if type(self.model_rank) is not int or self.model_rank <= 0:
|
|
320
|
+
raise ValueError("model_rank must be a positive exact integer")
|
|
321
|
+
if type(self.full_vector_abstention) is not bool:
|
|
322
|
+
raise TypeError("full_vector_abstention must be exact bool")
|
|
323
|
+
if type(self.structural_frontier_score) is not float or not (
|
|
324
|
+
0.0 <= self.structural_frontier_score <= 1.0
|
|
325
|
+
):
|
|
326
|
+
raise ValueError("structural_frontier_score must lie in [0, 1]")
|
|
327
|
+
|
|
328
|
+
def to_record(self) -> dict[str, object]:
|
|
329
|
+
self.__post_init__()
|
|
330
|
+
return {
|
|
331
|
+
"role": self.role.value,
|
|
332
|
+
"option_id": self.option_id,
|
|
333
|
+
"option_identity_sha256": self.option_identity_sha256,
|
|
334
|
+
"model_rank": self.model_rank,
|
|
335
|
+
"full_vector_abstention": self.full_vector_abstention,
|
|
336
|
+
"structural_frontier_score_hex": (
|
|
337
|
+
self.structural_frontier_score.hex()
|
|
338
|
+
),
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
|
|
342
|
+
@dataclass(frozen=True, slots=True)
|
|
343
|
+
class _FrontierProbeAssignment:
|
|
344
|
+
selected: tuple[FrontierProbeAllocatedMember, ...]
|
|
345
|
+
target_option_ids: tuple[str, ...]
|
|
346
|
+
available_full_abstention_option_ids: tuple[str, ...]
|
|
347
|
+
selected_probe_option_id: str | None
|
|
348
|
+
retained_target_count: int
|
|
349
|
+
ideal_target_feasible: bool
|
|
350
|
+
feasible_subset_count: int
|
|
351
|
+
distinct_family_count: int
|
|
352
|
+
distinct_locus_count: int
|
|
353
|
+
distinct_phenotype_count: int
|
|
354
|
+
administered_card_keys: tuple[str, ...]
|
|
355
|
+
memory_dose_assessment: PortfolioMemoryDoseAssessment | None
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
def _member_evidence(
|
|
359
|
+
request: SlateAllocationRequest,
|
|
360
|
+
member: CalibratedSlateMember,
|
|
361
|
+
) -> FrontierProbeMemberEvidence:
|
|
362
|
+
unknown_metric_ids = tuple(
|
|
363
|
+
prediction.metric_id
|
|
364
|
+
for prediction in member.predictions
|
|
365
|
+
if prediction.asserted_direction is MetricEffectDirection.UNKNOWN
|
|
366
|
+
)
|
|
367
|
+
metric_count = len(member.predictions)
|
|
368
|
+
structural_frontier_score = (
|
|
369
|
+
member.structural_evidence.archive_novelty_score
|
|
370
|
+
+ member.structural_evidence.structural_coverage_score
|
|
371
|
+
) / 2.0
|
|
372
|
+
return FrontierProbeMemberEvidence(
|
|
373
|
+
option_id=member.option_id,
|
|
374
|
+
option_identity_sha256=member.option_identity_sha256,
|
|
375
|
+
phenotype_identity_sha256=member.phenotype_identity_sha256,
|
|
376
|
+
model_rank=member.model_rank,
|
|
377
|
+
unknown_metric_ids=unknown_metric_ids,
|
|
378
|
+
full_vector_abstention=(len(unknown_metric_ids) == metric_count),
|
|
379
|
+
structural_frontier_score=structural_frontier_score,
|
|
380
|
+
supported_assigned_card_keys=tuple(
|
|
381
|
+
card
|
|
382
|
+
for card in request.assigned_card_keys
|
|
383
|
+
if card in member.supporting_card_keys
|
|
384
|
+
),
|
|
385
|
+
)
|
|
386
|
+
|
|
387
|
+
|
|
388
|
+
def _target(
|
|
389
|
+
rows: tuple[FrontierProbeMemberEvidence, ...],
|
|
390
|
+
) -> tuple[tuple[str, ...], tuple[str, ...], str | None]:
|
|
391
|
+
anchors = rows[:_MODEL_ANCHOR_COUNT]
|
|
392
|
+
outside_abstentions = tuple(
|
|
393
|
+
row
|
|
394
|
+
for row in rows[_MODEL_ANCHOR_COUNT:]
|
|
395
|
+
if row.full_vector_abstention
|
|
396
|
+
)
|
|
397
|
+
probe = (
|
|
398
|
+
None
|
|
399
|
+
if not outside_abstentions
|
|
400
|
+
else min(
|
|
401
|
+
outside_abstentions,
|
|
402
|
+
key=lambda row: (
|
|
403
|
+
-row.structural_frontier_score,
|
|
404
|
+
row.model_rank,
|
|
405
|
+
row.option_id,
|
|
406
|
+
),
|
|
407
|
+
)
|
|
408
|
+
)
|
|
409
|
+
fourth = rows[_MODEL_ANCHOR_COUNT] if probe is None else probe
|
|
410
|
+
return (
|
|
411
|
+
tuple(row.option_id for row in anchors) + (fourth.option_id,),
|
|
412
|
+
tuple(row.option_id for row in outside_abstentions),
|
|
413
|
+
None if probe is None else probe.option_id,
|
|
414
|
+
)
|
|
415
|
+
|
|
416
|
+
|
|
417
|
+
def _best_assignment(
|
|
418
|
+
request: SlateAllocationRequest,
|
|
419
|
+
rows: tuple[FrontierProbeMemberEvidence, ...],
|
|
420
|
+
) -> _FrontierProbeAssignment:
|
|
421
|
+
row_by_id = {row.option_id: row for row in rows}
|
|
422
|
+
target_ids, available_abstentions, probe_id = _target(rows)
|
|
423
|
+
target_set = set(target_ids)
|
|
424
|
+
anchor_ids = {row.option_id for row in rows[:_MODEL_ANCHOR_COUNT]}
|
|
425
|
+
feasible: list[
|
|
426
|
+
tuple[
|
|
427
|
+
tuple[object, ...],
|
|
428
|
+
tuple[CalibratedSlateMember, ...],
|
|
429
|
+
PortfolioMemoryDoseAssessment | None,
|
|
430
|
+
tuple[str, ...],
|
|
431
|
+
int,
|
|
432
|
+
int,
|
|
433
|
+
int,
|
|
434
|
+
]
|
|
435
|
+
] = []
|
|
436
|
+
for subset in combinations(request.slate.members, request.portfolio_size):
|
|
437
|
+
phenotype_count = len(
|
|
438
|
+
{member.phenotype_identity_sha256 for member in subset}
|
|
439
|
+
)
|
|
440
|
+
if phenotype_count != request.portfolio_size:
|
|
441
|
+
continue
|
|
442
|
+
dose_assessment = (
|
|
443
|
+
None
|
|
444
|
+
if request.memory_dose_contract is None
|
|
445
|
+
else assess_allocated_slate_memory_dose(request, subset)
|
|
446
|
+
)
|
|
447
|
+
if dose_assessment is not None and not dose_assessment.passed:
|
|
448
|
+
continue
|
|
449
|
+
subset_ids = {member.option_id for member in subset}
|
|
450
|
+
retained_target_count = len(target_set & subset_ids)
|
|
451
|
+
retained_anchor_count = len(anchor_ids & subset_ids)
|
|
452
|
+
probe_displaced = probe_id is not None and probe_id not in subset_ids
|
|
453
|
+
ranks = tuple(member.model_rank for member in subset)
|
|
454
|
+
structural_sum = sum(
|
|
455
|
+
row_by_id[member.option_id].structural_frontier_score
|
|
456
|
+
for member in subset
|
|
457
|
+
)
|
|
458
|
+
administered = tuple(
|
|
459
|
+
sorted(
|
|
460
|
+
{
|
|
461
|
+
card
|
|
462
|
+
for member in subset
|
|
463
|
+
for card in row_by_id[
|
|
464
|
+
member.option_id
|
|
465
|
+
].supported_assigned_card_keys
|
|
466
|
+
}
|
|
467
|
+
)
|
|
468
|
+
)
|
|
469
|
+
family_count = len({member.family for member in subset})
|
|
470
|
+
locus_count = len({member.locus_key for member in subset})
|
|
471
|
+
key: tuple[object, ...] = (
|
|
472
|
+
-retained_target_count,
|
|
473
|
+
-retained_anchor_count,
|
|
474
|
+
probe_displaced,
|
|
475
|
+
sum(ranks),
|
|
476
|
+
ranks,
|
|
477
|
+
-structural_sum,
|
|
478
|
+
tuple(member.option_id for member in subset),
|
|
479
|
+
)
|
|
480
|
+
feasible.append(
|
|
481
|
+
(
|
|
482
|
+
key,
|
|
483
|
+
subset,
|
|
484
|
+
dose_assessment,
|
|
485
|
+
administered,
|
|
486
|
+
family_count,
|
|
487
|
+
locus_count,
|
|
488
|
+
phenotype_count,
|
|
489
|
+
)
|
|
490
|
+
)
|
|
491
|
+
if not feasible:
|
|
492
|
+
raise ValueError(
|
|
493
|
+
"slate has no phenotype-unique K4 satisfying bounded memory dose"
|
|
494
|
+
)
|
|
495
|
+
(
|
|
496
|
+
_,
|
|
497
|
+
subset,
|
|
498
|
+
dose_assessment,
|
|
499
|
+
administered,
|
|
500
|
+
family_count,
|
|
501
|
+
locus_count,
|
|
502
|
+
phenotype_count,
|
|
503
|
+
) = min(feasible, key=lambda value: value[0])
|
|
504
|
+
selected_ids = {member.option_id for member in subset}
|
|
505
|
+
selected = tuple(
|
|
506
|
+
FrontierProbeAllocatedMember(
|
|
507
|
+
role=(
|
|
508
|
+
FrontierProbeSlateRole.MODEL_ANCHOR
|
|
509
|
+
if member.option_id in anchor_ids
|
|
510
|
+
else (
|
|
511
|
+
FrontierProbeSlateRole.FULL_ABSTENTION_FRONTIER_PROBE
|
|
512
|
+
if member.option_id == probe_id
|
|
513
|
+
else (
|
|
514
|
+
FrontierProbeSlateRole.MODEL_FILL
|
|
515
|
+
if member.option_id in target_set
|
|
516
|
+
else FrontierProbeSlateRole.SAFETY_RECOURSE
|
|
517
|
+
)
|
|
518
|
+
)
|
|
519
|
+
),
|
|
520
|
+
option_id=member.option_id,
|
|
521
|
+
option_identity_sha256=member.option_identity_sha256,
|
|
522
|
+
model_rank=member.model_rank,
|
|
523
|
+
full_vector_abstention=(
|
|
524
|
+
row_by_id[member.option_id].full_vector_abstention
|
|
525
|
+
),
|
|
526
|
+
structural_frontier_score=(
|
|
527
|
+
row_by_id[member.option_id].structural_frontier_score
|
|
528
|
+
),
|
|
529
|
+
)
|
|
530
|
+
for member in subset
|
|
531
|
+
)
|
|
532
|
+
return _FrontierProbeAssignment(
|
|
533
|
+
selected=selected,
|
|
534
|
+
target_option_ids=target_ids,
|
|
535
|
+
available_full_abstention_option_ids=available_abstentions,
|
|
536
|
+
selected_probe_option_id=(
|
|
537
|
+
probe_id if probe_id in selected_ids else None
|
|
538
|
+
),
|
|
539
|
+
retained_target_count=len(target_set & selected_ids),
|
|
540
|
+
ideal_target_feasible=target_set == selected_ids,
|
|
541
|
+
feasible_subset_count=len(feasible),
|
|
542
|
+
distinct_family_count=family_count,
|
|
543
|
+
distinct_locus_count=locus_count,
|
|
544
|
+
distinct_phenotype_count=phenotype_count,
|
|
545
|
+
administered_card_keys=administered,
|
|
546
|
+
memory_dose_assessment=dose_assessment,
|
|
547
|
+
)
|
|
548
|
+
|
|
549
|
+
|
|
550
|
+
def _validate_request(request: SlateAllocationRequest) -> None:
|
|
551
|
+
if len(request.slate.members) != _SLATE_SIZE:
|
|
552
|
+
raise ValueError("frontier-probe policy requires exactly eight members")
|
|
553
|
+
if request.portfolio_size != _PORTFOLIO_SIZE:
|
|
554
|
+
raise ValueError("frontier-probe policy requires four evaluations")
|
|
555
|
+
snapshot = request.calibration_snapshot
|
|
556
|
+
if snapshot is None:
|
|
557
|
+
return
|
|
558
|
+
if snapshot.cutoff_wave_index_exclusive > request.slate.wave_index:
|
|
559
|
+
raise ValueError("calibration snapshot cutoff reaches beyond current wave")
|
|
560
|
+
if any(
|
|
561
|
+
observation.prediction.wave_index >= request.slate.wave_index
|
|
562
|
+
for observation in snapshot.observations
|
|
563
|
+
):
|
|
564
|
+
raise ValueError("request carries current-wave outcome evidence")
|
|
565
|
+
|
|
566
|
+
|
|
567
|
+
@dataclass(frozen=True, slots=True, eq=False)
|
|
568
|
+
class FrontierProbeSlateDecision:
|
|
569
|
+
"""Replayable receipt for one projected, outcome-blind K8-to-K4 decision."""
|
|
570
|
+
|
|
571
|
+
projection: EvaluationAllocationConstraintProjection
|
|
572
|
+
member_evidence: tuple[FrontierProbeMemberEvidence, ...]
|
|
573
|
+
selected: tuple[FrontierProbeAllocatedMember, ...]
|
|
574
|
+
target_option_ids: tuple[str, ...]
|
|
575
|
+
available_full_abstention_option_ids: tuple[str, ...]
|
|
576
|
+
selected_probe_option_id: str | None
|
|
577
|
+
retained_target_count: int
|
|
578
|
+
ideal_target_feasible: bool
|
|
579
|
+
feasible_subset_count: int
|
|
580
|
+
distinct_family_count: int
|
|
581
|
+
distinct_locus_count: int
|
|
582
|
+
distinct_phenotype_count: int
|
|
583
|
+
administered_card_keys: tuple[str, ...]
|
|
584
|
+
memory_dose_assessment: PortfolioMemoryDoseAssessment | None = None
|
|
585
|
+
|
|
586
|
+
policy_id: ClassVar[str] = POLICY_ID
|
|
587
|
+
policy_version: ClassVar[int] = POLICY_VERSION
|
|
588
|
+
policy_definition_sha256: ClassVar[str] = POLICY_DEFINITION_SHA256
|
|
589
|
+
policy_configuration_sha256: ClassVar[str] = CONFIGURATION_SHA256
|
|
590
|
+
|
|
591
|
+
@property
|
|
592
|
+
def source_request(self) -> SlateAllocationRequest:
|
|
593
|
+
return self.projection.source_request
|
|
594
|
+
|
|
595
|
+
@property
|
|
596
|
+
def request(self) -> SlateAllocationRequest:
|
|
597
|
+
return self.projection.projected_request
|
|
598
|
+
|
|
599
|
+
def __post_init__(self) -> None:
|
|
600
|
+
if type(self.projection) is not EvaluationAllocationConstraintProjection:
|
|
601
|
+
raise TypeError("projection must be exact")
|
|
602
|
+
self.projection.revalidate()
|
|
603
|
+
_validate_request(self.request)
|
|
604
|
+
if type(self.member_evidence) is not tuple or any(
|
|
605
|
+
type(value) is not FrontierProbeMemberEvidence
|
|
606
|
+
for value in self.member_evidence
|
|
607
|
+
):
|
|
608
|
+
raise TypeError("member_evidence must contain exact rows")
|
|
609
|
+
for value in self.member_evidence:
|
|
610
|
+
value.__post_init__()
|
|
611
|
+
if type(self.selected) is not tuple or any(
|
|
612
|
+
type(value) is not FrontierProbeAllocatedMember
|
|
613
|
+
for value in self.selected
|
|
614
|
+
):
|
|
615
|
+
raise TypeError("selected must contain exact allocated members")
|
|
616
|
+
for value in self.selected:
|
|
617
|
+
value.__post_init__()
|
|
618
|
+
if self.memory_dose_assessment is not None:
|
|
619
|
+
if type(self.memory_dose_assessment) is not PortfolioMemoryDoseAssessment:
|
|
620
|
+
raise TypeError("memory_dose_assessment must be exact or None")
|
|
621
|
+
self.memory_dose_assessment.__post_init__()
|
|
622
|
+
expected_rows = tuple(
|
|
623
|
+
_member_evidence(self.request, member)
|
|
624
|
+
for member in self.request.slate.members
|
|
625
|
+
)
|
|
626
|
+
if self.member_evidence != expected_rows:
|
|
627
|
+
raise ValueError("member evidence differs from the projected request")
|
|
628
|
+
expected = _best_assignment(self.request, expected_rows)
|
|
629
|
+
observed_values = (
|
|
630
|
+
self.selected,
|
|
631
|
+
self.target_option_ids,
|
|
632
|
+
self.available_full_abstention_option_ids,
|
|
633
|
+
self.selected_probe_option_id,
|
|
634
|
+
self.retained_target_count,
|
|
635
|
+
self.ideal_target_feasible,
|
|
636
|
+
self.feasible_subset_count,
|
|
637
|
+
self.distinct_family_count,
|
|
638
|
+
self.distinct_locus_count,
|
|
639
|
+
self.distinct_phenotype_count,
|
|
640
|
+
self.administered_card_keys,
|
|
641
|
+
self.memory_dose_assessment,
|
|
642
|
+
)
|
|
643
|
+
expected_values = (
|
|
644
|
+
expected.selected,
|
|
645
|
+
expected.target_option_ids,
|
|
646
|
+
expected.available_full_abstention_option_ids,
|
|
647
|
+
expected.selected_probe_option_id,
|
|
648
|
+
expected.retained_target_count,
|
|
649
|
+
expected.ideal_target_feasible,
|
|
650
|
+
expected.feasible_subset_count,
|
|
651
|
+
expected.distinct_family_count,
|
|
652
|
+
expected.distinct_locus_count,
|
|
653
|
+
expected.distinct_phenotype_count,
|
|
654
|
+
expected.administered_card_keys,
|
|
655
|
+
expected.memory_dose_assessment,
|
|
656
|
+
)
|
|
657
|
+
if observed_values != expected_values:
|
|
658
|
+
raise ValueError("decision differs from exact frontier-probe allocation")
|
|
659
|
+
|
|
660
|
+
def revalidate(self) -> None:
|
|
661
|
+
if type(self) is not FrontierProbeSlateDecision:
|
|
662
|
+
raise TypeError("decision must be exact FrontierProbeSlateDecision")
|
|
663
|
+
FrontierProbeSlateDecision.__post_init__(self)
|
|
664
|
+
|
|
665
|
+
@property
|
|
666
|
+
def prior_only(self) -> bool:
|
|
667
|
+
self.revalidate()
|
|
668
|
+
snapshot = self.request.calibration_snapshot
|
|
669
|
+
return snapshot is None or all(
|
|
670
|
+
observation.prediction.wave_index < self.request.slate.wave_index
|
|
671
|
+
for observation in snapshot.observations
|
|
672
|
+
)
|
|
673
|
+
|
|
674
|
+
def _unsigned_record(self) -> dict[str, object]:
|
|
675
|
+
self.revalidate()
|
|
676
|
+
return {
|
|
677
|
+
"schema_version": 1,
|
|
678
|
+
"event_type": "frontier_probe_slate_allocated",
|
|
679
|
+
"policy_id": self.policy_id,
|
|
680
|
+
"policy_version": self.policy_version,
|
|
681
|
+
"policy_definition_sha256": self.policy_definition_sha256,
|
|
682
|
+
"policy_configuration_sha256": (
|
|
683
|
+
self.policy_configuration_sha256
|
|
684
|
+
),
|
|
685
|
+
"source_request": self.source_request.to_record(),
|
|
686
|
+
"projected_request": self.request.to_record(),
|
|
687
|
+
"constraint_projection": self.projection.to_record(),
|
|
688
|
+
"prior_only": self.prior_only,
|
|
689
|
+
"member_evidence": [
|
|
690
|
+
value.to_record() for value in self.member_evidence
|
|
691
|
+
],
|
|
692
|
+
"selected": [value.to_record() for value in self.selected],
|
|
693
|
+
"target_option_ids": list(self.target_option_ids),
|
|
694
|
+
"available_full_abstention_option_ids": list(
|
|
695
|
+
self.available_full_abstention_option_ids
|
|
696
|
+
),
|
|
697
|
+
"selected_probe_option_id": self.selected_probe_option_id,
|
|
698
|
+
"retained_target_count": self.retained_target_count,
|
|
699
|
+
"ideal_target_feasible": self.ideal_target_feasible,
|
|
700
|
+
"feasible_subset_count": self.feasible_subset_count,
|
|
701
|
+
"distinct_family_count": self.distinct_family_count,
|
|
702
|
+
"distinct_locus_count": self.distinct_locus_count,
|
|
703
|
+
"distinct_phenotype_count": self.distinct_phenotype_count,
|
|
704
|
+
"administered_card_keys": list(self.administered_card_keys),
|
|
705
|
+
**(
|
|
706
|
+
{}
|
|
707
|
+
if self.memory_dose_assessment is None
|
|
708
|
+
else {
|
|
709
|
+
"memory_dose_assessment": (
|
|
710
|
+
self.memory_dose_assessment.to_record()
|
|
711
|
+
)
|
|
712
|
+
}
|
|
713
|
+
),
|
|
714
|
+
"claim_scope": (
|
|
715
|
+
"replayable_outcome_blind_allocation_not_efficacy_or_"
|
|
716
|
+
"outcome_claim"
|
|
717
|
+
),
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
@property
|
|
721
|
+
def decision_sha256(self) -> str:
|
|
722
|
+
return _hash(_DECISION_DOMAIN, self._unsigned_record())
|
|
723
|
+
|
|
724
|
+
def to_record(self) -> dict[str, object]:
|
|
725
|
+
return {
|
|
726
|
+
**self._unsigned_record(),
|
|
727
|
+
"decision_sha256": self.decision_sha256,
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
def __eq__(self, other: object) -> bool:
|
|
731
|
+
return (
|
|
732
|
+
type(other) is FrontierProbeSlateDecision
|
|
733
|
+
and self.decision_sha256 == other.decision_sha256
|
|
734
|
+
)
|
|
735
|
+
|
|
736
|
+
__hash__ = None
|
|
737
|
+
|
|
738
|
+
|
|
739
|
+
@dataclass(frozen=True, slots=True)
|
|
740
|
+
class FrontierProbeSlatePolicy:
|
|
741
|
+
"""Keep model anchors and probe only structurally novel full abstention."""
|
|
742
|
+
|
|
743
|
+
policy_id: ClassVar[str] = POLICY_ID
|
|
744
|
+
policy_version: ClassVar[int] = POLICY_VERSION
|
|
745
|
+
definition_sha256: ClassVar[str] = POLICY_DEFINITION_SHA256
|
|
746
|
+
configuration_sha256: ClassVar[str] = CONFIGURATION_SHA256
|
|
747
|
+
|
|
748
|
+
def __post_init__(self) -> None:
|
|
749
|
+
if type(self) is not FrontierProbeSlatePolicy:
|
|
750
|
+
raise TypeError("policy must be exact FrontierProbeSlatePolicy")
|
|
751
|
+
|
|
752
|
+
def select(self, request: SlateAllocationRequest) -> FrontierProbeSlateDecision:
|
|
753
|
+
self.__post_init__()
|
|
754
|
+
if type(request) is not SlateAllocationRequest:
|
|
755
|
+
raise TypeError("request must be exact SlateAllocationRequest")
|
|
756
|
+
request.revalidate()
|
|
757
|
+
projection = project_evaluation_allocation_request(request)
|
|
758
|
+
_validate_request(projection.projected_request)
|
|
759
|
+
rows = tuple(
|
|
760
|
+
_member_evidence(projection.projected_request, member)
|
|
761
|
+
for member in projection.projected_request.slate.members
|
|
762
|
+
)
|
|
763
|
+
assignment = _best_assignment(projection.projected_request, rows)
|
|
764
|
+
return FrontierProbeSlateDecision(
|
|
765
|
+
projection=projection,
|
|
766
|
+
member_evidence=rows,
|
|
767
|
+
selected=assignment.selected,
|
|
768
|
+
target_option_ids=assignment.target_option_ids,
|
|
769
|
+
available_full_abstention_option_ids=(
|
|
770
|
+
assignment.available_full_abstention_option_ids
|
|
771
|
+
),
|
|
772
|
+
selected_probe_option_id=assignment.selected_probe_option_id,
|
|
773
|
+
retained_target_count=assignment.retained_target_count,
|
|
774
|
+
ideal_target_feasible=assignment.ideal_target_feasible,
|
|
775
|
+
feasible_subset_count=assignment.feasible_subset_count,
|
|
776
|
+
distinct_family_count=assignment.distinct_family_count,
|
|
777
|
+
distinct_locus_count=assignment.distinct_locus_count,
|
|
778
|
+
distinct_phenotype_count=assignment.distinct_phenotype_count,
|
|
779
|
+
administered_card_keys=assignment.administered_card_keys,
|
|
780
|
+
memory_dose_assessment=assignment.memory_dose_assessment,
|
|
781
|
+
)
|
|
782
|
+
|
|
783
|
+
def to_record(self) -> dict[str, object]:
|
|
784
|
+
self.__post_init__()
|
|
785
|
+
return {
|
|
786
|
+
"policy_id": self.policy_id,
|
|
787
|
+
"policy_version": self.policy_version,
|
|
788
|
+
"definition_sha256": self.definition_sha256,
|
|
789
|
+
"configuration": _configuration_record(),
|
|
790
|
+
"configuration_sha256": self.configuration_sha256,
|
|
791
|
+
"constraint_projection_policy": {
|
|
792
|
+
"policy_id": PROJECTION_POLICY_ID,
|
|
793
|
+
"policy_version": PROJECTION_POLICY_VERSION,
|
|
794
|
+
"definition_sha256": PROJECTION_DEFINITION_SHA256,
|
|
795
|
+
},
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
|
|
799
|
+
__all__ = [
|
|
800
|
+
"CONFIGURATION_SHA256",
|
|
801
|
+
"EvaluationAllocationConstraintProjection",
|
|
802
|
+
"FrontierProbeAllocatedMember",
|
|
803
|
+
"FrontierProbeMemberEvidence",
|
|
804
|
+
"FrontierProbeSlateDecision",
|
|
805
|
+
"FrontierProbeSlatePolicy",
|
|
806
|
+
"FrontierProbeSlateRole",
|
|
807
|
+
"POLICY_DEFINITION_SHA256",
|
|
808
|
+
"POLICY_ID",
|
|
809
|
+
"POLICY_VERSION",
|
|
810
|
+
"PROJECTION_DEFINITION_SHA256",
|
|
811
|
+
"PROJECTION_POLICY_ID",
|
|
812
|
+
"PROJECTION_POLICY_VERSION",
|
|
813
|
+
"project_evaluation_allocation_request",
|
|
814
|
+
]
|