verifiers 0.2.2.dev16__tar.gz → 0.2.2.dev17__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 (406) hide show
  1. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/PKG-INFO +1 -1
  2. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/v1/test_configs.py +1 -1
  3. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/cli/dashboard/eval.py +2 -4
  4. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/cli/eval/resume.py +61 -28
  5. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/cli/eval/runner.py +62 -46
  6. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/cli/gepa.py +1 -1
  7. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/cli/output.py +2 -2
  8. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/configs/env.py +2 -4
  9. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/env.py +10 -13
  10. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/legacy.py +13 -2
  11. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/loaders.py +3 -5
  12. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/push.py +1 -3
  13. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/serve/client.py +16 -4
  14. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/serve/server.py +31 -33
  15. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/serve/types.py +18 -3
  16. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/taskset.py +6 -1
  17. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/tasksets/harbor/taskset.py +2 -2
  18. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/.gitignore +0 -0
  19. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/LICENSE +0 -0
  20. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/README.md +0 -0
  21. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/pyproject.toml +0 -0
  22. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/__init__.py +0 -0
  23. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/conftest.py +0 -0
  24. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_browser_env.py +0 -0
  25. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_build_script.py +0 -0
  26. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_cli_agent_env.py +0 -0
  27. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_client_auth_errors.py +0 -0
  28. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_client_config.py +0 -0
  29. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_client_multimodal_types.py +0 -0
  30. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_composable_env.py +0 -0
  31. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_context_token_metrics.py +0 -0
  32. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_decorator_ranks.py +0 -0
  33. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_endpoint_registry.py +0 -0
  34. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_env_group.py +0 -0
  35. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_env_server.py +0 -0
  36. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_environment.py +0 -0
  37. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_environment_extra.py +0 -0
  38. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_error_chain.py +0 -0
  39. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_eval_display.py +0 -0
  40. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_eval_utils.py +0 -0
  41. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_gepa_cli.py +0 -0
  42. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_gepa_utils.py +0 -0
  43. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_gym_env.py +0 -0
  44. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_harbor_env_mcp.py +0 -0
  45. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_imports.py +0 -0
  46. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_init_script.py +0 -0
  47. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_install_utils.py +0 -0
  48. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_interception_utils.py +0 -0
  49. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_logging.py +0 -0
  50. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_math_rubric.py +0 -0
  51. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_maybe_think_parser.py +0 -0
  52. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_message_utils.py +0 -0
  53. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_message_utils_multimodal.py +0 -0
  54. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_multiturn_env.py +0 -0
  55. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_nemorl_client.py +0 -0
  56. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_openai_chat_completions_token_client.py +0 -0
  57. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_openai_responses_client.py +0 -0
  58. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_opencode_rlm_env.py +0 -0
  59. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_openenv_client.py +0 -0
  60. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_parser.py +0 -0
  61. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_path_utils.py +0 -0
  62. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_per_turn_timing.py +0 -0
  63. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_pricing_utils.py +0 -0
  64. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_prime_plugin.py +0 -0
  65. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_renderer_client.py +0 -0
  66. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_renderer_e2e.py +0 -0
  67. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_rlm_composable_env.py +0 -0
  68. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_rubric.py +0 -0
  69. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_rubric_group.py +0 -0
  70. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_sandbox_debug_env.py +0 -0
  71. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_sandbox_env.py +0 -0
  72. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_sandbox_mixin.py +0 -0
  73. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_save_utils.py +0 -0
  74. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_setup_script.py +0 -0
  75. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_singleturn_env.py +0 -0
  76. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_stateful_tool_env.py +0 -0
  77. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_think_parser.py +0 -0
  78. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_tool_env.py +0 -0
  79. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_tool_utils.py +0 -0
  80. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_trajectory_processing.py +0 -0
  81. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_tui_info_formatting.py +0 -0
  82. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_types.py +0 -0
  83. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/test_xml_parser.py +0 -0
  84. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/v1/conftest.py +0 -0
  85. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  86. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/v1/fixtures/duet_v1.py +0 -0
  87. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  88. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/v1/fixtures/echo_multi_v0.py +0 -0
  89. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  90. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  91. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/v1/fixtures/echo_v0.py +0 -0
  92. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/v1/fixtures/echo_v1.py +0 -0
  93. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/v1/fixtures/pyproject.toml +0 -0
  94. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  95. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/v1/test_color_codeword_tasks.py +0 -0
  96. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/v1/test_e2e.py +0 -0
  97. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/v1/test_envs.py +0 -0
  98. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/v1/test_graph.py +0 -0
  99. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/v1/test_judges.py +0 -0
  100. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/v1/test_legacy.py +0 -0
  101. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/v1/test_scoring.py +0 -0
  102. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/v1/test_taskset.py +0 -0
  103. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/tests/v1/test_trace.py +0 -0
  104. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/__init__.py +0 -0
  105. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/cli/__init__.py +0 -0
  106. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/cli/commands/__init__.py +0 -0
  107. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/cli/commands/build.py +0 -0
  108. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/cli/commands/eval.py +0 -0
  109. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/cli/commands/gepa.py +0 -0
  110. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/cli/commands/init.py +0 -0
  111. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/cli/commands/install.py +0 -0
  112. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/cli/commands/setup.py +0 -0
  113. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/cli/plugins/__init__.py +0 -0
  114. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/cli/plugins/prime.py +0 -0
  115. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/cli/tui.py +0 -0
  116. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/clients/__init__.py +0 -0
  117. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/clients/anthropic_messages_client.py +0 -0
  118. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/clients/client.py +0 -0
  119. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
  120. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/clients/openai_chat_completions_client.py +0 -0
  121. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
  122. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/clients/openai_completions_client.py +0 -0
  123. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/clients/openai_responses_client.py +0 -0
  124. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/clients/renderer_client.py +0 -0
  125. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/decorators.py +0 -0
  126. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/__init__.py +0 -0
  127. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/env_group.py +0 -0
  128. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/environment.py +0 -0
  129. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/README.md +0 -0
  130. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/__init__.py +0 -0
  131. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/cli_agent_env.py +0 -0
  132. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/README.md +0 -0
  133. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/__init__.py +0 -0
  134. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/_filter.py +0 -0
  135. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/composable_env.py +0 -0
  136. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/harness.py +0 -0
  137. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
  138. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  139. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
  140. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
  141. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
  142. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
  143. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
  144. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/task.py +0 -0
  145. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
  146. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  147. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  148. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  149. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  150. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  151. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  152. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  153. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  154. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  155. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
  156. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  157. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  158. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  159. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  160. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  161. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  162. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  163. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  164. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  165. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  166. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  167. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  168. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  169. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  170. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  171. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  172. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  173. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  174. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  175. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  176. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  177. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  178. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  179. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/gym_env.py +0 -0
  180. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
  181. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/harbor_env/env.py +0 -0
  182. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
  183. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/mcp_env.py +0 -0
  184. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/opencode_env.py +0 -0
  185. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
  186. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
  187. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
  188. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/utils/__init__.py +0 -0
  189. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/utils/file_locks.py +0 -0
  190. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
  191. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/integrations/README.md +0 -0
  192. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/integrations/__init__.py +0 -0
  193. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/integrations/browser_env/README.md +0 -0
  194. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
  195. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
  196. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
  197. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
  198. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  199. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  200. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/integrations/openenv_env.py +0 -0
  201. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
  202. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/integrations/textarena_env.py +0 -0
  203. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/multiturn_env.py +0 -0
  204. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/python_env.py +0 -0
  205. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/sandbox_env.py +0 -0
  206. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/singleturn_env.py +0 -0
  207. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/stateful_tool_env.py +0 -0
  208. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/envs/tool_env.py +0 -0
  209. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/errors.py +0 -0
  210. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/gepa/__init__.py +0 -0
  211. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/gepa/adapter.py +0 -0
  212. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/gepa/config.py +0 -0
  213. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/gepa/display.py +0 -0
  214. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/gepa/gepa_utils.py +0 -0
  215. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/parsers/__init__.py +0 -0
  216. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/parsers/maybe_think_parser.py +0 -0
  217. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/parsers/parser.py +0 -0
  218. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/parsers/think_parser.py +0 -0
  219. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/parsers/xml_parser.py +0 -0
  220. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/rubrics/__init__.py +0 -0
  221. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
  222. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/rubrics/judge_rubric.py +0 -0
  223. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/rubrics/math_rubric.py +0 -0
  224. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/rubrics/rubric.py +0 -0
  225. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/rubrics/rubric_group.py +0 -0
  226. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/scripts/__init__.py +0 -0
  227. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/scripts/build.py +0 -0
  228. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/scripts/eval.py +0 -0
  229. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/scripts/gepa.py +0 -0
  230. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/scripts/init.py +0 -0
  231. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/scripts/install.py +0 -0
  232. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/scripts/setup.py +0 -0
  233. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/scripts/tui.py +0 -0
  234. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/serve/__init__.py +0 -0
  235. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/serve/client/env_client.py +0 -0
  236. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/serve/client/zmq_env_client.py +0 -0
  237. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/serve/server/__init__.py +0 -0
  238. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/serve/server/env_router.py +0 -0
  239. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/serve/server/env_server.py +0 -0
  240. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/serve/server/env_worker.py +0 -0
  241. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/serve/server/zmq_env_server.py +0 -0
  242. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/serve/types.py +0 -0
  243. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/types.py +0 -0
  244. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/utils/__init__.py +0 -0
  245. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/utils/async_utils.py +0 -0
  246. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/utils/client_utils.py +0 -0
  247. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/utils/config_utils.py +0 -0
  248. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/utils/data_utils.py +0 -0
  249. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/utils/display_utils.py +0 -0
  250. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/utils/env_config_utils.py +0 -0
  251. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/utils/env_utils.py +0 -0
  252. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/utils/error_utils.py +0 -0
  253. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/utils/eval_display.py +0 -0
  254. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/utils/eval_utils.py +0 -0
  255. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/utils/heartbeat.py +0 -0
  256. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/utils/import_utils.py +0 -0
  257. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/utils/install_utils.py +0 -0
  258. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/utils/interception_utils.py +0 -0
  259. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/utils/logging_utils.py +0 -0
  260. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/utils/message_utils.py +0 -0
  261. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/utils/metric_utils.py +0 -0
  262. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/utils/path_utils.py +0 -0
  263. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/utils/pricing_utils.py +0 -0
  264. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/utils/process_utils.py +0 -0
  265. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/utils/response_utils.py +0 -0
  266. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/utils/save_utils.py +0 -0
  267. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/utils/serve_utils.py +0 -0
  268. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/utils/thread_utils.py +0 -0
  269. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/utils/threaded_sandbox_client.py +0 -0
  270. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/utils/tool_utils.py +0 -0
  271. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/utils/usage_utils.py +0 -0
  272. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/utils/version_utils.py +0 -0
  273. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/__init__.py +0 -0
  274. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/agent.py +0 -0
  275. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/cli/__init__.py +0 -0
  276. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  277. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/cli/dashboard/base.py +0 -0
  278. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/cli/dashboard/replay.py +0 -0
  279. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/cli/dashboard/validate.py +0 -0
  280. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/cli/debug.py +0 -0
  281. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/cli/eval/__init__.py +0 -0
  282. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/cli/eval/main.py +0 -0
  283. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/cli/init.py +0 -0
  284. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/cli/replay.py +0 -0
  285. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/cli/resolve.py +0 -0
  286. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/cli/serve.py +0 -0
  287. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/cli/validate.py +0 -0
  288. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/clients/__init__.py +0 -0
  289. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/clients/client.py +0 -0
  290. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/clients/config.py +0 -0
  291. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/clients/eval.py +0 -0
  292. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/clients/train.py +0 -0
  293. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/configs/__init__.py +0 -0
  294. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/configs/debug.py +0 -0
  295. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/configs/eval.py +0 -0
  296. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/configs/init.py +0 -0
  297. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/configs/replay.py +0 -0
  298. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/configs/serve.py +0 -0
  299. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/configs/validate.py +0 -0
  300. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/decorators.py +0 -0
  301. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/dialects/__init__.py +0 -0
  302. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/dialects/anthropic.py +0 -0
  303. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/dialects/base.py +0 -0
  304. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/dialects/chat.py +0 -0
  305. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/dialects/responses.py +0 -0
  306. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/envs/__init__.py +0 -0
  307. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
  308. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/envs/agentic_judge/env.py +0 -0
  309. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  310. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/envs/best_of_n/env.py +0 -0
  311. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  312. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/envs/single_agent/env.py +0 -0
  313. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/episode.py +0 -0
  314. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/errors.py +0 -0
  315. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/gepa/__init__.py +0 -0
  316. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/gepa/adapter.py +0 -0
  317. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/gepa/config.py +0 -0
  318. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/gepa/dataset.py +0 -0
  319. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/gepa/reflection.py +0 -0
  320. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/gepa/runner.py +0 -0
  321. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/graph.py +0 -0
  322. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/harness.py +0 -0
  323. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/__init__.py +0 -0
  324. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  325. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/bash/harness.py +0 -0
  326. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/bash/program.py +0 -0
  327. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  328. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
  329. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  330. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/codex/harness.py +0 -0
  331. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  332. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  333. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  334. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  335. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  336. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/null/__init__.py +0 -0
  337. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/null/harness.py +0 -0
  338. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/null/program.py +0 -0
  339. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  340. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/pi/harness.py +0 -0
  341. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/pool/__init__.py +0 -0
  342. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/pool/harness.py +0 -0
  343. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  344. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  345. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  346. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  347. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  348. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/interception/__init__.py +0 -0
  349. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/interception/base.py +0 -0
  350. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/interception/pool.py +0 -0
  351. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/interception/server.py +0 -0
  352. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  353. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/interception/tunnel/base.py +0 -0
  354. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/interception/tunnel/custom.py +0 -0
  355. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/interception/tunnel/prime.py +0 -0
  356. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/judge.py +0 -0
  357. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/judges/__init__.py +0 -0
  358. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/judges/reference.py +0 -0
  359. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/judges/reference.txt +0 -0
  360. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/judges/rubric.py +0 -0
  361. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/judges/rubric.txt +0 -0
  362. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/mcp/__init__.py +0 -0
  363. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/mcp/launch.py +0 -0
  364. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/mcp/server.py +0 -0
  365. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/mcp/toolset.py +0 -0
  366. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/mcp/user.py +0 -0
  367. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/retries.py +0 -0
  368. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/rollout.py +0 -0
  369. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/runtimes/__init__.py +0 -0
  370. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/runtimes/base.py +0 -0
  371. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/runtimes/docker/__init__.py +0 -0
  372. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/runtimes/docker/egress.py +0 -0
  373. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/runtimes/limiters.py +0 -0
  374. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/runtimes/modal.py +0 -0
  375. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/runtimes/prime.py +0 -0
  376. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/runtimes/subprocess.py +0 -0
  377. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/scoring.py +0 -0
  378. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/serve/__init__.py +0 -0
  379. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/serve/pool.py +0 -0
  380. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/session.py +0 -0
  381. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/state.py +0 -0
  382. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/task.py +0 -0
  383. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/tasksets/__init__.py +0 -0
  384. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  385. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  386. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  387. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  388. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  389. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  390. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  391. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  392. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/trace.py +0 -0
  393. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/types.py +0 -0
  394. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/utils/__init__.py +0 -0
  395. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/utils/aio.py +0 -0
  396. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/utils/compile.py +0 -0
  397. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/utils/format.py +0 -0
  398. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/utils/generic.py +0 -0
  399. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/utils/git.py +0 -0
  400. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/utils/image.py +0 -0
  401. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/utils/install.py +0 -0
  402. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/utils/interrupt.py +0 -0
  403. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/utils/logging.py +0 -0
  404. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/utils/memory.py +0 -0
  405. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/utils/sampling.py +0 -0
  406. {verifiers-0.2.2.dev16 → verifiers-0.2.2.dev17}/verifiers/v1/utils/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: verifiers
