verifiers 0.3.1.dev33__tar.gz → 0.3.1.dev35__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 (440) hide show
  1. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/PKG-INFO +2 -2
  2. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/pyproject.toml +2 -1
  3. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/conftest.py +2 -1
  4. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/test_e2e.py +4 -3
  5. verifiers-0.3.1.dev35/verifiers/v1/cli/eval/main.py +152 -0
  6. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/cli/eval/resume.py +4 -21
  7. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/cli/eval/runner.py +5 -5
  8. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/cli/gepa.py +14 -2
  9. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/cli/output.py +45 -33
  10. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/cli/replay.py +14 -11
  11. verifiers-0.3.1.dev35/verifiers/v1/cli/resume.py +15 -0
  12. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/cli/validate.py +36 -44
  13. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/configs/cli/eval.py +59 -12
  14. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/configs/cli/validate.py +24 -10
  15. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/gepa/config.py +16 -9
  16. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/gepa/runner.py +2 -2
  17. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/claude_code/harness.py +2 -2
  18. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/codex/harness.py +2 -2
  19. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/kimi_code/harness.py +1 -1
  20. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/pi/harness.py +2 -2
  21. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/terminus_2/harness.py +1 -1
  22. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/runtimes/__init__.py +7 -1
  23. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/runtimes/prime.py +14 -2
  24. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/trace.py +4 -0
  25. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/platform.py +2 -2
  26. verifiers-0.3.1.dev33/verifiers/v1/cli/eval/main.py +0 -116
  27. verifiers-0.3.1.dev33/verifiers/v1/cli/resume.py +0 -31
  28. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/.gitignore +0 -0
  29. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/LICENSE +0 -0
  30. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/README.md +0 -0
  31. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/__init__.py +0 -0
  32. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/conftest.py +0 -0
  33. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_browser_env.py +0 -0
  34. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_build_script.py +0 -0
  35. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_cli_agent_env.py +0 -0
  36. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_client_auth_errors.py +0 -0
  37. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_client_config.py +0 -0
  38. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_client_multimodal_types.py +0 -0
  39. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_composable_env.py +0 -0
  40. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_context_token_metrics.py +0 -0
  41. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_decorator_ranks.py +0 -0
  42. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_endpoint_registry.py +0 -0
  43. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_env_group.py +0 -0
  44. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_env_server.py +0 -0
  45. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_environment.py +0 -0
  46. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_environment_extra.py +0 -0
  47. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_error_chain.py +0 -0
  48. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_eval_display.py +0 -0
  49. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_eval_utils.py +0 -0
  50. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_gepa_cli.py +0 -0
  51. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_gepa_utils.py +0 -0
  52. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_gym_env.py +0 -0
  53. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_harbor_env_mcp.py +0 -0
  54. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_imports.py +0 -0
  55. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_init_script.py +0 -0
  56. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_install_utils.py +0 -0
  57. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_interception_utils.py +0 -0
  58. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_logging.py +0 -0
  59. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_math_rubric.py +0 -0
  60. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_maybe_think_parser.py +0 -0
  61. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_message_utils.py +0 -0
  62. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_message_utils_multimodal.py +0 -0
  63. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_multiturn_env.py +0 -0
  64. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_nemorl_client.py +0 -0
  65. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_openai_chat_completions_token_client.py +0 -0
  66. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_openai_responses_client.py +0 -0
  67. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_opencode_rlm_env.py +0 -0
  68. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_openenv_client.py +0 -0
  69. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_parser.py +0 -0
  70. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_path_utils.py +0 -0
  71. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_per_turn_timing.py +0 -0
  72. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_pricing_utils.py +0 -0
  73. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_prime_plugin.py +0 -0
  74. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_renderer_client.py +0 -0
  75. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_renderer_e2e.py +0 -0
  76. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_rlm_composable_env.py +0 -0
  77. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_rubric.py +0 -0
  78. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_rubric_group.py +0 -0
  79. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_sandbox_debug_env.py +0 -0
  80. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_sandbox_env.py +0 -0
  81. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_sandbox_mixin.py +0 -0
  82. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_save_utils.py +0 -0
  83. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_setup_script.py +0 -0
  84. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_singleturn_env.py +0 -0
  85. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_stateful_tool_env.py +0 -0
  86. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_think_parser.py +0 -0
  87. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_tool_env.py +0 -0
  88. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_tool_utils.py +0 -0
  89. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_trajectory_processing.py +0 -0
  90. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_tui_info_formatting.py +0 -0
  91. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_types.py +0 -0
  92. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/test_xml_parser.py +0 -0
  93. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  94. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/fixtures/duet_v1.py +0 -0
  95. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
  96. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  97. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  98. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  99. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/fixtures/echo_v1.py +0 -0
  100. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/fixtures/pyproject.toml +0 -0
  101. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  102. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/test_color_codeword_tasks.py +0 -0
  103. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/test_configs.py +0 -0
  104. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/test_envs.py +0 -0
  105. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/test_graph.py +0 -0
  106. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/test_judges.py +0 -0
  107. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/test_scoring.py +0 -0
  108. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/test_taskset.py +0 -0
  109. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/tests/v1/test_trace.py +0 -0
  110. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/__init__.py +0 -0
  111. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/cli/__init__.py +0 -0
  112. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/cli/commands/__init__.py +0 -0
  113. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/cli/commands/build.py +0 -0
  114. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/cli/commands/eval.py +0 -0
  115. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/cli/commands/gepa.py +0 -0
  116. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/cli/commands/init.py +0 -0
  117. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/cli/commands/install.py +0 -0
  118. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/cli/commands/setup.py +0 -0
  119. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/cli/plugins/__init__.py +0 -0
  120. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/cli/plugins/prime.py +0 -0
  121. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/cli/tui.py +0 -0
  122. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/__init__.py +0 -0
  123. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/clients/__init__.py +0 -0
  124. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/clients/anthropic_messages_client.py +0 -0
  125. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/clients/client.py +0 -0
  126. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/clients/nemorl_chat_completions_client.py +0 -0
  127. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/clients/openai_chat_completions_client.py +0 -0
  128. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/clients/openai_chat_completions_token_client.py +0 -0
  129. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/clients/openai_completions_client.py +0 -0
  130. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/clients/openai_responses_client.py +0 -0
  131. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/clients/renderer_client.py +0 -0
  132. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/decorators.py +0 -0
  133. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/__init__.py +0 -0
  134. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/env_group.py +0 -0
  135. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/environment.py +0 -0
  136. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/README.md +0 -0
  137. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/__init__.py +0 -0
  138. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/cli_agent_env.py +0 -0
  139. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/README.md +0 -0
  140. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/__init__.py +0 -0
  141. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/_filter.py +0 -0
  142. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/composable_env.py +0 -0
  143. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/harness.py +0 -0
  144. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/harnesses/__init__.py +0 -0
  145. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  146. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/harnesses/opencode.py +0 -0
  147. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/harnesses/prompt.txt +0 -0
  148. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/harnesses/rlm.py +0 -0
  149. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/sandbox_debug_env.py +0 -0
  150. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/swe_debug_env.py +0 -0
  151. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/task.py +0 -0
  152. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/__init__.py +0 -0
  153. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  154. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  155. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  156. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  157. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  158. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  159. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  160. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  161. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  162. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/README.md +0 -0
  163. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  164. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  165. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  166. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  167. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  168. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  169. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  170. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  171. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  172. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  173. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  174. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  175. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  176. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  177. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  178. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  179. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  180. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  181. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  182. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  183. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  184. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  185. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  186. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/gym_env.py +0 -0
  187. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/harbor_env/__init__.py +0 -0
  188. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/harbor_env/env.py +0 -0
  189. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/harbor_env/mcp.py +0 -0
  190. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/mcp_env.py +0 -0
  191. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/opencode_env.py +0 -0
  192. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/opencode_qa_env.py +0 -0
  193. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/opencode_rlm_env.py +0 -0
  194. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/sandbox_mixin.py +0 -0
  195. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/utils/__init__.py +0 -0
  196. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/utils/file_locks.py +0 -0
  197. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/experimental/utils/git_checkout_cache.py +0 -0
  198. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/integrations/README.md +0 -0
  199. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/integrations/__init__.py +0 -0
  200. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/integrations/browser_env/README.md +0 -0
  201. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/integrations/browser_env/__init__.py +0 -0
  202. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/integrations/browser_env/browser_env.py +0 -0
  203. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/integrations/browser_env/modes/__init__.py +0 -0
  204. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/integrations/browser_env/modes/base.py +0 -0
  205. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  206. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  207. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/integrations/openenv_env.py +0 -0
  208. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/integrations/reasoninggym_env.py +0 -0
  209. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/integrations/textarena_env.py +0 -0
  210. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/multiturn_env.py +0 -0
  211. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/python_env.py +0 -0
  212. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/sandbox_env.py +0 -0
  213. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/singleturn_env.py +0 -0
  214. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/stateful_tool_env.py +0 -0
  215. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/envs/tool_env.py +0 -0
  216. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/errors.py +0 -0
  217. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/gepa/__init__.py +0 -0
  218. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/gepa/adapter.py +0 -0
  219. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/gepa/config.py +0 -0
  220. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/gepa/display.py +0 -0
  221. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/gepa/gepa_utils.py +0 -0
  222. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/parsers/__init__.py +0 -0
  223. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/parsers/maybe_think_parser.py +0 -0
  224. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/parsers/parser.py +0 -0
  225. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/parsers/think_parser.py +0 -0
  226. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/parsers/xml_parser.py +0 -0
  227. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/rubrics/__init__.py +0 -0
  228. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/rubrics/experimental/hybrid_math_rubric.py +0 -0
  229. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/rubrics/judge_rubric.py +0 -0
  230. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/rubrics/math_rubric.py +0 -0
  231. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/rubrics/rubric.py +0 -0
  232. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/rubrics/rubric_group.py +0 -0
  233. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/scripts/__init__.py +0 -0
  234. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/scripts/build.py +0 -0
  235. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/scripts/eval.py +0 -0
  236. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/scripts/gepa.py +0 -0
  237. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/scripts/init.py +0 -0
  238. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/scripts/install.py +0 -0
  239. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/scripts/setup.py +0 -0
  240. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/scripts/tui.py +0 -0
  241. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/serve/__init__.py +0 -0
  242. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/serve/client/env_client.py +0 -0
  243. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/serve/client/zmq_env_client.py +0 -0
  244. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/serve/server/__init__.py +0 -0
  245. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/serve/server/env_router.py +0 -0
  246. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/serve/server/env_server.py +0 -0
  247. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/serve/server/env_worker.py +0 -0
  248. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/serve/server/zmq_env_server.py +0 -0
  249. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/serve/types.py +0 -0
  250. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/types.py +0 -0
  251. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/__init__.py +0 -0
  252. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/async_utils.py +0 -0
  253. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/client_utils.py +0 -0
  254. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/config_utils.py +0 -0
  255. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/data_utils.py +0 -0
  256. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/display_utils.py +0 -0
  257. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/env_config_utils.py +0 -0
  258. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/env_utils.py +0 -0
  259. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/error_utils.py +0 -0
  260. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/eval_display.py +0 -0
  261. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/eval_utils.py +0 -0
  262. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/heartbeat.py +0 -0
  263. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/import_utils.py +0 -0
  264. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/install_utils.py +0 -0
  265. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/interception_utils.py +0 -0
  266. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/logging_utils.py +0 -0
  267. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/message_utils.py +0 -0
  268. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/metric_utils.py +0 -0
  269. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/path_utils.py +0 -0
  270. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/pricing_utils.py +0 -0
  271. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/process_utils.py +0 -0
  272. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/response_utils.py +0 -0
  273. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/save_utils.py +0 -0
  274. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/serve_utils.py +0 -0
  275. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/thread_utils.py +0 -0
  276. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/threaded_sandbox_client.py +0 -0
  277. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/tool_utils.py +0 -0
  278. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/usage_utils.py +0 -0
  279. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/legacy/utils/version_utils.py +0 -0
  280. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/__init__.py +0 -0
  281. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/acp/__init__.py +0 -0
  282. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/acp/runner.py +0 -0
  283. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/agent.py +0 -0
  284. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/cli/__init__.py +0 -0
  285. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  286. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/cli/dashboard/base.py +0 -0
  287. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/cli/dashboard/eval.py +0 -0
  288. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/cli/dashboard/replay.py +0 -0
  289. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/cli/dashboard/validate.py +0 -0
  290. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/cli/debug.py +0 -0
  291. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/cli/eval/__init__.py +0 -0
  292. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/cli/init.py +0 -0
  293. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/cli/resolve.py +0 -0
  294. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/clients/__init__.py +0 -0
  295. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/clients/base.py +0 -0
  296. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/clients/client.py +0 -0
  297. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/clients/eval.py +0 -0
  298. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/clients/train.py +0 -0
  299. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/configs/__init__.py +0 -0
  300. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/configs/agent.py +0 -0
  301. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/configs/cli/__init__.py +0 -0
  302. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/configs/cli/debug.py +0 -0
  303. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/configs/cli/env.py +0 -0
  304. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/configs/cli/init.py +0 -0
  305. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/configs/cli/replay.py +0 -0
  306. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/configs/client.py +0 -0
  307. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/configs/env.py +0 -0
  308. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/configs/harness.py +0 -0
  309. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/configs/judge.py +0 -0
  310. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/configs/retries.py +0 -0
  311. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/configs/runtime.py +0 -0
  312. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/configs/serve.py +0 -0
  313. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/configs/task.py +0 -0
  314. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/configs/taskset.py +0 -0
  315. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/dialects/__init__.py +0 -0
  316. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/dialects/anthropic.py +0 -0
  317. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/dialects/base.py +0 -0
  318. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/dialects/chat.py +0 -0
  319. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/dialects/responses.py +0 -0
  320. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/env.py +0 -0
  321. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/envs/__init__.py +0 -0
  322. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
  323. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/envs/agentic_judge/env.py +0 -0
  324. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  325. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/envs/best_of_n/env.py +0 -0
  326. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/envs/shared_agentic_judge/__init__.py +0 -0
  327. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  328. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/envs/single_agent/env.py +0 -0
  329. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/envs/user_sim/__init__.py +0 -0
  330. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/envs/user_sim/env.py +0 -0
  331. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/episode.py +0 -0
  332. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/errors.py +0 -0
  333. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/gepa/__init__.py +0 -0
  334. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/gepa/adapter.py +0 -0
  335. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/gepa/dataset.py +0 -0
  336. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/gepa/reflection.py +0 -0
  337. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/graph.py +0 -0
  338. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harness.py +0 -0
  339. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/__init__.py +0 -0
  340. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  341. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/bash/harness.py +0 -0
  342. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/bash/program.py +0 -0
  343. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
  344. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
  345. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/browser_use/program.py +0 -0
  346. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  347. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  348. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
  349. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
  350. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
  351. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  352. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  353. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  354. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  355. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/node.py +0 -0
  356. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/null/__init__.py +0 -0
  357. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/null/harness.py +0 -0
  358. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/null/program.py +0 -0
  359. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
  360. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/openclaw/harness.py +0 -0
  361. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  362. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/pool/__init__.py +0 -0
  363. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/pool/harness.py +0 -0
  364. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  365. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  366. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  367. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  368. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/interception/__init__.py +0 -0
  369. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/interception/base.py +0 -0
  370. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/interception/pool.py +0 -0
  371. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/interception/server.py +0 -0
  372. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/interception/tool.py +0 -0
  373. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  374. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/interception/tunnel/base.py +0 -0
  375. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/interception/tunnel/custom.py +0 -0
  376. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/interception/tunnel/prime.py +0 -0
  377. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/judge.py +0 -0
  378. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/judges/__init__.py +0 -0
  379. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/judges/reference.py +0 -0
  380. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/judges/reference.txt +0 -0
  381. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/judges/rubric.py +0 -0
  382. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/judges/rubric.txt +0 -0
  383. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/mcp/__init__.py +0 -0
  384. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/mcp/launch.py +0 -0
  385. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/mcp/server.py +0 -0
  386. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/mcp/toolset.py +0 -0
  387. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/rollout.py +0 -0
  388. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/runtimes/base.py +0 -0
  389. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/runtimes/docker/__init__.py +0 -0
  390. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/runtimes/docker/egress.py +0 -0
  391. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/runtimes/limiters.py +0 -0
  392. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/runtimes/modal.py +0 -0
  393. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/runtimes/subprocess.py +0 -0
  394. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/serve/__init__.py +0 -0
  395. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/serve/client.py +0 -0
  396. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/serve/encoding.py +0 -0
  397. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/serve/pool.py +0 -0
  398. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/serve/server.py +0 -0
  399. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/serve/types.py +0 -0
  400. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/session.py +0 -0
  401. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/state.py +0 -0
  402. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/task.py +0 -0
  403. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/taskset.py +0 -0
  404. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/tasksets/__init__.py +0 -0
  405. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  406. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/tasksets/harbor/env.py +0 -0
  407. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  408. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  409. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  410. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  411. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/tasksets/nemo_gym/__init__.py +0 -0
  412. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/tasksets/nemo_gym/response.py +0 -0
  413. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/tasksets/nemo_gym/server.py +0 -0
  414. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/tasksets/nemo_gym/taskset.py +0 -0
  415. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/tasksets/nemo_gym/toolset.py +0 -0
  416. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  417. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  418. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  419. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  420. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/types.py +0 -0
  421. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/__init__.py +0 -0
  422. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/aio.py +0 -0
  423. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/artifacts.py +0 -0
  424. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/compile.py +0 -0
  425. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/decorators.py +0 -0
  426. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/format.py +0 -0
  427. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/generic.py +0 -0
  428. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/git.py +0 -0
  429. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/image.py +0 -0
  430. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/install.py +0 -0
  431. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/install_utils.py +0 -0
  432. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/interrupt.py +0 -0
  433. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/loaders.py +0 -0
  434. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/logging.py +0 -0
  435. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/memory.py +0 -0
  436. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/paths.py +0 -0
  437. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/prime.py +0 -0
  438. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/retries.py +0 -0
  439. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/score.py +0 -0
  440. {verifiers-0.3.1.dev33 → verifiers-0.3.1.dev35}/verifiers/v1/utils/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: verifiers
