verifiers 0.2.2.dev62__tar.gz → 0.2.2.dev63__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 (429) hide show
  1. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/PKG-INFO +1 -1
  2. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/agent.py +4 -0
  3. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/env.py +7 -1
  4. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/interception/__init__.py +7 -4
  5. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/interception/base.py +3 -5
  6. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/interception/pool.py +14 -6
  7. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/interception/server.py +39 -27
  8. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/mcp/launch.py +81 -35
  9. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/mcp/server.py +51 -14
  10. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/rollout.py +14 -4
  11. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/.gitignore +0 -0
  12. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/LICENSE +0 -0
  13. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/README.md +0 -0
  14. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/pyproject.toml +0 -0
  15. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/__init__.py +0 -0
  16. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/conftest.py +0 -0
  17. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_browser_env.py +0 -0
  18. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_build_script.py +0 -0
  19. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_cli_agent_env.py +0 -0
  20. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_client_auth_errors.py +0 -0
  21. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_client_config.py +0 -0
  22. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_client_multimodal_types.py +0 -0
  23. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_composable_env.py +0 -0
  24. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_context_token_metrics.py +0 -0
  25. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_decorator_ranks.py +0 -0
  26. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_endpoint_registry.py +0 -0
  27. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_env_group.py +0 -0
  28. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_env_server.py +0 -0
  29. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_environment.py +0 -0
  30. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_environment_extra.py +0 -0
  31. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_error_chain.py +0 -0
  32. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_eval_display.py +0 -0
  33. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_eval_utils.py +0 -0
  34. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_gepa_cli.py +0 -0
  35. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_gepa_utils.py +0 -0
  36. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_gym_env.py +0 -0
  37. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_harbor_env_mcp.py +0 -0
  38. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_imports.py +0 -0
  39. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_init_script.py +0 -0
  40. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_install_utils.py +0 -0
  41. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_interception_utils.py +0 -0
  42. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_logging.py +0 -0
  43. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_math_rubric.py +0 -0
  44. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_maybe_think_parser.py +0 -0
  45. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_message_utils.py +0 -0
  46. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_message_utils_multimodal.py +0 -0
  47. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_multiturn_env.py +0 -0
  48. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_nemorl_client.py +0 -0
  49. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_openai_chat_completions_token_client.py +0 -0
  50. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_openai_responses_client.py +0 -0
  51. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_opencode_rlm_env.py +0 -0
  52. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_openenv_client.py +0 -0
  53. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_parser.py +0 -0
  54. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_path_utils.py +0 -0
  55. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_per_turn_timing.py +0 -0
  56. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_pricing_utils.py +0 -0
  57. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_prime_plugin.py +0 -0
  58. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_renderer_client.py +0 -0
  59. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_renderer_e2e.py +0 -0
  60. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_rlm_composable_env.py +0 -0
  61. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_rubric.py +0 -0
  62. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_rubric_group.py +0 -0
  63. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_sandbox_debug_env.py +0 -0
  64. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_sandbox_env.py +0 -0
  65. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_sandbox_mixin.py +0 -0
  66. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_save_utils.py +0 -0
  67. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_setup_script.py +0 -0
  68. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_singleturn_env.py +0 -0
  69. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_stateful_tool_env.py +0 -0
  70. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_think_parser.py +0 -0
  71. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_tool_env.py +0 -0
  72. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_tool_utils.py +0 -0
  73. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_trajectory_processing.py +0 -0
  74. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_tui_info_formatting.py +0 -0
  75. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_types.py +0 -0
  76. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/test_xml_parser.py +0 -0
  77. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/v1/conftest.py +0 -0
  78. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  79. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/v1/fixtures/duet_v1.py +0 -0
  80. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
  81. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  82. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/v1/fixtures/echo_multi_v0.py +0 -0
  83. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  84. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  85. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/v1/fixtures/echo_v0.py +0 -0
  86. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/v1/fixtures/echo_v1.py +0 -0
  87. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/v1/fixtures/pyproject.toml +0 -0
  88. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  89. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/v1/test_color_codeword_tasks.py +0 -0
  90. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/v1/test_configs.py +0 -0
  91. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/v1/test_e2e.py +0 -0
  92. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/v1/test_envs.py +0 -0
  93. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/v1/test_graph.py +0 -0
  94. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/v1/test_judges.py +0 -0
  95. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/v1/test_legacy.py +0 -0
  96. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/v1/test_scoring.py +0 -0
  97. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/v1/test_taskset.py +0 -0
  98. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/tests/v1/test_trace.py +0 -0
  99. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/__init__.py +0 -0
  100. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/cli/__init__.py +0 -0
  101. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/cli/commands/__init__.py +0 -0
  102. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/cli/commands/build.py +0 -0
  103. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/cli/commands/eval.py +0 -0
  104. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/cli/commands/gepa.py +0 -0
  105. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/cli/commands/init.py +0 -0
  106. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/cli/commands/install.py +0 -0
  107. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/cli/commands/setup.py +0 -0
  108. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/cli/plugins/__init__.py +0 -0
  109. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/cli/plugins/prime.py +0 -0
  110. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/cli/tui.py +0 -0
  111. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/clients/__init__.py +0 -0
  112. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/clients/anthropic_messages_client.py +0 -0
  113. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/clients/client.py +0 -0
  114. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
  115. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/clients/openai_chat_completions_client.py +0 -0
  116. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
  117. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/clients/openai_completions_client.py +0 -0
  118. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/clients/openai_responses_client.py +0 -0
  119. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/clients/renderer_client.py +0 -0
  120. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/decorators.py +0 -0
  121. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/__init__.py +0 -0
  122. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/env_group.py +0 -0
  123. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/environment.py +0 -0
  124. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/README.md +0 -0
  125. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/__init__.py +0 -0
  126. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/cli_agent_env.py +0 -0
  127. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/README.md +0 -0
  128. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/__init__.py +0 -0
  129. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/_filter.py +0 -0
  130. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/composable_env.py +0 -0
  131. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/harness.py +0 -0
  132. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
  133. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  134. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
  135. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
  136. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
  137. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
  138. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
  139. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/task.py +0 -0
  140. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
  141. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  142. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  143. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  144. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  145. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  146. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  147. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  148. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  149. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  150. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
  151. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  152. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  153. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  154. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  155. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  156. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  157. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  158. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  159. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  160. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  161. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  162. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  163. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  164. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  165. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  166. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  167. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  168. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  169. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  170. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  171. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  172. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  173. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  174. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/gym_env.py +0 -0
  175. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
  176. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/harbor_env/env.py +0 -0
  177. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
  178. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/mcp_env.py +0 -0
  179. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/opencode_env.py +0 -0
  180. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
  181. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
  182. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
  183. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/utils/__init__.py +0 -0
  184. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/utils/file_locks.py +0 -0
  185. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
  186. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/integrations/README.md +0 -0
  187. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/integrations/__init__.py +0 -0
  188. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/integrations/browser_env/README.md +0 -0
  189. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
  190. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
  191. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
  192. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
  193. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  194. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  195. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/integrations/openenv_env.py +0 -0
  196. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
  197. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/integrations/textarena_env.py +0 -0
  198. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/multiturn_env.py +0 -0
  199. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/python_env.py +0 -0
  200. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/sandbox_env.py +0 -0
  201. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/singleturn_env.py +0 -0
  202. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/stateful_tool_env.py +0 -0
  203. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/envs/tool_env.py +0 -0
  204. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/errors.py +0 -0
  205. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/gepa/__init__.py +0 -0
  206. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/gepa/adapter.py +0 -0
  207. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/gepa/config.py +0 -0
  208. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/gepa/display.py +0 -0
  209. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/gepa/gepa_utils.py +0 -0
  210. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/parsers/__init__.py +0 -0
  211. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/parsers/maybe_think_parser.py +0 -0
  212. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/parsers/parser.py +0 -0
  213. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/parsers/think_parser.py +0 -0
  214. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/parsers/xml_parser.py +0 -0
  215. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/rubrics/__init__.py +0 -0
  216. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
  217. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/rubrics/judge_rubric.py +0 -0
  218. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/rubrics/math_rubric.py +0 -0
  219. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/rubrics/rubric.py +0 -0
  220. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/rubrics/rubric_group.py +0 -0
  221. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/scripts/__init__.py +0 -0
  222. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/scripts/build.py +0 -0
  223. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/scripts/eval.py +0 -0
  224. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/scripts/gepa.py +0 -0
  225. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/scripts/init.py +0 -0
  226. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/scripts/install.py +0 -0
  227. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/scripts/setup.py +0 -0
  228. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/scripts/tui.py +0 -0
  229. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/serve/__init__.py +0 -0
  230. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/serve/client/env_client.py +0 -0
  231. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/serve/client/zmq_env_client.py +0 -0
  232. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/serve/server/__init__.py +0 -0
  233. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/serve/server/env_router.py +0 -0
  234. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/serve/server/env_server.py +0 -0
  235. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/serve/server/env_worker.py +0 -0
  236. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/serve/server/zmq_env_server.py +0 -0
  237. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/serve/types.py +0 -0
  238. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/types.py +0 -0
  239. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/utils/__init__.py +0 -0
  240. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/utils/async_utils.py +0 -0
  241. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/utils/client_utils.py +0 -0
  242. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/utils/config_utils.py +0 -0
  243. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/utils/data_utils.py +0 -0
  244. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/utils/display_utils.py +0 -0
  245. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/utils/env_config_utils.py +0 -0
  246. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/utils/env_utils.py +0 -0
  247. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/utils/error_utils.py +0 -0
  248. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/utils/eval_display.py +0 -0
  249. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/utils/eval_utils.py +0 -0
  250. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/utils/heartbeat.py +0 -0
  251. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/utils/import_utils.py +0 -0
  252. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/utils/install_utils.py +0 -0
  253. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/utils/interception_utils.py +0 -0
  254. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/utils/logging_utils.py +0 -0
  255. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/utils/message_utils.py +0 -0
  256. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/utils/metric_utils.py +0 -0
  257. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/utils/path_utils.py +0 -0
  258. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/utils/pricing_utils.py +0 -0
  259. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/utils/process_utils.py +0 -0
  260. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/utils/response_utils.py +0 -0
  261. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/utils/save_utils.py +0 -0
  262. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/utils/serve_utils.py +0 -0
  263. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/utils/thread_utils.py +0 -0
  264. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/utils/threaded_sandbox_client.py +0 -0
  265. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/utils/tool_utils.py +0 -0
  266. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/utils/usage_utils.py +0 -0
  267. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/utils/version_utils.py +0 -0
  268. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/__init__.py +0 -0
  269. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/acp/__init__.py +0 -0
  270. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/acp/_runner.py +0 -0
  271. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/artifacts.py +0 -0
  272. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/cli/__init__.py +0 -0
  273. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  274. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/cli/dashboard/base.py +0 -0
  275. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/cli/dashboard/eval.py +0 -0
  276. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/cli/dashboard/replay.py +0 -0
  277. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/cli/dashboard/validate.py +0 -0
  278. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/cli/debug.py +0 -0
  279. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/cli/eval/__init__.py +0 -0
  280. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/cli/eval/main.py +0 -0
  281. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/cli/eval/resume.py +0 -0
  282. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/cli/eval/runner.py +0 -0
  283. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/cli/gepa.py +0 -0
  284. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/cli/init.py +0 -0
  285. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/cli/output.py +0 -0
  286. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/cli/replay.py +0 -0
  287. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/cli/resolve.py +0 -0
  288. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/cli/serve.py +0 -0
  289. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/cli/validate.py +0 -0
  290. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/clients/__init__.py +0 -0
  291. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/clients/client.py +0 -0
  292. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/clients/config.py +0 -0
  293. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/clients/eval.py +0 -0
  294. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/clients/train.py +0 -0
  295. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/configs/__init__.py +0 -0
  296. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/configs/agent.py +0 -0
  297. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/configs/cli/__init__.py +0 -0
  298. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/configs/cli/debug.py +0 -0
  299. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/configs/cli/env.py +0 -0
  300. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/configs/cli/eval.py +0 -0
  301. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/configs/cli/init.py +0 -0
  302. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/configs/cli/replay.py +0 -0
  303. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/configs/cli/serve.py +0 -0
  304. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/configs/cli/validate.py +0 -0
  305. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/configs/env.py +0 -0
  306. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/configs/harness.py +0 -0
  307. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/configs/judge.py +0 -0
  308. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/configs/legacy.py +0 -0
  309. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/configs/retries.py +0 -0
  310. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/configs/serve.py +0 -0
  311. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/configs/task.py +0 -0
  312. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/configs/taskset.py +0 -0
  313. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/decorators.py +0 -0
  314. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/dialects/__init__.py +0 -0
  315. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/dialects/anthropic.py +0 -0
  316. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/dialects/base.py +0 -0
  317. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/dialects/chat.py +0 -0
  318. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/dialects/responses.py +0 -0
  319. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/envs/__init__.py +0 -0
  320. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
  321. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/envs/agentic_judge/env.py +0 -0
  322. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  323. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/envs/best_of_n/env.py +0 -0
  324. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  325. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/envs/single_agent/env.py +0 -0
  326. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/envs/user_sim/__init__.py +0 -0
  327. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/envs/user_sim/env.py +0 -0
  328. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/episode.py +0 -0
  329. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/errors.py +0 -0
  330. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/gepa/__init__.py +0 -0
  331. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/gepa/adapter.py +0 -0
  332. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/gepa/config.py +0 -0
  333. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/gepa/dataset.py +0 -0
  334. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/gepa/reflection.py +0 -0
  335. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/gepa/runner.py +0 -0
  336. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/graph.py +0 -0
  337. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/harness.py +0 -0
  338. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/harnesses/__init__.py +0 -0
  339. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  340. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/harnesses/bash/harness.py +0 -0
  341. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/harnesses/bash/program.py +0 -0
  342. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
  343. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
  344. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/harnesses/browser_use/program.py +0 -0
  345. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  346. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
  347. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  348. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/harnesses/codex/harness.py +0 -0
  349. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
  350. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
  351. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
  352. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  353. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  354. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  355. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  356. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  357. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/harnesses/null/__init__.py +0 -0
  358. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/harnesses/null/harness.py +0 -0
  359. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/harnesses/null/program.py +0 -0
  360. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
  361. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/harnesses/openclaw/harness.py +0 -0
  362. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  363. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/harnesses/pi/harness.py +0 -0
  364. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/harnesses/pool/__init__.py +0 -0
  365. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/harnesses/pool/harness.py +0 -0
  366. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  367. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  368. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  369. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  370. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  371. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  372. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/interception/tunnel/base.py +0 -0
  373. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/interception/tunnel/custom.py +0 -0
  374. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/interception/tunnel/prime.py +0 -0
  375. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/judge.py +0 -0
  376. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/judges/__init__.py +0 -0
  377. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/judges/reference.py +0 -0
  378. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/judges/reference.txt +0 -0
  379. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/judges/rubric.py +0 -0
  380. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/judges/rubric.txt +0 -0
  381. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/legacy.py +0 -0
  382. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/loaders.py +0 -0
  383. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/mcp/__init__.py +0 -0
  384. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/mcp/toolset.py +0 -0
  385. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/push.py +0 -0
  386. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/retries.py +0 -0
  387. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/runtimes/__init__.py +0 -0
  388. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/runtimes/base.py +0 -0
  389. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/runtimes/docker/__init__.py +0 -0
  390. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/runtimes/docker/egress.py +0 -0
  391. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/runtimes/limiters.py +0 -0
  392. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/runtimes/modal.py +0 -0
  393. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/runtimes/prime.py +0 -0
  394. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/runtimes/subprocess.py +0 -0
  395. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/scoring.py +0 -0
  396. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/serve/__init__.py +0 -0
  397. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/serve/client.py +0 -0
  398. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/serve/pool.py +0 -0
  399. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/serve/server.py +0 -0
  400. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/serve/types.py +0 -0
  401. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/session.py +0 -0
  402. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/state.py +0 -0
  403. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/task.py +0 -0
  404. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/taskset.py +0 -0
  405. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/tasksets/__init__.py +0 -0
  406. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  407. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  408. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  409. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  410. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  411. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  412. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  413. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  414. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  415. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/trace.py +0 -0
  416. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/types.py +0 -0
  417. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/utils/__init__.py +0 -0
  418. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/utils/aio.py +0 -0
  419. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/utils/compile.py +0 -0
  420. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/utils/format.py +0 -0
  421. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/utils/generic.py +0 -0
  422. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/utils/git.py +0 -0
  423. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/utils/image.py +0 -0
  424. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/utils/install.py +0 -0
  425. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/utils/interrupt.py +0 -0
  426. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/utils/logging.py +0 -0
  427. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/utils/memory.py +0 -0
  428. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/verifiers/v1/utils/sampling.py +0 -0
  429. {verifiers-0.2.2.dev62 → verifiers-0.2.2.dev63}/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.dev62