3
- Version: 0.2.2.dev16
3
+ Version: 0.2.2.dev17
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
@@ -24,4 +24,4 @@ CONFIGS = sorted(
24
24
  def test_eval_config_parses(path: Path) -> None:
25
25
  config = EvalConfig.model_validate(tomllib.load(path.open("rb")))
26
26
  # resolved to a v1 taskset or a v0 env id
27
- assert (config.env.taskset is not None and config.env.taskset.id) or config.id
27
+ assert config.env.taskset.id or config.id
@@ -232,7 +232,7 @@ def Overview(config: EvalConfig) -> Table:
232
232
  grid.add_column()
233
233
  seats = config.env.agent_harnesses()
234
234
  taskset = config.env.taskset
235
- env_label = taskset.name if taskset is not None else "no taskset"
235
+ env_label = taskset.name if taskset.id else "no taskset"
236
236
  if config.env.id:
237
237
  env_label = f"{env_name(config.env.id)}+{env_label}"
238
238
  # One seat story when every seat resolves the same way (the common case); one
@@ -254,9 +254,7 @@ def Overview(config: EvalConfig) -> Table:
254
254
  # value (or our `[...]`/`{...}` delimiters) can carry Rich markup that would otherwise be
255
255
  # parsed as styling and dropped. `id` is in the `env` row; harness `runtime.type` too (hidden
256
256
  # here), but only for the harness — `taskset.task.tools.runtime.type` has no other display.
257
- if taskset is not None and (
258
- taskset_over := overrides(taskset, skip=frozenset({"id"}))
259
- ):
257
+ if taskset_over := overrides(taskset, skip=frozenset({"id"})):
260
258
  grid.add_row("taskset", escape(" · ".join(taskset_over)))
261
259
  for role, h in seats.items():
262
260
  if harness_over := overrides(h, skip=frozenset({"id", "runtime.type"})):
@@ -4,13 +4,20 @@
4
4
  flags) and writes back into the same dir. `load` keeps the good saved rollouts and