3
- Version: 0.3.1.dev33
3
+ Version: 0.3.1.dev35
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
@@ -51,7 +51,7 @@ Provides-Extra: browser
51
51
  Requires-Dist: python-dotenv>=1.0.0; extra == 'browser'
52
52
  Requires-Dist: stagehand>=3.4.0; extra == 'browser'
53
53
  Provides-Extra: harbor
54
- Requires-Dist: harbor==0.20.0; (python_version >= '3.12') and extra == 'harbor'
54
+ Requires-Dist: harbor==0.21.0; (python_full_version >= '3.12') and extra == 'harbor'
55
55
  Provides-Extra: modal
56
56
  Requires-Dist: modal>=1.4.0; extra == 'modal'
57
57
  Provides-Extra: nemo-gym
@@ -109,7 +109,7 @@ browser = [
109
109
  ]
110
110
  harbor = [
111
111
  # Harbor currently publishes Python 3.12+ packages; keep core verifiers installable on 3.11.
112
- "harbor==0.20.0; python_version >= '3.12'",
112
+ "harbor==0.21.0 ; python_full_version >= '3.12'",
113
113
  ]
114
114
  modal = [
115
115
  "modal>=1.4.0",
@@ -186,6 +186,7 @@ web-search-interception = { path = "environments/web_search_interception", edita
186
186
  # Bounded cutoffs for the explicitly requested tool upgrades.
187
187
  # Full UTC timestamps: bare dates resolve to local-tz midnight and churn the
188
188
  # lockfile across timezones.
189
+ harbor = "2026-08-11T00:00:00Z"
189
190
  ruff = "2026-07-28T00:00:00Z"
190
191
  ty = "2026-07-28T00:00:00Z"
191
192
  # PrimeIntellect-published on PyPI (trusted publisher)
@@ -184,7 +184,8 @@ def _eval_config(
184
184
  "reasoning_effort": reasoning_effort,
185
185
  },
186
186
  rich=False,
187
- output_dir=output_dir,
187
+ output_dir=output_dir.parent,
188
+ run={"dir": output_dir.name},
188
189
  **({"serve": {"pool": pool}} if pool else {}),
189
190
  model=CI_MODEL,
190
191
  )
@@ -662,10 +662,9 @@ async def test_replay_round_trip(run_v1, tmp_path):
662
662
  typed rebuild fails and the trace-only `@reward` silently stops running (the
663
663
  wire-narrowing regression). Trace-only rewards are deterministic given the transcript,
664
664
  so all three generations must agree."""
665
- import tomllib
666
665
  from pathlib import Path
667
666
 
668
- from verifiers.v1.cli.output import CONFIG_FILE
667
+ from verifiers.v1.cli.output import saved_config_path
669
668
  from verifiers.v1.cli.replay import run_replay
670
669
  from verifiers.v1.configs.cli.replay import ReplayConfig
671
670
 
@@ -683,7 +682,9 @@ async def test_replay_round_trip(run_v1, tmp_path):
683
682
  async def replay(source_dir: Path, out: Path):
684
683
  # The CLI's layering, minus the argv plumbing: the saved run's config is the base
685
684
  # (`ReplayConfig` ignores its eval-only keys), the source's output_dir is dropped.
686
- data = tomllib.loads((source_dir / CONFIG_FILE).read_text())
685
+ import json
686
+
687
+ data = json.loads(saved_config_path(source_dir).read_text())
687
688
  data.pop("output_dir", None)
688
689
  config = ReplayConfig(**{**data, "rich": False})
689
690
  (trace,) = await run_replay(config, source_dir, out)
@@ -0,0 +1,152 @@
1
+ """Eval CLI entrypoint."""
2
+
3
+ import asyncio
4
+ import json
5
+ import logging
6
+ import shutil
7
+ import sys
8
+
9
+ from pydantic_config import cli
10
+
11
+ import verifiers.v1 as vf
12
+ from verifiers.v1.cli.eval.runner import run_eval
13
+ from verifiers.v1.cli.output import (
14
+ TRACES_FILE,
15
+ config_digest,
16
+ output_path,
17
+ saved_config_path,
18
+ write_config,
19
+ )
20
+ from verifiers.v1.cli.resolve import (
21
+ extract_id,
22
+ narrow_config,
23
+ plugin_errors,
24
+ references_config_file,
25
+ with_positional_taskset,
26
+ )
27
+ from verifiers.v1.configs.cli.eval import EvalConfig
28
+ from verifiers.v1.utils.interrupt import install_interrupt
29
+ from verifiers.v1.utils.logging import setup_logging
30
+
31
+ logger = logging.getLogger(__name__)
32
+
33
+ USAGE = (
34
+ "usage: uv run eval [<taskset-id>] [--env.id <id>] [options] [@ file.toml]\n"
35
+ " uv run eval @ <run-dir>/configs/eval.json --resume (re-run the run's missing/errored rollouts)"
36
+ )
37
+
38
+
39
+ def main(argv: list[str] | None = None) -> None:
40
+ argv = with_positional_taskset(list(sys.argv[1:]) if argv is None else list(argv))
41
+
42
+ if not argv or any(arg in ("-h", "--help") for arg in argv):
43
+ print(USAGE)
44
+ sys.argv = [sys.argv[0], "--help"]
45
+ with plugin_errors():
46
+ cli(
47
+ narrow_config(EvalConfig, argv)
48
+ ) # full option help, narrowed to the given ids
49
+ return
50
+ # An env-block flag (or a since-moved flat axis) skips the usage gate so the
51
+ # typed parse renders its did-you-mean instead of a bare usage line.
52
+ typed_axis = any(
53
+ a.startswith(("--env.", "--taskset.", "--harness.", "--serve.")) for a in argv
54
+ )
55
+ if (
56
+ not extract_id(argv, "env.taskset")
57
+ and not references_config_file(argv)
58
+ and not typed_axis
59
+ ):
60
+ raise SystemExit(
61
+ USAGE
62
+ ) # need a taskset (positional / --env.taskset.id) or a @ file.toml
63
+
64
+ with plugin_errors():
65
+ config_type = narrow_config(EvalConfig, argv)
66
+ sys.argv = [
67
+ sys.argv[0],
68
+ *argv,
69
+ ] # let prime-pydantic-config render help/errors
70
+ config = cli(config_type)
71
+ # A named run directory is re-entered only by `--resume` or wiped by `--clean`: any
72
+ # other write into it — the dry-run config.toml included, which would clobber the
73
+ # config a resume typically re-runs — would overwrite the previous run.
74
+ run_path = output_path(config)
75
+ if config.clean and not config.resume and run_path.exists():
76
+ if not run_path.resolve().is_relative_to(config.output_dir.resolve()):
77
+ raise SystemExit("--clean requires run.dir to remain under output_dir")
78
+ shutil.rmtree(run_path)
79
+ traces_file = run_path / TRACES_FILE
80
+ if not config.resume and traces_file.exists() and traces_file.stat().st_size > 0:
81
+ raise SystemExit(
82
+ f"run directory {run_path} already contains results - append --resume to "
83
+ "re-run its missing/errored rollouts, overwrite it with --clean, or pick "
84
+ "another --run.name"
85
+ )
86
+ if config.resume:
87
+ # A resumed eval is only trustworthy under the exact config that produced the
88
+ # existing rollouts — anything else silently mixes incomparable results. Saved
89
+ # configs are full JSON dumps (nulls included), so the comparison is exact.
90
+ saved_path = saved_config_path(run_path)
91
+ if saved_path is None:
92
+ raise SystemExit(
93
+ f"--resume: no saved config under {run_path} - not a run dir"
94
+ )
95
+ with plugin_errors():
96
+ saved = config_type.model_validate(json.loads(saved_path.read_text()))
97
+ if config_digest(saved) != config_digest(config):
98
+ saved_dump = saved.model_dump(mode="json")
99
+ current_dump = config.model_dump(mode="json")
100
+ changed = sorted(
101
+ key
102
+ for key in set(saved_dump) | set(current_dump)
103
+ if saved_dump.get(key) != current_dump.get(key)
104
+ )
105
+ raise SystemExit(
106
+ f"--resume requires the exact config the run was started with - it "
107
+ f"differs in [{', '.join(changed)}]. Resumed rollouts would not be "
108
+ f"comparable; re-run with `uv run eval @ {saved_path} --resume`, or "
109
+ "start a fresh run"
110
+ )
111
+ if config.dry_run: # resolved + validated; write it to the output dir and exit
112
+ setup_logging("DEBUG" if config.verbose else "INFO")
113
+ logger.info("wrote config to %s", write_config(config, output_path(config)))
114
+ return
115
+ # Execution path: in-process by default; `--server` opts into the env-server worker pool
116
+ # (the path prime-rl trains through). The `--rich` dashboard reads live in-process run
117
+ # slots, so it's in-process only (`server + rich` is rejected at config validation).
118
+ # Always tee the run's logs to a file under the output dir (in-process and server mode).
119
+ log_file = str(output_path(config) / "logs" / "eval.log")
120
+ level = "DEBUG" if config.verbose else "INFO"
121
+ if config.rich:
122
+ setup_logging(level, log_file=log_file, console=False)
123
+ # drop stray stdlib records that bypass loguru (else they print over the UI)
124
+ logging.lastResort = None
125
+ else:
126
+ setup_logging(level, log_file=log_file, console=True)
127
+ # First Ctrl-C / SIGTERM warns and raises KeyboardInterrupt so a killed/timed-out eval still
128
+ # runs each rollout's `finally` (tears down containers/sandboxes) and any worker pool it
129
+ # spawned; further signals during that cleanup are swallowed so an impatient second Ctrl-C
130
+ # can't orphan those resources.
131
+ install_interrupt()
132
+
133
+ try:
134
+ if config.server: # opt-in: drive rollouts through the env-server worker pool
135
+ from verifiers.v1.cli.eval.runner import run_eval_server
136
+
137
+ episodes = asyncio.run(run_eval_server(config))
138
+ else: # in-process (default), with or without the live dashboard
139
+ env = vf.load_environment(config.env)
140
+ episodes = asyncio.run(run_eval(env, config))
141
+ except KeyboardInterrupt:
142
+ # Graceful cleanup has already run (each rollout's `finally`); partial results are on
143
+ # disk. Exit on the conventional Ctrl-C code without a traceback.
144
+ raise SystemExit(130)
145
+ if config.push and not config.rich:
146
+ from verifiers.v1.utils.platform import push_traces
147
+
148
+ push_traces(episodes, config)
149
+ if not config.rich: # --rich is the whole output; otherwise dump each trace as JSON
150
+ for episode in episodes:
151
+ for trace in episode.traces:
152
+ print(trace.model_dump_json(indent=2, exclude_none=True))
@@ -1,9 +1,8 @@
1
1
  """Resume an interrupted eval: reload its finished rollouts and run only the rest.
2
2
 
3
- `--resume <dir>` reloads the run's saved config verbatim (so it takes no other
4
- flags) and writes back into the same dir. `load` keeps the good saved rollouts and
5
- re-runs what's owed: missing rollouts (never written) and errored ones (dropped and
6
- redone).
3
+ `--resume` re-enters the run dir the resolved config points at and writes back into
4
+ it. `load` keeps the good saved rollouts and re-runs what's owed: missing rollouts
5
+ (never written) and errored ones (dropped and redone).
7
6
 
