verifiers 0.1.15.dev407__tar.gz → 0.1.15.dev409__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 (408) hide show
  1. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/PKG-INFO +1 -1
  2. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/pyproject.toml +1 -1
  3. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/v1/conftest.py +6 -6
  4. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/v1/test_e2e.py +7 -7
  5. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/GUIDE.md +5 -4
  6. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/README.md +3 -2
  7. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/cli/dashboard/eval.py +73 -7
  8. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/env.py +5 -1
  9. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/harnesses/__init__.py +3 -3
  10. verifiers-0.1.15.dev409/verifiers/v1/harnesses/default/__init__.py +11 -0
  11. {verifiers-0.1.15.dev407/verifiers/v1/harnesses/bash_edit → verifiers-0.1.15.dev409/verifiers/v1/harnesses/default}/harness.py +26 -17
  12. {verifiers-0.1.15.dev407/verifiers/v1/harnesses/bash_edit → verifiers-0.1.15.dev409/verifiers/v1/harnesses/default}/program.py +22 -7
  13. verifiers-0.1.15.dev409/verifiers/v1/harnesses/null/__init__.py +7 -0
  14. {verifiers-0.1.15.dev407/verifiers/v1/harnesses/default → verifiers-0.1.15.dev409/verifiers/v1/harnesses/null}/harness.py +8 -7
  15. {verifiers-0.1.15.dev407/verifiers/v1/harnesses/default → verifiers-0.1.15.dev409/verifiers/v1/harnesses/null}/program.py +12 -1
  16. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/loaders.py +3 -2
  17. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/utils/format.py +9 -0
  18. verifiers-0.1.15.dev407/verifiers/v1/harnesses/bash/__init__.py +0 -7
  19. verifiers-0.1.15.dev407/verifiers/v1/harnesses/bash/harness.py +0 -79
  20. verifiers-0.1.15.dev407/verifiers/v1/harnesses/bash/program.py +0 -187
  21. verifiers-0.1.15.dev407/verifiers/v1/harnesses/bash_edit/__init__.py +0 -10
  22. verifiers-0.1.15.dev407/verifiers/v1/harnesses/default/__init__.py +0 -6
  23. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/.gitignore +0 -0
  24. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/LICENSE +0 -0
  25. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/README.md +0 -0
  26. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/AGENTS.md +0 -0
  27. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/README.md +0 -0
  28. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/__init__.py +0 -0
  29. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/conftest.py +0 -0
  30. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_browser_env.py +0 -0
  31. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_build_script.py +0 -0
  32. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_cli_agent_env.py +0 -0
  33. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_client_auth_errors.py +0 -0
  34. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_client_config.py +0 -0
  35. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_client_multimodal_types.py +0 -0
  36. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_composable_env.py +0 -0
  37. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_context_token_metrics.py +0 -0
  38. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_decorator_ranks.py +0 -0
  39. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_endpoint_registry.py +0 -0
  40. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_env_group.py +0 -0
  41. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_env_server.py +0 -0
  42. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_environment.py +0 -0
  43. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_environment_extra.py +0 -0
  44. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_envs.py +0 -0
  45. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_error_chain.py +0 -0
  46. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_eval_display.py +0 -0
  47. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_eval_utils.py +0 -0
  48. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_gepa_cli.py +0 -0
  49. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_gepa_utils.py +0 -0
  50. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_gym_env.py +0 -0
  51. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_harbor_env_mcp.py +0 -0
  52. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_imports.py +0 -0
  53. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_init_script.py +0 -0
  54. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_install_utils.py +0 -0
  55. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_interception_utils.py +0 -0
  56. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_logging.py +0 -0
  57. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_math_rubric.py +0 -0
  58. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_maybe_think_parser.py +0 -0
  59. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_message_utils.py +0 -0
  60. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_message_utils_multimodal.py +0 -0
  61. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_multiturn_env.py +0 -0
  62. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_nemorl_client.py +0 -0
  63. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_openai_chat_completions_token_client.py +0 -0
  64. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_openai_responses_client.py +0 -0
  65. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_opencode_rlm_env.py +0 -0
  66. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_openenv_client.py +0 -0
  67. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_parser.py +0 -0
  68. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_path_utils.py +0 -0
  69. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_per_turn_timing.py +0 -0
  70. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_pricing_utils.py +0 -0
  71. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_prime_plugin.py +0 -0
  72. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_renderer_client.py +0 -0
  73. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_renderer_e2e.py +0 -0
  74. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_rlm_composable_env.py +0 -0
  75. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_rubric.py +0 -0
  76. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_rubric_group.py +0 -0
  77. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_sandbox_debug_env.py +0 -0
  78. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_sandbox_env.py +0 -0
  79. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_sandbox_mixin.py +0 -0
  80. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_save_utils.py +0 -0
  81. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_setup_script.py +0 -0
  82. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_singleturn_env.py +0 -0
  83. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_stateful_tool_env.py +0 -0
  84. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_think_parser.py +0 -0
  85. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_tool_env.py +0 -0
  86. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_tool_utils.py +0 -0
  87. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_trajectory_processing.py +0 -0
  88. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_tui_info_formatting.py +0 -0
  89. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_types.py +0 -0
  90. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_wordle_env.py +0 -0
  91. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/test_xml_parser.py +0 -0
  92. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  93. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  94. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/v1/fixtures/echo_multi_v0.py +0 -0
  95. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  96. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  97. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/v1/fixtures/echo_v0.py +0 -0
  98. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/v1/fixtures/echo_v1.py +0 -0
  99. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/v1/fixtures/pyproject.toml +0 -0
  100. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  101. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/v1/test_color_codeword_tasks.py +0 -0
  102. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/v1/test_configs.py +0 -0
  103. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/v1/test_envs.py +0 -0
  104. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/v1/test_graph.py +0 -0
  105. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/v1/test_legacy.py +0 -0
  106. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/tests/v1/test_trace.py +0 -0
  107. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/AGENTS.md +0 -0
  108. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/__init__.py +0 -0
  109. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/cli/__init__.py +0 -0
  110. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/cli/commands/__init__.py +0 -0
  111. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/cli/commands/build.py +0 -0
  112. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/cli/commands/eval.py +0 -0
  113. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/cli/commands/gepa.py +0 -0
  114. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/cli/commands/init.py +0 -0
  115. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/cli/commands/install.py +0 -0
  116. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/cli/commands/setup.py +0 -0
  117. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/cli/plugins/__init__.py +0 -0
  118. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/cli/plugins/prime.py +0 -0
  119. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/cli/tui.py +0 -0
  120. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/clients/__init__.py +0 -0
  121. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/clients/anthropic_messages_client.py +0 -0
  122. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/clients/client.py +0 -0
  123. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
  124. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/clients/openai_chat_completions_client.py +0 -0
  125. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
  126. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/clients/openai_completions_client.py +0 -0
  127. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/clients/openai_responses_client.py +0 -0
  128. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/clients/renderer_client.py +0 -0
  129. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/decorators.py +0 -0
  130. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/AGENTS.md +0 -0
  131. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/__init__.py +0 -0
  132. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/env_group.py +0 -0
  133. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/environment.py +0 -0
  134. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/README.md +0 -0
  135. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/__init__.py +0 -0
  136. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/cli_agent_env.py +0 -0
  137. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/README.md +0 -0
  138. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/__init__.py +0 -0
  139. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/_filter.py +0 -0
  140. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/composable_env.py +0 -0
  141. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/harness.py +0 -0
  142. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
  143. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  144. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
  145. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
  146. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
  147. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
  148. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
  149. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/task.py +0 -0
  150. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
  151. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  152. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  153. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  154. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  155. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  156. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  157. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  158. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  159. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  160. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
  161. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
  162. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
  163. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
  164. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
  165. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
  166. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
  167. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
  168. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/__init__.py +0 -0
  169. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/tool_pdf.py +0 -0
  170. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +0 -0
  171. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
  172. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/__init__.py +0 -0
  173. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/base_client.py +0 -0
  174. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +0 -0
  175. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/cache_prompts.py +0 -0
  176. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +0 -0
  177. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/cache_filesys.py +0 -0
  178. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/load_eval_script.py +0 -0
  179. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +0 -0
  180. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/tool_visit.py +0 -0
  181. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/url_tools.py +0 -0
  182. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +0 -0
  183. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
  184. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
  185. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
  186. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
  187. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
  188. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
  189. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
  190. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  191. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  192. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  193. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  194. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  195. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  196. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  197. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  198. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  199. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  200. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  201. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  202. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  203. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  204. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  205. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  206. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  207. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  208. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  209. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  210. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  211. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  212. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  213. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/gym_env.py +0 -0
  214. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
  215. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/harbor_env/env.py +0 -0
  216. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
  217. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/mcp_env.py +0 -0
  218. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/opencode_env.py +0 -0
  219. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
  220. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
  221. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
  222. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/utils/__init__.py +0 -0
  223. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/utils/file_locks.py +0 -0
  224. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
  225. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/integrations/README.md +0 -0
  226. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/integrations/__init__.py +0 -0
  227. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/integrations/browser_env/README.md +0 -0
  228. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
  229. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
  230. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
  231. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
  232. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  233. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  234. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/integrations/openenv_env.py +0 -0
  235. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
  236. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/integrations/textarena_env.py +0 -0
  237. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/multiturn_env.py +0 -0
  238. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/python_env.py +0 -0
  239. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/sandbox_env.py +0 -0
  240. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/singleturn_env.py +0 -0
  241. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/stateful_tool_env.py +0 -0
  242. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/envs/tool_env.py +0 -0
  243. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/errors.py +0 -0
  244. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/gepa/__init__.py +0 -0
  245. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/gepa/adapter.py +0 -0
  246. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/gepa/config.py +0 -0
  247. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/gepa/display.py +0 -0
  248. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/gepa/gepa_utils.py +0 -0
  249. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/parsers/__init__.py +0 -0
  250. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/parsers/maybe_think_parser.py +0 -0
  251. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/parsers/parser.py +0 -0
  252. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/parsers/think_parser.py +0 -0
  253. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/parsers/xml_parser.py +0 -0
  254. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/rl/README.md +0 -0
  255. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/rl/__init__.py +0 -0
  256. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/rl/inference/__init__.py +0 -0
  257. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/rl/inference/client.py +0 -0
  258. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/rl/inference/server.py +0 -0
  259. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/rl/trainer/__init__.py +0 -0
  260. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/rl/trainer/config.py +0 -0
  261. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/rl/trainer/orchestrator.py +0 -0
  262. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/rl/trainer/trainer.py +0 -0
  263. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/rl/trainer/utils.py +0 -0
  264. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/rubrics/__init__.py +0 -0
  265. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
  266. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/rubrics/judge_rubric.py +0 -0
  267. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/rubrics/math_rubric.py +0 -0
  268. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/rubrics/rubric.py +0 -0
  269. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/rubrics/rubric_group.py +0 -0
  270. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/scripts/__init__.py +0 -0
  271. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/scripts/build.py +0 -0
  272. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/scripts/eval.py +0 -0
  273. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/scripts/gepa.py +0 -0
  274. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/scripts/init.py +0 -0
  275. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/scripts/install.py +0 -0
  276. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/scripts/rl.py +0 -0
  277. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/scripts/setup.py +0 -0
  278. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/scripts/train.py +0 -0
  279. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/scripts/tui.py +0 -0
  280. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/scripts/vllm.py +0 -0
  281. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/serve/__init__.py +0 -0
  282. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/serve/client/env_client.py +0 -0
  283. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/serve/client/zmq_env_client.py +0 -0
  284. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/serve/server/__init__.py +0 -0
  285. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/serve/server/env_router.py +0 -0
  286. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/serve/server/env_server.py +0 -0
  287. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/serve/server/env_worker.py +0 -0
  288. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/serve/server/zmq_env_server.py +0 -0
  289. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/serve/types.py +0 -0
  290. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/types.py +0 -0
  291. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/utils/__init__.py +0 -0
  292. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/utils/async_utils.py +0 -0
  293. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/utils/client_utils.py +0 -0
  294. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/utils/config_utils.py +0 -0
  295. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/utils/data_utils.py +0 -0
  296. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/utils/display_utils.py +0 -0
  297. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/utils/env_config_utils.py +0 -0
  298. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/utils/env_utils.py +0 -0
  299. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/utils/error_utils.py +0 -0
  300. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/utils/eval_display.py +0 -0
  301. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/utils/eval_utils.py +0 -0
  302. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/utils/heartbeat.py +0 -0
  303. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/utils/import_utils.py +0 -0
  304. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/utils/install_utils.py +0 -0
  305. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/utils/interception_utils.py +0 -0
  306. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/utils/logging_utils.py +0 -0
  307. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/utils/message_utils.py +0 -0
  308. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/utils/metric_utils.py +0 -0
  309. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/utils/path_utils.py +0 -0
  310. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/utils/pricing_utils.py +0 -0
  311. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/utils/process_utils.py +0 -0
  312. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/utils/response_utils.py +0 -0
  313. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/utils/save_utils.py +0 -0
  314. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/utils/serve_utils.py +0 -0
  315. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/utils/thread_utils.py +0 -0
  316. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/utils/threaded_sandbox_client.py +0 -0
  317. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/utils/tool_utils.py +0 -0
  318. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/utils/usage_utils.py +0 -0
  319. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/utils/version_utils.py +0 -0
  320. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/ARCHITECTURE.md +0 -0
  321. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/__init__.py +0 -0
  322. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/cli/__init__.py +0 -0
  323. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  324. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/cli/dashboard/base.py +0 -0
  325. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/cli/dashboard/validate.py +0 -0
  326. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/cli/eval/__init__.py +0 -0
  327. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/cli/eval/main.py +0 -0
  328. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/cli/eval/resume.py +0 -0
  329. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/cli/eval/runner.py +0 -0
  330. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/cli/init.py +0 -0
  331. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/cli/output.py +0 -0
  332. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/cli/resolve.py +0 -0
  333. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/cli/serve.py +0 -0
  334. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/cli/validate.py +0 -0
  335. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/clients/__init__.py +0 -0
  336. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/clients/client.py +0 -0
  337. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/clients/config.py +0 -0
  338. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/clients/eval.py +0 -0
  339. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/clients/train.py +0 -0
  340. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/configs/__init__.py +0 -0
  341. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/configs/eval.py +0 -0
  342. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/configs/init.py +0 -0
  343. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/configs/serve.py +0 -0
  344. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/configs/validate.py +0 -0
  345. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/decorators.py +0 -0
  346. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/dialects/__init__.py +0 -0
  347. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/dialects/anthropic.py +0 -0
  348. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/dialects/base.py +0 -0
  349. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/dialects/chat.py +0 -0
  350. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/dialects/responses.py +0 -0
  351. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/episode.py +0 -0
  352. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/errors.py +0 -0
  353. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/graph.py +0 -0
  354. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/harness.py +0 -0
  355. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  356. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/harnesses/codex/harness.py +0 -0
  357. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  358. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  359. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  360. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  361. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  362. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  363. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  364. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  365. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  366. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  367. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/interception/__init__.py +0 -0
  368. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/interception/pool.py +0 -0
  369. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/interception/server.py +0 -0
  370. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/judge.py +0 -0
  371. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/legacy.py +0 -0
  372. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/mcp/__init__.py +0 -0
  373. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/mcp/launch.py +0 -0
  374. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/mcp/multiplex.py +0 -0
  375. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/mcp/server.py +0 -0
  376. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/mcp/toolset.py +0 -0
  377. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/mcp/user.py +0 -0
  378. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/retries.py +0 -0
  379. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/rollout.py +0 -0
  380. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/runtimes/__init__.py +0 -0
  381. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/runtimes/base.py +0 -0
  382. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/runtimes/docker.py +0 -0
  383. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/runtimes/limiters.py +0 -0
  384. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/runtimes/modal.py +0 -0
  385. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/runtimes/prime.py +0 -0
  386. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/runtimes/subprocess.py +0 -0
  387. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/serve/__init__.py +0 -0
  388. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/serve/client.py +0 -0
  389. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/serve/pool.py +0 -0
  390. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/serve/server.py +0 -0
  391. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/serve/types.py +0 -0
  392. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/state.py +0 -0
  393. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/task.py +0 -0
  394. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/taskset.py +0 -0
  395. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/tasksets/__init__.py +0 -0
  396. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  397. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  398. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  399. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  400. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  401. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  402. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  403. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/trace.py +0 -0
  404. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/types.py +0 -0
  405. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/utils/__init__.py +0 -0
  406. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/utils/install.py +0 -0
  407. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/verifiers/v1/utils/logging.py +0 -0
  408. {verifiers-0.1.15.dev407 → verifiers-0.1.15.dev409}/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.dev407
