verifiers 0.2.2.dev18__tar.gz → 0.2.2.dev20__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 (415) hide show
  1. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/PKG-INFO +1 -1
  2. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/pyproject.toml +4 -0
  3. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/v1/conftest.py +28 -19
  4. verifiers-0.2.2.dev20/tests/v1/fixtures/echo_acp_resume_v1.py +100 -0
  5. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/v1/fixtures/echo_tool_v1.py +5 -4
  6. verifiers-0.2.2.dev20/tests/v1/fixtures/echo_user_sim_v1.py +65 -0
  7. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/v1/fixtures/pyproject.toml +3 -3
  8. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/v1/test_e2e.py +191 -18
  9. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/v1/test_envs.py +3 -0
  10. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/__init__.py +13 -8
  11. verifiers-0.2.2.dev20/verifiers/v1/acp/__init__.py +64 -0
  12. verifiers-0.2.2.dev20/verifiers/v1/acp/_runner.py +192 -0
  13. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/agent.py +297 -29
  14. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/cli/init.py +10 -59
  15. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/configs/init.py +0 -2
  16. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/dialects/base.py +1 -14
  17. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/dialects/chat.py +3 -15
  18. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/dialects/responses.py +0 -72
  19. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/env.py +3 -3
  20. verifiers-0.2.2.dev20/verifiers/v1/envs/user_sim/__init__.py +3 -0
  21. verifiers-0.2.2.dev20/verifiers/v1/envs/user_sim/env.py +95 -0
  22. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/errors.py +3 -7
  23. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/harness.py +87 -17
  24. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/harnesses/bash/harness.py +4 -3
  25. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/harnesses/claude_code/harness.py +4 -2
  26. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/harnesses/codex/harness.py +109 -22
  27. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/harnesses/kimi_code/harness.py +42 -12
  28. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/harnesses/mini_swe_agent/harness.py +3 -1
  29. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/harnesses/null/harness.py +4 -3
  30. verifiers-0.2.2.dev20/verifiers/v1/harnesses/pi/harness.py +248 -0
  31. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/harnesses/pool/harness.py +29 -60
  32. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/harnesses/rlm/harness.py +17 -11
  33. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/harnesses/terminus_2/harness.py +4 -4
  34. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/interception/__init__.py +7 -4
  35. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/interception/base.py +2 -2
  36. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/interception/server.py +143 -196
  37. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/interception/tunnel/custom.py +1 -1
  38. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/mcp/__init__.py +0 -9
  39. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/mcp/launch.py +15 -131
  40. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/rollout.py +114 -51
  41. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/runtimes/subprocess.py +40 -4
  42. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/session.py +2 -15
  43. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/state.py +1 -1
  44. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/task.py +10 -13
  45. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/tasksets/__init__.py +4 -8
  46. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/tasksets/openenv/__init__.py +4 -8
  47. verifiers-0.2.2.dev20/verifiers/v1/tasksets/openenv/taskset.py +154 -0
  48. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/tasksets/textarena/__init__.py +4 -6
  49. verifiers-0.2.2.dev20/verifiers/v1/tasksets/textarena/taskset.py +117 -0
  50. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/utils/compile.py +2 -8
  51. verifiers-0.2.2.dev18/tests/v1/fixtures/echo_user_sim_v1.py +0 -83
  52. verifiers-0.2.2.dev18/verifiers/v1/harnesses/pi/harness.py +0 -276
  53. verifiers-0.2.2.dev18/verifiers/v1/mcp/user.py +0 -76
  54. verifiers-0.2.2.dev18/verifiers/v1/tasksets/openenv/taskset.py +0 -154
  55. verifiers-0.2.2.dev18/verifiers/v1/tasksets/textarena/taskset.py +0 -152
  56. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/.gitignore +0 -0
  57. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/LICENSE +0 -0
  58. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/README.md +0 -0
  59. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/__init__.py +0 -0
  60. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/conftest.py +0 -0
  61. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_browser_env.py +0 -0
  62. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_build_script.py +0 -0
  63. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_cli_agent_env.py +0 -0
  64. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_client_auth_errors.py +0 -0
  65. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_client_config.py +0 -0
  66. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_client_multimodal_types.py +0 -0
  67. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_composable_env.py +0 -0
  68. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_context_token_metrics.py +0 -0
  69. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_decorator_ranks.py +0 -0
  70. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_endpoint_registry.py +0 -0
  71. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_env_group.py +0 -0
  72. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_env_server.py +0 -0
  73. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_environment.py +0 -0
  74. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_environment_extra.py +0 -0
  75. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_error_chain.py +0 -0
  76. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_eval_display.py +0 -0
  77. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_eval_utils.py +0 -0
  78. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_gepa_cli.py +0 -0
  79. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_gepa_utils.py +0 -0
  80. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_gym_env.py +0 -0
  81. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_harbor_env_mcp.py +0 -0
  82. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_imports.py +0 -0
  83. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_init_script.py +0 -0
  84. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_install_utils.py +0 -0
  85. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_interception_utils.py +0 -0
  86. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_logging.py +0 -0
  87. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_math_rubric.py +0 -0
  88. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_maybe_think_parser.py +0 -0
  89. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_message_utils.py +0 -0
  90. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_message_utils_multimodal.py +0 -0
  91. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_multiturn_env.py +0 -0
  92. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_nemorl_client.py +0 -0
  93. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_openai_chat_completions_token_client.py +0 -0
  94. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_openai_responses_client.py +0 -0
  95. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_opencode_rlm_env.py +0 -0
  96. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_openenv_client.py +0 -0
  97. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_parser.py +0 -0
  98. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_path_utils.py +0 -0
  99. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_per_turn_timing.py +0 -0
  100. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_pricing_utils.py +0 -0
  101. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_prime_plugin.py +0 -0
  102. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_renderer_client.py +0 -0
  103. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_renderer_e2e.py +0 -0
  104. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_rlm_composable_env.py +0 -0
  105. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_rubric.py +0 -0
  106. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_rubric_group.py +0 -0
  107. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_sandbox_debug_env.py +0 -0
  108. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_sandbox_env.py +0 -0
  109. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_sandbox_mixin.py +0 -0
  110. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_save_utils.py +0 -0
  111. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_setup_script.py +0 -0
  112. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_singleturn_env.py +0 -0
  113. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_stateful_tool_env.py +0 -0
  114. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_think_parser.py +0 -0
  115. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_tool_env.py +0 -0
  116. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_tool_utils.py +0 -0
  117. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_trajectory_processing.py +0 -0
  118. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_tui_info_formatting.py +0 -0
  119. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_types.py +0 -0
  120. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/test_xml_parser.py +0 -0
  121. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  122. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/v1/fixtures/duet_v1.py +0 -0
  123. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  124. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/v1/fixtures/echo_multi_v0.py +0 -0
  125. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/v1/fixtures/echo_v0.py +0 -0
  126. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/v1/fixtures/echo_v1.py +0 -0
  127. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  128. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/v1/test_color_codeword_tasks.py +0 -0
  129. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/v1/test_configs.py +0 -0
  130. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/v1/test_graph.py +0 -0
  131. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/v1/test_judges.py +0 -0
  132. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/v1/test_legacy.py +0 -0
  133. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/v1/test_scoring.py +0 -0
  134. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/v1/test_taskset.py +0 -0
  135. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/tests/v1/test_trace.py +0 -0
  136. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/__init__.py +0 -0
  137. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/cli/__init__.py +0 -0
  138. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/cli/commands/__init__.py +0 -0
  139. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/cli/commands/build.py +0 -0
  140. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/cli/commands/eval.py +0 -0
  141. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/cli/commands/gepa.py +0 -0
  142. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/cli/commands/init.py +0 -0
  143. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/cli/commands/install.py +0 -0
  144. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/cli/commands/setup.py +0 -0
  145. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/cli/plugins/__init__.py +0 -0
  146. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/cli/plugins/prime.py +0 -0
  147. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/cli/tui.py +0 -0
  148. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/clients/__init__.py +0 -0
  149. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/clients/anthropic_messages_client.py +0 -0
  150. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/clients/client.py +0 -0
  151. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
  152. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/clients/openai_chat_completions_client.py +0 -0
  153. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
  154. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/clients/openai_completions_client.py +0 -0
  155. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/clients/openai_responses_client.py +0 -0
  156. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/clients/renderer_client.py +0 -0
  157. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/decorators.py +0 -0
  158. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/__init__.py +0 -0
  159. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/env_group.py +0 -0
  160. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/environment.py +0 -0
  161. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/README.md +0 -0
  162. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/__init__.py +0 -0
  163. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/cli_agent_env.py +0 -0
  164. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/README.md +0 -0
  165. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/__init__.py +0 -0
  166. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/_filter.py +0 -0
  167. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/composable_env.py +0 -0
  168. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/harness.py +0 -0
  169. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
  170. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  171. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
  172. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
  173. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
  174. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
  175. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
  176. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/task.py +0 -0
  177. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
  178. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  179. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  180. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  181. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  182. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  183. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  184. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  185. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  186. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  187. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
  188. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  189. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  190. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  191. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  192. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  193. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  194. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  195. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  196. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  197. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  198. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  199. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  200. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  201. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  202. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  203. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  204. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  205. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  206. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  207. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  208. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  209. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  210. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  211. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/gym_env.py +0 -0
  212. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
  213. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/harbor_env/env.py +0 -0
  214. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
  215. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/mcp_env.py +0 -0
  216. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/opencode_env.py +0 -0
  217. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
  218. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
  219. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
  220. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/utils/__init__.py +0 -0
  221. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/utils/file_locks.py +0 -0
  222. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
  223. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/integrations/README.md +0 -0
  224. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/integrations/__init__.py +0 -0
  225. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/integrations/browser_env/README.md +0 -0
  226. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
  227. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
  228. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
  229. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
  230. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  231. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  232. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/integrations/openenv_env.py +0 -0
  233. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
  234. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/integrations/textarena_env.py +0 -0
  235. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/multiturn_env.py +0 -0
  236. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/python_env.py +0 -0
  237. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/sandbox_env.py +0 -0
  238. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/singleturn_env.py +0 -0
  239. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/stateful_tool_env.py +0 -0
  240. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/envs/tool_env.py +0 -0
  241. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/errors.py +0 -0
  242. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/gepa/__init__.py +0 -0
  243. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/gepa/adapter.py +0 -0
  244. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/gepa/config.py +0 -0
  245. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/gepa/display.py +0 -0
  246. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/gepa/gepa_utils.py +0 -0
  247. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/parsers/__init__.py +0 -0
  248. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/parsers/maybe_think_parser.py +0 -0
  249. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/parsers/parser.py +0 -0
  250. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/parsers/think_parser.py +0 -0
  251. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/parsers/xml_parser.py +0 -0
  252. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/rubrics/__init__.py +0 -0
  253. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
  254. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/rubrics/judge_rubric.py +0 -0
  255. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/rubrics/math_rubric.py +0 -0
  256. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/rubrics/rubric.py +0 -0
  257. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/rubrics/rubric_group.py +0 -0
  258. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/scripts/__init__.py +0 -0
  259. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/scripts/build.py +0 -0
  260. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/scripts/eval.py +0 -0
  261. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/scripts/gepa.py +0 -0
  262. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/scripts/init.py +0 -0
  263. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/scripts/install.py +0 -0
  264. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/scripts/setup.py +0 -0
  265. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/scripts/tui.py +0 -0
  266. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/serve/__init__.py +0 -0
  267. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/serve/client/env_client.py +0 -0
  268. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/serve/client/zmq_env_client.py +0 -0
  269. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/serve/server/__init__.py +0 -0
  270. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/serve/server/env_router.py +0 -0
  271. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/serve/server/env_server.py +0 -0
  272. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/serve/server/env_worker.py +0 -0
  273. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/serve/server/zmq_env_server.py +0 -0
  274. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/serve/types.py +0 -0
  275. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/types.py +0 -0
  276. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/utils/__init__.py +0 -0
  277. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/utils/async_utils.py +0 -0
  278. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/utils/client_utils.py +0 -0
  279. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/utils/config_utils.py +0 -0
  280. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/utils/data_utils.py +0 -0
  281. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/utils/display_utils.py +0 -0
  282. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/utils/env_config_utils.py +0 -0
  283. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/utils/env_utils.py +0 -0
  284. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/utils/error_utils.py +0 -0
  285. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/utils/eval_display.py +0 -0
  286. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/utils/eval_utils.py +0 -0
  287. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/utils/heartbeat.py +0 -0
  288. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/utils/import_utils.py +0 -0
  289. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/utils/install_utils.py +0 -0
  290. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/utils/interception_utils.py +0 -0
  291. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/utils/logging_utils.py +0 -0
  292. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/utils/message_utils.py +0 -0
  293. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/utils/metric_utils.py +0 -0
  294. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/utils/path_utils.py +0 -0
  295. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/utils/pricing_utils.py +0 -0
  296. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/utils/process_utils.py +0 -0
  297. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/utils/response_utils.py +0 -0
  298. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/utils/save_utils.py +0 -0
  299. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/utils/serve_utils.py +0 -0
  300. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/utils/thread_utils.py +0 -0
  301. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/utils/threaded_sandbox_client.py +0 -0
  302. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/utils/tool_utils.py +0 -0
  303. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/utils/usage_utils.py +0 -0
  304. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/utils/version_utils.py +0 -0
  305. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/cli/__init__.py +0 -0
  306. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  307. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/cli/dashboard/base.py +0 -0
  308. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/cli/dashboard/eval.py +0 -0
  309. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/cli/dashboard/replay.py +0 -0
  310. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/cli/dashboard/validate.py +0 -0
  311. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/cli/debug.py +0 -0
  312. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/cli/eval/__init__.py +0 -0
  313. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/cli/eval/main.py +0 -0
  314. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/cli/eval/resume.py +0 -0
  315. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/cli/eval/runner.py +0 -0
  316. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/cli/gepa.py +0 -0
  317. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/cli/output.py +0 -0
  318. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/cli/replay.py +0 -0
  319. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/cli/resolve.py +0 -0
  320. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/cli/serve.py +0 -0
  321. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/cli/validate.py +0 -0
  322. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/clients/__init__.py +0 -0
  323. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/clients/client.py +0 -0
  324. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/clients/config.py +0 -0
  325. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/clients/eval.py +0 -0
  326. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/clients/train.py +0 -0
  327. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/configs/__init__.py +0 -0
  328. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/configs/debug.py +0 -0
  329. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/configs/env.py +0 -0
  330. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/configs/eval.py +0 -0
  331. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/configs/replay.py +0 -0
  332. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/configs/serve.py +0 -0
  333. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/configs/validate.py +0 -0
  334. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/decorators.py +0 -0
  335. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/dialects/__init__.py +0 -0
  336. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/dialects/anthropic.py +0 -0
  337. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/envs/__init__.py +0 -0
  338. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
  339. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/envs/agentic_judge/env.py +0 -0
  340. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  341. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/envs/best_of_n/env.py +0 -0
  342. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  343. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/envs/single_agent/env.py +0 -0
  344. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/episode.py +0 -0
  345. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/gepa/__init__.py +0 -0
  346. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/gepa/adapter.py +0 -0
  347. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/gepa/config.py +0 -0
  348. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/gepa/dataset.py +0 -0
  349. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/gepa/reflection.py +0 -0
  350. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/gepa/runner.py +0 -0
  351. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/graph.py +0 -0
  352. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/harnesses/__init__.py +0 -0
  353. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  354. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/harnesses/bash/program.py +0 -0
  355. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  356. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  357. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  358. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  359. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  360. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/harnesses/null/__init__.py +0 -0
  361. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/harnesses/null/program.py +0 -0
  362. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  363. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/harnesses/pool/__init__.py +0 -0
  364. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  365. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  366. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  367. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/interception/pool.py +0 -0
  368. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  369. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/interception/tunnel/base.py +0 -0
  370. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/interception/tunnel/prime.py +0 -0
  371. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/judge.py +0 -0
  372. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/judges/__init__.py +0 -0
  373. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/judges/reference.py +0 -0
  374. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/judges/reference.txt +0 -0
  375. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/judges/rubric.py +0 -0
  376. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/judges/rubric.txt +0 -0
  377. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/legacy.py +0 -0
  378. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/loaders.py +0 -0
  379. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/mcp/server.py +0 -0
  380. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/mcp/toolset.py +0 -0
  381. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/push.py +0 -0
  382. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/retries.py +0 -0
  383. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/runtimes/__init__.py +0 -0
  384. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/runtimes/base.py +0 -0
  385. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/runtimes/docker/__init__.py +0 -0
  386. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/runtimes/docker/egress.py +0 -0
  387. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/runtimes/limiters.py +0 -0
  388. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/runtimes/modal.py +0 -0
  389. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/runtimes/prime.py +0 -0
  390. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/scoring.py +0 -0
  391. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/serve/__init__.py +0 -0
  392. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/serve/client.py +0 -0
  393. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/serve/pool.py +0 -0
  394. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/serve/server.py +0 -0
  395. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/serve/types.py +0 -0
  396. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/taskset.py +0 -0
  397. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  398. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  399. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  400. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  401. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  402. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/trace.py +0 -0
  403. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/types.py +0 -0
  404. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/utils/__init__.py +0 -0
  405. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/utils/aio.py +0 -0
  406. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/utils/format.py +0 -0
  407. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/utils/generic.py +0 -0
  408. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/utils/git.py +0 -0
  409. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/utils/image.py +0 -0
  410. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/utils/install.py +0 -0
  411. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/utils/interrupt.py +0 -0
  412. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/utils/logging.py +0 -0
  413. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/utils/memory.py +0 -0
  414. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/verifiers/v1/utils/sampling.py +0 -0
  415. {verifiers-0.2.2.dev18 → verifiers-0.2.2.dev20}/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.dev18
