verifiers 0.2.2.dev48__tar.gz → 0.2.2.dev57__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 (428) hide show
  1. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/PKG-INFO +1 -1
  2. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/pyproject.toml +5 -2
  3. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/v1/conftest.py +4 -9
  4. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/v1/fixtures/counter_tool_v1.py +3 -1
  5. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/v1/fixtures/echo_acp_resume_v1.py +3 -1
  6. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/v1/fixtures/echo_tool_v1.py +3 -1
  7. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/v1/fixtures/tool_response_image_v1.py +17 -3
  8. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/v1/test_color_codeword_tasks.py +1 -3
  9. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/v1/test_e2e.py +49 -28
  10. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/v1/test_graph.py +16 -6
  11. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/v1/test_judges.py +10 -18
  12. verifiers-0.2.2.dev57/tests/v1/test_taskset.py +93 -0
  13. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/v1/test_trace.py +4 -1
  14. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/__init__.py +13 -4
  15. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/agent.py +17 -14
  16. verifiers-0.2.2.dev57/verifiers/v1/artifacts.py +142 -0
  17. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/cli/dashboard/eval.py +42 -58
  18. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/cli/debug.py +16 -9
  19. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/cli/eval/runner.py +21 -7
  20. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/cli/init.py +7 -2
  21. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/cli/replay.py +4 -4
  22. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/cli/validate.py +20 -1
  23. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/configs/judge.py +3 -10
  24. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/configs/taskset.py +5 -0
  25. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/env.py +10 -17
  26. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/envs/agentic_judge/__init__.py +2 -0
  27. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/envs/agentic_judge/env.py +118 -61
  28. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/envs/user_sim/env.py +2 -2
  29. verifiers-0.2.2.dev57/verifiers/v1/episode.py +83 -0
  30. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/errors.py +1 -1
  31. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/gepa/adapter.py +6 -11
  32. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/gepa/runner.py +18 -2
  33. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/graph.py +3 -4
  34. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/__init__.py +6 -0
  35. verifiers-0.2.2.dev57/verifiers/v1/harnesses/browser_use/__init__.py +6 -0
  36. verifiers-0.2.2.dev57/verifiers/v1/harnesses/browser_use/harness.py +125 -0
  37. verifiers-0.2.2.dev57/verifiers/v1/harnesses/browser_use/program.py +402 -0
  38. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/judge.py +9 -10
  39. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/judges/rubric.py +5 -5
  40. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/legacy.py +10 -5
  41. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/loaders.py +4 -4
  42. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/mcp/launch.py +2 -2
  43. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/mcp/server.py +2 -2
  44. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/push.py +5 -5
  45. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/retries.py +3 -1
  46. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/rollout.py +31 -28
  47. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/runtimes/subprocess.py +1 -1
  48. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/serve/server.py +2 -2
  49. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/state.py +6 -6
  50. verifiers-0.2.2.dev57/verifiers/v1/task.py +238 -0
  51. verifiers-0.2.2.dev57/verifiers/v1/taskset.py +110 -0
  52. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/tasksets/harbor/taskset.py +105 -7
  53. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/tasksets/lean/taskset.py +1 -2
  54. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/trace.py +150 -254
  55. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/types.py +13 -17
  56. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/utils/compile.py +18 -17
  57. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/utils/generic.py +1 -1
  58. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/utils/git.py +74 -9
  59. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/utils/sampling.py +4 -5
  60. verifiers-0.2.2.dev48/tests/v1/test_taskset.py +0 -71
  61. verifiers-0.2.2.dev48/verifiers/v1/episode.py +0 -55
  62. verifiers-0.2.2.dev48/verifiers/v1/task.py +0 -274
  63. verifiers-0.2.2.dev48/verifiers/v1/taskset.py +0 -98
  64. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/.gitignore +0 -0
  65. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/LICENSE +0 -0
  66. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/README.md +0 -0
  67. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/__init__.py +0 -0
  68. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/conftest.py +0 -0
  69. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_browser_env.py +0 -0
  70. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_build_script.py +0 -0
  71. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_cli_agent_env.py +0 -0
  72. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_client_auth_errors.py +0 -0
  73. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_client_config.py +0 -0
  74. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_client_multimodal_types.py +0 -0
  75. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_composable_env.py +0 -0
  76. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_context_token_metrics.py +0 -0
  77. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_decorator_ranks.py +0 -0
  78. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_endpoint_registry.py +0 -0
  79. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_env_group.py +0 -0
  80. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_env_server.py +0 -0
  81. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_environment.py +0 -0
  82. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_environment_extra.py +0 -0
  83. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_error_chain.py +0 -0
  84. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_eval_display.py +0 -0
  85. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_eval_utils.py +0 -0
  86. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_gepa_cli.py +0 -0
  87. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_gepa_utils.py +0 -0
  88. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_gym_env.py +0 -0
  89. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_harbor_env_mcp.py +0 -0
  90. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_imports.py +0 -0
  91. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_init_script.py +0 -0
  92. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_install_utils.py +0 -0
  93. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_interception_utils.py +0 -0
  94. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_logging.py +0 -0
  95. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_math_rubric.py +0 -0
  96. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_maybe_think_parser.py +0 -0
  97. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_message_utils.py +0 -0
  98. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_message_utils_multimodal.py +0 -0
  99. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_multiturn_env.py +0 -0
  100. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_nemorl_client.py +0 -0
  101. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_openai_chat_completions_token_client.py +0 -0
  102. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_openai_responses_client.py +0 -0
  103. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_opencode_rlm_env.py +0 -0
  104. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_openenv_client.py +0 -0
  105. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_parser.py +0 -0
  106. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_path_utils.py +0 -0
  107. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_per_turn_timing.py +0 -0
  108. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_pricing_utils.py +0 -0
  109. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_prime_plugin.py +0 -0
  110. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_renderer_client.py +0 -0
  111. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_renderer_e2e.py +0 -0
  112. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_rlm_composable_env.py +0 -0
  113. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_rubric.py +0 -0
  114. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_rubric_group.py +0 -0
  115. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_sandbox_debug_env.py +0 -0
  116. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_sandbox_env.py +0 -0
  117. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_sandbox_mixin.py +0 -0
  118. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_save_utils.py +0 -0
  119. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_setup_script.py +0 -0
  120. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_singleturn_env.py +0 -0
  121. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_stateful_tool_env.py +0 -0
  122. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_think_parser.py +0 -0
  123. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_tool_env.py +0 -0
  124. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_tool_utils.py +0 -0
  125. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_trajectory_processing.py +0 -0
  126. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_tui_info_formatting.py +0 -0
  127. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_types.py +0 -0
  128. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/test_xml_parser.py +0 -0
  129. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/v1/fixtures/duet_v1.py +0 -0
  130. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  131. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/v1/fixtures/echo_multi_v0.py +0 -0
  132. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  133. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/v1/fixtures/echo_v0.py +0 -0
  134. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/v1/fixtures/echo_v1.py +0 -0
  135. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/v1/fixtures/pyproject.toml +0 -0
  136. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/v1/test_configs.py +0 -0
  137. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/v1/test_envs.py +0 -0
  138. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/v1/test_legacy.py +0 -0
  139. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/tests/v1/test_scoring.py +0 -0
  140. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/__init__.py +0 -0
  141. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/cli/__init__.py +0 -0
  142. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/cli/commands/__init__.py +0 -0
  143. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/cli/commands/build.py +0 -0
  144. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/cli/commands/eval.py +0 -0
  145. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/cli/commands/gepa.py +0 -0
  146. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/cli/commands/init.py +0 -0
  147. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/cli/commands/install.py +0 -0
  148. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/cli/commands/setup.py +0 -0
  149. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/cli/plugins/__init__.py +0 -0
  150. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/cli/plugins/prime.py +0 -0
  151. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/cli/tui.py +0 -0
  152. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/clients/__init__.py +0 -0
  153. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/clients/anthropic_messages_client.py +0 -0
  154. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/clients/client.py +0 -0
  155. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
  156. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/clients/openai_chat_completions_client.py +0 -0
  157. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
  158. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/clients/openai_completions_client.py +0 -0
  159. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/clients/openai_responses_client.py +0 -0
  160. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/clients/renderer_client.py +0 -0
  161. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/decorators.py +0 -0
  162. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/__init__.py +0 -0
  163. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/env_group.py +0 -0
  164. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/environment.py +0 -0
  165. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/README.md +0 -0
  166. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/__init__.py +0 -0
  167. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/cli_agent_env.py +0 -0
  168. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/README.md +0 -0
  169. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/__init__.py +0 -0
  170. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/_filter.py +0 -0
  171. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/composable_env.py +0 -0
  172. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/harness.py +0 -0
  173. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
  174. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  175. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
  176. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
  177. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
  178. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
  179. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
  180. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/task.py +0 -0
  181. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
  182. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  183. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  184. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  185. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  186. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  187. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  188. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  189. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  190. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  191. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
  192. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  193. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  194. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  195. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  196. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  197. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  198. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  199. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  200. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  201. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  202. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  203. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  204. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  205. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  206. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  207. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  208. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  209. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  210. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  211. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  212. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  213. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  214. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  215. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/gym_env.py +0 -0
  216. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
  217. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/harbor_env/env.py +0 -0
  218. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
  219. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/mcp_env.py +0 -0
  220. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/opencode_env.py +0 -0
  221. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
  222. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
  223. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
  224. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/utils/__init__.py +0 -0
  225. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/utils/file_locks.py +0 -0
  226. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
  227. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/integrations/README.md +0 -0
  228. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/integrations/__init__.py +0 -0
  229. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/integrations/browser_env/README.md +0 -0
  230. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
  231. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
  232. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
  233. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
  234. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  235. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  236. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/integrations/openenv_env.py +0 -0
  237. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
  238. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/integrations/textarena_env.py +0 -0
  239. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/multiturn_env.py +0 -0
  240. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/python_env.py +0 -0
  241. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/sandbox_env.py +0 -0
  242. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/singleturn_env.py +0 -0
  243. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/stateful_tool_env.py +0 -0
  244. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/envs/tool_env.py +0 -0
  245. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/errors.py +0 -0
  246. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/gepa/__init__.py +0 -0
  247. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/gepa/adapter.py +0 -0
  248. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/gepa/config.py +0 -0
  249. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/gepa/display.py +0 -0
  250. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/gepa/gepa_utils.py +0 -0
  251. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/parsers/__init__.py +0 -0
  252. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/parsers/maybe_think_parser.py +0 -0
  253. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/parsers/parser.py +0 -0
  254. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/parsers/think_parser.py +0 -0
  255. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/parsers/xml_parser.py +0 -0
  256. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/rubrics/__init__.py +0 -0
  257. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
  258. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/rubrics/judge_rubric.py +0 -0
  259. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/rubrics/math_rubric.py +0 -0
  260. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/rubrics/rubric.py +0 -0
  261. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/rubrics/rubric_group.py +0 -0
  262. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/scripts/__init__.py +0 -0
  263. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/scripts/build.py +0 -0
  264. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/scripts/eval.py +0 -0
  265. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/scripts/gepa.py +0 -0
  266. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/scripts/init.py +0 -0
  267. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/scripts/install.py +0 -0
  268. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/scripts/setup.py +0 -0
  269. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/scripts/tui.py +0 -0
  270. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/serve/__init__.py +0 -0
  271. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/serve/client/env_client.py +0 -0
  272. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/serve/client/zmq_env_client.py +0 -0
  273. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/serve/server/__init__.py +0 -0
  274. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/serve/server/env_router.py +0 -0
  275. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/serve/server/env_server.py +0 -0
  276. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/serve/server/env_worker.py +0 -0
  277. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/serve/server/zmq_env_server.py +0 -0
  278. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/serve/types.py +0 -0
  279. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/types.py +0 -0
  280. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/utils/__init__.py +0 -0
  281. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/utils/async_utils.py +0 -0
  282. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/utils/client_utils.py +0 -0
  283. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/utils/config_utils.py +0 -0
  284. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/utils/data_utils.py +0 -0
  285. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/utils/display_utils.py +0 -0
  286. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/utils/env_config_utils.py +0 -0
  287. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/utils/env_utils.py +0 -0
  288. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/utils/error_utils.py +0 -0
  289. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/utils/eval_display.py +0 -0
  290. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/utils/eval_utils.py +0 -0
  291. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/utils/heartbeat.py +0 -0
  292. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/utils/import_utils.py +0 -0
  293. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/utils/install_utils.py +0 -0
  294. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/utils/interception_utils.py +0 -0
  295. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/utils/logging_utils.py +0 -0
  296. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/utils/message_utils.py +0 -0
  297. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/utils/metric_utils.py +0 -0
  298. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/utils/path_utils.py +0 -0
  299. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/utils/pricing_utils.py +0 -0
  300. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/utils/process_utils.py +0 -0
  301. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/utils/response_utils.py +0 -0
  302. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/utils/save_utils.py +0 -0
  303. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/utils/serve_utils.py +0 -0
  304. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/utils/thread_utils.py +0 -0
  305. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/utils/threaded_sandbox_client.py +0 -0
  306. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/utils/tool_utils.py +0 -0
  307. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/utils/usage_utils.py +0 -0
  308. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/utils/version_utils.py +0 -0
  309. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/acp/__init__.py +0 -0
  310. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/acp/_runner.py +0 -0
  311. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/cli/__init__.py +0 -0
  312. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  313. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/cli/dashboard/base.py +0 -0
  314. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/cli/dashboard/replay.py +0 -0
  315. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/cli/dashboard/validate.py +0 -0
  316. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/cli/eval/__init__.py +0 -0
  317. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/cli/eval/main.py +0 -0
  318. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/cli/eval/resume.py +0 -0
  319. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/cli/gepa.py +0 -0
  320. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/cli/output.py +0 -0
  321. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/cli/resolve.py +0 -0
  322. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/cli/serve.py +0 -0
  323. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/clients/__init__.py +0 -0
  324. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/clients/client.py +0 -0
  325. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/clients/config.py +0 -0
  326. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/clients/eval.py +0 -0
  327. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/clients/train.py +0 -0
  328. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/configs/__init__.py +0 -0
  329. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/configs/agent.py +0 -0
  330. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/configs/cli/__init__.py +0 -0
  331. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/configs/cli/debug.py +0 -0
  332. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/configs/cli/env.py +0 -0
  333. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/configs/cli/eval.py +0 -0
  334. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/configs/cli/init.py +0 -0
  335. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/configs/cli/replay.py +0 -0
  336. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/configs/cli/serve.py +0 -0
  337. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/configs/cli/validate.py +0 -0
  338. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/configs/env.py +0 -0
  339. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/configs/harness.py +0 -0
  340. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/configs/legacy.py +0 -0
  341. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/configs/retries.py +0 -0
  342. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/configs/serve.py +0 -0
  343. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/configs/task.py +0 -0
  344. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/decorators.py +0 -0
  345. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/dialects/__init__.py +0 -0
  346. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/dialects/anthropic.py +0 -0
  347. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/dialects/base.py +0 -0
  348. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/dialects/chat.py +0 -0
  349. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/dialects/responses.py +0 -0
  350. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/envs/__init__.py +0 -0
  351. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  352. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/envs/best_of_n/env.py +0 -0
  353. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  354. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/envs/single_agent/env.py +0 -0
  355. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/envs/user_sim/__init__.py +0 -0
  356. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/gepa/__init__.py +0 -0
  357. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/gepa/config.py +0 -0
  358. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/gepa/dataset.py +0 -0
  359. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/gepa/reflection.py +0 -0
  360. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/harness.py +0 -0
  361. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  362. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/bash/harness.py +0 -0
  363. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/bash/program.py +0 -0
  364. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  365. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
  366. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  367. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/codex/harness.py +0 -0
  368. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  369. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  370. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  371. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  372. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  373. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/null/__init__.py +0 -0
  374. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/null/harness.py +0 -0
  375. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/null/program.py +0 -0
  376. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  377. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/pi/harness.py +0 -0
  378. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/pool/__init__.py +0 -0
  379. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/pool/harness.py +0 -0
  380. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  381. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  382. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  383. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  384. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  385. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/interception/__init__.py +0 -0
  386. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/interception/base.py +0 -0
  387. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/interception/pool.py +0 -0
  388. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/interception/server.py +0 -0
  389. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  390. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/interception/tunnel/base.py +0 -0
  391. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/interception/tunnel/custom.py +0 -0
  392. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/interception/tunnel/prime.py +0 -0
  393. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/judges/__init__.py +0 -0
  394. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/judges/reference.py +0 -0
  395. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/judges/reference.txt +0 -0
  396. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/judges/rubric.txt +0 -0
  397. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/mcp/__init__.py +0 -0
  398. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/mcp/toolset.py +0 -0
  399. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/runtimes/__init__.py +0 -0
  400. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/runtimes/base.py +0 -0
  401. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/runtimes/docker/__init__.py +0 -0
  402. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/runtimes/docker/egress.py +0 -0
  403. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/runtimes/limiters.py +0 -0
  404. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/runtimes/modal.py +0 -0
  405. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/runtimes/prime.py +0 -0
  406. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/scoring.py +0 -0
  407. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/serve/__init__.py +0 -0
  408. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/serve/client.py +0 -0
  409. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/serve/pool.py +0 -0
  410. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/serve/types.py +0 -0
  411. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/session.py +0 -0
  412. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/tasksets/__init__.py +0 -0
  413. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  414. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  415. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  416. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  417. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  418. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  419. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  420. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/utils/__init__.py +0 -0
  421. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/utils/aio.py +0 -0
  422. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/utils/format.py +0 -0
  423. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/utils/image.py +0 -0
  424. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/utils/install.py +0 -0
  425. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/utils/interrupt.py +0 -0
  426. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/utils/logging.py +0 -0
  427. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/utils/memory.py +0 -0
  428. {verifiers-0.2.2.dev48 → verifiers-0.2.2.dev57}/verifiers/v1/utils/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: verifiers