5
5
  re-runs what's owed: missing rollouts (never written) and errored ones (dropped and
6
6
  redone).
7
+
8
+ A saved rollout is matched to a selected task by content: `task_key` hashes the
9
+ task's wire data. Tasks with identical data are interchangeable, a task whose data
10
+ changed since the interrupted run re-runs, and nothing depends on `data.idx`. The
11
+ legacy (v0) bridge still matches by row index (`key_of`).
7
12
  """
8
13
 
14
+ import hashlib
9
15
  import json
10
16
  import tomllib
11
- from collections import defaultdict
12
- from collections.abc import Callable
17
+ from collections import Counter, defaultdict
18
+ from collections.abc import Callable, Hashable, Mapping
13
19
  from pathlib import Path
20
+ from typing import TypeVar
14
21
 
15
22
  from pydantic_core import from_json
16
23
 
@@ -19,6 +26,30 @@ from verifiers.v1.configs.eval import EvalConfig
19
26
  from verifiers.v1.episode import Episode, WireEpisode
20
27
  from verifiers.v1.trace import WireTrace
21
28
 
29
+ K = TypeVar("K", bound=Hashable)
30
+
31
+
32
+ def task_key(data: Mapping) -> str:
33
+ """Content identity of one task's wire data — an `exclude_none` dump, the shape
34
+ saved rows already have on disk. `sort_keys` so field order can't split identity."""
35
+ return hashlib.sha256(json.dumps(data, sort_keys=True).encode()).hexdigest()
36
+
37
+
38
+ def distribute(
39
+ selected_keys: list[K], owed: dict[K, int], num_rollouts: int
40
+ ) -> list[int]:
41
+ """Spread each key's owed rollouts over its selection instances, in order —
42
+ content-identical tasks are interchangeable, so any instance can absorb the
43
+ debt (capped at `num_rollouts` each). Returns one count per selection."""
44
+ remaining = dict(owed)
45
+ counts: list[int] = []
46
+ for key in selected_keys:
47
+ take = min(num_rollouts, remaining.get(key, 0))
48
+ if take:
49
+ remaining[key] -= take
50
+ counts.append(take)
51
+ return counts
52
+
22
53
 
