verifiers 0.3.1.dev22__tar.gz → 0.3.1.dev23__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.

Potentially problematic release.


This version of verifiers might be problematic. Click here for more details.

Files changed (440) hide show
  1. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/PKG-INFO +1 -1
  2. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/v1/conftest.py +11 -5
  3. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/v1/test_e2e.py +28 -5
  4. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/__init__.py +3 -2
  5. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/acp/__init__.py +116 -139
  6. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/acp/runner.py +21 -139
  7. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/agent.py +10 -6
  8. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/clients/eval.py +2 -0
  9. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/dialects/anthropic.py +10 -1
  10. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/dialects/chat.py +26 -10
  11. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/harness.py +2 -2
  12. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/harnesses/claude_code/harness.py +15 -72
  13. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/harnesses/codex/harness.py +21 -72
  14. verifiers-0.3.1.dev23/verifiers/v1/harnesses/hermes_agent/harness.py +103 -0
  15. verifiers-0.3.1.dev23/verifiers/v1/harnesses/hermes_agent/program.py +19 -0
  16. verifiers-0.3.1.dev23/verifiers/v1/harnesses/kimi_code/harness.py +131 -0
  17. verifiers-0.3.1.dev23/verifiers/v1/harnesses/openclaw/harness.py +242 -0
  18. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/harnesses/pi/harness.py +55 -80
  19. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/harnesses/pool/harness.py +10 -16
  20. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/harnesses/rlm/harness.py +7 -42
  21. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/utils/loaders.py +1 -4
  22. verifiers-0.3.1.dev22/verifiers/v1/harnesses/hermes_agent/harness.py +0 -140
  23. verifiers-0.3.1.dev22/verifiers/v1/harnesses/hermes_agent/program.py +0 -10
  24. verifiers-0.3.1.dev22/verifiers/v1/harnesses/kimi_code/harness.py +0 -135
  25. verifiers-0.3.1.dev22/verifiers/v1/harnesses/openclaw/harness.py +0 -354
  26. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/.gitignore +0 -0
  27. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/LICENSE +0 -0
  28. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/README.md +0 -0
  29. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/pyproject.toml +0 -0
  30. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/__init__.py +0 -0
  31. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/conftest.py +0 -0
  32. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_browser_env.py +0 -0
  33. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_build_script.py +0 -0
  34. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_cli_agent_env.py +0 -0
  35. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_client_auth_errors.py +0 -0
  36. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_client_config.py +0 -0
  37. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_client_multimodal_types.py +0 -0
  38. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_composable_env.py +0 -0
  39. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_context_token_metrics.py +0 -0
  40. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_decorator_ranks.py +0 -0
  41. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_endpoint_registry.py +0 -0
  42. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_env_group.py +0 -0
  43. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_env_server.py +0 -0
  44. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_environment.py +0 -0
  45. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_environment_extra.py +0 -0
  46. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_error_chain.py +0 -0
  47. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_eval_display.py +0 -0
  48. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_eval_utils.py +0 -0
  49. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_gepa_cli.py +0 -0
  50. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_gepa_utils.py +0 -0
  51. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_gym_env.py +0 -0
  52. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_harbor_env_mcp.py +0 -0
  53. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_imports.py +0 -0
  54. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_init_script.py +0 -0
  55. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_install_utils.py +0 -0
  56. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_interception_utils.py +0 -0
  57. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_logging.py +0 -0
  58. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_math_rubric.py +0 -0
  59. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_maybe_think_parser.py +0 -0
  60. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_message_utils.py +0 -0
  61. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_message_utils_multimodal.py +0 -0
  62. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_multiturn_env.py +0 -0
  63. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_nemorl_client.py +0 -0
  64. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_openai_chat_completions_token_client.py +0 -0
  65. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_openai_responses_client.py +0 -0
  66. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_opencode_rlm_env.py +0 -0
  67. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_openenv_client.py +0 -0
  68. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_parser.py +0 -0
  69. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_path_utils.py +0 -0
  70. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_per_turn_timing.py +0 -0
  71. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_pricing_utils.py +0 -0
  72. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_prime_plugin.py +0 -0
  73. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_renderer_client.py +0 -0
  74. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_renderer_e2e.py +0 -0
  75. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_rlm_composable_env.py +0 -0
  76. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_rubric.py +0 -0
  77. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_rubric_group.py +0 -0
  78. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_sandbox_debug_env.py +0 -0
  79. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_sandbox_env.py +0 -0
  80. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_sandbox_mixin.py +0 -0
  81. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_save_utils.py +0 -0
  82. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_setup_script.py +0 -0
  83. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_singleturn_env.py +0 -0
  84. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_stateful_tool_env.py +0 -0
  85. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_think_parser.py +0 -0
  86. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_tool_env.py +0 -0
  87. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_tool_utils.py +0 -0
  88. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_trajectory_processing.py +0 -0
  89. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_tui_info_formatting.py +0 -0
  90. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_types.py +0 -0
  91. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/test_xml_parser.py +0 -0
  92. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  93. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/v1/fixtures/duet_v1.py +0 -0
  94. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
  95. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  96. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  97. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  98. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/v1/fixtures/echo_v1.py +0 -0
  99. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/v1/fixtures/pyproject.toml +0 -0
  100. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  101. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/v1/test_color_codeword_tasks.py +0 -0
  102. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/v1/test_configs.py +0 -0
  103. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/v1/test_envs.py +0 -0
  104. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/v1/test_graph.py +0 -0
  105. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/v1/test_judges.py +0 -0
  106. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/v1/test_scoring.py +0 -0
  107. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/v1/test_taskset.py +0 -0
  108. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/tests/v1/test_trace.py +0 -0
  109. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/__init__.py +0 -0
  110. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/cli/__init__.py +0 -0
  111. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/cli/commands/__init__.py +0 -0
  112. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/cli/commands/build.py +0 -0
  113. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/cli/commands/eval.py +0 -0
  114. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/cli/commands/gepa.py +0 -0
  115. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/cli/commands/init.py +0 -0
  116. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/cli/commands/install.py +0 -0
  117. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/cli/commands/setup.py +0 -0
  118. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/cli/plugins/__init__.py +0 -0
  119. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/cli/plugins/prime.py +0 -0
  120. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/cli/tui.py +0 -0
  121. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/__init__.py +0 -0
  122. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/clients/__init__.py +0 -0
  123. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/clients/anthropic_messages_client.py +0 -0
  124. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/clients/client.py +0 -0
  125. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/clients/nemorl_chat_completions_client.py +0 -0
  126. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/clients/openai_chat_completions_client.py +0 -0
  127. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/clients/openai_chat_completions_token_client.py +0 -0
  128. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/clients/openai_completions_client.py +0 -0
  129. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/clients/openai_responses_client.py +0 -0
  130. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/clients/renderer_client.py +0 -0
  131. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/decorators.py +0 -0
  132. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/__init__.py +0 -0
  133. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/env_group.py +0 -0
  134. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/environment.py +0 -0
  135. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/README.md +0 -0
  136. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/__init__.py +0 -0
  137. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/cli_agent_env.py +0 -0
  138. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/README.md +0 -0
  139. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/__init__.py +0 -0
  140. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/_filter.py +0 -0
  141. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/composable_env.py +0 -0
  142. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/harness.py +0 -0
  143. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/harnesses/__init__.py +0 -0
  144. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  145. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/harnesses/opencode.py +0 -0
  146. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/harnesses/prompt.txt +0 -0
  147. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/harnesses/rlm.py +0 -0
  148. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/sandbox_debug_env.py +0 -0
  149. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/swe_debug_env.py +0 -0
  150. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/task.py +0 -0
  151. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/tasksets/__init__.py +0 -0
  152. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  153. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  154. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  155. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  156. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  157. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  158. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  159. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  160. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  161. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/tasksets/swe/README.md +0 -0
  162. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  163. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  164. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  165. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  166. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  167. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  168. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  169. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  170. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  171. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  172. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  173. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  174. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  175. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  176. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  177. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  178. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  179. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  180. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  181. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  182. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  183. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  184. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  185. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/gym_env.py +0 -0
  186. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/harbor_env/__init__.py +0 -0
  187. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/harbor_env/env.py +0 -0
  188. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/harbor_env/mcp.py +0 -0
  189. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/mcp_env.py +0 -0
  190. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/opencode_env.py +0 -0
  191. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/opencode_qa_env.py +0 -0
  192. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/opencode_rlm_env.py +0 -0
  193. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/sandbox_mixin.py +0 -0
  194. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/utils/__init__.py +0 -0
  195. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/utils/file_locks.py +0 -0
  196. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/experimental/utils/git_checkout_cache.py +0 -0
  197. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/integrations/README.md +0 -0
  198. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/integrations/__init__.py +0 -0
  199. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/integrations/browser_env/README.md +0 -0
  200. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/integrations/browser_env/__init__.py +0 -0
  201. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/integrations/browser_env/browser_env.py +0 -0
  202. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/integrations/browser_env/modes/__init__.py +0 -0
  203. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/integrations/browser_env/modes/base.py +0 -0
  204. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  205. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  206. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/integrations/openenv_env.py +0 -0
  207. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/integrations/reasoninggym_env.py +0 -0
  208. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/integrations/textarena_env.py +0 -0
  209. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/multiturn_env.py +0 -0
  210. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/python_env.py +0 -0
  211. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/sandbox_env.py +0 -0
  212. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/singleturn_env.py +0 -0
  213. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/stateful_tool_env.py +0 -0
  214. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/envs/tool_env.py +0 -0
  215. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/errors.py +0 -0
  216. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/gepa/__init__.py +0 -0
  217. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/gepa/adapter.py +0 -0
  218. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/gepa/config.py +0 -0
  219. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/gepa/display.py +0 -0
  220. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/gepa/gepa_utils.py +0 -0
  221. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/parsers/__init__.py +0 -0
  222. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/parsers/maybe_think_parser.py +0 -0
  223. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/parsers/parser.py +0 -0
  224. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/parsers/think_parser.py +0 -0
  225. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/parsers/xml_parser.py +0 -0
  226. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/rubrics/__init__.py +0 -0
  227. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/rubrics/experimental/hybrid_math_rubric.py +0 -0
  228. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/rubrics/judge_rubric.py +0 -0
  229. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/rubrics/math_rubric.py +0 -0
  230. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/rubrics/rubric.py +0 -0
  231. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/rubrics/rubric_group.py +0 -0
  232. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/scripts/__init__.py +0 -0
  233. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/scripts/build.py +0 -0
  234. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/scripts/eval.py +0 -0
  235. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/scripts/gepa.py +0 -0
  236. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/scripts/init.py +0 -0
  237. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/scripts/install.py +0 -0
  238. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/scripts/setup.py +0 -0
  239. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/scripts/tui.py +0 -0
  240. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/serve/__init__.py +0 -0
  241. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/serve/client/env_client.py +0 -0
  242. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/serve/client/zmq_env_client.py +0 -0
  243. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/serve/server/__init__.py +0 -0
  244. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/serve/server/env_router.py +0 -0
  245. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/serve/server/env_server.py +0 -0
  246. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/serve/server/env_worker.py +0 -0
  247. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/serve/server/zmq_env_server.py +0 -0
  248. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/serve/types.py +0 -0
  249. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/types.py +0 -0
  250. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/utils/__init__.py +0 -0
  251. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/utils/async_utils.py +0 -0
  252. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/utils/client_utils.py +0 -0
  253. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/utils/config_utils.py +0 -0
  254. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/utils/data_utils.py +0 -0
  255. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/utils/display_utils.py +0 -0
  256. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/utils/env_config_utils.py +0 -0
  257. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/utils/env_utils.py +0 -0
  258. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/utils/error_utils.py +0 -0
  259. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/utils/eval_display.py +0 -0
  260. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/utils/eval_utils.py +0 -0
  261. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/utils/heartbeat.py +0 -0
  262. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/utils/import_utils.py +0 -0
  263. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/utils/install_utils.py +0 -0
  264. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/utils/interception_utils.py +0 -0
  265. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/utils/logging_utils.py +0 -0
  266. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/utils/message_utils.py +0 -0
  267. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/utils/metric_utils.py +0 -0
  268. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/utils/path_utils.py +0 -0
  269. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/utils/pricing_utils.py +0 -0
  270. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/utils/process_utils.py +0 -0
  271. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/utils/response_utils.py +0 -0
  272. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/utils/save_utils.py +0 -0
  273. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/utils/serve_utils.py +0 -0
  274. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/utils/thread_utils.py +0 -0
  275. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/utils/threaded_sandbox_client.py +0 -0
  276. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/utils/tool_utils.py +0 -0
  277. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/utils/usage_utils.py +0 -0
  278. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/legacy/utils/version_utils.py +0 -0
  279. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/cli/__init__.py +0 -0
  280. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  281. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/cli/dashboard/base.py +0 -0
  282. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/cli/dashboard/eval.py +0 -0
  283. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/cli/dashboard/replay.py +0 -0
  284. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/cli/dashboard/validate.py +0 -0
  285. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/cli/debug.py +0 -0
  286. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/cli/eval/__init__.py +0 -0
  287. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/cli/eval/main.py +0 -0
  288. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/cli/eval/resume.py +0 -0
  289. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/cli/eval/runner.py +0 -0
  290. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/cli/gepa.py +0 -0
  291. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/cli/init.py +0 -0
  292. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/cli/output.py +0 -0
  293. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/cli/replay.py +0 -0
  294. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/cli/resolve.py +0 -0
  295. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/cli/resume.py +0 -0
  296. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/cli/validate.py +0 -0
  297. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/clients/__init__.py +0 -0
  298. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/clients/base.py +0 -0
  299. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/clients/client.py +0 -0
  300. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/clients/train.py +0 -0
  301. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/configs/__init__.py +0 -0
  302. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/configs/agent.py +0 -0
  303. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/configs/cli/__init__.py +0 -0
  304. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/configs/cli/debug.py +0 -0
  305. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/configs/cli/env.py +0 -0
  306. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/configs/cli/eval.py +0 -0
  307. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/configs/cli/init.py +0 -0
  308. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/configs/cli/replay.py +0 -0
  309. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/configs/cli/validate.py +0 -0
  310. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/configs/client.py +0 -0
  311. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/configs/env.py +0 -0
  312. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/configs/harness.py +0 -0
  313. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/configs/judge.py +0 -0
  314. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/configs/retries.py +0 -0
  315. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/configs/serve.py +0 -0
  316. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/configs/task.py +0 -0
  317. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/configs/taskset.py +0 -0
  318. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/dialects/__init__.py +0 -0
  319. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/dialects/base.py +0 -0
  320. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/dialects/responses.py +0 -0
  321. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/env.py +0 -0
  322. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/envs/__init__.py +0 -0
  323. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
  324. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/envs/agentic_judge/env.py +0 -0
  325. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  326. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/envs/best_of_n/env.py +0 -0
  327. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/envs/shared_agentic_judge/__init__.py +0 -0
  328. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  329. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/envs/single_agent/env.py +0 -0
  330. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/envs/user_sim/__init__.py +0 -0
  331. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/envs/user_sim/env.py +0 -0
  332. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/episode.py +0 -0
  333. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/errors.py +0 -0
  334. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/gepa/__init__.py +0 -0
  335. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/gepa/adapter.py +0 -0
  336. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/gepa/config.py +0 -0
  337. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/gepa/dataset.py +0 -0
  338. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/gepa/reflection.py +0 -0
  339. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/gepa/runner.py +0 -0
  340. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/graph.py +0 -0
  341. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/harnesses/__init__.py +0 -0
  342. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  343. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/harnesses/bash/harness.py +0 -0
  344. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/harnesses/bash/program.py +0 -0
  345. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
  346. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
  347. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/harnesses/browser_use/program.py +0 -0
  348. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  349. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  350. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
  351. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  352. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  353. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  354. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  355. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/harnesses/node.py +0 -0
  356. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/harnesses/null/__init__.py +0 -0
  357. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/harnesses/null/harness.py +0 -0
  358. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/harnesses/null/program.py +0 -0
  359. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
  360. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  361. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/harnesses/pool/__init__.py +0 -0
  362. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  363. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  364. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  365. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  366. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/interception/__init__.py +0 -0
  367. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/interception/base.py +0 -0
  368. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/interception/pool.py +0 -0
  369. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/interception/server.py +0 -0
  370. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  371. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/interception/tunnel/base.py +0 -0
  372. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/interception/tunnel/custom.py +0 -0
  373. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/interception/tunnel/prime.py +0 -0
  374. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/judge.py +0 -0
  375. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/judges/__init__.py +0 -0
  376. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/judges/reference.py +0 -0
  377. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/judges/reference.txt +0 -0
  378. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/judges/rubric.py +0 -0
  379. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/judges/rubric.txt +0 -0
  380. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/mcp/__init__.py +0 -0
  381. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/mcp/launch.py +0 -0
  382. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/mcp/server.py +0 -0
  383. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/mcp/toolset.py +0 -0
  384. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/rollout.py +0 -0
  385. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/runtimes/__init__.py +0 -0
  386. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/runtimes/base.py +0 -0
  387. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/runtimes/docker/__init__.py +0 -0
  388. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/runtimes/docker/egress.py +0 -0
  389. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/runtimes/limiters.py +0 -0
  390. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/runtimes/modal.py +0 -0
  391. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/runtimes/prime.py +0 -0
  392. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/runtimes/subprocess.py +0 -0
  393. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/serve/__init__.py +0 -0
  394. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/serve/client.py +0 -0
  395. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/serve/encoding.py +0 -0
  396. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/serve/pool.py +0 -0
  397. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/serve/server.py +0 -0
  398. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/serve/types.py +0 -0
  399. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/session.py +0 -0
  400. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/state.py +0 -0
  401. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/task.py +0 -0
  402. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/taskset.py +0 -0
  403. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/tasksets/__init__.py +0 -0
  404. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  405. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/tasksets/harbor/env.py +0 -0
  406. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  407. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  408. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  409. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  410. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/tasksets/nemo_gym/__init__.py +0 -0
  411. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/tasksets/nemo_gym/response.py +0 -0
  412. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/tasksets/nemo_gym/server.py +0 -0
  413. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/tasksets/nemo_gym/taskset.py +0 -0
  414. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/tasksets/nemo_gym/toolset.py +0 -0
  415. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  416. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  417. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  418. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  419. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/trace.py +0 -0
  420. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/types.py +0 -0
  421. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/utils/__init__.py +0 -0
  422. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/utils/aio.py +0 -0
  423. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/utils/artifacts.py +0 -0
  424. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/utils/compile.py +0 -0
  425. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/utils/decorators.py +0 -0
  426. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/utils/format.py +0 -0
  427. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/utils/generic.py +0 -0
  428. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/utils/git.py +0 -0
  429. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/utils/image.py +0 -0
  430. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/utils/install.py +0 -0
  431. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/utils/install_utils.py +0 -0
  432. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/utils/interrupt.py +0 -0
  433. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/utils/logging.py +0 -0
  434. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/utils/memory.py +0 -0
  435. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/utils/paths.py +0 -0
  436. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/utils/platform.py +0 -0
  437. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/utils/prime_config.py +0 -0
  438. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/utils/retries.py +0 -0
  439. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/utils/score.py +0 -0
  440. {verifiers-0.3.1.dev22 → verifiers-0.3.1.dev23}/verifiers/v1/utils/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: verifiers
