verifiers 0.1.15.dev424__tar.gz → 0.1.15.dev426__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 (416) hide show
  1. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/PKG-INFO +1 -1
  2. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/pyproject.toml +1 -0
  3. verifiers-0.1.15.dev426/verifiers/v1/cli/dashboard/replay.py +96 -0
  4. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/cli/output.py +15 -0
  5. verifiers-0.1.15.dev426/verifiers/v1/cli/replay.py +183 -0
  6. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/clients/client.py +7 -1
  7. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/clients/eval.py +8 -2
  8. verifiers-0.1.15.dev426/verifiers/v1/configs/replay.py +67 -0
  9. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/interception/server.py +1 -1
  10. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/taskset.py +46 -6
  11. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/.gitignore +0 -0
  12. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/LICENSE +0 -0
  13. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/README.md +0 -0
  14. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/AGENTS.md +0 -0
  15. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/README.md +0 -0
  16. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/__init__.py +0 -0
  17. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/conftest.py +0 -0
  18. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_browser_env.py +0 -0
  19. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_build_script.py +0 -0
  20. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_cli_agent_env.py +0 -0
  21. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_client_auth_errors.py +0 -0
  22. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_client_config.py +0 -0
  23. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_client_multimodal_types.py +0 -0
  24. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_composable_env.py +0 -0
  25. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_context_token_metrics.py +0 -0
  26. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_decorator_ranks.py +0 -0
  27. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_endpoint_registry.py +0 -0
  28. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_env_group.py +0 -0
  29. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_env_server.py +0 -0
  30. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_environment.py +0 -0
  31. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_environment_extra.py +0 -0
  32. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_envs.py +0 -0
  33. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_error_chain.py +0 -0
  34. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_eval_display.py +0 -0
  35. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_eval_utils.py +0 -0
  36. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_gepa_cli.py +0 -0
  37. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_gepa_utils.py +0 -0
  38. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_gym_env.py +0 -0
  39. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_harbor_env_mcp.py +0 -0
  40. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_imports.py +0 -0
  41. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_init_script.py +0 -0
  42. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_install_utils.py +0 -0
  43. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_interception_utils.py +0 -0
  44. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_logging.py +0 -0
  45. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_math_rubric.py +0 -0
  46. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_maybe_think_parser.py +0 -0
  47. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_message_utils.py +0 -0
  48. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_message_utils_multimodal.py +0 -0
  49. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_multiturn_env.py +0 -0
  50. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_nemorl_client.py +0 -0
  51. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_openai_chat_completions_token_client.py +0 -0
  52. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_openai_responses_client.py +0 -0
  53. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_opencode_rlm_env.py +0 -0
  54. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_openenv_client.py +0 -0
  55. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_parser.py +0 -0
  56. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_path_utils.py +0 -0
  57. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_per_turn_timing.py +0 -0
  58. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_pricing_utils.py +0 -0
  59. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_prime_plugin.py +0 -0
  60. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_renderer_client.py +0 -0
  61. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_renderer_e2e.py +0 -0
  62. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_rlm_composable_env.py +0 -0
  63. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_rubric.py +0 -0
  64. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_rubric_group.py +0 -0
  65. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_sandbox_debug_env.py +0 -0
  66. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_sandbox_env.py +0 -0
  67. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_sandbox_mixin.py +0 -0
  68. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_save_utils.py +0 -0
  69. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_setup_script.py +0 -0
  70. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_singleturn_env.py +0 -0
  71. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_stateful_tool_env.py +0 -0
  72. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_think_parser.py +0 -0
  73. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_tool_env.py +0 -0
  74. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_tool_utils.py +0 -0
  75. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_trajectory_processing.py +0 -0
  76. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_tui_info_formatting.py +0 -0
  77. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_types.py +0 -0
  78. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_wordle_env.py +0 -0
  79. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/test_xml_parser.py +0 -0
  80. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/v1/conftest.py +0 -0
  81. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  82. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  83. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/v1/fixtures/echo_multi_v0.py +0 -0
  84. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  85. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  86. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/v1/fixtures/echo_v0.py +0 -0
  87. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/v1/fixtures/echo_v1.py +0 -0
  88. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/v1/fixtures/pyproject.toml +0 -0
  89. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  90. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/v1/test_color_codeword_tasks.py +0 -0
  91. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/v1/test_configs.py +0 -0
  92. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/v1/test_e2e.py +0 -0
  93. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/v1/test_envs.py +0 -0
  94. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/v1/test_graph.py +0 -0
  95. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/v1/test_judges.py +0 -0
  96. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/v1/test_legacy.py +0 -0
  97. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/v1/test_scoring.py +0 -0
  98. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/tests/v1/test_trace.py +0 -0
  99. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/AGENTS.md +0 -0
  100. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/__init__.py +0 -0
  101. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/cli/__init__.py +0 -0
  102. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/cli/commands/__init__.py +0 -0
  103. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/cli/commands/build.py +0 -0
  104. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/cli/commands/eval.py +0 -0
  105. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/cli/commands/gepa.py +0 -0
  106. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/cli/commands/init.py +0 -0
  107. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/cli/commands/install.py +0 -0
  108. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/cli/commands/setup.py +0 -0
  109. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/cli/plugins/__init__.py +0 -0
  110. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/cli/plugins/prime.py +0 -0
  111. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/cli/tui.py +0 -0
  112. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/clients/__init__.py +0 -0
  113. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/clients/anthropic_messages_client.py +0 -0
  114. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/clients/client.py +0 -0
  115. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
  116. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/clients/openai_chat_completions_client.py +0 -0
  117. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
  118. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/clients/openai_completions_client.py +0 -0
  119. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/clients/openai_responses_client.py +0 -0
  120. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/clients/renderer_client.py +0 -0
  121. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/decorators.py +0 -0
  122. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/AGENTS.md +0 -0
  123. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/__init__.py +0 -0
  124. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/env_group.py +0 -0
  125. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/environment.py +0 -0
  126. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/README.md +0 -0
  127. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/__init__.py +0 -0
  128. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/cli_agent_env.py +0 -0
  129. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/README.md +0 -0
  130. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/__init__.py +0 -0
  131. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/_filter.py +0 -0
  132. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/composable_env.py +0 -0
  133. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/harness.py +0 -0
  134. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
  135. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  136. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
  137. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
  138. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
  139. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
  140. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
  141. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/task.py +0 -0
  142. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
  143. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  144. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  145. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  146. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  147. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  148. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  149. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  150. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  151. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  152. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
  153. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
  154. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
  155. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
  156. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
  157. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
  158. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
  159. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
  160. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/__init__.py +0 -0
  161. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/tool_pdf.py +0 -0
  162. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +0 -0
  163. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
  164. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/__init__.py +0 -0
  165. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/base_client.py +0 -0
  166. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +0 -0
  167. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/cache_prompts.py +0 -0
  168. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +0 -0
  169. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/cache_filesys.py +0 -0
  170. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/load_eval_script.py +0 -0
  171. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +0 -0
  172. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/tool_visit.py +0 -0
  173. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/url_tools.py +0 -0
  174. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +0 -0
  175. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
  176. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
  177. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
  178. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
  179. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
  180. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
  181. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
  182. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  183. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  184. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  185. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  186. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  187. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  188. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  189. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  190. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  191. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  192. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  193. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  194. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  195. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  196. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  197. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  198. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  199. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  200. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  201. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  202. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  203. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  204. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  205. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/gym_env.py +0 -0
  206. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
  207. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/harbor_env/env.py +0 -0
  208. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
  209. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/mcp_env.py +0 -0
  210. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/opencode_env.py +0 -0
  211. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
  212. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
  213. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
  214. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/utils/__init__.py +0 -0
  215. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/utils/file_locks.py +0 -0
  216. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
  217. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/integrations/README.md +0 -0
  218. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/integrations/__init__.py +0 -0
  219. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/integrations/browser_env/README.md +0 -0
  220. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
  221. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
  222. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
  223. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
  224. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  225. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  226. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/integrations/openenv_env.py +0 -0
  227. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
  228. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/integrations/textarena_env.py +0 -0
  229. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/multiturn_env.py +0 -0
  230. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/python_env.py +0 -0
  231. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/sandbox_env.py +0 -0
  232. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/singleturn_env.py +0 -0
  233. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/stateful_tool_env.py +0 -0
  234. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/envs/tool_env.py +0 -0
  235. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/errors.py +0 -0
  236. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/gepa/__init__.py +0 -0
  237. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/gepa/adapter.py +0 -0
  238. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/gepa/config.py +0 -0
  239. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/gepa/display.py +0 -0
  240. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/gepa/gepa_utils.py +0 -0
  241. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/parsers/__init__.py +0 -0
  242. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/parsers/maybe_think_parser.py +0 -0
  243. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/parsers/parser.py +0 -0
  244. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/parsers/think_parser.py +0 -0
  245. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/parsers/xml_parser.py +0 -0
  246. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/rl/README.md +0 -0
  247. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/rl/__init__.py +0 -0
  248. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/rl/inference/__init__.py +0 -0
  249. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/rl/inference/client.py +0 -0
  250. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/rl/inference/server.py +0 -0
  251. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/rl/trainer/__init__.py +0 -0
  252. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/rl/trainer/config.py +0 -0
  253. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/rl/trainer/orchestrator.py +0 -0
  254. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/rl/trainer/trainer.py +0 -0
  255. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/rl/trainer/utils.py +0 -0
  256. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/rubrics/__init__.py +0 -0
  257. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
  258. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/rubrics/judge_rubric.py +0 -0
  259. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/rubrics/math_rubric.py +0 -0
  260. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/rubrics/rubric.py +0 -0
  261. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/rubrics/rubric_group.py +0 -0
  262. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/scripts/__init__.py +0 -0
  263. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/scripts/build.py +0 -0
  264. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/scripts/eval.py +0 -0
  265. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/scripts/gepa.py +0 -0
  266. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/scripts/init.py +0 -0
  267. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/scripts/install.py +0 -0
  268. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/scripts/rl.py +0 -0
  269. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/scripts/setup.py +0 -0
  270. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/scripts/train.py +0 -0
  271. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/scripts/tui.py +0 -0
  272. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/scripts/vllm.py +0 -0
  273. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/serve/__init__.py +0 -0
  274. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/serve/client/env_client.py +0 -0
  275. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/serve/client/zmq_env_client.py +0 -0
  276. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/serve/server/__init__.py +0 -0
  277. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/serve/server/env_router.py +0 -0
  278. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/serve/server/env_server.py +0 -0
  279. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/serve/server/env_worker.py +0 -0
  280. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/serve/server/zmq_env_server.py +0 -0
  281. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/serve/types.py +0 -0
  282. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/types.py +0 -0
  283. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/utils/__init__.py +0 -0
  284. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/utils/async_utils.py +0 -0
  285. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/utils/client_utils.py +0 -0
  286. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/utils/config_utils.py +0 -0
  287. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/utils/data_utils.py +0 -0
  288. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/utils/display_utils.py +0 -0
  289. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/utils/env_config_utils.py +0 -0
  290. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/utils/env_utils.py +0 -0
  291. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/utils/error_utils.py +0 -0
  292. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/utils/eval_display.py +0 -0
  293. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/utils/eval_utils.py +0 -0
  294. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/utils/heartbeat.py +0 -0
  295. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/utils/import_utils.py +0 -0
  296. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/utils/install_utils.py +0 -0
  297. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/utils/interception_utils.py +0 -0
  298. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/utils/logging_utils.py +0 -0
  299. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/utils/message_utils.py +0 -0
  300. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/utils/metric_utils.py +0 -0
  301. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/utils/path_utils.py +0 -0
  302. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/utils/pricing_utils.py +0 -0
  303. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/utils/process_utils.py +0 -0
  304. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/utils/response_utils.py +0 -0
  305. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/utils/save_utils.py +0 -0
  306. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/utils/serve_utils.py +0 -0
  307. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/utils/thread_utils.py +0 -0
  308. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/utils/threaded_sandbox_client.py +0 -0
  309. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/utils/tool_utils.py +0 -0
  310. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/utils/usage_utils.py +0 -0
  311. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/utils/version_utils.py +0 -0
  312. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/ARCHITECTURE.md +0 -0
  313. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/GUIDE.md +0 -0
  314. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/README.md +0 -0
  315. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/__init__.py +0 -0
  316. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/cli/__init__.py +0 -0
  317. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  318. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/cli/dashboard/base.py +0 -0
  319. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/cli/dashboard/eval.py +0 -0
  320. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/cli/dashboard/validate.py +0 -0
  321. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/cli/debug.py +0 -0
  322. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/cli/eval/__init__.py +0 -0
  323. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/cli/eval/main.py +0 -0
  324. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/cli/eval/resume.py +0 -0
  325. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/cli/eval/runner.py +0 -0
  326. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/cli/init.py +0 -0
  327. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/cli/resolve.py +0 -0
  328. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/cli/serve.py +0 -0
  329. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/cli/validate.py +0 -0
  330. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/clients/__init__.py +0 -0
  331. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/clients/config.py +0 -0
  332. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/clients/train.py +0 -0
  333. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/configs/__init__.py +0 -0
  334. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/configs/debug.py +0 -0
  335. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/configs/eval.py +0 -0
  336. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/configs/init.py +0 -0
  337. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/configs/serve.py +0 -0
  338. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/configs/validate.py +0 -0
  339. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/decorators.py +0 -0
  340. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/dialects/__init__.py +0 -0
  341. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/dialects/anthropic.py +0 -0
  342. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/dialects/base.py +0 -0
  343. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/dialects/chat.py +0 -0
  344. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/dialects/responses.py +0 -0
  345. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/env.py +0 -0
  346. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/episode.py +0 -0
  347. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/errors.py +0 -0
  348. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/graph.py +0 -0
  349. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/harness.py +0 -0
  350. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/harnesses/__init__.py +0 -0
  351. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  352. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/harnesses/codex/harness.py +0 -0
  353. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/harnesses/default/__init__.py +0 -0
  354. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/harnesses/default/harness.py +0 -0
  355. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/harnesses/default/program.py +0 -0
  356. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  357. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  358. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  359. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  360. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  361. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/harnesses/null/__init__.py +0 -0
  362. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/harnesses/null/harness.py +0 -0
  363. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/harnesses/null/program.py +0 -0
  364. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  365. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  366. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  367. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  368. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  369. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/interception/__init__.py +0 -0
  370. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/interception/pool.py +0 -0
  371. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/judge.py +0 -0
  372. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/judges/__init__.py +0 -0
  373. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/judges/reference.py +0 -0
  374. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/judges/reference.txt +0 -0
  375. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/judges/rubric.py +0 -0
  376. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/judges/rubric.txt +0 -0
  377. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/legacy.py +0 -0
  378. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/loaders.py +0 -0
  379. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/mcp/__init__.py +0 -0
  380. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/mcp/launch.py +0 -0
  381. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/mcp/server.py +0 -0
  382. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/mcp/toolset.py +0 -0
  383. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/mcp/user.py +0 -0
  384. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/retries.py +0 -0
  385. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/rollout.py +0 -0
  386. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/runtimes/__init__.py +0 -0
  387. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/runtimes/base.py +0 -0
  388. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/runtimes/docker.py +0 -0
  389. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/runtimes/limiters.py +0 -0
  390. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/runtimes/modal.py +0 -0
  391. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/runtimes/prime.py +0 -0
  392. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/runtimes/subprocess.py +0 -0
  393. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/scoring.py +0 -0
  394. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/serve/__init__.py +0 -0
  395. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/serve/client.py +0 -0
  396. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/serve/pool.py +0 -0
  397. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/serve/server.py +0 -0
  398. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/serve/types.py +0 -0
  399. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/state.py +0 -0
  400. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/task.py +0 -0
  401. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/tasksets/__init__.py +0 -0
  402. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  403. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  404. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  405. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  406. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  407. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  408. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  409. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/trace.py +0 -0
  410. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/types.py +0 -0
  411. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/utils/__init__.py +0 -0
  412. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/utils/aio.py +0 -0
  413. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/utils/format.py +0 -0
  414. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/utils/install.py +0 -0
  415. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/verifiers/v1/utils/logging.py +0 -0
  416. {verifiers-0.1.15.dev424 → verifiers-0.1.15.dev426}/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.dev424