3
+ Version: 0.2.2.dev63
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
@@ -334,6 +334,10 @@ class Agent:
334
334
  return self.interception
335
335
  if self._server is None:
336
336
  return None
337
+ if any(tool.state_secret for tool in shared_tools.values()):
338
+ # Shared state credentials are attached per run, after this owned
339
+ # server was created; let the rollout size a scoped server instead.
340
+ return None
337
341
  if self._server.tunnel is not None or (
338
342
  run_is_local and not shared_tools and not task.toolsets(task.config)
339
343
  ):
@@ -350,7 +350,13 @@ class Env(ABC, Generic[ConfigT]):
350
350
  run slots inside. Torn down on exit (`teardown()`, then the framework's)."""
351
351
  async with self.shared_tools() as shared:
352
352
  interception = make_interception(
353
- self.config.interception, requires_tunnel=self._requires_tunnel(shared)
353
+ self.config.interception,
354
+ requires_tunnel=self._requires_tunnel(shared),
355
+ state_service_secrets=tuple(
356
+ server.state_secret
357
+ for server in shared.values()
358
+ if server.state_secret
359
+ ),
354
360
  )
355
361
  async with interception:
356
362
  self._shared_tools = shared
@@ -54,16 +54,19 @@ def requires_tunnel(
54
54
 
55
55
 
56
56
  def make_interception(
57
- config: InterceptionConfig, *, requires_tunnel: bool
57
+ config: InterceptionConfig,
58
+ *,
59
+ requires_tunnel: bool,
60
+ state_service_secrets: tuple[str, ...] = (),
58
61
  ) -> Interception:
59
62
  """The interception for a config, picked by type (the host-side counterpart to
60
63
  `make_runtime`). With `requires_tunnel`, each server is exposed through its configured
61
64
  tunnel; otherwise it remains on host loopback. The caller computes this requirement."""
62
65
  if isinstance(config, InterceptionServerConfig):
63
- return InterceptionServer(config, requires_tunnel)
66
+ return InterceptionServer(config, requires_tunnel, state_service_secrets)
64
67
  if isinstance(config, StaticInterceptionPoolConfig):
65
- return StaticInterceptionPool(config, requires_tunnel)
66
- return ElasticInterceptionPool(config, requires_tunnel)
68
+ return StaticInterceptionPool(config, requires_tunnel, state_service_secrets)
69
+ return ElasticInterceptionPool(config, requires_tunnel, state_service_secrets)
67
70
 
68
71
 
69
72
  __all__ = [
@@ -26,12 +26,10 @@ class BaseInterceptionConfig(BaseConfig):
26
26
  `multiplex`)."""
27
27
 
28
28
 
29
- # (base_url, secret): the interception server's reachable base URL for this rollout, and the
30
- # bearer the harness/tool servers authenticate with. The harness reaches the model at
31
- # `{base_url}/v1`; tool servers reach this rollout's shared state at `{base_url}/state`
32
- # + `/task`. `base_url` is universally reachable — the interception is exposed (tunnel)
29
+ # (base_url, model_secret, state_secret): model inference and task state deliberately use
30
+ # separate capabilities. `base_url` is universally reachable the interception is exposed
33
31
  # whenever any consumer is remote.
34
- Slot = tuple[str, str]
32
+ Slot = tuple[str, str, str]
35
33
 
36
34
 
37
35
  class Interception(ABC):
@@ -48,12 +48,16 @@ class StaticInterceptionPool(Interception):
48
48
  operator's call (it's the shape for pre-provisioned/bring-your-own endpoints)."""
49
49
 
50
50
  def __init__(
51
- self, config: StaticInterceptionPoolConfig, requires_tunnel: bool = False
51
+ self,
52
+ config: StaticInterceptionPoolConfig,
53
+ requires_tunnel: bool = False,
54
+ state_service_secrets: tuple[str, ...] = (),
52
55
  ) -> None:
53
56
  super().__init__()
54
57
  self.config = config
55
58
  self.servers = [
56
- InterceptionServer(server, requires_tunnel) for server in config.servers
59
+ InterceptionServer(server, requires_tunnel, state_service_secrets)
60
+ for server in config.servers
57
61
  ]
58
62
 
59
63
  async def start(self) -> None:
@@ -89,10 +93,12 @@ class ElasticInterceptionPool(Interception):
89
93
  self,
90
94
  config: ElasticInterceptionPoolConfig | None = None,
91
95
  requires_tunnel: bool = False,
96
+ state_service_secrets: tuple[str, ...] = (),
92
97
  ) -> None:
93
98
  super().__init__()
94
99
  self.config = config or ElasticInterceptionPoolConfig()
95
100
  self.requires_tunnel = requires_tunnel
101
+ self.state_service_secrets = state_service_secrets
96
102
  self.servers: list[InterceptionServer] = []
97
103
  self._lock = asyncio.Lock()
98
104
  self._warm_task: asyncio.Task[InterceptionServer] | None = None
@@ -116,7 +122,9 @@ class ElasticInterceptionPool(Interception):
116
122
  return server
117
123
  # Pin prime explicitly — the only tunnel kind that can be minted on demand.
118
124
  server = InterceptionServer(
119
- InterceptionServerConfig(tunnel=PrimeTunnelConfig()), self.requires_tunnel
125
+ InterceptionServerConfig(tunnel=PrimeTunnelConfig()),
126
+ self.requires_tunnel,
127
+ self.state_service_secrets,
120
128
  )
121
129
  await self.stack.enter_async_context(server)
122
130
  self.servers.append(server)
@@ -136,8 +144,8 @@ class ElasticInterceptionPool(Interception):
136
144
  # Register under the lock so concurrent acquires see each other's load.
137
145
  async with self._lock:
138
146
  server = await self._server()
139
- secret = server.register(session)
147
+ model_secret, state_secret = server.register(session)
140
148
  try:
141
- yield server.base_url, secret
149
+ yield server.base_url, model_secret, state_secret
142
150
  finally:
143
- server.unregister(secret)
151
+ server.unregister(model_secret, state_secret)
@@ -6,10 +6,10 @@ into the trace's message graph, and returns the result in OpenAI shape. We injec
6
6
  `OPENAI_BASE_URL`/`OPENAI_API_KEY` so the program's SDK talks to us. Both non-streaming and
7
7
  SSE requests are supported.
8
8
 
9
- One server multiplexes many rollouts: each rollout registers a `RolloutSession` under its
10
- own secret (the bearer token the harness already sends), and the server routes by that
11
- secret to the right session. So N rollouts need one server (and, behind a remote runtime,
12
- one tunnel) per pool member rather than one each — see `interception.pool`.
9
+ One server multiplexes many rollouts: each rollout registers separate model and state
10
+ capabilities, and the server routes each to the right session. So N rollouts need one
11
+ server (and, behind a remote runtime, one tunnel) per pool member rather than one each
12
+ see `interception.pool`.
13
13
 
14
14
  The server is a pure model boundary: one request, one turn — refusal checks (limits,
15
15
  `@stop`s), the model call, the graph commit, retry atomicity. A run's user exchange
@@ -25,7 +25,7 @@ import logging
25
25
  import secrets
26
26
  import time
27
27
  import traceback
28
- from collections.abc import AsyncIterator
28
+ from collections.abc import AsyncIterator, Collection
29
29
  from contextlib import asynccontextmanager
30
30
  from typing import Literal
31
31
 
@@ -126,9 +126,13 @@ class InterceptionServer(Interception):
126
126
  self,
127
127
  config: InterceptionServerConfig | None = None,
128
128
  requires_tunnel: bool = False,
129
+ state_service_secrets: Collection[str] = (),
129
130
  ) -> None:
130
131
  super().__init__()
131
132
  self.sessions: dict[str, RolloutSession] = {}
133
+ self.state_sessions: dict[str, RolloutSession] = {}
134
+ self.state_routes: dict[str, RolloutSession] = {}
135
+ self.state_service_secrets = frozenset(state_service_secrets)
132
136
  self.config = config or InterceptionServerConfig()
133
137
  self.tunnel: Tunnel | None = (
134
138
  make_tunnel(self.config.tunnel) if requires_tunnel else None
@@ -143,16 +147,20 @@ class InterceptionServer(Interception):
143
147
  """Rollouts currently registered — what the pools balance on."""
144
148
  return len(self.sessions)
145
149
 
146
- def register(self, session: RolloutSession) -> str:
147
- """Add a session under a fresh secret (the bearer token the harness must send) and
148
- return it."""
149
- secret = secrets.token_urlsafe(16)
150
- self.sessions[secret] = session
151
- return secret
152
-
153
- def unregister(self, secret: str) -> None:
154
- session = self.sessions.pop(secret, None)
150
+ def register(self, session: RolloutSession) -> tuple[str, str]:
151
+ """Register separate capabilities for model inference and private task state."""
152
+ model_secret = secrets.token_urlsafe(16)
153
+ state_secret = secrets.token_urlsafe(16)
154
+ self.sessions[model_secret] = session
155
+ self.state_sessions[state_secret] = session
156
+ self.state_routes[session.trace.id] = session
157
+ return model_secret, state_secret
158
+
159
+ def unregister(self, model_secret: str, state_secret: str) -> None:
160
+ session = self.sessions.pop(model_secret, None)
161
+ self.state_sessions.pop(state_secret, None)
155
162
  if session is not None:
163
+ self.state_routes.pop(session.trace.id, None)
156
164
  # The rollout concluded; its trace is sealed. Cancel straggler handlers
157
165
  # (aiohttp keeps them alive past client death) so a slow upstream call
158
166
  # can't commit a late turn onto the concluded trace.
@@ -160,11 +168,11 @@ class InterceptionServer(Interception):
160
168
 
161
169
  @asynccontextmanager
162
170
  async def acquire(self, session: RolloutSession) -> AsyncIterator[Slot]:
163
- secret = self.register(session)
171
+ model_secret, state_secret = self.register(session)
164
172
  try:
165
- yield self.base_url, secret
173
+ yield self.base_url, model_secret, state_secret
166
174
  finally:
167
- self.unregister(secret)
175
+ self.unregister(model_secret, state_secret)
168
176
 
169
177
  def _handler_for(self, dialect: Dialect):
170
178
  """Bind a route's dialect to the request handler — the route the SDK posts to is what
@@ -188,12 +196,11 @@ class InterceptionServer(Interception):
188
196
  app.router.add_post(route, self._handler_for(dialect))
189
197
  for aux in dialect.aux_routes:
190
198
  app.router.add_post(aux, self._aux_handler_for(dialect, aux))
191
- # The shared-state back-channel (see `verifiers.v1.state`): a rollout's tool servers
192
- # GET/PUT their `self.state` here, keyed by the same bearer secret as the model routes.
199
+ # Tool servers use a state-only capability; the model bearer cannot reach these.
193
200
  app.router.add_get("/state", self.handle_state_get)
194
201
  app.router.add_put("/state", self.handle_state_put)
195
202
  # A launched tool server fetches its rollout's task here to run `setup_task` — the task
196
- # is never passed via env, only over this channel, keyed by the same bearer secret.
203
+ # is never passed via env, only over this channel, keyed by the state bearer.
197
204
  app.router.add_get("/task", self.handle_task_get)
198
205
  self.runner = web.AppRunner(app)
199
206
  await self.runner.setup()
@@ -705,12 +712,17 @@ class InterceptionServer(Interception):
705
712
  return web.json_response(dialect.error_body(str(e)), status=502)
706
713
  return web.json_response(result)
707
714
 
708
- def _session_for(self, request: web.Request) -> RolloutSession | None:
709
- """The session a state request belongs to, by its `Authorization: Bearer <secret>` — the
710
- same per-rollout secret the model routes use (dialect-independent, so parsed directly)."""
715
+ def _session_for(
716
+ self, request: web.Request, *, allow_service: bool = False
717
+ ) -> RolloutSession | None:
718
+ """Resolve a private state bearer, or a trusted shared server plus route id."""
711
719
  auth = request.headers.get("Authorization", "")
712
720
  secret = auth[len("Bearer ") :] if auth.startswith("Bearer ") else ""
713
- session = self.sessions.get(secret)
721
+ session = self.state_sessions.get(secret)
722
+ if session is None and allow_service and secret in self.state_service_secrets:
723
+ session = self.state_routes.get(
724
+ request.headers.get("X-Verifiers-State-Route", "")
725
+ )
714
726
  if session is not None: # state writes must not land on a sealed trace either
715
727
  session.adopt(asyncio.current_task())
716
728
  return session
@@ -718,7 +730,7 @@ class InterceptionServer(Interception):
718
730
  async def handle_state_get(self, request: web.Request) -> web.Response:
719
731
  """Hand a rollout's tool server the current shared `trace.state` (it pulls before each
720
732
  `@vf.tool` call, so it sees writes from the other servers)."""
721
- session = self._session_for(request)
733
+ session = self._session_for(request, allow_service=True)
722
734
  if session is None:
723
735
  return web.json_response({"error": "unauthorized"}, status=401)
724
736
  logger.debug("intercept GET /state: id=%s", session.trace.id)
@@ -732,7 +744,7 @@ class InterceptionServer(Interception):
732
744
 
733
745
  async def handle_task_get(self, request: web.Request) -> web.Response:
734
746
  """Hand a launched tool server the rollout's task (class ref + JSON) so it can run
