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.
Files changed (414) hide show
  1. agent_evolve/__init__.py +722 -0
  2. agent_evolve/agentic.py +2800 -0
  3. agent_evolve/api.py +767 -0
  4. agent_evolve/application/__init__.py +1580 -0
  5. agent_evolve/application/action_allocation.py +744 -0
  6. agent_evolve/application/action_allocation_frame.py +347 -0
  7. agent_evolve/application/action_allocation_frame_commit.py +185 -0
  8. agent_evolve/application/action_allocation_frame_commit_v3.py +184 -0
  9. agent_evolve/application/action_allocation_frame_v3.py +338 -0
  10. agent_evolve/application/action_archive_value.py +497 -0
  11. agent_evolve/application/action_evidence_consistency.py +455 -0
  12. agent_evolve/application/action_forecast_partitioning.py +1471 -0
  13. agent_evolve/application/action_metric_projection.py +211 -0
  14. agent_evolve/application/action_role_value.py +680 -0
  15. agent_evolve/application/action_score_authorities.py +363 -0
  16. agent_evolve/application/action_structural_signature.py +116 -0
  17. agent_evolve/application/action_target_realization.py +402 -0
  18. agent_evolve/application/agentic_evolution.py +7734 -0
  19. agent_evolve/application/agentic_portfolio_residual_expert.py +835 -0
  20. agent_evolve/application/anchor_residual_identification.py +463 -0
  21. agent_evolve/application/archive_conditioned_action_target.py +208 -0
  22. agent_evolve/application/artifact_journal.py +246 -0
  23. agent_evolve/application/artifact_replay.py +347 -0
  24. agent_evolve/application/budgeted_optimizer.py +1828 -0
  25. agent_evolve/application/calibrated_campaign.py +485 -0
  26. agent_evolve/application/calibrated_current_prefix_forecast_opportunity.py +322 -0
  27. agent_evolve/application/calibrated_positive_gain_opportunity.py +1581 -0
  28. agent_evolve/application/campaign_capacity_recourse.py +254 -0
  29. agent_evolve/application/campaign_contextual_outcomes.py +119 -0
  30. agent_evolve/application/campaign_diagnostic_blocks.py +930 -0
  31. agent_evolve/application/campaign_evidence_registry.py +262 -0
  32. agent_evolve/application/campaign_execution.py +2537 -0
  33. agent_evolve/application/campaign_generation_audit.py +942 -0
  34. agent_evolve/application/campaign_learning.py +1812 -0
  35. agent_evolve/application/campaign_learning_runtime.py +1977 -0
  36. agent_evolve/application/campaign_search_phase.py +227 -0
  37. agent_evolve/application/campaign_selector_context_extension.py +220 -0
  38. agent_evolve/application/campaign_variation_envelope.py +649 -0
  39. agent_evolve/application/campaign_variation_trace.py +451 -0
  40. agent_evolve/application/candidate_archive_consequence.py +128 -0
  41. agent_evolve/application/causal_opportunity_portfolio_gate.py +385 -0
  42. agent_evolve/application/composite_outcome_updater.py +145 -0
  43. agent_evolve/application/composition_portfolio_selection.py +363 -0
  44. agent_evolve/application/concurrent_stage.py +144 -0
  45. agent_evolve/application/contextual_action_allocation.py +181 -0
  46. agent_evolve/application/contextual_campaign_outcomes.py +267 -0
  47. agent_evolve/application/contextual_campaign_planning.py +1366 -0
  48. agent_evolve/application/contextual_delayed_credit.py +651 -0
  49. agent_evolve/application/contextual_search_controller.py +2374 -0
  50. agent_evolve/application/current_prefix_forecast_opportunity.py +714 -0
  51. agent_evolve/application/decision_metric_projection.py +112 -0
  52. agent_evolve/application/derived_action_semantics.py +129 -0
  53. agent_evolve/application/detailed_evaluation.py +449 -0
  54. agent_evolve/application/earned_lineage.py +1011 -0
  55. agent_evolve/application/effective_choice_audit.py +484 -0
  56. agent_evolve/application/empirical_consequence_calibration.py +908 -0
  57. agent_evolve/application/evaluation_accounting.py +325 -0
  58. agent_evolve/application/evaluation_cache.py +199 -0
  59. agent_evolve/application/evaluation_escrow.py +547 -0
  60. agent_evolve/application/evaluation_recourse.py +253 -0
  61. agent_evolve/application/event_recorder.py +151 -0
  62. agent_evolve/application/evolution_campaign.py +1840 -0
  63. agent_evolve/application/executable_hypothesis.py +323 -0
  64. agent_evolve/application/factorial_branch_pilot.py +772 -0
  65. agent_evolve/application/finite_acquisition_capacity_recourse.py +672 -0
  66. agent_evolve/application/finite_acquisition_residual_expert.py +373 -0
  67. agent_evolve/application/finite_acquisition_variation_envelope.py +802 -0
  68. agent_evolve/application/finite_action_hypothesis_semantics.py +446 -0
  69. agent_evolve/application/finite_action_selection.py +188 -0
  70. agent_evolve/application/finite_action_set.py +306 -0
  71. agent_evolve/application/finite_action_transition.py +537 -0
  72. agent_evolve/application/finite_variation_eligibility.py +296 -0
  73. agent_evolve/application/forecast_geometry_portfolio.py +799 -0
  74. agent_evolve/application/forecast_opportunity_shadow_calibration.py +316 -0
  75. agent_evolve/application/front_proximity_admission.py +311 -0
  76. agent_evolve/application/front_proximity_parent_basis.py +458 -0
  77. agent_evolve/application/frozen_hurdle_score.py +659 -0
  78. agent_evolve/application/g3_causal_screen.py +2257 -0
  79. agent_evolve/application/g3_causal_validation.py +1046 -0
  80. agent_evolve/application/g3_postseal_curation.py +818 -0
  81. agent_evolve/application/gated_agentic_generator.py +205 -0
  82. agent_evolve/application/generation_feedback.py +293 -0
  83. agent_evolve/application/generative_proposal_journal.py +185 -0
  84. agent_evolve/application/geometry_conditional_elasticity.py +453 -0
  85. agent_evolve/application/global_wave_action_allocation.py +1151 -0
  86. agent_evolve/application/head_mass_conditional_seat.py +268 -0
  87. agent_evolve/application/identifiable_reflection_evidence.py +1147 -0
  88. agent_evolve/application/identifiable_reflection_learning.py +395 -0
  89. agent_evolve/application/identifiable_reflection_request.py +364 -0
  90. agent_evolve/application/in_memory_residual_archive.py +341 -0
  91. agent_evolve/application/insight_memory.py +1804 -0
  92. agent_evolve/application/live_runtime_manifest.py +758 -0
  93. agent_evolve/application/llm_task_queue.py +769 -0
  94. agent_evolve/application/matched_finite_action_block.py +409 -0
  95. agent_evolve/application/materialized_action_broker.py +2328 -0
  96. agent_evolve/application/materialized_action_constraints.py +83 -0
  97. agent_evolve/application/materialized_variation.py +211 -0
  98. agent_evolve/application/multi_option_evolution.py +1536 -0
  99. agent_evolve/application/outcome_adaptive_action_racing.py +2827 -0
  100. agent_evolve/application/outcome_adaptive_residual_campaign_runtime.py +580 -0
  101. agent_evolve/application/outcome_adaptive_residual_portfolio_evolution.py +3671 -0
  102. agent_evolve/application/outcome_conditioned_portfolio_selection.py +1374 -0
  103. agent_evolve/application/outcome_relation.py +193 -0
  104. agent_evolve/application/paired_allocation_comparison.py +241 -0
  105. agent_evolve/application/paired_block_schedule.py +127 -0
  106. agent_evolve/application/parent_measurement.py +226 -0
  107. agent_evolve/application/pareto_archive.py +811 -0
  108. agent_evolve/application/portfolio_campaign_runtime.py +4739 -0
  109. agent_evolve/application/portfolio_evolution.py +2950 -0
  110. agent_evolve/application/portfolio_hypothesis_observations.py +814 -0
  111. agent_evolve/application/portfolio_memory_attribution.py +581 -0
  112. agent_evolve/application/portfolio_memory_dose.py +788 -0
  113. agent_evolve/application/portfolio_memory_matched_control.py +938 -0
  114. agent_evolve/application/portfolio_memory_transfer.py +297 -0
  115. agent_evolve/application/portfolio_optimization_memory.py +363 -0
  116. agent_evolve/application/portfolio_outcome_feedback.py +1613 -0
  117. agent_evolve/application/portfolio_projection.py +335 -0
  118. agent_evolve/application/portfolio_recombination.py +2032 -0
  119. agent_evolve/application/post_evolution_reflection.py +834 -0
  120. agent_evolve/application/postcommit_rank_authority.py +245 -0
  121. agent_evolve/application/precommitted_portfolio_racing.py +2762 -0
  122. agent_evolve/application/prequential_archive_opportunity_calibration.py +1154 -0
  123. agent_evolve/application/prequential_residual_exploration.py +343 -0
  124. agent_evolve/application/prequential_score_portfolio.py +954 -0
  125. agent_evolve/application/projections.py +292 -0
  126. agent_evolve/application/protected_action_committee.py +1027 -0
  127. agent_evolve/application/protected_branch_pilot.py +376 -0
  128. agent_evolve/application/protected_current_prefix_forecast_opportunity.py +552 -0
  129. agent_evolve/application/provider_replay.py +910 -0
  130. agent_evolve/application/rank_balanced_causal_pilot.py +1372 -0
  131. agent_evolve/application/recombination_residual_expert.py +403 -0
  132. agent_evolve/application/reflection_workflow.py +571 -0
  133. agent_evolve/application/region_conditional_credit.py +911 -0
  134. agent_evolve/application/residual_campaign_runtime.py +531 -0
  135. agent_evolve/application/residual_headroom_campaign_runtime.py +459 -0
  136. agent_evolve/application/residual_headroom_ledger.py +1544 -0
  137. agent_evolve/application/residual_learning_transaction.py +396 -0
  138. agent_evolve/application/residual_portfolio_evolution.py +1228 -0
  139. agent_evolve/application/residual_reachability.py +749 -0
  140. agent_evolve/application/residual_stage_credit.py +499 -0
  141. agent_evolve/application/same_prefix_paired_audit.py +1580 -0
  142. agent_evolve/application/semantic_coverage_score_portfolio.py +838 -0
  143. agent_evolve/application/sequential_lineage_allocation.py +1017 -0
  144. agent_evolve/application/sequential_market_replay.py +1395 -0
  145. agent_evolve/application/sequential_residual_campaign_runtime.py +305 -0
  146. agent_evolve/application/sequential_residual_portfolio_evolution.py +940 -0
  147. agent_evolve/application/single_score_action_allocation.py +299 -0
  148. agent_evolve/application/source_exposure_allocation.py +906 -0
  149. agent_evolve/application/staged_memory.py +210 -0
  150. agent_evolve/application/stratified_cold_start_allocation.py +732 -0
  151. agent_evolve/application/support_guarded_hurdle_score.py +549 -0
  152. agent_evolve/application/target_conditioned_action_forecast.py +595 -0
  153. agent_evolve/application/target_conditioned_campaign.py +566 -0
  154. agent_evolve/application/treatment_assignment.py +201 -0
  155. agent_evolve/application/trusted_objective_evidence.py +217 -0
  156. agent_evolve/application/two_stage_action_evolution.py +1131 -0
  157. agent_evolve/application/v8lite_allocation_policy.py +1083 -0
  158. agent_evolve/application/v9_candidate_policy.py +1303 -0
  159. agent_evolve/bootstrap.py +108 -0
  160. agent_evolve/campaign_presets.py +517 -0
  161. agent_evolve/campaign_profiles.py +452 -0
  162. agent_evolve/campaign_variation_topology.py +288 -0
  163. agent_evolve/campaign_workload.py +950 -0
  164. agent_evolve/cli.py +797 -0
  165. agent_evolve/contract.py +241 -0
  166. agent_evolve/core/__init__.py +91 -0
  167. agent_evolve/core/action_semantics.py +411 -0
  168. agent_evolve/core/authored.py +105 -0
  169. agent_evolve/core/formatting.py +286 -0
  170. agent_evolve/core/optimization_semantics.py +324 -0
  171. agent_evolve/core/problem.py +167 -0
  172. agent_evolve/core/results.py +323 -0
  173. agent_evolve/core/stats.py +70 -0
  174. agent_evolve/core/telemetry.py +100 -0
  175. agent_evolve/domain/__init__.py +89 -0
  176. agent_evolve/domain/artifact.py +162 -0
  177. agent_evolve/domain/durable_text.py +68 -0
  178. agent_evolve/domain/event.py +1454 -0
  179. agent_evolve/domain/finite_action_set.py +426 -0
  180. agent_evolve/domain/finite_variation.py +526 -0
  181. agent_evolve/domain/generative_emission.py +559 -0
  182. agent_evolve/domain/ids.py +163 -0
  183. agent_evolve/domain/inline_text.py +106 -0
  184. agent_evolve/domain/insight.py +27 -0
  185. agent_evolve/domain/lineage.py +737 -0
  186. agent_evolve/domain/llm_task_queue.py +960 -0
  187. agent_evolve/domain/outcome.py +96 -0
  188. agent_evolve/domain/patch.py +854 -0
  189. agent_evolve/domain/typed_json.py +542 -0
  190. agent_evolve/domain/variation_space.py +158 -0
  191. agent_evolve/driver.py +1014 -0
  192. agent_evolve/harness/__init__.py +29 -0
  193. agent_evolve/harness/base.py +242 -0
  194. agent_evolve/harness/directives.py +163 -0
  195. agent_evolve/harness/generative_seal.py +479 -0
  196. agent_evolve/harness/registry.py +41 -0
  197. agent_evolve/infrastructure/__init__.py +39 -0
  198. agent_evolve/infrastructure/artifacts/__init__.py +6 -0
  199. agent_evolve/infrastructure/artifacts/_verification.py +67 -0
  200. agent_evolve/infrastructure/artifacts/filesystem.py +343 -0
  201. agent_evolve/infrastructure/artifacts/in_memory.py +73 -0
  202. agent_evolve/infrastructure/asyncio_runtime.py +109 -0
  203. agent_evolve/infrastructure/authored_runtime.py +188 -0
  204. agent_evolve/infrastructure/authored_worker.py +171 -0
  205. agent_evolve/infrastructure/clock.py +53 -0
  206. agent_evolve/infrastructure/events/__init__.py +6 -0
  207. agent_evolve/infrastructure/events/_validation.py +89 -0
  208. agent_evolve/infrastructure/events/in_memory.py +56 -0
  209. agent_evolve/infrastructure/events/jsonl.py +193 -0
  210. agent_evolve/infrastructure/exception_provenance.py +215 -0
  211. agent_evolve/infrastructure/ids.py +118 -0
  212. agent_evolve/infrastructure/lineage_codec.py +1836 -0
  213. agent_evolve/infrastructure/outcome_adaptive_phase_journal.py +170 -0
  214. agent_evolve/infrastructure/residual_headroom_journal.py +221 -0
  215. agent_evolve/infrastructure/resource_lease.py +370 -0
  216. agent_evolve/infrastructure/sanitization/__init__.py +8 -0
  217. agent_evolve/infrastructure/sanitization/strict_json.py +484 -0
  218. agent_evolve/infrastructure/sequential_phase_journal.py +170 -0
  219. agent_evolve/infrastructure/stream_liveness.py +383 -0
  220. agent_evolve/infrastructure/subprocess_boundary.py +136 -0
  221. agent_evolve/integrations/__init__.py +1 -0
  222. agent_evolve/integrations/botorch/__init__.py +28 -0
  223. agent_evolve/integrations/botorch/finite_qlognehvi.py +190 -0
  224. agent_evolve/integrations/botorch/finite_qlognehvi_batch.py +155 -0
  225. agent_evolve/integrations/botorch/finite_qlognehvi_batch_identity.py +20 -0
  226. agent_evolve/integrations/botorch/finite_qlognehvi_batch_worker.py +55 -0
  227. agent_evolve/integrations/botorch/finite_qlognehvi_identity.py +22 -0
  228. agent_evolve/integrations/botorch/finite_qlognehvi_worker.py +55 -0
  229. agent_evolve/integrations/botorch/subprocess_qlognehvi.py +261 -0
  230. agent_evolve/integrations/botorch/subprocess_qlognehvi_batch.py +273 -0
  231. agent_evolve/integrations/completion.py +242 -0
  232. agent_evolve/integrations/pydantic_ai/__init__.py +441 -0
  233. agent_evolve/integrations/pydantic_ai/action_forecast.py +1068 -0
  234. agent_evolve/integrations/pydantic_ai/agentic_generator.py +2308 -0
  235. agent_evolve/integrations/pydantic_ai/async_generator.py +1604 -0
  236. agent_evolve/integrations/pydantic_ai/boundary_codec.py +1526 -0
  237. agent_evolve/integrations/pydantic_ai/calibrated_portfolio_campaign.py +756 -0
  238. agent_evolve/integrations/pydantic_ai/calibrated_portfolio_selection.py +7537 -0
  239. agent_evolve/integrations/pydantic_ai/campaign_acquisition.py +609 -0
  240. agent_evolve/integrations/pydantic_ai/execution_binding.py +138 -0
  241. agent_evolve/integrations/pydantic_ai/forecast_geometry_action_committee.py +217 -0
  242. agent_evolve/integrations/pydantic_ai/harness.py +159 -0
  243. agent_evolve/integrations/pydantic_ai/heterogeneous_model_execution.py +306 -0
  244. agent_evolve/integrations/pydantic_ai/hierarchical_residual_adaptive_semantic_view.py +179 -0
  245. agent_evolve/integrations/pydantic_ai/json_schema_dialect.py +108 -0
  246. agent_evolve/integrations/pydantic_ai/materialized_hierarchical_residual_expert.py +952 -0
  247. agent_evolve/integrations/pydantic_ai/materialized_portfolio_judge.py +520 -0
  248. agent_evolve/integrations/pydantic_ai/model_execution_profile.py +659 -0
  249. agent_evolve/integrations/pydantic_ai/outbound_request_manifest.py +1170 -0
  250. agent_evolve/integrations/pydantic_ai/portable_residual_consequence_features.py +575 -0
  251. agent_evolve/integrations/pydantic_ai/portfolio_selection.py +422 -0
  252. agent_evolve/integrations/pydantic_ai/progress_aware_openrouter.py +416 -0
  253. agent_evolve/integrations/pydantic_ai/provider_attempt_join.py +1523 -0
  254. agent_evolve/integrations/pydantic_ai/provider_free_calibrated_runner.py +607 -0
  255. agent_evolve/integrations/pydantic_ai/queued_runner.py +2634 -0
  256. agent_evolve/integrations/pydantic_ai/reconciled_residual_reachability.py +1417 -0
  257. agent_evolve/integrations/pydantic_ai/residual_forecast_geometry.py +445 -0
  258. agent_evolve/integrations/pydantic_ai/residual_reachability.py +674 -0
  259. agent_evolve/integrations/pydantic_ai/residual_semantic_cells.py +239 -0
  260. agent_evolve/integrations/pydantic_ai/sealed_output_replay.py +1068 -0
  261. agent_evolve/integrations/pydantic_ai/semantic_coverage_residual_portfolio.py +770 -0
  262. agent_evolve/integrations/pydantic_ai/semantic_decision_replay.py +383 -0
  263. agent_evolve/integrations/pydantic_ai/support_adaptive_residual_portfolio.py +135 -0
  264. agent_evolve/integrations/pydantic_ai/trusted_residual_prompt_context.py +143 -0
  265. agent_evolve/integrations/pydantic_ai/validated_openrouter_model.py +107 -0
  266. agent_evolve/integrations/pymoo_adapter.py +242 -0
  267. agent_evolve/policies/__init__.py +17 -0
  268. agent_evolve/policies/check.py +469 -0
  269. agent_evolve/policies/emit_scaffold.py +451 -0
  270. agent_evolve/policies/feedback/__init__.py +37 -0
  271. agent_evolve/policies/feedback/held_out_asn.py +1325 -0
  272. agent_evolve/policies/genetic.py +607 -0
  273. agent_evolve/policies/llm_backoff.py +183 -0
  274. agent_evolve/policies/llm_chooser.py +226 -0
  275. agent_evolve/policies/llm_generator.py +1760 -0
  276. agent_evolve/policies/llm_init.py +267 -0
  277. agent_evolve/policies/llm_operator.py +109 -0
  278. agent_evolve/policies/llm_prior.py +194 -0
  279. agent_evolve/policies/llm_surrogate.py +334 -0
  280. agent_evolve/policies/measurement_evidence.py +704 -0
  281. agent_evolve/policies/memory/__init__.py +223 -0
  282. agent_evolve/policies/memory/balanced_subset_blocks.py +707 -0
  283. agent_evolve/policies/memory/compatibility_matching.py +593 -0
  284. agent_evolve/policies/memory/global_falsification.py +1841 -0
  285. agent_evolve/policies/memory/prompt_shape.py +503 -0
  286. agent_evolve/policies/memory/randomized_subset.py +714 -0
  287. agent_evolve/policies/memory/staged_causal.py +1270 -0
  288. agent_evolve/policies/memory/treatment_compliance.py +759 -0
  289. agent_evolve/policies/objective_resolution/__init__.py +17 -0
  290. agent_evolve/policies/objective_resolution/fixed_grid.py +364 -0
  291. agent_evolve/policies/operator_portfolio.py +407 -0
  292. agent_evolve/policies/reguidance.py +1133 -0
  293. agent_evolve/policies/reward/__init__.py +83 -0
  294. agent_evolve/policies/reward/affine_candidate_consequence.py +156 -0
  295. agent_evolve/policies/reward/affine_candidate_consequence_3d.py +159 -0
  296. agent_evolve/policies/reward/affine_hypervolume.py +490 -0
  297. agent_evolve/policies/reward/affine_hypervolume_3d.py +567 -0
  298. agent_evolve/policies/reward/contextual_marginal_utility.py +318 -0
  299. agent_evolve/policies/reward/frozen_archive.py +360 -0
  300. agent_evolve/policies/reward/frozen_wave_archive.py +368 -0
  301. agent_evolve/policies/search_state.py +208 -0
  302. agent_evolve/policies/selection/__init__.py +345 -0
  303. agent_evolve/policies/selection/acquisition_certified_slate.py +684 -0
  304. agent_evolve/policies/selection/affine_frontier_context.py +330 -0
  305. agent_evolve/policies/selection/affine_frontier_target.py +473 -0
  306. agent_evolve/policies/selection/archive_elite.py +1346 -0
  307. agent_evolve/policies/selection/calibrated_portfolio_binding.py +640 -0
  308. agent_evolve/policies/selection/calibrated_slate.py +1394 -0
  309. agent_evolve/policies/selection/calibrated_slate_codec.py +579 -0
  310. agent_evolve/policies/selection/common_candidate_pool.py +685 -0
  311. agent_evolve/policies/selection/diagnostic_sampling.py +319 -0
  312. agent_evolve/policies/selection/disjoint_pairs.py +479 -0
  313. agent_evolve/policies/selection/elite_explorer.py +719 -0
  314. agent_evolve/policies/selection/finite_action.py +187 -0
  315. agent_evolve/policies/selection/finite_option_prompt_projection.py +377 -0
  316. agent_evolve/policies/selection/finite_palette_evidence.py +247 -0
  317. agent_evolve/policies/selection/forecast_calibration.py +922 -0
  318. agent_evolve/policies/selection/frontier_probe_slate.py +814 -0
  319. agent_evolve/policies/selection/frozen_archive_pairs.py +762 -0
  320. agent_evolve/policies/selection/full_support_slate.py +91 -0
  321. agent_evolve/policies/selection/meaningful_direction.py +240 -0
  322. agent_evolve/policies/selection/memory_dose_feasibility.py +259 -0
  323. agent_evolve/policies/selection/model_anchored_slate.py +826 -0
  324. agent_evolve/policies/selection/phenotype_recourse.py +979 -0
  325. agent_evolve/policies/selection/proposal_support.py +368 -0
  326. agent_evolve/policies/selection/random_portfolio.py +254 -0
  327. agent_evolve/policies/selection/regret_bounded_slate.py +1084 -0
  328. agent_evolve/policies/selection/residual_frontier.py +463 -0
  329. agent_evolve/policies/selection/residual_frontier_target.py +605 -0
  330. agent_evolve/policies/selection/structural_posterior_slate.py +1571 -0
  331. agent_evolve/policies/selection/target_conditioned_allocator.py +648 -0
  332. agent_evolve/policies/selection/target_conditioned_features.py +812 -0
  333. agent_evolve/policies/selection/target_conditioned_prequential.py +1527 -0
  334. agent_evolve/policies/selection/task_keyed_palette.py +906 -0
  335. agent_evolve/policies/semantics.py +147 -0
  336. agent_evolve/policies/structure.py +362 -0
  337. agent_evolve/policies/structured_output_budget.py +62 -0
  338. agent_evolve/policies/surrogate.py +696 -0
  339. agent_evolve/policies/variation/__init__.py +1 -0
  340. agent_evolve/policies/variation/compositional_finite_catalog.py +426 -0
  341. agent_evolve/policies/variation/crossover_inheritance.py +575 -0
  342. agent_evolve/policies/variation/disjoint_recombination.py +611 -0
  343. agent_evolve/policies/variation/exact_composition_capacity.py +214 -0
  344. agent_evolve/policies/variation/exact_parent_crossover.py +950 -0
  345. agent_evolve/policies/variation/multiscale_restart_catalog.py +372 -0
  346. agent_evolve/policies/variation/source_union_finite_catalog.py +403 -0
  347. agent_evolve/policies/variation/typed_patch.py +1981 -0
  348. agent_evolve/policies/weighted_prior.py +394 -0
  349. agent_evolve/ports/__init__.py +383 -0
  350. agent_evolve/ports/action_allocation.py +733 -0
  351. agent_evolve/ports/action_allocation_frame.py +1153 -0
  352. agent_evolve/ports/action_allocation_frame_commit.py +294 -0
  353. agent_evolve/ports/action_allocation_frame_commit_v3.py +432 -0
  354. agent_evolve/ports/action_allocation_frame_v3.py +995 -0
  355. agent_evolve/ports/action_forecast.py +1568 -0
  356. agent_evolve/ports/action_metric_projection.py +165 -0
  357. agent_evolve/ports/agentic_generator.py +1561 -0
  358. agent_evolve/ports/archive_context.py +136 -0
  359. agent_evolve/ports/artifact_sanitizer.py +44 -0
  360. agent_evolve/ports/artifact_store.py +225 -0
  361. agent_evolve/ports/clock.py +13 -0
  362. agent_evolve/ports/contextual_search_allocation.py +827 -0
  363. agent_evolve/ports/decision_metric_projection.py +258 -0
  364. agent_evolve/ports/event_store.py +55 -0
  365. agent_evolve/ports/executable_hypothesis.py +557 -0
  366. agent_evolve/ports/finite_acquisition.py +377 -0
  367. agent_evolve/ports/finite_acquisition_batch.py +296 -0
  368. agent_evolve/ports/finite_acquisition_batch_json.py +164 -0
  369. agent_evolve/ports/finite_acquisition_json.py +247 -0
  370. agent_evolve/ports/finite_acquisition_space.py +168 -0
  371. agent_evolve/ports/finite_action_selection.py +348 -0
  372. agent_evolve/ports/finite_action_set.py +256 -0
  373. agent_evolve/ports/frontier_target.py +396 -0
  374. agent_evolve/ports/generation_failure.py +43 -0
  375. agent_evolve/ports/hard_feasibility.py +233 -0
  376. agent_evolve/ports/id_factory.py +34 -0
  377. agent_evolve/ports/llm_task_queue.py +93 -0
  378. agent_evolve/ports/objective_resolution.py +419 -0
  379. agent_evolve/ports/paired_allocation_comparison.py +401 -0
  380. agent_evolve/ports/paired_block_schedule.py +475 -0
  381. agent_evolve/ports/parent_measurement.py +336 -0
  382. agent_evolve/ports/portfolio_memory_dose.py +643 -0
  383. agent_evolve/ports/portfolio_selection.py +3169 -0
  384. agent_evolve/ports/postcommit_rank_authority.py +467 -0
  385. agent_evolve/ports/presented_action_evidence.py +794 -0
  386. agent_evolve/ports/resource_lease.py +162 -0
  387. agent_evolve/ports/structured_generator.py +734 -0
  388. agent_evolve/ports/structured_output_budget.py +120 -0
  389. agent_evolve/ports/subprocess_boundary.py +138 -0
  390. agent_evolve/ports/treatment_assignment.py +466 -0
  391. agent_evolve/ports/variation_catalog.py +76 -0
  392. agent_evolve/ports/variation_source.py +226 -0
  393. agent_evolve/proposal_mode.py +157 -0
  394. agent_evolve/proposers/__init__.py +10 -0
  395. agent_evolve/proposers/random_proposer.py +188 -0
  396. agent_evolve/provider_accounting.py +163 -0
  397. agent_evolve/py.typed +0 -0
  398. agent_evolve/reference_method.py +1570 -0
  399. agent_evolve/session/__init__.py +11 -0
  400. agent_evolve/session/authorship.py +864 -0
  401. agent_evolve/session/evaluate.py +236 -0
  402. agent_evolve/session/fidelity.py +237 -0
  403. agent_evolve/session/genetic_loop.py +742 -0
  404. agent_evolve/session/loop.py +803 -0
  405. agent_evolve/session/screening.py +671 -0
  406. agent_evolve/settings.py +376 -0
  407. agent_evolve/workload_kit.py +368 -0
  408. agent_evolve/workload_prompt.py +398 -0
  409. agentevolve_optimizer-0.5.0.dist-info/METADATA +599 -0
  410. agentevolve_optimizer-0.5.0.dist-info/RECORD +414 -0
  411. agentevolve_optimizer-0.5.0.dist-info/WHEEL +5 -0
  412. agentevolve_optimizer-0.5.0.dist-info/entry_points.txt +2 -0
  413. agentevolve_optimizer-0.5.0.dist-info/licenses/LICENSE +21 -0
  414. 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
+ ]