8
7
  A saved rollout is matched to a selected task by content: `task_key` hashes the
9
8
  task's wire data. Tasks with identical data are interchangeable, a task whose data
@@ -11,34 +10,18 @@ changed since the interrupted run re-runs, and nothing depends on `data.idx`.
11
10
  """
12
11
 
13
12
  import json
14
- import tomllib
15
13
  from collections import Counter, defaultdict
16
14
  from collections.abc import Callable
17
15
  from pathlib import Path
18
16
 
19
17
  from pydantic_core import from_json
20
18
 
21
- from verifiers.v1.cli.output import CONFIG_FILE, TRACES_FILE, sniff_episode
22
- from verifiers.v1.configs.cli.eval import EvalConfig
19
+ from verifiers.v1.cli.output import TRACES_FILE, sniff_episode
23
20
  from verifiers.v1.episode import Episode, WireEpisode
24
21
  from verifiers.v1.task import task_key
25
22
  from verifiers.v1.trace import WireTrace
26
23
 
27
24
 
28
- def load_resume_config(resume_dir: Path) -> EvalConfig:
29
- """Rebuild the run's `EvalConfig` from its saved `config.toml`, pointed back at its own
30
- output dir so the resumed rollouts append to the same `traces.jsonl`."""
31
- config_path = resume_dir / CONFIG_FILE
32
- if not config_path.exists():
33
- raise SystemExit(
34
- f"--resume: no config.toml in {resume_dir} - not an eval output dir"
35
- )
36
- config = EvalConfig.model_validate(tomllib.loads(config_path.read_text()))
37
- config.resume = resume_dir
38
- config.output_dir = resume_dir
39
- return config
40
-
41
-
42
25
  def load(
43
26
  resume_dir: Path,
44
27
  selected_keys: list[str],
@@ -44,7 +44,7 @@ async def run_eval(env: Env, config: EvalConfig) -> list[Episode]:
44
44
  plan = [(task, config.num_rollouts) for task in tasks]
45
45
  # Kept on-disk rollouts rejoin the run as finished episodes; only owed ones re-run.
46
46
  finished: list[Episode] = []
47
- if config.resume is not None:
47
+ if config.resume:
48
48
  keys = [task.hash for task in tasks]
49
49
  finished, owed = resume.load(out, keys, config.num_rollouts, env.complete)
50
50
  if not owed: # already complete - report it and exit successfully
@@ -73,7 +73,7 @@ async def run_eval(env: Env, config: EvalConfig) -> list[Episode]:
73
73
 
74
74
  async def on_complete(episode: Episode) -> None:
75
75
  for trace in episode.traces:
76
- trace.record_run(EvalRunInfo(id=config.uuid))
76
+ trace.record_run(EvalRunInfo(id=config.run.id, name=config.run.name))
77
77
  await append_episode(out, episode, write_lock)
78
78
 
79
79
  # Serving resources (shared tool servers, interception) come up once for the
@@ -136,7 +136,7 @@ async def run_eval_server(config: EvalConfig) -> list[Episode]:
136
136
  # Spawned processes inherit no logging — hand them the main process's setup so
137
137
  # their rollout logs land in the output dir.
138
138
  level = "DEBUG" if config.verbose else "INFO"
139
- log_file = str(output_path(config) / "eval.log")
139
+ log_file = str(output_path(config) / "logs" / "eval.log")
140
140
  mpctx = mp.get_context("spawn")
141
141
  address_queue: mp.Queue = mpctx.Queue()
142
142
  # Death pipe: serve_env self-terminates if this process dies abruptly — we keep
@@ -168,7 +168,7 @@ async def run_eval_server(config: EvalConfig) -> list[Episode]:
168
168
  ]
169
169
  out = output_path(config)
170
170
  finished: list[Episode] = []
171
- if config.resume is not None:
171
+ if config.resume:
172
172
  keys = [task.hash for task in tasks]
173
173
  finished, owed = resume.load(out, keys, config.num_rollouts)
174
174
  counts = distribute(keys, owed, config.num_rollouts)
@@ -206,7 +206,7 @@ async def run_eval_server(config: EvalConfig) -> list[Episode]:
206
206
  **payload,
207
207
  )
208
208
  for trace in episode.traces:
209
- trace.record_run(EvalRunInfo(id=config.uuid))
209
+ trace.record_run(EvalRunInfo(id=config.run.id, name=config.run.name))
210
210
  await append_episode(out, episode, write_lock)
211
211
  return [episode]
212
212
 
@@ -14,7 +14,7 @@ import sys
14
14
  from pydantic_config import cli
15
15
 
16
16
  import verifiers.v1 as vf
17
- from verifiers.v1.cli.output import output_path, write_config
17
+ from verifiers.v1.cli.output import TRACES_FILE, output_path, write_config
18
18
  from verifiers.v1.cli.resolve import (
19
19
  extract_id,
20
20
  narrow_config,
@@ -69,8 +69,20 @@ def main(argv: list[str] | None = None) -> None:
69
69
  "gepa optimizes one agent's prompt against per-trace rewards and can't "
70
70
  "drive a multi-agent interaction — only eval runs those"
71
71
  )
72
+ # A named run directory is never silently reused: any write into it — the dry-run
73
+ # config included, which would destroy the existing traces' config provenance —
74
+ # would overwrite the previous run.
75
+ traces_file = output_path(config) / TRACES_FILE
76
+ if traces_file.exists() and traces_file.stat().st_size > 0:
77
+ raise SystemExit(
78
+ f"run directory {output_path(config)} already contains results - "
79
+ "pick another --run.name or delete it"
80
+ )
81
+
72
82
  if config.dry_run: # resolved + validated; write it to the output dir and exit
73
- logger.info("wrote config to %s", write_config(config, output_path(config)))
83
+ logger.info(
84
+ "wrote config to %s", write_config(config, output_path(config), "gepa.json")
85
+ )
74
86
  return
75
87
 
76
88
  # First Ctrl-C / SIGTERM warns and raises KeyboardInterrupt so a killed/timed-out run still
@@ -11,63 +11,75 @@ before the episode atom (one bare trace per line) are still readable:
11
11
  """