735
- `setup_task` for this rollout — keyed by the same bearer secret as the state channel."""
747
+ `setup_task` for this rollout — keyed by its private state bearer."""
736
748
  session = self._session_for(request)
737
749
  if session is None:
738
750
  return web.json_response({"error": "unauthorized"}, status=401)
@@ -749,7 +761,7 @@ class InterceptionServer(Interception):
749
761
  """Replace a rollout's shared `trace.state` with a server's pushed copy (validated into the
750
762
  trace's `State` type). Last write wins per call. A task ends the trajectory from state via
751
763
  its own `@stop` (run in `RolloutSession.refused` before each model call)."""
752
- session = self._session_for(request)
764
+ session = self._session_for(request, allow_service=True)
753
765
  if session is None:
754
766
  return web.json_response({"error": "unauthorized"}, status=401)
755
767
  logger.debug("intercept PUT /state: id=%s", session.trace.id)
@@ -5,12 +5,13 @@ import contextlib
5
5
  import importlib.metadata
6
6
  import io
7
7
  import logging
8
+ import secrets
8
9
  import shlex
9
10
  import sys
10
11
  import tarfile
11
12
  import uuid
12
13
  from collections.abc import AsyncIterator
13
- from dataclasses import dataclass
14
+ from dataclasses import dataclass, field
14
15
  from functools import cache