3
+ Version: 0.1.15.dev409
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
@@ -249,8 +249,8 @@ markers = [
249
249
  "modal: v1 e2e cases touching the modal runtime (local-only setup; excluded in CI)",
250
250
  "colocated: v1 e2e cases with a user/tool server colocated in the harness runtime",
251
251
  "shared: v1 e2e cases with a shared (one-per-eval) tool server",
252
+ "null: v1 e2e cases on the null harness",
252
253
  "default: v1 e2e cases on the default harness",
253
- "bash: v1 e2e cases on the bash harness",
254
254
  "rlm: v1 e2e cases on the rlm harness",
255
255
  "kimi_code: v1 e2e cases on the kimi-code harness",
256
256
  "codex: v1 e2e cases on the codex harness",
@@ -15,12 +15,12 @@ Every matrix value carries a pytest mark, so subsets select with `-m`:
15
15
  uv run pytest tests/v1 -n auto # the whole matrix (needs modal setup)
16
16
  uv run pytest tests/v1 -n auto -m "not prime and not modal" # the CI matrix (host + docker only)
17
17
  uv run pytest tests/v1 -n auto -m docker # any case touching the docker runtime
18
- uv run pytest tests/v1 -n auto -m bash # only the bash harness
18
+ uv run pytest tests/v1 -n auto -m default # only the default harness
19
19
  uv run pytest tests/v1 -n auto -m prime # only prime (real sandboxes; local)
20
20
  uv run pytest tests/v1 -n auto -m modal # only modal (needs local setup)
21
21
 
22
22
  Marks: runtimes `subprocess` / `docker` / `prime` / `modal`, placements `colocated` / `shared`,
23
- harnesses `default` / `bash` / `rlm` / `kimi_code` / `codex`. A mark is applied per axis, so it
23
+ harnesses `null` / `default` / `rlm` / `kimi_code` / `codex`. A mark is applied per axis, so it
24
24
  selects every case touching that value on ANY axis; for one exact combination use `-k` on the test
25
25
  id (e.g. `-k "harness-in-docker-with-tool-in-subprocess"`). prime/modal provision real remote
26
26
  sandboxes (slow, infra-flaky, need setup), so they're local-only — CI runs `-m "not prime and not modal"`.
@@ -108,15 +108,15 @@ def tool_runtime(request) -> dict:
108
108
  return {"runtime": {"type": request.param}}
109
109
 
110
110
 
111
- # Harnesses, composed with the runtime fixtures, each carrying its harness mark (`-m bash`, ...).
111
+ # Harnesses, composed with the runtime fixtures, each carrying its harness mark (`-m default`, ...).
112
112
  # Built-ins are bundled in the `harnesses` package; the agent CLIs (`rlm` / `kimi-code` / `codex`)
113
113
  # install their dependencies at rollout. `compact` (an example harness) and `terminus-2` (drives
114
- # the host tmux) are excluded. `test_agentic` skips `default` (a chat loop with no shell);
114
+ # the host tmux) are excluded. `test_agentic` skips `null` (a chat loop with no shell);
115
115
  # `test_single_turn` skips `codex` (a coding agent, unreliable on a no-op echo).
116
116
  @pytest.fixture(
117
117
  params=[
118
+ pytest.param("null", marks=pytest.mark.null, id="null"),
118
119
  pytest.param("default", marks=pytest.mark.default, id="default"),
119
- pytest.param("bash", marks=pytest.mark.bash, id="bash"),
120
120
  pytest.param("rlm", marks=pytest.mark.rlm, id="rlm"),
121
121
  pytest.param("kimi-code", marks=pytest.mark.kimi_code, id="kimi-code"),
122
122
  pytest.param("codex", marks=pytest.mark.codex, id="codex"),
@@ -167,7 +167,7 @@ def _eval_config(
167
167
  taskset: str,
168
168
  *,
169
169
  output_dir: Path,
170
- harness: str = "default",
170
+ harness: str = "null",
171
171
  n: int = 1,
172
172
  num_tasks: int = 1,
173
173
  max_tokens: int = 2048,
@@ -51,7 +51,7 @@ async def test_user(run_v1, harness_runtime, user_runtime, tmp_path):
51
51
  )
52
52
  (trace,) = await run_v1(
53
53
  "echo-user-sim-v1",
54
- harness="default",
54
+ harness="null",
55
55
  harness_overrides={"runtime": {"type": harness_runtime}},
56
56
  output_dir=tmp_path,
57
57
  max_turns=6,
@@ -83,7 +83,7 @@ async def test_tool(run_v1, run_v1_server, harness_runtime, tool_runtime, tmp_pa
83
83
  run = run_v1_server if tool_runtime.get("shared") else run_v1
84
84
  (trace,) = await run(
85
85
  "echo-tool-v1",
86
- harness="default",
86
+ harness="null",
87
87
  harness_overrides={"runtime": {"type": harness_runtime}},
88
88
  output_dir=tmp_path,
89
89
  max_turns=6,
@@ -114,7 +114,7 @@ async def test_tool_state(run_v1, harness_runtime, tool_runtime, tmp_path):
114
114
  )
115
115
  (trace,) = await run_v1(
116
116
  "counter-tool-v1",
117
- harness="default",
117
+ harness="null",
118
118
  harness_overrides={"runtime": {"type": harness_runtime}},
119
119
  output_dir=tmp_path,
120
120
  max_turns=8,
@@ -167,7 +167,7 @@ async def test_shared_tool_isolation(
167
167
  )
168
168
  traces = await run_v1_server(
169
169
  "scratchpad-v1",
170
- harness="default",
170
+ harness="null",
171
171
  harness_overrides={"runtime": {"type": harness_runtime}},
172
172
  output_dir=tmp_path,
173
173
  num_tasks=2, # two distinct words, run concurrently against the one shared server
@@ -195,7 +195,7 @@ async def test_tool_response_image(run_v1, tmp_path):
195
195
  """MCP image content from a tool result survives into the v1 trace (needs a vision model)."""
196
196
  (trace,) = await run_v1(
197
197
  "tool-response-image-v1",
198
- harness="default",
198
+ harness="null",
199
199
  harness_overrides={"runtime": {"type": "subprocess"}},
200
200
  model="qwen/qwen3-vl-8b-instruct",
201
201
  output_dir=tmp_path,
@@ -209,9 +209,9 @@ async def test_tool_response_image(run_v1, tmp_path):
209
209
  @pytest.mark.e2e
210
210
  async def test_agentic(run_v1, harness, harness_runtime, tmp_path):
211
211
  """Agentic: write a phrase to a file with the agent's shell, checked in the runtime."""
212
- if harness == "default":
212
+ if harness == "null":
213
213
  pytest.skip(
214
- "default is a chat loop with no shell — it can't do the file-write task"
214
+ "null is a chat loop with no shell — it can't do the file-write task"
215
215
  )
216
216
  (trace,) = await run_v1(
217
217
  "echo-agentic-v1",
@@ -552,15 +552,16 @@ Otherwise pick a built-in, selected with `--harness.id`:
552
552
 
553
553
  | id | what it is |
554
554
  | --- | --- |
555
- | `default` | a tiny OpenAI chat loop (MCP tools only, no tools of its own) |
556
- | `bash` | the `default` chat loop plus a local `bash` tool, for shell-driving agents |
555
+ | `default` | a `bash` + `edit` coding agent (the `edit` tool is on by default — `--harness.edit false` for bash-only) — the fallback when no harness is given |
556
+ | `null` | a tiny OpenAI chat loop (MCP tools only, no tools of its own) |
557
557
  | `rlm` | the RLM CLI agent |
558
558
  | `codex` | the Codex CLI (Responses dialect + SSE relay) |
559
559
  | `mini-swe-agent` | the mini-swe-agent CLI (a minimal SWE agent) |
560
560
  | `kimi-code` | the Kimi Code CLI agent |
561
561
 
562
562
  ```bash
563
- uv run eval gsm8k-v1 -n 1 # default harness
563
+ uv run eval gsm8k-v1 -n 1 # default harness (bash + edit; the fallback)
564
+ uv run eval gsm8k-v1 -n 1 --harness.id null # bare chat loop, no local tools
564
565
  uv run eval gsm8k-v1 -n 1 --harness.id rlm # same taskset, different driver
565
566
  ```
566
567
 
@@ -792,7 +793,7 @@ form. In a prime-rl config:
792
793
  [[orchestrator.train.env]]
793
794
  name = "gsm8k"
794
795
  taskset = { id = "gsm8k-v1", dataset_name = "..." } # any v1 taskset id
795
- harness = { id = "default", runtime = { type = "subprocess" } }
796
+ harness = { id = "null", runtime = { type = "subprocess" } }
796
797
  timeout = { scoring = 10 } # per-stage cap (default: no limit)
797
798
  # pool = { type = "elastic", max_workers = 8, multiplex = 128 } # env-server pool (default elastic, self-sizing)
798
799
  ```
@@ -96,7 +96,8 @@ Harness examples (under `environments/`):
96
96
  The program that drives the rollout — same taskset, different driver:
97
97
 
98
98
  ```bash
99
- uv run eval gsm8k-v1 -n 1 # default: bare agent (MCP tools only)
99
+ uv run eval gsm8k-v1 -n 1 # default harness (fallback): a bash + edit agent
100
+ uv run eval gsm8k-v1 -n 1 --harness.id null # bare chat loop, no local tools (MCP tools only)
100
101
  uv run eval gsm8k-v1 -n 1 --harness.id rlm # the rlm harness
101
102
  uv run eval gsm8k-v1 -n 1 --harness.id codex # the codex harness
102
103
  ```
@@ -106,7 +107,7 @@ filesystem, so run it under a containerized runtime: `docker` locally, or a remo
106
107
  `modal` sandbox (not the default `subprocess`).
107
108
 
108
109
  ```bash
109
- uv run eval harbor -n 1 --taskset.ignore-dockerfile --harness.runtime.type docker --harness.id bash # bash-only agent
110
+ uv run eval harbor -n 1 --taskset.ignore-dockerfile --harness.runtime.type docker --harness.id default # the bash + edit agent
110
111
  uv run eval harbor -n 1 --taskset.ignore-dockerfile --harness.runtime.type docker --harness.id mini-swe-agent # the mini-swe-agent CLI
111
112
  uv run eval harbor -n 1 --taskset.ignore-dockerfile --harness.runtime.type docker --harness.id rlm # the rlm CLI agent
112
113
  uv run eval harbor -n 1 --taskset.ignore-dockerfile --harness.runtime.type docker --harness.id codex # the codex CLI agent
@@ -13,6 +13,7 @@ above a rule.
13
13
  import contextlib
14
14
  import time
15
15
 
16
+ from pydantic import BaseModel
16
17
  from rich.console import Console, Group
17
18
  from rich.markup import escape
18
19
  from rich.progress_bar import ProgressBar
@@ -26,7 +27,12 @@ from verifiers.v1.configs.eval import EvalConfig
26
27
  from verifiers.v1.rollout import Phase, Rollout
27
28
  from verifiers.v1.trace import Trace
28
29
  from verifiers.v1.types import Usage
29
- from verifiers.v1.utils.format import format_count, format_mean, format_time
30
+ from verifiers.v1.utils.format import (
31
+ format_count,
32
+ format_mean,
33
+ format_override,
34
+ format_time,
35
+ )
30
36
  from verifiers.utils.pricing_utils import format_cost_usd
31
37
 
32
38
  # For sizing pages to the terminal: detects the real terminal height/width each access (the live
@@ -109,9 +115,9 @@ def _aligned(rows: list[list[str]]) -> list[str]:
109
115
 
110
116
 
111
117
  def _warning(config: EvalConfig) -> Text | None:
112
- """A local-runtime caution for a code-running harness (none for the tool-less `default`),
118
+ """A local-runtime caution for a code-running harness (none for the tool-less `null`),
113
119
  shown above the overview rather than as a row in it."""
114
- if config.harness.id != "default" and config.harness.runtime.type == "subprocess":
120
+ if config.harness.id != "null" and config.harness.runtime.type == "subprocess":
115
121
  return Text(
116
122
  "warning Runs on the local system; local files and settings may affect this "
117
123
  "evaluation. Use subprocess only for debugging, or use docker or prime for an "
@@ -121,6 +127,54 @@ def _warning(config: EvalConfig) -> Text | None:
121
127
  return None
122
128
 
123
129
 
130
+ def overrides(
131
+ config: BaseModel,
132
+ default: BaseModel | None = None,
133
+ skip: frozenset[str] = frozenset(),
134
+ ) -> list[str]:
135
+ """`field=value` segments for the fields the *user* customized, sorted, diffed against each
136
+ field's declared default. Not `model_fields_set`: a `--resume` run reloads its config via
137
+ `model_validate(config.toml)`, and that toml is dumped with `exclude_none` (every field), so
138
+ `model_fields_set` would flag them all. `default` is the reference instance, threaded through
139
+ recursion so a pinned nested default (a taskset's `user=UserConfig(colocated=True)`) reads as
140
+ unchanged. `skip` holds dotted paths (`harness.runtime.type`)."""
141
+ segments: list[str] = []
142
+ fields = type(config).model_fields
143
+ for field in sorted(fields):
144
+ if field in skip:
145
+ continue
146
+ value = getattr(config, field)
147
+ # `get_default` returns `PydanticUndefined` for a required field, so it always reads as set.
148
+ field_def = (
149
+ fields[field].get_default(call_default_factory=True)
150
+ if default is None
151
+ else getattr(default, field, None)
152
+ )
153
+ if isinstance(value, BaseModel): # nested config: flatten as `field.<sub>`
154
+ child_skip = frozenset(
155
+ s[len(field) + 1 :] for s in skip if s.startswith(f"{field}.")
156
+ )
157
+ # A switched discriminator (e.g. subprocess→docker) is an override the per-field diff
158
+ # misses — within the new class `type` equals its own default — so surface it.
159
+ class_changed = type(value) is not type(field_def)
160
+ if (
161
+ class_changed
162
+ and "type" not in child_skip
163
+ and (discriminator := getattr(value, "type", None)) is not None
164
+ ):
165
+ segments.append(f"{field}.type={format_override(discriminator)}")
166
+ # A switched class is a new shape, so diff against its own defaults, not the instance.
167
+ segments.extend(
168
+ f"{field}.{seg}"
169
+ for seg in overrides(
170
+ value, default=None if class_changed else field_def, skip=child_skip
171
+ )
172
+ )
173
+ elif value != field_def:
174
+ segments.append(f"{field}={format_override(value)}")
175
+ return segments
176
+
177
+
124
178
  def Overview(config: EvalConfig) -> Table:
125
179
  sampling = ", ".join(
126
180
  f"{k}={v}" for k, v in config.sampling.model_dump(exclude_none=True).items()
@@ -134,6 +188,16 @@ def Overview(config: EvalConfig) -> Table:
134
188
  )
135
189
  model = f"{config.model} ({sampling})" if sampling else config.model
136
190
  grid.add_row("model", f"{model} via {config.client.base_url}")
191
+ # Non-default knobs the user set, one row each when non-empty. `escape` the cell: an override
192
+ # value (or our `[...]`/`{...}` delimiters) can carry Rich markup that would otherwise be
193
+ # parsed as styling and dropped. `id` is in the `env` row; harness `runtime.type` too (hidden
194
+ # here), but only for the harness — a taskset's `user.runtime.type` has no other display.
195
+ if taskset_over := overrides(config.taskset, skip=frozenset({"id"})):
196
+ grid.add_row("taskset", escape(" · ".join(taskset_over)))
197
+ if harness_over := overrides(
198
+ config.harness, skip=frozenset({"id", "runtime.type"})
199
+ ):
200
+ grid.add_row("harness", escape(" · ".join(harness_over)))
137
201
  limits, timeouts = _aligned([_limits(config), _timeouts(config)])
138
202
  grid.add_row("limits", limits)
139
203
  grid.add_row("timeouts", timeouts)
@@ -190,10 +254,12 @@ def _breakdown(done: list[Trace]) -> Table | None:
190
254
  names.extend(n for n in getattr(trace, source) if n not in names)
191
255
  if not names:
192
256
  continue
193
- segments = [
194
- f"{name} {format_mean(done, lambda t, n=name, s=source: getattr(t, s).get(n, 0.0))}"
195
- for name in names
196
- ]
257
+ segments = []
258
+ for name in names:
259
+ mean = format_mean(
260
+ done, lambda t, n=name, s=source: getattr(t, s).get(n, 0.0)
261
+ )
262
+ segments.append(f"{name} {mean}")
197
263
  grid.add_row(label, " · ".join(segments))
198
264
 
199
265
  # Resource use over every completed rollout (errored ones still spent tokens/time): tokens and
@@ -262,7 +262,11 @@ class Environment:
262
262
  "(NEEDS_CONTAINER), but the harness runs on the subprocess runtime; "
263
263
  "use --harness.runtime.type docker or prime."
264
264
  )
265
- if self.harness.config.id != "default" and isinstance(
265
+ # The warning is about the *agent* running arbitrary code on the host: every harness hands
266
+ # it local execution (bash/edit, or a CLI agent) except the tool-less `null` chat loop,
267
+ # whose program only relays the model and remote MCP tools — so exempt `null`, warn for the
268
+ # rest. (`null` still runs its fixed chat-loop program locally, but nothing agent-authored.)
269
+ if self.harness.config.id != "null" and isinstance(
266
270
  self.harness.config.runtime, SubprocessConfig
267
271
  ):
268
272
  logger.warning(
@@ -2,7 +2,6 @@
2
2
 
3
3
  Re-exports each harness's class + config off the package."""
4
4
 
5
- from verifiers.v1.harnesses.bash import BashHarness, BashHarnessConfig
6
5
  from verifiers.v1.harnesses.codex import CodexHarness, CodexHarnessConfig
7
6
  from verifiers.v1.harnesses.default import DefaultHarness, DefaultHarnessConfig
8
7
  from verifiers.v1.harnesses.kimi_code import KimiCodeHarness, KimiCodeHarnessConfig
@@ -10,18 +9,19 @@ from verifiers.v1.harnesses.mini_swe_agent import (
10
9
  MiniSWEAgentHarness,
11
10
  MiniSWEAgentHarnessConfig,
12
11
  )
12
+ from verifiers.v1.harnesses.null import NullHarness, NullHarnessConfig
13
13
  from verifiers.v1.harnesses.rlm import RLMHarness, RLMHarnessConfig
14
14
  from verifiers.v1.harnesses.terminus_2 import Terminus2Harness, Terminus2HarnessConfig
15
15
 
16
16
  __all__ = [
17
- "BashHarness",
18
- "BashHarnessConfig",
19
17
  "CodexHarness",
20
18
  "CodexHarnessConfig",
21
19
  "DefaultHarness",
22
20
  "DefaultHarnessConfig",
23
21
  "KimiCodeHarness",
24
22
  "KimiCodeHarnessConfig",
23
+ "NullHarness",
24
+ "NullHarnessConfig",
25
25
  "MiniSWEAgentHarness",
26
26
  "MiniSWEAgentHarnessConfig",
27
27
  "RLMHarness",
@@ -0,0 +1,11 @@
1
+ """default — v1's built-in agentic harness (the fallback when no `--harness.id` is given): a chat
2
+ loop with a local `bash` tool and an optional `edit` tool (single-occurrence string replacement,
3
+ on by default). Its `harness.py` (class + config) and the `program.py` script staged into the
4
+ runtime. Resolved by id via `load_harness`."""
5
+
6
+ from verifiers.v1.harnesses.default.harness import (
7
+ DefaultHarness,
8
+ DefaultHarnessConfig,
9
+ )
10
+
11
+ __all__ = ["DefaultHarness", "DefaultHarnessConfig"]
@@ -1,11 +1,11 @@
1
- """The built-in bash_edit harness: the `bash` chat loop plus a local `edit` tool.
1
+ """The built-in default harness: a chat loop with a local `bash` tool and an optional `edit` tool.
2
2
 
3
- Same growing-message-list chat loop as the `bash` harness — a local `bash` tool that runs shell
4
- commands in the runtime, plus the taskset's MCP tools — with one extra local tool: `edit`, a
5
- single-occurrence string replacement in a file (ported from the rlm `edit` skill). For agentic
6
- tasks where targeted file edits are common and a model handles `edit` more reliably than
7
- hand-built `sed`/heredoc shell. Its uv script (deps: openai, mcp) is prepared during setup, then
8
- launched as the harness program.
3
+ A growing-message-list chat loop with a local `bash` tool that runs shell commands in the runtime,
4
+ the taskset's MCP tools, and on by default, gated by the `edit` config flag — a local `edit`
5
+ tool for single-occurrence string replacement in a file (ported from the rlm `edit` skill; a model
6
+ handles it more reliably than hand-built `sed`/heredoc shell). This is the fallback harness when no
7
+ `--harness.id` is given. Its uv script (deps: openai, mcp) is prepared during setup, then launched
8
+ as the harness program. For a pure chat loop with no local tools, use the `null` harness.
9
9
  """
10
10
 
11
11
  import json
@@ -20,19 +20,25 @@ from verifiers.v1.trace import Trace
20
20
  PROGRAM_SOURCE = (Path(__file__).resolve().parent / "program.py").read_text()
21
21
 
22
22
  # Frames the model as a coding agent and names its local tools (a pure-text chat loop gets no
23
- # harness-injected prompt).
24
- BASH_EDIT_SYSTEM_PROMPT = (
25
- "You are a coding agent. You have access to a bash tool for running shell commands and "
26
- "an edit tool for single-occurrence string replacement in a file."
23
+ # harness-injected prompt). The edit clause is appended only when the `edit` tool is enabled.
24
+ BASH_SYSTEM_PROMPT = (
25
+ "You are a coding agent. You have access to a bash tool for running shell commands."
26
+ )
27
+ EDIT_SYSTEM_PROMPT = (
28
+ "You also have an edit tool for single-occurrence string replacement in a file."
27
29
  )
28
30
 
29
31
 
30
- class BashEditHarnessConfig(HarnessConfig):
31
- """The built-in bash_edit harness. A uv script (deps: openai, mcp), so it runs in any runtime
32
+ class DefaultHarnessConfig(HarnessConfig):
33
+ """The built-in default harness. A uv script (deps: openai, mcp), so it runs in any runtime
32
34
  that has `uv` (the harness bootstraps it) with no other setup."""
33
35
 
36
+ edit: bool = True
37
+ """Offer the local `edit` tool (single-occurrence string replacement in a file) alongside
38
+ `bash`. On by default; set `--harness.edit false` for a bash-only agent."""
39
+
34
40
 
35
- class BashEditHarness(Harness[BashEditHarnessConfig]):
41
+ class DefaultHarness(Harness[DefaultHarnessConfig]):
36
42
  APPENDS_SYSTEM_PROMPT = True
37
43
  SUPPORTS_MCP = True
38
44
  SUPPORTS_USER_SIM = True
@@ -51,9 +57,10 @@ class BashEditHarness(Harness[BashEditHarnessConfig]):
51
57
  mcp_urls: dict[str, str],
52
58
  ) -> ProgramResult:
53
59
  system_prompt, prompt = self.resolve_prompt(trace.task)
54
- system_prompt = "\n\n".join(
55
- p for p in (BASH_EDIT_SYSTEM_PROMPT, system_prompt) if p
56
- )
60
+ harness_prompt = BASH_SYSTEM_PROMPT
61
+ if self.config.edit:
62
+ harness_prompt = f"{BASH_SYSTEM_PROMPT} {EDIT_SYSTEM_PROMPT}"
63
+ system_prompt = "\n\n".join(p for p in (harness_prompt, system_prompt) if p)
57
64
  env = {**self.config.resolved_env}
58
65
  args = [
59
66
  f"--base-url={endpoint}",
@@ -61,6 +68,8 @@ class BashEditHarness(Harness[BashEditHarnessConfig]):
61
68
  f"--model={ctx.model}",
62
69
  f"--system-prompt={system_prompt}",
63
70
  ]
71
+ if self.config.edit:
72
+ args.append("--edit")
64
73
  if mcp_urls:
65
74
  # The program connects to the tool servers over HTTP; hand it a standard
66
75
  # `mcpServers` URL config (the `mcp` client itself comes from the uv deps).
@@ -2,13 +2,13 @@
2
2
  # requires-python = ">=3.10"
3
3
  # dependencies = ["openai", "mcp"]
4
4
  # ///
5
- """The bash_edit harness's program: a chat loop with local `bash` + `edit` tools (+ optional MCP).
5
+ """The default harness's program: a chat loop with a local `bash` tool (+ optional `edit`, MCP).
6
6
 
7
7
  A growing-message-list chat loop. It always offers a local `bash` tool that runs shell commands in
8
- the runtime and a local `edit` tool that replaces a unique string in a file; when the harness sets
9
- MCP_CONFIG (a standard `mcpServers` URL map) it also connects to those servers over streamable
10
- HTTP, exposes their tools to the model as `<server>_<tool>`, and routes those calls to the server.
11
- The loop runs until the model answers without a tool call.
8
+ the runtime; with `--edit` it also offers a local `edit` tool that replaces a unique string in a
9
+ file. When the harness sets MCP_CONFIG (a standard `mcpServers` URL map) it also connects to those
10
+ servers over streamable HTTP, exposes their tools to the model as `<server>_<tool>`, and routes
11
+ those calls to the server. The loop runs until the model answers without a tool call.
12
12
 
13
13
  It runs as a uv script (deps: openai, mcp), so the chat + tool plumbing is just the SDKs — the
14
14
  harness bootstraps `uv` in the runtime. The interception endpoint, per-rollout secret, and model
@@ -182,6 +182,7 @@ def parse_args() -> argparse.Namespace:
182
182
  parser.add_argument("--system-prompt", default="")
183
183
  parser.add_argument("--prompt", default="")
184
184
  parser.add_argument("--mcp-config", default="")
185
+ parser.add_argument("--edit", action="store_true")
185
186
  return parser.parse_args()
186
187
 
187
188
 
@@ -193,7 +194,10 @@ async def main() -> None:
193
194
  mcp_tools, dispatch = (
194
195
  await connect_mcp(stack, config) if config.get("mcpServers") else ([], {})
195
196
  )
196
- tools = [BASH_TOOL, EDIT_TOOL] + mcp_tools
197
+ tools = [BASH_TOOL]
198
+ if args.edit:
199
+ tools.append(EDIT_TOOL)
200
+ tools += mcp_tools
197
201
  messages = (
198
202
  [{"role": "system", "content": args.system_prompt}]
199
203
  if args.system_prompt
@@ -226,13 +230,24 @@ async def main() -> None:
226
230
  }
227
231
  )
228
232
  continue
233
+ # Valid JSON can still be a non-object (`[]`, `42`, `null`); the `.get(...)` calls
234
+ # below assume a dict, so reject anything else as a tool error rather than crashing.
235
+ if not isinstance(tool_args, dict):
236
+ messages.append(
237
+ {
238
+ "role": "tool",
239
+ "tool_call_id": call.id,
240
+ "content": f"error: tool arguments must be a JSON object, got {type(tool_args).__name__}; resend as an object",
241
+ }
242
+ )
243
+ continue
229
244
  if name in dispatch:
230
245
  content = await call_mcp(dispatch, name, tool_args)
231
246
  elif name == "bash":
232
247
  content = await asyncio.to_thread(
233
248
  run_bash, tool_args.get("command", "")
234
249
  )
235
- elif name == "edit":
250
+ elif name == "edit" and args.edit:
236
251
  content = await asyncio.to_thread(
237
252
  run_edit,
238
253
  tool_args.get("path"),
@@ -0,0 +1,7 @@
1
+ """null — v1's built-in tool-less harness: its `harness.py` (class + config) and the
2
+ `program.py` script it stages into the runtime. A plain chat loop with the taskset's MCP tools
3
+ and no tools of its own. Resolved by id via `load_harness`."""
4
+
5
+ from verifiers.v1.harnesses.null.harness import NullHarness, NullHarnessConfig
6
+
7
+ __all__ = ["NullHarness", "NullHarnessConfig"]
@@ -1,9 +1,10 @@
1
- """The built-in default harness: runs a small chat-loop program as a uv script.
1
+ """The built-in null harness: runs a small chat-loop program as a uv script, no tools of its own.
2
2
 
3
3
  A growing-message-list chat loop with the taskset's MCP tools (host-side, resolved to URLs by
4
- the Environment) — and no tools of its own. Its uv script (deps: openai, mcp) is prepared
5
- during setup, then launched as the harness program. For a shell-driving agent, use a
6
- dedicated agentic harness (e.g. `mini-swe-agent`).
4
+ the Environment) — and no tools of its own (it's "null" precisely because it adds no
5
+ harness-side tooling). Its uv script (deps: openai, mcp) is prepared during setup, then launched
6
+ as the harness program. For a shell-driving agent, use a dedicated agentic harness (e.g.
7
+ `mini-swe-agent`).
7
8
  """
8
9
 
9
10
  import json
@@ -18,12 +19,12 @@ from verifiers.v1.trace import Trace
18
19
  PROGRAM_SOURCE = (Path(__file__).resolve().parent / "program.py").read_text()
19
20
 
20
21
 
21
- class DefaultHarnessConfig(HarnessConfig):
22
- """The built-in harness. A uv script (deps: openai, mcp), so it runs in any runtime that
22
+ class NullHarnessConfig(HarnessConfig):
23
+ """The built-in null harness. A uv script (deps: openai, mcp), so it runs in any runtime that
23
24
  has `uv` (the harness bootstraps it) with no other setup."""
24
25
 
25
26
 
26
- class DefaultHarness(Harness[DefaultHarnessConfig]):
27
+ class NullHarness(Harness[NullHarnessConfig]):
27
28
  APPENDS_SYSTEM_PROMPT = True
28
29
  SUPPORTS_MCP = True
29
30
  SUPPORTS_USER_SIM = True
@@ -2,7 +2,7 @@
2
2
  # requires-python = ">=3.10"
3
3
  # dependencies = ["openai", "mcp"]
4
4
  # ///
5
- """The default harness's program: a chat loop with the taskset's MCP tools (and none of its own).
5
+ """The null harness's program: a chat loop with the taskset's MCP tools (and none of its own).
6
6
 
7
7
  A growing-message-list chat loop. When the harness sets MCP_CONFIG (a standard `mcpServers` URL
8
8
  map) it connects to those servers over streamable HTTP, exposes their tools to the model as
@@ -142,6 +142,17 @@ async def main() -> None:
142
142
  }
143
143
  )
144
144
  continue
145
+ # Valid JSON can still be a non-object (`[]`, `42`, `null`); the MCP dispatch
146
+ # assumes a dict, so reject anything else as a tool error rather than crashing.
147
+ if not isinstance(tool_args, dict):
148
+ messages.append(
149
+ {
150
+ "role": "tool",
151
+ "tool_call_id": call.id,
152
+ "content": f"error: tool arguments must be a JSON object, got {type(tool_args).__name__}; resend as an object",
153
+ }
154
+ )
155
+ continue
145
156
  if name in dispatch:
146
157
  content = await call_mcp(dispatch, name, tool_args)
147
158
  else:
@@ -130,8 +130,9 @@ def harness_class(harness_id: str) -> type[Harness]:
130
130
  def default_harness_id(taskset_id: str) -> str:
131
131
  """The harness id to use when none is given. A taskset that bundles its own harness — its
132
132
  module also exports a `Harness` subclass via `__all__`, so the taskset id doubles as the
133
- harness id — runs with that harness by default; otherwise the shared `default` harness. An
134
- explicit `--harness.id` / toml id always takes precedence (this only supplies the fallback)."""
133
+ harness id — runs with that harness by default; otherwise the shared `default` harness (a
134
+ bash + edit agent). An explicit `--harness.id` / toml id always takes precedence (this only
135
+ supplies the fallback); for a tool-less chat loop, pass `--harness.id null`."""
135
136
  if not taskset_id:
136
137
  return "default"
137
138
  try:
@@ -34,6 +34,15 @@ def format_count(n: int) -> str:
34
34
  return f"{n / 1e6:.1f}M"
35
35
 
36
36
 
37
+ def format_override(value: object) -> str:
38
+ """A value as one compact segment: dict `{k=v,k=v}`, list/tuple `[a,b]`, else `str`."""
39
+ if isinstance(value, dict):
40
+ return "{" + ",".join(f"{k}={v}" for k, v in value.items()) + "}"
41
+ if isinstance(value, (list, tuple)):
42
+ return "[" + ",".join(str(v) for v in value) + "]"
43
+ return str(value)
44
+
45
+
37
46
  def format_mean(
38
47
  traces: list[Trace], value: Callable[[Trace], float], digits: int = 2
39
48
  ) -> str:
@@ -1,7 +0,0 @@
1
- """bash — v1's built-in agentic harness: the `default` chat loop plus a single local `bash`
2
- tool. Its `harness.py` (class + config) and the `program.py` script staged into the runtime.
3
- Resolved by id via `load_harness`."""
4
-
5
- from verifiers.v1.harnesses.bash.harness import BashHarness, BashHarnessConfig
6
-
7
- __all__ = ["BashHarness", "BashHarnessConfig"]