12
12
 
13
13
  import asyncio
14
+ import hashlib
14
15
  import json
15
16
  from functools import cache
16
17
  from pathlib import Path
17
18
 
18
- import tomli_w
19
19
  from pydantic import BaseModel, TypeAdapter
20
20
 
21
21
  from verifiers.v1.configs.cli.eval import EvalConfig
22
22
  from verifiers.v1.episode import Episode, WireEpisode
23
23
  from verifiers.v1.trace import Trace
24
24
  from verifiers.v1.utils.aio import run_shielded
25
- from verifiers.v1.utils.install import env_name
26
25
 
27
26
  TRACES_FILE = "traces.jsonl"
28
27
  """Filename a run's rollout episodes are written to (one JSON episode per line)."""
29
28
 
30
- CONFIG_FILE = "config.toml"
31
- """Filename a run's resolved config is written to (re-runnable via `@ config.toml`)."""
29
+ CONFIG_DIR = "configs"
30
+ """Directory inside a run dir holding its resolved config (one `<cli>.json`, re-runnable
31
+ via `@ <run-dir>/configs/<cli>.json`). Resolved configs are JSON, not TOML: JSON keeps
32
+ nulls, so explicit None settings round-trip exactly on re-parse."""
33
+
34
+
35
+ def config_digest(config: BaseModel) -> str:
36
+ """Canonical hash of a resolved config's full model dump (nulls included)."""
37
+ dump = config.model_dump(mode="json")
38
+ canonical = json.dumps(dump, sort_keys=True, separators=(",", ":"))
39
+ return hashlib.sha256(canonical.encode()).hexdigest()
40
+
41
+
42
+ def saved_config_path(run_dir: Path) -> Path | None:
43
+ """The run's saved resolved config (`configs/<cli>.json`), None if absent."""
44
+ candidates = (
45
+ sorted((run_dir / CONFIG_DIR).glob("*.json"))
46
+ if (run_dir / CONFIG_DIR).is_dir()
47
+ else []
48
+ )
49
+ return candidates[0] if candidates else None
50
+
32
51
 
