verifiers 0.3.1.dev57__tar.gz → 0.3.1.dev59__tar.gz

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 (436) hide show
  1. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/PKG-INFO +1 -1
  2. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/__init__.py +19 -4
  3. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/cli/eval/resume.py +13 -22
  4. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/cli/eval/runner.py +14 -9
  5. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/cli/output.py +26 -28
  6. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/env.py +11 -3
  7. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/episode.py +77 -8
  8. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/graph.py +5 -0
  9. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/runtimes/prime.py +21 -24
  10. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/trace.py +29 -32
  11. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/utils/compile.py +2 -2
  12. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/.gitignore +0 -0
  13. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/LICENSE +0 -0
  14. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/README.md +0 -0
  15. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/pyproject.toml +0 -0
  16. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/__init__.py +0 -0
  17. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/conftest.py +0 -0
  18. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_browser_env.py +0 -0
  19. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_build_script.py +0 -0
  20. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_cli_agent_env.py +0 -0
  21. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_client_auth_errors.py +0 -0
  22. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_client_config.py +0 -0
  23. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_client_multimodal_types.py +0 -0
  24. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_composable_env.py +0 -0
  25. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_context_token_metrics.py +0 -0
  26. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_decorator_ranks.py +0 -0
  27. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_endpoint_registry.py +0 -0
  28. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_env_group.py +0 -0
  29. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_env_server.py +0 -0
  30. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_environment.py +0 -0
  31. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_environment_extra.py +0 -0
  32. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_error_chain.py +0 -0
  33. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_eval_display.py +0 -0
  34. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_eval_utils.py +0 -0
  35. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_gepa_cli.py +0 -0
  36. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_gepa_utils.py +0 -0
  37. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_gym_env.py +0 -0
  38. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_harbor_env_mcp.py +0 -0
  39. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_imports.py +0 -0
  40. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_init_script.py +0 -0
  41. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_install_utils.py +0 -0
  42. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_interception_utils.py +0 -0
  43. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_logging.py +0 -0
  44. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_math_rubric.py +0 -0
  45. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_maybe_think_parser.py +0 -0
  46. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_message_utils.py +0 -0
  47. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_message_utils_multimodal.py +0 -0
  48. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_multiturn_env.py +0 -0
  49. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_nemorl_client.py +0 -0
  50. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_openai_chat_completions_token_client.py +0 -0
  51. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_openai_responses_client.py +0 -0
  52. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_opencode_rlm_env.py +0 -0
  53. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_openenv_client.py +0 -0
  54. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_parser.py +0 -0
  55. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_path_utils.py +0 -0
  56. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_per_turn_timing.py +0 -0
  57. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_pricing_utils.py +0 -0
  58. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_prime_plugin.py +0 -0
  59. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_renderer_client.py +0 -0
  60. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_renderer_e2e.py +0 -0
  61. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_rlm_composable_env.py +0 -0
  62. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_rubric.py +0 -0
  63. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_rubric_group.py +0 -0
  64. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_sandbox_debug_env.py +0 -0
  65. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_sandbox_env.py +0 -0
  66. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_sandbox_mixin.py +0 -0
  67. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_save_utils.py +0 -0
  68. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_setup_script.py +0 -0
  69. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_singleturn_env.py +0 -0
  70. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_stateful_tool_env.py +0 -0
  71. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_think_parser.py +0 -0
  72. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_tool_env.py +0 -0
  73. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_tool_utils.py +0 -0
  74. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_trajectory_processing.py +0 -0
  75. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_tui_info_formatting.py +0 -0
  76. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_types.py +0 -0
  77. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/test_xml_parser.py +0 -0
  78. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/v1/conftest.py +0 -0
  79. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  80. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/v1/fixtures/duet_v1.py +0 -0
  81. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
  82. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  83. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  84. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  85. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/v1/fixtures/echo_v1.py +0 -0
  86. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/v1/fixtures/pyproject.toml +0 -0
  87. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  88. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/v1/test_color_codeword_tasks.py +0 -0
  89. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/v1/test_configs.py +0 -0
  90. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/v1/test_e2e.py +0 -0
  91. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/v1/test_envs.py +0 -0
  92. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/v1/test_graph.py +0 -0
  93. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/v1/test_judges.py +0 -0
  94. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/v1/test_scoring.py +0 -0
  95. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/v1/test_taskset.py +0 -0
  96. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/tests/v1/test_trace.py +0 -0
  97. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/__init__.py +0 -0
  98. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/cli/__init__.py +0 -0
  99. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/cli/commands/__init__.py +0 -0
  100. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/cli/commands/build.py +0 -0
  101. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/cli/commands/eval.py +0 -0
  102. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/cli/commands/gepa.py +0 -0
  103. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/cli/commands/init.py +0 -0
  104. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/cli/commands/install.py +0 -0
  105. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/cli/commands/setup.py +0 -0
  106. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/cli/plugins/__init__.py +0 -0
  107. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/cli/plugins/prime.py +0 -0
  108. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/cli/tui.py +0 -0
  109. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/__init__.py +0 -0
  110. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/clients/__init__.py +0 -0
  111. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/clients/anthropic_messages_client.py +0 -0
  112. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/clients/client.py +0 -0
  113. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/clients/nemorl_chat_completions_client.py +0 -0
  114. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/clients/openai_chat_completions_client.py +0 -0
  115. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/clients/openai_chat_completions_token_client.py +0 -0
  116. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/clients/openai_completions_client.py +0 -0
  117. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/clients/openai_responses_client.py +0 -0
  118. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/clients/renderer_client.py +0 -0
  119. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/decorators.py +0 -0
  120. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/__init__.py +0 -0
  121. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/env_group.py +0 -0
  122. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/environment.py +0 -0
  123. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/README.md +0 -0
  124. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/__init__.py +0 -0
  125. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/cli_agent_env.py +0 -0
  126. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/README.md +0 -0
  127. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/__init__.py +0 -0
  128. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/_filter.py +0 -0
  129. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/composable_env.py +0 -0
  130. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/harness.py +0 -0
  131. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/harnesses/__init__.py +0 -0
  132. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  133. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/harnesses/opencode.py +0 -0
  134. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/harnesses/prompt.txt +0 -0
  135. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/harnesses/rlm.py +0 -0
  136. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/sandbox_debug_env.py +0 -0
  137. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/swe_debug_env.py +0 -0
  138. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/task.py +0 -0
  139. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/tasksets/__init__.py +0 -0
  140. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  141. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  142. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  143. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  144. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  145. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  146. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  147. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  148. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  149. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/tasksets/swe/README.md +0 -0
  150. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  151. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  152. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  153. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  154. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  155. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  156. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  157. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  158. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  159. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  160. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  161. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  162. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  163. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  164. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  165. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  166. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  167. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  168. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  169. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  170. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  171. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  172. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  173. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/gym_env.py +0 -0
  174. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/harbor_env/__init__.py +0 -0
  175. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/harbor_env/env.py +0 -0
  176. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/harbor_env/mcp.py +0 -0
  177. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/mcp_env.py +0 -0
  178. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/opencode_env.py +0 -0
  179. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/opencode_qa_env.py +0 -0
  180. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/opencode_rlm_env.py +0 -0
  181. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/sandbox_mixin.py +0 -0
  182. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/utils/__init__.py +0 -0
  183. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/utils/file_locks.py +0 -0
  184. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/experimental/utils/git_checkout_cache.py +0 -0
  185. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/integrations/README.md +0 -0
  186. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/integrations/__init__.py +0 -0
  187. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/integrations/browser_env/README.md +0 -0
  188. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/integrations/browser_env/__init__.py +0 -0
  189. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/integrations/browser_env/browser_env.py +0 -0
  190. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/integrations/browser_env/modes/__init__.py +0 -0
  191. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/integrations/browser_env/modes/base.py +0 -0
  192. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  193. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  194. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/integrations/openenv_env.py +0 -0
  195. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/integrations/reasoninggym_env.py +0 -0
  196. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/integrations/textarena_env.py +0 -0
  197. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/multiturn_env.py +0 -0
  198. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/python_env.py +0 -0
  199. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/sandbox_env.py +0 -0
  200. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/singleturn_env.py +0 -0
  201. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/stateful_tool_env.py +0 -0
  202. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/envs/tool_env.py +0 -0
  203. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/errors.py +0 -0
  204. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/gepa/__init__.py +0 -0
  205. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/gepa/adapter.py +0 -0
  206. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/gepa/config.py +0 -0
  207. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/gepa/display.py +0 -0
  208. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/gepa/gepa_utils.py +0 -0
  209. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/parsers/__init__.py +0 -0
  210. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/parsers/maybe_think_parser.py +0 -0
  211. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/parsers/parser.py +0 -0
  212. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/parsers/think_parser.py +0 -0
  213. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/parsers/xml_parser.py +0 -0
  214. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/rubrics/__init__.py +0 -0
  215. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/rubrics/experimental/hybrid_math_rubric.py +0 -0
  216. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/rubrics/judge_rubric.py +0 -0
  217. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/rubrics/math_rubric.py +0 -0
  218. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/rubrics/rubric.py +0 -0
  219. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/rubrics/rubric_group.py +0 -0
  220. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/scripts/__init__.py +0 -0
  221. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/scripts/build.py +0 -0
  222. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/scripts/eval.py +0 -0
  223. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/scripts/gepa.py +0 -0
  224. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/scripts/init.py +0 -0
  225. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/scripts/install.py +0 -0
  226. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/scripts/setup.py +0 -0
  227. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/scripts/tui.py +0 -0
  228. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/serve/__init__.py +0 -0
  229. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/serve/client/env_client.py +0 -0
  230. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/serve/client/zmq_env_client.py +0 -0
  231. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/serve/server/__init__.py +0 -0
  232. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/serve/server/env_router.py +0 -0
  233. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/serve/server/env_server.py +0 -0
  234. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/serve/server/env_worker.py +0 -0
  235. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/serve/server/zmq_env_server.py +0 -0
  236. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/serve/types.py +0 -0
  237. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/types.py +0 -0
  238. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/utils/__init__.py +0 -0
  239. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/utils/async_utils.py +0 -0
  240. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/utils/client_utils.py +0 -0
  241. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/utils/config_utils.py +0 -0
  242. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/utils/data_utils.py +0 -0
  243. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/utils/display_utils.py +0 -0
  244. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/utils/env_config_utils.py +0 -0
  245. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/utils/env_utils.py +0 -0
  246. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/utils/error_utils.py +0 -0
  247. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/utils/eval_display.py +0 -0
  248. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/utils/eval_utils.py +0 -0
  249. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/utils/heartbeat.py +0 -0
  250. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/utils/import_utils.py +0 -0
  251. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/utils/install_utils.py +0 -0
  252. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/utils/interception_utils.py +0 -0
  253. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/utils/logging_utils.py +0 -0
  254. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/utils/message_utils.py +0 -0
  255. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/utils/metric_utils.py +0 -0
  256. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/utils/path_utils.py +0 -0
  257. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/utils/pricing_utils.py +0 -0
  258. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/utils/process_utils.py +0 -0
  259. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/utils/response_utils.py +0 -0
  260. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/utils/save_utils.py +0 -0
  261. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/utils/serve_utils.py +0 -0
  262. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/utils/thread_utils.py +0 -0
  263. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/utils/threaded_sandbox_client.py +0 -0
  264. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/utils/tool_utils.py +0 -0
  265. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/utils/usage_utils.py +0 -0
  266. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/legacy/utils/version_utils.py +0 -0
  267. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/acp/__init__.py +0 -0
  268. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/acp/runner.py +0 -0
  269. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/agent.py +0 -0
  270. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/cli/__init__.py +0 -0
  271. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  272. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/cli/dashboard/base.py +0 -0
  273. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/cli/dashboard/eval.py +0 -0
  274. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/cli/dashboard/replay.py +0 -0
  275. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/cli/dashboard/validate.py +0 -0
  276. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/cli/debug.py +0 -0
  277. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/cli/eval/__init__.py +0 -0
  278. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/cli/eval/main.py +0 -0
  279. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/cli/gepa.py +0 -0
  280. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/cli/init.py +0 -0
  281. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/cli/replay.py +0 -0
  282. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/cli/resolve.py +0 -0
  283. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/cli/resume.py +0 -0
  284. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/cli/validate.py +0 -0
  285. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/clients/__init__.py +0 -0
  286. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/clients/base.py +0 -0
  287. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/clients/client.py +0 -0
  288. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/clients/eval.py +0 -0
  289. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/clients/train.py +0 -0
  290. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/configs/__init__.py +0 -0
  291. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/configs/agent.py +0 -0
  292. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/configs/cli/__init__.py +0 -0
  293. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/configs/cli/debug.py +0 -0
  294. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/configs/cli/env.py +0 -0
  295. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/configs/cli/eval.py +0 -0
  296. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/configs/cli/init.py +0 -0
  297. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/configs/cli/replay.py +0 -0
  298. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/configs/cli/validate.py +0 -0
  299. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/configs/client.py +0 -0
  300. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/configs/env.py +0 -0
  301. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/configs/harness.py +0 -0
  302. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/configs/judge.py +0 -0
  303. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/configs/retries.py +0 -0
  304. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/configs/runtime.py +0 -0
  305. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/configs/serve.py +0 -0
  306. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/configs/task.py +0 -0
  307. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/configs/taskset.py +0 -0
  308. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/dialects/__init__.py +0 -0
  309. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/dialects/anthropic.py +0 -0
  310. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/dialects/base.py +0 -0
  311. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/dialects/chat.py +0 -0
  312. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/dialects/responses.py +0 -0
  313. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/envs/__init__.py +0 -0
  314. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
  315. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/envs/agentic_judge/env.py +0 -0
  316. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  317. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/envs/best_of_n/env.py +0 -0
  318. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/envs/shared_agentic_judge/__init__.py +0 -0
  319. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  320. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/envs/single_agent/env.py +0 -0
  321. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/envs/user_sim/__init__.py +0 -0
  322. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/envs/user_sim/env.py +0 -0
  323. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/errors.py +0 -0
  324. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/gepa/__init__.py +0 -0
  325. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/gepa/adapter.py +0 -0
  326. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/gepa/config.py +0 -0
  327. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/gepa/dataset.py +0 -0
  328. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/gepa/reflection.py +0 -0
  329. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/gepa/runner.py +0 -0
  330. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/harness.py +0 -0
  331. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/harnesses/__init__.py +0 -0
  332. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  333. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/harnesses/bash/harness.py +0 -0
  334. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/harnesses/bash/program.py +0 -0
  335. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
  336. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
  337. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/harnesses/browser_use/program.py +0 -0
  338. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  339. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
  340. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  341. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/harnesses/codex/harness.py +0 -0
  342. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
  343. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
  344. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
  345. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  346. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  347. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  348. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  349. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  350. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/harnesses/node.py +0 -0
  351. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/harnesses/null/__init__.py +0 -0
  352. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/harnesses/null/harness.py +0 -0
  353. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/harnesses/null/program.py +0 -0
  354. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
  355. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/harnesses/openclaw/harness.py +0 -0
  356. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  357. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/harnesses/pi/harness.py +0 -0
  358. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/harnesses/pool/__init__.py +0 -0
  359. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/harnesses/pool/harness.py +0 -0
  360. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  361. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  362. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  363. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  364. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  365. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/interception/__init__.py +0 -0
  366. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/interception/base.py +0 -0
  367. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/interception/pool.py +0 -0
  368. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/interception/server.py +0 -0
  369. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/interception/tool.py +0 -0
  370. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  371. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/interception/tunnel/base.py +0 -0
  372. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/interception/tunnel/custom.py +0 -0
  373. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/interception/tunnel/prime.py +0 -0
  374. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/judge.py +0 -0
  375. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/judges/__init__.py +0 -0
  376. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/judges/reference.py +0 -0
  377. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/judges/reference.txt +0 -0
  378. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/judges/rubric.py +0 -0
  379. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/judges/rubric.txt +0 -0
  380. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/mcp/__init__.py +0 -0
  381. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/mcp/launch.py +0 -0
  382. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/mcp/server.py +0 -0
  383. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/mcp/toolset.py +0 -0
  384. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/rollout.py +0 -0
  385. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/runtimes/__init__.py +0 -0
  386. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/runtimes/base.py +0 -0
  387. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/runtimes/docker/__init__.py +0 -0
  388. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/runtimes/docker/egress.py +0 -0
  389. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/runtimes/limiters.py +0 -0
  390. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/runtimes/modal.py +0 -0
  391. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/runtimes/subprocess.py +0 -0
  392. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/serve/__init__.py +0 -0
  393. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/serve/client.py +0 -0
  394. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/serve/encoding.py +0 -0
  395. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/serve/pool.py +0 -0
  396. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/serve/server.py +0 -0
  397. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/serve/types.py +0 -0
  398. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/session.py +0 -0
  399. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/state.py +0 -0
  400. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/task.py +0 -0
  401. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/taskset.py +0 -0
  402. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/tasksets/__init__.py +0 -0
  403. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  404. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/tasksets/harbor/env.py +0 -0
  405. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  406. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  407. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  408. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  409. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/tasksets/nemo_gym/__init__.py +0 -0
  410. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/tasksets/nemo_gym/response.py +0 -0
  411. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/tasksets/nemo_gym/server.py +0 -0
  412. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/tasksets/nemo_gym/taskset.py +0 -0
  413. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/tasksets/nemo_gym/toolset.py +0 -0
  414. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  415. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  416. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  417. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  418. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/types.py +0 -0
  419. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/utils/__init__.py +0 -0
  420. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/utils/aio.py +0 -0
  421. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/utils/artifacts.py +0 -0
  422. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/utils/decorators.py +0 -0
  423. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/utils/format.py +0 -0
  424. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/utils/generic.py +0 -0
  425. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/utils/git.py +0 -0
  426. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/utils/image.py +0 -0
  427. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/utils/interrupt.py +0 -0
  428. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/utils/loaders.py +0 -0
  429. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/utils/logging.py +0 -0
  430. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/utils/memory.py +0 -0
  431. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/utils/paths.py +0 -0
  432. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/utils/platform.py +0 -0
  433. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/utils/prime.py +0 -0
  434. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/utils/retries.py +0 -0
  435. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/utils/score.py +0 -0
  436. {verifiers-0.3.1.dev57 → verifiers-0.3.1.dev59}/verifiers/v1/utils/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: verifiers
