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,253 @@
|
|
|
1
|
+
"""Application projection for phenotype-aware bounded evaluation recourse.
|
|
2
|
+
|
|
3
|
+
The policy layer intentionally knows nothing about engine outcomes. This
|
|
4
|
+
adapter classifies immutable optimizer receipts into occurrence/status facts,
|
|
5
|
+
applies one run-wide phenotype identity policy, and invokes the objective-blind
|
|
6
|
+
recourse policy. Objective values, rewards, and Pareto decisions never cross
|
|
7
|
+
the decision call.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from collections.abc import Callable, Mapping, Sequence
|
|
13
|
+
from dataclasses import dataclass
|
|
14
|
+
|
|
15
|
+
from agent_evolve.application.agentic_evolution import InvocationOutcome
|
|
16
|
+
from agent_evolve.application.budgeted_optimizer import (
|
|
17
|
+
GenerationReceipt,
|
|
18
|
+
validate_generation_receipt_integrity,
|
|
19
|
+
)
|
|
20
|
+
from agent_evolve.policies.selection.phenotype_recourse import (
|
|
21
|
+
BoundedEvaluationRecoursePolicy,
|
|
22
|
+
EvaluationOccurrenceRole,
|
|
23
|
+
EvaluationOccurrenceStatus,
|
|
24
|
+
EvaluationRecourseDecision,
|
|
25
|
+
PhenotypeIdentity,
|
|
26
|
+
PhenotypeIdentityPolicy,
|
|
27
|
+
PhenotypeOccurrence,
|
|
28
|
+
PhenotypeOccurrenceLedger,
|
|
29
|
+
PresealedRecoursePool,
|
|
30
|
+
RecourseBudgetSnapshot,
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
EvaluationRecourseTraceSink = Callable[[Mapping[str, object]], None]
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _require_identity_policy(policy: PhenotypeIdentityPolicy) -> None:
|
|
38
|
+
if not callable(getattr(policy, "identify", None)):
|
|
39
|
+
raise TypeError("identity_policy must implement identify")
|
|
40
|
+
if type(getattr(policy, "policy_id", None)) is not str:
|
|
41
|
+
raise TypeError("identity_policy must expose a string policy_id")
|
|
42
|
+
if type(getattr(policy, "policy_version", None)) is not int:
|
|
43
|
+
raise TypeError("identity_policy must expose an integer policy_version")
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def phenotype_occurrence(
|
|
47
|
+
outcome: InvocationOutcome,
|
|
48
|
+
*,
|
|
49
|
+
role: EvaluationOccurrenceRole,
|
|
50
|
+
identity_policy: PhenotypeIdentityPolicy,
|
|
51
|
+
) -> PhenotypeOccurrence:
|
|
52
|
+
"""Project one terminal engine outcome without reading reward/objectives."""
|
|
53
|
+
|
|
54
|
+
if type(outcome) is not InvocationOutcome:
|
|
55
|
+
raise TypeError("outcome must be an exact InvocationOutcome")
|
|
56
|
+
if type(role) is not EvaluationOccurrenceRole:
|
|
57
|
+
raise TypeError("role must be an exact EvaluationOccurrenceRole")
|
|
58
|
+
_require_identity_policy(identity_policy)
|
|
59
|
+
candidate = outcome.candidate
|
|
60
|
+
|
|
61
|
+
if outcome.failure_stage == "llm":
|
|
62
|
+
status = EvaluationOccurrenceStatus.MODEL_FAILURE
|
|
63
|
+
elif outcome.failure_stage == "infrastructure":
|
|
64
|
+
status = EvaluationOccurrenceStatus.INFRASTRUCTURE_FAILURE
|
|
65
|
+
elif outcome.failure_stage == "materialization":
|
|
66
|
+
status = EvaluationOccurrenceStatus.SYSTEM_FAILURE
|
|
67
|
+
elif outcome.failure_stage == "candidate":
|
|
68
|
+
status = EvaluationOccurrenceStatus.CANDIDATE_FAILURE
|
|
69
|
+
elif outcome.failure_stage == "treatment_noncompliance":
|
|
70
|
+
status = EvaluationOccurrenceStatus.CANDIDATE_FAILURE
|
|
71
|
+
elif outcome.failure_stage is None:
|
|
72
|
+
if candidate is None:
|
|
73
|
+
raise ValueError("successful invocation has no candidate")
|
|
74
|
+
status = (
|
|
75
|
+
EvaluationOccurrenceStatus.SUCCESS
|
|
76
|
+
if candidate.valid
|
|
77
|
+
and candidate.operator_compliant
|
|
78
|
+
and candidate.evidence_compliant
|
|
79
|
+
else EvaluationOccurrenceStatus.CANDIDATE_FAILURE
|
|
80
|
+
)
|
|
81
|
+
else:
|
|
82
|
+
raise ValueError("outcome has an unsupported failure stage")
|
|
83
|
+
|
|
84
|
+
if candidate is None:
|
|
85
|
+
candidate_id = None
|
|
86
|
+
identity = None
|
|
87
|
+
else:
|
|
88
|
+
candidate_id = candidate.candidate_id
|
|
89
|
+
identity = identity_policy.identify(candidate.configuration)
|
|
90
|
+
if type(identity) is not PhenotypeIdentity:
|
|
91
|
+
raise TypeError("identity policy must return an exact PhenotypeIdentity")
|
|
92
|
+
if (
|
|
93
|
+
identity.policy_id != identity_policy.policy_id
|
|
94
|
+
or identity.policy_version != identity_policy.policy_version
|
|
95
|
+
):
|
|
96
|
+
raise ValueError("identity policy returned inconsistent metadata")
|
|
97
|
+
return PhenotypeOccurrence(
|
|
98
|
+
trial_id=outcome.prepared.operator_invocation_id,
|
|
99
|
+
role=role,
|
|
100
|
+
status=status,
|
|
101
|
+
candidate_id=candidate_id,
|
|
102
|
+
phenotype=identity,
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def phenotype_ledger_from_generation(
|
|
107
|
+
receipt: GenerationReceipt,
|
|
108
|
+
*,
|
|
109
|
+
role: EvaluationOccurrenceRole,
|
|
110
|
+
identity_policy: PhenotypeIdentityPolicy,
|
|
111
|
+
included_slot_ids: Sequence[str] | None = None,
|
|
112
|
+
) -> PhenotypeOccurrenceLedger:
|
|
113
|
+
"""Build a canonical ledger from all or an explicit subset of receipt slots."""
|
|
114
|
+
|
|
115
|
+
if type(receipt) is not GenerationReceipt:
|
|
116
|
+
raise TypeError("receipt must be an exact GenerationReceipt")
|
|
117
|
+
validate_generation_receipt_integrity(receipt)
|
|
118
|
+
if type(role) is not EvaluationOccurrenceRole:
|
|
119
|
+
raise TypeError("role must be an exact EvaluationOccurrenceRole")
|
|
120
|
+
_require_identity_policy(identity_policy)
|
|
121
|
+
available = {result.slot.slot_id: result for result in receipt.slot_results}
|
|
122
|
+
if included_slot_ids is None:
|
|
123
|
+
selected_ids = tuple(available)
|
|
124
|
+
else:
|
|
125
|
+
if isinstance(included_slot_ids, (str, bytes)) or not isinstance(
|
|
126
|
+
included_slot_ids, Sequence
|
|
127
|
+
):
|
|
128
|
+
raise TypeError("included_slot_ids must be a sequence")
|
|
129
|
+
selected_ids = tuple(included_slot_ids)
|
|
130
|
+
if any(type(value) is not str or not value for value in selected_ids):
|
|
131
|
+
raise ValueError("included_slot_ids must contain non-empty strings")
|
|
132
|
+
if len(set(selected_ids)) != len(selected_ids):
|
|
133
|
+
raise ValueError("included_slot_ids cannot contain duplicates")
|
|
134
|
+
if not set(selected_ids).issubset(available):
|
|
135
|
+
raise ValueError("included_slot_ids contains an unknown slot")
|
|
136
|
+
occurrences = tuple(
|
|
137
|
+
phenotype_occurrence(
|
|
138
|
+
available[slot_id].outcome,
|
|
139
|
+
role=role,
|
|
140
|
+
identity_policy=identity_policy,
|
|
141
|
+
)
|
|
142
|
+
for slot_id in selected_ids
|
|
143
|
+
)
|
|
144
|
+
return PhenotypeOccurrenceLedger.build(
|
|
145
|
+
occurrences,
|
|
146
|
+
identity_policy=identity_policy,
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
@dataclass(frozen=True, slots=True)
|
|
151
|
+
class EvaluationRecourseApplicationService:
|
|
152
|
+
"""Project a primary wave and make one trace-complete recourse decision."""
|
|
153
|
+
|
|
154
|
+
identity_policy: PhenotypeIdentityPolicy
|
|
155
|
+
recourse_policy: BoundedEvaluationRecoursePolicy
|
|
156
|
+
trace_sink: EvaluationRecourseTraceSink | None = None
|
|
157
|
+
|
|
158
|
+
def __post_init__(self) -> None:
|
|
159
|
+
_require_identity_policy(self.identity_policy)
|
|
160
|
+
if type(self.recourse_policy) is not BoundedEvaluationRecoursePolicy:
|
|
161
|
+
raise TypeError(
|
|
162
|
+
"recourse_policy must be an exact BoundedEvaluationRecoursePolicy"
|
|
163
|
+
)
|
|
164
|
+
if self.trace_sink is not None and not callable(self.trace_sink):
|
|
165
|
+
raise TypeError("trace_sink must be callable")
|
|
166
|
+
|
|
167
|
+
def decide(
|
|
168
|
+
self,
|
|
169
|
+
*,
|
|
170
|
+
primary_receipt: GenerationReceipt,
|
|
171
|
+
pool: PresealedRecoursePool,
|
|
172
|
+
budget: RecourseBudgetSnapshot,
|
|
173
|
+
primary_slot_ids: Sequence[str] | None = None,
|
|
174
|
+
) -> EvaluationRecourseDecision:
|
|
175
|
+
ledger = phenotype_ledger_from_generation(
|
|
176
|
+
primary_receipt,
|
|
177
|
+
role=EvaluationOccurrenceRole.PRIMARY,
|
|
178
|
+
identity_policy=self.identity_policy,
|
|
179
|
+
included_slot_ids=primary_slot_ids,
|
|
180
|
+
)
|
|
181
|
+
decision = self.recourse_policy.decide(
|
|
182
|
+
ledger=ledger,
|
|
183
|
+
pool=pool,
|
|
184
|
+
budget=budget,
|
|
185
|
+
)
|
|
186
|
+
if self.trace_sink is not None:
|
|
187
|
+
for cluster in ledger.clusters:
|
|
188
|
+
if cluster.successful_primary_collision_credit <= 0:
|
|
189
|
+
continue
|
|
190
|
+
self.trace_sink(
|
|
191
|
+
{
|
|
192
|
+
"event_type": "phenotype_collision",
|
|
193
|
+
"ledger_sha256": ledger.ledger_sha256,
|
|
194
|
+
"phenotype_identity_sha256": (
|
|
195
|
+
cluster.phenotype.identity_sha256
|
|
196
|
+
),
|
|
197
|
+
"trial_ids": [
|
|
198
|
+
item.trial_id.value for item in cluster.occurrences
|
|
199
|
+
],
|
|
200
|
+
"collision_credit": (
|
|
201
|
+
cluster.successful_primary_collision_credit
|
|
202
|
+
),
|
|
203
|
+
"zero_identity_contrast_pairs": [
|
|
204
|
+
[left.value, right.value]
|
|
205
|
+
for left, right in cluster.zero_identity_contrast_pairs
|
|
206
|
+
],
|
|
207
|
+
}
|
|
208
|
+
)
|
|
209
|
+
self.trace_sink(decision.to_trace_record())
|
|
210
|
+
return decision
|
|
211
|
+
|
|
212
|
+
def append_recourse_receipt(
|
|
213
|
+
self,
|
|
214
|
+
primary_ledger: PhenotypeOccurrenceLedger,
|
|
215
|
+
recourse_receipt: GenerationReceipt,
|
|
216
|
+
*,
|
|
217
|
+
recourse_slot_ids: Sequence[str] | None = None,
|
|
218
|
+
) -> PhenotypeOccurrenceLedger:
|
|
219
|
+
"""Publish recourse outcomes without granting them collision credit."""
|
|
220
|
+
|
|
221
|
+
if type(primary_ledger) is not PhenotypeOccurrenceLedger:
|
|
222
|
+
raise TypeError("primary_ledger must be an exact PhenotypeOccurrenceLedger")
|
|
223
|
+
recourse = phenotype_ledger_from_generation(
|
|
224
|
+
recourse_receipt,
|
|
225
|
+
role=EvaluationOccurrenceRole.RECOURSE,
|
|
226
|
+
identity_policy=self.identity_policy,
|
|
227
|
+
included_slot_ids=recourse_slot_ids,
|
|
228
|
+
)
|
|
229
|
+
combined = PhenotypeOccurrenceLedger.build(
|
|
230
|
+
(*primary_ledger.occurrences, *recourse.occurrences),
|
|
231
|
+
identity_policy=self.identity_policy,
|
|
232
|
+
)
|
|
233
|
+
if self.trace_sink is not None:
|
|
234
|
+
self.trace_sink(
|
|
235
|
+
{
|
|
236
|
+
"event_type": "evaluation_recourse_completed",
|
|
237
|
+
"primary_ledger_sha256": primary_ledger.ledger_sha256,
|
|
238
|
+
"combined_ledger_sha256": combined.ledger_sha256,
|
|
239
|
+
"experiment_block_valid": combined.experiment_block_valid,
|
|
240
|
+
"recourse_trial_ids": [
|
|
241
|
+
value.value for value in combined.ignored_recourse_trial_ids
|
|
242
|
+
],
|
|
243
|
+
}
|
|
244
|
+
)
|
|
245
|
+
return combined
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
__all__ = [
|
|
249
|
+
"EvaluationRecourseApplicationService",
|
|
250
|
+
"EvaluationRecourseTraceSink",
|
|
251
|
+
"phenotype_ledger_from_generation",
|
|
252
|
+
"phenotype_occurrence",
|
|
253
|
+
]
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"""Single append-before-publish authority for one run's event sequence."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import threading
|
|
6
|
+
from typing import Callable, Iterable, Optional, Tuple
|
|
7
|
+
|
|
8
|
+
from agent_evolve.domain.event import (
|
|
9
|
+
CURRENT_EVENT_SCHEMA_VERSION,
|
|
10
|
+
EventEnvelope,
|
|
11
|
+
EventPayload,
|
|
12
|
+
)
|
|
13
|
+
from agent_evolve.domain.ids import CorrelationId, EventId, RunId
|
|
14
|
+
from agent_evolve.ports.clock import Clock
|
|
15
|
+
from agent_evolve.ports.event_store import EventStore, EventStoreError
|
|
16
|
+
from agent_evolve.ports.id_factory import IdFactory
|
|
17
|
+
|
|
18
|
+
EventSink = Callable[[EventEnvelope], None]
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class EventAppendObservedError(EventStoreError):
|
|
22
|
+
"""Append raised, but the exact event is readable as the stream tail.
|
|
23
|
+
|
|
24
|
+
The recorder reconciles its sequence state but does not publish to sinks.
|
|
25
|
+
The caller still receives an error because the adapter could not affirm its
|
|
26
|
+
complete durability contract (for example, a directory fsync may have failed).
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class EventAppendReconciliationError(EventStoreError):
|
|
31
|
+
"""A failed append could not be reconciled to an unambiguous stream state."""
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class EventRecorder:
|
|
35
|
+
"""Create, append, then publish immutable events for exactly one run.
|
|
36
|
+
|
|
37
|
+
Sink exceptions intentionally propagate, but only after the event is durable.
|
|
38
|
+
This preserves scientific history while making observer failures visible.
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
def __init__(
|
|
42
|
+
self,
|
|
43
|
+
*,
|
|
44
|
+
run_id: RunId,
|
|
45
|
+
event_store: EventStore,
|
|
46
|
+
id_factory: IdFactory,
|
|
47
|
+
clock: Clock,
|
|
48
|
+
sinks: Iterable[EventSink] = (),
|
|
49
|
+
) -> None:
|
|
50
|
+
self.run_id = run_id
|
|
51
|
+
self._store = event_store
|
|
52
|
+
self._ids = id_factory
|
|
53
|
+
self._clock = clock
|
|
54
|
+
self._sinks: Tuple[EventSink, ...] = tuple(sinks)
|
|
55
|
+
self._lock = threading.RLock()
|
|
56
|
+
|
|
57
|
+
existing = tuple(event_store.read(run_id))
|
|
58
|
+
self._last_sequence = existing[-1].sequence_number if existing else 0
|
|
59
|
+
self._last_offset = existing[-1].monotonic_offset_ns if existing else -1
|
|
60
|
+
self._clock_origin_ns = clock.monotonic_ns()
|
|
61
|
+
# A reopened recorder cannot reconstruct a previous process's monotonic
|
|
62
|
+
# origin. Continue strictly after the durable offset; M2 resume will also
|
|
63
|
+
# project elapsed wall time across process boundaries.
|
|
64
|
+
self._offset_origin = self._last_offset + 1 if existing else 0
|
|
65
|
+
|
|
66
|
+
@property
|
|
67
|
+
def last_sequence(self) -> int:
|
|
68
|
+
with self._lock:
|
|
69
|
+
return self._last_sequence
|
|
70
|
+
|
|
71
|
+
def events(self, *, after_sequence: int = 0) -> Tuple[EventEnvelope, ...]:
|
|
72
|
+
return tuple(self._store.read(self.run_id, after_sequence=after_sequence))
|
|
73
|
+
|
|
74
|
+
def _reconcile_failed_append(self, event: EventEnvelope) -> bool:
|
|
75
|
+
"""Return whether *event* is the exact readable tail after append failed."""
|
|
76
|
+
|
|
77
|
+
try:
|
|
78
|
+
observed = tuple(self._store.read(self.run_id))
|
|
79
|
+
except Exception:
|
|
80
|
+
raise EventAppendReconciliationError(
|
|
81
|
+
"failed event append has an unreadable or ambiguous outcome"
|
|
82
|
+
) from None
|
|
83
|
+
|
|
84
|
+
at_sequence = tuple(
|
|
85
|
+
item
|
|
86
|
+
for item in observed
|
|
87
|
+
if item.sequence_number == event.sequence_number
|
|
88
|
+
)
|
|
89
|
+
if not at_sequence:
|
|
90
|
+
if observed and observed[-1].sequence_number >= event.sequence_number:
|
|
91
|
+
raise EventAppendReconciliationError(
|
|
92
|
+
"failed event append conflicts with the readable stream"
|
|
93
|
+
)
|
|
94
|
+
return False
|
|
95
|
+
if len(at_sequence) != 1 or at_sequence[0] != event or observed[-1] != event:
|
|
96
|
+
raise EventAppendReconciliationError(
|
|
97
|
+
"failed event append conflicts with the readable stream"
|
|
98
|
+
)
|
|
99
|
+
return True
|
|
100
|
+
|
|
101
|
+
def record(
|
|
102
|
+
self,
|
|
103
|
+
payload: EventPayload,
|
|
104
|
+
*,
|
|
105
|
+
correlation_id: Optional[CorrelationId] = None,
|
|
106
|
+
causation_event_id: Optional[EventId] = None,
|
|
107
|
+
) -> EventEnvelope:
|
|
108
|
+
if not isinstance(payload, EventPayload):
|
|
109
|
+
raise TypeError("payload must be an EventPayload")
|
|
110
|
+
with self._lock:
|
|
111
|
+
now_monotonic = self._clock.monotonic_ns()
|
|
112
|
+
delta = now_monotonic - self._clock_origin_ns
|
|
113
|
+
if delta < 0:
|
|
114
|
+
raise RuntimeError("injected monotonic clock moved backwards")
|
|
115
|
+
offset = self._offset_origin + delta
|
|
116
|
+
sequence = self._last_sequence + 1
|
|
117
|
+
event = EventEnvelope(
|
|
118
|
+
schema_version=CURRENT_EVENT_SCHEMA_VERSION,
|
|
119
|
+
event_id=self._ids.new_event_id(),
|
|
120
|
+
run_id=self.run_id,
|
|
121
|
+
sequence_number=sequence,
|
|
122
|
+
event_type=payload.EVENT_TYPE,
|
|
123
|
+
wall_timestamp_utc=self._clock.utc_now(),
|
|
124
|
+
monotonic_offset_ns=offset,
|
|
125
|
+
correlation_id=correlation_id,
|
|
126
|
+
causation_event_id=causation_event_id,
|
|
127
|
+
payload=payload,
|
|
128
|
+
)
|
|
129
|
+
try:
|
|
130
|
+
self._store.append(
|
|
131
|
+
event,
|
|
132
|
+
expected_previous_sequence=self._last_sequence,
|
|
133
|
+
)
|
|
134
|
+
except Exception:
|
|
135
|
+
if not self._reconcile_failed_append(event):
|
|
136
|
+
raise
|
|
137
|
+
# Make a subsequent operation continue at the observed stream
|
|
138
|
+
# tail instead of retrying/reusing an already-recorded sequence.
|
|
139
|
+
self._last_sequence = sequence
|
|
140
|
+
self._last_offset = offset
|
|
141
|
+
raise EventAppendObservedError(
|
|
142
|
+
"event append reported failure after the exact event became readable; "
|
|
143
|
+
"observer sinks were not invoked"
|
|
144
|
+
) from None
|
|
145
|
+
# Advance before observers run: a failing observer cannot make a later
|
|
146
|
+
# append reuse an already-durable sequence number.
|
|
147
|
+
self._last_sequence = sequence
|
|
148
|
+
self._last_offset = offset
|
|
149
|
+
for sink in self._sinks:
|
|
150
|
+
sink(event)
|
|
151
|
+
return event
|