23
54
  def split_resume(argv: list[str]) -> tuple[Path | None, list[str]]:
24
55
  """Pull `--resume <dir>` / `--resume=<dir>` out of argv, returning (dir, the other args).
@@ -51,25 +82,27 @@ def load_resume_config(resume_dir: Path) -> EvalConfig:
51
82
 
52
83
  def load(
53
84
  resume_dir: Path,
54
- selected_idxs: list[int],
85
+ selected_keys: list[K],
55
86
  num_rollouts: int,
56
87
  complete: Callable[[Episode], bool] | None = None,
57
88
  *,
58
89
  whole_task: bool = False,
59
- ) -> tuple[list[Episode], dict[int, int]]:
60
- """Load the good saved rollouts as finished episodes and diff them against the
61
- run's target: returns (kept episodes, rollouts owed per task idx). A rollout is
62
- kept or redone as a unit the episode so a multi-trace rollout interrupted
63
- mid-write is simply owed again. `complete` is the environment's keep-verdict
64
- (`Env.complete`); without it (the server path) the default is
65
- `episode.ok`, so an errored rollout is dropped and re-run. `whole_task` redoes
66
- a partially-kept task as a unit — the legacy group-scored path, where
67
- `run_group` always serves the full n. Rewrites `traces.jsonl` to just the kept
68
- rows via a temp file + atomic rename, so an interrupted resume can't corrupt
69
- the prior results; the resumed rollouts then append. Pre-episode files (one
70
- bare trace per line) load each trace as a single-trace episode."""
90
+ key_of: Callable[[Mapping], K] | None = None,
91
+ ) -> tuple[list[Episode], dict[K, int]]:
92
+ """Load the good saved rollouts and diff them against the run's target: returns
93
+ (kept episodes, rollouts owed per task key). `selected_keys` is one key per
94
+ selected task (duplicates allowed a key selected k times is owed up to
95
+ `k * num_rollouts`; spread back over the tasks with `distribute`). `key_of` maps
96
+ a saved row's task data to its key (default `task_key`; the legacy bridge uses
97
+ row indices). `complete` is the keep-verdict (default `episode.ok`); `whole_task`
98
+ redoes a partially-kept task whole (legacy group scoring). Rewrites
99
+ `traces.jsonl` to the kept rows via a temp file + atomic rename; a torn or
100
+ malformed row is owed again, never a crash."""
71
101
  path = resume_dir / TRACES_FILE
72
- selected = set(selected_idxs)
102
+ targets = {
103
+ key: count * num_rollouts for key, count in Counter(selected_keys).items()
104
+ }
105
+ keyed = key_of if key_of is not None else task_key
73
106
 
74
107
  def parse(row: dict) -> Episode:
75
108
  if sniff_episode(row):
@@ -77,7 +110,7 @@ def load(
77
110
  return Episode.of(WireTrace.model_validate(row))
78
111
 
79
112
  verdict = complete if complete is not None else (lambda episode: episode.ok)
80
- good: dict[int, list[tuple[bytes, Episode]]] = defaultdict(list)
113
+ good: dict[K, list[tuple[bytes, Episode]]] = defaultdict(list)
81
114
  if path.exists():
82
115
  with path.open("rb") as results:
83
116
  for line in results:
@@ -89,16 +122,16 @@ def load(
89
122
  except ValueError:
90
123
  row = json.loads(line)
91
124
  # The task rides each trace; a traceless record (a failure
92
- # before any trace minted) has no idx and is owed again.
125
+ # before any trace minted) has no task and is owed again.
93
126
  if sniff_episode(row):
94
- idx = row["traces"][0]["task"]["data"]["idx"]
127
+ key = keyed(row["traces"][0]["task"]["data"])
95
128
  else:
96
- idx = row["task"]["data"]["idx"]
129
+ key = keyed(row["task"]["data"])
97
130
  except (ValueError, KeyError, IndexError, TypeError):
98
131
  # A torn final line (the run died mid-write) or a foreign shape
99
132
  # is not a keepable rollout — it's owed again, never a crash.
100
133
  continue
101
- if idx not in selected or len(good[idx]) >= num_rollouts:
134
+ if key not in targets or len(good[key]) >= targets[key]:
102
135
  continue
103
136
  try:
104
137
  episode = parse(row)
@@ -106,20 +139,20 @@ def load(
106
139
  continue
107
140
  except Exception: # malformed row: redo it
108
141
  continue
109
- good[idx].append(
142
+ good[key].append(
110
143
  (line if line.endswith(b"\n") else line + b"\n", episode)
111
144
  )
112
145
  keep: list[bytes] = []
113
146
  episodes: list[Episode] = []
114
- owed: dict[int, int] = {}
115
- for idx in selected_idxs:
116
- rows = good.get(idx, [])
117
- if whole_task and len(rows) < num_rollouts:
147
+ owed: dict[K, int] = {}
148
+ for key, target in targets.items():
149
+ rows = good.get(key, [])
150
+ if whole_task and len(rows) < target:
118
151
  rows = [] # a partial unit redoes whole — its kept rows are dropped
119
152
  keep.extend(line for line, _ in rows)
120
153
  episodes.extend(episode for _, episode in rows)
121
- if missing := num_rollouts - len(rows):
122
- owed[idx] = missing
154
+ if missing := target - len(rows):
155
+ owed[key] = missing
123
156
  tmp = path.with_suffix(".jsonl.tmp")
124
157
  tmp.write_bytes(b"".join(keep))
125
158
  tmp.replace(path)
@@ -32,21 +32,25 @@ async def run_eval(env: Env, config: EvalConfig) -> list[Episode]:
32
32
  asyncio.Semaphore(config.max_concurrent) if config.max_concurrent else None
33
33
  )
34
34
  out = output_path(config)
35
- owed: dict[str, int] | None = None
35
+ # One (task, rollouts-to-run) pair per selected task; resume shrinks the counts.
36
+ plan = [(task, config.num_rollouts) for task in tasks]
36
37
  # Kept on-disk rollouts rejoin the run as finished episodes; only owed ones re-run.
37
38
  finished: list[Episode] = []
38
39
  if config.resume is not None:
39
- finished, owed = resume.load(
40
- out, [t.data.idx for t in tasks], config.num_rollouts, env.complete
41
- )
40
+ keys = [
41
+ resume.task_key(t.data.model_dump(mode="json", exclude_none=True))
42
+ for t in tasks
43
+ ]
44
+ finished, owed = resume.load(out, keys, config.num_rollouts, env.complete)
42
45
  if not owed: # already complete - report it and exit successfully
43
46
  print(resume.nothing_to_resume_msg(out, len(tasks), config.num_rollouts))
44
47
  raise SystemExit(0)
45
- tasks = [task for task in tasks if owed.get(task.data.idx)]
48
+ counts = resume.distribute(keys, owed, config.num_rollouts)
49
+ plan = [(task, n) for task, n in zip(tasks, counts) if n]
46
50
  logger.info(
47
51
  "resuming %s: %d task(s), %d rollout(s) owed",
48
52
  out,
49
- len(tasks),
53
+ len(plan),
50
54
  sum(owed.values()),
51
55
  )
52
56
  else:
@@ -70,13 +74,7 @@ async def run_eval(env: Env, config: EvalConfig) -> list[Episode]:
70
74
  # Serving resources (shared tool servers, interception) come up once for the
71
75
  # run; plan slots inside so the env's agents borrow them.
72
76
  async with env.serving():
73
- planned = [
74
- slot
75
- for task in tasks
76
- for slot in env.slots(
77
- task, n=owed[task.data.idx] if owed else config.num_rollouts
78
- )
79
- ]
77
+ planned = [slot for task, n in plan for slot in env.slots(task, n=n)]
80
78
  slots = [RunSlot.finished(episode) for episode in finished] + planned
81
79
  push_state = None
82
80
  if config.push and config.rich:
@@ -123,6 +121,15 @@ async def run_eval_server(config: EvalConfig) -> list[Episode]:
123
121
  if legacy
124
122
  else {"config_data": env_config_data(config.env)} # picklable across the spawn
125
123
  )
124
+ tasks = []
125
+ if not legacy:
126
+ from verifiers.v1.loaders import load_taskset
127
+
128
+ # The client owns the taskset: load it here, once — the server (and its pool
129
+ # workers) never load data, they rebuild each dispatched task from its request.
130
+ tasks = load_taskset(config.env.taskset).select(
131
+ config.num_tasks, config.shuffle
132
+ )
126
133
  # Spawned processes inherit no logging — hand them the main process's setup so
127
134
  # their rollout logs land in the output dir.
128
135
  level = "DEBUG" if config.verbose else "INFO"
@@ -151,48 +158,57 @@ async def run_eval_server(config: EvalConfig) -> list[Episode]:
151
158
  address = await asyncio.to_thread(address_queue.get, timeout=600)
152
159
  client = EnvClient(address=address)
153
160
  await client.wait_for_server_startup(timeout=600)
154
- info = await client.info()
155
- # Only a legacy (v0) env group-scores; a v1 env scores siblings in its own
156
- # rollout.
157
- group_scored = info.requires_group_scoring
158
- if info.num_tasks is None: # infinite taskset - the run must be bounded
159
- if config.num_tasks is None:
160
- raise ValueError(
161
- f"{config.env_id} is infinite - bound the run with -n/--num-tasks"
162
- )
163
- if config.shuffle:
164
- logger.warning(
165
- "shuffle is a no-op on an infinite taskset - "
166
- "taking the first %d generated tasks",
167
- config.num_tasks,
168
- )
169
- idxs = list(range(config.num_tasks))
170
- else:
161
+ # A v1 run dispatches — and resumes — tasks by content: the client owns them,
162
+ # and `resume.task_key` is their identity. Only the legacy bridge is addressed
163
+ # by dataset row (its dataset lives server-side, reported via `info`), and
164
+ # only a legacy env group-scores; a v1 env scores siblings in its own rollout.
165
+ if legacy:
166
+ info = await client.info()
167
+ group_scored = info.requires_group_scoring
171
168
  idxs = sample(list(range(info.num_tasks)), config.shuffle, config.num_tasks)
169
+ plan = [({"task_idx": idx}, config.num_rollouts) for idx in idxs]
170
+ else:
171
+ group_scored = False
172
+ plan = [
173
+ ({"task_data": task.data.model_dump(mode="json")}, config.num_rollouts)
174
+ for task in tasks
175
+ ]
172
176
  out = output_path(config)
173
177
  finished: list[Episode] = []
174
178
  if config.resume is not None:
175
- # (legacy only) a group is served and scored together, so a partially-kept
176
- # task redoes as a whole group whole_task drops its kept rows.
177
- finished, owed = resume.load(
178
- out, idxs, config.num_rollouts, whole_task=group_scored
179
- )
179
+ if legacy:
180
+ # A group is served and scored together, so a partially-kept task
181
+ # redoes as a whole group — whole_task drops its kept rows.
182
+ finished, owed = resume.load(
183
+ out,
184
+ idxs,
185
+ config.num_rollouts,
186
+ whole_task=group_scored,
187
+ key_of=lambda data: data.get("idx"),
188
+ )
189
+ counts = resume.distribute(idxs, owed, config.num_rollouts)
190
+ else:
191
+ keys = [
192
+ resume.task_key(t.data.model_dump(mode="json", exclude_none=True))
193
+ for t in tasks
194
+ ]
195
+ finished, owed = resume.load(out, keys, config.num_rollouts)
196
+ counts = resume.distribute(keys, owed, config.num_rollouts)
180
197
  if not owed: # already complete - report it and exit successfully
181
- print(resume.nothing_to_resume_msg(out, len(idxs), config.num_rollouts))
198
+ print(resume.nothing_to_resume_msg(out, len(plan), config.num_rollouts))
182
199
  raise SystemExit(0)
183
- idxs = [idx for idx in idxs if owed.get(idx)]
200
+ plan = [(payload, n) for (payload, _), n in zip(plan, counts) if n]
184
201
  logger.info(
185
202
  "resuming %s: %d task(s), %d rollout(s) owed",
186
203
  out,
187
- len(idxs),
204
+ len(plan),
188
205
  sum(owed.values()),
189
206
  )
190
207
  else:
191
- owed = {idx: config.num_rollouts for idx in idxs}
192
208
  save_config(config, out)
193
209
  logger.info(
194
210
  "running %dx%d rollouts via the env-server %s pool on %s",
195
- len(idxs),
211
+ len(plan),
196
212
  config.num_rollouts,
197
213
  config.pool.type,
198
214
  config.model,
@@ -224,13 +240,13 @@ async def run_eval_server(config: EvalConfig) -> list[Episode]:
224
240
  records.append(Episode.of(trace))
225
241
  return records
226
242
 
227
- async def run_unit(idx: int) -> list[Episode]:
243
+ async def run_unit(payload: dict) -> list[Episode]:
228
244
  async with semaphore or contextlib.nullcontext():
229
245
  episode = await client.run(
230
- task_idx=idx,
231
246
  client=config.client,
232
247
  model=config.model,
233
248
  sampling=config.sampling,
249
+ **payload,
234
250
  )
235
251
  for trace in episode.traces:
236
252
  trace.stamp(EvalRunInfo(id=config.uuid))
@@ -238,12 +254,12 @@ async def run_eval_server(config: EvalConfig) -> list[Episode]:
238
254
  return [episode]
239
255
 
240
256
  # A group-scored legacy task runs its rollouts together (one `run_group`
241
- # request, one worker); otherwise each rollout is its own `run_rollout`
242
- # request, dispatched least-busy across workers.
257
+ # request, one worker); otherwise each rollout is its own `run` request,
258
+ # dispatched least-busy across workers.
243
259
  units = (
244
- [run_group_unit(i) for i in idxs]
260
+ [run_group_unit(payload["task_idx"]) for payload, _ in plan]
245
261
  if group_scored
246
- else [run_unit(i) for i in idxs for _ in range(owed[i])]
262
+ else [run_unit(payload) for payload, n in plan for _ in range(n)]
247
263
  )
248
264
  results = await asyncio.gather(*units)
249
265
  await client.close()
@@ -66,7 +66,7 @@ def main(argv: list[str] | None = None) -> None:
66
66
  # Refuse multi-agent before the dry-run return, so --dry-run can't write a
67
67
  # config the real invocation would reject.
68
68
  env_cls = vf.environment_class(
69
- config.env.taskset.id if config.env.taskset is not None else "",
69
+ config.env.taskset.id,
70
70
  config.env.id,
71
71
  )
72
72
  if not issubclass(env_cls, vf.SingleAgentEnv):
@@ -36,8 +36,8 @@ def output_path(config: EvalConfig) -> Path:
36
36
  if config.output_dir is not None:
37
37
  return config.output_dir
38
38
  taskset = config.env.taskset
39
- env = taskset.name if taskset is not None else "no-taskset"
40
- if taskset is not None and taskset.id and config.env.id:
39
+ env = taskset.name if taskset.id else "no-taskset"
40
+ if taskset.id and config.env.id:
41
41
  # Same compounding as `EnvConfig.env_id`: a `best-of-n+gsm8k-v1` run must
42
42
  # not share a parent dir with a plain `gsm8k-v1` one.
43
43
  env = f"{env_name(config.env.id)}+{env}"
@@ -138,9 +138,7 @@ class EnvServerConfig(BaseConfig):
138
138
  @property
139
139
  def is_legacy(self) -> bool:
140
140
  """A v0/legacy env (run via the bridge): a legacy `id` is set and no v1 taskset."""
141
- return self.id is not None and (
142
- self.env.taskset is None or not self.env.taskset.id
143
- )
141
+ return self.id is not None and not self.env.taskset.id
144
142
 
145
143
  @property
146
144
  def env_id(self) -> str:
@@ -152,7 +150,7 @@ class EnvServerConfig(BaseConfig):
152
150
  def _refuse_legacy_id_with_taskset(self):
153
151
  """A legacy `id` next to a v1 `env.taskset` would be silently inert