33
52
  # Compiling an adapter is the expensive part; run output reuses only a few model classes.
34
53
  type_adapter = cache(TypeAdapter)
35
54
 
36
55
 
37
56
  def output_path(config: EvalConfig) -> Path:
38
- """Where this run writes: `outputs/<env>--<model>--<harness>/<uuid>` (or the explicit
39
- `--output-dir`). The per-run `uuid` leaf means runs never overwrite each other."""
40
- if config.output_dir is not None:
41
- return config.output_dir
42
- taskset = config.env.taskset
43
- env = taskset.name if taskset.id else "no-taskset"
44
- if taskset.id and config.env.id:
45
- # Same compounding as `EnvConfig.env_id`: a `best-of-n+gsm8k` run must
46
- # not share a parent dir with a plain `gsm8k` one.
47
- env = f"{env_name(config.env.id)}+{env}"
48
- # Every seat's resolved harness, distinct, in role order.
49
- harness = "+".join(
50
- dict.fromkeys(h.name for h in config.env.agent_harnesses().values())
51
- )
52
- name = f"{env}--{config.model.replace('/', '--')}--{harness or 'default'}"
53
- return Path("outputs") / name / config.uuid
54
-
55
-
56
- def write_config(config: BaseModel, results_dir: Path) -> Path:
57
- """Write the run's resolved `config.toml` (re-readable via `@ config.toml`); return its
58
- path. mode="json" makes values TOML-friendly (Path -> str, etc.); exclude_none drops the
59
- nulls TOML can't represent."""
60
- results_dir.mkdir(parents=True, exist_ok=True)
61
- toml = tomli_w.dumps(config.model_dump(mode="json", exclude_none=True))
62
- config_path = results_dir / CONFIG_FILE
63
- config_path.write_text(toml)
57
+ """Where this run writes: `output_dir / run.dir` — the same grouping convention as
58
+ training. The run directory defaults to the auto-generated run name
59
+ (`<env>--<model>--<harness>--<short-id>`)."""
60
+ assert config.run.dir is not None
61
+ return config.output_dir / config.run.dir
62
+
63
+
64
+ def write_config(
65
+ config: BaseModel, results_dir: Path, filename: str = "eval.json"
66
+ ) -> Path:
67
+ """Write the run's resolved config to `configs/<filename>` (re-readable via
68
+ `@ <path>`); return its path. The full model dump is written, nulls included, so the
69
+ file round-trips exactly."""
70
+ config_dir = results_dir / CONFIG_DIR
71
+ config_dir.mkdir(parents=True, exist_ok=True)
72
+ config_path = config_dir / filename
73
+ config_path.write_text(json.dumps(config.model_dump(mode="json"), indent=2))
64
74
  return config_path