3
- Version: 0.3.1.dev22
3
+ Version: 0.3.1.dev23
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
@@ -40,8 +40,9 @@ import pytest
40
40
  import verifiers.v1 as vf
41
41
  from verifiers.v1.cli.eval.runner import run_eval
42
42
  from verifiers.v1.configs.cli.eval import EvalConfig
43
+ from verifiers.v1.configs.harness import HarnessConfig
43
44
  from verifiers.v1.trace import Trace
44
- from verifiers.v1.utils.loaders import load_environment
45
+ from verifiers.v1.utils.loaders import harness_config_type, load_environment
45
46
 
46
47
  CI_MODEL = "openai/gpt-5.6-luna"
47
48
 
@@ -74,8 +75,9 @@ def tool_runtime(request) -> dict:
74
75
  # dependencies at rollout.
75
76
  # `compact` (an example harness) and `terminus-2` (drives the host tmux) are excluded from e2e.
76
77
  @pytest.fixture
77
- def harness(request) -> str:
78
- return request.param
78
+ def harness(request) -> HarnessConfig:
79
+ config = {"id": request.param} if isinstance(request.param, str) else request.param
80
+ return harness_config_type(config["id"]).model_validate(config)
79
81
 
80
82
 
81
83
  def pytest_configure(config) -> None:
@@ -119,7 +121,7 @@ def _eval_config(
119
121
  taskset: str,
120
122
  *,
121
123
  output_dir: Path,
122
- harness: str | None = "null",
124
+ harness: str | HarnessConfig | None = "null",
123
125
  n: int = 1,
124
126
  num_tasks: int = 1,
125
127
  max_tokens: int = 2048,
@@ -143,7 +145,11 @@ def _eval_config(
143
145
  env_cfg = dict(env or {})
144
146
  _configure_prime_runtimes(taskset_cfg)
145
147
  if harness:
146
- env_cfg.setdefault("agent", {})["harness"] = {"id": harness}
148
+ env_cfg.setdefault("agent", {})["harness"] = (
149
+ harness_config_type(harness)(id=harness)
150
+ if isinstance(harness, str)
151
+ else harness
152
+ )
147
153
  if runtime:
148
154
  runtime_cfg = dict(runtime)
149
155
  _configure_prime_runtimes(runtime_cfg)
@@ -23,7 +23,12 @@ CHAT_PLACEMENTS = [
23
23
  pair("null", "subprocess", "null-harness-in-subprocess"),
24
24
  pair("bash", "docker", "bash-harness-in-docker"),
25
25
  pair("rlm", "docker", "rlm-harness-in-docker"),
26
- pair("kimi-code", "docker", "kimi-code-harness-in-docker"),
26
+ pytest.param(
27
+ {"id": "kimi-code", "transport": "responses"},
28
+ "docker",
29
+ marks=[mark.kimi_code, mark.docker],
30
+ id="kimi-code-responses-harness-in-docker",
31
+ ),
27
32
  pair("bash", "prime", "bash-harness-in-prime"),
28
33
  pair("bash", "modal", "bash-harness-in-modal"),
29
34
  ]
@@ -34,7 +39,12 @@ CHAT_PLACEMENTS = [
34
39
  AGENTIC_PLACEMENTS = [
35
40
  pair("bash", "subprocess", "bash-harness-in-subprocess"),
36
41
  pair("rlm", "docker", "rlm-harness-in-docker"),
37
- pair("kimi-code", "docker", "kimi-code-harness-in-docker"),
42
+ pytest.param(
43
+ {"id": "kimi-code", "transport": "responses"},
44
+ "docker",
45
+ marks=[mark.kimi_code, mark.docker],
46
+ id="kimi-code-responses-harness-in-docker",
47
+ ),
38
48
  pair("codex", "docker", "codex-harness-in-docker"),
39
49
  pair("claude-code", "docker", "claude-code-harness-in-docker"),
40
50
  pair("hermes-agent", "docker", "hermes-agent-harness-in-docker"),
@@ -59,8 +69,18 @@ ACP_RESUME_PLACEMENTS = [
59
69
  pair("claude-code", "docker", "claude-code-acp-in-docker"),
60
70
  pair("hermes-agent", "docker", "hermes-agent-acp-in-docker"),
61
71
  pair("rlm", "docker", "rlm-acp-in-docker"),
62
- pair("kimi-code", "docker", "kimi-code-acp-in-docker"),
63
- pair("pi", "docker", "pi-acp-in-docker"),
72
+ pytest.param(
73
+ {"id": "kimi-code", "transport": "responses"},
74
+ "docker",
75
+ marks=[mark.kimi_code, mark.docker],
76
+ id="kimi-code-responses-acp-in-docker",
77
+ ),
78
+ pytest.param(
79
+ {"id": "pi", "transport": "responses"},
80
+ "docker",
81
+ marks=[mark.pi, mark.docker],
82
+ id="pi-responses-acp-in-docker",
83
+ ),
64
84
  pair("pool", "docker", "pool-acp-in-docker"),
65
85
  pair("openclaw", "docker", "openclaw-acp-in-docker"),
66
86
  pair("pool", "prime", "pool-acp-in-prime"),
@@ -235,11 +255,14 @@ async def test_acp_resume_with_tool(run_v1, harness, harness_runtime, tmp_path):
235
255
  assert len(segments) == 2
236
256
  assert segments[0]["terminated"] is False
237
257
  assert segments[1]["terminated"] is False
258
+ # Kimi Code is broken upstream: its Responses adapter drops message `phase` on replay.
259
+ if harness.id != "kimi-code":
260
+ assert trace.num_branches == 1
238
261
  # Native MCP tools need not appear in the intercepted model request that
239
262
  # populates trace.tools; the ACP transcript is the source of truth for use.
240
263
  assert "tool" in segments[1]["roles"]
241
264
  assert segments[1]["tool_outputs"]
242
- if harness == "rlm":
265
+ if harness.id == "rlm":
243
266
  assert "turns_since_last_compaction" in trace.metrics
244
267
 
245
268
 
@@ -2,7 +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
+ from verifiers.v1.acp import ACPConfig, ACPHarness
6
6
  from verifiers.v1.agent import Agent, Agents, Interaction, Segment, make_agent
7
7
  from verifiers.v1.clients import (
8
8
  BaseClientConfig,
@@ -249,7 +249,8 @@ __all__ = [ # noqa: RUF022 - grouped by public API area
249
249
  "Harness",
250
250
  "HarnessSession",
251
251
  "HarnessConfig",
252
- "ACP",
252
+ "ACPConfig",
253
+ "ACPHarness",
253
254
  "ModelContext",
254
255
  "Runtime",
255
256
  "RuntimeProcess",
@@ -3,12 +3,14 @@
3
3
  import asyncio
4
4
  import contextlib
5
5
  import json
6
- import secrets
6
+ from abc import abstractmethod
7
7
  from collections.abc import AsyncIterator
8
+ from dataclasses import dataclass
8
9
  from pathlib import Path
10
+ from typing import TypeAlias, TypeVar
9
11
 
10
12
  from verifiers.v1.clients import ModelContext
11
- from verifiers.v1.dialects.chat import message_to_wire
13
+ from verifiers.v1.configs.harness import HarnessConfig
12
14
  from verifiers.v1.errors import HarnessError
13
15
  from verifiers.v1.harness import Harness, HarnessSession
14
16
  from verifiers.v1.runtimes import ProgramResult, Runtime, RuntimeProcess
@@ -20,20 +22,39 @@ from verifiers.v1.utils.aio import run_shielded
20
22
  ACP_SOURCE = (Path(__file__).resolve().parent / "runner.py").read_text()
21
23
  MAX_PACKET_BYTES = 128 * 1024 * 1024
22
24
 
23
- __all__ = ["ACP"]
25
+ __all__ = ["ACPConfig", "ACPHarness"]
24
26
 
27
+ ConfigT = TypeVar("ConfigT", bound=HarnessConfig)
28
+ JsonValue: TypeAlias = (
29
+ str | int | float | bool | None | list["JsonValue"] | dict[str, "JsonValue"]
30
+ )
31
+ JsonObject: TypeAlias = dict[str, JsonValue]
25
32
 
26
- class ACP:
27
- """Run one-shot ACP agents or create rollout-scoped ACP sessions."""
28
33
 
29
- async def setup(self, harness: Harness, runtime: Runtime) -> None:
34
+ @dataclass
35
+ class ACPConfig:
36
+ """One harness's ACP process and initial prompt."""
37
+
38
+ env: dict[str, str]
39
+ command: list[str]
40
+ prompt: str | Messages | None
41
+ mcp_urls: dict[str, str] | None = None
42
+ system_prompt: str | None = None
43
+ session_meta: JsonObject | None = None
44
+ allow_empty_tool_reply: bool = False
45
+
46
+
47
+ class ACPHarness(Harness[ConfigT]):
48
+ """Harness backed by one live ACP process and native session per rollout."""
49
+
50
+ async def setup(self, runtime: Runtime) -> None:
30
51
  await runtime.prepare_uv_script(
31
- ACP_SOURCE, {**harness.config.resolved_env, "UV_FROZEN": "false"}
52
+ ACP_SOURCE, {**self.config.resolved_env, "UV_FROZEN": "false"}
32
53
  )
33
54
 
34
- def session(
55
+ @abstractmethod
56
+ async def prepare_acp(
35
57
  self,
36
- harness: Harness,
37
58
  ctx: ModelContext,
38
59
  trace: Trace,
39
60
  runtime: Runtime,
@@ -41,109 +62,71 @@ class ACP:
41
62
  secret: str,
42
63
  mcp_urls: dict[str, str],
43
64
  data: TaskData,
44
- *,
45
- env: dict[str, str],
46
- command: list[str],
47
- prompt: str | Messages | None,
48
- system_prompt: str | None = None,
49
- session_meta: dict | None = None,
50
- ) -> "ACPHarnessSession":
51
- """Create a persistent ACP-backed handle owned by one rollout."""
65
+ ) -> ACPConfig:
66
+ pass
67
+
68
+ async def session(
69
+ self,
70
+ ctx: ModelContext,
71
+ trace: Trace,
72
+ runtime: Runtime,
73
+ endpoint: str,
74
+ secret: str,
75
+ mcp_urls: dict[str, str],
76
+ data: TaskData,
77
+ ) -> HarnessSession:
78
+ if not runtime.supports_live_processes:
79
+ raise HarnessError(
80
+ f"harness {self.config.id!r} requires a runtime with live process support"
81
+ )
82
+ config = await self.prepare_acp(
83
+ ctx, trace, runtime, endpoint, secret, mcp_urls, data
84
+ )
52
85
  return ACPHarnessSession(
53
- harness,
86
+ self,
54
87
  ctx,
55
88
  trace,
56
89
  runtime,
57
90
  endpoint,
58
91
  secret,
59
- mcp_urls,
92
+ mcp_urls if config.mcp_urls is None else config.mcp_urls,
60
93
  data,
61
- env=env,
62
- command=command,
63
- prompt=prompt,
64
- system_prompt=system_prompt,
65
- session_meta=session_meta,
94
+ config,
66
95
  )
67
96
 
68
- async def run(
69
- self,
70
- runtime: Runtime,
71
- env: dict[str, str],
72
- command: list[str],
73
- prompt: str | Messages | None,
74
- *,
75
- mcp_urls: dict[str, str] | None = None,
76
- system_prompt: str | None = None,
77
- session_path: str | None = None,
78
- session_meta: dict | None = None,
79
- allow_empty_tool_reply: bool = False,
80
- ) -> ProgramResult:
81
- """Run one ACP segment without retaining its process."""
82
- return await self._run(
83
- runtime,
84
- env,
85
- command,
86
- prompt,
87
- mcp_urls=mcp_urls,
88
- system_prompt=system_prompt,
89
- session_path=session_path,
90
- session_meta=session_meta,
91
- allow_empty_tool_reply=allow_empty_tool_reply,
92
- )
93
-
94
- async def _run(
97
+ async def launch(
95
98
  self,
99
+ ctx: ModelContext,
100
+ trace: Trace,
96
101
  runtime: Runtime,
97
- env: dict[str, str],
98
- command: list[str],
99
- prompt: str | Messages | None,
100
- *,
101
- mcp_urls: dict[str, str] | None = None,
102
- system_prompt: str | None = None,
103
- session_path: str | None = None,
104
- session_meta: dict | None = None,
105
- allow_empty_tool_reply: bool = False,
102
+ endpoint: str,
103
+ secret: str,
104
+ mcp_urls: dict[str, str],
105
+ data: TaskData,
106
106
  ) -> ProgramResult:
107
- if prompt is None:
108
- raise ValueError("ACP requires a prompt")
109
- messages = (
110
- [{"role": "user", "content": prompt}]
111
- if isinstance(prompt, str)
112
- else [message_to_wire(message) for message in prompt]
113
- )
114
- config = {
115
- "command": command,
116
- "messages": messages,
117
- "mcp_urls": mcp_urls or {},
118
- "system_prompt": system_prompt or "",
119
- "session_path": session_path,
120
- "session_meta": session_meta or {},
121
- "allow_empty_tool_reply": allow_empty_tool_reply,
122
- }
123
- program = await runtime.prepare_uv_script(
124
- ACP_SOURCE,
125
- {**env, "UV_FROZEN": "false"},
126
- activate=False,
107
+ raise HarnessError(
108
+ f"harness {self.config.id!r} requires a rollout-scoped session"
127
109
  )
128
- directory = f".vf-acp-{secrets.token_hex(8)}"
129
- created = await runtime.run(["mkdir", "-m", "700", directory], {})
130
- if created.exit_code != 0:
131
- raise RuntimeError(f"ACP config directory failed: {created.stderr.strip()}")
132
- path = f"{directory}/config.json"
133
- try:
134
- await runtime.write(path, json.dumps(config).encode())
135
- return await runtime.run_program([*program, "once", path], env)
136
- finally:
137
- await run_shielded(runtime.run(["rm", "-rf", directory], {}))
138
110
 
139
111
 
140
- def _packet(value: dict) -> bytes:
112
+ def _packet(value: JsonObject) -> bytes:
141
113
  data = json.dumps(value, ensure_ascii=False).encode()
142
114
  if len(data) > MAX_PACKET_BYTES:
143
115
  raise ValueError(f"ACP session packet is too large: {len(data)} bytes")
144
116
  return len(data).to_bytes(8, "big") + data
145
117
 
146
118
 
119
+ def _require_model_turn(trace: Trace, calls_before: int, result: ProgramResult) -> None:
120
+ if (
121
+ result.exit_code
122
+ or trace.stop_condition is not None
123
+ or any(call.node is not None for call in trace.calls[calls_before:])
124
+ ):
125
+ return
126
+ detail = (result.stderr or result.stdout).strip()[-500:] or "<no output>"
127
+ raise RuntimeError("ACP agent completed without committing a model turn: " + detail)
128
+
129
+
147
130
  class _PacketReader:
148
131
  def __init__(self, source: AsyncIterator[bytes]) -> None:
149
132
  self._source = source.__aiter__()
@@ -159,7 +142,7 @@ class _PacketReader:
159
142
  del self._buffer[:size]
160
143
  return data
161
144
 
162
- async def read(self) -> dict:
145
+ async def read(self) -> JsonObject:
163
146
  size = int.from_bytes(await self._readexactly(8), "big")
164
147
  if size > MAX_PACKET_BYTES:
165
148
  raise ValueError(f"ACP session packet is too large: {size} bytes")
@@ -179,18 +162,10 @@ class ACPHarnessSession(HarnessSession):
179
162
  secret: str,
180
163
  mcp_urls: dict[str, str],
181
164
  data: TaskData,
182
- env: dict[str, str],
183
- command: list[str],
184
- prompt: str | Messages | None,
185
- system_prompt: str | None,
186
- session_meta: dict | None,
165
+ config: ACPConfig,
187
166
  ) -> None:
188
167
  super().__init__(harness, ctx, trace, runtime, endpoint, secret, mcp_urls, data)
189
- self.env = env
190
- self.command = command
191
- self.prompt = prompt
192
- self.system_prompt = system_prompt
193
- self.session_meta = session_meta or {}
168
+ self.config = config
194
169
  self._process: RuntimeProcess | None = None
195
170
  self._reader: _PacketReader | None = None
196
171
  self._stderr_tail = bytearray()
@@ -201,10 +176,10 @@ class ACPHarnessSession(HarnessSession):
201
176
  self._stderr_tail.clear()
202
177
  program = await self.runtime.prepare_uv_script(
203
178
  ACP_SOURCE,
204
- {**self.env, "UV_FROZEN": "false"},
179
+ {**self.config.env, "UV_FROZEN": "false"},
205
180
  activate=False,
206
181
  )
207
- process = await self.runtime.open_process([*program, "stream"], self.env)
182
+ process = await self.runtime.open_process(program, self.config.env)
208
183
  self._process = process
209
184
  self._reader = _PacketReader(process.stdout)
210
185
  self._stderr_task = asyncio.create_task(self._drain_stderr(process.stderr))
@@ -219,21 +194,28 @@ class ACPHarnessSession(HarnessSession):
219
194
  return self._stderr_tail.decode(errors="replace").strip()
220
195
 
221
196
  async def _run(self, messages: Messages | None) -> ProgramResult:
222
- prompt = self.prompt if messages is None else messages
197
+ prompt = self.config.prompt if messages is None else messages
223
198
  if prompt is None:
224
199
  raise ValueError("ACP requires a prompt")
225
- wire_messages = (
226
- [{"role": "user", "content": prompt}]
200
+ if not isinstance(prompt, str) and (
201
+ not prompt or any(message.role != "user" for message in prompt)
202
+ ):
203
+ raise ValueError("an ACP turn must contain user messages only")
204
+ user_contents = (
205
+ [prompt]
227
206
  if isinstance(prompt, str)
228
- else [message_to_wire(message) for message in prompt]
207
+ else [
208
+ message.model_dump(mode="json", include={"content"})["content"]
209
+ for message in prompt
210
+ ]
229
211
  )
230
212
  config = {
231
- "command": self.command,
232
- "messages": wire_messages,
213
+ "command": self.config.command,
214
+ "user_contents": user_contents,
233
215
  "mcp_urls": self.mcp_urls,
234
- "system_prompt": self.system_prompt or "",
235
- "session_path": None,
236
- "session_meta": self.session_meta,
216
+ "system_prompt": self.config.system_prompt or "",
217
+ "session_meta": self.config.session_meta or {},
218
+ "allow_empty_tool_reply": self.config.allow_empty_tool_reply,
237
219
  }
238
220
  async with self._lock:
239
221
  if self._closed:
@@ -244,6 +226,7 @@ class ACPHarnessSession(HarnessSession):
244
226
  await self._start()
245
227
  assert self._process is not None
246
228
  assert self._reader is not None
229
+ calls_before = len(self.trace.calls)
247
230
  try:
248
231
  await self._process.write(
249
232
  _packet({"operation": "prompt", "config": config})
@@ -257,7 +240,12 @@ class ACPHarnessSession(HarnessSession):
257
240
  if stderr := self._stderr():
258
241
  detail = f"{detail}\n\nACP process stderr:\n{stderr}"
259
242
  raise RuntimeError(detail)
260
- return ProgramResult(exit_code=0, stdout=response.get("reply", ""), stderr="")
243
+ reply = response.get("reply", "")
244
+ if not isinstance(reply, str):
245
+ raise TypeError("ACP session reply must be a string")
246
+ result = ProgramResult(exit_code=0, stdout=reply, stderr="")
247
+ _require_model_turn(self.trace, calls_before, result)
248
+ return result
261
249
 
262
250
  async def _stop(self, *, graceful: bool) -> None:
263
251
  process, self._process = self._process, None
@@ -265,41 +253,30 @@ class ACPHarnessSession(HarnessSession):
265
253
  stderr_task, self._stderr_task = self._stderr_task, None
266
254
  if process is None:
267
255
  return
268
- failure: BaseException | None = None
269
256
  try:
270
257
  if graceful and reader is not None:
271
- try:
258
+ with contextlib.suppress(BaseException):
272
259
  await process.write(_packet({"operation": "shutdown"}))
273
- response = await asyncio.wait_for(reader.read(), timeout=10)
274
- if not response.get("ok"):
275
- raise RuntimeError(
276
- response.get("error") or "ACP session shutdown failed"
277
- )
278
- except BaseException as error: # noqa: BLE001 - finish teardown if cancelled
279
- failure = error
280
- try:
281
- await asyncio.wait_for(process.wait(), timeout=10 if graceful else 0.1)
282
- except BaseException: # noqa: BLE001 - cancellation still requires termination
283
- with contextlib.suppress(Exception):
284
- await asyncio.wait_for(process.terminate(), timeout=5)
285
- try:
286
- await asyncio.wait_for(process.wait(), timeout=5)
287
- except BaseException: # noqa: BLE001 - cancellation still requires a kill
288
- with contextlib.suppress(Exception):
289
- await asyncio.wait_for(process.kill(), timeout=5)
260
+ await asyncio.wait_for(reader.read(), timeout=10)
261
+ for timeout, stop in (
262
+ (10 if graceful else 0.1, None),
263
+ (5, process.terminate),
264
+ (5, process.kill),
265
+ ):
266
+ if stop is not None:
290
267
  with contextlib.suppress(BaseException):
291
- await asyncio.wait_for(process.wait(), timeout=5)
268
+ await stop()
269
+ try:
270
+ await asyncio.wait_for(process.wait(), timeout)
271
+ break
272
+ except TimeoutError:
273
+ continue
292
274
  finally:
293
275
  if stderr_task is not None:
294
276
  if not stderr_task.done():
295
277
  stderr_task.cancel()
296
278
  with contextlib.suppress(BaseException):
297
279
  await stderr_task
298
- if failure is not None:
299
- detail = str(failure)
300
- if stderr := self._stderr():
301
- detail = f"{detail}\n\nACP process stderr:\n{stderr}"
302
- raise RuntimeError(detail) from failure
303
280
 
304
281
  async def close(self) -> None:
305
282
  if self._closed: