verifiers 0.1.15.dev415__tar.gz → 0.1.15.dev417__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 (405) hide show
  1. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/PKG-INFO +1 -1
  2. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/v1/test_e2e.py +9 -25
  3. verifiers-0.1.15.dev417/tests/v1/test_scoring.py +33 -0
  4. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/GUIDE.md +6 -8
  5. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/__init__.py +15 -0
  6. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/interception/server.py +3 -3
  7. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/mcp/launch.py +7 -37
  8. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/mcp/server.py +5 -14
  9. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/mcp/toolset.py +0 -15
  10. verifiers-0.1.15.dev417/verifiers/v1/scoring.py +166 -0
  11. verifiers-0.1.15.dev415/verifiers/v1/mcp/multiplex.py +0 -302
  12. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/.gitignore +0 -0
  13. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/LICENSE +0 -0
  14. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/README.md +0 -0
  15. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/pyproject.toml +0 -0
  16. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/AGENTS.md +0 -0
  17. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/README.md +0 -0
  18. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/__init__.py +0 -0
  19. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/conftest.py +0 -0
  20. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_browser_env.py +0 -0
  21. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_build_script.py +0 -0
  22. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_cli_agent_env.py +0 -0
  23. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_client_auth_errors.py +0 -0
  24. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_client_config.py +0 -0
  25. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_client_multimodal_types.py +0 -0
  26. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_composable_env.py +0 -0
  27. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_context_token_metrics.py +0 -0
  28. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_decorator_ranks.py +0 -0
  29. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_endpoint_registry.py +0 -0
  30. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_env_group.py +0 -0
  31. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_env_server.py +0 -0
  32. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_environment.py +0 -0
  33. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_environment_extra.py +0 -0
  34. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_envs.py +0 -0
  35. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_error_chain.py +0 -0
  36. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_eval_display.py +0 -0
  37. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_eval_utils.py +0 -0
  38. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_gepa_cli.py +0 -0
  39. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_gepa_utils.py +0 -0
  40. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_gym_env.py +0 -0
  41. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_harbor_env_mcp.py +0 -0
  42. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_imports.py +0 -0
  43. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_init_script.py +0 -0
  44. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_install_utils.py +0 -0
  45. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_interception_utils.py +0 -0
  46. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_logging.py +0 -0
  47. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_math_rubric.py +0 -0
  48. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_maybe_think_parser.py +0 -0
  49. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_message_utils.py +0 -0
  50. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_message_utils_multimodal.py +0 -0
  51. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_multiturn_env.py +0 -0
  52. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_nemorl_client.py +0 -0
  53. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_openai_chat_completions_token_client.py +0 -0
  54. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_openai_responses_client.py +0 -0
  55. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_opencode_rlm_env.py +0 -0
  56. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_openenv_client.py +0 -0
  57. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_parser.py +0 -0
  58. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_path_utils.py +0 -0
  59. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_per_turn_timing.py +0 -0
  60. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_pricing_utils.py +0 -0
  61. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_prime_plugin.py +0 -0
  62. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_renderer_client.py +0 -0
  63. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_renderer_e2e.py +0 -0
  64. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_rlm_composable_env.py +0 -0
  65. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_rubric.py +0 -0
  66. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_rubric_group.py +0 -0
  67. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_sandbox_debug_env.py +0 -0
  68. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_sandbox_env.py +0 -0
  69. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_sandbox_mixin.py +0 -0
  70. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_save_utils.py +0 -0
  71. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_setup_script.py +0 -0
  72. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_singleturn_env.py +0 -0
  73. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_stateful_tool_env.py +0 -0
  74. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_think_parser.py +0 -0
  75. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_tool_env.py +0 -0
  76. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_tool_utils.py +0 -0
  77. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_trajectory_processing.py +0 -0
  78. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_tui_info_formatting.py +0 -0
  79. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_types.py +0 -0
  80. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_wordle_env.py +0 -0
  81. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/test_xml_parser.py +0 -0
  82. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/v1/conftest.py +0 -0
  83. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  84. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  85. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/v1/fixtures/echo_multi_v0.py +0 -0
  86. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  87. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  88. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/v1/fixtures/echo_v0.py +0 -0
  89. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/v1/fixtures/echo_v1.py +0 -0
  90. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/v1/fixtures/pyproject.toml +0 -0
  91. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  92. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/v1/test_color_codeword_tasks.py +0 -0
  93. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/v1/test_configs.py +0 -0
  94. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/v1/test_envs.py +0 -0
  95. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/v1/test_graph.py +0 -0
  96. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/v1/test_legacy.py +0 -0
  97. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/tests/v1/test_trace.py +0 -0
  98. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/AGENTS.md +0 -0
  99. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/__init__.py +0 -0
  100. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/cli/__init__.py +0 -0
  101. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/cli/commands/__init__.py +0 -0
  102. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/cli/commands/build.py +0 -0
  103. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/cli/commands/eval.py +0 -0
  104. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/cli/commands/gepa.py +0 -0
  105. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/cli/commands/init.py +0 -0
  106. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/cli/commands/install.py +0 -0
  107. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/cli/commands/setup.py +0 -0
  108. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/cli/plugins/__init__.py +0 -0
  109. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/cli/plugins/prime.py +0 -0
  110. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/cli/tui.py +0 -0
  111. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/clients/__init__.py +0 -0
  112. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/clients/anthropic_messages_client.py +0 -0
  113. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/clients/client.py +0 -0
  114. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
  115. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/clients/openai_chat_completions_client.py +0 -0
  116. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
  117. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/clients/openai_completions_client.py +0 -0
  118. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/clients/openai_responses_client.py +0 -0
  119. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/clients/renderer_client.py +0 -0
  120. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/decorators.py +0 -0
  121. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/AGENTS.md +0 -0
  122. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/__init__.py +0 -0
  123. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/env_group.py +0 -0
  124. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/environment.py +0 -0
  125. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/README.md +0 -0
  126. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/__init__.py +0 -0
  127. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/cli_agent_env.py +0 -0
  128. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/README.md +0 -0
  129. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/__init__.py +0 -0
  130. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/_filter.py +0 -0
  131. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/composable_env.py +0 -0
  132. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/harness.py +0 -0
  133. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
  134. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  135. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
  136. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
  137. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
  138. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
  139. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
  140. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/task.py +0 -0
  141. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
  142. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  143. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  144. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  145. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  146. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  147. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  148. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  149. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  150. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  151. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
  152. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
  153. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
  154. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
  155. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
  156. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
  157. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
  158. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
  159. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/__init__.py +0 -0
  160. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/tool_pdf.py +0 -0
  161. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +0 -0
  162. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
  163. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/__init__.py +0 -0
  164. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/base_client.py +0 -0
  165. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +0 -0
  166. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/cache_prompts.py +0 -0
  167. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +0 -0
  168. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/cache_filesys.py +0 -0
  169. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/load_eval_script.py +0 -0
  170. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +0 -0
  171. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/tool_visit.py +0 -0
  172. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/url_tools.py +0 -0
  173. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +0 -0
  174. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
  175. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
  176. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
  177. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
  178. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
  179. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
  180. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
  181. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  182. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  183. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  184. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  185. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  186. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  187. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  188. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  189. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  190. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  191. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  192. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  193. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  194. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  195. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  196. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  197. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  198. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  199. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  200. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  201. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  202. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  203. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  204. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/gym_env.py +0 -0
  205. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
  206. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/harbor_env/env.py +0 -0
  207. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
  208. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/mcp_env.py +0 -0
  209. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/opencode_env.py +0 -0
  210. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
  211. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
  212. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
  213. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/utils/__init__.py +0 -0
  214. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/utils/file_locks.py +0 -0
  215. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
  216. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/integrations/README.md +0 -0
  217. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/integrations/__init__.py +0 -0
  218. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/integrations/browser_env/README.md +0 -0
  219. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
  220. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
  221. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
  222. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
  223. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  224. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  225. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/integrations/openenv_env.py +0 -0
  226. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
  227. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/integrations/textarena_env.py +0 -0
  228. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/multiturn_env.py +0 -0
  229. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/python_env.py +0 -0
  230. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/sandbox_env.py +0 -0
  231. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/singleturn_env.py +0 -0
  232. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/stateful_tool_env.py +0 -0
  233. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/envs/tool_env.py +0 -0
  234. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/errors.py +0 -0
  235. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/gepa/__init__.py +0 -0
  236. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/gepa/adapter.py +0 -0
  237. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/gepa/config.py +0 -0
  238. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/gepa/display.py +0 -0
  239. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/gepa/gepa_utils.py +0 -0
  240. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/parsers/__init__.py +0 -0
  241. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/parsers/maybe_think_parser.py +0 -0
  242. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/parsers/parser.py +0 -0
  243. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/parsers/think_parser.py +0 -0
  244. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/parsers/xml_parser.py +0 -0
  245. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/rl/README.md +0 -0
  246. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/rl/__init__.py +0 -0
  247. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/rl/inference/__init__.py +0 -0
  248. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/rl/inference/client.py +0 -0
  249. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/rl/inference/server.py +0 -0
  250. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/rl/trainer/__init__.py +0 -0
  251. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/rl/trainer/config.py +0 -0
  252. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/rl/trainer/orchestrator.py +0 -0
  253. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/rl/trainer/trainer.py +0 -0
  254. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/rl/trainer/utils.py +0 -0
  255. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/rubrics/__init__.py +0 -0
  256. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
  257. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/rubrics/judge_rubric.py +0 -0
  258. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/rubrics/math_rubric.py +0 -0
  259. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/rubrics/rubric.py +0 -0
  260. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/rubrics/rubric_group.py +0 -0
  261. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/scripts/__init__.py +0 -0
  262. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/scripts/build.py +0 -0
  263. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/scripts/eval.py +0 -0
  264. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/scripts/gepa.py +0 -0
  265. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/scripts/init.py +0 -0
  266. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/scripts/install.py +0 -0
  267. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/scripts/rl.py +0 -0
  268. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/scripts/setup.py +0 -0
  269. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/scripts/train.py +0 -0
  270. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/scripts/tui.py +0 -0
  271. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/scripts/vllm.py +0 -0
  272. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/serve/__init__.py +0 -0
  273. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/serve/client/env_client.py +0 -0
  274. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/serve/client/zmq_env_client.py +0 -0
  275. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/serve/server/__init__.py +0 -0
  276. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/serve/server/env_router.py +0 -0
  277. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/serve/server/env_server.py +0 -0
  278. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/serve/server/env_worker.py +0 -0
  279. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/serve/server/zmq_env_server.py +0 -0
  280. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/serve/types.py +0 -0
  281. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/types.py +0 -0
  282. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/__init__.py +0 -0
  283. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/async_utils.py +0 -0
  284. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/client_utils.py +0 -0
  285. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/config_utils.py +0 -0
  286. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/data_utils.py +0 -0
  287. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/display_utils.py +0 -0
  288. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/env_config_utils.py +0 -0
  289. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/env_utils.py +0 -0
  290. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/error_utils.py +0 -0
  291. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/eval_display.py +0 -0
  292. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/eval_utils.py +0 -0
  293. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/heartbeat.py +0 -0
  294. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/import_utils.py +0 -0
  295. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/install_utils.py +0 -0
  296. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/interception_utils.py +0 -0
  297. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/logging_utils.py +0 -0
  298. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/message_utils.py +0 -0
  299. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/metric_utils.py +0 -0
  300. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/path_utils.py +0 -0
  301. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/pricing_utils.py +0 -0
  302. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/process_utils.py +0 -0
  303. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/response_utils.py +0 -0
  304. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/save_utils.py +0 -0
  305. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/serve_utils.py +0 -0
  306. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/thread_utils.py +0 -0
  307. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/threaded_sandbox_client.py +0 -0
  308. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/tool_utils.py +0 -0
  309. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/usage_utils.py +0 -0
  310. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/utils/version_utils.py +0 -0
  311. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/ARCHITECTURE.md +0 -0
  312. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/README.md +0 -0
  313. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/cli/__init__.py +0 -0
  314. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  315. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/cli/dashboard/base.py +0 -0
  316. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/cli/dashboard/eval.py +0 -0
  317. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/cli/dashboard/validate.py +0 -0
  318. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/cli/eval/__init__.py +0 -0
  319. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/cli/eval/main.py +0 -0
  320. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/cli/eval/resume.py +0 -0
  321. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/cli/eval/runner.py +0 -0
  322. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/cli/init.py +0 -0
  323. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/cli/output.py +0 -0
  324. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/cli/resolve.py +0 -0
  325. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/cli/serve.py +0 -0
  326. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/cli/validate.py +0 -0
  327. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/clients/__init__.py +0 -0
  328. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/clients/client.py +0 -0
  329. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/clients/config.py +0 -0
  330. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/clients/eval.py +0 -0
  331. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/clients/train.py +0 -0
  332. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/configs/__init__.py +0 -0
  333. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/configs/eval.py +0 -0
  334. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/configs/init.py +0 -0
  335. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/configs/serve.py +0 -0
  336. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/configs/validate.py +0 -0
  337. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/decorators.py +0 -0
  338. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/dialects/__init__.py +0 -0
  339. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/dialects/anthropic.py +0 -0
  340. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/dialects/base.py +0 -0
  341. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/dialects/chat.py +0 -0
  342. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/dialects/responses.py +0 -0
  343. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/env.py +0 -0
  344. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/episode.py +0 -0
  345. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/errors.py +0 -0
  346. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/graph.py +0 -0
  347. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harness.py +0 -0
  348. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/__init__.py +0 -0
  349. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  350. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/codex/harness.py +0 -0
  351. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/default/__init__.py +0 -0
  352. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/default/harness.py +0 -0
  353. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/default/program.py +0 -0
  354. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  355. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  356. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  357. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  358. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  359. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/null/__init__.py +0 -0
  360. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/null/harness.py +0 -0
  361. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/null/program.py +0 -0
  362. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  363. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  364. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  365. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  366. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  367. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/interception/__init__.py +0 -0
  368. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/interception/pool.py +0 -0
  369. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/judge.py +0 -0
  370. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/legacy.py +0 -0
  371. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/loaders.py +0 -0
  372. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/mcp/__init__.py +0 -0
  373. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/mcp/user.py +0 -0
  374. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/retries.py +0 -0
  375. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/rollout.py +0 -0
  376. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/runtimes/__init__.py +0 -0
  377. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/runtimes/base.py +0 -0
  378. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/runtimes/docker.py +0 -0
  379. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/runtimes/limiters.py +0 -0
  380. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/runtimes/modal.py +0 -0
  381. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/runtimes/prime.py +0 -0
  382. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/runtimes/subprocess.py +0 -0
  383. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/serve/__init__.py +0 -0
  384. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/serve/client.py +0 -0
  385. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/serve/pool.py +0 -0
  386. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/serve/server.py +0 -0
  387. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/serve/types.py +0 -0
  388. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/state.py +0 -0
  389. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/task.py +0 -0
  390. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/taskset.py +0 -0
  391. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/tasksets/__init__.py +0 -0
  392. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  393. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  394. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  395. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  396. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  397. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  398. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  399. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/trace.py +0 -0
  400. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/types.py +0 -0
  401. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/utils/__init__.py +0 -0
  402. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/utils/format.py +0 -0
  403. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/utils/install.py +0 -0
  404. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/utils/logging.py +0 -0
  405. {verifiers-0.1.15.dev415 → verifiers-0.1.15.dev417}/verifiers/v1/utils/memory.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: verifiers
3
- Version: 0.1.15.dev415
3
+ Version: 0.1.15.dev417
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
@@ -9,8 +9,8 @@ carries a pytest mark, so subsets select with `-m` (see `conftest.py`).
9
9
  `test_user` and `test_tool` fan a server's own runtime against the harness runtime (the full
10
10
  reachability matrix); `test_single_turn`/`test_agentic` fan the harness against the harness runtime.
11
11
  `test_shared_tool_isolation` runs two concurrent rollouts against one SHARED writable tool server
12
- (fork off/on) across the full `harness_runtime` x (shared server's own) `tool_runtime` matrix —
13
- incl. mixed-locality combos — asserting each keeps its own state.
12
+ across the full `harness_runtime` x (shared server's own) `tool_runtime` matrix — incl. mixed-locality
13
+ combos — asserting each keeps its own `self.state`.
14
14
  """
15
15
 
16
16
  import pytest
@@ -126,23 +126,16 @@ async def test_tool_state(run_v1, harness_runtime, tool_runtime, tmp_path):
126
126
 
127
127
 
128
128
  @pytest.mark.e2e
129
- @pytest.mark.parametrize(
130
- "fork",
131
- [pytest.param(False, id="fork-off"), pytest.param(True, id="fork-on")],
132
- )
133
129
  async def test_shared_tool_isolation(
134
- run_v1_server, harness_runtime, tool_runtime, fork, tmp_path
130
+ run_v1_server, harness_runtime, tool_runtime, tmp_path
135
131
  ):
136
- """A SHARED, writable tool server keeps each rollout's state isolated across concurrent rollouts,
137
- over the FULL `harness_runtime` x (shared server's own) `tool_runtime` x fork matrix — including
132
+ """A SHARED, writable tool server keeps each rollout's `self.state` isolated across concurrent
133
+ rollouts, over the FULL `harness_runtime` x (shared server's own) `tool_runtime` matrix — including
138
134
  the mixed-locality combos (e.g. a local harness with a remote shared tool), which is exactly where
139
- the rollout's `/state` + `/task` channel must be bridged to the tool's runtime. `scratchpad-v1`
140
- gives each task a unique word and rewards 1.0 iff the rollout reads back its OWN word, so two
141
- concurrent rollouts (two distinct words on the ONE shared instance) both scoring 1.0 proves no
142
- cross-rollout corruption. Each fork mode exercises a different isolation path: fork=off keeps
143
- `isolate=True` (the per-rollout `self.state` channel); fork=on sets `isolate=False` (the server
144
- writes a process-global slot), so ONLY the forked-child process isolation can keep it correct.
145
- `isolate` is a config field (not an env var), so it reaches the shared server in any runtime.
135
+ the rollout's `/state` channel must be bridged to the tool's runtime. `scratchpad-v1` gives each
136
+ task a unique word and rewards 1.0 iff the rollout reads back its OWN word, so two concurrent
137
+ rollouts (two distinct words on the ONE shared instance) both scoring 1.0 proves the per-rollout
138
+ `self.state` channel keeps them isolated with no cross-rollout corruption.
146
139
 
147
140
  Placement is fixed to `shared`, so only the own-runtime cases of `tool_runtime` apply (the
148
141
  colocated/shared params have no distinct runtime to fan — skipped). Runs through the env-server
@@ -158,13 +151,6 @@ async def test_shared_tool_isolation(
158
151
  pytest.skip(
159
152
  "tool server in a prime sandbox needs prime port exposure (unreachable from host here)"
160
153
  )
161
- # A prime harness relays every model call through the sandbox, so two concurrent rollouts driving
162
- # the EXPERIMENTAL fork-per-rollout server can't finish within the rollout cap (reward stays 0).
163
- # The fork-isolation path is covered by the subprocess/docker harness cases.
164
- if harness_runtime == "prime" and fork:
165
- pytest.skip(
166
- "prime harness + experimental fork-per-rollout is too slow under concurrency to finish in the rollout cap"
167
- )
168
154
  traces = await run_v1_server(
169
155
  "scratchpad-v1",
170
156
  harness="null",
@@ -176,8 +162,6 @@ async def test_shared_tool_isolation(
176
162
  taskset_overrides={
177
163
  "tools": {
178
164
  "shared": True,
179
- "fork": fork,
180
- "isolate": not fork, # fork=on: write a global slot so ONLY fork can isolate it
181
165
  **tool_runtime, # the shared tool's own runtime ({"runtime": {"type": ...}})
182
166
  }
183
167
  },
@@ -0,0 +1,33 @@
1
+ import verifiers.v1 as vf
2
+
3
+
4
+ def test_compare_stdout_results_accepts_token_equal_text() -> None:
5
+ assert vf.compare_stdout_results("hello world\n", "hello world\n")
6
+
7
+
8
+ def test_compare_stdout_results_keeps_numeric_tolerance() -> None:
9
+ assert vf.compare_stdout_results("1.0001 2.0\n", "1.0002 2.0009\n")
10
+
11
+
12
+ def test_parse_pytest_outcomes_strips_xfail_xpass_reasons() -> None:
13
+ output = "\n".join(
14
+ [
15
+ "XFAIL tests/test_mod.py::test_xfail - known bug - still tracked",
16
+ "XPASS tests/test_mod.py::test_xpass - always xfail - unexpectedly passed",
17
+ "FAILED tests/test_mod.py::test_param[a - b] - assert left - right",
18
+ "PASSED tests/test_mod.py::test_ok",
19
+ ]
20
+ )
21
+
22
+ assert vf.parse_pytest_outcomes(output) == {
23
+ "tests/test_mod.py::test_xfail": "XFAIL",
24
+ "tests/test_mod.py::test_xpass": "XPASS",
25
+ "tests/test_mod.py::test_param[a - b]": "FAILED",
26
+ "tests/test_mod.py::test_ok": "PASSED",
27
+ }
28
+
29
+
30
+ def test_parse_judge_choice_uses_first_choice_after_verdict_marker() -> None:
31
+ response = "Final Judgment: B because it is a better answer"
32
+
33
+ assert vf.parse_judge_choice(response, choices=("A", "B")) == "B"
@@ -511,19 +511,17 @@ the default is the cheapest correct thing; the rest trade setup cost for isolati
511
511
  | **own runtime** *(default)* | *(nothing; `runtime = {type = "docker"\|"prime"}` for a sandbox)* | own runtime per rollout — `subprocess` on the host (default), or a `docker`/`prime` sandbox over a tunnel | full per-rollout isolation; a sandbox also isolates untrusted code / deps / network | pays `setup` every rollout (a sandbox adds spin-up + env install) |
512
512
  | **colocated** | `colocated = true` | inside the harness's runtime, one per rollout (no tunnel) | no extra runtime/tunnel; can touch the harness's filesystem | couples to the harness; `setup` per rollout |
513
513
  | **shared** | `shared = true` | one instance for the whole eval | `setup` once; writable per-rollout if state lives in `self.state` | state outside `self.state` corrupts across rollouts; `setup_task` skipped |
514
- | **shared + fork** | `shared = true, fork = true` | warm parent + forked child per rollout (copy-on-write) | `setup` once **and** isolates arbitrary in-process/on-disk state; runs `setup_task` per child | a process per concurrent rollout; Linux only |
515
514
  | **remote** *(tools only)* | `url = "https://…"` | connects to an already-running MCP endpoint | zero hosting; use a public/third-party server | no isolation, state, or lifecycle control |
516
515
 
517
- `shared` (and `fork`) work on any runtime — the framework makes the rollout's `/state` channel
518
- reachable from the shared server (localhost, or a host tunnel when remote). Keep big shared data
519
- off the Python heap (numpy / mmap / an on-disk index) so fork's copy-on-write actually saves
520
- memory.
516
+ `shared` works on any runtime — the framework makes the rollout's `/state` channel reachable from the
517
+ shared server (localhost, or a host tunnel when remote). Keep big shared data off the Python heap
518
+ (numpy / mmap / an on-disk index) so one instance scales across rollouts.
521
519
 
522
520
  **Choosing per-rollout state:** read-only resource → `shared`; state that fits a `State` model →
523
521
  `shared` + `self.state` (no extra process, the scalable default); state that can't (module globals,
524
- on-disk scratch, a stateful C library) → `shared + fork` or a per-rollout placement that pays
525
- `setup` each time; cheap `setup` → just use the default. **User simulators** support only the
526
- per-rollout placements (own runtime or `colocated`); `shared` / `fork` / `url` are tools-only.
522
+ on-disk scratch, a stateful C library) → a per-rollout placement (own runtime or `colocated`) that
523
+ pays `setup` each time; cheap `setup` → just use the default. **User simulators** support only the
524
+ per-rollout placements (own runtime or `colocated`); `shared` / `url` are tools-only.
527
525
 
528
526
  ## Learn from the examples
529
527
 
@@ -49,6 +49,14 @@ from verifiers.v1.loaders import (
49
49
  task_type,
50
50
  taskset_config_type,
51
51
  )
52
+ from verifiers.v1.scoring import (
53
+ compare_stdout_results as compare_stdout_results,
54
+ extract_boxed_answer as extract_boxed_answer,
55
+ parse_judge_choice as parse_judge_choice,
56
+ parse_pytest_outcomes as parse_pytest_outcomes,
57
+ read_answer_file_or_last_reply as read_answer_file_or_last_reply,
58
+ verify_boxed_math_answer as verify_boxed_math_answer,
59
+ )
52
60
  from verifiers.v1.retries import RetryConfig, RolloutRetryConfig
53
61
  from verifiers.v1.rollout import Rollout
54
62
  from verifiers.v1.runtimes import (
@@ -195,6 +203,13 @@ __all__ = [
195
203
  "JudgeConfig",
196
204
  "JudgeSamplingConfig",
197
205
  "JudgeResponse",
206
+ # scoring
207
+ "compare_stdout_results",
208
+ "extract_boxed_answer",
209
+ "parse_judge_choice",
210
+ "parse_pytest_outcomes",
211
+ "read_answer_file_or_last_reply",
212
+ "verify_boxed_math_answer",
198
213
  # mcp
199
214
  "Toolset",
200
215
  "ToolsetConfig",
@@ -216,8 +216,8 @@ class InterceptionServer:
216
216
  # GET/PUT their `self.state` here, keyed by the same bearer secret as the model routes.
217
217
  app.router.add_get("/state", self.handle_state_get)
218
218
  app.router.add_put("/state", self.handle_state_put)
219
- # A forked shared server (see `verifiers.v1.mcp.multiplex`) fetches its rollout's task here
220
- # to run `setup_task` per child a shared server gets no task via env, keyed by the secret.
219
+ # A launched tool/user server fetches its rollout's task here to run `setup_task` — the task
220
+ # is never passed via env, only over this channel, keyed by the same bearer secret.
221
221
  app.router.add_get("/task", self.handle_task_get)
222
222
  self.runner = web.AppRunner(app)
223
223
  await self.runner.setup()
@@ -585,7 +585,7 @@ class InterceptionServer:
585
585
  )
586
586
 
587
587
  async def handle_task_get(self, request: web.Request) -> web.Response:
588
- """Hand a forked shared server the rollout's task (class ref + JSON) so its child can run
588
+ """Hand a launched tool/user server the rollout's task (class ref + JSON) so it can run
589
589
  `setup_task` for this rollout — keyed by the same bearer secret as the state channel."""
590
590
  session = self._session_for(request)
591
591
  if session is None:
@@ -287,23 +287,11 @@ async def serve(
287
287
  "is built once for the whole eval and must be task-agnostic — it receives no task. "
288
288
  "Drop `shared` to run it per-rollout (with the task), or make its `setup` task-independent."
289
289
  )
290
- if (
291
- shared
292
- and not getattr(cfg, "fork", False)
293
- and type(server).setup_task is not ServerBase.setup_task
294
- ):
290
+ if shared and type(server).setup_task is not ServerBase.setup_task:
295
291
  logger.warning(
296
292
  "shared server %r overrides `setup_task`, but `setup_task` is NEVER called for a shared "
297
293
  "server (it's built once, task-agnostic) — its per-task logic will not run. Move "
298
- "task-agnostic work into `setup`, drop `shared` to run it per-rollout, or set `fork=True` "
299
- "(each rollout gets a forked child that runs `setup_task`).",
300
- server.server_name,
301
- )
302
- if shared and getattr(cfg, "fork", False):
303
- # `serve_tools` makes the rollout's /state + /task channel reachable from the shared server's
304
- # runtime (a host tunnel when it's remote), so any harness/runtime combo works.
305
- logger.warning(
306
- "shared server %r uses fork-per-rollout isolation, which is EXPERIMENTAL",
294
+ "task-agnostic work into `setup`, or drop `shared` to run it per-rollout.",
307
295
  server.server_name,
308
296
  )
309
297
  async with contextlib.AsyncExitStack() as stack:
@@ -383,11 +371,11 @@ async def serve_shared(toolsets: list[Toolset], harness_is_local: bool = True):
383
371
 
384
372
  def _shared_url_for_rollout(url: str, state_base: str | None, state_secret: str) -> str:
385
373
  """Tag a `shared` server's eval-level URL with this rollout's state-channel coordinates, so the
386
- one shared process serves each rollout its OWN `self.state` (and a forked child fetches its task).
387
- `state_base` is the interception server's reachable base for THIS rollout, chosen by the caller to
388
- be reachable from the shared server's runtime (localhost, or a host tunnel for a remote runtime).
389
- The secret is the bearer the harness already holds, so it's no new exposure — but it must not be
390
- logged (callers log the untagged base)."""
374
+ one shared process serves each rollout its OWN `self.state`. `state_base` is the interception
375
+ server's reachable base for THIS rollout, chosen by the caller to be reachable from the shared
376
+ server's runtime (localhost, or a host tunnel for a remote runtime). The secret is the bearer the
377
+ harness already holds, so it's no new exposure — but it must not be logged (callers log the
378
+ untagged base)."""
391
379
  if not state_base:
392
380
  return url
393
381
  parts = urlsplit(url)
@@ -397,19 +385,6 @@ def _shared_url_for_rollout(url: str, state_base: str | None, state_secret: str)
397
385
  return urlunsplit(parts._replace(query=urlencode(query)))
398
386
 
399
387
 
400
- async def reap_forked_child(shared_url: str, secret: str) -> None:
401
- """Best-effort: POST `/vf/close` to reap this rollout's forked child on teardown (a `fork` shared
402
- server, see `multiplex`); the multiplexer otherwise only reaps a child when it exits."""
403
- close_url = (
404
- f"{shared_url.rsplit('/mcp', 1)[0]}/vf/close?{STATE_SECRET_PARAM}={secret}"
405
- )
406
- with contextlib.suppress(Exception):
407
- import httpx
408
-
409
- async with httpx.AsyncClient(timeout=10.0) as client:
410
- await client.post(close_url)
411
-
412
-
413
388
  @contextlib.asynccontextmanager
414
389
  async def serve_tools(
415
390
  toolsets: list[Toolset],
@@ -456,11 +431,6 @@ async def serve_tools(
456
431
  # log the untagged base, NOT urls[name] — the per-rollout tag carries the rollout's
457
432
  # bearer secret (`vf_state_secret`), which must not reach a log sink
458
433
  logger.info("tool server '%s' (shared): %s", name, shared_urls[name])
459
- if getattr(cfg, "fork", False) and state_secret:
460
- # reap this rollout's forked child when the rollout's tool-serving scope exits
461
- stack.push_async_callback(
462
- reap_forked_child, shared_urls[name], state_secret
463
- )
464
434
  else:
465
435
  urls[name] = await stack.enter_async_context(
466
436
  serve(
@@ -118,8 +118,7 @@ def _request_query(name: str) -> str | None:
118
118
  def _die_with_parent() -> None:
119
119
  """Ask the kernel to SIGKILL this process when its parent (the launcher) dies, so a server is
120
120
  never orphaned if its launcher is torn down without stopping it (a backstop to the runtime's
121
- own cleanup). Linux-only; a no-op elsewhere. Cleared across `fork`, so a forked child must call
122
- it again."""
121
+ own cleanup). Linux-only; a no-op elsewhere."""
123
122
  import ctypes
124
123
  import signal
125
124
 
@@ -241,9 +240,8 @@ class ServerBase(Generic[ConfigT, StateT]):
241
240
  self, state_url: str | None, secret: str
242
241
  ) -> None:
243
242
  """Fetch this rollout's task over the state channel and run `setup_task` for it — a no-op
244
- without a channel or task (a shared, task-agnostic server). The single place task setup
245
- happens: `_serve` calls it with the env channel; a forked child calls it with its per-request
246
- channel (see `verifiers.v1.mcp.multiplex`)."""
243
+ without a channel or task (a shared, task-agnostic server). Called by `_serve` with the
244
+ per-rollout env channel a launched server carries."""
247
245
  task = await self._fetch_task(state_url, secret)
248
246
  if task is not None:
249
247
  await self.setup_task(task)
@@ -332,8 +330,8 @@ class ServerBase(Generic[ConfigT, StateT]):
332
330
  async def _setup() -> None:
333
331
  await self.setup()
334
332
  # Per-rollout servers carry the rollout's state channel in their env; fetch this rollout's
335
- # task over it and run `setup_task`. A shared server has no env channel (its forked
336
- # children fetch /task per-request instead see multiplex), so this is a no-op for it.
333
+ # task over it and run `setup_task`. A shared server has no env channel, so this is a
334
+ # no-op for it (it's task-agnosticone instance for the whole eval).
337
335
  await self._setup_task_from_channel(*self._state_channel())
338
336
 
339
337
  asyncio.run(_setup())
@@ -369,13 +367,6 @@ class ServerBase(Generic[ConfigT, StateT]):
369
367
  self._state_client = None
370
368
 
371
369
  app.router.lifespan_context = serving_lifespan
372
- if getattr(self.config, "fork", False):
373
- # `setup` ran once above (warm); fork a child per rollout that inherits it and runs
374
- # `setup_task` for the rollout's task (see multiplex).
375
- from verifiers.v1.mcp.multiplex import serve_forked
376
-
377
- serve_forked(app, sock, self)
378
- return
379
370
  server = uvicorn.Server(uvicorn.Config(app, log_level="critical"))
380
371
  asyncio.run(server.serve(sockets=[sock]))
381
372
 
@@ -32,8 +32,6 @@ class ToolsetConfig(BaseConfig):
32
32
  costs a per-rollout install.
33
33
  - shared: one instance for the whole eval, in its own `runtime` (pays `setup` once; per-rollout
34
34
  writable state stays isolated via `self.state`).
35
- - shared + fork: like shared, but a forked child per rollout (copy-on-write) also isolates
36
- state that can't live in `self.state`.
37
35
  See the placement/isolation section of `verifiers/v1/GUIDE.md` for the trade-offs of each.
38
36
  Subclass to add the server's own knobs (the data its `@tool` methods read). The server name is
39
37
  the class's `TOOL_PREFIX` ClassVar, not a field here — it's an identity (the model sees
@@ -51,15 +49,6 @@ class ToolsetConfig(BaseConfig):
51
49
  server's URL), so concurrent rollouts don't corrupt each other — provided the shared server runs
52
50
  on a local runtime (the default), which can reach the host's interception server. Mutually
53
51
  exclusive with `colocated`."""