3
- Version: 0.2.2.dev48
3
+ Version: 0.2.2.dev57
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
@@ -136,8 +136,10 @@ kuhn-poker-v1 = { path = "environments/kuhn_poker_v1", editable = true }
136
136
 
137
137
  [tool.uv.exclude-newer-package]
138
138
  # Bounded cutoffs for the explicitly requested tool upgrades.
139
- ruff = "2026-07-27"
140
- ty = "2026-07-27"
139
+ # Full UTC timestamps: bare dates resolve to local-tz midnight and churn the
140
+ # lockfile across timezones.
141
+ ruff = "2026-07-28T00:00:00Z"
142
+ ty = "2026-07-28T00:00:00Z"
141
143
  # PrimeIntellect-published on PyPI (trusted publisher)
142
144
  prime-tunnel = false
143
145
  prime-sandboxes = false
@@ -232,6 +234,7 @@ markers = [
232
234
  "colocated: v1 e2e cases with a user/tool server colocated in the harness runtime",
233
235
  "null: v1 e2e cases on the null harness",
234
236
  "bash: v1 e2e cases on the bash harness",
237
+ "browser_use: v1 e2e cases on the browser_use harness",
235
238
  "rlm: v1 e2e cases on the rlm harness",
236
239
  "kimi_code: v1 e2e cases on the kimi-code harness",
237
240
  "pi: v1 e2e cases on the pi harness",
@@ -135,10 +135,6 @@ def _eval_config(
135
135
  `{id: ...}` config; `runtime` places the `agent` seat's harness (an agent field, not a
136
136
  harness one); `model` overrides the default text model (e.g. a VLM for an image task).
137
137
 
138
- `temperature=0` (greedy) makes the run reproducible; `max_tokens` is generous headroom,
139
- not a target — these trivial tasks finish in a few hundred tokens, so capping tighter only
140
- risks truncating the reasoning before the answer (which tanks the reward).
141
-
142
138
  `harness=None` leaves every seat on its own story — the multi-agent case: there
143
139
  is no run-level harness, so a single-agent test's `harness` lands on the `agent`
144
140
  seat and a multi-agent test pins its seats through `env` role fields instead."""
@@ -175,7 +171,6 @@ def _eval_config(
175
171
  num_rollouts=n,
176
172
  sampling={
177
173
  "max_tokens": max_tokens,
178
- "temperature": 0,
179
174
  "reasoning_effort": reasoning_effort,
180
175
  },
181
176
  rich=False,
@@ -219,8 +214,8 @@ def run_v1_server():
219
214
 
220
215
  @pytest.fixture
221
216
  async def live_ctx():
222
- """A live `ModelContext` (the e2e default model + endpoint, greedy) for driving
223
- `Agent` directly — the agent-surface counterpart of `run_v1`."""
217
+ """A live `ModelContext` (the e2e default model + endpoint, provider-default
218
+ sampling) for driving `Agent` directly — the agent-surface counterpart of `run_v1`."""
224
219
  from verifiers.v1.clients import EvalClientConfig, ModelContext, resolve_client
225
220
  from verifiers.v1.types import SamplingConfig
226
221
 
@@ -229,7 +224,7 @@ async def live_ctx():
229
224
  yield ModelContext(
230
225
  model="deepseek/deepseek-v4-flash",
231
226
  client=client,
232
- sampling=SamplingConfig(max_tokens=2048, temperature=0),
227
+ sampling=SamplingConfig(max_tokens=2048),
233
228
  )
234
229
  finally:
235
230
  await client.close()
@@ -252,7 +247,7 @@ def run_v0():
252
247
  legacy={"id": env_id, "args": args or {}},
253
248
  num_tasks=1,
254
249
  num_rollouts=n,
255
- sampling={"max_tokens": max_tokens, "temperature": 0},
250
+ sampling={"max_tokens": max_tokens},
256
251
  rich=False,
257
252
  output_dir=output_dir,
258
253
  )
@@ -24,7 +24,9 @@ class CounterTaskConfig(vf.TaskConfig):
24
24
 
25
25
 
26
26
  class CounterTask(vf.Task[vf.TaskData, CounterState, CounterTaskConfig]):
27
- tools = (CounterToolset,)
27
+ @classmethod
28
+ def toolsets(cls, config: CounterTaskConfig) -> list[vf.Toolset]:
29
+ return [CounterToolset(config.tools)]
28
30
 
29
31
  @vf.reward(weight=1.0)
30
32
  async def counted(self, trace: vf.Trace) -> float:
@@ -28,7 +28,9 @@ class ACPResumeConfig(vf.TasksetConfig):
28
28
 
29
29
 
30
30
  class ACPResumeTask(vf.Task[vf.TaskData, vf.State, ACPResumeTaskConfig]):
31
- tools = (ResumeToolset,)
31
+ @classmethod
32
+ def toolsets(cls, config: ACPResumeTaskConfig) -> list[vf.Toolset]:
33
+ return [ResumeToolset(config.tools)]
32
34
 
33
35
  @vf.reward(weight=1.0)
34
36
  async def resumed(self, trace: vf.Trace) -> float:
@@ -29,7 +29,9 @@ class EchoToolTaskConfig(vf.TaskConfig):
29
29
 
30
30
 
31
31
  class EchoToolTask(vf.Task[vf.TaskData, vf.State, EchoToolTaskConfig]):
32
- tools = (EchoToolset,)
32
+ @classmethod
33
+ def toolsets(cls, config: EchoToolTaskConfig) -> list[vf.Toolset]:
34
+ return [EchoToolset(config.tools)]
33
35
 
34
36
  @vf.reward(weight=1.0)
35
37
  async def echoed(self, trace: vf.Trace) -> float:
@@ -26,8 +26,16 @@ class VisionToolset(vf.Toolset[vf.ToolsetConfig]):
26
26
  ]
27
27
 
28
28
 
29
- class ToolResponseImageTask(vf.Task):
30
- tools = (VisionToolset,)
29
+ class ToolResponseImageTaskConfig(vf.TaskConfig):
30
+ tools: vf.ToolsetConfig = vf.ToolsetConfig()
31
+
32
+
33
+ class ToolResponseImageTask(
34
+ vf.Task[vf.TaskData, vf.State, ToolResponseImageTaskConfig]
35
+ ):
36
+ @classmethod
37
+ def toolsets(cls, config: ToolResponseImageTaskConfig) -> list[vf.Toolset]:
38
+ return [VisionToolset(config.tools)]
31
39
 
32
40
  @vf.reward(weight=1.0)
33
41
  async def preserved_image_tool_result(self, trace: vf.Trace) -> float:
@@ -39,7 +47,13 @@ class ToolResponseImageTask(vf.Task):
39
47
  return 0.0
40
48
 
41
49
 
42
- class ToolResponseImageTaskset(vf.Taskset[ToolResponseImageTask, vf.TasksetConfig]):
50
+ class ToolResponseImageConfig(vf.TasksetConfig):
51
+ task: ToolResponseImageTaskConfig = ToolResponseImageTaskConfig()
52
+
53
+
54
+ class ToolResponseImageTaskset(
55
+ vf.Taskset[ToolResponseImageTask, ToolResponseImageConfig]
56
+ ):
43
57
  def load(self) -> list[ToolResponseImageTask]:
44
58
  return [
45
59
  ToolResponseImageTask(
@@ -10,9 +10,7 @@ def test_color_images_are_rendered_once(monkeypatch) -> None:
10
10
  return render(image)
11
11
 
12
12
  monkeypatch.setattr(taskset, "image_data_url", counted)
13
- tasks = taskset.ColorCodewordTaskset(taskset.ColorCodewordConfig()).select(
14
- num_tasks=100
15
- )
13
+ tasks = list(taskset.ColorCodewordTaskset(taskset.ColorCodewordConfig()).head(100))
16
14
 
17
15
  assert len(tasks) == 100
18
16
  assert calls == list(taskset.COLOR_RGB.values())
@@ -109,7 +109,7 @@ async def test_single_turn(run_v1, harness, harness_runtime, tmp_path):
109
109
  assert trace.stop_condition == "agent_completed"
110
110
  assert trace.reward == 1.0
111
111
  # The seat's resolved identity rides the trace (policy metadata for trainers).
112
- assert trace.agent is not None and trace.agent.config.sampling.temperature == 0
112
+ assert trace.agent is not None and trace.agent.config.sampling.max_tokens == 2048
113
113
  # Every sampled turn has one per-call record, linked to its assistant node.
114
114
  sampled = [i for i, n in enumerate(trace.nodes) if n.sampled]
115
115
  assert [c.node for c in trace.calls if c.error is None] == sampled
@@ -118,6 +118,26 @@ async def test_single_turn(run_v1, harness, harness_runtime, tmp_path):
118
118
  assert call.time.duration > 0
119
119
 
120
120
 
121
+ @pytest.mark.e2e
122
+ @pytest.mark.browser_use
123
+ @pytest.mark.docker
124
+ async def test_browser_use(run_v1, tmp_path):
125
+ """The browser_use harness runs in an explicitly browser-capable runtime."""
126
+ image = (
127
+ "mcr.microsoft.com/playwright/python:v1.61.0-noble@"
128
+ "sha256:a9731514f24121d1dcd25d58d0a38146646d290a5998fd80d3e533e7b5e21c69"
129
+ )
130
+ (trace,) = await run_v1(
131
+ "echo-v1",
132
+ harness="browser_use",
133
+ runtime={"type": "docker", "image": image},
134
+ output_dir=tmp_path,
135
+ max_turns=2,
136
+ )
137
+ assert trace.ok
138
+ assert trace.reward == 1.0
139
+
140
+
121
141
  @pytest.mark.e2e
122
142
  @pytest.mark.parametrize("harness_runtime", USER_RUNTIMES, indirect=True)
123
143
  async def test_user(run_v1, harness_runtime, tmp_path):
@@ -229,7 +249,7 @@ async def test_tool(run_v1, harness_runtime, tool_runtime, tmp_path):
229
249
  assert trace.reward == 1.0
230
250
  # The interception server captured the advertised tools onto the trace (for tool-use SFT):
231
251
  # the null harness offered the task's MCP tool as `echo_back`, schema included.
232
- assert trace.tools is not None
252
+ assert trace.tools
233
253
  (echo_tool,) = [t for t in trace.tools if t.name == "echo_back"]
234
254
  assert "message" in echo_tool.parameters.get("properties", {})
235
255
 
@@ -335,6 +355,7 @@ async def test_agentic(run_v1, harness, harness_runtime, tmp_path):
335
355
  runtime={"type": harness_runtime},
336
356
  output_dir=tmp_path,
337
357
  max_turns=10,
358
+ max_tokens=8192,
338
359
  )
339
360
  assert trace.ok
340
361
  assert trace.num_turns >= 1 # ran a command, then finished
@@ -355,9 +376,9 @@ async def test_multi_agent_env(run_v1, tmp_path):
355
376
  max_turns=2,
356
377
  )
357
378
  assert len(traces) == 2 # one episode, one trace per role
358
- assert sorted(t.agent_name for t in traces) == ["a", "b"]
359
- (b,) = [t for t in traces if t.agent_name == "b"]
360
- assert b.trainable is False
379
+ assert sorted(t.agent.name for t in traces) == ["a", "b"]
380
+ (b,) = [t for t in traces if t.agent.name == "b"]
381
+ assert b.agent.trainable is False
361
382
  for trace in traces:
362
383
  assert trace.ok
363
384
  assert trace.reward == 1.0 # each seat's own task reward
@@ -366,7 +387,7 @@ async def test_multi_agent_env(run_v1, tmp_path):
366
387
  # agent info (completion order — the gathered seats land in either order).
367
388
  (line,) = (tmp_path / "traces.jsonl").read_text().splitlines()
368
389
  row = json.loads(line)
369
- assert row["env"] == "duet-v1"
390
+ assert row["env"] == {"id": "duet-v1"}
370
391
  by_name = {t["agent"]["name"]: t for t in row["traces"]}
371
392
  assert set(by_name) == {"a", "b"}
372
393
  assert by_name["a"]["agent"]["trainable"] is True
@@ -385,7 +406,7 @@ async def test_env_id_best_of_n(run_v1, tmp_path):
385
406
  max_turns=2,
386
407
  )
387
408
  assert len(traces) == 2 # one episode, two attempts
388
- assert all(t.agent_name == "agent" and t.ok for t in traces)
409
+ assert all(t.agent.name == "agent" and t.ok for t in traces)
389
410
  assert any(t.metrics["best"] == 1.0 for t in traces)
390
411
  assert all(t.metrics["pass_at_n"] == 1.0 for t in traces) # echo always passes
391
412
 
@@ -401,21 +422,21 @@ async def test_env_id_agentic_judge(run_v1, tmp_path):
401
422
  model's call. Exercises the config surface too: a policy-only prompt
402
423
  override (the verdict contract is appended regardless) and
403
424
  reward-composition weights."""
425
+ policy = tmp_path / "judge_policy.txt"
426
+ policy.write_text("Check EMPIRICALLY that the agent echoed the word back.")
404
427
  traces = await run_v1(
405
428
  "echo-v1",
406
- harness=None, # seats pin their own harness; there is no run-level one
429
+ harness=None,
407
430
  env={
408
431
  "id": "agentic-judge",
409
- # The solver owns the shared box, so the container is pinned here.
410
432
  "solver": {"harness": {"id": "bash"}, "runtime": {"type": "docker"}},
411
- # The judge reads the trace and reasons before it writes the
412
- # verdict file; the shared 2048-token run cap truncates it mid-audit.
413
433
  "judge": {
414
434
  "harness": {"id": "bash"},
415
435
  "max_output_tokens": 8192,
416
436
  },
417
437
  "task": {
418
- "prompt": "Check EMPIRICALLY that the agent echoed the word back.",
438
+ "prompt": {"path": str(policy)},
439
+ "hint": "Do not rely on README.md",
419
440
  },
420
441
  "score": {"task_weight": 0.5},
421
442
  },
@@ -423,15 +444,15 @@ async def test_env_id_agentic_judge(run_v1, tmp_path):
423
444
  max_turns=10,
424
445
  rollout_timeout=600,
425
446
  )
426
- assert sorted(t.agent_name for t in traces) == ["judge", "solver"]
427
- (solver,) = [t for t in traces if t.agent_name == "solver"]
428
- (judge,) = [t for t in traces if t.agent_name == "judge"]
447
+ assert sorted(t.agent.name for t in traces) == ["judge", "solver"]
448
+ (solver,) = [t for t in traces if t.agent.name == "solver"]
449
+ (judge,) = [t for t in traces if t.agent.name == "judge"]
429
450
  assert solver.ok and judge.ok
430
- assert judge.trainable is False
451
+ assert judge.agent.trainable is False
431
452
  # The task's own reward keeps its raw score; the rescale lands on the weight.
432
453
  assert solver.rewards["echoed"].score == 1.0
433
454
  assert solver.rewards["echoed"].weight == 0.5
434
- assert isinstance(judge.info.get("verdict"), dict) # scraped off the box
455
+ assert isinstance(judge.info.get("verdict"), dict)
435
456
  assert 0.0 <= solver.rewards["judge"].score <= 1.0
436
457
 
437
458
 
@@ -448,11 +469,11 @@ async def test_env_id_user_sim(run_v1, tmp_path):
448
469
  max_turns=6,
449
470
  rollout_timeout=300,
450
471
  )
