verifiers 0.1.15.dev421__tar.gz → 0.1.15.dev423__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 (413) hide show
  1. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/PKG-INFO +1 -1
  2. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/pyproject.toml +1 -0
  3. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_sandbox_debug_env.py +2 -1
  4. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/sandbox_debug_env.py +10 -1
  5. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/swe_debug_env.py +5 -2
  6. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/GUIDE.md +35 -6
  7. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/README.md +2 -1
  8. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/cli/dashboard/eval.py +19 -7
  9. verifiers-0.1.15.dev423/verifiers/v1/cli/debug.py +327 -0
  10. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/cli/output.py +7 -10
  11. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/cli/validate.py +111 -19
  12. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/configs/__init__.py +2 -1
  13. verifiers-0.1.15.dev423/verifiers/v1/configs/debug.py +72 -0
  14. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/configs/validate.py +26 -4
  15. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/runtimes/base.py +23 -17
  16. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/runtimes/modal.py +8 -4
  17. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/runtimes/prime.py +3 -3
  18. verifiers-0.1.15.dev423/verifiers/v1/utils/aio.py +31 -0
  19. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/.gitignore +0 -0
  20. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/LICENSE +0 -0
  21. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/README.md +0 -0
  22. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/AGENTS.md +0 -0
  23. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/README.md +0 -0
  24. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/__init__.py +0 -0
  25. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/conftest.py +0 -0
  26. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_browser_env.py +0 -0
  27. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_build_script.py +0 -0
  28. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_cli_agent_env.py +0 -0
  29. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_client_auth_errors.py +0 -0
  30. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_client_config.py +0 -0
  31. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_client_multimodal_types.py +0 -0
  32. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_composable_env.py +0 -0
  33. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_context_token_metrics.py +0 -0
  34. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_decorator_ranks.py +0 -0
  35. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_endpoint_registry.py +0 -0
  36. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_env_group.py +0 -0
  37. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_env_server.py +0 -0
  38. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_environment.py +0 -0
  39. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_environment_extra.py +0 -0
  40. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_envs.py +0 -0
  41. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_error_chain.py +0 -0
  42. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_eval_display.py +0 -0
  43. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_eval_utils.py +0 -0
  44. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_gepa_cli.py +0 -0
  45. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_gepa_utils.py +0 -0
  46. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_gym_env.py +0 -0
  47. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_harbor_env_mcp.py +0 -0
  48. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_imports.py +0 -0
  49. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_init_script.py +0 -0
  50. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_install_utils.py +0 -0
  51. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_interception_utils.py +0 -0
  52. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_logging.py +0 -0
  53. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_math_rubric.py +0 -0
  54. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_maybe_think_parser.py +0 -0
  55. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_message_utils.py +0 -0
  56. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_message_utils_multimodal.py +0 -0
  57. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_multiturn_env.py +0 -0
  58. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_nemorl_client.py +0 -0
  59. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_openai_chat_completions_token_client.py +0 -0
  60. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_openai_responses_client.py +0 -0
  61. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_opencode_rlm_env.py +0 -0
  62. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_openenv_client.py +0 -0
  63. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_parser.py +0 -0
  64. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_path_utils.py +0 -0
  65. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_per_turn_timing.py +0 -0
  66. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_pricing_utils.py +0 -0
  67. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_prime_plugin.py +0 -0
  68. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_renderer_client.py +0 -0
  69. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_renderer_e2e.py +0 -0
  70. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_rlm_composable_env.py +0 -0
  71. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_rubric.py +0 -0
  72. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_rubric_group.py +0 -0
  73. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_sandbox_env.py +0 -0
  74. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_sandbox_mixin.py +0 -0
  75. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_save_utils.py +0 -0
  76. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_setup_script.py +0 -0
  77. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_singleturn_env.py +0 -0
  78. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_stateful_tool_env.py +0 -0
  79. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_think_parser.py +0 -0
  80. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_tool_env.py +0 -0
  81. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_tool_utils.py +0 -0
  82. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_trajectory_processing.py +0 -0
  83. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_tui_info_formatting.py +0 -0
  84. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_types.py +0 -0
  85. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_wordle_env.py +0 -0
  86. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/test_xml_parser.py +0 -0
  87. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/v1/conftest.py +0 -0
  88. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  89. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  90. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/v1/fixtures/echo_multi_v0.py +0 -0
  91. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  92. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  93. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/v1/fixtures/echo_v0.py +0 -0
  94. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/v1/fixtures/echo_v1.py +0 -0
  95. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/v1/fixtures/pyproject.toml +0 -0
  96. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  97. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/v1/test_color_codeword_tasks.py +0 -0
  98. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/v1/test_configs.py +0 -0
  99. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/v1/test_e2e.py +0 -0
  100. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/v1/test_envs.py +0 -0
  101. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/v1/test_graph.py +0 -0
  102. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/v1/test_judges.py +0 -0
  103. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/v1/test_legacy.py +0 -0
  104. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/v1/test_scoring.py +0 -0
  105. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/tests/v1/test_trace.py +0 -0
  106. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/AGENTS.md +0 -0
  107. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/__init__.py +0 -0
  108. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/cli/__init__.py +0 -0
  109. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/cli/commands/__init__.py +0 -0
  110. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/cli/commands/build.py +0 -0
  111. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/cli/commands/eval.py +0 -0
  112. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/cli/commands/gepa.py +0 -0
  113. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/cli/commands/init.py +0 -0
  114. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/cli/commands/install.py +0 -0
  115. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/cli/commands/setup.py +0 -0
  116. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/cli/plugins/__init__.py +0 -0
  117. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/cli/plugins/prime.py +0 -0
  118. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/cli/tui.py +0 -0
  119. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/clients/__init__.py +0 -0
  120. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/clients/anthropic_messages_client.py +0 -0
  121. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/clients/client.py +0 -0
  122. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
  123. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/clients/openai_chat_completions_client.py +0 -0
  124. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
  125. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/clients/openai_completions_client.py +0 -0
  126. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/clients/openai_responses_client.py +0 -0
  127. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/clients/renderer_client.py +0 -0
  128. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/decorators.py +0 -0
  129. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/AGENTS.md +0 -0
  130. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/__init__.py +0 -0
  131. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/env_group.py +0 -0
  132. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/environment.py +0 -0
  133. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/README.md +0 -0
  134. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/__init__.py +0 -0
  135. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/cli_agent_env.py +0 -0
  136. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/README.md +0 -0
  137. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/__init__.py +0 -0
  138. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/_filter.py +0 -0
  139. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/composable_env.py +0 -0
  140. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/harness.py +0 -0
  141. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
  142. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  143. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
  144. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
  145. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
  146. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/task.py +0 -0
  147. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
  148. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  149. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  150. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  151. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  152. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  153. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  154. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  155. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  156. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  157. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
  158. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
  159. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
  160. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
  161. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
  162. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
  163. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
  164. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
  165. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/__init__.py +0 -0
  166. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/tool_pdf.py +0 -0
  167. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +0 -0
  168. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
  169. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/__init__.py +0 -0
  170. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/base_client.py +0 -0
  171. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +0 -0
  172. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/cache_prompts.py +0 -0
  173. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +0 -0
  174. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/cache_filesys.py +0 -0
  175. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/load_eval_script.py +0 -0
  176. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +0 -0
  177. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/tool_visit.py +0 -0
  178. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/url_tools.py +0 -0
  179. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +0 -0
  180. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
  181. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
  182. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
  183. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
  184. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
  185. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
  186. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
  187. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  188. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  189. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  190. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  191. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  192. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  193. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  194. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  195. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  196. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  197. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  198. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  199. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  200. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  201. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  202. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  203. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  204. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  205. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  206. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  207. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  208. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  209. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  210. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/gym_env.py +0 -0
  211. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
  212. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/harbor_env/env.py +0 -0
  213. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
  214. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/mcp_env.py +0 -0
  215. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/opencode_env.py +0 -0
  216. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
  217. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
  218. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
  219. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/utils/__init__.py +0 -0
  220. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/utils/file_locks.py +0 -0
  221. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
  222. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/integrations/README.md +0 -0
  223. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/integrations/__init__.py +0 -0
  224. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/integrations/browser_env/README.md +0 -0
  225. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
  226. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
  227. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
  228. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
  229. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  230. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  231. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/integrations/openenv_env.py +0 -0
  232. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
  233. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/integrations/textarena_env.py +0 -0
  234. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/multiturn_env.py +0 -0
  235. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/python_env.py +0 -0
  236. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/sandbox_env.py +0 -0
  237. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/singleturn_env.py +0 -0
  238. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/stateful_tool_env.py +0 -0
  239. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/envs/tool_env.py +0 -0
  240. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/errors.py +0 -0
  241. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/gepa/__init__.py +0 -0
  242. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/gepa/adapter.py +0 -0
  243. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/gepa/config.py +0 -0
  244. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/gepa/display.py +0 -0
  245. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/gepa/gepa_utils.py +0 -0
  246. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/parsers/__init__.py +0 -0
  247. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/parsers/maybe_think_parser.py +0 -0
  248. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/parsers/parser.py +0 -0
  249. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/parsers/think_parser.py +0 -0
  250. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/parsers/xml_parser.py +0 -0
  251. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/rl/README.md +0 -0
  252. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/rl/__init__.py +0 -0
  253. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/rl/inference/__init__.py +0 -0
  254. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/rl/inference/client.py +0 -0
  255. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/rl/inference/server.py +0 -0
  256. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/rl/trainer/__init__.py +0 -0
  257. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/rl/trainer/config.py +0 -0
  258. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/rl/trainer/orchestrator.py +0 -0
  259. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/rl/trainer/trainer.py +0 -0
  260. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/rl/trainer/utils.py +0 -0
  261. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/rubrics/__init__.py +0 -0
  262. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
  263. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/rubrics/judge_rubric.py +0 -0
  264. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/rubrics/math_rubric.py +0 -0
  265. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/rubrics/rubric.py +0 -0
  266. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/rubrics/rubric_group.py +0 -0
  267. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/scripts/__init__.py +0 -0
  268. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/scripts/build.py +0 -0
  269. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/scripts/eval.py +0 -0
  270. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/scripts/gepa.py +0 -0
  271. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/scripts/init.py +0 -0
  272. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/scripts/install.py +0 -0
  273. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/scripts/rl.py +0 -0
  274. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/scripts/setup.py +0 -0
  275. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/scripts/train.py +0 -0
  276. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/scripts/tui.py +0 -0
  277. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/scripts/vllm.py +0 -0
  278. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/serve/__init__.py +0 -0
  279. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/serve/client/env_client.py +0 -0
  280. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/serve/client/zmq_env_client.py +0 -0
  281. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/serve/server/__init__.py +0 -0
  282. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/serve/server/env_router.py +0 -0
  283. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/serve/server/env_server.py +0 -0
  284. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/serve/server/env_worker.py +0 -0
  285. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/serve/server/zmq_env_server.py +0 -0
  286. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/serve/types.py +0 -0
  287. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/types.py +0 -0
  288. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/utils/__init__.py +0 -0
  289. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/utils/async_utils.py +0 -0
  290. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/utils/client_utils.py +0 -0
  291. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/utils/config_utils.py +0 -0
  292. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/utils/data_utils.py +0 -0
  293. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/utils/display_utils.py +0 -0
  294. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/utils/env_config_utils.py +0 -0
  295. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/utils/env_utils.py +0 -0
  296. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/utils/error_utils.py +0 -0
  297. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/utils/eval_display.py +0 -0
  298. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/utils/eval_utils.py +0 -0
  299. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/utils/heartbeat.py +0 -0
  300. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/utils/import_utils.py +0 -0
  301. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/utils/install_utils.py +0 -0
  302. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/utils/interception_utils.py +0 -0
  303. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/utils/logging_utils.py +0 -0
  304. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/utils/message_utils.py +0 -0
  305. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/utils/metric_utils.py +0 -0
  306. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/utils/path_utils.py +0 -0
  307. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/utils/pricing_utils.py +0 -0
  308. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/utils/process_utils.py +0 -0
  309. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/utils/response_utils.py +0 -0
  310. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/utils/save_utils.py +0 -0
  311. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/utils/serve_utils.py +0 -0
  312. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/utils/thread_utils.py +0 -0
  313. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/utils/threaded_sandbox_client.py +0 -0
  314. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/utils/tool_utils.py +0 -0
  315. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/utils/usage_utils.py +0 -0
  316. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/utils/version_utils.py +0 -0
  317. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/ARCHITECTURE.md +0 -0
  318. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/__init__.py +0 -0
  319. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/cli/__init__.py +0 -0
  320. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  321. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/cli/dashboard/base.py +0 -0
  322. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/cli/dashboard/validate.py +0 -0
  323. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/cli/eval/__init__.py +0 -0
  324. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/cli/eval/main.py +0 -0
  325. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/cli/eval/resume.py +0 -0
  326. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/cli/eval/runner.py +0 -0
  327. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/cli/init.py +0 -0
  328. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/cli/resolve.py +0 -0
  329. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/cli/serve.py +0 -0
  330. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/clients/__init__.py +0 -0
  331. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/clients/client.py +0 -0
  332. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/clients/config.py +0 -0
  333. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/clients/eval.py +0 -0
  334. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/clients/train.py +0 -0
  335. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/configs/eval.py +0 -0
  336. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/configs/init.py +0 -0
  337. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/configs/serve.py +0 -0
  338. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/decorators.py +0 -0
  339. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/dialects/__init__.py +0 -0
  340. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/dialects/anthropic.py +0 -0
  341. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/dialects/base.py +0 -0
  342. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/dialects/chat.py +0 -0
  343. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/dialects/responses.py +0 -0
  344. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/env.py +0 -0
  345. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/episode.py +0 -0
  346. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/errors.py +0 -0
  347. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/graph.py +0 -0
  348. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/harness.py +0 -0
  349. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/harnesses/__init__.py +0 -0
  350. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  351. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/harnesses/codex/harness.py +0 -0
  352. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/harnesses/default/__init__.py +0 -0
  353. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/harnesses/default/harness.py +0 -0
  354. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/harnesses/default/program.py +0 -0
  355. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  356. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  357. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  358. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  359. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  360. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/harnesses/null/__init__.py +0 -0
  361. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/harnesses/null/harness.py +0 -0
  362. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/harnesses/null/program.py +0 -0
  363. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  364. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  365. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  366. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  367. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  368. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/interception/__init__.py +0 -0
  369. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/interception/pool.py +0 -0
  370. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/interception/server.py +0 -0
  371. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/judge.py +0 -0
  372. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/judges/__init__.py +0 -0
  373. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/judges/reference.py +0 -0
  374. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/judges/reference.txt +0 -0
  375. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/judges/rubric.py +0 -0
  376. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/judges/rubric.txt +0 -0
  377. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/legacy.py +0 -0
  378. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/loaders.py +0 -0
  379. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/mcp/__init__.py +0 -0
  380. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/mcp/launch.py +0 -0
  381. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/mcp/server.py +0 -0
  382. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/mcp/toolset.py +0 -0
  383. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/mcp/user.py +0 -0
  384. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/retries.py +0 -0
  385. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/rollout.py +0 -0
  386. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/runtimes/__init__.py +0 -0
  387. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/runtimes/docker.py +0 -0
  388. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/runtimes/limiters.py +0 -0
  389. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/runtimes/subprocess.py +0 -0
  390. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/scoring.py +0 -0
  391. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/serve/__init__.py +0 -0
  392. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/serve/client.py +0 -0
  393. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/serve/pool.py +0 -0
  394. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/serve/server.py +0 -0
  395. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/serve/types.py +0 -0
  396. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/state.py +0 -0
  397. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/task.py +0 -0
  398. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/taskset.py +0 -0
  399. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/tasksets/__init__.py +0 -0
  400. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  401. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  402. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  403. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  404. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  405. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  406. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  407. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/trace.py +0 -0
  408. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/types.py +0 -0
  409. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/utils/__init__.py +0 -0
  410. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/utils/format.py +0 -0
  411. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/utils/install.py +0 -0
  412. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/verifiers/v1/utils/logging.py +0 -0
  413. {verifiers-0.1.15.dev421 → verifiers-0.1.15.dev423}/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.dev421
