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,1046 @@
|
|
|
1
|
+
"""Terminal integrity and mechanism decisions for the generic G3 screen.
|
|
2
|
+
|
|
3
|
+
The G3 planner validates chronology while constructing each next wave, but it
|
|
4
|
+
never observes the outcomes of its final zero-call wave. This module supplies
|
|
5
|
+
the independent post-G3 gate. A feedback interceptor must call
|
|
6
|
+
``validate_g3_terminal_state`` before dispatching the optional curation call.
|
|
7
|
+
The same authenticated core is re-used after optimization to validate the
|
|
8
|
+
six-call terminal result.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import hashlib
|
|
14
|
+
import json
|
|
15
|
+
import math
|
|
16
|
+
from collections.abc import Mapping
|
|
17
|
+
from dataclasses import dataclass, field, replace
|
|
18
|
+
|
|
19
|
+
from agent_evolve.application.agentic_evolution import (
|
|
20
|
+
EvolutionCandidate,
|
|
21
|
+
InsightAssignmentKind,
|
|
22
|
+
InvocationOutcome,
|
|
23
|
+
OperatorKind,
|
|
24
|
+
ProposalAuthority,
|
|
25
|
+
ReflectionCallReceipt,
|
|
26
|
+
ReflectionCallStatus,
|
|
27
|
+
ReflectionPublicationResult,
|
|
28
|
+
)
|
|
29
|
+
from agent_evolve.application.budgeted_optimizer import (
|
|
30
|
+
GenerationReceipt,
|
|
31
|
+
OptimizerResult,
|
|
32
|
+
OptimizerState,
|
|
33
|
+
validate_generation_receipt_integrity,
|
|
34
|
+
validate_optimizer_result_integrity,
|
|
35
|
+
)
|
|
36
|
+
from agent_evolve.application.g3_causal_screen import (
|
|
37
|
+
G1_DIAGNOSTIC_SLOT_IDS,
|
|
38
|
+
G2_SLOT_IDS,
|
|
39
|
+
G3_SLOT_IDS,
|
|
40
|
+
G3CausalScreenPlanner,
|
|
41
|
+
G3ExpectedEndpoint,
|
|
42
|
+
G3ExpectedUnion,
|
|
43
|
+
G3TerminalValidationAuthority,
|
|
44
|
+
G3_SCREEN_BUDGET,
|
|
45
|
+
)
|
|
46
|
+
from agent_evolve.application.g3_postseal_curation import (
|
|
47
|
+
G3PostsealCurationAuthority,
|
|
48
|
+
G3PostsealCurationReceipt,
|
|
49
|
+
G3PostsealCurationSpec,
|
|
50
|
+
build_g3_postseal_curation_reservation,
|
|
51
|
+
)
|
|
52
|
+
from agent_evolve.application.generation_feedback import (
|
|
53
|
+
validate_generation_feedback_receipt,
|
|
54
|
+
)
|
|
55
|
+
from agent_evolve.domain.patch import require_sha256
|
|
56
|
+
from agent_evolve.domain.typed_json import typed_json_equal
|
|
57
|
+
from agent_evolve.policies.memory.treatment_compliance import (
|
|
58
|
+
TreatmentAssignmentRole,
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
_RECEIPT_DOMAIN = b"agent-evolve:g3-terminal-validation:v1\x00"
|
|
63
|
+
_RESULT_DOMAIN = b"agent-evolve:g3-result-validation:v2-curation-bound\x00"
|
|
64
|
+
_SEED_OCCURRENCE_DOMAIN = b"agent-evolve:g3-seed-occurrence-binding:v1\x00"
|
|
65
|
+
_CACHE_KEYS = (
|
|
66
|
+
"cached_entries",
|
|
67
|
+
"capacity",
|
|
68
|
+
"coalesced",
|
|
69
|
+
"evictions",
|
|
70
|
+
"hits",
|
|
71
|
+
"in_flight",
|
|
72
|
+
"misses",
|
|
73
|
+
)
|
|
74
|
+
_EXPECTED_CACHE = {
|
|
75
|
+
"capacity": None,
|
|
76
|
+
"cached_entries": 11,
|
|
77
|
+
"in_flight": 0,
|
|
78
|
+
"hits": 1,
|
|
79
|
+
"misses": 11,
|
|
80
|
+
"coalesced": 0,
|
|
81
|
+
"evictions": 0,
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class G3TerminalValidationError(ValueError):
|
|
86
|
+
"""A completed G3 state/result violated its frozen causal protocol."""
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def _canonical_json(value: object) -> bytes:
|
|
90
|
+
return json.dumps(
|
|
91
|
+
value,
|
|
92
|
+
ensure_ascii=True,
|
|
93
|
+
allow_nan=False,
|
|
94
|
+
separators=(",", ":"),
|
|
95
|
+
sort_keys=True,
|
|
96
|
+
).encode("ascii")
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def _hash(domain: bytes, record: object) -> str:
|
|
100
|
+
return hashlib.sha256(domain + _canonical_json(record)).hexdigest()
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def _fail(message: str) -> None:
|
|
104
|
+
raise G3TerminalValidationError(message)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
@dataclass(frozen=True, slots=True)
|
|
108
|
+
class G3MechanismDecision:
|
|
109
|
+
"""Exact single-block H1--H3 contrasts and preregistered decision."""
|
|
110
|
+
|
|
111
|
+
q_parent: float
|
|
112
|
+
q_adaptive: float
|
|
113
|
+
q_score_shuffled: float
|
|
114
|
+
q_neutral: float
|
|
115
|
+
q_engine_mate: float
|
|
116
|
+
q_adaptive_union: float
|
|
117
|
+
q_score_shuffled_union: float
|
|
118
|
+
q_neutral_union: float
|
|
119
|
+
delta_as_direct: float = field(init=False)
|
|
120
|
+
delta_an_direct: float = field(init=False)
|
|
121
|
+
delta_as_union: float = field(init=False)
|
|
122
|
+
delta_an_union: float = field(init=False)
|
|
123
|
+
i_adaptive: float = field(init=False)
|
|
124
|
+
i_score_shuffled: float = field(init=False)
|
|
125
|
+
i_neutral: float = field(init=False)
|
|
126
|
+
j_adaptive: float = field(init=False)
|
|
127
|
+
j_score_shuffled: float = field(init=False)
|
|
128
|
+
j_neutral: float = field(init=False)
|
|
129
|
+
h1_pass: bool = field(init=False)
|
|
130
|
+
h2_pass: bool = field(init=False)
|
|
131
|
+
h3_pass: bool = field(init=False)
|
|
132
|
+
advance_to_replication: bool = field(init=False)
|
|
133
|
+
kill_reasons: tuple[str, ...] = field(init=False)
|
|
134
|
+
|
|
135
|
+
def __post_init__(self) -> None:
|
|
136
|
+
names = (
|
|
137
|
+
"q_parent",
|
|
138
|
+
"q_adaptive",
|
|
139
|
+
"q_score_shuffled",
|
|
140
|
+
"q_neutral",
|
|
141
|
+
"q_engine_mate",
|
|
142
|
+
"q_adaptive_union",
|
|
143
|
+
"q_score_shuffled_union",
|
|
144
|
+
"q_neutral_union",
|
|
145
|
+
)
|
|
146
|
+
for name in names:
|
|
147
|
+
value = getattr(self, name)
|
|
148
|
+
if type(value) is not float or not math.isfinite(value):
|
|
149
|
+
raise TypeError(f"{name} must be a finite canonical float")
|
|
150
|
+
delta_as_direct = self.q_adaptive - self.q_score_shuffled
|
|
151
|
+
delta_an_direct = self.q_adaptive - self.q_neutral
|
|
152
|
+
delta_as_union = self.q_adaptive_union - self.q_score_shuffled_union
|
|
153
|
+
delta_an_union = self.q_adaptive_union - self.q_neutral_union
|
|
154
|
+
i_adaptive = self.q_adaptive_union - max(
|
|
155
|
+
self.q_adaptive,
|
|
156
|
+
self.q_engine_mate,
|
|
157
|
+
)
|
|
158
|
+
i_score_shuffled = self.q_score_shuffled_union - max(
|
|
159
|
+
self.q_score_shuffled,
|
|
160
|
+
self.q_engine_mate,
|
|
161
|
+
)
|
|
162
|
+
i_neutral = self.q_neutral_union - max(
|
|
163
|
+
self.q_neutral,
|
|
164
|
+
self.q_engine_mate,
|
|
165
|
+
)
|
|
166
|
+
j_adaptive = (
|
|
167
|
+
self.q_adaptive_union
|
|
168
|
+
- self.q_adaptive
|
|
169
|
+
- self.q_engine_mate
|
|
170
|
+
+ self.q_parent
|
|
171
|
+
)
|
|
172
|
+
j_score_shuffled = (
|
|
173
|
+
self.q_score_shuffled_union
|
|
174
|
+
- self.q_score_shuffled
|
|
175
|
+
- self.q_engine_mate
|
|
176
|
+
+ self.q_parent
|
|
177
|
+
)
|
|
178
|
+
j_neutral = (
|
|
179
|
+
self.q_neutral_union
|
|
180
|
+
- self.q_neutral
|
|
181
|
+
- self.q_engine_mate
|
|
182
|
+
+ self.q_parent
|
|
183
|
+
)
|
|
184
|
+
derived = {
|
|
185
|
+
"delta_as_direct": delta_as_direct,
|
|
186
|
+
"delta_an_direct": delta_an_direct,
|
|
187
|
+
"delta_as_union": delta_as_union,
|
|
188
|
+
"delta_an_union": delta_an_union,
|
|
189
|
+
"i_adaptive": i_adaptive,
|
|
190
|
+
"i_score_shuffled": i_score_shuffled,
|
|
191
|
+
"i_neutral": i_neutral,
|
|
192
|
+
"j_adaptive": j_adaptive,
|
|
193
|
+
"j_score_shuffled": j_score_shuffled,
|
|
194
|
+
"j_neutral": j_neutral,
|
|
195
|
+
}
|
|
196
|
+
if any(not math.isfinite(value) for value in derived.values()):
|
|
197
|
+
raise ValueError("G3 contrast arithmetic produced a non-finite value")
|
|
198
|
+
for name, value in derived.items():
|
|
199
|
+
object.__setattr__(self, name, float(value))
|
|
200
|
+
h1 = delta_as_direct > 0.0 and delta_an_direct > 0.0
|
|
201
|
+
h2 = delta_as_union > 0.0 and delta_an_union > 0.0
|
|
202
|
+
h3 = i_adaptive > 0.0
|
|
203
|
+
reasons = tuple(
|
|
204
|
+
reason
|
|
205
|
+
for passed, reason in (
|
|
206
|
+
(h1, "adaptive_did_not_beat_both_direct_controls"),
|
|
207
|
+
(h2, "adaptive_advantage_did_not_survive_recombination"),
|
|
208
|
+
(h3, "adaptive_union_did_not_beat_both_parents"),
|
|
209
|
+
)
|
|
210
|
+
if not passed
|
|
211
|
+
)
|
|
212
|
+
object.__setattr__(self, "h1_pass", h1)
|
|
213
|
+
object.__setattr__(self, "h2_pass", h2)
|
|
214
|
+
object.__setattr__(self, "h3_pass", h3)
|
|
215
|
+
object.__setattr__(self, "advance_to_replication", h1 and h2 and h3)
|
|
216
|
+
object.__setattr__(self, "kill_reasons", reasons)
|
|
217
|
+
|
|
218
|
+
def to_record(self) -> dict[str, object]:
|
|
219
|
+
return {
|
|
220
|
+
"q": {
|
|
221
|
+
"P_H": self.q_parent.hex(),
|
|
222
|
+
"A": self.q_adaptive.hex(),
|
|
223
|
+
"S": self.q_score_shuffled.hex(),
|
|
224
|
+
"N": self.q_neutral.hex(),
|
|
225
|
+
"E": self.q_engine_mate.hex(),
|
|
226
|
+
"A_union_E": self.q_adaptive_union.hex(),
|
|
227
|
+
"S_union_E": self.q_score_shuffled_union.hex(),
|
|
228
|
+
"N_union_E": self.q_neutral_union.hex(),
|
|
229
|
+
},
|
|
230
|
+
"contrasts": {
|
|
231
|
+
"delta_as_direct": self.delta_as_direct.hex(),
|
|
232
|
+
"delta_an_direct": self.delta_an_direct.hex(),
|
|
233
|
+
"delta_as_union": self.delta_as_union.hex(),
|
|
234
|
+
"delta_an_union": self.delta_an_union.hex(),
|
|
235
|
+
"i_adaptive": self.i_adaptive.hex(),
|
|
236
|
+
"i_score_shuffled": self.i_score_shuffled.hex(),
|
|
237
|
+
"i_neutral": self.i_neutral.hex(),
|
|
238
|
+
"j_adaptive": self.j_adaptive.hex(),
|
|
239
|
+
"j_score_shuffled": self.j_score_shuffled.hex(),
|
|
240
|
+
"j_neutral": self.j_neutral.hex(),
|
|
241
|
+
},
|
|
242
|
+
"h1_pass": self.h1_pass,
|
|
243
|
+
"h2_pass": self.h2_pass,
|
|
244
|
+
"h3_pass": self.h3_pass,
|
|
245
|
+
"advance_to_replication": self.advance_to_replication,
|
|
246
|
+
"kill_reasons": list(self.kill_reasons),
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
@dataclass(frozen=True, slots=True)
|
|
251
|
+
class G3TerminalStateValidationReceipt:
|
|
252
|
+
"""Authenticated proof that all optimization endpoints sealed correctly."""
|
|
253
|
+
|
|
254
|
+
authority_sha256: str
|
|
255
|
+
endpoint_definition_sha256: str
|
|
256
|
+
archive_snapshot_sha256: str
|
|
257
|
+
generation_receipt_sha256s: tuple[str, str, str]
|
|
258
|
+
feedback_receipt_sha256s: tuple[str, str]
|
|
259
|
+
occurrence_ids: tuple[str, ...]
|
|
260
|
+
configuration_sha256s: tuple[str, ...]
|
|
261
|
+
phenotype_identity_sha256s: tuple[str, ...]
|
|
262
|
+
cache_evidence: tuple[tuple[str, int | None], ...]
|
|
263
|
+
mechanism_decision: G3MechanismDecision
|
|
264
|
+
receipt_sha256: str = field(init=False)
|
|
265
|
+
|
|
266
|
+
def __post_init__(self) -> None:
|
|
267
|
+
for value in (
|
|
268
|
+
self.authority_sha256,
|
|
269
|
+
self.endpoint_definition_sha256,
|
|
270
|
+
self.archive_snapshot_sha256,
|
|
271
|
+
*self.generation_receipt_sha256s,
|
|
272
|
+
*self.feedback_receipt_sha256s,
|
|
273
|
+
*self.configuration_sha256s,
|
|
274
|
+
*self.phenotype_identity_sha256s,
|
|
275
|
+
):
|
|
276
|
+
require_sha256(value, "G3 terminal receipt digest")
|
|
277
|
+
if len(self.occurrence_ids) != 12 or len(set(self.occurrence_ids)) != 12:
|
|
278
|
+
raise ValueError("G3 terminal receipt requires 12 unique occurrences")
|
|
279
|
+
if len(self.configuration_sha256s) != 12:
|
|
280
|
+
raise ValueError("G3 terminal receipt requires 12 configurations")
|
|
281
|
+
if len(self.phenotype_identity_sha256s) != 12:
|
|
282
|
+
raise ValueError("G3 terminal receipt requires 12 phenotypes")
|
|
283
|
+
if type(self.mechanism_decision) is not G3MechanismDecision:
|
|
284
|
+
raise TypeError("mechanism_decision must be exact")
|
|
285
|
+
if self.cache_evidence != tuple(
|
|
286
|
+
(key, _EXPECTED_CACHE[key]) for key in _CACHE_KEYS
|
|
287
|
+
):
|
|
288
|
+
raise ValueError("G3 terminal cache evidence differs from exact policy")
|
|
289
|
+
object.__setattr__(
|
|
290
|
+
self,
|
|
291
|
+
"receipt_sha256",
|
|
292
|
+
_hash(_RECEIPT_DOMAIN, self.to_record()),
|
|
293
|
+
)
|
|
294
|
+
|
|
295
|
+
def to_record(self) -> dict[str, object]:
|
|
296
|
+
return {
|
|
297
|
+
"schema_version": 1,
|
|
298
|
+
"authority_sha256": self.authority_sha256,
|
|
299
|
+
"endpoint_definition_sha256": self.endpoint_definition_sha256,
|
|
300
|
+
"archive_snapshot_sha256": self.archive_snapshot_sha256,
|
|
301
|
+
"generation_receipt_sha256s": list(
|
|
302
|
+
self.generation_receipt_sha256s
|
|
303
|
+
),
|
|
304
|
+
"feedback_receipt_sha256s": list(self.feedback_receipt_sha256s),
|
|
305
|
+
"occurrence_ids": list(self.occurrence_ids),
|
|
306
|
+
"configuration_sha256s": list(self.configuration_sha256s),
|
|
307
|
+
"phenotype_identity_sha256s": list(
|
|
308
|
+
self.phenotype_identity_sha256s
|
|
309
|
+
),
|
|
310
|
+
"cache_evidence": dict(self.cache_evidence),
|
|
311
|
+
"mechanism_decision": self.mechanism_decision.to_record(),
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
@dataclass(frozen=True, slots=True)
|
|
316
|
+
class G3CausalScreenResultValidationReceipt:
|
|
317
|
+
"""Authenticated six-call result, including isolated curation status."""
|
|
318
|
+
|
|
319
|
+
optimizer_result_sha256: str
|
|
320
|
+
terminal_state_receipt_sha256: str
|
|
321
|
+
curation_feedback_receipt_sha256: str
|
|
322
|
+
curation_authority_sha256: str
|
|
323
|
+
curation_receipt_sha256: str
|
|
324
|
+
reflection_call_receipt_sha256: str
|
|
325
|
+
curation_status: str
|
|
326
|
+
curation_publication_outcome: str
|
|
327
|
+
receipt_sha256: str = field(init=False)
|
|
328
|
+
|
|
329
|
+
def __post_init__(self) -> None:
|
|
330
|
+
for value in (
|
|
331
|
+
self.optimizer_result_sha256,
|
|
332
|
+
self.terminal_state_receipt_sha256,
|
|
333
|
+
self.curation_feedback_receipt_sha256,
|
|
334
|
+
self.curation_authority_sha256,
|
|
335
|
+
self.curation_receipt_sha256,
|
|
336
|
+
self.reflection_call_receipt_sha256,
|
|
337
|
+
):
|
|
338
|
+
require_sha256(value, "G3 result validation digest")
|
|
339
|
+
if self.curation_status not in {"sealed_complete", "incomplete"}:
|
|
340
|
+
raise ValueError("curation_status must be sealed_complete or incomplete")
|
|
341
|
+
expected_outcomes = (
|
|
342
|
+
{"completed_revision", "completed_abstention"}
|
|
343
|
+
if self.curation_status == "sealed_complete"
|
|
344
|
+
else {"failed"}
|
|
345
|
+
)
|
|
346
|
+
if self.curation_publication_outcome not in expected_outcomes:
|
|
347
|
+
raise ValueError("curation publication outcome differs from status")
|
|
348
|
+
object.__setattr__(
|
|
349
|
+
self,
|
|
350
|
+
"receipt_sha256",
|
|
351
|
+
_hash(_RESULT_DOMAIN, self.to_record()),
|
|
352
|
+
)
|
|
353
|
+
|
|
354
|
+
def to_record(self) -> dict[str, object]:
|
|
355
|
+
return {
|
|
356
|
+
"schema_version": 1,
|
|
357
|
+
"optimizer_result_sha256": self.optimizer_result_sha256,
|
|
358
|
+
"terminal_state_receipt_sha256": (
|
|
359
|
+
self.terminal_state_receipt_sha256
|
|
360
|
+
),
|
|
361
|
+
"curation_feedback_receipt_sha256": (
|
|
362
|
+
self.curation_feedback_receipt_sha256
|
|
363
|
+
),
|
|
364
|
+
"curation_authority_sha256": self.curation_authority_sha256,
|
|
365
|
+
"curation_receipt_sha256": self.curation_receipt_sha256,
|
|
366
|
+
"reflection_call_receipt_sha256": (
|
|
367
|
+
self.reflection_call_receipt_sha256
|
|
368
|
+
),
|
|
369
|
+
"curation_status": self.curation_status,
|
|
370
|
+
"curation_publication_outcome": (
|
|
371
|
+
self.curation_publication_outcome
|
|
372
|
+
),
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
|
|
376
|
+
def _cache_record(
|
|
377
|
+
snapshot: Mapping[str, int | None],
|
|
378
|
+
) -> tuple[tuple[str, int | None], ...]:
|
|
379
|
+
if not isinstance(snapshot, Mapping):
|
|
380
|
+
raise TypeError("evaluation_cache_snapshot must be a mapping")
|
|
381
|
+
if set(snapshot) != set(_EXPECTED_CACHE):
|
|
382
|
+
_fail("evaluation cache snapshot has missing or foreign fields")
|
|
383
|
+
observed = {key: snapshot[key] for key in _EXPECTED_CACHE}
|
|
384
|
+
if observed != _EXPECTED_CACHE:
|
|
385
|
+
_fail("evaluation cache is not exact 11 MISS / reproduction-only HIT")
|
|
386
|
+
return tuple((key, observed[key]) for key in _CACHE_KEYS)
|
|
387
|
+
|
|
388
|
+
|
|
389
|
+
def _phenotype_sha256(
|
|
390
|
+
planner: G3CausalScreenPlanner,
|
|
391
|
+
candidate: EvolutionCandidate,
|
|
392
|
+
) -> str:
|
|
393
|
+
observed = planner.engine.identify_phenotype(candidate)
|
|
394
|
+
detailed = candidate.detailed_evaluation
|
|
395
|
+
if detailed is not None:
|
|
396
|
+
if not detailed.success or detailed.phenotype != observed:
|
|
397
|
+
_fail("candidate detailed evaluation has inconsistent phenotype evidence")
|
|
398
|
+
return observed.identity_sha256
|
|
399
|
+
|
|
400
|
+
|
|
401
|
+
def _require_success(
|
|
402
|
+
outcome: InvocationOutcome,
|
|
403
|
+
*,
|
|
404
|
+
slot_authority: ProposalAuthority,
|
|
405
|
+
generation: int,
|
|
406
|
+
) -> EvolutionCandidate:
|
|
407
|
+
if outcome.failure_stage is not None or outcome.candidate is None:
|
|
408
|
+
_fail("G3 terminal gate observed a failed invocation")
|
|
409
|
+
if outcome.prepared.proposal_authority is not slot_authority:
|
|
410
|
+
_fail("prepared proposal authority differs from its frozen slot")
|
|
411
|
+
if (outcome.prepared.call_id is not None) != (
|
|
412
|
+
slot_authority is ProposalAuthority.MODEL
|
|
413
|
+
):
|
|
414
|
+
_fail("logical model-call identity differs from proposal authority")
|
|
415
|
+
candidate = outcome.candidate
|
|
416
|
+
if (
|
|
417
|
+
candidate.generation != generation
|
|
418
|
+
or not candidate.valid
|
|
419
|
+
or not candidate.operator_compliant
|
|
420
|
+
or not candidate.evidence_compliant
|
|
421
|
+
):
|
|
422
|
+
_fail("G3 terminal candidate is invalid or noncompliant")
|
|
423
|
+
if candidate.occurrence.operator_invocation_id != (
|
|
424
|
+
outcome.prepared.operator_invocation_id
|
|
425
|
+
):
|
|
426
|
+
_fail("candidate occurrence differs from its prepared invocation")
|
|
427
|
+
plan = outcome.prepared.plan
|
|
428
|
+
expected_parent_ids = tuple(parent.candidate_id for parent in plan.parents)
|
|
429
|
+
expected_ancestor_id = (
|
|
430
|
+
None if plan.common_ancestor is None else plan.common_ancestor.candidate_id
|
|
431
|
+
)
|
|
432
|
+
if (
|
|
433
|
+
candidate.operator_kind is not plan.operator_kind
|
|
434
|
+
or candidate.parent_ids != expected_parent_ids
|
|
435
|
+
or candidate.common_ancestor_id != expected_ancestor_id
|
|
436
|
+
or (candidate.call_telemetry is not None)
|
|
437
|
+
!= (slot_authority is ProposalAuthority.MODEL)
|
|
438
|
+
):
|
|
439
|
+
_fail("candidate operator/lineage/telemetry differs from prepared authority")
|
|
440
|
+
return candidate
|
|
441
|
+
|
|
442
|
+
|
|
443
|
+
def _require_expected_endpoint(
|
|
444
|
+
*,
|
|
445
|
+
planner: G3CausalScreenPlanner,
|
|
446
|
+
receipt: GenerationReceipt,
|
|
447
|
+
result_index: int,
|
|
448
|
+
expected: G3ExpectedEndpoint,
|
|
449
|
+
assignment_role: TreatmentAssignmentRole | None,
|
|
450
|
+
) -> EvolutionCandidate:
|
|
451
|
+
slot_result = receipt.slot_results[result_index]
|
|
452
|
+
slot = slot_result.slot
|
|
453
|
+
if slot.slot_id != expected.slot_id:
|
|
454
|
+
_fail("endpoint authority differs from receipt slot order")
|
|
455
|
+
candidate = _require_success(
|
|
456
|
+
slot_result.outcome,
|
|
457
|
+
slot_authority=slot.proposal_authority,
|
|
458
|
+
generation=receipt.generation,
|
|
459
|
+
)
|
|
460
|
+
outcome = slot_result.outcome
|
|
461
|
+
if (
|
|
462
|
+
candidate.occurrence.configuration_hash != expected.configuration_sha256
|
|
463
|
+
or not typed_json_equal(candidate.configuration, expected.configuration)
|
|
464
|
+
or _phenotype_sha256(planner, candidate)
|
|
465
|
+
!= expected.phenotype_identity_sha256
|
|
466
|
+
):
|
|
467
|
+
_fail("actual endpoint differs from prospectively frozen endpoint")
|
|
468
|
+
|
|
469
|
+
if expected.reference is None:
|
|
470
|
+
if slot.proposal_authority is not ProposalAuthority.ENGINE:
|
|
471
|
+
_fail("reference-free endpoint is not engine-authored")
|
|
472
|
+
if outcome.treatment_admission_receipt is not None:
|
|
473
|
+
_fail("engine endpoint acquired a model treatment receipt")
|
|
474
|
+
return candidate
|
|
475
|
+
|
|
476
|
+
if slot.proposal_authority is not ProposalAuthority.MODEL:
|
|
477
|
+
_fail("hypothesis endpoint is not model-authored")
|
|
478
|
+
requirement = slot.plan.insight_treatment_requirement
|
|
479
|
+
preflight = outcome.prepared.treatment_preflight_receipt
|
|
480
|
+
admission = outcome.treatment_admission_receipt
|
|
481
|
+
if (
|
|
482
|
+
requirement is None
|
|
483
|
+
or assignment_role is None
|
|
484
|
+
or requirement.assignment_role is not assignment_role
|
|
485
|
+
or len(requirement.allowed_actions) != 1
|
|
486
|
+
or preflight is None
|
|
487
|
+
or not preflight.passed
|
|
488
|
+
or len(preflight.compatible_actions) != 1
|
|
489
|
+
or admission is None
|
|
490
|
+
or not admission.passed
|
|
491
|
+
):
|
|
492
|
+
_fail("model endpoint lacks exact successful treatment administration")
|
|
493
|
+
action = requirement.allowed_actions[0]
|
|
494
|
+
if (
|
|
495
|
+
action.option_id != expected.option_id
|
|
496
|
+
or action.option_identity_sha256 != expected.option_identity_sha256
|
|
497
|
+
or preflight.compatible_actions[0].binding() != action
|
|
498
|
+
or admission.selected_action.binding() != action
|
|
499
|
+
):
|
|
500
|
+
_fail("administered action differs from frozen endpoint action")
|
|
501
|
+
expected_kind = (
|
|
502
|
+
InsightAssignmentKind.QUARANTINE_TEST
|
|
503
|
+
if assignment_role is TreatmentAssignmentRole.SHAM_CONTROL
|
|
504
|
+
else InsightAssignmentKind.RESOLVED_CAUSAL
|
|
505
|
+
)
|
|
506
|
+
if (
|
|
507
|
+
candidate.selected_insight_refs != (expected.reference,)
|
|
508
|
+
or candidate.claimed_insight_ids
|
|
509
|
+
!= (expected.reference.insight_id.value,)
|
|
510
|
+
or candidate.insight_assignment_kind is not expected_kind
|
|
511
|
+
):
|
|
512
|
+
_fail("model endpoint did not instantiate its assigned exact insight")
|
|
513
|
+
return candidate
|
|
514
|
+
|
|
515
|
+
|
|
516
|
+
def _require_absolute_q(
|
|
517
|
+
planner: G3CausalScreenPlanner,
|
|
518
|
+
outcome: InvocationOutcome,
|
|
519
|
+
) -> None:
|
|
520
|
+
candidate = outcome.candidate
|
|
521
|
+
assert candidate is not None
|
|
522
|
+
observed = planner.reward_binding.score(
|
|
523
|
+
candidate,
|
|
524
|
+
(),
|
|
525
|
+
planner.engine.objectives,
|
|
526
|
+
)
|
|
527
|
+
if type(observed) is not float or not math.isfinite(observed):
|
|
528
|
+
_fail("absolute endpoint returned a non-finite non-canonical score")
|
|
529
|
+
if observed != outcome.reward:
|
|
530
|
+
_fail("runtime reward changes with operator parents; Q is not absolute")
|
|
531
|
+
|
|
532
|
+
|
|
533
|
+
def validate_g3_terminal_state(
|
|
534
|
+
*,
|
|
535
|
+
state: OptimizerState,
|
|
536
|
+
planner: G3CausalScreenPlanner,
|
|
537
|
+
evaluation_cache_snapshot: Mapping[str, int | None],
|
|
538
|
+
) -> G3TerminalStateValidationReceipt:
|
|
539
|
+
"""Validate sealed G0--G3 endpoints before any curation provider call."""
|
|
540
|
+
|
|
541
|
+
if type(state) is not OptimizerState:
|
|
542
|
+
raise TypeError("state must be an exact OptimizerState")
|
|
543
|
+
OptimizerState.__post_init__(state)
|
|
544
|
+
if type(planner) is not G3CausalScreenPlanner:
|
|
545
|
+
raise TypeError("planner must be an exact G3CausalScreenPlanner")
|
|
546
|
+
authority = planner.terminal_validation_authority
|
|
547
|
+
if type(authority) is not G3TerminalValidationAuthority:
|
|
548
|
+
_fail("planner has no frozen terminal validation authority")
|
|
549
|
+
G3TerminalValidationAuthority.__post_init__(authority)
|
|
550
|
+
if (
|
|
551
|
+
state.generation != 3
|
|
552
|
+
or len(state.candidates) != 12
|
|
553
|
+
or state.unique_evaluations != 11
|
|
554
|
+
or state.logical_llm_calls != 5
|
|
555
|
+
or len(state.generation_receipts) != 3
|
|
556
|
+
or len(state.feedback_receipts) != 2
|
|
557
|
+
):
|
|
558
|
+
_fail("pre-curation state differs from exact G3 12/11/5 protocol")
|
|
559
|
+
|
|
560
|
+
receipts = state.generation_receipts
|
|
561
|
+
for receipt in receipts:
|
|
562
|
+
validate_generation_receipt_integrity(receipt)
|
|
563
|
+
expected_slots = (
|
|
564
|
+
G1_DIAGNOSTIC_SLOT_IDS,
|
|
565
|
+
G2_SLOT_IDS,
|
|
566
|
+
G3_SLOT_IDS,
|
|
567
|
+
)
|
|
568
|
+
if tuple(
|
|
569
|
+
tuple(value.slot.slot_id for value in receipt.slot_results)
|
|
570
|
+
for receipt in receipts
|
|
571
|
+
) != expected_slots:
|
|
572
|
+
_fail("generation receipt slot order differs from frozen G3 protocol")
|
|
573
|
+
counter_records = tuple(
|
|
574
|
+
(
|
|
575
|
+
receipt.logical_llm_calls_before,
|
|
576
|
+
receipt.logical_llm_calls_after,
|
|
577
|
+
receipt.unique_evaluations_before,
|
|
578
|
+
receipt.unique_evaluations_after,
|
|
579
|
+
receipt.reserved_logical_llm_calls,
|
|
580
|
+
receipt.reserved_unique_evaluations,
|
|
581
|
+
)
|
|
582
|
+
for receipt in receipts
|
|
583
|
+
)
|
|
584
|
+
if counter_records != (
|
|
585
|
+
(0, 2, 2, 4, 2, 2),
|
|
586
|
+
(2, 5, 4, 8, 3, 4),
|
|
587
|
+
(5, 5, 8, 11, 0, 3),
|
|
588
|
+
):
|
|
589
|
+
_fail("generation counters differ from exact G1/G2/G3 reservations")
|
|
590
|
+
for index, feedback in enumerate(state.feedback_receipts, start=1):
|
|
591
|
+
validate_generation_feedback_receipt(feedback)
|
|
592
|
+
expected_calls = (2, 5)[index - 1]
|
|
593
|
+
if (
|
|
594
|
+
feedback.generation != index
|
|
595
|
+
or feedback.generation_receipt_hash != receipts[index - 1].receipt_hash
|
|
596
|
+
or feedback.reserved_logical_llm_calls != 0
|
|
597
|
+
or feedback.used_logical_llm_calls != 0
|
|
598
|
+
or feedback.logical_llm_calls_before != expected_calls
|
|
599
|
+
or feedback.logical_llm_calls_after != expected_calls
|
|
600
|
+
):
|
|
601
|
+
_fail("G1/G2 feedback is not an exact zero-call sealed no-op")
|
|
602
|
+
|
|
603
|
+
p_d, p_h = state.candidates[:2]
|
|
604
|
+
if any(
|
|
605
|
+
not value.valid
|
|
606
|
+
or not value.operator_compliant
|
|
607
|
+
or not value.evidence_compliant
|
|
608
|
+
for value in (p_d, p_h)
|
|
609
|
+
):
|
|
610
|
+
_fail("G3 seed state contains an invalid or noncompliant parent")
|
|
611
|
+
if any(
|
|
612
|
+
value.operator_kind is not None
|
|
613
|
+
or value.parent_ids
|
|
614
|
+
or value.common_ancestor_id is not None
|
|
615
|
+
or value.call_telemetry is not None
|
|
616
|
+
for value in (p_d, p_h)
|
|
617
|
+
):
|
|
618
|
+
_fail("G3 seeds acquired generated-candidate lineage or model telemetry")
|
|
619
|
+
seed_occurrence_record = [
|
|
620
|
+
{
|
|
621
|
+
"candidate_id": value.candidate_id.value,
|
|
622
|
+
"configuration_hash": value.occurrence.configuration_hash,
|
|
623
|
+
"configuration_artifact_hash": (
|
|
624
|
+
value.occurrence.configuration_artifact_hash
|
|
625
|
+
),
|
|
626
|
+
"proposal_sequence": value.occurrence.proposal_sequence,
|
|
627
|
+
"operator_invocation_id": (
|
|
628
|
+
None
|
|
629
|
+
if value.occurrence.operator_invocation_id is None
|
|
630
|
+
else value.occurrence.operator_invocation_id.value
|
|
631
|
+
),
|
|
632
|
+
}
|
|
633
|
+
for value in (p_d, p_h)
|
|
634
|
+
]
|
|
635
|
+
if _hash(_SEED_OCCURRENCE_DOMAIN, seed_occurrence_record) != (
|
|
636
|
+
authority.seed_occurrence_binding_sha256
|
|
637
|
+
):
|
|
638
|
+
_fail("seed occurrences differ from the exact pre-G1 binding")
|
|
639
|
+
if (
|
|
640
|
+
p_h.candidate_id != authority.hypothesis_parent_candidate_id
|
|
641
|
+
or p_h.occurrence.configuration_hash
|
|
642
|
+
!= authority.hypothesis_parent_configuration_sha256
|
|
643
|
+
or not typed_json_equal(
|
|
644
|
+
p_h.configuration,
|
|
645
|
+
authority.hypothesis_parent_configuration,
|
|
646
|
+
)
|
|
647
|
+
or _phenotype_sha256(planner, p_h)
|
|
648
|
+
!= authority.hypothesis_parent_phenotype_identity_sha256
|
|
649
|
+
):
|
|
650
|
+
_fail("held-out parent differs from frozen terminal authority")
|
|
651
|
+
if (
|
|
652
|
+
_phenotype_sha256(planner, p_d),
|
|
653
|
+
_phenotype_sha256(planner, p_h),
|
|
654
|
+
) != authority.seed_phenotype_identity_sha256s:
|
|
655
|
+
_fail("seed semantic phenotypes differ from frozen authority")
|
|
656
|
+
|
|
657
|
+
generated: list[EvolutionCandidate] = []
|
|
658
|
+
for index, expected in enumerate(authority.g1_expected_endpoints):
|
|
659
|
+
generated.append(
|
|
660
|
+
_require_expected_endpoint(
|
|
661
|
+
planner=planner,
|
|
662
|
+
receipt=receipts[0],
|
|
663
|
+
result_index=index,
|
|
664
|
+
expected=expected,
|
|
665
|
+
assignment_role=TreatmentAssignmentRole.ACTIVE,
|
|
666
|
+
)
|
|
667
|
+
)
|
|
668
|
+
for index, expected in enumerate(authority.g2_expected_endpoints):
|
|
669
|
+
generated.append(
|
|
670
|
+
_require_expected_endpoint(
|
|
671
|
+
planner=planner,
|
|
672
|
+
receipt=receipts[1],
|
|
673
|
+
result_index=index,
|
|
674
|
+
expected=expected,
|
|
675
|
+
assignment_role=(
|
|
676
|
+
TreatmentAssignmentRole.ACTIVE
|
|
677
|
+
if index < 2
|
|
678
|
+
else (
|
|
679
|
+
TreatmentAssignmentRole.SHAM_CONTROL
|
|
680
|
+
if index == 2
|
|
681
|
+
else None
|
|
682
|
+
)
|
|
683
|
+
),
|
|
684
|
+
)
|
|
685
|
+
)
|
|
686
|
+
|
|
687
|
+
reproduction_result = receipts[2].slot_results[0]
|
|
688
|
+
reproduction = _require_success(
|
|
689
|
+
reproduction_result.outcome,
|
|
690
|
+
slot_authority=ProposalAuthority.REPRODUCTION,
|
|
691
|
+
generation=3,
|
|
692
|
+
)
|
|
693
|
+
if (
|
|
694
|
+
reproduction_result.slot.plan.operator_kind is not OperatorKind.REPRODUCTION
|
|
695
|
+
or reproduction_result.slot.plan.parents != (p_h,)
|
|
696
|
+
or reproduction.occurrence.configuration_hash
|
|
697
|
+
!= authority.hypothesis_parent_configuration_sha256
|
|
698
|
+
or not typed_json_equal(
|
|
699
|
+
reproduction.configuration,
|
|
700
|
+
authority.hypothesis_parent_configuration,
|
|
701
|
+
)
|
|
702
|
+
or _phenotype_sha256(planner, reproduction)
|
|
703
|
+
!= authority.hypothesis_parent_phenotype_identity_sha256
|
|
704
|
+
):
|
|
705
|
+
_fail("G3 reproduction is not an exact semantic P_H replay")
|
|
706
|
+
generated.append(reproduction)
|
|
707
|
+
|
|
708
|
+
for index, expected in enumerate(authority.g3_expected_unions, start=1):
|
|
709
|
+
if type(expected) is not G3ExpectedUnion:
|
|
710
|
+
raise TypeError("union authority must be exact")
|
|
711
|
+
slot_result = receipts[2].slot_results[index]
|
|
712
|
+
slot = slot_result.slot
|
|
713
|
+
union = _require_success(
|
|
714
|
+
slot_result.outcome,
|
|
715
|
+
slot_authority=ProposalAuthority.ENGINE,
|
|
716
|
+
generation=3,
|
|
717
|
+
)
|
|
718
|
+
if (
|
|
719
|
+
slot.slot_id != expected.slot_id
|
|
720
|
+
or slot.plan.operator_kind is not OperatorKind.THREE_WAY_RECOMBINATION
|
|
721
|
+
or slot.plan.common_ancestor != p_h
|
|
722
|
+
or slot.materialized is None
|
|
723
|
+
or slot.materialized.materialization_receipt_hash
|
|
724
|
+
!= expected.runtime_materialization_receipt_sha256
|
|
725
|
+
or slot_result.outcome.prepared.materialization_receipt_hash
|
|
726
|
+
!= expected.runtime_materialization_receipt_sha256
|
|
727
|
+
or union.preservation_verified is not True
|
|
728
|
+
or union.common_ancestor_id != p_h.candidate_id
|
|
729
|
+
or union.occurrence.configuration_hash != expected.configuration_sha256
|
|
730
|
+
or not typed_json_equal(union.configuration, expected.configuration)
|
|
731
|
+
or _phenotype_sha256(planner, union)
|
|
732
|
+
!= expected.phenotype_identity_sha256
|
|
733
|
+
):
|
|
734
|
+
_fail("actual G3 union differs from prospective/runtime authority")
|
|
735
|
+
generated.append(union)
|
|
736
|
+
|
|
737
|
+
if tuple(state.candidates[2:]) != tuple(generated):
|
|
738
|
+
_fail("optimizer candidate history differs from sealed slot outcome order")
|
|
739
|
+
all_outcomes = tuple(
|
|
740
|
+
result.outcome for receipt in receipts for result in receipt.slot_results
|
|
741
|
+
)
|
|
742
|
+
if sum(value.prepared.call_id is not None for value in all_outcomes) != 5:
|
|
743
|
+
_fail("optimization waves did not contain exactly five logical calls")
|
|
744
|
+
for outcome in all_outcomes:
|
|
745
|
+
_require_absolute_q(planner, outcome)
|
|
746
|
+
|
|
747
|
+
phenotypes = tuple(
|
|
748
|
+
_phenotype_sha256(planner, candidate) for candidate in state.candidates
|
|
749
|
+
)
|
|
750
|
+
expected_phenotypes = (
|
|
751
|
+
*authority.seed_phenotype_identity_sha256s,
|
|
752
|
+
*(value.phenotype_identity_sha256 for value in authority.g1_expected_endpoints),
|
|
753
|
+
*(value.phenotype_identity_sha256 for value in authority.g2_expected_endpoints),
|
|
754
|
+
authority.hypothesis_parent_phenotype_identity_sha256,
|
|
755
|
+
*(value.phenotype_identity_sha256 for value in authority.g3_expected_unions),
|
|
756
|
+
)
|
|
757
|
+
if phenotypes != expected_phenotypes:
|
|
758
|
+
_fail("terminal phenotype sequence differs from prospective authority")
|
|
759
|
+
if len(set(phenotypes)) != 11 or phenotypes.count(
|
|
760
|
+
authority.hypothesis_parent_phenotype_identity_sha256
|
|
761
|
+
) != 2:
|
|
762
|
+
_fail("terminal phenotypes do not prove exactly one P_H reproduction reuse")
|
|
763
|
+
|
|
764
|
+
g2_rewards = tuple(value.outcome.reward for value in receipts[1].slot_results)
|
|
765
|
+
g3_rewards = tuple(value.outcome.reward for value in receipts[2].slot_results)
|
|
766
|
+
decision = G3MechanismDecision(
|
|
767
|
+
q_parent=g3_rewards[0],
|
|
768
|
+
q_adaptive=g2_rewards[0],
|
|
769
|
+
q_score_shuffled=g2_rewards[1],
|
|
770
|
+
q_neutral=g2_rewards[2],
|
|
771
|
+
q_engine_mate=g2_rewards[3],
|
|
772
|
+
q_adaptive_union=g3_rewards[1],
|
|
773
|
+
q_score_shuffled_union=g3_rewards[2],
|
|
774
|
+
q_neutral_union=g3_rewards[3],
|
|
775
|
+
)
|
|
776
|
+
cache_record = _cache_record(evaluation_cache_snapshot)
|
|
777
|
+
return G3TerminalStateValidationReceipt(
|
|
778
|
+
authority_sha256=authority.authority_sha256,
|
|
779
|
+
endpoint_definition_sha256=planner.endpoint_definition_sha256,
|
|
780
|
+
archive_snapshot_sha256=state.archive_snapshot_hash,
|
|
781
|
+
generation_receipt_sha256s=tuple(
|
|
782
|
+
value.receipt_hash for value in receipts
|
|
783
|
+
),
|
|
784
|
+
feedback_receipt_sha256s=tuple(
|
|
785
|
+
value.receipt_hash for value in state.feedback_receipts
|
|
786
|
+
),
|
|
787
|
+
occurrence_ids=tuple(
|
|
788
|
+
value.candidate_id.value for value in state.candidates
|
|
789
|
+
),
|
|
790
|
+
configuration_sha256s=tuple(
|
|
791
|
+
value.occurrence.configuration_hash for value in state.candidates
|
|
792
|
+
),
|
|
793
|
+
phenotype_identity_sha256s=phenotypes,
|
|
794
|
+
cache_evidence=cache_record,
|
|
795
|
+
mechanism_decision=decision,
|
|
796
|
+
)
|
|
797
|
+
|
|
798
|
+
|
|
799
|
+
def validate_g3_causal_screen_result(
|
|
800
|
+
result: OptimizerResult,
|
|
801
|
+
*,
|
|
802
|
+
planner: G3CausalScreenPlanner,
|
|
803
|
+
evaluation_cache_snapshot: Mapping[str, int | None],
|
|
804
|
+
curation_spec: G3PostsealCurationSpec,
|
|
805
|
+
curation_authority: G3PostsealCurationAuthority,
|
|
806
|
+
curation_receipt: G3PostsealCurationReceipt,
|
|
807
|
+
) -> G3CausalScreenResultValidationReceipt:
|
|
808
|
+
"""Validate six-call output against external policy and engine evidence.
|
|
809
|
+
|
|
810
|
+
A hash-consistent feedback receipt is insufficient: an attacker can reseal
|
|
811
|
+
arbitrary policy metadata. This gate independently reconstructs the exact
|
|
812
|
+
reservation/authority from the executed planner and then joins the final
|
|
813
|
+
feedback to the receipt stored by the engine for the actual provider call.
|
|
814
|
+
"""
|
|
815
|
+
|
|
816
|
+
validate_optimizer_result_integrity(result)
|
|
817
|
+
if type(curation_spec) is not G3PostsealCurationSpec:
|
|
818
|
+
raise TypeError("curation_spec must be exact")
|
|
819
|
+
G3PostsealCurationSpec.__post_init__(curation_spec)
|
|
820
|
+
if type(curation_authority) is not G3PostsealCurationAuthority:
|
|
821
|
+
raise TypeError("curation_authority must be exact")
|
|
822
|
+
G3PostsealCurationAuthority.__post_init__(curation_authority)
|
|
823
|
+
if type(curation_receipt) is not G3PostsealCurationReceipt:
|
|
824
|
+
raise TypeError("curation_receipt must be exact")
|
|
825
|
+
G3PostsealCurationReceipt.__post_init__(curation_receipt)
|
|
826
|
+
state = result.final_state
|
|
827
|
+
if (
|
|
828
|
+
result.budget != G3_SCREEN_BUDGET
|
|
829
|
+
or state.generation != 3
|
|
830
|
+
or state.unique_evaluations != 11
|
|
831
|
+
or state.logical_llm_calls != 6
|
|
832
|
+
or len(state.feedback_receipts) != 3
|
|
833
|
+
):
|
|
834
|
+
_fail("final optimizer result differs from exact six-call G3 budget")
|
|
835
|
+
pre_curation_state = replace(
|
|
836
|
+
state,
|
|
837
|
+
logical_llm_calls=5,
|
|
838
|
+
feedback_receipts=state.feedback_receipts[:2],
|
|
839
|
+
)
|
|
840
|
+
terminal = validate_g3_terminal_state(
|
|
841
|
+
state=pre_curation_state,
|
|
842
|
+
planner=planner,
|
|
843
|
+
evaluation_cache_snapshot=evaluation_cache_snapshot,
|
|
844
|
+
)
|
|
845
|
+
for generation, feedback in enumerate(state.feedback_receipts[:2], start=1):
|
|
846
|
+
expected_no_op = build_g3_postseal_curation_reservation(
|
|
847
|
+
spec=curation_spec,
|
|
848
|
+
planner=planner,
|
|
849
|
+
memory=planner.memory,
|
|
850
|
+
generation=generation,
|
|
851
|
+
)
|
|
852
|
+
if (
|
|
853
|
+
feedback.policy_id != curation_spec.policy_id
|
|
854
|
+
or feedback.policy_version != curation_spec.policy_version
|
|
855
|
+
or feedback.reservation_hash != expected_no_op.reservation_hash
|
|
856
|
+
or feedback.result_metadata
|
|
857
|
+
!= tuple(
|
|
858
|
+
sorted(
|
|
859
|
+
(
|
|
860
|
+
("curation_spec_sha256", curation_spec.spec_sha256),
|
|
861
|
+
("curation_status", "not_due"),
|
|
862
|
+
)
|
|
863
|
+
)
|
|
864
|
+
)
|
|
865
|
+
):
|
|
866
|
+
_fail("G1/G2 feedback differs from the expected curation policy")
|
|
867
|
+
|
|
868
|
+
feedback = state.feedback_receipts[2]
|
|
869
|
+
validate_generation_feedback_receipt(feedback)
|
|
870
|
+
expected_reservation = build_g3_postseal_curation_reservation(
|
|
871
|
+
spec=curation_spec,
|
|
872
|
+
planner=planner,
|
|
873
|
+
memory=planner.memory,
|
|
874
|
+
generation=3,
|
|
875
|
+
)
|
|
876
|
+
receipts = state.generation_receipts
|
|
877
|
+
selected_outcomes = curation_spec.source_scope.select(receipts)
|
|
878
|
+
selected_operator_ids = tuple(
|
|
879
|
+
outcome.prepared.operator_invocation_id
|
|
880
|
+
for outcome in selected_outcomes
|
|
881
|
+
)
|
|
882
|
+
assignments = planner.g2_assignments
|
|
883
|
+
if len(assignments) != 2 or len(
|
|
884
|
+
assignments[0].selection_decision.selected
|
|
885
|
+
) != 1:
|
|
886
|
+
_fail("final curation has no exact adaptive revision predecessor")
|
|
887
|
+
predecessor = assignments[0].selection_decision.selected[0]
|
|
888
|
+
predecessor_entry = planner.memory.entries_for((predecessor,))[0]
|
|
889
|
+
terminal_authority = planner.terminal_validation_authority
|
|
890
|
+
if terminal_authority is None:
|
|
891
|
+
_fail("final curation lost the terminal validation authority")
|
|
892
|
+
expected_authority = G3PostsealCurationAuthority(
|
|
893
|
+
spec_sha256=curation_spec.spec_sha256,
|
|
894
|
+
reservation_hash=expected_reservation.reservation_hash,
|
|
895
|
+
terminal_validation_receipt_sha256=terminal.receipt_sha256,
|
|
896
|
+
terminal_validation_authority_sha256=(
|
|
897
|
+
terminal_authority.authority_sha256
|
|
898
|
+
),
|
|
899
|
+
generation_receipt_sha256s=tuple(
|
|
900
|
+
receipt.receipt_hash for receipt in receipts
|
|
901
|
+
),
|
|
902
|
+
source_scope_sha256=curation_spec.source_scope.scope_sha256,
|
|
903
|
+
source_slot_ids=curation_spec.source_scope.slot_ids,
|
|
904
|
+
source_operator_invocation_ids=selected_operator_ids,
|
|
905
|
+
revision_predecessor=predecessor,
|
|
906
|
+
revision_predecessor_content_sha256=(
|
|
907
|
+
predecessor_entry.draft.content_sha256
|
|
908
|
+
),
|
|
909
|
+
insight_contract_sha256=(
|
|
910
|
+
curation_spec.insight_contract.identity_sha256
|
|
911
|
+
),
|
|
912
|
+
reflection_label=curation_spec.label,
|
|
913
|
+
)
|
|
914
|
+
if (
|
|
915
|
+
curation_authority != expected_authority
|
|
916
|
+
or curation_receipt.authority != expected_authority
|
|
917
|
+
):
|
|
918
|
+
_fail("post-G3 curation authority differs from executed G1--G3 evidence")
|
|
919
|
+
|
|
920
|
+
try:
|
|
921
|
+
engine_call_receipt = planner.engine.reflection_call_receipt(
|
|
922
|
+
curation_receipt.call_receipt.call_id
|
|
923
|
+
)
|
|
924
|
+
except (KeyError, TypeError, ValueError) as exc:
|
|
925
|
+
raise G3TerminalValidationError(
|
|
926
|
+
"post-G3 curation has no engine-issued reflection receipt"
|
|
927
|
+
) from exc
|
|
928
|
+
if type(engine_call_receipt) is not ReflectionCallReceipt:
|
|
929
|
+
_fail("engine returned a foreign reflection receipt type")
|
|
930
|
+
ReflectionCallReceipt.__post_init__(engine_call_receipt)
|
|
931
|
+
if engine_call_receipt != curation_receipt.call_receipt:
|
|
932
|
+
_fail("curation receipt differs from the engine-stored provider call")
|
|
933
|
+
request = engine_call_receipt.request
|
|
934
|
+
if (
|
|
935
|
+
request.source_receipt_sha256s
|
|
936
|
+
!= expected_authority.generation_receipt_sha256s
|
|
937
|
+
or request.source_operator_invocation_ids != selected_operator_ids
|
|
938
|
+
or len(request.source_outcome_sha256s) != len(selected_outcomes)
|
|
939
|
+
):
|
|
940
|
+
_fail("engine call differs from the declared curation evidence scope")
|
|
941
|
+
|
|
942
|
+
if engine_call_receipt.status is ReflectionCallStatus.COMPLETED:
|
|
943
|
+
try:
|
|
944
|
+
published_entries = planner.memory.entries_for(
|
|
945
|
+
engine_call_receipt.published_references
|
|
946
|
+
)
|
|
947
|
+
ReflectionPublicationResult(
|
|
948
|
+
entries=published_entries,
|
|
949
|
+
receipt=engine_call_receipt,
|
|
950
|
+
)
|
|
951
|
+
except (KeyError, TypeError, ValueError) as exc:
|
|
952
|
+
raise G3TerminalValidationError(
|
|
953
|
+
"curation publications differ from current memory/lineage"
|
|
954
|
+
) from exc
|
|
955
|
+
for entry in published_entries:
|
|
956
|
+
lineage = entry.evidence_lineage
|
|
957
|
+
if (
|
|
958
|
+
lineage is None
|
|
959
|
+
or lineage.available_contrast_ids
|
|
960
|
+
!= request.available_contrast_ids
|
|
961
|
+
or not set(lineage.source_operator_invocation_ids).issubset(
|
|
962
|
+
selected_operator_ids
|
|
963
|
+
)
|
|
964
|
+
):
|
|
965
|
+
_fail("curation publication has foreign source/call lineage")
|
|
966
|
+
|
|
967
|
+
expected_metadata = [
|
|
968
|
+
(
|
|
969
|
+
"curated_entry_count",
|
|
970
|
+
str(len(engine_call_receipt.publications)),
|
|
971
|
+
),
|
|
972
|
+
("curation_authority_sha256", expected_authority.authority_sha256),
|
|
973
|
+
("curation_publication_outcome", curation_receipt.publication_outcome),
|
|
974
|
+
("curation_receipt_sha256", curation_receipt.receipt_sha256),
|
|
975
|
+
("curation_spec_sha256", curation_spec.spec_sha256),
|
|
976
|
+
("curation_status", curation_receipt.curation_status),
|
|
977
|
+
("reflection_call_id", engine_call_receipt.call_id.value),
|
|
978
|
+
(
|
|
979
|
+
"reflection_call_receipt_sha256",
|
|
980
|
+
engine_call_receipt.receipt_sha256,
|
|
981
|
+
),
|
|
982
|
+
(
|
|
983
|
+
"reflection_max_output_tokens",
|
|
984
|
+
str(request.max_output_tokens),
|
|
985
|
+
),
|
|
986
|
+
("reflection_prompt_sha256", request.prompt_sha256),
|
|
987
|
+
("reflection_request_sha256", request.request_sha256),
|
|
988
|
+
(
|
|
989
|
+
"reflection_temperature",
|
|
990
|
+
(
|
|
991
|
+
"none"
|
|
992
|
+
if request.temperature is None
|
|
993
|
+
else float(request.temperature).hex()
|
|
994
|
+
),
|
|
995
|
+
),
|
|
996
|
+
("terminal_validation_receipt_sha256", terminal.receipt_sha256),
|
|
997
|
+
]
|
|
998
|
+
if curation_receipt.failure_type is not None:
|
|
999
|
+
expected_metadata.append(
|
|
1000
|
+
("curation_failure_type", curation_receipt.failure_type)
|
|
1001
|
+
)
|
|
1002
|
+
if engine_call_receipt.telemetry_sha256 is not None:
|
|
1003
|
+
expected_metadata.append(
|
|
1004
|
+
(
|
|
1005
|
+
"reflection_telemetry_sha256",
|
|
1006
|
+
engine_call_receipt.telemetry_sha256,
|
|
1007
|
+
)
|
|
1008
|
+
)
|
|
1009
|
+
expected_metadata_tuple = tuple(sorted(expected_metadata))
|
|
1010
|
+
if (
|
|
1011
|
+
feedback.generation != 3
|
|
1012
|
+
or feedback.policy_id != curation_spec.policy_id
|
|
1013
|
+
or feedback.policy_version != curation_spec.policy_version
|
|
1014
|
+
or feedback.reservation_hash != expected_reservation.reservation_hash
|
|
1015
|
+
or feedback.generation_receipt_hash
|
|
1016
|
+
!= state.generation_receipts[2].receipt_hash
|
|
1017
|
+
or feedback.reserved_logical_llm_calls != 1
|
|
1018
|
+
or feedback.used_logical_llm_calls != 1
|
|
1019
|
+
or feedback.logical_llm_calls_before != 5
|
|
1020
|
+
or feedback.logical_llm_calls_after != 6
|
|
1021
|
+
or feedback.result_metadata != expected_metadata_tuple
|
|
1022
|
+
):
|
|
1023
|
+
_fail(
|
|
1024
|
+
"post-G3 feedback is not bound to expected policy, reservation, "
|
|
1025
|
+
"terminal gate, and engine call"
|
|
1026
|
+
)
|
|
1027
|
+
return G3CausalScreenResultValidationReceipt(
|
|
1028
|
+
optimizer_result_sha256=result.result_hash,
|
|
1029
|
+
terminal_state_receipt_sha256=terminal.receipt_sha256,
|
|
1030
|
+
curation_feedback_receipt_sha256=feedback.receipt_hash,
|
|
1031
|
+
curation_authority_sha256=expected_authority.authority_sha256,
|
|
1032
|
+
curation_receipt_sha256=curation_receipt.receipt_sha256,
|
|
1033
|
+
reflection_call_receipt_sha256=engine_call_receipt.receipt_sha256,
|
|
1034
|
+
curation_status=curation_receipt.curation_status,
|
|
1035
|
+
curation_publication_outcome=curation_receipt.publication_outcome,
|
|
1036
|
+
)
|
|
1037
|
+
|
|
1038
|
+
|
|
1039
|
+
__all__ = [
|
|
1040
|
+
"G3CausalScreenResultValidationReceipt",
|
|
1041
|
+
"G3MechanismDecision",
|
|
1042
|
+
"G3TerminalStateValidationReceipt",
|
|
1043
|
+
"G3TerminalValidationError",
|
|
1044
|
+
"validate_g3_causal_screen_result",
|
|
1045
|
+
"validate_g3_terminal_state",
|
|
1046
|
+
]
|