451
- assert sorted(t.agent_name for t in traces) == ["assistant", "user"]
452
- (assistant,) = [t for t in traces if t.agent_name == "assistant"]
453
- (user,) = [t for t in traces if t.agent_name == "user"]
472
+ assert sorted(t.agent.name for t in traces) == ["assistant", "user"]
473
+ (assistant,) = [t for t in traces if t.agent.name == "assistant"]
474
+ (user,) = [t for t in traces if t.agent.name == "user"]
454
475
  assert assistant.ok and user.ok
455
- assert user.trainable is False
476
+ assert user.agent.trainable is False
456
477
  assert user.num_turns >= 1 # the modeled user actually spoke
457
478
  assert assistant.metrics["user_turns"] >= 1
458
479
  # `mask_prompt`: the scenario is hidden from the assistant's harness (the run's
@@ -465,7 +486,7 @@ async def test_env_id_user_sim(run_v1, tmp_path):
465
486
  from verifiers.v1.trace import WireTrace
466
487
 
467
488
  (record,) = read_episodes(tmp_path, WireTrace)
468
- assert {t.agent_name for t in record.traces} == {"assistant", "user"}
489
+ assert {t.agent.name for t in record.traces} == {"assistant", "user"}
469
490
  assert record.id # both traces are persisted under one durable episode identity