3
- Version: 0.3.1.dev57
3
+ Version: 0.3.1.dev59
4
4
  Summary: Verifiers: Environments for LLM Reinforcement Learning
5
5
  Project-URL: Homepage, https://github.com/primeintellect-ai/verifiers
6
6
  Project-URL: Documentation, https://github.com/primeintellect-ai/verifiers
@@ -33,7 +33,19 @@ from verifiers.v1.configs.task import (
33
33
  from verifiers.v1.configs.taskset import TasksetConfig
34
34
  from verifiers.v1.env import Env
35
35
  from verifiers.v1.envs.single_agent import SingleAgentEnv, SingleAgentEnvConfig
36
- from verifiers.v1.episode import Episode, WireEpisode
36
+ from verifiers.v1.episode import (
37
+ EnvInfo,
38
+ Episode,
39
+ EvalRunInfo,
40
+ EvalWorkInfo,
41
+ GroupInfo,
42
+ PolicySpan,
43
+ RunInfo,
44
+ TrainRunInfo,
45
+ TrainWorkInfo,
46
+ WireEpisode,
47
+ WorkInfo,
48
+ )
37
49
  from verifiers.v1.errors import (
38
50
  EnvError,
39
51
  HarnessError,
@@ -79,18 +91,15 @@ from verifiers.v1.trace import (
79
91
  AgentSpan,
80
92
  Branch,
81
93
  Error,
82
- EvalRunInfo,
83
94
  InterceptRecord,
84
95
  ModelCall,
85
96
  PolicyEvent,
86
97
  Reward,
87
- RunInfo,
88
98
  TimeSpan,
89
99
  TimeSplit,
90
100
  Timing,
91
101
  Trace,
92
102
  TraceTask,
93
- TrainRunInfo,
94
103
  VersionInfo,
95
104
  WireTrace,
96
105
  )
@@ -207,15 +216,21 @@ __all__ = [ # noqa: RUF022 - grouped by public API area
207
216
  "TraceTask",
208
217
  "WireTrace",
209
218
  "Reward",
219
+ "EnvInfo",
210
220
  "Episode",
211
221
  "WireEpisode",
222
+ "GroupInfo",
212
223
  "TRACE_VERSION",
213
224
  "AgentInfo",
214
225
  "RunInfo",
215
226
  "EvalRunInfo",
227
+ "EvalWorkInfo",
216
228
  "ModelCall",
217
229
  "PolicyEvent",
218
230
  "TrainRunInfo",
231
+ "TrainWorkInfo",
232
+ "WorkInfo",
233
+ "PolicySpan",
219
234
  "VersionInfo",
220
235
  "State",
221
236
  "StateT",
@@ -4,9 +4,9 @@
4
4
  it. `load` keeps the good saved rollouts and re-runs what's owed: missing rollouts
5
5
  (never written) and errored ones (dropped and redone).
6
6
 
7
- A saved rollout is matched to a selected task by content: `task_key` hashes the
8
- task's wire data. Tasks with identical data are interchangeable, a task whose data
9
- changed since the interrupted run re-runs, and nothing depends on `data.idx`.
7
+ A saved episode is matched to a selected task by hashing `episode.task.data`.
8
+ Tasks with identical data are interchangeable, a task whose data changed since the
9
+ interrupted run re-runs, and nothing depends on `data.idx`.
10
10
  """
11
11
 
12
12
  import json
@@ -16,18 +16,17 @@ from pathlib import Path
16
16
 
17
17
  from pydantic_core import from_json
18
18
 
19
- from verifiers.v1.cli.output import TRACES_FILE, sniff_episode
20
- from verifiers.v1.episode import Episode, WireEpisode
19
+ from verifiers.v1.cli.output import TRACES_FILE
20
+ from verifiers.v1.episode import WireEpisode
21
21
  from verifiers.v1.task import task_key
22
- from verifiers.v1.trace import WireTrace
23
22
 
24
23
 
25
24
  def load(
26
25
  resume_dir: Path,
27
26
  selected_keys: list[str],
28
27
  num_rollouts: int,
29
- complete: Callable[[Episode], bool] | None = None,
30
- ) -> tuple[list[Episode], dict[str, int]]:
28
+ complete: Callable[[WireEpisode], bool] | None = None,
29
+ ) -> tuple[list[WireEpisode], dict[str, int]]:
31
30
  """Load the good saved rollouts and diff them against the run's target: returns
32
31
  (kept episodes, rollouts owed per task key). `selected_keys` is one key per
33
32
  selected task (duplicates allowed — a key selected k times is owed up to
@@ -40,13 +39,8 @@ def load(
40
39
  key: count * num_rollouts for key, count in Counter(selected_keys).items()
41
40
  }
42
41
 
43
- def parse(row: dict) -> Episode:
44
- if sniff_episode(row):
45
- return WireEpisode.model_validate(row)
46
- return Episode.of(WireTrace.model_validate(row))
47
-
48
42
  verdict = complete if complete is not None else (lambda episode: episode.ok)
49
- good: dict[str, list[tuple[bytes, Episode]]] = defaultdict(list)
43
+ good: dict[str, list[tuple[bytes, WireEpisode]]] = defaultdict(list)
50
44
  if path.exists():
51
45
  with path.open("rb") as results:
52
46
  for line in results:
@@ -57,12 +51,9 @@ def load(
57
51
  row = from_json(line)
58
52
  except ValueError:
59
53
  row = json.loads(line)
60
- # The task rides each trace; a traceless record (a failure
61
- # before any trace minted) has no task and is owed again.
62
- if sniff_episode(row):
63
- key = task_key(row["traces"][0]["task"]["data"])
64
- else:
65
- key = task_key(row["task"]["data"])
54
+ if "traces" not in row:
55
+ continue
56
+ key = task_key(row["task"]["data"])
66
57
  except (ValueError, KeyError, IndexError, TypeError):
67
58
  # A torn final line (the run died mid-write) or a foreign shape
68
59
  # is not a keepable rollout — it's owed again, never a crash.
@@ -70,7 +61,7 @@ def load(
70
61
  if key not in targets or len(good[key]) >= targets[key]:
71
62
  continue
72
63
  try:
73
- episode = parse(row)
64
+ episode = WireEpisode.model_validate(row)
74
65
  if not verdict(episode):
75
66
  continue
76
67
  # A malformed row from any task/episode plugin is owed again.
@@ -80,7 +71,7 @@ def load(
80
71
  (line if line.endswith(b"\n") else line + b"\n", episode)
81
72
  )
82
73
  keep: list[bytes] = []
83
- episodes: list[Episode] = []
74
+ episodes: list[WireEpisode] = []
84
75
  owed: dict[str, int] = {}
85
76
  for key, target in targets.items():
86
77
  rows = good.get(key, [])
@@ -4,6 +4,7 @@ import asyncio
4
4
  import contextlib
5
5
  import logging
6
6
  import time
7
+ from typing import cast
7
8
 
8
9
  from verifiers.v1.cli.dashboard import dashboard
9
10
  from verifiers.v1.cli.eval import resume
@@ -16,8 +17,7 @@ from verifiers.v1.cli.resume import distribute
16
17
  from verifiers.v1.clients import ModelContext
17
18
  from verifiers.v1.configs.cli.eval import EvalConfig
18
19
  from verifiers.v1.env import Env, RunSlot
19
- from verifiers.v1.episode import Episode
20
- from verifiers.v1.trace import EvalRunInfo
20
+ from verifiers.v1.episode import Episode, EvalRunInfo
21
21
 
22
22
  logger = logging.getLogger(__name__)
23
23
 
@@ -46,7 +46,13 @@ async def run_eval(env: Env, config: EvalConfig) -> list[Episode]:
46
46
  finished: list[Episode] = []
47
47
  if config.resume:
48
48
  keys = [task.hash for task in tasks]
49
- finished, owed = resume.load(out, keys, config.num_rollouts, env.complete)
49
+ loaded, owed = resume.load(
50
+ out,
51
+ keys,
52
+ config.num_rollouts,
53
+ lambda episode: env.complete(cast(Episode, episode)),
54
+ )
55
+ finished = [cast(Episode, episode) for episode in loaded]
50
56
  if not owed: # already complete - report it and exit successfully
51
57
  print(resume.nothing_to_resume_msg(out, len(tasks), config.num_rollouts))
52
58
  raise SystemExit(0)
@@ -72,8 +78,7 @@ async def run_eval(env: Env, config: EvalConfig) -> list[Episode]:
72
78
  write_lock = asyncio.Lock()
73
79
 
74
80
  async def on_complete(episode: Episode) -> None:
75
- for trace in episode.traces:
76
- trace.record_run(EvalRunInfo(id=config.run.id, name=config.run.name))
81
+ episode.record_run(EvalRunInfo(id=config.run.id, name=config.run.name))
77
82
  await append_episode(out, episode, write_lock)
78
83
 
79
84
  # Serving resources (shared tool servers, interception) come up once for the
@@ -170,7 +175,8 @@ async def run_eval_server(config: EvalConfig) -> list[Episode]:
170
175
  finished: list[Episode] = []
171
176
  if config.resume:
172
177
  keys = [task.hash for task in tasks]
173
- finished, owed = resume.load(out, keys, config.num_rollouts)
178
+ loaded, owed = resume.load(out, keys, config.num_rollouts)
179
+ finished = [cast(Episode, episode) for episode in loaded]
174
180
  counts = distribute(keys, owed, config.num_rollouts)
175
181
  if not owed: # already complete - report it and exit successfully
176
182
  print(resume.nothing_to_resume_msg(out, len(plan), config.num_rollouts))
@@ -205,10 +211,9 @@ async def run_eval_server(config: EvalConfig) -> list[Episode]:
205
211
  sampling=config.sampling,
206
212
  **payload,
207
213
  )
208
- for trace in episode.traces:
209
- trace.record_run(EvalRunInfo(id=config.run.id, name=config.run.name))
214
+ episode.record_run(EvalRunInfo(id=config.run.id, name=config.run.name))
210
215
  await append_episode(out, episode, write_lock)
211
- return [episode]
216
+ return [cast(Episode, episode)]
212
217
 
213
218
  # Each rollout is its own `run` request, dispatched least-busy across workers.
214
219
  units = [run_unit(payload) for payload, n in plan for _ in range(n)]
@@ -6,8 +6,7 @@ whole episode owed on resume, and a failure before any trace minted still leaves
6
6
  its errors on disk. config.toml is the run's resolved config in the format the
7
7
  CLI reads (`@ config.toml`), so a run is re-runnable from its own output. Lines
8
8
  append as episodes complete, so results are durable mid-run. Files written
9
- before the episode atom (one bare trace per line) are still readable:
10
- `read_episodes` sniffs the line shape.
9
+ by this surface contain episodes only.
11
10
  """
12
11
 
13
12
  import asyncio
@@ -19,8 +18,10 @@ from pathlib import Path
19
18
  from pydantic import BaseModel, TypeAdapter
20
19
 
21
20
  from verifiers.v1.configs.cli.eval import EvalConfig
22
- from verifiers.v1.episode import Episode, WireEpisode
23
- from verifiers.v1.trace import Trace
21
+ from verifiers.v1.episode import EnvInfo, Episode, WireEpisode
22
+ from verifiers.v1.state import StateT
23
+ from verifiers.v1.task import DataT
24
+ from verifiers.v1.trace import AgentConfigT, Trace
24
25
  from verifiers.v1.utils.aio import run_shielded
25
26
 
26
27
  TRACES_FILE = "traces.jsonl"
@@ -85,7 +86,9 @@ def save_config(
85
86
  ) # fresh; appended to as rollouts complete
86
87
 
87
88
 
88
- def write_episode(results_dir: Path, episode: Episode) -> None:
89
+ def write_episode(
90
+ results_dir: Path, episode: Episode[DataT, StateT, AgentConfigT]
91
+ ) -> None:
89
92
  """Serialize and append one rollout episode in the worker thread."""
90
93
  # Preserve fields declared by typed Trace subclasses nested in the episode.
91
94
  data = type_adapter(type(episode)).dump_json(episode, exclude_none=True)
@@ -93,40 +96,29 @@ def write_episode(results_dir: Path, episode: Episode) -> None:
93
96
  f.write(data + b"\n")
94
97
 
95
98
 
96
- def sniff_episode(row: dict) -> bool:
97
- """Whether a parsed traces.jsonl row is an `Episode` (vs a pre-episode
98
- bare trace, recognizable by its message graph)."""
99
- return "traces" in row and "nodes" not in row
100
-
101
-
102
- def read_episodes(results_dir: Path, trace_type: type) -> list[Episode]:
99
+ def read_episodes(results_dir: Path, trace_type: type) -> list[WireEpisode]:
103
100
  """Load a run's saved rollouts from `traces.jsonl` with traces typed as
104
101
  `trace_type` (`Trace[WireTaskData, ...]` reads any taskset's file without
105
- importing it). A pre-episode line (one bare trace) is wrapped as a single-trace
106
- record, so both file generations read uniformly."""
102
+ importing it)."""
107
103
  trace_adapter = type_adapter(trace_type)
108
- episodes: list[Episode] = []
104
+ episodes: list[WireEpisode] = []
109
105
  with (results_dir / TRACES_FILE).open(encoding="utf-8") as f:
110
106
  for line in f:
111
107
  if not line.strip():
112
108
  continue
113
109
  row = json.loads(line)
114
- if sniff_episode(row):
115
- # Validate the shell wire-typed (unknown task fields preserved), then
116
- # re-type the traces as the caller asked.
117
- record = WireEpisode.model_validate({**row, "traces": []})
118
- record.traces = [
119
- trace_adapter.validate_python(t) for t in row.get("traces") or []
120
- ]
121
- episodes.append(record)
122
- else:
123
- trace = trace_adapter.validate_python(row)
124
- episodes.append(Episode.of(trace))
110
+ record = WireEpisode.model_validate({**row, "traces": []})
111
+ record.traces = [
112
+ trace_adapter.validate_python(trace) for trace in row["traces"]
113
+ ]
114
+ episodes.append(record)
125
115
  return episodes
126
116
 
127
117
 
128
118
  async def append_episode(
129
- results_dir: Path, episode: Episode, lock: asyncio.Lock
119
+ results_dir: Path,
120
+ episode: Episode[DataT, StateT, AgentConfigT],
121
+ lock: asyncio.Lock,
130
122
  ) -> None:
131
123
  """Append one finished rollout episode without blocking the event loop. The run's
132
124
  shared lock preserves whole-line ordering, and awaiting the worker preserves
@@ -147,4 +139,10 @@ async def append_trace(
147
139
  """Append one finished trace as a single-agent rollout episode — the writers that
148
140
  complete trace-at-a-time (eval runners, gepa, replay) all go
149
141
  through here."""
150
- await append_episode(results_dir, Episode.of(trace, env=env), lock)
142
+ episode = Episode(
143
+ env=EnvInfo(id=env),
144
+ task=trace.task,
145
+ traces=[trace],
146
+ ok=trace.ok,
147
+ )
148
+ await append_episode(results_dir, episode, lock)
@@ -31,7 +31,7 @@ from verifiers.v1.interception import (
31
31
  from verifiers.v1.mcp import SharedToolServer, serve_shared
32
32
  from verifiers.v1.runtimes import SubprocessConfig, runtime_is_local
33
33
  from verifiers.v1.task import Task
34
- from verifiers.v1.trace import Error, Trace
34
+ from verifiers.v1.trace import Error, Trace, TraceTask
35
35
  from verifiers.v1.utils.generic import concrete_type, deep_merge
36
36
  from verifiers.v1.utils.memory import trim_memory_periodically
37
37
  from verifiers.v1.utils.retries import run_episode_with_retry
@@ -60,7 +60,7 @@ class RunSlot:
60
60
  @classmethod
61
61
  def finished(cls, episode: Episode) -> "RunSlot":
62
62
  return cls(
63
- task=Task(episode.traces[0].task.data),
63
+ task=Task(episode.task.data),
64
64
  traces=list(episode.traces),
65
65
  episode=episode,
66
66
  done=True,
@@ -252,7 +252,15 @@ class Env(ABC, Generic[ConfigT]):
252
252
  completed subset, its exception on the episode's `errors`. `on_trace` observes
253
253
  each agent-run's trace at mint; `on_discard` its abandonment (a per-agent
254
254
  retry mints a replacement)."""
255
- episode = Episode(env=EnvInfo(id=self.config.env_id))
255
+ episode = Episode(
256
+ env=EnvInfo(id=self.config.env_id),
257
+ task=TraceTask(
258
+ type=type(task).__name__,
259
+ data=task.data,
260
+ key=task.key,
261
+ hash=task.hash,
262
+ ),
263
+ )
256
264
  agents = self._episode_agents(ctx, episode.traces, on_trace, on_discard)
257
265
  try:
258
266
  async with asyncio.timeout(self.config.timeout.episode):
@@ -1,14 +1,14 @@
1
1
  """The episode — one run's traces plus their shared standing, whole."""
2
2
 
3
3
  import uuid
4
- from typing import Any, Generic
4
+ from typing import Annotated, Any, Generic, Literal, Self
5
5
 
6
- from pydantic import BaseModel, Field
6
+ from pydantic import BaseModel, Field, model_validator
7
7
 
8
8
  from verifiers.v1.configs.agent import WireAgentConfig
9
9
  from verifiers.v1.state import State, StateT
10
10
  from verifiers.v1.task import DataT, WireTaskData
11
- from verifiers.v1.trace import EXCLUDE_FIELDS, AgentConfigT, Error, Trace
11
+ from verifiers.v1.trace import EXCLUDE_FIELDS, AgentConfigT, Error, Trace, TraceTask
12
12
  from verifiers.v1.types import Usage
13
13
 
14
14
 
@@ -17,6 +17,70 @@ class EnvInfo(BaseModel):
17
17
 
18
18
  id: str = ""
19
19
  """`EnvConfig.env_id`, e.g. `agentic-judge+gsm8k`."""
20
+ name: str | None = None
21
+ """The name the consumer runs the env under (e.g. an orchestrator env key)."""
22
+
23
+
24
+ class GroupInfo(BaseModel):
25
+ """The consumer-defined rollout group this episode belongs to."""
26
+
27
+ id: str
28
+
29
+
30
+ class PolicySpan(BaseModel):
31
+ """Live policy versions spanned while generating an episode."""
32
+
33
+ start: int
34
+ end: int
35
+
36
+ @model_validator(mode="after")
37
+ def ordered(self) -> Self:
38
+ if self.end < self.start:
39
+ raise ValueError("policy span end must be at least its start")
40
+ return self
41
+
42
+ @property
43
+ def drift(self) -> int:
44
+ return self.end - self.start
45
+
46
+
47
+ class TrainWorkInfo(BaseModel):
48
+ type: Literal["train"] = "train"
49
+ step: int
50
+ """The training step at which the episode was dispatched."""
51
+ policy: PolicySpan | None = None
52
+ """The live policy used for generation; None for frozen-policy work."""
53
+
54
+
55
+ class EvalWorkInfo(BaseModel):
56
+ type: Literal["eval"] = "eval"
57
+ step: int
58
+ """The training step at which the episode was dispatched."""
59
+ policy: PolicySpan | None = None
60
+ """The live policy used for generation; None for frozen-policy work."""
61
+
62
+
63
+ WorkInfo = Annotated[TrainWorkInfo | EvalWorkInfo, Field(discriminator="type")]
64
+
65
+
66
+ class TrainRunInfo(BaseModel):
67
+ """A training run and the kind of work this episode performed for it."""
68
+
69
+ type: Literal["train"] = "train"
70
+ id: str
71
+ name: str | None = None
72
+ work: WorkInfo
73
+
74
+
75
+ class EvalRunInfo(BaseModel):
76
+ """A standalone evaluation run."""
77
+
78
+ type: Literal["eval"] = "eval"
79
+ id: str
80
+ name: str | None = None
81
+
82
+
83
+ RunInfo = Annotated[TrainRunInfo | EvalRunInfo, Field(discriminator="type")]
20
84
 
21
85
 
22
86
  class Episode(BaseModel, Generic[DataT, StateT, AgentConfigT]):
@@ -26,6 +90,12 @@ class Episode(BaseModel, Generic[DataT, StateT, AgentConfigT]):
26
90
 
27
91
  env: EnvInfo = Field(default_factory=EnvInfo)
28
92
  """The env that produced this episode."""
93
+ task: TraceTask[DataT]
94
+ """The task dispatched to the env, including when no trace was produced."""
95
+ group: GroupInfo | None = None
96
+ """Consumer-assigned rollout group, if this episode was grouped."""
97
+ run: RunInfo | None = None
98
+ """The run this episode belongs to, consumer-stamped."""
29
99
  ok: bool = False
30
100
  """Whether the episode completed successfully."""
31
101
  errors: list[Error] = Field(default_factory=list)
@@ -33,6 +103,10 @@ class Episode(BaseModel, Generic[DataT, StateT, AgentConfigT]):
33
103
  traces: list[Trace[DataT, StateT, AgentConfigT]] = Field(default_factory=list)
34
104
  """Every agent's trace, in completion order."""
35
105
 
106
+ def record_run(self, run: RunInfo) -> None:
107
+ """Record the run identity on the dispatched episode."""
108
+ self.run = run
109
+
36
110
  @property
37
111
  def last_error(self) -> Error | None:
38
112
  """The last episode-level error captured across attempts."""
@@ -80,11 +154,6 @@ class Episode(BaseModel, Generic[DataT, StateT, AgentConfigT]):
80
154
  exclude_none=True,
81
155
  )
82
156
 
83
- @classmethod
84
- def of(cls, trace: Trace, env: str = "") -> "Episode":
85
- """The single-agent record: one trace as its own episode."""
86
- return cls(env=EnvInfo(id=env), traces=[trace], ok=trace.ok)
87
-
88
157
 
89
158
  WireEpisode = Episode[WireTaskData, State, WireAgentConfig]
90
159
  """Record loader for consumers without the run's packages: unknown task fields
@@ -106,6 +106,11 @@ class MessageNode(BaseModel):
106
106
  consumer's RL algorithm assigns it, which is not the same as a credit of zero: a group whose
107
107
  rewards were all equal is assigned zeros and carries no gradient, while an unassigned node was
108
108
  never scored at all."""
109
+ reference_logprobs: list[float] | None = None
110
+ """Reference-model logprobs over the sampled tokens, in the same compact layout as
111
+ `logprobs`. None means no reference model scored this node."""
112
+ loss_weights: dict[str, list[float]] | None = None
113
+ """Named loss-weight streams aligned to `token_ids`, consumer-stamped."""
109
114
  multi_modal_data: SkipJsonSchema[MultiModalData | None] = None
110
115
  """The renderer items for the images this message's content introduces (pixel tensors,
111
116
  grids, hashes, placeholders) — the only carrier of the pixels from the env server to the
@@ -36,9 +36,10 @@ from verifiers.v1.utils.prime import ensure_prime_auth
36
36
 
37
37
  logger = logging.getLogger(__name__)
38
38
 
39
- CONTAINER_LIFETIME = 24 * 60 * 60
40
- """Fixed lifetime (seconds) of container sandboxes; only VM sandboxes support an
41
- unbounded lifetime."""
39
+ IDLE_FALLBACK_LIFETIME = 30 * 24 * 60 * 60
40
+ """Lifetime (seconds) given to container sandboxes that set an idle timeout: the
41
+ platform requires a finite lifetime there as a safety fallback should idle detection
42
+ fail. Far above any real run, so effectively unbounded."""
42
43
 
43
44
 
44
45
  BASE_LABELS: list[str] = []
@@ -101,20 +102,6 @@ class PrimeConfig(NetworkPolicyConfig):
101
102
  )
102
103
  return self
103
104
 
104
- @model_validator(mode="after")
105
- def _validate_idle_timeout(self) -> "PrimeConfig":
106
- if (
107
- not self.vm
108
- and self.idle_timeout is not None
109
- and self.idle_timeout > CONTAINER_LIFETIME
110
- ):
111
- raise ValueError(
112
- f"idle_timeout ({self.idle_timeout}s) must not exceed the "
113
- f"{CONTAINER_LIFETIME}s ({CONTAINER_LIFETIME // 3600}h) container "
114
- "sandbox lifetime"
115
- )
116
- return self
117
-
118
105
 
119
106
  class PrimeRuntimeInfo(PrimeConfig, BaseRuntimeInfo):
120
107
  image_cached: bool | None = None
@@ -178,8 +165,14 @@ class PrimeRuntime(Runtime):
178
165
  "memory_gb": self.config.memory,
179
166
  "disk_size_gb": self.config.disk,
180
167
  "gpu_count": gpu_count,
181
- # -1 is prime's convention for no lifetime limit (VM-only)
182
- "timeout_minutes": -1 if self.config.vm else CONTAINER_LIFETIME // 60,
168
+ # -1 is prime's convention for no lifetime limit; containers with an
169
+ # idle timeout must carry a finite lifetime as a safety fallback (which
170
+ # must exceed the idle timeout)
171
+ "timeout_minutes": (
172
+ -1
173
+ if self.config.vm or idle_minutes is None
174
+ else max(IDLE_FALLBACK_LIFETIME // 60, idle_minutes + 1)
175
+ ),
183
176
  "idle_timeout_minutes": idle_minutes,
184
177
  "gpu_type": gpu_type,
185
178
  "region": self.config.region,
@@ -281,17 +274,21 @@ class PrimeRuntime(Runtime):
281
274
  )
282
275
 
283
276
  async def run(self, argv: list[str], env: dict[str, str]) -> ProgramResult:
277
+ # Poll the job by hand: the SDK's run_background_job needs a finite deadline,
278
+ # but the sandbox has no lifetime limit — the rollout's stage timeouts bound
279
+ # this via cancellation instead.
284
280
  try:
285
- result = await self._client.run_background_job(
281
+ job = await self._client.start_background_job(
286
282
  self.info.id,
287
283
  shlex.join(argv),
288
- # the SDK poll needs a finite deadline: the container lifetime, or
289
- # effectively unbounded for VM sandboxes
290
- timeout=365 * 24 * 60 * 60 if self.config.vm else CONTAINER_LIFETIME,
291
284
  working_dir=self.config.workdir,
292
285
  env=self.process_env(env),
293
- poll_interval=1,
294
286
  )
287
+ while True:
288
+ result = await self._client.get_background_job(self.info.id, job)
289
+ if result.completed:
290
+ break
291
+ await asyncio.sleep(1)
295
292
  except (
296
293
  Exception
297
294
  ) as e: # a sandbox/API failure is one rollout's problem, not the eval's
@@ -4,7 +4,7 @@ import time
4
4
  import traceback
5
5
  import uuid
6
6
  from collections.abc import Callable, Iterable, Iterator, Mapping
7
- from typing import TYPE_CHECKING, Annotated, Any, Generic, Literal
7
+ from typing import TYPE_CHECKING, Any, Generic
8
8
 
9
9
  import numpy as np
10
10
  from pydantic import BaseModel, Field, PrivateAttr
@@ -141,28 +141,6 @@ class Reward(BaseModel):
141
141
  return self.score * self.weight
142
142
 
143
143
 
144
- class EvalRunInfo(BaseModel):
145
- type: Literal["eval"] = "eval"
146
-
147
- id: str
148
- name: str | None = None
149
- """Human-readable run name, consumer-stamped."""
150
- step: int | None = None
151
-
152
-
153
- class TrainRunInfo(BaseModel):
154
- type: Literal["train"] = "train"
155
-
156
- id: str
157
- name: str | None = None
158
- """Human-readable run name, consumer-stamped."""
159
- step: int | None = None
160
-
161
-
162
- RunInfo = Annotated[EvalRunInfo | TrainRunInfo, Field(discriminator="type")]
163
- """The run a trace belongs to, discriminated on `type`."""
164
-
165
-
166
144
  class PolicyEvent(BaseModel):
167
145
  """A framework policy decision applied to a model call before inference."""
168
146
 
@@ -277,6 +255,34 @@ class Branch(BaseModel):
277
255
  return None
278
256
  return self.spread(lambda node: node.advantages)
279
257
 
258
+ @property
259
+ def reference_logprobs(self) -> list[float] | None:
260
+ """Reference-model logprobs aligned to `token_ids`, or None when unscored."""
261
+ if all(node.reference_logprobs is None for node in self.nodes):
262
+ return None
263
+ return self.spread(lambda node: node.reference_logprobs)
264
+
265
+ def loss_weights(self, name: str) -> list[float] | None:
266
+ """One named loss-weight stream aligned to `token_ids`, or None when absent."""
267
+ if all(
268
+ node.loss_weights is None or name not in node.loss_weights
269
+ for node in self.nodes
270
+ ):
271
+ return None
272
+ weights: list[float] = []
273
+ for node in self.nodes:
274
+ node_weights = (node.loss_weights or {}).get(name)
275
+ if node_weights is None:
276
+ weights.extend([0.0] * len(node.token_ids))
277
+ continue
278
+ if len(node_weights) != len(node.token_ids):
279
+ raise ValueError(
280
+ f"loss weight stream {name!r} must align with node token_ids: "
281
+ f"got {len(node_weights)}, expected {len(node.token_ids)}"
282
+ )
283
+ weights.extend(node_weights)
284
+ return weights
285
+
280
286
  @property
281
287
  def multi_modal_data(self) -> MultiModalData | None:
282
288
  """Node image data concatenated in token order for training; never persisted."""
@@ -361,9 +367,6 @@ class Trace(BaseModel, Generic[DataT, StateT, AgentConfigT]):
361
367
  """Unique ID for this trace, auto-generated."""
362
368
  verifiers: VersionInfo = Field(default_factory=_current_build)
363
369
  """The verifiers version that produced this trace."""
364
- run: RunInfo | None = None
365
- """The run this trace belongs to (eval or train), consumer-stamped."""
366
-
367
370
  task: TraceTask[DataT]
368
371
  """The task data that seeded this trace."""
369
372
  agent: AgentInfo[AgentConfigT]
@@ -564,12 +567,6 @@ class Trace(BaseModel, Generic[DataT, StateT, AgentConfigT]):
564
567
  if response.usage is not None:
565
568
  self.extra_usage.append(response.usage)
566
569
 
567
- def record_run(self, run: RunInfo | None = None, **info: Any) -> None:
568
- """Record the run identity (eval / train), and optional extra info."""
569
- if run is not None:
570
- self.run = run
571
- self.info.update(info)
572
-
573
570
  def stop(self, condition: str) -> None:
574
571
  """Stop the trace, optionally with a stop condition."""
575
572
  self.is_completed = True