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,201 @@
|
|
|
1
|
+
"""Deterministic prospective treatment-to-provider-slot assignment.
|
|
2
|
+
|
|
3
|
+
The permutation is derived only from public committed material, an identified
|
|
4
|
+
policy/domain, the occurrence count, and canonical input ordinals. Treatment,
|
|
5
|
+
occurrence, provider-slot, call, and request labels are intentionally excluded
|
|
6
|
+
from permutation ranks. They remain fully bound by the resulting receipt.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from collections.abc import Mapping
|
|
12
|
+
import hashlib
|
|
13
|
+
import json
|
|
14
|
+
|
|
15
|
+
from agent_evolve.ports.treatment_assignment import (
|
|
16
|
+
ProspectiveTreatmentAssignmentReceipt,
|
|
17
|
+
TreatmentAssignment,
|
|
18
|
+
TreatmentAssignmentInput,
|
|
19
|
+
TreatmentAssignmentPolicyBinding,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
HASH_RANKED_TREATMENT_ASSIGNMENT_POLICY_ID = (
|
|
24
|
+
"hash_ranked_treatment_occurrence_assignment"
|
|
25
|
+
)
|
|
26
|
+
HASH_RANKED_TREATMENT_ASSIGNMENT_POLICY_VERSION = 1
|
|
27
|
+
HASH_RANKED_TREATMENT_ASSIGNMENT_PERMUTATION_DOMAIN = (
|
|
28
|
+
"agent-evolve:prospective-treatment-assignment-rank:v1"
|
|
29
|
+
)
|
|
30
|
+
HASH_RANKED_TREATMENT_ASSIGNMENT_POLICY_DEFINITION_SHA256 = hashlib.sha256(
|
|
31
|
+
b"agent-evolve:hash-ranked-treatment-occurrence-assignment:v1;"
|
|
32
|
+
b"rank=sha256(domain,policy_binding,experiment_commitment,public_seed_"
|
|
33
|
+
b"material,occurrence_count,occurrence_input_index);"
|
|
34
|
+
b"sort=rank_digest_then_occurrence_input_index;"
|
|
35
|
+
b"provider_slots=canonical_input_order;labels_excluded_from_rank;"
|
|
36
|
+
b"runtime_rng=forbidden"
|
|
37
|
+
).hexdigest()
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class TreatmentAssignmentVerificationError(RuntimeError):
|
|
41
|
+
"""A supplied receipt differs from deterministic prospective replay."""
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _canonical_json(value: object) -> bytes:
|
|
45
|
+
return json.dumps(
|
|
46
|
+
value,
|
|
47
|
+
allow_nan=False,
|
|
48
|
+
ensure_ascii=True,
|
|
49
|
+
separators=(",", ":"),
|
|
50
|
+
sort_keys=True,
|
|
51
|
+
).encode("ascii")
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def hash_ranked_treatment_assignment_policy() -> TreatmentAssignmentPolicyBinding:
|
|
55
|
+
"""Return the identified domain-neutral public permutation policy."""
|
|
56
|
+
|
|
57
|
+
return TreatmentAssignmentPolicyBinding(
|
|
58
|
+
policy_id=HASH_RANKED_TREATMENT_ASSIGNMENT_POLICY_ID,
|
|
59
|
+
policy_version=HASH_RANKED_TREATMENT_ASSIGNMENT_POLICY_VERSION,
|
|
60
|
+
policy_definition_sha256=(
|
|
61
|
+
HASH_RANKED_TREATMENT_ASSIGNMENT_POLICY_DEFINITION_SHA256
|
|
62
|
+
),
|
|
63
|
+
permutation_domain=HASH_RANKED_TREATMENT_ASSIGNMENT_PERMUTATION_DOMAIN,
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def treatment_assignment_ordinal_permutation(
|
|
68
|
+
assignment_input: TreatmentAssignmentInput,
|
|
69
|
+
*,
|
|
70
|
+
policy: TreatmentAssignmentPolicyBinding,
|
|
71
|
+
) -> tuple[int, ...]:
|
|
72
|
+
"""Derive the provider-slot-to-occurrence permutation without runtime RNG."""
|
|
73
|
+
|
|
74
|
+
if type(assignment_input) is not TreatmentAssignmentInput:
|
|
75
|
+
raise TypeError("assignment_input must be an exact TreatmentAssignmentInput")
|
|
76
|
+
assignment_input.__post_init__()
|
|
77
|
+
if type(policy) is not TreatmentAssignmentPolicyBinding:
|
|
78
|
+
raise TypeError("policy must be an exact TreatmentAssignmentPolicyBinding")
|
|
79
|
+
policy.__post_init__()
|
|
80
|
+
|
|
81
|
+
count = len(assignment_input.occurrences)
|
|
82
|
+
domain = policy.permutation_domain.encode("ascii") + b"\x00"
|
|
83
|
+
ranked: list[tuple[bytes, int]] = []
|
|
84
|
+
for occurrence_input_index in range(count):
|
|
85
|
+
rank_payload = {
|
|
86
|
+
"schema_version": 1,
|
|
87
|
+
"policy_binding_sha256": policy.binding_sha256,
|
|
88
|
+
"experiment_commitment_sha256": (
|
|
89
|
+
assignment_input.experiment_commitment_sha256
|
|
90
|
+
),
|
|
91
|
+
"public_seed_material": assignment_input.public_seed_material,
|
|
92
|
+
"occurrence_count": count,
|
|
93
|
+
"occurrence_input_index": occurrence_input_index,
|
|
94
|
+
}
|
|
95
|
+
rank_digest = hashlib.sha256(
|
|
96
|
+
domain + _canonical_json(rank_payload)
|
|
97
|
+
).digest()
|
|
98
|
+
ranked.append((rank_digest, occurrence_input_index))
|
|
99
|
+
return tuple(index for _, index in sorted(ranked))
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def assign_treatment_occurrences(
|
|
103
|
+
assignment_input: TreatmentAssignmentInput,
|
|
104
|
+
*,
|
|
105
|
+
policy: TreatmentAssignmentPolicyBinding | None = None,
|
|
106
|
+
) -> ProspectiveTreatmentAssignmentReceipt:
|
|
107
|
+
"""Create one prospective, replayable assignment and authenticated inverse."""
|
|
108
|
+
|
|
109
|
+
if type(assignment_input) is not TreatmentAssignmentInput:
|
|
110
|
+
raise TypeError("assignment_input must be an exact TreatmentAssignmentInput")
|
|
111
|
+
assignment_input.__post_init__()
|
|
112
|
+
effective_policy = (
|
|
113
|
+
hash_ranked_treatment_assignment_policy() if policy is None else policy
|
|
114
|
+
)
|
|
115
|
+
if type(effective_policy) is not TreatmentAssignmentPolicyBinding:
|
|
116
|
+
raise TypeError("policy must be an exact TreatmentAssignmentPolicyBinding")
|
|
117
|
+
effective_policy.__post_init__()
|
|
118
|
+
|
|
119
|
+
permutation = treatment_assignment_ordinal_permutation(
|
|
120
|
+
assignment_input,
|
|
121
|
+
policy=effective_policy,
|
|
122
|
+
)
|
|
123
|
+
inverse_values = [0] * len(permutation)
|
|
124
|
+
slot_assignments: list[TreatmentAssignment] = []
|
|
125
|
+
for provider_slot_input_index, occurrence_input_index in enumerate(permutation):
|
|
126
|
+
inverse_values[occurrence_input_index] = provider_slot_input_index
|
|
127
|
+
occurrence = assignment_input.occurrences[occurrence_input_index]
|
|
128
|
+
slot_assignments.append(
|
|
129
|
+
TreatmentAssignment(
|
|
130
|
+
occurrence_id=occurrence.occurrence_id,
|
|
131
|
+
treatment_id=occurrence.treatment_id,
|
|
132
|
+
opaque_provider_slot_id=(
|
|
133
|
+
assignment_input.provider_slot_ids[provider_slot_input_index]
|
|
134
|
+
),
|
|
135
|
+
occurrence_input_index=occurrence_input_index,
|
|
136
|
+
provider_slot_input_index=provider_slot_input_index,
|
|
137
|
+
call_identity=occurrence.call_identity,
|
|
138
|
+
request_identity_sha256=occurrence.request_identity_sha256,
|
|
139
|
+
)
|
|
140
|
+
)
|
|
141
|
+
inverse = tuple(inverse_values)
|
|
142
|
+
assignments_by_occurrence: list[TreatmentAssignment | None] = [
|
|
143
|
+
None
|
|
144
|
+
] * len(permutation)
|
|
145
|
+
for assignment in slot_assignments:
|
|
146
|
+
assignments_by_occurrence[assignment.occurrence_input_index] = assignment
|
|
147
|
+
if any(value is None for value in assignments_by_occurrence):
|
|
148
|
+
raise RuntimeError("internal assignment construction lost an occurrence")
|
|
149
|
+
|
|
150
|
+
return ProspectiveTreatmentAssignmentReceipt(
|
|
151
|
+
policy=effective_policy,
|
|
152
|
+
assignment_input_sha256=assignment_input.input_sha256,
|
|
153
|
+
experiment_commitment_sha256=(
|
|
154
|
+
assignment_input.experiment_commitment_sha256
|
|
155
|
+
),
|
|
156
|
+
public_seed_material=assignment_input.public_seed_material,
|
|
157
|
+
occurrence_input_order=assignment_input.occurrences,
|
|
158
|
+
provider_slot_input_order=assignment_input.provider_slot_ids,
|
|
159
|
+
ordinal_permutation=permutation,
|
|
160
|
+
inverse_ordinal_permutation=inverse,
|
|
161
|
+
slot_to_occurrence=tuple(slot_assignments),
|
|
162
|
+
occurrence_to_slot=tuple(
|
|
163
|
+
value for value in assignments_by_occurrence if value is not None
|
|
164
|
+
),
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def verify_treatment_assignment_receipt(
|
|
169
|
+
assignment_input: TreatmentAssignmentInput,
|
|
170
|
+
receipt: ProspectiveTreatmentAssignmentReceipt | Mapping[str, object],
|
|
171
|
+
*,
|
|
172
|
+
policy: TreatmentAssignmentPolicyBinding | None = None,
|
|
173
|
+
) -> ProspectiveTreatmentAssignmentReceipt:
|
|
174
|
+
"""Fail closed unless an object or serialized record equals public replay."""
|
|
175
|
+
|
|
176
|
+
expected = assign_treatment_occurrences(assignment_input, policy=policy)
|
|
177
|
+
if type(receipt) is ProspectiveTreatmentAssignmentReceipt:
|
|
178
|
+
receipt.__post_init__()
|
|
179
|
+
matches = receipt == expected
|
|
180
|
+
elif isinstance(receipt, Mapping):
|
|
181
|
+
matches = type(receipt) is dict and receipt == expected.to_record()
|
|
182
|
+
else:
|
|
183
|
+
raise TypeError("receipt must be an exact receipt or canonical dict record")
|
|
184
|
+
if not matches:
|
|
185
|
+
raise TreatmentAssignmentVerificationError(
|
|
186
|
+
"treatment assignment receipt differs from deterministic replay"
|
|
187
|
+
)
|
|
188
|
+
return expected
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
__all__ = [
|
|
192
|
+
"HASH_RANKED_TREATMENT_ASSIGNMENT_PERMUTATION_DOMAIN",
|
|
193
|
+
"HASH_RANKED_TREATMENT_ASSIGNMENT_POLICY_DEFINITION_SHA256",
|
|
194
|
+
"HASH_RANKED_TREATMENT_ASSIGNMENT_POLICY_ID",
|
|
195
|
+
"HASH_RANKED_TREATMENT_ASSIGNMENT_POLICY_VERSION",
|
|
196
|
+
"TreatmentAssignmentVerificationError",
|
|
197
|
+
"assign_treatment_occurrences",
|
|
198
|
+
"hash_ranked_treatment_assignment_policy",
|
|
199
|
+
"treatment_assignment_ordinal_permutation",
|
|
200
|
+
"verify_treatment_assignment_receipt",
|
|
201
|
+
]
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
"""Auditable binary64 objective evidence with LLM-readable decimal values.
|
|
2
|
+
|
|
3
|
+
Persistent AgentEvolve receipts use ``float.hex`` strings because they are
|
|
4
|
+
exact and replayable. Those strings are a poor cognitive interface: an LLM
|
|
5
|
+
can easily read a hexadecimal significand as an ordinary decimal number.
|
|
6
|
+
This codec preserves the exact machine representation while providing a
|
|
7
|
+
separate JSON numeric field and round-trip decimal text for reasoning.
|
|
8
|
+
|
|
9
|
+
The codec is objective-, workload-, model-, provider-, and prompt-neutral.
|
|
10
|
+
Adapters decide which already-observed values are disclosed; this module only
|
|
11
|
+
prevents their representation from changing their meaning.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
import hashlib
|
|
17
|
+
import math
|
|
18
|
+
import re
|
|
19
|
+
from dataclasses import dataclass, field
|
|
20
|
+
from typing import Mapping
|
|
21
|
+
|
|
22
|
+
from agent_evolve.domain.typed_json import (
|
|
23
|
+
FrozenJsonObject,
|
|
24
|
+
freeze_json,
|
|
25
|
+
thaw_json,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
TRUSTED_OBJECTIVE_EVIDENCE_CODEC_ID = (
|
|
30
|
+
"binary64_decimal_objective_evidence"
|
|
31
|
+
)
|
|
32
|
+
TRUSTED_OBJECTIVE_EVIDENCE_CODEC_VERSION = 1
|
|
33
|
+
TRUSTED_OBJECTIVE_EVIDENCE_CODEC_DEFINITION_SHA256 = hashlib.sha256(
|
|
34
|
+
b"agent-evolve:binary64-decimal-objective-evidence:v1;"
|
|
35
|
+
b"reasoning-value=json-finite-number;"
|
|
36
|
+
b"roundtrip-text=17-significant-decimal-digits;"
|
|
37
|
+
b"audit-value=python-binary64-hex;"
|
|
38
|
+
b"consistency=all-three-representations-must-roundtrip-identically;"
|
|
39
|
+
b"hex-is-explicitly-machine-audit-only;"
|
|
40
|
+
b"workload-objective-model-provider-branches=false"
|
|
41
|
+
).hexdigest()
|
|
42
|
+
|
|
43
|
+
_METRIC = re.compile(r"^[A-Za-z][A-Za-z0-9_.:/-]{0,255}$")
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _finite_float(value: object, *, name: str) -> float:
|
|
47
|
+
if type(value) is not float or not math.isfinite(value):
|
|
48
|
+
raise TypeError(f"{name} must be a finite exact float")
|
|
49
|
+
return value
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _metric_id(value: object) -> str:
|
|
53
|
+
if type(value) is not str or _METRIC.fullmatch(value) is None:
|
|
54
|
+
raise ValueError("metric_id must use the closed metric grammar")
|
|
55
|
+
return value
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
@dataclass(frozen=True, slots=True)
|
|
59
|
+
class TrustedObjectiveEvidenceCodec:
|
|
60
|
+
"""Render known objective values without asking a model to parse hex."""
|
|
61
|
+
|
|
62
|
+
codec_id: str = field(
|
|
63
|
+
init=False,
|
|
64
|
+
default=TRUSTED_OBJECTIVE_EVIDENCE_CODEC_ID,
|
|
65
|
+
)
|
|
66
|
+
codec_version: int = field(
|
|
67
|
+
init=False,
|
|
68
|
+
default=TRUSTED_OBJECTIVE_EVIDENCE_CODEC_VERSION,
|
|
69
|
+
)
|
|
70
|
+
definition_sha256: str = field(
|
|
71
|
+
init=False,
|
|
72
|
+
default=TRUSTED_OBJECTIVE_EVIDENCE_CODEC_DEFINITION_SHA256,
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
def prompt_contract(self) -> FrozenJsonObject:
|
|
76
|
+
value = freeze_json(
|
|
77
|
+
{
|
|
78
|
+
"codec_id": self.codec_id,
|
|
79
|
+
"codec_version": self.codec_version,
|
|
80
|
+
"definition_sha256": self.definition_sha256,
|
|
81
|
+
"reasoning_field": "numeric_values",
|
|
82
|
+
"exact_audit_field": "exact_binary64_hex",
|
|
83
|
+
"instructions": [
|
|
84
|
+
(
|
|
85
|
+
"Use numeric_values for comparisons, arithmetic, "
|
|
86
|
+
"forecasting, and optimization reasoning."
|
|
87
|
+
),
|
|
88
|
+
(
|
|
89
|
+
"decimal_text is a round-trip decimal rendering of "
|
|
90
|
+
"the same binary64 values."
|
|
91
|
+
),
|
|
92
|
+
(
|
|
93
|
+
"exact_binary64_hex is machine-audit evidence only; "
|
|
94
|
+
"never interpret its digits as a decimal magnitude."
|
|
95
|
+
),
|
|
96
|
+
],
|
|
97
|
+
"representations_consistency_checked": True,
|
|
98
|
+
"candidate_outcomes_disclosed_by_codec": False,
|
|
99
|
+
"workload_objective_model_provider_branches": False,
|
|
100
|
+
}
|
|
101
|
+
)
|
|
102
|
+
if type(value) is not FrozenJsonObject:
|
|
103
|
+
raise TypeError("prompt contract must have an object root")
|
|
104
|
+
return value
|
|
105
|
+
|
|
106
|
+
def encode_point(
|
|
107
|
+
self,
|
|
108
|
+
objectives: Mapping[str, float],
|
|
109
|
+
) -> FrozenJsonObject:
|
|
110
|
+
"""Encode one already-authorized objective mapping."""
|
|
111
|
+
|
|
112
|
+
if not isinstance(objectives, Mapping) or not objectives:
|
|
113
|
+
raise ValueError("objectives must be a non-empty mapping")
|
|
114
|
+
ordered: list[tuple[str, float]] = []
|
|
115
|
+
for metric_id, raw_value in objectives.items():
|
|
116
|
+
ordered.append(
|
|
117
|
+
(
|
|
118
|
+
_metric_id(metric_id),
|
|
119
|
+
_finite_float(
|
|
120
|
+
raw_value,
|
|
121
|
+
name=f"objective[{metric_id!r}]",
|
|
122
|
+
),
|
|
123
|
+
)
|
|
124
|
+
)
|
|
125
|
+
ordered.sort(key=lambda value: value[0])
|
|
126
|
+
if len({name for name, _ in ordered}) != len(ordered):
|
|
127
|
+
raise ValueError("objectives repeat a metric")
|
|
128
|
+
|
|
129
|
+
value = freeze_json(
|
|
130
|
+
{
|
|
131
|
+
"numeric_values": {
|
|
132
|
+
metric_id: metric_value
|
|
133
|
+
for metric_id, metric_value in ordered
|
|
134
|
+
},
|
|
135
|
+
"decimal_text": {
|
|
136
|
+
metric_id: format(metric_value, ".17g")
|
|
137
|
+
for metric_id, metric_value in ordered
|
|
138
|
+
},
|
|
139
|
+
"exact_binary64_hex": {
|
|
140
|
+
metric_id: metric_value.hex()
|
|
141
|
+
for metric_id, metric_value in ordered
|
|
142
|
+
},
|
|
143
|
+
"reasoning_representation": "ordinary_json_numbers",
|
|
144
|
+
"exact_hex_is_machine_audit_only": True,
|
|
145
|
+
}
|
|
146
|
+
)
|
|
147
|
+
if type(value) is not FrozenJsonObject:
|
|
148
|
+
raise TypeError("objective evidence must have an object root")
|
|
149
|
+
self.verify_point(value)
|
|
150
|
+
return value
|
|
151
|
+
|
|
152
|
+
def verify_point(
|
|
153
|
+
self,
|
|
154
|
+
evidence: FrozenJsonObject,
|
|
155
|
+
) -> tuple[tuple[str, float], ...]:
|
|
156
|
+
"""Authenticate all public representations and return exact values."""
|
|
157
|
+
|
|
158
|
+
if (
|
|
159
|
+
type(evidence) is not FrozenJsonObject
|
|
160
|
+
or freeze_json(evidence) is not evidence
|
|
161
|
+
):
|
|
162
|
+
raise TypeError("evidence must be an exact frozen object")
|
|
163
|
+
record = thaw_json(evidence)
|
|
164
|
+
numeric = record.get("numeric_values")
|
|
165
|
+
decimal = record.get("decimal_text")
|
|
166
|
+
exact = record.get("exact_binary64_hex")
|
|
167
|
+
if not all(
|
|
168
|
+
isinstance(value, dict)
|
|
169
|
+
for value in (numeric, decimal, exact)
|
|
170
|
+
):
|
|
171
|
+
raise ValueError("objective evidence representations are absent")
|
|
172
|
+
assert isinstance(numeric, dict)
|
|
173
|
+
assert isinstance(decimal, dict)
|
|
174
|
+
assert isinstance(exact, dict)
|
|
175
|
+
if not numeric or set(numeric) != set(decimal) or set(numeric) != set(exact):
|
|
176
|
+
raise ValueError("objective evidence metric sets differ")
|
|
177
|
+
verified: list[tuple[str, float]] = []
|
|
178
|
+
for metric_id in sorted(numeric):
|
|
179
|
+
name = _metric_id(metric_id)
|
|
180
|
+
value = _finite_float(
|
|
181
|
+
numeric[metric_id],
|
|
182
|
+
name=f"numeric_values[{name!r}]",
|
|
183
|
+
)
|
|
184
|
+
text = decimal[metric_id]
|
|
185
|
+
hex_value = exact[metric_id]
|
|
186
|
+
if type(text) is not str or type(hex_value) is not str:
|
|
187
|
+
raise TypeError("objective text/hex evidence must be strings")
|
|
188
|
+
try:
|
|
189
|
+
from_decimal = float(text)
|
|
190
|
+
from_hex = float.fromhex(hex_value)
|
|
191
|
+
except ValueError as error:
|
|
192
|
+
raise ValueError(
|
|
193
|
+
"objective evidence contains an invalid representation"
|
|
194
|
+
) from error
|
|
195
|
+
if (
|
|
196
|
+
not math.isfinite(from_decimal)
|
|
197
|
+
or not math.isfinite(from_hex)
|
|
198
|
+
or from_decimal.hex() != value.hex()
|
|
199
|
+
or from_hex.hex() != value.hex()
|
|
200
|
+
or text != format(value, ".17g")
|
|
201
|
+
or hex_value != value.hex()
|
|
202
|
+
):
|
|
203
|
+
raise ValueError(
|
|
204
|
+
"objective evidence representations are inconsistent"
|
|
205
|
+
)
|
|
206
|
+
verified.append((name, value))
|
|
207
|
+
if record.get("exact_hex_is_machine_audit_only") is not True:
|
|
208
|
+
raise ValueError("objective evidence omitted the hex warning")
|
|
209
|
+
return tuple(verified)
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
__all__ = [
|
|
213
|
+
"TRUSTED_OBJECTIVE_EVIDENCE_CODEC_DEFINITION_SHA256",
|
|
214
|
+
"TRUSTED_OBJECTIVE_EVIDENCE_CODEC_ID",
|
|
215
|
+
"TRUSTED_OBJECTIVE_EVIDENCE_CODEC_VERSION",
|
|
216
|
+
"TrustedObjectiveEvidenceCodec",
|
|
217
|
+
]
|