470
491
 
471
492
 
@@ -488,14 +509,14 @@ async def test_env_id_user_sim_with_tools(run_v1, tmp_path):
488
509
  max_tokens=8192,
489
510
  rollout_timeout=300,
490
511
  )
491
- (assistant,) = [t for t in traces if t.agent_name == "assistant"]
492
- (user,) = [t for t in traces if t.agent_name == "user"]
512
+ (assistant,) = [t for t in traces if t.agent.name == "assistant"]
513
+ (user,) = [t for t in traces if t.agent.name == "user"]
493
514
  assert assistant.ok and user.ok
494
515
  assert assistant.task.data.prompt is None # the scenario stayed off the wire
495
516
  assert user.num_turns >= 1 # the modeled user actually drove the exchange
496
517
  assert assistant.rewards["echoed"].score == 1.0 # the tool ran, mid-conversation
497
518
  # The tool was advertised to the masked chat exactly as to any run.
498
- assert assistant.tools is not None
519
+ assert assistant.tools
499
520
  assert any(tool.name == "echo_back" for tool in assistant.tools)
500
521
 
501
522
 
@@ -514,8 +535,8 @@ async def test_kuhn_poker_self_play(run_v1, tmp_path):
514
535
  max_tokens=8192,
515
536
  rollout_timeout=300,