154
152
  (`is_legacy` is False and the v0 env never loads); refuse the mix."""
155
- if self.id is not None and self.env.taskset is not None and self.env.taskset.id:
153
+ if self.id is not None and self.env.taskset.id:
156
154
  raise ValueError(
157
155
  f"--id {self.id!r} is the legacy (v0) env id and can't combine with "
158
156
  f"the v1 taskset {self.env.taskset.id!r}. Pairing an env with a "
@@ -31,7 +31,7 @@ from verifiers.v1.retries import RetryConfig, run_episode_with_retry
31
31
  from verifiers.v1.runtimes import SubprocessConfig, runtime_is_local
32
32
  from verifiers.v1.errors import EnvError, boundary
33
33
  from verifiers.v1.task import Task, resolve_server_config
34
- from verifiers.v1.taskset import Taskset, TasksetConfig
34
+ from verifiers.v1.taskset import TasksetConfig
35
35
  from verifiers.v1.episode import Episode
36
36
  from verifiers.v1.trace import Error, Trace
37
37
  from verifiers.v1.utils.generic import deep_merge, generic_type
@@ -65,9 +65,9 @@ class EnvConfig(BaseConfig):
65
65
  """Which `Env` runs. Empty = the taskset's own, else `SingleAgentEnv`; set