54
- fork: bool = False
55
- """For a `shared` server: fork a child process per rollout (copy-on-write memory + a private
56
- working dir), so per-rollout state that can't live in `self.state` — module globals, a mutated
57
- in-memory object, relative-path on-disk writes — is isolated per rollout automatically. The
58
- expensive `setup` runs once in the parent; each child inherits it warm and runs `setup_task` for
59
- its rollout's task (see `verifiers.v1.mcp.multiplex`) — so a stateful per-rollout server pays its
60
- `setup` once yet stays isolated. Requires `shared`; works on any runtime (a remote one reaches the
61
- rollout's state/task channel over a host tunnel). Linux/fork only; not for CUDA/GPU state or
62
- background threads in the server."""
63
52
  runtime: RuntimeConfig = SubprocessConfig()
64
53
  """The server's own runtime, used unless `colocated` (host/subprocess by default — always
65
54
  reachable from any harness runtime; set docker/prime to isolate it in its own sandbox)."""
@@ -72,10 +61,6 @@ class ToolsetConfig(BaseConfig):
72
61
  def _validate_placement(self) -> "ToolsetConfig":
73
62
  if self.colocated and self.shared:
74
63
  raise ValueError("colocated and shared are mutually exclusive")
75
- if self.fork and not self.shared:
76
- raise ValueError(
77
- "fork requires shared — a per-rollout server already runs in its own process"
78
- )
79
64
  return self