3
+ Version: 0.1.15.dev426
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
@@ -167,6 +167,7 @@ vf-eval = "verifiers.scripts.eval:main"
167
167
  eval = "verifiers.v1.cli.eval.main:main"
168
168
  validate = "verifiers.v1.cli.validate:main"
169
169
  debug = "verifiers.v1.cli.debug:main"
170
+ replay = "verifiers.v1.cli.replay:main"
170
171
  serve = "verifiers.v1.cli.serve:main"
171
172
  init = "verifiers.v1.cli.init:main"
172
173
  vf-gepa = "verifiers.scripts.gepa:main"
@@ -0,0 +1,96 @@
1
+ """Live dashboard for `replay` — one row per trace being re-scored (pending → running → its
2
+ outcome), mirroring the validate view. Reuses `TaskProgress` and `live_view`."""
3
+
4
+ import contextlib
5
+ import time
6
+ from dataclasses import dataclass
7
+
8
+ from rich.console import Group
9
+ from rich.markup import escape
10
+ from rich.progress_bar import ProgressBar
11
+ from rich.rule import Rule
12
+ from rich.table import Table
13
+ from rich.text import Text
14
+
15
+ from verifiers.v1.cli.dashboard.base import live_view
16
+ from verifiers.v1.cli.dashboard.validate import TaskProgress
17
+ from verifiers.v1.utils.format import format_time
18
+
19
+
20
+ @dataclass
21
+ class ReplayProgress(TaskProgress):
22
+ """`TaskProgress` plus the re-score `detail` shown per row: the final reward when scored, or
23
+ the exception type when it errored."""
24
+
25
+ detail: str = ""
26
+
27
+
28
+ # Colors mirror the eval dashboard for shared states: pending=dim, running=cyan, scored=green
29
+ # (eval's "success"), error=red. `skipped` is replay-only (a rollout that errored → copied through).
30
+ _STYLE = {
31
+ "pending": "dim",
32
+ "running": "cyan",
33
+ "scored": "green",
34
+ "skipped": "blue",
35
+ "error": "red",
36
+ }
37
+ _MARK_WIDTH = max(len(state) for state in _STYLE)
38
+ _MARK = {state: escape(f"[{state:<{_MARK_WIDTH}}]") for state in _STYLE}
39
+ _DONE = ("scored", "error", "skipped")
40
+
41
+
42
+ def _render(
43
+ states: list[TaskProgress], taskset_name: str, source: str, out: str, start: float
44
+ ) -> Group:
45
+ done = [s for s in states if s.state in _DONE]
46
+ scored = sum(1 for s in done if s.state == "scored")
47
+ skipped = sum(1 for s in done if s.state == "skipped")
48
+ overview = Table.grid(padding=(0, 2))
49
+ overview.add_column(style="dim")
50
+ overview.add_column()
51
+ overview.add_row("replay", f"{taskset_name} · {source}")
52
+ overview.add_row("output", out)
53
+
54
+ stats = (
55
+ f" {len(done)}/{len(states)} · {format_time(time.time() - start)} · "
56
+ f"scored {scored} · failed {len(done) - scored - skipped} · skipped {skipped}"
57
+ )
58
+ progress = Table.grid()
59
+ progress.add_column()
60
+ progress.add_column()
61
+ progress.add_row(
62
+ ProgressBar(total=len(states) or 1, completed=len(done), width=32), Text(stats)
63
+ )
64
+
65
+ now = time.time()
66
+ rows = Table.grid(expand=True, padding=(0, 1))
67
+ rows.add_column(ratio=1, no_wrap=True)
68
+ rows.add_column(justify="right", no_wrap=True)
69
+ rows.add_column(justify="right", no_wrap=True)
70
+ for s in states:
71
+ if s.state == "pending": # show only in-flight/done rows (like eval/validate)
72
+ continue
73
+ label = f"name={s.name[:40]}" if s.name else f"idx={s.idx}"
74
+ parts = [
75
+ p
76
+ for p in (s.state if s.state in _DONE else "", getattr(s, "detail", ""))
77
+ if p
78
+ ]
79
+ result = " ".join(parts) + " ·" if parts else ""
80
+ elapsed = format_time((s.end or now) - s.start) if s.start else ""
81
+ rows.add_row(
82
+ f"{_MARK[s.state]} {label}",
83
+ result,
84
+ elapsed,
85
+ style=_STYLE[s.state],
86
+ )
87
+ return Group(overview, progress, Rule(style="dim"), rows)
88
+
89
+
90
+ @contextlib.asynccontextmanager
91
+ async def replay_dashboard(
92
+ states: list[TaskProgress], taskset_name: str, source: str, out: str, start: float
93
+ ):
94
+ """Refresh the live replay view until the `with` block exits, then a final frame."""
95
+ async with live_view(lambda: _render(states, taskset_name, source, out, start)):
96
+ yield
@@ -12,6 +12,7 @@ durable as they land rather than only at the end.
12
12
  """
13
13
 
14
14
  import asyncio
15
+ import json
15
16
  from pathlib import Path
16
17
 
17
18
  import tomli_w
@@ -58,6 +59,20 @@ def write_trace(results_dir: Path, trace: Trace) -> None:
58
59
  f.write(data + b"\n")
59
60
 
60
61
 
62
+ def read_traces(results_dir: Path, trace_type: type) -> list[Trace]:
63
+ """Load a run's saved traces from `results.jsonl`, typed as `trace_type` — the inverse of
64
+ `write_trace`. Used by `replay` to re-score finished rollouts (pass the taskset's typed
65
+ `Trace[...]`, or `Trace[WireTask, ...]` to read any taskset's traces without importing it).
66
+ Streams line-by-line so a large (multi-GB) results file isn't loaded into memory at once."""
67
+ adapter = TypeAdapter(trace_type)
68
+ traces: list[Trace] = []
69
+ with (results_dir / "results.jsonl").open(encoding="utf-8") as f:
70
+ for line in f:
71
+ if line.strip():
72
+ traces.append(adapter.validate_python(json.loads(line)))
73
+ return traces
74
+
75
+
61
76
  async def append_trace(results_dir: Path, trace: Trace, lock: asyncio.Lock) -> None:
62
77
  """Append one finished trace without blocking the event loop. The run's shared lock
63
78
  preserves whole-line ordering, and awaiting the worker preserves per-trace durability."""
@@ -0,0 +1,183 @@
1
+ """The replay entrypoint: `uv run replay <output-dir> [options] [@ file.toml]`.
2
+
3
+ Offline sibling of `eval`: loads a finished run's saved traces and re-runs **scoring only**, no
4
+ runtime. The run's own `config.toml` is the base; CLI flags / `@ file.toml` layer on top (e.g. a
5
+ different judge model). Signals needing a `runtime` (in-sandbox verifiers like a SWE `solved`
6
+ reward) are skipped and left as the source recorded them; config-plugged judges and trace-only
7
+ `@reward`/`@metric`s re-run. Rollouts that errored during generation (`stop_condition == "error"`)
8
+ were never scored by eval, so they're copied through unchanged rather than re-scored on a broken
9
+ transcript. `--num-rescores`/`-r` re-scores each trace N times to sample judge variance. Results go
10
+ to a fresh output dir, so the source run is never overwritten.
11
+ """
12
+
13
+ import asyncio
14
+ import contextlib
15
+ import logging
16
+ import signal
17
+ import sys
18
+ import time
19
+ import tomllib
20
+ from pathlib import Path
21
+
22
+ from pydantic_config import cli
23
+
24
+ import verifiers.v1 as vf
25
+ from verifiers.v1.cli.dashboard.replay import ReplayProgress, replay_dashboard
26
+ from verifiers.v1.cli.output import append_trace, read_traces, save_config, write_config
27
+ from verifiers.v1.configs.replay import ReplayConfig
28
+ from verifiers.v1.state import state_cls
29
+ from verifiers.v1.task import WireTask
30
+ from verifiers.v1.trace import Trace
31
+ from verifiers.v1.utils.logging import setup_logging
32
+
33
+ logger = logging.getLogger(__name__)
34
+
35
+ USAGE = (
36
+ "usage: uv run replay <output-dir> [options] [@ file.toml]\n"
37
+ " re-score a finished run's saved traces (judges + trace-only signals; no runtime)"
38
+ )
39
+
40
+
41
+ def _narrow(config_path: Path) -> type[ReplayConfig]:
42
+ """`ReplayConfig` with `taskset` narrowed to the saved run's taskset type, so the `cli()`
43
+ parse stays typed and CLI overrides of taskset fields validate (mirrors eval/validate)."""
44
+ data = tomllib.loads(config_path.read_text())
45
+ taskset_id = (data.get("taskset") or {}).get("id")
46
+ if not taskset_id:
47
+ return ReplayConfig
48
+ ftype = vf.taskset_config_type(taskset_id)
49
+ return type(
50
+ "ReplayConfig",
51
+ (ReplayConfig,),
52
+ {"__annotations__": {"taskset": ftype}, "taskset": ftype(id=taskset_id)},
53
+ )
54
+
55
+
56
+ def output_dir(config: ReplayConfig) -> Path:
57
+ """Where a replay writes: `--output-dir`, else a fresh `outputs/<taskset>--replay/<uuid>`."""
58
+ return config.output_dir or Path("outputs") / f"{config.name}--replay" / config.uuid
59
+
60
+
61
+ async def run_replay(config: ReplayConfig, source: Path, out: Path) -> list[Trace]:
62
+ logger.debug("replay config:\n%s", config.model_dump_json(indent=2))
63
+ taskset = vf.load_taskset(config.taskset)
64
+ # `WireTask` reads any taskset's saved task without a runtime or its Task type (see WireTask).
65
+ traces = read_traces(source, Trace[WireTask, state_cls(type(taskset))])
66
+ if config.num_traces is not None:
67
+ traces = traces[: config.num_traces]
68
+ # `num_rescores` re-scores each trace that many times, each on its own copy.
69
+ work = [t.model_copy(deep=True) for t in traces for _ in range(config.num_rescores)]
70
+
71
+ save_config(config, out)
72
+ logger.info(
73
+ "replay: re-scoring %d trace(s) x%d from %s -> %s",
74
+ len(traces),
75
+ config.num_rescores,
76
+ source,
77
+ out,
78
+ )
79
+ start = time.time()
80
+
81
+ sem = asyncio.Semaphore(config.max_concurrent) if config.max_concurrent else None
82
+ states = [ReplayProgress(idx=t.task.idx, name=t.task.name) for t in work]
83
+ lock = asyncio.Lock()
84
+
85
+ async def rescore(trace: Trace, st: ReplayProgress) -> None:
86
+ async with sem or contextlib.nullcontext():
87
+ st.start = time.time()
88
+ # A rollout that errored during generation was never scored by eval (its scoring phase
89
+ # never ran), so re-scoring would grade a broken/partial transcript. Copy it through
90
+ # unchanged, mirroring eval. A *scoring* error leaves `stop_condition` as the
91
+ # generation outcome, so those still re-score (the offline-recovery case).
92
+ if trace.stop_condition == "error":
93
+ st.state, st.detail, st.end = "skipped", "rollout errored", time.time()
94
+ else:
95
+ st.state = "running"
96
+ # Clear prior scores so a changed/removed judge leaves no stale (double-summed) entry.
97
+ if isinstance(trace.info, dict):
98
+ trace.info.pop("judge", None)
99
+ trace.rewards, trace.metrics, trace.extra_usage = {}, {}, []
100
+ try:
101
+ await taskset.score(trace)
102
+ st.state, st.detail = "scored", f"reward {trace.reward:.3f}"
103
+ except Exception as exc:
104
+ st.state, st.detail = "error", type(exc).__name__
105
+ trace.capture_error(
106
+ exc
107
+ ) # record the re-scoring failure on the trace
108
+ if not config.rich:
109
+ logger.warning(
110
+ "replay: scoring failed for task %s",
111
+ trace.task.idx,
112
+ exc_info=True,
113
+ )
114
+ st.end = time.time()
115
+ if not config.rich:
116
+ logger.info(
117
+ "idx=%s %s (%.1fs)", trace.task.idx, st.state, st.end - st.start
118
+ )
119
+ # Persist as each trace finishes (like eval), so an interrupted replay keeps its progress.
120
+ await append_trace(out, trace, lock)
121
+
122
+ display = (
123
+ replay_dashboard(states, config.name, str(source), str(out), start)
124
+ if config.rich
125
+ else contextlib.nullcontext()
126
+ )
127
+ async with display:
128
+ await asyncio.gather(*(rescore(t, s) for t, s in zip(work, states)))
129
+ logger.info("replay: done in %.1fs -> %s", time.time() - start, out)
130
+ return work
131
+
132
+
133
+ def main(argv: list[str] | None = None) -> None:
134
+ argv = list(sys.argv[1:]) if argv is None else list(argv)
135
+ if not argv or any(a in ("-h", "--help") for a in argv):
136
+ print(USAGE)
137
+ sys.argv = [sys.argv[0], "--help"]
138
+ cli(ReplayConfig) # full, typed pydantic-config option help
139
+ return
140
+ source = Path(argv.pop(0)) # the finished run dir to replay
141
+ config_path = source / "config.toml"
142
+ if not config_path.exists():
143
+ raise SystemExit(f"{USAGE}\nno config.toml in {source}")
144
+
145
+ # The saved run's config is the base; user flags / @ file.toml layer on top.
146
+ layered = ["@", str(config_path), *argv]
147
+ config_type = _narrow(config_path)
148
+ sys.argv = [sys.argv[0], *layered]
149
+ config = cli(config_type)
150
+ # Honor a user-set output_dir (via -o or an @ file); drop the *source* run's own output_dir
151
+ # so a replay always writes to a fresh dir and never back over the run it re-scores.
152
+ source_out = (tomllib.loads(config_path.read_text())).get("output_dir")
153
+ if config.output_dir is None or str(config.output_dir) == str(source_out):
154
+ config = config.model_copy(update={"output_dir": None})
155
+
156
+ out = output_dir(config)
157
+ if (
158
+ out.resolve() == source.resolve()
159
+ ): # never write back over the run being replayed
160
+ raise SystemExit(
161
+ f"replay: --output-dir must differ from the source run ({source}); "
162
+ "refusing to overwrite it"
163
+ )
164
+ level = "DEBUG" if config.verbose else "INFO"
165
+ if config.dry_run: # resolve + validate, write the config, and exit (no re-scoring)
166
+ setup_logging(level)
167
+ logger.info("wrote config to %s", write_config(config, out))
168
+ return
169
+
170
+ log_file = str(
171
+ out / "replay.log"
172
+ ) # tee the run's logs to its output dir, like eval
173
+ if config.rich: # the dashboard owns the screen, so keep logs off the console
174
+ setup_logging(level, log_file=log_file, console=False)
175
+ logging.lastResort = None
176
+ else:
177
+ setup_logging(level, log_file=log_file, console=True)
178
+ signal.signal(signal.SIGTERM, lambda *_: (_ for _ in ()).throw(KeyboardInterrupt()))
179
+ asyncio.run(run_replay(config, source, out))
180
+
181
+
182
+ if __name__ == "__main__":
183
+ main()
@@ -67,7 +67,13 @@ class Client(ABC):
67
67
  generates and cannot stream."""
68
68
  raise NotImplementedError(f"{type(self).__name__} does not support streaming")
69
69
 
70
- async def relay_aux(self, dialect: Dialect, route: str, body: dict) -> dict:
70
+ async def relay_aux(
71
+ self,
72
+ dialect: Dialect,
73
+ route: str,
74
+ body: dict,
75
+ headers: Mapping[str, str] | None = None,
76
+ ) -> dict:
71
77
  """Relay a non-model-turn side request (an `aux_route`, e.g. Anthropic's `count_tokens`)
72
78
  verbatim to the provider and return its JSON. Only the relay (eval) client supports it."""
73
79
  raise NotImplementedError(f"{type(self).__name__} does not relay aux routes")
@@ -205,12 +205,18 @@ class EvalClient(Client):
205
205
  close=resp.aclose,
206
206
  )
207
207
 
208
- async def relay_aux(self, dialect: Dialect, route: str, body: dict) -> dict:
208
+ async def relay_aux(
209
+ self,
210
+ dialect: Dialect,
211
+ route: str,
212
+ body: dict,
213
+ headers: Mapping[str, str] | None = None,
214
+ ) -> dict:
209
215
  # A side request (e.g. count_tokens): relay its native JSON and return the provider JSON.
210
216
  resp = await self._request(
211
217
  self.base_url + route,
212
218
  body,
213
- self._headers(dialect, None, None),
219
+ self._headers(dialect, headers, None),
214
220
  )
215
221
  return from_json(resp.content)
216
222
 
@@ -0,0 +1,67 @@
1
+ """The `ReplayConfig`: the config the `replay` CLI parses.
2
+
3
+ Replay re-scores a finished run's saved traces with no runtime, so it needs only a subset of
4
+ `EvalConfig` — the taskset (with its plugged judges) and a few run knobs. It carries no harness,
5
+ runtime, model, sampling, or pool. Its base is the replayed run's own `config.toml` (a full
6
+ `EvalConfig`), so `model_config` ignores the eval-only fields rather than rejecting them; CLI
7
+ flags / `@ file.toml` then layer overrides (e.g. re-judge with different judge settings).
8
+ """
9
+
10
+ from pathlib import Path
11
+ from uuid import uuid4
12
+
13
+ from pydantic import AliasChoices, ConfigDict, Field, SerializeAsAny, model_validator
14
+ from pydantic_config import BaseConfig
15
+
16
+ from verifiers.v1.taskset import TasksetConfig
17
+
18
+
19
+ class ReplayConfig(BaseConfig):
20
+ """A taskset (with its config-plugged judges) plus replay run knobs. The saved run's
21
+ `config.toml` is the base; its eval-only fields (harness, runtime, model, sampling, pool, …)
22
+ are ignored here — replay only re-runs scoring from the trace."""
23
+
24
+ model_config = ConfigDict(extra="ignore")
25
+
26
+ uuid: str = Field(default_factory=lambda: str(uuid4()), exclude=True)
27
+ """Auto-generated run id — the leaf of the output dir, so replays never overwrite."""
28
+ taskset: SerializeAsAny[TasksetConfig] = TasksetConfig()
29
+ """The taskset, selected by `--taskset.id` (narrowed to its config type). Its
30
+ `taskset.judges` are what replay re-runs; override them via `@ file.toml` / dotted flags."""
31
+ num_traces: int | None = Field(
32
+ None, validation_alias=AliasChoices("num_traces", "n")
33
+ )
34
+ """How many saved traces to re-score (None = all)."""
35
+ num_rescores: int = Field(1, validation_alias=AliasChoices("num_rescores", "r"))
36
+ """Re-score each selected trace this many times — e.g. to measure judge variance across
37
+ repeated gradings of the same trace. Named distinctly from eval's `num_rollouts` so the
38
+ replayed run's own `num_rollouts` (in the base `config.toml`) is ignored, not inherited."""
39
+ max_concurrent: int | None = Field(
40
+ 128, validation_alias=AliasChoices("max_concurrent", "c")
41
+ )
42
+ """Max traces re-scored (judge calls) in flight at once."""
43
+ verbose: bool = Field(False, validation_alias=AliasChoices("verbose", "v"))
44
+ """Log at debug level instead of the default info."""
45
+ dry_run: bool = False
46
+ """Resolve + validate the config and write it to the output dir, then exit (no re-scoring)."""
47
+ rich: bool = True
48
+ """Show a live dashboard (one row per trace) instead of per-trace log lines."""
49
+ output_dir: Path | None = Field(
50
+ None, validation_alias=AliasChoices("output_dir", "o")
51
+ )
52
+ """Where to write the re-scored run (config.toml + results.jsonl). None = a fresh per-run
53
+ dir under `outputs/<taskset>--replay/<uuid>` (so a replay never overwrites the source run)."""
54
+
55
+ @property
56
+ def name(self) -> str:
57
+ return self.taskset.name
58
+
59
+ @model_validator(mode="before")
60
+ @classmethod
61
+ def _resolve_taskset(cls, data):
62
+ """Narrow the generic `taskset` to its specific config type by `id` (mirrors
63
+ `ValidateConfig`), so `taskset.judges` and other taskset fields validate typed."""
64
+ from verifiers.v1.loaders import narrow_plugin_field, taskset_config_type
65
+
66
+ narrow_plugin_field(data, "taskset", taskset_config_type)
67
+ return data
@@ -543,7 +543,7 @@ class InterceptionServer:
543
543
  logger.debug("intercept aux %s: id=%s", route, session.trace.id)
544
544
  try:
545
545
  result = await session.ctx.client.relay_aux(
546
- dialect, route, await request.json()
546
+ dialect, route, await request.json(), headers=request.headers
547
547
  )
548
548
  except RolloutError as e:
549
549
  # An aux call isn't a model turn, so don't clobber a pending turn error.
@@ -17,6 +17,8 @@ For a heterogeneous taskset (different verification per task), have a single
17
17
  """
18
18
 
19
19
  import asyncio
20
+ import inspect
21
+ import logging
20
22
  from collections.abc import Mapping
21
23
  from functools import cached_property
22
24
  from typing import ClassVar, Generic, TypeVar
@@ -35,6 +37,8 @@ from verifiers.v1.state import StateT
35
37
  from verifiers.v1.task import TaskT
36
38
  from verifiers.v1.trace import Trace
37
39
 
40
+ logger = logging.getLogger(__name__)
41
+
38
42
 
39
43
  class TasksetConfig(BaseConfig):
40
44
  """Base taskset config. Subclass to add task-generation knobs."""
@@ -172,17 +176,36 @@ class Taskset(Generic[TaskT, ConfigT, StateT]):
172
176
  records the reason (the raised error's message)."""
173
177
  return True
174
178
 
175
- async def score(self, trace: Trace, runtime: Runtime) -> None:
179
+ async def score(self, trace: Trace, runtime: Runtime | None = None) -> None:
176
180
  """Score one rollout: run all `@metric`, then `@reward`, then the config-plugged
177
181
  `judges` over its trace, concurrently within each phase. Each metric is recorded in
178
182
  `trace.metrics` (a number, or a mapping merged in); each reward and judge verdict
179
183
  (weighted — likewise a number or a mapping merged in) in `trace.rewards`, which
180
184
  `trace.reward` sums. Signals declare what they need — `task`, `trace`,
181
185
  `runtime` — so a reward is either a pure function of the trace or runs
182
- read/write/exec in that (still-live) runtime, e.g. a verifier script."""
183
- available = {"task": trace.task, "trace": trace, "runtime": runtime}
186
+ read/write/exec in that (still-live) runtime, e.g. a verifier script.
187
+
188
+ `runtime` may be `None` — the offline path taken by `replay`, which re-scores a saved
189
+ trace with no live runtime. Signals that declare a `runtime` parameter are then skipped
190
+ (they can't run without one) and logged; trace-only `@metric`/`@reward`s and the plugged
191
+ judges (which grade from the trace) still run, overwriting their own keys and leaving the
192
+ skipped signals' previously-recorded values untouched. With a runtime present (the eval
193
+ path) nothing is skipped."""
194
+ available = {"task": trace.task, "trace": trace}
195
+ if runtime is not None:
196
+ available["runtime"] = runtime
197
+
198
+ def can_run(fn) -> bool:
199
+ # A signal that *requires* a runtime can't run without one, so skip it when replaying.
200
+ # A `runtime` parameter with a default (e.g. `runtime=None`) is optional — `invoke`
201
+ # just omits it — so those still run offline.
202
+ if runtime is not None:
203
+ return True
204
+ param = inspect.signature(fn).parameters.get("runtime")
205
+ return param is None or param.default is not inspect.Parameter.empty
206
+
184
207
  async with boundary(TasksetError, f"taskset {type(self).__name__} scoring"):
185
- metrics = discover_decorated(self, "metric")
208
+ metrics = [fn for fn in discover_decorated(self, "metric") if can_run(fn)]
186
209
  metric_results = (
187
210
  [await invoke(fn, available) for fn in metrics]
188
211
  if len(metrics) < 2
@@ -193,7 +216,7 @@ class Taskset(Generic[TaskT, ConfigT, StateT]):
193
216
  trace.record_metrics(result)
194
217
  else:
195
218
  trace.record_metric(fn.__name__, result)
196
- rewards = discover_decorated(self, "reward")
219
+ rewards = [fn for fn in discover_decorated(self, "reward") if can_run(fn)]
197
220
  reward_results = (
198
221
  [await invoke(fn, available) for fn in rewards]
199
222
  if len(rewards) < 2
@@ -206,7 +229,24 @@ class Taskset(Generic[TaskT, ConfigT, StateT]):
206
229
  trace.record_reward(name, value, weight)
207
230
  else:
208
231
  trace.record_reward(fn.__name__, result, weight)
209
- judges = self.judges
232
+ judges = [judge for judge in self.judges if can_run(judge.score)]
233
+ if runtime is None:
234
+ # Exactly the signals `can_run` filtered out above — those requiring a runtime
235
+ # (a `runtime` param with no default). Signals whose `runtime` has a default run
236
+ # offline and are not reported as skipped.
237
+ skipped = [
238
+ fn.__name__
239
+ for fn in (
240
+ *discover_decorated(self, "metric"),
241
+ *discover_decorated(self, "reward"),
242
+ )
243
+ if not can_run(fn)
244
+ ] + [j.reward_name for j in self.judges if not can_run(j.score)]
245
+ if skipped:
246
+ logger.info(
247
+ "score: no runtime — skipped runtime-dependent signals: %s",
248
+ skipped,
249
+ )
210
250
  judge_results = (
211
251
  [await invoke(judge.score, available) for judge in judges]
212
252
  if len(judges) < 2