66
66
  to pair a reusable env with any taskset (an explicit id wins over the bundled)."""
67
67
  # SerializeAsAny: the env-server wire needs the resolved subclass's fields.
68
- taskset: SerializeAsAny[TasksetConfig] | None = None
68
+ taskset: SerializeAsAny[TasksetConfig] = TasksetConfig()
69
69
  """The seed taskset — the rows every rollout starts from (`--env.taskset.id`).
70
- None only for an env that mints its tasks without a dataset."""
70
+ The id stays empty only for a legacy (v0) run, which sets the top-level `id`."""
71
71
  timeout: TimeoutConfig = TimeoutConfig()
72
72
  retries: RetryConfig = RetryConfig()
73
73
  """Whole-EPISODE retries — the coarse fallback for faults no agent owns; a
@@ -81,17 +81,14 @@ class EnvConfig(BaseConfig):
81
81
  @property
82
82
  def env_id(self) -> str:
83
83
  """The taskset id, prefixed by the paired env id (`best-of-n+gsm8k-v1`)."""
84
- taskset_id = self.taskset.id if self.taskset is not None else ""
85
- if taskset_id and self.id:
86
- return f"{self.id}+{taskset_id}"
87
- return taskset_id or self.id
84
+ if self.taskset.id and self.id:
85
+ return f"{self.id}+{self.taskset.id}"
86
+ return self.taskset.id or self.id
88
87
 
89
88
  def agent_harnesses(self) -> dict[str, HarnessConfig]:
90
89
  """Each declared role's resolved harness config (pin, else the taskset's