516
537
  )
517
- assert sorted(t.agent_name for t in traces) == ["player0", "player1"]
518
- payoffs = {t.agent_name: t.rewards["payoff"].score for t in traces}
538
+ assert sorted(t.agent.name for t in traces) == ["player0", "player1"]
539
+ payoffs = {t.agent.name: t.rewards["payoff"].score for t in traces}
519
540
  assert payoffs["player0"] + payoffs["player1"] == 0 # zero-sum
520
541
  assert abs(payoffs["player0"]) in (1.0, 2.0)
521
542
  for trace in traces:
@@ -542,7 +563,7 @@ async def test_multi_agent_env_server(run_v1_server, tmp_path):
542
563
  max_turns=2,
543
564
  )
544
565
  assert len(traces) == 2
545
- assert sorted(t.agent_name for t in traces) == ["a", "b"]
566
+ assert sorted(t.agent.name for t in traces) == ["a", "b"]
546
567
  for trace in traces:
547
568
  assert trace.ok
548
569
  assert trace.metrics["duet"] == 1.0
@@ -40,7 +40,8 @@ def test_routed_experts_attributed_and_aligned_across_turns():
40
40
  concatenates back to a `[tokens, layers, top_k]` array aligned 1:1 with `branch.token_ids` —
41
41
  and survives the base64 wire round-trip."""
42
42
  trace = vf.Trace(
43
- task=vf.TraceTask(type="Task", data=vf.TaskData(idx=0, prompt="x"))
43
+ agent=vf.AgentInfo(config=vf.AgentConfig()),
44
+ task=vf.TraceTask(type="Task", data=vf.TaskData(idx=0, prompt="x")),
44
45
  )
45
46
  user = vf.UserMessage(content="u1")
46
47
  graph.prepare_turn(trace, [user]).commit(
@@ -94,7 +95,8 @@ def test_routed_experts_none_when_absent():
94
95
  """No routing captured (engine ran without `enable_return_routed_experts`) -> the branch