15
16
  from pathlib import Path
16
17
  from typing import TYPE_CHECKING
@@ -18,13 +19,20 @@ from urllib.parse import parse_qsl, urlencode, urlsplit, urlunsplit
18
19
 
19
20
  from verifiers.v1.errors import ToolsetError
20
21
  from verifiers.v1.interception.tunnel import PrimeTunnel
21
- from verifiers.v1.mcp.server import STATE_SECRET_PARAM, STATE_URL_PARAM, ServerBase
22
+ from verifiers.v1.mcp.server import (
23
+ STATE_ROUTE_PARAM,
24
+ STATE_SIGNATURE_PARAM,
25
+ STATE_URL_PARAM,
26
+ ServerBase,
27
+ state_signature,
28
+ )
22
29
  from verifiers.v1.runtimes import (
23
30
  NetworkPolicyConfig,
24
31
  Runtime,
25
32
  make_runtime,
26
33
  )
27
34
  from verifiers.v1.runtimes.base import _ENSURE_UV
35
+ from verifiers.v1.state import State
28
36
 
29
37
  if TYPE_CHECKING:
30
38
  from verifiers.v1.mcp.toolset import Toolset
@@ -169,14 +177,17 @@ async def serve_in_runtime(
169
177
  the OS choose and report the result through a file. With a state channel, the server fetches
170
178
  the current rollout task from the adjacent `/task` endpoint rather than a launch argument.
171
179
  """
172
- env = {"VF_CONFIG": server.config.model_dump_json()}
180
+ # A shared server has a private service secret but no fixed state URL. Set
181
+ # both controls explicitly so a subprocess cannot inherit stale host values.
182
+ env = {
183
+ "VF_CONFIG": server.config.model_dump_json(),
184
+ "VF_STATE_URL": state_url or "",
185
+ "VF_STATE_SECRET": state_secret,
186
+ }
173
187
  if runtime.type == "subprocess":
174
188
  # Keep provider temp files in the runtime workdir so cleanup removes them.
175
189
  assert runtime.info.id is not None
176
190
  env["TMPDIR"] = runtime.info.id
177
- if state_url:
178
- env["VF_STATE_URL"] = state_url
179
- env["VF_STATE_SECRET"] = state_secret
180
191
  if runtime.published_port is not None:
181
192
  env["MCP_HOST"] = "0.0.0.0"
182
193
  fixed = runtime.published_port if exposed else None
@@ -239,15 +250,20 @@ async def reachable_url(
239
250
  yield url
240
251
 
241
252
 
253
+ @dataclass(frozen=True)
254
+ class _ServedServer:
255
+ url: str
256
+ runtime: Runtime
257
+
258
+
242
259
  @contextlib.asynccontextmanager
243
- async def serve(
260
+ async def _serve(
244
261
  server: ServerBase,
245
262
  harness_runtime: Runtime | None = None,
246
263
  harness_is_local: bool = True,
247
264
  *,
248
265
  state_secret: str = "",
249
266
  state_base: str | None = None,
250
- runtime: Runtime | None = None,
251
267
  ):
252
268
  cfg = server.config
253
269
  colocated = getattr(cfg, "colocated", False)
@@ -268,7 +284,7 @@ async def serve(
268
284
  if colocated and harness_runtime is not None:
269
285
  runtime = harness_runtime
270
286
  else:
271
- runtime = runtime or make_runtime(cfg.runtime)
287
+ runtime = make_runtime(cfg.runtime)
272
288
  await runtime.start()
273
289
  stack.push_async_callback(runtime.stop)
274
290
  # Only consumers outside the server runtime need its fixed published port. Colocated tools
@@ -307,7 +323,27 @@ async def serve(
307
323
  base = base.replace("127.0.0.1", "localhost", 1)
308
324
  elif not colocated and harness_runtime is not None:
309
325
  base = harness_runtime.host_url(base)
310
- yield f"{base.rstrip('/')}/mcp"
326
+ yield _ServedServer(f"{base.rstrip('/')}/mcp", runtime)
327
+
328
+
329
+ @contextlib.asynccontextmanager
330
+ async def serve(
331
+ server: ServerBase,
332
+ harness_runtime: Runtime | None = None,
333
+ harness_is_local: bool = True,
334
+ *,
335
+ state_secret: str = "",
336
+ state_base: str | None = None,
337
+ ):
338
+ """Serve one MCP server and yield the URL visible to its consumer."""
339
+ async with _serve(
340
+ server,
341
+ harness_runtime,
342
+ harness_is_local,
343
+ state_secret=state_secret,
344
+ state_base=state_base,
345
+ ) as served:
346
+ yield served.url
311
347
 
312
348
 
313
349
  @dataclass(frozen=True)
@@ -324,7 +360,8 @@ class SharedToolServer:
324
360
  url: str
325
361
  local: bool
326
362
  external: bool = False
327
- runtime: Runtime | None = None
363
+ runtime: Runtime | None = field(default=None, repr=False)
364
+ state_secret: str = field(default="", repr=False)
328
365
 
329
366
 
330
367
  @contextlib.asynccontextmanager
@@ -361,31 +398,45 @@ async def serve_shared(toolsets: list[Toolset], harness_is_local: bool = True):
361
398
  url=cfg.url, local=False, external=True
362
399
  )
363
400
  else:
364
- runtime = make_runtime(cfg.runtime)
365
- url = await stack.enter_async_context(
366
- serve(
401
+ state_secret = (
402
+ secrets.token_urlsafe(24) if toolset._state_cls is not State else ""
403
+ )
404
+ served = await stack.enter_async_context(
405
+ _serve(
367
406
  toolset,
368
407
  harness_is_local=harness_is_local,
369
- runtime=runtime,
408
+ state_secret=state_secret,
370
409
  )
371
410
  )
372
411
  servers[name] = SharedToolServer(
373
- url=url,
374
- local=runtime.is_local,
375
- runtime=runtime,
412
+ url=served.url,
413
+ local=served.runtime.is_local,
414
+ runtime=served.runtime,
415
+ state_secret=state_secret,
376
416
  )
377
417
  logger.info("shared tool server '%s': %s", name, servers[name].url)
378
418
  yield servers
379
419
 
380
420
 
381
- def _shared_url_for_rollout(url: str, state_base: str | None, state_secret: str) -> str:
382
- """Attach one rollout's state bridge to a shared server URL."""
383
- if not state_base:
384
- return url
385
- parts = urlsplit(url)
421
+ def _shared_url_for_rollout(
422
+ server: SharedToolServer,
423
+ visible_url: str,
424
+ state_base: str | None,
425
+ state_route: str,
426
+ ) -> str:
427
+ """Attach signed state coordinates; the shared server keeps its bearer private."""
428
+ if not state_base or not server.state_secret:
429
+ return visible_url
430
+ state_url = f"{state_base.rstrip('/')}/state"
431
+ if server.runtime is not None:
432
+ state_url = server.runtime.host_url(state_url)
433
+ parts = urlsplit(visible_url)
386
434
  query = dict(parse_qsl(parts.query))
387
- query[STATE_URL_PARAM] = f"{state_base.rstrip('/')}/state"
388
- query[STATE_SECRET_PARAM] = state_secret
435
+ query[STATE_URL_PARAM] = state_url
436
+ query[STATE_ROUTE_PARAM] = state_route
437
+ query[STATE_SIGNATURE_PARAM] = state_signature(
438
+ server.state_secret, state_url, state_route
439
+ )
389
440
  return urlunsplit(parts._replace(query=urlencode(query)))
390
441
 
391
442
 
@@ -396,6 +447,7 @@ async def serve_tools(
396
447
  shared: dict[str, SharedToolServer] | None = None,
397
448
  *,
398
449
  state_secret: str = "",
450
+ state_route: str = "",
399
451
  state_base: str | None = None,
400
452
  ):
401
453
  """Bring up a rollout's tool servers and yield `{name: url}` the harness reaches: the
@@ -403,9 +455,9 @@ async def serve_tools(
403
455
  server fetches its task over the interception `/task` channel), and the
404
456
  taskset-scoped `shared` servers — already
405
457
  running eval-level (see `serve_shared`) — join under their per-rollout state tag.
406
- `state_base`/`state_secret` wire each server to the interception server's shared-state
407
- channel. Each launched server translates the host-local base for its own runtime;
408
- external servers stay untagged."""
458
+ `state_secret` is private to task-scoped servers; shared servers keep an
459
+ eval-level service secret and receive only signed `state_route` coordinates.
460
+ `state_base` is universally reachable from either placement."""
409
461
  urls: dict[str, str] = {}
410
462
  async with contextlib.AsyncExitStack() as stack:
411
463
  for name, server in (shared or {}).items():
@@ -417,13 +469,7 @@ async def serve_tools(
417
469
  logger.info("tool server '%s' (shared, external): %s", name, server.url)
418
470
  continue
419
471
  url = harness_runtime.host_url(server.url) if server.local else server.url
420
- shared_state_base = (
421
- server.runtime.host_url(state_base.rstrip("/"))
422
- if server.runtime is not None and state_base
423
- else state_base
424
- )
425
- urls[name] = _shared_url_for_rollout(url, shared_state_base, state_secret)
426
- # The tagged URL contains the bearer secret; log only the untagged base URL.
472
+ urls[name] = _shared_url_for_rollout(server, url, state_base, state_route)
427
473
  logger.info("tool server '%s' (shared): %s", name, server.url)
428
474
  for toolset in toolsets:
429
475
  name = toolset.server_name
@@ -3,6 +3,8 @@ from __future__ import annotations
3
3
  import contextlib
4
4
  import contextvars
5
5
  import functools
6
+ import hashlib
7
+ import hmac
6
8
  import inspect
7
9
  import logging
8
10
  import os
@@ -32,6 +34,7 @@ async def _channel_request(
32
34
  url: str,
33
35
  secret: str,
34
36
  *,
37
+ route: str | None = None,
35
38
  content: bytes | None = None,
36
39
  client: AsyncClient | None = None,
37
40
  ) -> Response:
@@ -57,6 +60,8 @@ async def _channel_request(
57
60
  )
58
61
  async with manager as request_client:
59
62
  headers = {"Authorization": f"Bearer {secret}"}
63
+ if route:
64
+ headers["X-Verifiers-State-Route"] = route
60
65
  if content is not None:
61
66
  headers["Content-Type"] = "application/json"
62
67
  resp = await request_client.request(
@@ -76,7 +81,15 @@ async def _channel_request(
76
81
  # Shared servers receive the calling rollout's state channel in URL parameters because one
77
82
  # process cannot carry a single rollout's channel in its environment.
78
83
  STATE_URL_PARAM = "vf_state_url"
79
- STATE_SECRET_PARAM = "vf_state_secret"
84
+ STATE_ROUTE_PARAM = "vf_state_route"
85
+ STATE_SIGNATURE_PARAM = "vf_state_signature"
86
+
87
+
88
+ def state_signature(secret: str, url: str, route: str) -> str:
89
+ """Authenticate one exact shared-server state destination."""
90
+ message = f"vf-state-v1\0{url}\0{route}".encode()
91
+ return hmac.new(secret.encode(), message, hashlib.sha256).hexdigest()
92
+
80
93
 
81
94
  # A context variable isolates the state seen by concurrent calls on one shared server.
82
95
  _call_state: contextvars.ContextVar[State | None] = contextvars.ContextVar(
@@ -91,7 +104,12 @@ def _request_query(name: str) -> str | None:
91
104
  request = request_ctx.get().request
92
105
  except LookupError:
93
106
  return None
94
- return request.query_params.get(name) if request is not None else None
107
+ if request is None:
108
+ return None
109
+ values = request.query_params.getlist(name)
110
+ if len(values) > 1:
111
+ raise ValueError(f"duplicate {name!r} state coordinate")
112
+ return values[0] if values else None
95
113
 
96
114
 
97
115
  def _die_with_parent() -> None:
@@ -135,19 +153,32 @@ class ServerBase(Generic[ConfigT, StateT]):
135
153
  current = _call_state.get()
136
154
  return current if current is not None else self._inert_state # type: ignore[return-value]
137
155
 
138
- def _state_channel(self) -> tuple[str | None, str]:
139
- """Prefer per-call coordinates for shared servers, then the process environment."""
140
- url = _request_query(STATE_URL_PARAM) or os.environ.get("VF_STATE_URL")
141
- secret = _request_query(STATE_SECRET_PARAM) or os.environ.get(
142
- "VF_STATE_SECRET", ""
143
- )
144
- return url, secret
156
+ def _state_channel(self) -> tuple[str | None, str, str | None]:
157
+ """Use an env channel, or authenticate the exact coordinates of a shared call."""
158
+ url = os.environ.get("VF_STATE_URL")
159
+ secret = os.environ.get("VF_STATE_SECRET", "")
160
+ if url:
161
+ return url, secret, None
162
+ shared_url = _request_query(STATE_URL_PARAM)
163
+ route = _request_query(STATE_ROUTE_PARAM)
164
+ signature = _request_query(STATE_SIGNATURE_PARAM)
165
+ if not any((shared_url, route, signature)):
166
+ return None, "", None
167
+ if not secret or not shared_url or not route or not signature:
168
+ raise ValueError("invalid shared state coordinates")
169
+ if not hmac.compare_digest(
170
+ signature, state_signature(secret, shared_url, route)
171
+ ):
172
+ raise ValueError("invalid shared state coordinates")
173
+ return shared_url, secret, route
145
174
 
146
175
  async def _pull_state(self) -> State:
147
- url, secret = self._state_channel()
176
+ url, secret, route = self._state_channel()
148
177
  if not url:
149
178
  return self._state_cls()
150
- response = await _channel_request("GET", url, secret, client=self._state_client)
179
+ response = await _channel_request(
180
+ "GET", url, secret, route=route, client=self._state_client
181
+ )
151
182
  try:
152
183
  return self._state_adapter.validate_json(response.content)
153
184
  except ValidationError as e:
@@ -157,7 +188,7 @@ class ServerBase(Generic[ConfigT, StateT]):
157
188
  raise
158
189
 
159
190
  async def _push_state(self, before: bytes) -> None:
160
- url, secret = self._state_channel()
191
+ url, secret, route = self._state_channel()
161
192
  if not url:
162
193
  return
163
194
  state = _call_state.get()
@@ -166,7 +197,12 @@ class ServerBase(Generic[ConfigT, StateT]):
166
197
  if after == before:
167
198
  return
168
199
  await _channel_request(
169
- "PUT", url, secret, content=after, client=self._state_client
200
+ "PUT",
201
+ url,
202
+ secret,
203
+ route=route,
204
+ content=after,
205
+ client=self._state_client,
170
206
  )
171
207
 
172
208
  async def _fetch_task(self, state_url: str | None, secret: str):
@@ -263,7 +299,8 @@ class ServerBase(Generic[ConfigT, StateT]):
263
299
  ):
264
300
  self._state_client = client
265
301
  await self.setup()
266
- await self._setup_task_from_channel(*self._state_channel())
302
+ state_url, secret, _ = self._state_channel()
303
+ await self._setup_task_from_channel(state_url, secret)
267
304
  # These servers are reached through localhost or a tunnel, never a browser.
268
305
  security = TransportSecuritySettings(
269
306
  enable_dns_rebinding_protection=False