91
90
  default) — known without constructing the env."""
92
- default = default_agent_harness(
93
- self.taskset.id if self.taskset is not None else ""
94
- )
91
+ default = default_agent_harness(self.taskset.id)
95
92
  return {
96
93
  name: cfg.harness if cfg.harness is not None else default
97
94
  for name, cfg in _declared_agent_configs(self).items()
@@ -239,7 +236,7 @@ class Env(ABC, Generic[ConfigT]):
239
236
  f"{config_cls.__name__}(...) explicitly"
240
237
  )
241
238
  self.config: ConfigT = config
242
- if config.taskset is None:
239
+ if not config.taskset.id:
243
240
  raise ValueError(
244
241
  f"{type(self).__name__} needs a seed taskset — every rollout starts "
245
242
  "from one of its tasks: set --env.taskset.id (or the positional "
@@ -247,7 +244,7 @@ class Env(ABC, Generic[ConfigT]):
247
244
  )
248
245
  self.taskset = load_taskset(config.taskset)
249
246
  self._default_harness = default_agent_harness(config.taskset.id)
250
- task_cls = generic_type(type(self.taskset), Task, origin=Taskset) or Task
247
+ task_cls = type(self.taskset).task_type()
251
248
  self._task_cls: type[Task] = task_cls
252
249
  self._agent_specs: dict[str, AgentConfig] = _declared_agent_configs(self.config)
253
250
  if not self._agent_specs:
@@ -520,7 +517,7 @@ class Env(ABC, Generic[ConfigT]):
520
517
  """`requires_tunnel` over the consumers known before any rollout: role