80
65
 
81
66
 
@@ -0,0 +1,166 @@
1
+ from __future__ import annotations
2
+
3
+ import re
4
+ from collections.abc import Sequence
5
+ from decimal import Decimal, InvalidOperation
6
+ from typing import TYPE_CHECKING
7
+
8
+ from math_verify import parse, verify
9
+ from math_verify.errors import TimeoutException as MathVerifyTimeout
10
+
11
+ from verifiers.v1.errors import SandboxError
12
+
13
+ if TYPE_CHECKING:
14
+ from verifiers.v1.runtimes import Runtime
15
+ from verifiers.v1.trace import Trace
16
+
17
+ BOXED_START = "\\boxed{"
18
+ ANSI_RE = re.compile(r"\x1b\[[0-?]*[ -/]*[@-~]")
19
+ PYTEST_OUTCOMES = ("PASSED", "FAILED", "ERROR", "SKIPPED", "XFAIL", "XPASS")
20
+
21
+
22
+ def extract_boxed_answer(text: str, strict: bool = False) -> str:
23
+ start = text.rfind(BOXED_START)
24
+ if start == -1:
25
+ return "" if strict else text
26
+
27
+ # Regex is the wrong tool for nested braces, so walk the final box by hand.
28
+ answer_start = start + len(BOXED_START)
29
+ depth = 1
30
+ for index, char in enumerate(text[answer_start:], start=answer_start):
31
+ if char == "{":
32
+ depth += 1
33
+ elif char == "}":
34
+ depth -= 1
35
+ if depth == 0:
36
+ return text[answer_start:index]
37
+
38
+ return "" if strict else text
39
+
40
+
41
+ async def read_answer_file_or_last_reply(
42
+ runtime: "Runtime", path: str, trace: "Trace"
43
+ ) -> str:
44
+ try:
45
+ answer = (await runtime.read(path)).decode(errors="replace").strip()
46
+ except (FileNotFoundError, OSError, SandboxError):
47
+ answer = ""
48
+ return answer or trace.last_reply
49
+
50
+
51
+ def parse_judge_choice(
52
+ content: str | None, choices: Sequence[str] = ("A", "B", "C")
53
+ ) -> str | None:
54
+ if not content or ("<think>" in content and "</think>" not in content):
55
+ return None
56
+
57
+ text = content.rsplit("</think>", 1)[-1].strip()
58
+ text = extract_boxed_answer(text, strict=True).strip() or text
59
+
60
+ text_upper = text.upper()
61
+ choices_by_upper = {choice.upper(): choice for choice in choices}
62
+ allowed = "|".join(re.escape(choice) for choice in choices_by_upper)
63
+ choice_re = rf"(?<!\w)({allowed})(?!\w)"
64
+ verdict_re = (
65
+ r"(?:^|\n)\s*(?:FINAL\s+JUDGMENT|FINAL\s+ANSWER|FINAL\s+VERDICT|"
66
+ r"JUDGMENT|VERDICT|ANSWER)\s*(?:IS\s*)?[:\-]?\s*"
67
+ )
68
+
69
+ verdict = re.search(verdict_re, text_upper)
70
+ if verdict:
71
+ match = re.search(choice_re, text_upper[verdict.end() :])
72
+ return choices_by_upper.get(match.group(1)) if match else None
73
+
74
+ matches = re.findall(choice_re, text_upper)
75
+ return choices_by_upper.get(matches[-1]) if matches else None
76
+
77
+
78
+ def verify_boxed_math_answer(
79
+ response: str | None, answer: str, *, timeout_seconds: int = 5
80
+ ) -> float:
81
+ if not response or ("<think>" in response and "</think>" not in response):
82
+ return 0.0
83
+
84
+ prediction_text = response.rsplit("</think>", 1)[-1]
85
+ prediction = extract_boxed_answer(prediction_text, strict=True).strip()
86
+ gold = (extract_boxed_answer(answer, strict=True) or answer).strip()
87
+ if not prediction or not gold:
88
+ return 0.0
89
+
90
+ # math-verify expects both sides as boxed math expressions.
91
+ try:
92
+ parsed_gold = parse(f"\\boxed{{{gold}}}", parsing_timeout=timeout_seconds)
93
+ parsed_prediction = parse(
94
+ f"\\boxed{{{prediction}}}",
95
+ parsing_timeout=timeout_seconds,
96
+ )
97
+ return float(
98
+ verify(
99
+ parsed_gold,
100
+ parsed_prediction,
101
+ timeout_seconds=timeout_seconds,
102
+ )
103
+ )
104
+ except (Exception, MathVerifyTimeout):
105
+ return 0.0
106
+
107
+
108
+ def compare_stdout_results(
109
+ exec_stdout: str, expected: str, *, tolerance: float = 1e-3
110
+ ) -> bool:
111
+ if exec_stdout.strip() == expected.strip():
112
+ return True
113
+
114
+ actual_lines = [line.strip() for line in exec_stdout.splitlines() if line.strip()]
115
+ expected_lines = [line.strip() for line in expected.splitlines() if line.strip()]
116
+ if actual_lines == expected_lines:
117
+ return True
118
+
119
+ actual_tokens = [token for line in actual_lines for token in line.split()]
120
+ expected_tokens = [token for line in expected_lines for token in line.split()]
121
+ if actual_tokens == expected_tokens:
122
+ return True
123
+ if len(actual_tokens) != len(expected_tokens) or not actual_tokens:
124
+ return False
125
+
126
+ # Code datasets often allow tiny floating-point drift in stdout.
127
+ try:
128
+ actual_numbers = [Decimal(token) for token in actual_tokens]
129
+ expected_numbers = [Decimal(token) for token in expected_tokens]
130
+ except (InvalidOperation, ValueError):
131
+ return False
132
+ if not all(number.is_finite() for number in actual_numbers + expected_numbers):
133
+ return False
134
+
135
+ limit = Decimal(str(tolerance))
136
+ return all(
137
+ abs(actual - expected) <= limit
138
+ for actual, expected in zip(actual_numbers, expected_numbers)
139
+ )
140
+
141
+
142
+ def parse_pytest_outcomes(output: str | None) -> dict[str, str]:
143
+ outcomes: dict[str, str] = {}
144
+ for raw_line in ANSI_RE.sub("", output or "").splitlines():
145
+ parts = raw_line.strip().split(maxsplit=1)
146
+ if len(parts) != 2:
147
+ continue
148
+
149
+ outcome, test_id = parts
150
+ if outcome not in PYTEST_OUTCOMES:
151
+ continue
152
+
153
+ # SKIPPED short-summary rows use "[N] file.py:line: reason", not a node id.
154
+ if test_id.startswith("["):
155
+ continue
156
+
157
+ # These summary rows append " - <reason>"; passing node ids do not.
158
+ if outcome in ("FAILED", "ERROR", "XFAIL", "XPASS") and " - " in test_id:
159
+ parts = test_id.split(" - ")
160
+ for index in range(1, len(parts)):
161
+ node_id = " - ".join(parts[:index])
162
+ if node_id.count("[") == node_id.count("]"):
163
+ test_id = node_id
164
+ break
165
+ outcomes[test_id.rstrip()] = outcome
166
+ return outcomes