65
75
 
66
76
 
67
- def save_config(config: BaseModel, results_dir: Path) -> None:
68
- """Set up the run's output dir: write `config.toml` and start a fresh (empty)
77
+ def save_config(
78
+ config: BaseModel, results_dir: Path, filename: str = "eval.json"
79
+ ) -> None:
80
+ """Set up the run's output dir: write the resolved config and start a fresh (empty)
69
81
  `traces.jsonl`. Call once up front, before episodes start landing."""
70
- write_config(config, results_dir)
82
+ write_config(config, results_dir, filename)
71
83
  (results_dir / TRACES_FILE).write_text(
72
84
  ""
73
85
  ) # fresh; appended to as rollouts complete
@@ -10,10 +10,10 @@ cross-trace `score()` can't run offline.
10
10
 
11
11
  import asyncio
12
12
  import contextlib
13
+ import json
13
14
  import logging
14
15
  import sys
15
16
  import time
16
- import tomllib
17
17
  from pathlib import Path
18
18
 
19
19
  from pydantic_config import cli
@@ -21,10 +21,10 @@ from pydantic_config import cli
21
21
  import verifiers.v1 as vf
22
22
  from verifiers.v1.cli.dashboard.replay import ReplayProgress, replay_dashboard
23
23
  from verifiers.v1.cli.output import (
24
- CONFIG_FILE,
25
24
  append_trace,
26
25
  read_episodes,
27
26
  save_config,
27
+ saved_config_path,
28
28
  write_config,
29
29
  )
30
30
  from verifiers.v1.cli.resolve import narrow_taskset_config
@@ -47,7 +47,7 @@ USAGE = (
47
47
  def _narrow(config_path: Path) -> type[ReplayConfig]:
48
48
  """Narrow replay config to the saved taskset's config type. The source may be