521
518
  runtimes, live `shared` servers, and the task class's tool/user servers;
522
519
  a class overriding `server_config` conservatively counts as remote."""
523
- task_cls = generic_type(type(self.taskset), Task, origin=Taskset) or Task
520
+ task_cls = type(self.taskset).task_type()
524
521
  server_classes = [*task_cls.tools, *([task_cls.user] if task_cls.user else [])]
525
522
  if server_classes and task_cls.server_config is not Task.server_config:
526
523
  return True
@@ -431,12 +431,23 @@ class LegacyEnvServer(EnvServer):
431
431
  state_columns=["trajectory"],
432
432
  )
433
433
 
434
+ @staticmethod
435
+ def _row(req: RunRequest) -> int:
436
+ """The dataset row a request addresses — the bridge's dataset lives
437
+ server-side, so requests must carry `task_idx` (v1 servers take `task_data`)."""
438
+ if req.task_idx is None:
439
+ raise ValueError(
440
+ "legacy env server requests address the dataset by task_idx"
441
+ )
442
+ return req.task_idx
443
+
434
444
  async def _run(self, req: RunRequest) -> RunResponse:
435
- out = await self._run_v0(req.task_idx, req.client, req.model, req.sampling)
445
+ task_idx = self._row(req)
446
+ out = await self._run_v0(task_idx, req.client, req.model, req.sampling)
436
447
  # Trust the bridge-minted record; serialize it once (mirrors `EnvServer`).
437
448
  return RunResponse.model_construct(
438
449
  episode=Episode.of(
439
- rollout_output_to_trace(out, req.task_idx), env=self.taskset_id
450
+ rollout_output_to_trace(out, task_idx), env=self.taskset_id
440
451
  )
441
452
  )
442
453
 
@@ -187,8 +187,7 @@ def environment_class(taskset_id: str, env_id: str = "") -> type[Env]:
187
187
  def load_environment(config: EnvConfig) -> Env:
188
188
  """Construct the env for `config`. Every construction site (eval, serve, gepa)
189
189
  goes through here so subclass envs load everywhere."""
190
- taskset_id = config.taskset.id if config.taskset is not None else ""
191
- return environment_class(taskset_id, config.id)(config)
190
+ return environment_class(config.taskset.id, config.id)(config)
192
191
 
193
192
 
194
193
  def load_taskset(config: TasksetConfig) -> Taskset:
@@ -239,8 +238,7 @@ def resolve_env_config(data: dict | EnvConfig | None) -> EnvConfig:
239
238
  validate. The one entry every consumer takes (CLI, TOML, the env-server wire),
240
239
  so role fields always validate against the real config class."""
241
240
  if isinstance(data, EnvConfig):
242
- taskset_id = data.taskset.id if data.taskset is not None else ""
243
- cls = env_config_type(taskset_id, data.id)
241
+ cls = env_config_type(data.taskset.id, data.id)
244
242
  if isinstance(data, cls):
245
243
  return data # already at least as specifically typed — keep
246
244
  data = data.model_dump()
@@ -260,4 +258,4 @@ def resolve_env_config(data: dict | EnvConfig | None) -> EnvConfig:
260
258
  def task_type(taskset_id: str) -> type[Task]:
261
259
  """The taskset's `Task` subclass from its generic parameters — no data is
262
260
  loaded, so replay can cheaply recover the task type. Falls back to `Task`."""
263
- return generic_type(taskset_class(taskset_id), Task, origin=Taskset) or Task
261
+ return taskset_class(taskset_id).task_type()
@@ -181,9 +181,7 @@ def push_traces(
181
181
  return finish(error="no PRIME_API_KEY (run `prime login`)")
182
182
 
183
183
  traces = [trace for episode in episodes for trace in episode.traces]
184
- env_name = (
185
- config.env.taskset.id if config.env.taskset is not None else ""
186
- ) or config.id
184
+ env_name = (config.env.taskset.id) or config.id
187
185
  metrics = _run_metrics(episodes, traces)
188
186
  samples = _build_samples(episodes)
189
187
  num_examples = len({t.task.data.idx for t in traces})
@@ -141,13 +141,25 @@ class EnvClient:
141
141
  return await self._request(InfoRequest(), InfoResponse)
142
142
 
143
143
  async def run(
144
- self, task_idx: int, client: ClientConfig, model: str, sampling: SamplingConfig
144
+ self,
145
+ client: ClientConfig,
146
+ model: str,
147
+ sampling: SamplingConfig,
148
+ task_data: dict | None = None,
149
+ # TODO: remove task_idx addressing once v0 (the legacy bridge) is deprecated.
150
+ task_idx: int | None = None,
145
151
  ) -> WireEpisode:
146
- """Run one rollout for `task_idx`; return its episode record — flat traces
147
- (typed `Trace[WireTaskData]`) plus the shared stamp."""
152
+ """Run one rollout; return its episode record — flat traces (typed
153
+ `Trace[WireTaskData]`) plus the shared stamp. A v1 server takes the task
154
+ itself (`task_data`, its dumped `TaskData`); the legacy bridge addresses
155
+ its server-side dataset by `task_idx`."""
148
156
  response = await self._request(
149
157
  RunRequest(
150
- task_idx=task_idx, client=client, model=model, sampling=sampling
158
+ task_data=task_data,
159
+ task_idx=task_idx,
160
+ client=client,
161
+ model=model,
162
+ sampling=sampling,
151
163
  ),
152
164
  RunResponse,
153
165
  )