3
+ Version: 0.2.2.dev20
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
@@ -79,6 +79,7 @@ examples = [
79
79
  "gsm8k-v1", "glossary-v1", "deepwiki-v1", "wiki-search-v1", "code-golf-v1",
80
80
  "proposer-solver-v1", "reverse-text-v1", "color-codeword-v1",
81
81
  "wordle-v1", "openenv-wordle-v1", "alphabet-sort-v1", "scratchpad-v1",
82
+ "kuhn-poker-v1",
82
83
  ]
83
84
 
84
85
  [project.optional-dependencies]
@@ -131,6 +132,7 @@ openenv-wordle-v1 = { path = "environments/openenv_wordle_v1", editable = true }
131
132
  color-codeword-v1 = { path = "environments/color_codeword_v1", editable = true }
132
133
  alphabet-sort-v1 = { path = "environments/alphabet_sort_v1", editable = true }
133
134
  scratchpad-v1 = { path = "environments/scratchpad_v1", editable = true }
135
+ kuhn-poker-v1 = { path = "environments/kuhn_poker_v1", editable = true }
134
136
 
135
137
  [tool.uv.exclude-newer-package]
136
138
  # PrimeIntellect-published on PyPI (trusted publisher)
@@ -229,6 +231,8 @@ markers = [
229
231
  "bash: v1 e2e cases on the bash harness",
230
232
  "rlm: v1 e2e cases on the rlm harness",
231
233
  "kimi_code: v1 e2e cases on the kimi-code harness",
234
+ "pi: v1 e2e cases on the pi harness",
235
+ "pool: v1 e2e cases on the pool harness",
232
236
  "codex: v1 e2e cases on the codex harness",
233
237
  "unit: marks tests as unit tests",
234
238
  "asyncio: marks tests as async tests",
@@ -6,7 +6,7 @@ not unit tests of individual components. They need a model API key (`PRIME_API_K
6
6
  without one the `e2e`-marked tests skip (config parsing still runs).
7
7
 
8
8
  `run_v1` / `run_v0` mirror the eval CLI's two paths (`run_eval` for a v1 taskset,
9
- `run_legacy_eval` for a v0 env). Placement coverage (harness x harness runtime x user/tool
9
+ `run_legacy_eval` for a v0 env). Placement coverage (harness x harness runtime x tool
10
10
  server runtime) is PAIRWISE, not a full cross product: each test carries a curated list of
11
11
  combinations (in test_e2e.py) that hits every axis value and the cross-boundary pairs with
12
12
  distinct networking. The full cross bought flake exposure and CI minutes, not coverage — add
@@ -24,11 +24,11 @@ Every combination carries its axes' pytest marks, so subsets select with `-m`:
24
24
  uv run pytest tests/v1 -n auto -m modal # only modal (needs local setup)
25
25
 
26
26
  Marks: runtimes `subprocess` / `docker` / `prime` / `modal`, placement `colocated`,
27
- harnesses `null` / `bash` / `rlm` / `kimi_code` / `codex` / `claude_code`. A mark is applied per
28
- axis, so it selects every case touching that value on ANY axis; for one exact combination use `-k`
29
- on the test id (e.g. `-k "harness-in-docker-with-tool-in-subprocess"`). prime/modal provision real
30
- remote sandboxes (slow, infra-flaky, need setup), so they're local-only — CI runs
31
- `-m "not prime and not modal"`.
27
+ harnesses `null` / `bash` / `rlm` / `kimi_code` / `pi` / `pool` / `codex` / `claude_code`.
28
+ A mark is applied per axis, so it selects every case touching that value on ANY axis; for one exact
29
+ combination use `-k` on the test id (e.g. `-k "harness-in-docker-with-tool-in-subprocess"`).
30
+ prime/modal provision real remote sandboxes (slow, infra-flaky, need setup), so they're local-only
31
+ — CI runs `-m "not prime and not modal"`.
32
32
  """
33
33
 
34
34
  import os
@@ -56,15 +56,6 @@ def harness_runtime(request) -> str:
56
56
  return request.param
57
57
 
58
58
 
59
- @pytest.fixture
60
- def user_runtime(request) -> dict:
61
- """A `taskset.task.user` override placing the user simulator: `colocated` (inside the harness's
62
- runtime) or its own runtime, by type."""
63
- if request.param == "colocated":
64
- return {"colocated": True}
65
- return {"colocated": False, "runtime": {"type": request.param}}
66
-
67
-
68
59
  @pytest.fixture
69
60
  def tool_runtime(request) -> dict:
70
61
  """A `taskset.task.tools` override placing the tool server: `colocated` (inside the harness's
@@ -83,9 +74,9 @@ def harness(request) -> str:
83
74
 
84
75
 
85
76
  def pytest_configure(config) -> None:
86
- """Self-launching tool/user servers run `python -m <module>` in a fresh subprocess, which
77
+ """Self-launching tool servers run `python -m <module>` in a fresh subprocess, which
87
78
  inherits `PYTHONPATH` but not pytest's in-process `pythonpath`. Put the fixture dir on
88
- `PYTHONPATH` so a fixture server module (e.g. `echo_user_sim_v1`, `tool_response_image_v1`)
79
+ `PYTHONPATH` so a fixture server module (e.g. `tool_response_image_v1`)
89
80
  resolves there too — an installed example package (e.g. `glossary_v1`) already would."""
90
81
  fixtures = str(Path(__file__).parent / "fixtures")
91
82
  existing = os.environ.get("PYTHONPATH", "")
@@ -107,12 +98,12 @@ def pytest_collection_modifyitems(config, items) -> None:
107
98
 
108
99
 
109
100
  def _configure_prime_runtimes(config: dict) -> None:
110
- """Configure every prime runtime config (nested — harness / tool / user): tag a `vf-ci` label
101
+ """Configure every prime runtime config (nested — harness / tool): tag a `vf-ci` label
111
102
  for optional cleanup, and pin a region that supports port exposure."""
112
103
  if isinstance(config, dict):
113
104
  if config.get("type") == "prime":
114
105
  config.setdefault("labels", ["vf-ci"])
115
- # `us` is required for prime's port exposure, which a tool/user server hosted in a
106
+ # `us` is required for prime's port exposure, which a tool server hosted in a
116
107
  # sandbox needs to be reachable from outside it.
117
108
  config.setdefault("region", "us")
118
109
  for value in config.values():
@@ -221,6 +212,24 @@ def run_v1_server():
221
212
  return _run
222
213
 
223
214
 
215
+ @pytest.fixture
216
+ async def live_ctx():
217
+ """A live `ModelContext` (the e2e default model + endpoint, greedy) for driving
218
+ `Agent` directly — the agent-surface counterpart of `run_v1`."""
219
+ from verifiers.v1.clients import EvalClientConfig, ModelContext, resolve_client
220
+ from verifiers.v1.types import SamplingConfig
221
+
222
+ client = resolve_client(EvalClientConfig())
223
+ try:
224
+ yield ModelContext(
225
+ model="deepseek/deepseek-v4-flash",
226
+ client=client,
227
+ sampling=SamplingConfig(max_tokens=2048, temperature=0),
228
+ )
229
+ finally:
230
+ await client.close()
231
+
232
+
224
233
  @pytest.fixture
225
234
  def run_v0():
226
235
  """Run a legacy v0 env through the v1 bridge (the eval CLI's `--id` path)."""
@@ -0,0 +1,100 @@
1
+ """Two-segment ACP continuation with an MCP call after resume."""
2
+
3
+ import verifiers.v1 as vf
4
+
5
+ CODEWORD = "violet-cascade-731"
6
+ TOOL_STAMP = "resume-ok-9d2"
7
+
8
+
9
+ def _key(text: str) -> str:
10
+ return "".join(character for character in text.casefold() if character.isalnum())
11
+
12
+
13
+ class ResumeToolset(vf.Toolset[vf.ToolsetConfig]):
14
+ TOOL_PREFIX = "resume"
15
+
16
+ @vf.tool
17
+ def recall(self, codeword: str) -> str:
18
+ """Return the supplied codeword with a private verification stamp."""
19
+ return f"{codeword} [{TOOL_STAMP}]"
20
+
21
+
22
+ class ACPResumeTaskConfig(vf.TaskConfig):
23
+ tools: vf.ToolsetConfig = vf.ToolsetConfig(colocated=True)
24
+
25
+
26
+ class ACPResumeConfig(vf.TasksetConfig):
27
+ task: ACPResumeTaskConfig = ACPResumeTaskConfig()
28
+
29
+
30
+ class ACPResumeTask(vf.Task[vf.TaskData, vf.State, ACPResumeTaskConfig]):
31
+ tools = (ResumeToolset,)
32
+
33
+ @vf.reward(weight=1.0)
34
+ async def resumed(self, trace: vf.Trace) -> float:
35
+ segments = trace.info.get("acp_segments", [])
36
+ if len(segments) != 2:
37
+ return 0.0
38
+ first, second = segments
39
+ resumed_tool_output = "\n".join(second["tool_outputs"])
40
+ return float(
41
+ bool(first["last_reply"].strip())
42
+ and _key(CODEWORD) in _key(second["last_reply"])
43
+ and _key(TOOL_STAMP) in _key(second["last_reply"])
44
+ and _key(CODEWORD) in _key(resumed_tool_output)
45
+ and _key(TOOL_STAMP) in _key(resumed_tool_output)
46
+ and "tool" in second["roles"]
47
+ )
48
+
49
+
50
+ class ACPResumeEnv(vf.SingleAgentEnv):
51
+ async def run(self, task, agents):
52
+ async with agents.agent.interaction(task) as interaction:
53
+ first = await interaction.turn(
54
+ f"Remember the codeword {CODEWORD}. Reply with exactly READY."
55
+ )
56
+ segments = [first]
57
+ if not first.terminated:
58
+ segments.append(
59
+ await interaction.turn(
60
+ "Call `resume_recall` with the codeword from my previous "
61
+ "message, then reply with exactly the tool result."
62
+ )
63
+ )
64
+ interaction.trace.info["acp_segments"] = [
65
+ {
66
+ "roles": [message.role for message in segment.messages],
67
+ "tool_outputs": [
68
+ str(message.content)
69
+ for message in segment.messages
70
+ if message.role == "tool"
71
+ ],
72
+ "last_reply": segment.last_reply,
73
+ "terminated": segment.terminated,
74
+ }
75
+ for segment in segments
76
+ ]
77
+
78
+
79
+ class ACPResumeTaskset(vf.Taskset[ACPResumeTask, ACPResumeConfig]):
80
+ def load(self) -> list[ACPResumeTask]:
81
+ return [
82
+ ACPResumeTask(
83
+ vf.TaskData(
84
+ idx=0,
85
+ prompt=None,
86
+ system_prompt=(
87
+ "Follow each user instruction exactly. Preserve conversational "
88
+ "context between turns and use requested tools."
89
+ ),
90
+ ),
91
+ self.config.task,
92
+ )
93
+ ]
94
+
95
+
96
+ __all__ = ["ACPResumeTaskset", "ACPResumeEnv"]
97
+
98
+
99
+ if __name__ == "__main__":
100
+ ResumeToolset.run()
@@ -33,10 +33,11 @@ class EchoToolTask(vf.Task[vf.TaskData, vf.State, EchoToolTaskConfig]):
33
33
 
34
34
  @vf.reward(weight=1.0)
35
35
  async def echoed(self, trace: vf.Trace) -> float:
36
- # The stamped token reaches the answer only if the model called the MCP tool.
37
- last = trace.assistant_messages[-1].content if trace.assistant_messages else ""
38
- last = (last or "").lower()
39
- return float(PHRASE in last and ECHO_TOKEN in last)
36
+ # The stamped token surfaces in an ASSISTANT message only if the model called
37
+ # the MCP tool and relayed its result — wherever in the exchange that happened
38
+ # (in a conversation the last turn may be a closing pleasantry).
39
+ replies = ((m.content or "").lower() for m in trace.assistant_messages)
40
+ return float(any(PHRASE in r and ECHO_TOKEN in r for r in replies))
40
41
 
41
42
 
42
43
  class EchoToolConfig(vf.TasksetConfig):
@@ -0,0 +1,65 @@
1
+ """Multi-turn echo driven by a scripted user — the single user-sim mechanism.
2
+
3
+ The env's `run()` scripts the user through an interaction. The task is
4
+ prompt-less, so the first `turn(phrase)` opens the conversation; each later turn
5
+ resumes the harness onto the accreted conversation, and leaving the `async with`
6
+ closes the interaction (the trace stops as `user_closed`).
7
+ """
8
+
9
+ import verifiers.v1 as vf
10
+
11
+ PHRASES = ["hello world", "goodbye world"]
12
+ SYSTEM = "Repeat the user's message back to them exactly, with no extra words."
13
+
14
+
15
+ def _key(text: str) -> str:
16
+ return "".join(c for c in text.casefold() if c.isalnum())
17
+
18
+
19
+ class EchoUserSimConfig(vf.TasksetConfig):
20
+ phrases: list[str] = PHRASES
21
+
22
+
23
+ class EchoUserSimData(vf.TaskData):
24
+ phrases: list[str]
25
+
26
+
27
+ class EchoUserSimTask(vf.Task[EchoUserSimData, vf.State, vf.TaskConfig]):
28
+ @vf.reward(weight=1.0)
29
+ async def echoed(self, trace: vf.Trace) -> float:
30
+ replies = [m.content for m in trace.assistant_messages]
31
+ phrases = self.data.phrases
32
+ if len(replies) < len(phrases):
33
+ return 0.0
34
+ matched = sum(_key(p) in _key(r or "") for r, p in zip(replies, phrases))
35
+ return matched / len(phrases)
36
+
37
+
38
+ class EchoUserSimEnv(vf.SingleAgentEnv):
39
+ """Scripts the user side: opens with the first phrase, follows with the rest."""
40
+
41
+ async def run(self, task, agents):
42
+ # An interaction scripting the user: the task carries no prompt, so the
43
+ # first turn opens the conversation.
44
+ async with agents.agent.interaction(task) as interaction:
45
+ for phrase in task.data.phrases:
46
+ if (await interaction.turn(phrase)).terminated:
47
+ break
48
+
49
+
50
+ class EchoUserSimTaskset(vf.Taskset[EchoUserSimTask, EchoUserSimConfig]):
51
+ def load(self) -> list[EchoUserSimTask]:
52
+ return [
53
+ EchoUserSimTask(
54
+ EchoUserSimData(
55
+ idx=0,
56
+ # No prompt: the scripted user opens the conversation.
57
+ prompt=None,
58
+ system_prompt=SYSTEM,
59
+ phrases=self.config.phrases,
60
+ )
61
+ )
62
+ ]
63
+
64
+
65
+ __all__ = ["EchoUserSimTaskset", "EchoUserSimEnv"]
@@ -9,13 +9,13 @@ dependencies = ["verifiers"]
9
9
  requires = ["hatchling"]
10
10
  build-backend = "hatchling.build"
11
11
 
12
- # Flat fixture modules whose tool/user servers self-launch in a sandbox (docker/prime) and so must
13
- # be importable there. The others (echo_v1, echo_*_v0) have no server, so they never get installed.
12
+ # Flat fixture modules whose tool servers self-launch in a sandbox (docker/prime) and so must
13
+ # be importable there. The others (echo_v1, echo_user_sim_v1, echo_*_v0) have no server, so they
14
+ # never get installed.
14
15
  [tool.hatch.build]
15
16
  include = [
16
17
  "counter_tool_v1.py",
17
18
  "echo_tool_v1.py",
18
- "echo_user_sim_v1.py",
19
19
  "tool_response_image_v1.py",
20
20
  "pyproject.toml",
21
21
  ]
@@ -41,19 +41,26 @@ AGENTIC_PLACEMENTS = [
41
41
  _pair("bash", "modal", "bash-harness-in-modal"),
42
42
  ]
43
43
 
44
- # harness runtime x user placement: colocated in both local runtimes, each own-runtime
45
- # across the opposite boundary, modal rows local-only. No prime rows: a user sim in a
46
- # prime sandbox needs prime port exposure (unreachable from the host here).
47
- USER_PLACEMENTS = [
48
- _pair("subprocess", "colocated", "harness-in-subprocess-with-user-colocated"),
49
- _pair("docker", "colocated", "harness-in-docker-with-user-colocated"),
50
- _pair("subprocess", "docker", "harness-in-subprocess-with-user-in-docker"),
51
- _pair("docker", "subprocess", "harness-in-docker-with-user-in-subprocess"),
52
- _pair("modal", "colocated", "harness-in-modal-with-user-colocated"),
53
- _pair("subprocess", "modal", "harness-in-subprocess-with-user-in-modal"),
44
+ # The scripted user runs in the eval process itself (no placement axis); the harness
45
+ # runtime is the exchange's only axis.
46
+ USER_RUNTIMES = [
47
+ pytest.param("subprocess", marks=[_m.subprocess], id="harness-in-subprocess"),
48
+ pytest.param("docker", marks=[_m.docker], id="harness-in-docker"),
49
+ pytest.param("prime", marks=[_m.prime], id="harness-in-prime"),
50
+ pytest.param("modal", marks=[_m.modal], id="harness-in-modal"),
54
51
  ]
55
52
 
56
- # harness runtime x tool placement: as USER_PLACEMENTS plus the two-container case
53
+ # ACP-backed harnesses: each must preserve an exchange across process relaunches and
54
+ # retain MCP access after resuming. Cover every harness in the local container runtime,
55
+ # plus one remote placement for the sandbox/tunnel boundary.
56
+ ACP_RESUME_PLACEMENTS = [
57
+ _pair("kimi-code", "docker", "kimi-code-acp-in-docker"),
58
+ _pair("pi", "docker", "pi-acp-in-docker"),
59
+ _pair("pool", "docker", "pool-acp-in-docker"),
60
+ _pair("pool", "prime", "pool-acp-in-prime"),
61
+ ]
62
+
63
+ # harness runtime x tool placement: every axis value once plus the two-container case
57
64
  # (harness and tool in separate docker boxes) and a prime-colocated row (a tool in its
58
65
  # OWN prime sandbox needs port exposure; colocated rides the harness's box).
59
66
  TOOL_PLACEMENTS = [
@@ -99,6 +106,7 @@ async def test_single_turn(run_v1, harness, harness_runtime, tmp_path):
99
106
  )
100
107
  assert trace.ok
101
108
  assert trace.num_turns == 1
109
+ assert trace.stop_condition == "agent_completed"
102
110
  assert trace.reward == 1.0
103
111
  # The seat's resolved identity rides the trace (policy metadata for trainers).
104
112
  assert trace.agent is not None and trace.agent.sampling.temperature == 0
@@ -111,25 +119,94 @@ async def test_single_turn(run_v1, harness, harness_runtime, tmp_path):
111
119
 
112
120
 
113
121
  @pytest.mark.e2e
114
- @pytest.mark.parametrize("harness_runtime,user_runtime", USER_PLACEMENTS, indirect=True)
115
- async def test_user(run_v1, harness_runtime, user_runtime, tmp_path):
116
- """Multi-turn, driven by a (container-safe) `vf.User` simulator, across the user's
117
- placement (`user_runtime`: colocated in the harness's runtime, or its own runtime) x
118
- the harness `runtime`. Either way the framework drives the user and must reach it
119
- from wherever the harness runs."""
122
+ @pytest.mark.parametrize("harness_runtime", USER_RUNTIMES, indirect=True)
123
+ async def test_user(run_v1, harness_runtime, tmp_path):
124
+ """Multi-turn, driven by a scripted user an interaction loop in the env's
125
+ `run()` across the harness runtime axis. The task is prompt-less, so one
126
+ run covers the whole exchange shape: the caller opens (the user speaks first),
127
+ each later turn resumes the harness onto the conversation, and leaving the loop
128
+ ends the exchange (`user_closed`). The user runs in the eval process itself, so
129
+ there is no placement axis."""
120
130
  (trace,) = await run_v1(
121
131
  "echo-user-sim-v1",
122
132
  harness="null",
123
133
  harness_overrides={"runtime": {"type": harness_runtime}},
124
134
  output_dir=tmp_path,
125
135
  max_turns=6,
126
- taskset_overrides={"task": {"user": user_runtime}},
127
136
  )
128
137
  assert trace.ok
129
138
  assert trace.num_turns >= 2 # genuinely multi-turn
139
+ assert trace.stop_condition == "user_closed" # leaving the interaction ended it
130
140
  assert trace.reward == 1.0
131
141
 
132
142
 
143
+ @pytest.mark.e2e
144
+ async def test_interaction(live_ctx):
145
+ """Drive an agent turn-by-turn through `agent.interaction()` — the caller IS
146
+ the run's user. Runs on the tool-less `null` harness: nothing but the exchange
147
+ itself, yet a real rollout — trace, scoring, and the `user_closed` stop all
148
+ apply."""
149
+ import verifiers.v1 as vf
150
+ from verifiers.v1.harnesses.null import NullHarnessConfig
151
+
152
+ agent = vf.make_agent(
153
+ vf.AgentConfig(
154
+ harness=NullHarnessConfig(id="null"),
155
+ model=live_ctx.model,
156
+ sampling=live_ctx.sampling,
157
+ ),
158
+ client=live_ctx.client,
159
+ )
160
+ task = vf.Task(
161
+ vf.TaskData(
162
+ idx=0,
163
+ prompt=None, # the interaction's caller opens the conversation
164
+ system_prompt="Repeat the user's message back exactly, no extra words.",
165
+ )
166
+ )
167
+ async with agent.interaction(task) as interaction:
168
+ first = await interaction.turn("hello world")
169
+ assert isinstance(first, vf.Segment)
170
+ assert not first.terminated
171
+ assert [message.role for message in first.messages] == ["assistant"]
172
+ assert "hello world" in first.last_reply.lower()
173
+ second = await interaction.turn("goodbye world")
174
+ assert not second.terminated
175
+ assert [message.role for message in second.messages] == ["assistant"]
176
+ assert "goodbye world" in second.last_reply.lower()
177
+ trace = interaction.trace
178
+ assert trace is not None and trace.errors == []
179
+ assert trace.stop_condition == "user_closed" # closing the interaction ended it
180
+ assert trace.num_turns == 2
181
+
182
+
183
+ @pytest.mark.e2e
184
+ @pytest.mark.parametrize(
185
+ "harness,harness_runtime", ACP_RESUME_PLACEMENTS, indirect=True
186
+ )
187
+ async def test_acp_resume_with_tool(run_v1, harness, harness_runtime, tmp_path):
188
+ """Each ACP harness preserves context and MCP access across two segments."""
189
+ (trace,) = await run_v1(
190
+ "echo-acp-resume-v1",
191
+ harness=harness,
192
+ harness_overrides={"runtime": {"type": harness_runtime}},
193
+ output_dir=tmp_path,
194
+ max_turns=8,
195
+ max_tokens=8192,
196
+ rollout_timeout=600,
197
+ )
198
+ assert trace.ok, trace.errors
199
+ assert trace.stop_condition == "user_closed"
200
+ assert trace.rewards["resumed"] == 1.0
201
+ assert trace.tools # ACP-native tools, or Pi's MCP adapter meta-tool
202
+ segments = trace.info["acp_segments"]
203
+ assert len(segments) == 2
204
+ assert segments[0]["terminated"] is False
205
+ assert segments[1]["terminated"] is False
206
+ assert "tool" in segments[1]["roles"]
207
+ assert segments[1]["tool_outputs"]
208
+
209
+
133
210
  @pytest.mark.e2e
134
211
  @pytest.mark.parametrize("harness_runtime,tool_runtime", TOOL_PLACEMENTS, indirect=True)
135
212
  async def test_tool(run_v1, harness_runtime, tool_runtime, tmp_path):
@@ -347,6 +424,102 @@ async def test_env_id_agentic_judge(run_v1, tmp_path):
347
424
  assert 0.0 <= solver.rewards["judge"] <= 1.0
348
425
 
349
426
 
427
+ @pytest.mark.e2e
428
+ async def test_env_id_user_sim(run_v1, tmp_path):
429
+ """The user-sim env over the echo taskset: a modeled user (null harness) opens
430
+ the conversation from the task's prompt-as-scenario; the assistant's trace is
431
+ judged by the task's own reward; both sides land agent-stamped on one episode."""
432
+ traces = await run_v1(
433
+ "echo-v1",
434
+ harness=None, # multi-agent: each seat pins its own
435
+ env={"id": "user-sim", "assistant": {"harness": {"id": "null"}}},
436
+ output_dir=tmp_path,
437
+ max_turns=6,
438
+ rollout_timeout=300,
439
+ )
440
+ assert sorted(t.agent_name for t in traces) == ["assistant", "user"]
441
+ (assistant,) = [t for t in traces if t.agent_name == "assistant"]
442
+ (user,) = [t for t in traces if t.agent_name == "user"]
443
+ assert assistant.ok and user.ok
444
+ assert user.trainable is False
445
+ assert user.num_turns >= 1 # the modeled user actually spoke
446
+ assert assistant.metrics["user_turns"] >= 1
447
+ # `mask_prompt`: the scenario is hidden from the assistant's harness (the run's
448
+ # visible data) while the task's own rewards still scored the real row. The
449
+ # masked view is what persists (provenance is the row's idx); both sides land
450
+ # as ONE durable episode.
451
+ assert assistant.task.data.prompt is None
452
+ assert "echoed" in assistant.rewards
453
+ from verifiers.v1.cli.output import read_episodes
454
+ from verifiers.v1.trace import WireTrace
455
+
456
+ (record,) = read_episodes(tmp_path, WireTrace)
457
+ assert {t.agent_name for t in record.traces} == {"assistant", "user"}
458
+ assert record.id # both traces are persisted under one durable episode identity
459
+
460
+
461
+ @pytest.mark.e2e
462
+ async def test_env_id_user_sim_with_tools(run_v1, tmp_path):
463
+ """THE tau-bench shape — a tool-using assistant composed with a modeled user.
464
+ The assistant's MCP tool loop runs entirely inside a harness segment and the
465
+ user exchange advances between segments, so the two can never race or amputate
466
+ each other (the failure mode of injecting user turns at the model boundary).
467
+ Reward 1.0 proves the tool actually ran mid-conversation: its token never
468
+ appears in any prompt."""
469
+ traces = await run_v1(
470
+ "echo-tool-v1",
471
+ harness=None, # multi-agent: each seat pins its own
472
+ env={"id": "user-sim", "assistant": {"harness": {"id": "null"}}},
473
+ output_dir=tmp_path,
474
+ max_turns=8,
475
+ # Reasoning models can spend thousands of tokens on a turn; the default
476
+ # 2048 truncates the reply mid-relay, cutting the stamp out of the text.
477
+ max_tokens=8192,
478
+ rollout_timeout=300,
479
+ )
480
+ (assistant,) = [t for t in traces if t.agent_name == "assistant"]
481
+ (user,) = [t for t in traces if t.agent_name == "user"]
482
+ assert assistant.ok and user.ok
483
+ assert assistant.task.data.prompt is None # the scenario stayed off the wire
484
+ assert user.num_turns >= 1 # the modeled user actually drove the exchange
485
+ assert assistant.rewards["echoed"] == 1.0 # the tool ran, mid-conversation
486
+ # The tool was advertised to the masked chat exactly as to any run.
487
+ assert assistant.tools is not None
488
+ assert any(tool.name == "echo_back" for tool in assistant.tools)
489
+
490
+
491
+ @pytest.mark.e2e
492
+ async def test_kuhn_poker_self_play(run_v1, tmp_path):
493
+ """The turn-coupled proof env: one Kuhn poker hand, both seats live interactions
494
+ of the run's own model (self-play), refereed host-side, paid out zero-sum."""
495
+ traces = await run_v1(
496
+ "kuhn-poker-v1",
497
+ harness=None, # both seats pin the null harness themselves
498
+ output_dir=tmp_path,
499
+ max_turns=8,
500
+ # The Q decision (the one mixed-strategy spot in Kuhn) can cost a reasoning
501
+ # model thousands of tokens; the default 2048 truncates to an empty reply AND
502
+ # exhausts the rollout budget, so the invalid-move retry is never served.
503
+ max_tokens=8192,
504
+ rollout_timeout=300,
505
+ )
506
+ assert sorted(t.agent_name for t in traces) == ["player0", "player1"]
507
+ payoffs = {t.agent_name: t.rewards["payoff"] for t in traces}
508
+ assert payoffs["player0"] + payoffs["player1"] == 0 # zero-sum
509
+ assert abs(payoffs["player0"]) in (1.0, 2.0)
510
+ for trace in traces:
511
+ assert trace.ok
512
+ assert trace.info["kuhn"]["seat"] in (0, 1)
513
+ # A played-out hand has both seats speaking. A forfeit (the model never produced
514
+ # a legal move) still pays out zero-sum, but the hand dies mid-exchange, so only
515
+ # the seat that acted is guaranteed a turn — a hand where NOBODY spoke means the
516
+ # exchange machinery never ran at all.
517
+ if traces[0].info["kuhn"]["forfeited"] is None:
518
+ assert all(t.num_turns >= 1 for t in traces)
519
+ else:
520
+ assert any(t.num_turns >= 1 for t in traces)
521
+
522
+
350
523
  @pytest.mark.e2e
351
524
  async def test_multi_agent_env_server(run_v1_server, tmp_path):
352
525
  """The same env through the env-server pool: the worker rebuilds the role-typed
@@ -25,7 +25,10 @@ SKIP_EVAL: set[str] = set()
25
25
  # Per-run caps are seat fields; recipe envs name their own seats.
26
26
  SEATS: dict[str, tuple[str, ...]] = {
27
27
  "code_golf_v1": ("golfer",),
28
+ "kuhn_poker_v1": ("player0", "player1"),
29
+ "openenv_wordle_v1": ("player",),
28
30
  "proposer_solver_v1": ("proposer", "solver"),
31
+ "wordle_v1": ("player",),
29
32
  }
30
33
 
31
34
 
@@ -2,6 +2,7 @@ import logging as _logging
2
2
 
3
3
  from pydantic_config import BaseConfig
4
4
 
5
+ from verifiers.v1.acp import ACP
5
6
  from verifiers.v1.clients import (
6
7
  BaseClientConfig,
7
8
  Client,
@@ -12,7 +13,14 @@ from verifiers.v1.clients import (
12
13
  resolve_client,
13
14
  )
14
15
  from verifiers.v1.decorators import metric, reward, stop, tool
15
- from verifiers.v1.agent import Agent, AgentConfig, Agents, make_agent
16
+ from verifiers.v1.agent import (
17
+ Agent,
18
+ AgentConfig,
19
+ Agents,
20
+ Interaction,
21
+ Segment,
22
+ make_agent,
23
+ )
16
24
  from verifiers.v1.configs.env import (
17
25
  ElasticPoolConfig,
18
26
  EnvServerConfig,
@@ -35,7 +43,6 @@ from verifiers.v1.errors import (
35
43
  TaskError,
36
44
  ToolsetError,
37
45
  TunnelError,
38
- UserError,
39
46
  )
40
47
  from verifiers.v1.harness import Harness, HarnessConfig
41
48
  from verifiers.v1.judge import (
@@ -108,8 +115,6 @@ from verifiers.v1.mcp import (
108
115
  Toolset,
109
116
  SharedToolsetConfig,
110
117
  ToolsetConfig,
111
- User,
112
- UserConfig,
113
118
  )
114
119
  from verifiers.v1.graph import MessageNode
115
120
  from verifiers.v1.episode import Episode, WireEpisode
@@ -216,7 +221,6 @@ __all__ = [
216
221
  "ProviderError",
217
222
  "HarnessError",
218
223
  "ToolsetError",
219
- "UserError",
220
224
  "SandboxError",
221
225
  "TaskError",
222
226
  "InterceptionError",
@@ -235,6 +239,7 @@ __all__ = [
235
239
  "BaseConfig",
236
240
  "Harness",
237
241
  "HarnessConfig",
242
+ "ACP",
238
243
  "ModelContext",
239
244
  "Runtime",
240
245
  "RuntimeConfig",
@@ -302,9 +307,9 @@ __all__ = [
302
307
  "Toolset",
303
308
  "SharedToolsetConfig",
304
309
  "ToolsetConfig",
305
- # user simulator
306
- "User",
307
- "UserConfig",
310
+ # the user channel
311
+ "Interaction",
312
+ "Segment",
308
313
  ]
309
314
 
310
315
  # The library logs via stdlib logging (per-module `getLogger(__name__)`), but is