3
+ Version: 0.1.15.dev423
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
@@ -166,6 +166,7 @@ flash-attn = { FLASH_ATTENTION_SKIP_CUDA_BUILD = "TRUE" }
166
166
  vf-eval = "verifiers.scripts.eval:main"
167
167
  eval = "verifiers.v1.cli.eval.main:main"
168
168
  validate = "verifiers.v1.cli.validate:main"
169
+ debug = "verifiers.v1.cli.debug:main"
169
170
  serve = "verifiers.v1.cli.serve:main"
170
171
  init = "verifiers.v1.cli.init:main"
171
172
  vf-gepa = "verifiers.scripts.gepa:main"
@@ -33,12 +33,13 @@ def test_swe_debug_env_is_deprecated_subclass_not_alias():
33
33
  assert issubclass(SWEDebugEnv, SandboxDebugEnv)
34
34
  assert SandboxDebugRubric.__name__ == "SandboxDebugRubric"
35
35
 
36
- with pytest.warns(DeprecationWarning, match="use SandboxDebugEnv"):
36
+ with pytest.warns(DeprecationWarning, match="native v1 `debug` CLI") as warnings:
37
37
  env = SWEDebugEnv(
38
38
  DummySandboxTaskSet(),
39
39
  debug_step="command",
40
40
  debug_command="true",
41
41
  )
42
42
 
43
+ assert len(warnings) == 1
43
44
  assert isinstance(env, SandboxDebugEnv)
44
45
  assert env.labels == ["sandbox-debug"]
@@ -2,7 +2,8 @@
2
2
 
3
3
  import shlex
4
4
  import time
5
- from typing import Any, Literal
5
+ from typing import Any, ClassVar, Literal
6
+ from warnings import warn
6
7
 
7
8
  import verifiers as vf
8
9
  from prime_sandboxes import CreateSandboxRequest
@@ -38,6 +39,8 @@ class SandboxDebugEnv(SandboxMixin, vf.MultiTurnEnv):
38
39
  - exit: optionally run task tests and score them
39
40
  """
40
41
 
42
+ emit_deprecation_warning: ClassVar[bool] = True
43
+
41
44
  def __init__(
42
45
  self,
43
46
  taskset: SandboxTaskSet,
@@ -59,6 +62,12 @@ class SandboxDebugEnv(SandboxMixin, vf.MultiTurnEnv):
59
62
  output_tail_chars: int = 2000,
60
63
  **sandbox_kwargs: Any,
61
64
  ):
65
+ if self.emit_deprecation_warning:
66
+ warn(
67
+ "SandboxDebugEnv is deprecated; use the native v1 `debug` CLI for v1 tasksets.",
68
+ DeprecationWarning,
69
+ stacklevel=2,
70
+ )
62
71
  if debug_step not in ("none", "gold_patch", "command", "script"):
63
72
  raise ValueError(f"Unsupported debug_step: {debug_step!r}")
64
73
  if debug_step == "command" and not debug_command:
@@ -11,7 +11,8 @@ class SWEDebugRubric(SandboxDebugRubric):
11
11
 
12
12
  def __init__(self, **kwargs: Any):
13
13
  warn(
14
- "SWEDebugRubric is deprecated; use SandboxDebugRubric.",
14
+ "SWEDebugRubric is deprecated with the composable debug envs; use the "
15
+ "native v1 `debug` CLI for v1 tasksets.",
15
16
  DeprecationWarning,
16
17
  stacklevel=2,
17
18
  )
@@ -21,9 +22,11 @@ class SWEDebugRubric(SandboxDebugRubric):
21
22
  class SWEDebugEnv(SandboxDebugEnv):
22
23
  """Deprecated wrapper for SandboxDebugEnv."""
23
24
 
25
+ emit_deprecation_warning = False
26
+
24
27
  def __init__(self, *args: Any, **kwargs: Any):
25
28
  warn(
26
- "SWEDebugEnv is deprecated; use SandboxDebugEnv.",
29
+ "SWEDebugEnv is deprecated; use the native v1 `debug` CLI for v1 tasksets.",
27
30
  DeprecationWarning,
28
31
  stacklevel=2,
29
32
  )
@@ -767,8 +767,9 @@ pass `docker` / `prime` / `modal`.
767
767
 
768
768
  # CLI reference
769
769
 
770
- Three commands, all `uv run <cmd>`: **`eval`** (run + score a model), **`validate`** (model-free
771
- gold check), **`init`** (scaffold). They share a resolution layer:
770
+ Four commands, all `uv run <cmd>`: **`eval`** (run + score a model), **`validate`**
771
+ (model-free setup/gold checks), **`debug`** (setup + one shell action), **`init`**
772
+ (scaffold). They share a resolution layer:
772
773
 
773
774
  - **Positional id** — a leading bare token is the taskset id: `eval gsm8k-v1` == `eval --taskset.id
774
775
  gsm8k-v1` (for `init` it's the env name).
@@ -823,19 +824,24 @@ trace per line, appended as each rollout finishes — durable mid-run), and `eva
823
824
 
824
825
  ## `validate`
825
826
 
826
- Run each task's `validate` hook — a model-free check that the ground truth holds (the gold patch
827
- makes the tests pass, the verifier accepts the gold answer) in a runtime with the taskset's
828
- `setup` applied. No model, no harness.
827
+ Model-free checks that a task is sound. By default each task gets two independent
828
+ runtimes a **gold** check (the taskset's `setup` then its `validate` hook: the gold patch
829
+ makes the tests pass, the verifier accepts the gold answer) and a **setup-only** check —
830
+ reported as one aggregate row. Restrict to one check with `--only-gold` / `--only-setup`.
831
+ No model, no harness.
829
832
 
830
833
  ```bash
831
834
  uv run validate gsm8k-v1 -n 20 --runtime.type subprocess
835
+ uv run validate swebench-v1 -n 1 --runtime.type prime --only-setup
836
+ uv run validate swebench-v1 -n 1 --runtime.type prime --only-gold
832
837
  ```
833
838
 
834
839
  | flag | default | meaning |
835
840
  | --- | --- | --- |
836
841
  | `<taskset-id>` / `--taskset.id` | — | taskset to validate |
837
842
  | `--runtime.type` | `docker` | runtime for `setup` + `validate` (a gold check often needs the task's container) |
838
- | `--setup-timeout` / `--validate-timeout` | None | per-hook wall-clock caps |
843
+ | `--only-setup` / `--only-gold` | off | run just the setup-only or just the gold check (default: both) |
844
+ | `--timeout.setup` / `--timeout.total` | None | per-task wall-clock caps for `setup` and the `validate` hook |
839
845
  | `-n`/`--num-tasks`, `-s`/`--shuffle`, `-c`/`--max-concurrent` (128) | | task selection + concurrency |
840
846
  | `-v`/`--verbose`, `--no-rich` | | logging / disable the dashboard |
841
847
 
@@ -845,6 +851,29 @@ captured as a result row (one bad task is data, not a crash) with reason `valid`
845
851
  default runtime is **docker** (unlike eval's subprocess), and a subprocess runtime against a
846
852
  `NEEDS_CONTAINER` / image-bearing taskset aborts with a clear error.
847
853
 
854
+ ## `debug`
855
+
856
+ Set up each selected task, run one explicit shell action, and save the trace. This is for
857
+ inspecting task state without a model: it does not apply gold patches, call `validate`, run
858
+ `finalize`, or score rewards.
859
+
860
+ ```bash
861
+ uv run debug swebench-v1 -n 1 --runtime.type prime --command 'pwd; git status --short | head'
862
+ uv run debug swebench-v1 -n 1 --runtime.type prime --script-path ./inspect.sh
863
+ ```
864
+
865
+ | flag | default | meaning |
866
+ | --- | --- | --- |
867
+ | `<taskset-id>` / `--taskset.id` | — | taskset to debug |
868
+ | `--command` / `--script-path` | — | exactly one inline command or host script to upload and execute |
869
+ | `--runtime.type` | `docker` | runtime for setup + the debug action |
870
+ | `--timeout.setup` / `--timeout.total` | None | per-task wall-clock caps for `setup` and the debug action |
871
+ | `-n`/`--num-tasks`, `-s`/`--shuffle`, `-c`/`--max-concurrent` (128) | | task selection + concurrency |
872
+ | `-o`/`--output-dir` | fresh debug run dir | where `config.toml` and `results.jsonl` are written |
873
+
874
+ Each saved trace has command/script metadata, exit status, elapsed time, timeout/error fields,
875
+ and the full stdout/stderr under `trace.info["debug"]`.
876
+
848
877
  ## `init`
849
878
 
850
879
  Scaffold a new v1 environment package under `--path` (default `./environments`), following the
@@ -41,7 +41,8 @@ uv sync --python 3.12 --extra harbor
41
41
  ```bash
42
42
  uv run init my-task-v1 # scaffold a new environment (--add-tool/--add-user/--add-harness)
43
43
  uv run eval gsm8k-v1 -n 5 -r 3 # single-turn math; default harness; subprocess runtime
44
- uv run validate gsm8k-v1 -n 5 # model-free: run each task's gold check (the `validate` hook)
44
+ uv run validate gsm8k-v1 -n 5 # model-free gold + setup-only checks (--only-gold / --only-setup)
45
+ uv run debug gsm8k-v1 -n 1 --command 'pwd' # setup, run one shell action, save traces
45
46
  uv run eval -h # typed help (+ the local example tasksets/harnesses)
46
47
  ```
47
48
 
@@ -497,16 +497,22 @@ def Rows(groups: list[list[Rollout]], now: float, runtime_type: str) -> Table:
497
497
 
498
498
  class Pager:
499
499
  """Which page of overflowing rollout rows is on screen. Auto-advances on a timer until the
500
- user takes over with the left/right arrows, after which it stays where they leave it. `count`
501
- (the page count, set each render by `_paginate`) gates the arrows: they're inert while a single
502
- page fits, so a stray press before rollouts overflow can't switch off auto-advance or offset the
503
- starting page once paging begins. The chosen page is clamped to `count` (it can shrink on a
504
- resize; it otherwise only grows, as rollouts are never removed)."""
500
+ user takes over with the left/right arrows, after which it stays where they leave it. Paging
501
+ opens on the first page: the timer is anchored to `origin` (the clock at the first paged frame),
502
+ so `int((now - origin) / _PAGE_SECONDS)` is 0 when paging begins and rotates from there, rather
503
+ than off the raw wall clock (which would open on an arbitrary page). `_paginate` clears `origin`
504
+ whenever everything fits on one page, so paging re-anchors and re-opens on page 1 if rollouts
505
+ overflow again after a resize. `count` (the page count, set each render by `_paginate`) gates the
506
+ arrows: they're inert while a single page fits, so a stray press before rollouts overflow can't
507
+ switch off auto-advance or offset the starting page once paging begins. The chosen page is
508
+ clamped to `count` (it can shrink on a resize; it otherwise only grows, as rollouts are never
509
+ removed)."""
505
510
 
506
511
  def __init__(self) -> None:
507
512
  self.page = 0
508
513
  self.manual = False
509
514
  self.count = 1
515
+ self.origin: float | None = None
510
516
 
511
517
  def on_key(self, key: str) -> None:
512
518
  if key in ("left", "right") and self.count > 1:
@@ -517,7 +523,10 @@ class Pager:
517
523
  # Track the auto page while it drives, so the first arrow continues from what's on screen
518
524
  # rather than jumping back to page 1. Clamp in manual mode (count can shrink on resize).
519
525
  if not self.manual:
520
- self.page = int(now / _PAGE_SECONDS) % self.count
526
+ # Anchor the timer to the first paged frame, so paging opens on page 1 then rotates.
527
+ if self.origin is None:
528
+ self.origin = now
529
+ self.page = int((now - self.origin) / _PAGE_SECONDS) % self.count
521
530
  else:
522
531
  self.page = max(0, min(self.page, self.count - 1))
523
532
  return self.page
@@ -530,7 +539,10 @@ def _paginate(
530
539
  selecting the one `pager` points at. Returns (this page's groups, 0-based index, page count) —
531
540
  a single page when everything already fits."""
532
541
  if sum(len(g) for g in groups) <= rows_per_page:
533
- pager.count = 1 # everything fits on one page arrows stay inert
542
+ # Everything fits: arrows stay inert, and clear the anchor so paging re-opens on page 1 if
543
+ # rollouts overflow again later (e.g. a terminal resize) rather than off the stale origin.
544
+ pager.count = 1
545
+ pager.origin = None
534
546
  return groups, 0, 1
535
547
  pages: list[list[list[Rollout]]] = []
536
548
  current: list[list[Rollout]] = []
@@ -0,0 +1,327 @@
1
+ """The debug entrypoint: setup tasks, run one shell action, and persist traces."""
2
+
3
+ import asyncio
4
+ import contextlib
5
+ import logging
6
+ import random
7
+ import shlex
8
+ import signal
9
+ import sys
10
+ import time
11
+ import traceback
12
+ from collections.abc import Awaitable
13
+ from pathlib import Path
14
+ from typing import Any
15
+ from uuid import uuid4
16
+
17
+ from pydantic_config import cli
18
+
19
+ import verifiers.v1 as vf
20
+ from verifiers.v1.cli.output import append_trace, save_config
21
+ from verifiers.v1.cli.resolve import (
22
+ extract_id,
23
+ references_config_file,
24
+ with_positional_taskset,
25
+ )
26
+ from verifiers.v1.configs.debug import DebugConfig
27
+ from verifiers.v1.decorators import invoke
28
+ from verifiers.v1.env import resolve_runtime_config
29
+ from verifiers.v1.runtimes import ProgramResult, Runtime, make_runtime
30
+ from verifiers.v1.state import state_cls
31
+ from verifiers.v1.taskset import Taskset
32
+ from verifiers.v1.trace import Error, Trace
33
+ from verifiers.v1.utils.logging import setup_logging
34
+
35
+ logger = logging.getLogger(__name__)
36
+
37
+ USAGE = (
38
+ "usage: uv run debug [<taskset-id>] (--command <cmd> | --script-path <path>) "
39
+ "[--runtime.type subprocess] [options] [@ file.toml]\n"
40
+ " runs setup, then one command or uploaded host script, and saves traces"
41
+ )
42
+
43
+
44
+ def _narrow(argv: list[str]) -> type[DebugConfig]:
45
+ """`DebugConfig` with `taskset` narrowed to the config type of the id on the CLI."""
46
+ taskset_id = extract_id(argv, "taskset")
47
+ if not taskset_id:
48
+ return DebugConfig
49
+ ftype = vf.taskset_config_type(taskset_id)
50
+ return type(
51
+ DebugConfig.__name__,
52
+ (DebugConfig,),
53
+ {"__annotations__": {"taskset": ftype}, "taskset": ftype(id=taskset_id)},
54
+ )
55
+
56
+
57
+ def output_path(config: DebugConfig) -> Path:
58
+ if config.output_dir is not None:
59
+ return config.output_dir
60
+ return Path("outputs") / f"{config.taskset.name}--debug" / config.uuid
61
+
62
+
63
+ def task_info(task) -> dict[str, Any]:
64
+ return {"idx": task.idx, "name": task.name, "workdir": task.workdir}
65
+
66
+
67
+ def runtime_info(runtime: Runtime) -> dict[str, Any]:
68
+ return {
69
+ "type": runtime.type,
70
+ "name": runtime.name,
71
+ "descriptor": runtime.descriptor,
72
+ }
73
+
74
+
75
+ def result_info(result: ProgramResult, start: float) -> dict[str, Any]:
76
+ ok = result.exit_code == 0
77
+ return {
78
+ "ok": ok,
79
+ "reason": "pass" if ok else "nonzero_exit",
80
+ "exit_code": result.exit_code,
81
+ "elapsed": round(time.time() - start, 2),
82
+ "stdout": result.stdout or "",
83
+ "stderr": result.stderr or "",
84
+ }
85
+
86
+
87
+ def error_info(
88
+ error: BaseException,
89
+ start: float,
90
+ timeout: float | None,
91
+ stage: str,
92
+ ) -> dict[str, Any]:
93
+ if isinstance(error, asyncio.TimeoutError):
94
+ message = (
95
+ f"{stage} timed out after {timeout}s"
96
+ if timeout is not None
97
+ else f"{stage} timed out"
98
+ )
99
+ reason = "timeout"
100
+ elif isinstance(error, asyncio.CancelledError):
101
+ message = f"{stage} cancelled"
102
+ reason = "cancelled"
103
+ else:
104
+ message = str(error)
105
+ reason = "error"
106
+ return {
107
+ "ok": False,
108
+ "reason": reason,
109
+ "exit_code": None,
110
+ "elapsed": round(time.time() - start, 2),
111
+ "error": message,
112
+ "error_type": type(error).__name__,
113
+ "stdout": "",
114
+ "stderr": "",
115
+ }
116
+
117
+
118
+ def capture_trace_error(trace: Trace, error: BaseException) -> None:
119
+ if isinstance(error, Exception):
120
+ trace.capture_error(error)
121
+ return
122
+ trace.errors.append(
123
+ Error(
124
+ type=type(error).__name__,
125
+ message=str(error),
126
+ traceback=traceback.format_exc(),
127
+ )
128
+ )
129
+ trace.stop("error")
130
+
131
+
132
+ def record_debug_error(
133
+ trace: Trace,
134
+ debug: dict[str, Any],
135
+ runtime: Runtime,
136
+ error: BaseException,
137
+ setup_timeout: float | None,
138
+ action_timeout: float | None,
139
+ ) -> None:
140
+ if not trace.timing.setup.end:
141
+ trace.timing.setup.end = time.time()
142
+ if trace.timing.generation.start and not trace.timing.generation.end:
143
+ trace.timing.generation.end = time.time()
144
+ in_action = bool(trace.timing.generation.start)
145
+ stage = "debug action" if in_action else "setup"
146
+ timeout = action_timeout if in_action else setup_timeout
147
+ error_start = (
148
+ trace.timing.generation.start if in_action else trace.timing.setup.start
149
+ )
150
+ debug.update(error_info(error, error_start, timeout, stage))
151
+ debug.setdefault("runtime", runtime_info(runtime))
152
+ capture_trace_error(trace, error)
153
+
154
+
155
+ def record_action_failure(trace: Trace, debug: dict[str, Any]) -> None:
156
+ message = debug.get("error") or f"debug action failed: {debug['reason']}"
157
+ trace.errors.append(
158
+ Error(
159
+ type=debug.get("error_type") or "DebugActionError",
160
+ message=str(message),
161
+ traceback=None,
162
+ )
163
+ )
164
+
165
+
166
+ async def run_timed(
167
+ action: Awaitable[ProgramResult], config: DebugConfig
168
+ ) -> dict[str, Any]:
169
+ """Run the whole debug action under one `--timeout.total` budget."""
170
+ start = time.time()
171
+ try:
172
+ result = await asyncio.wait_for(action, config.timeout.total)
173
+ except Exception as e:
174
+ return error_info(e, start, config.timeout.total, "debug action")
175
+ return result_info(result, start)
176
+
177
+
178
+ async def run_action(runtime: Runtime, config: DebugConfig) -> dict[str, Any]:
179
+ if config.command is not None:
180
+ return {
181
+ "action": "command",
182
+ "command": config.command,
183
+ **(await run_timed(runtime.run(["sh", "-lc", config.command], {}), config)),
184
+ }
185
+ assert config.script_path is not None
186
+ # /tmp keyed by the (run-unique) runtime name: outside the task workdir so the script
187
+ # doesn't show up in the repo state being inspected, and never shared between runs on
188
+ # the subprocess runtime, where an absolute path is a host path.
189
+ remote_path = f"/tmp/{runtime.name}-script.sh"
190
+ quoted = shlex.quote(remote_path)
191
+ command = f"chmod +x {quoted} && {quoted}"
192
+
193
+ async def upload_and_run() -> ProgramResult:
194
+ await runtime.write(remote_path, config.script_path.read_bytes())
195
+ return await runtime.run(["sh", "-lc", command], {})
196
+
197
+ return {
198
+ "action": "script",
199
+ "script_path": str(config.script_path),
200
+ "remote_script_path": remote_path,
201
+ "command": command,
202
+ **(await run_timed(upload_and_run(), config)),
203
+ }
204
+
205
+
206
+ async def debug_task(taskset: Taskset, task, config: DebugConfig) -> tuple[Trace, bool]:
207
+ trace = Trace(task=task, state=state_cls(type(taskset))())
208
+ debug = {
209
+ "task": task_info(task),
210
+ "action": "command" if config.command is not None else "script",
211
+ "ok": False,
212
+ "reason": "not_run",
213
+ }
214
+ cancelled = False
215
+ runtime = make_runtime(
216
+ resolve_runtime_config(config.runtime, task),
217
+ name=f"debug-{task.idx}-{uuid4().hex[:8]}",
218
+ )
219
+ setup_timeout = (
220
+ config.timeout.setup if config.timeout.setup is not None else task.timeout.setup
221
+ )
222
+ try:
223
+ trace.timing.setup.start = time.time()
224
+ await runtime.start()
225
+ debug["runtime"] = runtime_info(runtime)
226
+ await asyncio.wait_for(
227
+ invoke(taskset.setup, {"task": task, "trace": trace, "runtime": runtime}),
228
+ setup_timeout,
229
+ )
230
+ trace.timing.setup.end = time.time()
231
+
232
+ trace.timing.generation.start = time.time()
233
+ debug.update(await run_action(runtime, config))
234
+ trace.timing.generation.end = time.time()
235
+ if not debug.get("ok"):
236
+ record_action_failure(trace, debug)
237
+ trace.stop(str(debug["reason"]))
238
+ except asyncio.CancelledError as e:
239
+ cancelled = True
240
+ record_debug_error(
241
+ trace, debug, runtime, e, setup_timeout, config.timeout.total
242
+ )
243
+ except Exception as e:
244
+ record_debug_error(
245
+ trace, debug, runtime, e, setup_timeout, config.timeout.total
246
+ )
247
+ finally:
248
+ trace.info["debug"] = debug
249
+ try:
250
+ await runtime.stop()
251
+ except asyncio.CancelledError:
252
+ # a task cancellation delivered mid-stop would abort before the caller can
253
+ # persist the trace — absorb it here; the caller re-raises after appending
254
+ cancelled = True
255
+ except Exception:
256
+ logger.warning("runtime teardown failed (task %s)", task.idx, exc_info=True)
257
+ return trace, cancelled
258
+
259
+
260
+ async def run_debug(config: DebugConfig) -> list[Trace]:
261
+ taskset = vf.load_taskset(config.taskset)
262
+ tasks = taskset.load_tasks()
263
+ if config.shuffle:
264
+ random.Random(0).shuffle(tasks)
265
+ if config.num_tasks is not None:
266
+ tasks = tasks[: config.num_tasks]
267
+ if isinstance(config.runtime, vf.SubprocessConfig) and (
268
+ taskset.NEEDS_CONTAINER or any(t.image for t in tasks)
269
+ ):
270
+ raise SystemExit(
271
+ "taskset needs a container runtime to debug - pass --runtime.type docker (or prime)"
272
+ )
273
+
274
+ out = output_path(config)
275
+ save_config(config, out)
276
+ logger.info(
277
+ "debugging %d task(s) from %s on the %s runtime",
278
+ len(tasks),
279
+ config.name,
280
+ config.runtime.type,
281
+ )
282
+ logger.info("results: %s", out)
283
+
284
+ sem = asyncio.Semaphore(config.max_concurrent) if config.max_concurrent else None
285
+ write_lock = asyncio.Lock()
286
+
287
+ async def one(task) -> Trace:
288
+ async with sem or contextlib.nullcontext():
289
+ trace, cancelled = await debug_task(taskset, task, config)
290
+ await append_trace(out, trace, write_lock)
291
+ info = trace.info["debug"]
292
+ detail = f" - {info['error']}" if info.get("error") else ""
293
+ logger.info(
294
+ "idx=%s ok=%s reason=%s%s",
295
+ task.idx,
296
+ info["ok"],
297
+ info["reason"],
298
+ detail,
299
+ )
300
+ if cancelled:
301
+ raise asyncio.CancelledError
302
+ return trace
303
+
304
+ return await asyncio.gather(*(one(task) for task in tasks))
305
+
306
+
307
+ def main(argv: list[str] | None = None) -> None:
308
+ argv = with_positional_taskset(list(sys.argv[1:]) if argv is None else list(argv))
309
+
310
+ if not argv or any(arg in ("-h", "--help") for arg in argv):
311
+ print(USAGE)
312
+ sys.argv = [sys.argv[0], "--help"]
313
+ cli(_narrow(argv))
314
+ return
315
+ if not extract_id(argv, "taskset") and not references_config_file(argv):
316
+ raise SystemExit(USAGE)
317
+
318
+ config_type = _narrow(argv)
319
+ sys.argv = [sys.argv[0], *argv]
320
+ config = cli(config_type)
321
+ setup_logging("DEBUG" if config.verbose else "INFO")
322
+ signal.signal(signal.SIGTERM, lambda *_: (_ for _ in ()).throw(KeyboardInterrupt()))
323
+ asyncio.run(run_debug(config))
324
+
325
+
326
+ if __name__ == "__main__":
327
+ main()
@@ -15,10 +15,11 @@ import asyncio
15
15
  from pathlib import Path
16
16
 
17
17
  import tomli_w
18
- from pydantic import TypeAdapter
18
+ from pydantic import BaseModel, TypeAdapter
19
19
 
20
20
  from verifiers.v1.configs.eval import EvalConfig
21
21
  from verifiers.v1.trace import Trace
22
+ from verifiers.v1.utils.aio import run_shielded
22
23
 
23
24
 
24
25
  def output_path(config: EvalConfig) -> Path:
@@ -30,7 +31,7 @@ def output_path(config: EvalConfig) -> Path:
30
31
  return Path("outputs") / name / config.uuid
31
32
 
32
33
 
33
- def write_config(config: EvalConfig, results_dir: Path) -> Path:
34
+ def write_config(config: BaseModel, results_dir: Path) -> Path:
34
35
  """Write the run's resolved `config.toml` (re-readable via `@ config.toml`); return its
35
36
  path. mode="json" makes values TOML-friendly (Path -> str, etc.); exclude_none drops the
36
37
  nulls TOML can't represent."""
@@ -41,7 +42,7 @@ def write_config(config: EvalConfig, results_dir: Path) -> Path:
41
42
  return config_path
42
43
 
43
44
 
44
- def save_config(config: EvalConfig, results_dir: Path) -> None:
45
+ def save_config(config: BaseModel, results_dir: Path) -> None:
45
46
  """Set up the run's output dir: write `config.toml` and start a fresh (empty)
46
47
  `results.jsonl`. Call once up front, before traces start landing."""
47
48
  write_config(config, results_dir)
@@ -65,10 +66,6 @@ async def append_trace(results_dir: Path, trace: Trace, lock: asyncio.Lock) -> N
65
66
  async with lock:
66
67
  await asyncio.to_thread(write_trace, results_dir, trace)
67
68
 
68
- # Shield lock acquisition and the worker so finalized traces survive cancellation.
69
- persist_task = asyncio.create_task(persist())
70
- try:
71
- await asyncio.shield(persist_task)
72
- except asyncio.CancelledError:
73
- await persist_task
74
- raise
69
+ # Run lock acquisition and the worker to completion even under cancellation, so
70
+ # finalized traces are never lost mid-write (`run_shielded` re-raises the cancellation).
71
+ await run_shielded(persist())