49
49
  an eval run (taskset on the [env] block) or an earlier replay (root taskset)."""
50
- data = tomllib.loads(config_path.read_text())
50
+ data = json.loads(config_path.read_text())
51
51
  taskset = data.get("taskset") or (data.get("env") or {}).get("taskset") or {}
52
52
  taskset_id = taskset.get("id")
53
53
  return narrow_taskset_config(ReplayConfig, taskset_id)
@@ -63,7 +63,10 @@ async def run_replay(config: ReplayConfig, source: Path, out: Path) -> list[Trac
63
63
  # Refuse multi-agent up front, from the SOURCE run's saved config — the replay
64
64
  # layer's taskset is overridable and must not decide what the run was.
65
65
  # Everything below may assume plain single-agent episodes.
66
- saved = tomllib.loads((source / CONFIG_FILE).read_text())
66
+ source_config = saved_config_path(source)
67
+ if source_config is None:
68
+ raise SystemExit(f"no saved config under {source} - not a run dir")
69
+ saved = json.loads(source_config.read_text())
67
70
  saved_env = saved.get("env") or {}
68
71
  saved_taskset = saved.get("taskset") or saved_env.get("taskset") or {}
69
72
  env_cls = vf.environment_class(
@@ -126,7 +129,7 @@ async def run_replay(config: ReplayConfig, source: Path, out: Path) -> list[Trac
126
129
  for _ in range(config.num_rescores)
127
130
  ]
128
131
 
129
- save_config(config, out)
132
+ save_config(config, out, "replay.json")
130
133
  logger.info(
131
134
  "replay: re-scoring %d trace(s) x%d from %s -> %s",
132
135
  len(traces),
@@ -201,15 +204,15 @@ def main(argv: list[str] | None = None) -> None:
201
204
  cli(ReplayConfig) # full, typed pydantic-config option help
202
205
  return
203
206
  source = Path(argv.pop(0))
204
- config_path = source / CONFIG_FILE
205
- if not config_path.exists():
206
- raise SystemExit(f"{USAGE}\nno config.toml in {source}")
207
+ config_path = saved_config_path(source)
208
+ if config_path is None:
209
+ raise SystemExit(f"{USAGE}\nno saved config under {source} - not a run dir")
207
210
 
208
211
  layered = ["@", str(config_path), *argv]
209
212
  config_type = _narrow(config_path)
210
213
  sys.argv = [sys.argv[0], *layered]
211
214
  config = cli(config_type)
212
- source_out = tomllib.loads(config_path.read_text()).get("output_dir")
215
+ source_out = json.loads(config_path.read_text()).get("output_dir")
213
216
  # Clear the source run's output_dir unless the user overrode it.
214
217
  if config.output_dir is None or str(config.output_dir) == str(source_out):
215
218
  config = config.model_copy(update={"output_dir": None})
@@ -222,10 +225,10 @@ def main(argv: list[str] | None = None) -> None:
222
225
  level = "DEBUG" if config.verbose else "INFO"
223
226
  if config.dry_run:
224
227
  setup_logging(level)
225
- logger.info("wrote config to %s", write_config(config, out))
228
+ logger.info("wrote config to %s", write_config(config, out, "replay.json"))
226
229
  return
227
230
 
228
- log_file = str(out / "replay.log")
231
+ log_file = str(out / "logs" / "replay.log")
229
232
  if config.rich:
230
233
  setup_logging(level, log_file=log_file, console=False)
231
234
  logging.lastResort = None
@@ -0,0 +1,15 @@
1
+ """Resume primitives shared by eval-like CLIs."""
2
+
3
+
4
+ def distribute(
5
+ selected_keys: list[str], owed: dict[str, int], num_results: int
6
+ ) -> list[int]:
7
+ """Spread each key's owed results over its selected instances, in order."""
8
+ remaining = dict(owed)
9
+ counts: list[int] = []
10
+ for key in selected_keys:
11
+ take = min(num_results, remaining.get(key, 0))
12
+ if take:
13
+ remaining[key] -= take
14
+ counts.append(take)
15
+ return counts