95
96
  reports None and the trainer simply skips replay."""
96
97
  trace = vf.Trace(
97
- task=vf.TraceTask(type="Task", data=vf.TaskData(idx=0, prompt="x"))
98
+ agent=vf.AgentInfo(config=vf.AgentConfig()),
99
+ task=vf.TraceTask(type="Task", data=vf.TaskData(idx=0, prompt="x")),
98
100
  )
99
101
  graph.prepare_turn(trace, [vf.UserMessage(content="u1")]).commit(
100
102
  vf.Response(
@@ -128,7 +130,10 @@ def test_tool_call_hash_matches_v0_content_and_arguments_normalization():
128
130
 
129
131
  def test_reasoning_content_participates_in_graph_prefix_matching():
130
132
  task = vf.TaskData(idx=0, prompt="use a tool")
131
- trace = vf.Trace(task=vf.TraceTask(type="Task", data=task))
133
+ trace = vf.Trace(
134
+ agent=vf.AgentInfo(config=vf.AgentConfig()),
135
+ task=vf.TraceTask(type="Task", data=task),
136
+ )
132
137
  user = vf.UserMessage(content="use a tool")
133
138
  call = vf.ToolCall(id="call_0", name="lookup", arguments="{}")
134
139
 
@@ -205,7 +210,8 @@ def test_renderer_level_break_forks_by_token_id():
205
210
 
206
211
  # Control: the prior turn re-renders to the same tokens -> stays one linear branch.
207
212
  linear = vf.Trace(
208
- task=vf.TraceTask(type="Task", data=vf.TaskData(idx=0, prompt="x"))
213
+ agent=vf.AgentInfo(config=vf.AgentConfig()),
214
+ task=vf.TraceTask(type="Task", data=vf.TaskData(idx=0, prompt="x")),
209
215
  )
210
216
  first_turn(linear)
211
217
  second_turn(linear, [1, 2, 3, 4, 5, 6, 7])
@@ -214,7 +220,8 @@ def test_renderer_level_break_forks_by_token_id():
214
220
 
215
221
  # Break: the assistant turn retokenizes (4 -> 99), so prompt_ids diverge at that node.
216
222
  broken = vf.Trace(
217
- task=vf.TraceTask(type="Task", data=vf.TaskData(idx=0, prompt="x"))
223
+ agent=vf.AgentInfo(config=vf.AgentConfig()),
224
+ task=vf.TraceTask(type="Task", data=vf.TaskData(idx=0, prompt="x")),
218
225
  )
219
226
  first_turn(broken)
220
227
  second_turn(broken, [1, 2, 3, 99, 5, 6, 7])
@@ -227,7 +234,10 @@ def test_renderer_level_break_forks_by_token_id():
227
234
 
228
235
  def test_prompt_supplied_assistant_messages_are_not_sampled_turns():
229
236
  task = vf.TaskData(idx=0, prompt="few-shot")
230
- trace = vf.Trace(task=vf.TraceTask(type="Task", data=task))
237
+ trace = vf.Trace(
238
+ agent=vf.AgentInfo(config=vf.AgentConfig()),
239
+ task=vf.TraceTask(type="Task", data=task),
240
+ )
231
241
  fabricated = vf.AssistantMessage(
232
242
  content=None,
233
243
  tool_calls=[vf.ToolCall(id="call_0", name="lookup", arguments="{}")],
@@ -36,6 +36,7 @@ def make_trace(
36
36
  task_cls: type[QAData] = QAData,
37
37
  ) -> vf.Trace:
38
38
  return vf.Trace(
39
+ agent=vf.AgentInfo(config=vf.AgentConfig()),
39
40
  task=vf.TraceTask(
40
41
  type="Task",
41
42
  data=task_cls(idx=0, prompt="Capital of France?", answer=answer),
@@ -244,6 +245,7 @@ async def test_reference_score_messages_prompt(fake_judge_model):
244
245
  answer="Paris",
245
246
  )
246
247
  trace = vf.Trace(
248
+ agent=vf.AgentInfo(config=vf.AgentConfig()),
247
249
  task=vf.TraceTask(type="Task", data=task),
248
250
  nodes=[
249
251
  MessageNode(parent=None, message=UserMessage(content="q"), sampled=False),
@@ -269,6 +271,7 @@ async def test_reference_question_field(fake_judge_model):
269
271
  answer="Paris",
270
272
  )
271
273
  trace = vf.Trace(
274
+ agent=vf.AgentInfo(config=vf.AgentConfig()),
272
275
  task=vf.TraceTask(type="Task", data=task),
273
276
  nodes=[
274
277
  MessageNode(parent=None, message=UserMessage(content="q"), sampled=False),
@@ -293,6 +296,7 @@ def full_trace_fixture() -> vf.Trace:
293
296
  from verifiers.v1.types import ToolCall, ToolMessage
294
297
 
295
298
  return vf.Trace(
299
+ agent=vf.AgentInfo(config=vf.AgentConfig()),
296
300
  task=vf.TraceTask(
297
301
  type="Task", data=QAData(idx=0, prompt="Capital of France?", answer="Paris")
298
302
  ),
@@ -367,32 +371,20 @@ async def test_rubric_view_full_trace(tmp_path, fake_judge_model):
367
371
  assert all("SECRET REASONING" not in prompt for prompt in fake_judge_model)
368
372
 
369
373
 
370
- async def test_config_prompt_overrides_class_template(fake_judge_model):
371
- judge = vf.ReferenceJudge(
372
- vf.ReferenceJudgeConfig(prompt="Q:{question} A:{answer} R:{response}")
373
- )
374
+ async def test_config_prompt_overrides_class_template(tmp_path, fake_judge_model):
375
+ # Config `prompt` is a file path; the same {field} placeholders work.
376
+ file = tmp_path / "judge.txt"
377
+ file.write_text("Q:{question} A:{answer} R:{response}")
378
+ judge = vf.ReferenceJudge(vf.ReferenceJudgeConfig(prompt=file))
374
379
  assert judge.build_messages(question="q", answer="a", response="r") == "Q:q A:a R:r"
375
380
  # A template needn't use every evaluate field: score also passes {positive}/{negative},
376
381
  # which str.format ignores when the (custom) prompt doesn't reference them.
377
382
  trace = make_trace()
378
383
  assert await judge.score(trace.task.data, trace) == 1.0
379
384
  assert fake_judge_model[0] == "Q:Capital of France? A:Paris R:It is Paris."
380
-
381
-
382
- async def test_prompt_file(tmp_path, fake_judge_model):
383
- # The prompt template can come from a file; the same {field} placeholders work.
384
- file = tmp_path / "judge.txt"
385
- file.write_text("Q:{question} A:{answer} R:{response}")
386
- trace = make_trace()
387
- judge = vf.ReferenceJudge(vf.ReferenceJudgeConfig(prompt_file=file))
388
- assert await judge.score(trace.task.data, trace) == 1.0
389
- assert fake_judge_model[0] == "Q:Capital of France? A:Paris R:It is Paris."
390
385
  # a bad path fails at judge construction, not mid-eval at score time
391
386
  with pytest.raises(FileNotFoundError):
392
- vf.ReferenceJudge(vf.ReferenceJudgeConfig(prompt_file=tmp_path / "missing.txt"))
393
- # inline and file prompts are mutually exclusive
394
- with pytest.raises(ValueError, match="not both"):
395
- vf.ReferenceJudgeConfig(prompt="inline", prompt_file=file)
387
+ vf.ReferenceJudge(vf.ReferenceJudgeConfig(prompt=tmp_path / "missing.txt"))
396
388
 
397
389
 
398
390
  # --- reference input/verdict knobs ------------------------------------------------------------
@@ -0,0 +1,93 @@
1
+ """`Taskset` iteration and the `head`/`shuffle` views over list, generator,
2
+ and `INFINITE` `load` implementations."""
3
+
4
+ import itertools
5
+
6
+ import pytest
7
+
8
+ import verifiers.v1 as vf
9
+
10
+
11
+ class CountTask(vf.Task[vf.TaskData]):
12
+ pass
13
+
14
+
15
+ class InfiniteTaskset(vf.Taskset[CountTask, vf.TasksetConfig]):
16
+ INFINITE = True
17
+
18
+ def load(self):
19
+ for i in itertools.count():
20
+ yield CountTask(vf.TaskData(idx=i, prompt=f"task {i}"))
21
+
22
+
23
+ class FiniteTaskset(vf.Taskset[CountTask, vf.TasksetConfig]):
24
+ def load(self):
25
+ for i in range(10):
26
+ yield CountTask(vf.TaskData(idx=i, prompt=f"task {i}"))
27
+
28
+
29
+ def idxs(tasks) -> list[int]:
30
+ return [task.data.idx for task in tasks]
31
+
32
+
33
+ def test_head_bounds_an_infinite_taskset() -> None:
34
+ tasks = list(InfiniteTaskset(vf.TasksetConfig()).head(5))
35
+ assert idxs(tasks) == [0, 1, 2, 3, 4]
36
+
37
+
38
+ def test_iteration_materializes_a_finite_taskset() -> None:
39
+ taskset = FiniteTaskset(vf.TasksetConfig())
40
+ assert len(list(taskset)) == 10
41
+ assert idxs(taskset.head(4)) == [0, 1, 2, 3]
42
+
43
+
44
+ def test_head_returns_the_same_taskset_type() -> None:
45
+ view = FiniteTaskset(vf.TasksetConfig()).head(4)
46
+ assert isinstance(view, FiniteTaskset)
47
+ assert view.task_type() is CountTask
48
+
49
+
50
+ def test_shuffle_samples_the_whole_taskset_reproducibly() -> None:
51
+ taskset = FiniteTaskset(vf.TasksetConfig())
52
+ first = idxs(taskset.shuffle().head(5))
53
+ assert first == idxs(taskset.shuffle().head(5))
54
+ assert len(first) == 5 and set(first) <= set(range(10))
55
+ assert first != [0, 1, 2, 3, 4] # sampled from the whole set, not the head
56
+
57
+
58
+ def test_shuffle_seed_changes_the_sample() -> None:
59
+ taskset = FiniteTaskset(vf.TasksetConfig())
60
+ seeded = idxs(taskset.shuffle(seed=7).head(5))
61
+ assert seeded == idxs(taskset.shuffle(seed=7).head(5)) # reproducible per seed
62
+ assert seeded != idxs(taskset.shuffle().head(5)) # differs from the default seed
63
+
64
+
65
+ def test_shuffle_raises_on_infinite() -> None:
66
+ with pytest.raises(ValueError, match="infinite"):
67
+ InfiniteTaskset(vf.TasksetConfig()).shuffle()
68
+
69
+
70
+ def test_head_then_shuffle_bounds_an_infinite_taskset() -> None:
71
+ head = idxs(InfiniteTaskset(vf.TasksetConfig()).head(5).shuffle())
72
+ assert sorted(head) == [0, 1, 2, 3, 4]
73
+ assert head != [0, 1, 2, 3, 4] # shuffled within the bounded head
74
+
75
+
76
+ def test_head_only_builds_what_the_run_takes() -> None:
77
+ built: list[int] = []
78
+
79
+ class RecordingTaskset(InfiniteTaskset):
80
+ def load(self):
81
+ for i in itertools.count():
82
+ built.append(i)
83
+ yield CountTask(vf.TaskData(idx=i, prompt=f"task {i}"))
84
+
85
+ list(RecordingTaskset(vf.TasksetConfig()).head(3))
86
+ assert built == [0, 1, 2]
87
+
88
+
89
+ def test_views_do_not_mutate_the_base_taskset() -> None:
90
+ taskset = InfiniteTaskset(vf.TasksetConfig())
91
+ view = taskset.head(3)
92
+ assert view.INFINITE is False and taskset.INFINITE is True
93
+ assert idxs(taskset.head(2)) == [0, 1] # base iterates untransformed
@@ -21,7 +21,8 @@ class MyState(vf.State):
21
21
  def test_bare_trace_round_trip():
22
22
  # The minimal trace: a base task, no nodes, no extras — dump and back into a plain Trace.
23
23
  tr = vf.Trace(
24
- task=vf.TraceTask(type="Task", data=vf.TaskData(idx=3, prompt="hello"))
24
+ agent=vf.AgentInfo(config=vf.AgentConfig()),
25
+ task=vf.TraceTask(type="Task", data=vf.TaskData(idx=3, prompt="hello")),
25
26
  )
26
27
  rt = vf.Trace.model_validate(tr.model_dump())
27
28
  assert rt.id == tr.id
@@ -35,6 +36,7 @@ def test_custom_task_state_round_trip():
35
36
  # Custom data and state round-trip into the same parameterization. Data fields are
36
37
  # typed (not just `model_extra`); `state` is runtime-only and never crosses the wire.
37
38
  tr = vf.Trace[MyTask, MyState](
39
+ agent=vf.AgentInfo(config=vf.AgentConfig()),
38
40
  task=vf.TraceTask(type="MyTask", data=MyTask(idx=0, prompt="q", answer="gold")),
39
41
  state=MyState(score=7),
40
42
  nodes=[
@@ -59,6 +61,7 @@ def test_wire_trace_round_trip():
59
61
  # Two leaves off one root → 2 branches (a compaction-shaped trace), so the round-trip has to
60
62
  # carry node `parent` links for `num_branches` to survive.
61
63
  tr = vf.Trace[MyTask, vf.State](
64
+ agent=vf.AgentInfo(config=vf.AgentConfig()),
62
65
  task=vf.TraceTask(type="MyTask", data=MyTask(idx=0, prompt="q", answer="a")),
63
66
  tools=[vf.Tool(name="echo", description="", parameters={"type": "object"})],
64
67
  nodes=[
@@ -4,6 +4,12 @@ from pydantic_config import BaseConfig
4
4
 
5
5
  from verifiers.v1.acp import ACP
6
6
  from verifiers.v1.agent import Agent, Agents, Interaction, Segment, make_agent
7
+ from verifiers.v1.artifacts import (
8
+ ARTIFACTS_DIR,
9
+ Artifact,
10
+ collect,
11
+ restore,
12
+ )
7
13
  from verifiers.v1.clients import (
8
14
  BaseClientConfig,
9
15
  Client,
@@ -109,10 +115,10 @@ from verifiers.v1.taskset import Taskset
109
115
  from verifiers.v1.trace import (
110
116
  TRACE_VERSION,
111
117
  AgentInfo,
118
+ AgentSpan,
112
119
  Branch,
113
120
  Error,
114
121
  EvalRunInfo,
115
- GenerationSpan,
116
122
  ModelCall,
117
123
  Reward,
118
124
  RunInfo,
@@ -138,7 +144,6 @@ from verifiers.v1.types import (
138
144
  Response,
139
145
  Sampling,
140
146
  SamplingConfig,
141
- StrictBaseModel,
142
147
  SystemMessage,
143
148
  TextContentPart,
144
149
  Tool,
@@ -171,7 +176,6 @@ __all__ = [ # noqa: RUF022 - grouped by public API area
171
176
  "Response",
172
177
  "Sampling",
173
178
  "SamplingConfig",
174
- "StrictBaseModel",
175
179
  "SystemMessage",
176
180
  "TextContentPart",
177
181
  "Tool",
@@ -207,7 +211,7 @@ __all__ = [ # noqa: RUF022 - grouped by public API area
207
211
  "Timing",
208
212
  "TimeSpan",
209
213
  "TimeSplit",
210
- "GenerationSpan",
214
+ "AgentSpan",
211
215
  "Error",
212
216
  # decorators
213
217
  "stop",
@@ -297,6 +301,11 @@ __all__ = [ # noqa: RUF022 - grouped by public API area
297
301
  "PATCH_CAP_BYTES",
298
302
  "capture_patch",
299
303
  "resolve_head",
304
+ # grading artifacts
305
+ "ARTIFACTS_DIR",
306
+ "Artifact",
307
+ "collect",
308
+ "restore",
300
309
  # scoring
301
310
  "compare_stdout_results",
302
311
  "extract_boxed_answer",