verifiers 0.2.2.dev22__tar.gz → 0.2.2.dev24__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 (410) hide show
  1. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/PKG-INFO +2 -2
  2. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/pyproject.toml +1 -1
  3. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/fixtures/pyproject.toml +1 -0
  4. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/agent.py +15 -9
  5. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/mcp/launch.py +7 -7
  6. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/push.py +45 -1
  7. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/runtimes/__init__.py +2 -0
  8. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/runtimes/base.py +43 -3
  9. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/runtimes/docker/__init__.py +8 -35
  10. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/runtimes/prime.py +57 -4
  11. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/task.py +3 -3
  12. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/utils/compile.py +6 -12
  13. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/.gitignore +0 -0
  14. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/LICENSE +0 -0
  15. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/README.md +0 -0
  16. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/__init__.py +0 -0
  17. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/conftest.py +0 -0
  18. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_browser_env.py +0 -0
  19. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_build_script.py +0 -0
  20. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_cli_agent_env.py +0 -0
  21. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_client_auth_errors.py +0 -0
  22. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_client_config.py +0 -0
  23. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_client_multimodal_types.py +0 -0
  24. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_composable_env.py +0 -0
  25. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_context_token_metrics.py +0 -0
  26. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_decorator_ranks.py +0 -0
  27. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_endpoint_registry.py +0 -0
  28. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_env_group.py +0 -0
  29. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_env_server.py +0 -0
  30. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_environment.py +0 -0
  31. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_environment_extra.py +0 -0
  32. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_error_chain.py +0 -0
  33. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_eval_display.py +0 -0
  34. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_eval_utils.py +0 -0
  35. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_gepa_cli.py +0 -0
  36. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_gepa_utils.py +0 -0
  37. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_gym_env.py +0 -0
  38. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_harbor_env_mcp.py +0 -0
  39. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_imports.py +0 -0
  40. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_init_script.py +0 -0
  41. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_install_utils.py +0 -0
  42. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_interception_utils.py +0 -0
  43. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_logging.py +0 -0
  44. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_math_rubric.py +0 -0
  45. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_maybe_think_parser.py +0 -0
  46. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_message_utils.py +0 -0
  47. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_message_utils_multimodal.py +0 -0
  48. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_multiturn_env.py +0 -0
  49. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_nemorl_client.py +0 -0
  50. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_openai_chat_completions_token_client.py +0 -0
  51. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_openai_responses_client.py +0 -0
  52. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_opencode_rlm_env.py +0 -0
  53. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_openenv_client.py +0 -0
  54. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_parser.py +0 -0
  55. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_path_utils.py +0 -0
  56. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_per_turn_timing.py +0 -0
  57. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_pricing_utils.py +0 -0
  58. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_prime_plugin.py +0 -0
  59. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_renderer_client.py +0 -0
  60. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_renderer_e2e.py +0 -0
  61. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_rlm_composable_env.py +0 -0
  62. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_rubric.py +0 -0
  63. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_rubric_group.py +0 -0
  64. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_sandbox_debug_env.py +0 -0
  65. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_sandbox_env.py +0 -0
  66. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_sandbox_mixin.py +0 -0
  67. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_save_utils.py +0 -0
  68. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_setup_script.py +0 -0
  69. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_singleturn_env.py +0 -0
  70. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_stateful_tool_env.py +0 -0
  71. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_think_parser.py +0 -0
  72. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_tool_env.py +0 -0
  73. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_tool_utils.py +0 -0
  74. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_trajectory_processing.py +0 -0
  75. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_tui_info_formatting.py +0 -0
  76. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_types.py +0 -0
  77. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/test_xml_parser.py +0 -0
  78. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/conftest.py +0 -0
  79. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  80. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/fixtures/duet_v1.py +0 -0
  81. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
  82. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  83. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/fixtures/echo_multi_v0.py +0 -0
  84. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  85. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  86. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/fixtures/echo_v0.py +0 -0
  87. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/fixtures/echo_v1.py +0 -0
  88. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  89. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/test_color_codeword_tasks.py +0 -0
  90. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/test_configs.py +0 -0
  91. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/test_e2e.py +0 -0
  92. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/test_envs.py +0 -0
  93. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/test_graph.py +0 -0
  94. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/test_judges.py +0 -0
  95. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/test_legacy.py +0 -0
  96. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/test_scoring.py +0 -0
  97. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/test_taskset.py +0 -0
  98. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/tests/v1/test_trace.py +0 -0
  99. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/__init__.py +0 -0
  100. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/cli/__init__.py +0 -0
  101. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/cli/commands/__init__.py +0 -0
  102. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/cli/commands/build.py +0 -0
  103. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/cli/commands/eval.py +0 -0
  104. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/cli/commands/gepa.py +0 -0
  105. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/cli/commands/init.py +0 -0
  106. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/cli/commands/install.py +0 -0
  107. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/cli/commands/setup.py +0 -0
  108. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/cli/plugins/__init__.py +0 -0
  109. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/cli/plugins/prime.py +0 -0
  110. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/cli/tui.py +0 -0
  111. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/clients/__init__.py +0 -0
  112. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/clients/anthropic_messages_client.py +0 -0
  113. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/clients/client.py +0 -0
  114. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
  115. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/clients/openai_chat_completions_client.py +0 -0
  116. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
  117. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/clients/openai_completions_client.py +0 -0
  118. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/clients/openai_responses_client.py +0 -0
  119. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/clients/renderer_client.py +0 -0
  120. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/decorators.py +0 -0
  121. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/__init__.py +0 -0
  122. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/env_group.py +0 -0
  123. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/environment.py +0 -0
  124. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/README.md +0 -0
  125. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/__init__.py +0 -0
  126. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/cli_agent_env.py +0 -0
  127. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/README.md +0 -0
  128. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/__init__.py +0 -0
  129. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/_filter.py +0 -0
  130. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/composable_env.py +0 -0
  131. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/harness.py +0 -0
  132. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
  133. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  134. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
  135. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
  136. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
  137. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
  138. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
  139. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/task.py +0 -0
  140. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
  141. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  142. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  143. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  144. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  145. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  146. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  147. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  148. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  149. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  150. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
  151. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  152. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  153. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  154. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  155. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  156. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  157. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  158. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  159. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  160. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  161. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  162. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  163. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  164. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  165. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  166. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  167. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  168. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  169. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  170. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  171. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  172. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  173. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  174. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/gym_env.py +0 -0
  175. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
  176. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/harbor_env/env.py +0 -0
  177. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
  178. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/mcp_env.py +0 -0
  179. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/opencode_env.py +0 -0
  180. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
  181. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
  182. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
  183. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/utils/__init__.py +0 -0
  184. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/utils/file_locks.py +0 -0
  185. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
  186. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/integrations/README.md +0 -0
  187. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/integrations/__init__.py +0 -0
  188. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/integrations/browser_env/README.md +0 -0
  189. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
  190. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
  191. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
  192. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
  193. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  194. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  195. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/integrations/openenv_env.py +0 -0
  196. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
  197. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/integrations/textarena_env.py +0 -0
  198. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/multiturn_env.py +0 -0
  199. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/python_env.py +0 -0
  200. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/sandbox_env.py +0 -0
  201. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/singleturn_env.py +0 -0
  202. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/stateful_tool_env.py +0 -0
  203. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/envs/tool_env.py +0 -0
  204. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/errors.py +0 -0
  205. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/gepa/__init__.py +0 -0
  206. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/gepa/adapter.py +0 -0
  207. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/gepa/config.py +0 -0
  208. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/gepa/display.py +0 -0
  209. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/gepa/gepa_utils.py +0 -0
  210. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/parsers/__init__.py +0 -0
  211. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/parsers/maybe_think_parser.py +0 -0
  212. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/parsers/parser.py +0 -0
  213. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/parsers/think_parser.py +0 -0
  214. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/parsers/xml_parser.py +0 -0
  215. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/rubrics/__init__.py +0 -0
  216. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
  217. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/rubrics/judge_rubric.py +0 -0
  218. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/rubrics/math_rubric.py +0 -0
  219. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/rubrics/rubric.py +0 -0
  220. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/rubrics/rubric_group.py +0 -0
  221. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/scripts/__init__.py +0 -0
  222. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/scripts/build.py +0 -0
  223. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/scripts/eval.py +0 -0
  224. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/scripts/gepa.py +0 -0
  225. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/scripts/init.py +0 -0
  226. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/scripts/install.py +0 -0
  227. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/scripts/setup.py +0 -0
  228. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/scripts/tui.py +0 -0
  229. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/serve/__init__.py +0 -0
  230. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/serve/client/env_client.py +0 -0
  231. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/serve/client/zmq_env_client.py +0 -0
  232. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/serve/server/__init__.py +0 -0
  233. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/serve/server/env_router.py +0 -0
  234. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/serve/server/env_server.py +0 -0
  235. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/serve/server/env_worker.py +0 -0
  236. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/serve/server/zmq_env_server.py +0 -0
  237. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/serve/types.py +0 -0
  238. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/types.py +0 -0
  239. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/__init__.py +0 -0
  240. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/async_utils.py +0 -0
  241. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/client_utils.py +0 -0
  242. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/config_utils.py +0 -0
  243. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/data_utils.py +0 -0
  244. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/display_utils.py +0 -0
  245. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/env_config_utils.py +0 -0
  246. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/env_utils.py +0 -0
  247. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/error_utils.py +0 -0
  248. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/eval_display.py +0 -0
  249. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/eval_utils.py +0 -0
  250. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/heartbeat.py +0 -0
  251. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/import_utils.py +0 -0
  252. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/install_utils.py +0 -0
  253. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/interception_utils.py +0 -0
  254. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/logging_utils.py +0 -0
  255. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/message_utils.py +0 -0
  256. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/metric_utils.py +0 -0
  257. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/path_utils.py +0 -0
  258. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/pricing_utils.py +0 -0
  259. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/process_utils.py +0 -0
  260. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/response_utils.py +0 -0
  261. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/save_utils.py +0 -0
  262. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/serve_utils.py +0 -0
  263. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/thread_utils.py +0 -0
  264. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/threaded_sandbox_client.py +0 -0
  265. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/tool_utils.py +0 -0
  266. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/usage_utils.py +0 -0
  267. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/utils/version_utils.py +0 -0
  268. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/__init__.py +0 -0
  269. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/acp/__init__.py +0 -0
  270. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/acp/_runner.py +0 -0
  271. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/cli/__init__.py +0 -0
  272. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  273. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/cli/dashboard/base.py +0 -0
  274. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/cli/dashboard/eval.py +0 -0
  275. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/cli/dashboard/replay.py +0 -0
  276. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/cli/dashboard/validate.py +0 -0
  277. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/cli/debug.py +0 -0
  278. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/cli/eval/__init__.py +0 -0
  279. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/cli/eval/main.py +0 -0
  280. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/cli/eval/resume.py +0 -0
  281. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/cli/eval/runner.py +0 -0
  282. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/cli/gepa.py +0 -0
  283. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/cli/init.py +0 -0
  284. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/cli/output.py +0 -0
  285. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/cli/replay.py +0 -0
  286. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/cli/resolve.py +0 -0
  287. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/cli/serve.py +0 -0
  288. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/cli/validate.py +0 -0
  289. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/clients/__init__.py +0 -0
  290. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/clients/client.py +0 -0
  291. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/clients/config.py +0 -0
  292. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/clients/eval.py +0 -0
  293. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/clients/train.py +0 -0
  294. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/configs/__init__.py +0 -0
  295. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/configs/debug.py +0 -0
  296. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/configs/env.py +0 -0
  297. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/configs/eval.py +0 -0
  298. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/configs/init.py +0 -0
  299. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/configs/replay.py +0 -0
  300. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/configs/serve.py +0 -0
  301. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/configs/validate.py +0 -0
  302. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/decorators.py +0 -0
  303. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/dialects/__init__.py +0 -0
  304. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/dialects/anthropic.py +0 -0
  305. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/dialects/base.py +0 -0
  306. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/dialects/chat.py +0 -0
  307. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/dialects/responses.py +0 -0
  308. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/env.py +0 -0
  309. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/envs/__init__.py +0 -0
  310. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
  311. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/envs/agentic_judge/env.py +0 -0
  312. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  313. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/envs/best_of_n/env.py +0 -0
  314. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  315. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/envs/single_agent/env.py +0 -0
  316. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/envs/user_sim/__init__.py +0 -0
  317. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/envs/user_sim/env.py +0 -0
  318. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/episode.py +0 -0
  319. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/errors.py +0 -0
  320. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/gepa/__init__.py +0 -0
  321. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/gepa/adapter.py +0 -0
  322. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/gepa/config.py +0 -0
  323. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/gepa/dataset.py +0 -0
  324. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/gepa/reflection.py +0 -0
  325. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/gepa/runner.py +0 -0
  326. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/graph.py +0 -0
  327. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harness.py +0 -0
  328. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/__init__.py +0 -0
  329. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  330. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/bash/harness.py +0 -0
  331. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/bash/program.py +0 -0
  332. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  333. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
  334. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  335. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/codex/harness.py +0 -0
  336. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  337. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  338. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  339. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  340. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  341. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/null/__init__.py +0 -0
  342. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/null/harness.py +0 -0
  343. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/null/program.py +0 -0
  344. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  345. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/pi/harness.py +0 -0
  346. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/pool/__init__.py +0 -0
  347. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/pool/harness.py +0 -0
  348. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  349. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  350. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  351. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  352. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  353. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/interception/__init__.py +0 -0
  354. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/interception/base.py +0 -0
  355. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/interception/pool.py +0 -0
  356. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/interception/server.py +0 -0
  357. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  358. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/interception/tunnel/base.py +0 -0
  359. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/interception/tunnel/custom.py +0 -0
  360. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/interception/tunnel/prime.py +0 -0
  361. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/judge.py +0 -0
  362. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/judges/__init__.py +0 -0
  363. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/judges/reference.py +0 -0
  364. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/judges/reference.txt +0 -0
  365. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/judges/rubric.py +0 -0
  366. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/judges/rubric.txt +0 -0
  367. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/legacy.py +0 -0
  368. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/loaders.py +0 -0
  369. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/mcp/__init__.py +0 -0
  370. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/mcp/server.py +0 -0
  371. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/mcp/toolset.py +0 -0
  372. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/retries.py +0 -0
  373. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/rollout.py +0 -0
  374. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/runtimes/docker/egress.py +0 -0
  375. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/runtimes/limiters.py +0 -0
  376. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/runtimes/modal.py +0 -0
  377. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/runtimes/subprocess.py +0 -0
  378. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/scoring.py +0 -0
  379. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/serve/__init__.py +0 -0
  380. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/serve/client.py +0 -0
  381. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/serve/pool.py +0 -0
  382. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/serve/server.py +0 -0
  383. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/serve/types.py +0 -0
  384. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/session.py +0 -0
  385. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/state.py +0 -0
  386. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/taskset.py +0 -0
  387. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/tasksets/__init__.py +0 -0
  388. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  389. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  390. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  391. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  392. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  393. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  394. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  395. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  396. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  397. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/trace.py +0 -0
  398. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/types.py +0 -0
  399. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/utils/__init__.py +0 -0
  400. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/utils/aio.py +0 -0
  401. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/utils/format.py +0 -0
  402. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/utils/generic.py +0 -0
  403. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/utils/git.py +0 -0
  404. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/utils/image.py +0 -0
  405. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/utils/install.py +0 -0
  406. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/utils/interrupt.py +0 -0
  407. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/utils/logging.py +0 -0
  408. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/utils/memory.py +0 -0
  409. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/verifiers/v1/utils/sampling.py +0 -0
  410. {verifiers-0.2.2.dev22 → verifiers-0.2.2.dev24}/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.dev22
3
+ Version: 0.2.2.dev24
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
@@ -35,7 +35,7 @@ Requires-Dist: numpy>=2.1.0
35
35
  Requires-Dist: openai-agents>=0.8.2
36
36
  Requires-Dist: openai>=2.9.0
37
37
  Requires-Dist: prime-pydantic-config[toml]>=0.4.2
38
- Requires-Dist: prime-sandboxes>=0.2.31
38
+ Requires-Dist: prime-sandboxes>=0.2.33
39
39
  Requires-Dist: prime-tunnel>=0.1.8
40
40
  Requires-Dist: pydantic>=2.12.3
41
41
  Requires-Dist: pyzmq>=27.1.0
@@ -35,7 +35,7 @@ dependencies = [
35
35
  "openai>=2.9.0",
36
36
  "openai-agents>=0.8.2",
37
37
  "prime-tunnel>=0.1.8",
38
- "prime-sandboxes>=0.2.31",
38
+ "prime-sandboxes>=0.2.33",
39
39
  "pydantic>=2.12.3",
40
40
  "requests",
41
41
  "rich>=11.0.0",
@@ -15,6 +15,7 @@ build-backend = "hatchling.build"
15
15
  [tool.hatch.build]
16
16
  include = [
17
17
  "counter_tool_v1.py",
18
+ "echo_acp_resume_v1.py",
18
19
  "echo_tool_v1.py",
19
20
  "tool_response_image_v1.py",
20
21
  "pyproject.toml",
@@ -30,7 +30,7 @@ from verifiers.v1.mcp import SharedToolServer
30
30
  from verifiers.v1.retries import RetryConfig, backoff, trace_should_retry
31
31
  from verifiers.v1.rollout import RolloutRun, _as_messages
32
32
  from verifiers.v1.runtimes import (
33
- DockerConfig,
33
+ NetworkPolicyConfig,
34
34
  Runtime,
35
35
  RuntimeConfig,
36
36
  SubprocessConfig,
@@ -114,20 +114,26 @@ def _check_borrowed_placement(
114
114
  be honored. Reject requirements that cannot be applied to the running box; an
115
115
  image mismatch on a container only warns, since sharing its world is the point."""
116
116
  task_policy = "*" not in task.data.network_allow or bool(task.data.network_block)
117
- base_docker = base_config if isinstance(base_config, DockerConfig) else None
118
- if task_policy or (base_docker is not None and base_docker.network_isolated):
117
+ base_policy = base_config if isinstance(base_config, NetworkPolicyConfig) else None
118
+ if task_policy or (base_policy is not None and base_policy.network_restricted):
119
119
  config = runtime.config
120
- if not isinstance(config, DockerConfig):
120
+ if not isinstance(config, NetworkPolicyConfig):
121
121
  raise ValueError(
122
- f"task {task.data.idx!r} requires a Docker URL network policy, but "
123
- f"borrowed runtime {runtime.name!r} is not Docker-backed; use "
122
+ f"task {task.data.idx!r} requires a framework-aware network policy, "
123
+ f"but borrowed runtime {runtime.name!r} does not support one; use "
124
124
  "agent.provision(task)"
125
125
  )
126
- policy_base = (
127
- base_docker if base_docker is not None else DockerConfig(allow=["*"])
126
+ if base_policy is not None and type(config) is not type(base_policy):
127
+ raise ValueError(
128
+ f"the configured {base_policy.type} network policy cannot be applied "
129
+ f"to borrowed {config.type} runtime {runtime.name!r}; use "
130
+ "agent.provision(task)"
131
+ )
132
+ policy_base = base_policy or config.model_copy(
133
+ update={"allow": ["*"], "block": []}
128
134
  )
129
135
  expected = resolve_runtime_config(policy_base, task)
130
- assert isinstance(expected, DockerConfig)
136
+ assert isinstance(expected, NetworkPolicyConfig)
131
137
  # Do not inherit extra destinations from a box provisioned for another task.
132
138
  if set(config.allow) != set(expected.allow) or set(config.block) != set(
133
139
  expected.block
@@ -20,7 +20,7 @@ from verifiers.v1.errors import ToolsetError
20
20
  from verifiers.v1.interception.tunnel import PrimeTunnel
21
21
  from verifiers.v1.mcp.server import STATE_SECRET_PARAM, STATE_URL_PARAM, ServerBase
22
22
  from verifiers.v1.runtimes import (
23
- DockerConfig,
23
+ NetworkPolicyConfig,
24
24
  Runtime,
25
25
  make_runtime,
26
26
  runtime_is_local,
@@ -253,17 +253,17 @@ async def serve(
253
253
  colocated = getattr(cfg, "colocated", False)
254
254
  async with contextlib.AsyncExitStack() as stack:
255
255
  # Colocated servers inherit the harness cut. A separately provisioned filtered
256
- # Docker server has neither that lifecycle nor a published port after isolation;
256
+ # server has neither that lifecycle nor a published port after isolation;
257
257
  # reject it instead of silently leaving its requested policy unenforced.
258
258
  if (
259
- isinstance(cfg.runtime, DockerConfig)
260
- and cfg.runtime.network_isolated
259
+ isinstance(cfg.runtime, NetworkPolicyConfig)
260
+ and cfg.runtime.network_restricted
261
261
  and not (colocated and harness_runtime is not None)
262
262
  ):
263
263
  raise ToolsetError(
264
- "Docker network policies are supported on the harness runtime; "
264
+ "Runtime network policies are supported on the harness runtime; "
265
265
  f"server {server.server_name!r} must be colocated or use an "
266
- "unrestricted Docker runtime"
266
+ "unrestricted runtime"
267
267
  )
268
268
  if colocated and harness_runtime is not None:
269
269
  runtime = harness_runtime
@@ -303,7 +303,7 @@ async def serve(
303
303
  runtime, port, colocated=colocated, consumer_is_local=consumer_is_local
304
304
  )
305
305
  )
306
- if colocated and harness_runtime is not None and runtime.network_isolated:
306
+ if colocated and harness_runtime is not None and runtime.network_restricted:
307
307
  base = base.replace("127.0.0.1", "localhost", 1)
308
308
  elif not colocated and harness_runtime is not None:
309
309
  base = harness_runtime.host_url(base)
@@ -6,6 +6,7 @@ contract as `prime eval push`, done inline at the end of a run. Auth + base URL
6
6
  come from `$PRIME_API_KEY` / `~/.prime/config.json`.
7
7
  """
8
8
 
9
+ import json
9
10
  import logging
10
11
  import os
11
12
  from dataclasses import dataclass
@@ -22,6 +23,8 @@ logger = logging.getLogger(__name__)
22
23
 
23
24
  DEFAULT_API_URL = "https://api.primeintellect.ai"
24
25
  DEFAULT_FRONTEND_URL = "https://app.primeintellect.ai"
26
+ # Repeated /samples posts append; match the Prime Evals client's request ceiling.
27
+ _MAX_SAMPLES_PAYLOAD_BYTES = 25 * 1024 * 1024
25
28
 
26
29
 
27
30
  @dataclass
@@ -200,6 +203,36 @@ def push_traces(
200
203
  # The run is done and its results saved; a network blip here must not crash it
201
204
  # — log and skip the upload instead.
202
205
  try:
206
+ batches: list[list[dict[str, Any]]] = []
207
+ batch: list[dict[str, Any]] = []
208
+ payload_bytes = len(b'{"samples":[]}')
209
+ for i, sample in enumerate(samples):
210
+ sample_bytes = len(
211
+ json.dumps(
212
+ sample,
213
+ ensure_ascii=False,
214
+ separators=(",", ":"),
215
+ allow_nan=False,
216
+ ).encode("utf-8")
217
+ )
218
+ sample_payload_bytes = len(b'{"samples":[]}') + sample_bytes
219
+ if sample_payload_bytes > _MAX_SAMPLES_PAYLOAD_BYTES:
220
+ raise ValueError(
221
+ f"sample {i} is too large to upload "
222
+ f"({sample_payload_bytes} > "
223
+ f"{_MAX_SAMPLES_PAYLOAD_BYTES} bytes)"
224
+ )
225
+ next_payload_bytes = payload_bytes + (1 if batch else 0) + sample_bytes
226
+ if batch and next_payload_bytes > _MAX_SAMPLES_PAYLOAD_BYTES:
227
+ batches.append(batch)
228
+ batch = []
229
+ payload_bytes = len(b'{"samples":[]}')
230
+ next_payload_bytes = payload_bytes + sample_bytes
231
+ batch.append(sample)
232
+ payload_bytes = next_payload_bytes
233
+ if batch or not samples:
234
+ batches.append(batch)
235
+
203
236
  with httpx.Client(headers=headers, timeout=300.0) as client:
204
237
 
205
238
  def post(path: str, body: dict) -> dict:
@@ -224,7 +257,18 @@ def push_traces(
224
257
  **team,
225
258
  },
226
259
  )["evaluation_id"]
227
- post(f"/evaluations/{eval_id}/samples", {"samples": samples})
260
+ for batch in batches:
261
+ body = json.dumps(
262
+ {"samples": batch},
263
+ ensure_ascii=False,
264
+ separators=(",", ":"),
265
+ allow_nan=False,
266
+ ).encode("utf-8")
267
+ resp = client.post(
268
+ f"{api}/evaluations/{eval_id}/samples",
269
+ content=body,
270
+ )
271
+ resp.raise_for_status()
228
272
  post(f"/evaluations/{eval_id}/finalize", {"metrics": metrics})
229
273
  except Exception as e:
230
274
  logger.warning("--push: upload failed (%s: %s); skipping", type(e).__name__, e)
@@ -4,6 +4,7 @@ from pydantic import Field
4
4
 
5
5
  from verifiers.v1.runtimes.base import (
6
6
  BaseRuntimeInfo,
7
+ NetworkPolicyConfig,
7
8
  ProgramResult,
8
9
  Runtime,
9
10
  register,
@@ -56,6 +57,7 @@ __all__ = [
56
57
  "RuntimeConfig",
57
58
  "RuntimeInfo",
58
59
  "BaseRuntimeInfo",
60
+ "NetworkPolicyConfig",
59
61
  "make_runtime",
60
62
  "runtime_is_local",
61
63
  "SubprocessConfig",
@@ -11,10 +11,11 @@ import weakref
11
11
  from abc import ABC, abstractmethod
12
12
  from dataclasses import dataclass
13
13
  from pathlib import PurePosixPath
14
- from typing import ClassVar
14
+ from typing import ClassVar, Self
15
15
 
16
16
  from pydantic_config import BaseConfig
17
17
 
18
+ from verifiers.v1.errors import SandboxError
18
19
  from verifiers.v1.utils.aio import run_shielded
19
20
 
20
21
  logger = logging.getLogger(__name__)
@@ -94,6 +95,33 @@ def cleanup_at_exit() -> None:
94
95
  runtime.cleanup()
95
96
 
96
97
 
98
+ class NetworkPolicyConfig(BaseConfig):
99
+ """Shared execution-time policy surface for runtimes that support it."""
100
+
101
+ allow: list[str] = ["*"]
102
+ """Destinations allowed during execution; `*` leaves egress unrestricted."""
103
+ block: list[str] = []
104
+ """Destinations denied during execution."""
105
+
106
+ @property
107
+ def network_restricted(self) -> bool:
108
+ return "*" not in self.allow or bool(self.block)
109
+
110
+ def with_task_network_policy(self, allow: list[str], block: list[str]) -> Self:
111
+ if "*" not in allow:
112
+ allow = (
113
+ allow
114
+ if "*" in self.allow
115
+ else list(dict.fromkeys([*allow, *self.allow]))
116
+ )
117
+ else:
118
+ allow = self.allow
119
+ block = list(dict.fromkeys([*block, *self.block]))
120
+ return type(self).model_validate(
121
+ {**self.model_dump(), "allow": allow, "block": block}
122
+ )
123
+
124
+
97
125
  class BaseRuntimeInfo(BaseConfig):
98
126
  id: str | None = None
99
127
  borrowed: bool = False
@@ -113,6 +141,7 @@ class Runtime(ABC):
113
141
  self.name = name or f"vf-{uuid.uuid4().hex[:12]}"
114
142
  self._uv_interpreters: dict[str, str] = {}
115
143
  self._uv_script_locks: dict[str, asyncio.Lock] = {}
144
+ self._setup_claimed = False
116
145
  self.stopped = False
117
146
  """Whether teardown has begun (set by `stop`). A stopped runtime is dead: a rollout
118
147
  refuses to borrow one — the owner tore it down, so any use is a lifetime bug in the
@@ -244,15 +273,26 @@ class Runtime(ABC):
244
273
 
245
274
  async def prepare_setup(self) -> None:
246
275
  """Claim the runtime for trusted setup; restricted runtimes may reject reuse."""
276
+ if not self.network_restricted:
277
+ return
278
+ if self._setup_claimed:
279
+ raise SandboxError(
280
+ f"network-filtered {self.type} runtimes are single-rollout; "
281
+ "provision a fresh runtime instead of reusing this one"
282
+ )
283
+ self._setup_claimed = True
247
284
 
248
285
  async def prepare_execution(self, routes: list[str]) -> None:
249
286
  """Last setup step, right before the agent starts. Restricted runtimes enforce
250
287
  their policy here while keeping the interception and MCP `routes` reachable."""
251
288
 
252
289
  @property
253
- def network_isolated(self) -> bool:
290
+ def network_restricted(self) -> bool:
254
291
  """Whether the agent phase uses filtered networking (see `prepare_execution`)."""
255
- return False
292
+ return (
293
+ isinstance(self.config, NetworkPolicyConfig)
294
+ and self.config.network_restricted
295
+ )
256
296
 
257
297
  @property
258
298
  def published_port(self) -> int | None:
@@ -13,11 +13,10 @@ from pathlib import PurePosixPath
13
13
  from typing import Literal
14
14
  from urllib.parse import urlsplit
15
15
 
16
- from pydantic_config import BaseConfig
17
-
18
16
  from verifiers.v1.errors import SandboxError
19
17
  from verifiers.v1.runtimes.base import (
20
18
  BaseRuntimeInfo,
19
+ NetworkPolicyConfig,
21
20
  ProgramResult,
22
21
  Runtime,
23
22
  parse_gpu,
@@ -27,7 +26,7 @@ from verifiers.v1.runtimes.docker.egress import HOST_ALIAS, EgressProxy, Network
27
26
  logger = logging.getLogger(__name__)
28
27
 
29
28
 
30
- class DockerConfig(BaseConfig):
29
+ class DockerConfig(NetworkPolicyConfig):
31
30
  type: Literal["docker"] = "docker"
32
31
  image: str = "python:3.11-slim"
33
32
  workdir: str = "/app"
@@ -42,17 +41,6 @@ class DockerConfig(BaseConfig):
42
41
  disk: float | None = None
43
42
  """Advisory disk request in GB. Docker has no portable per-container size limit, so
44
43
  this is accepted (so a task can declare it without a warning) but not enforced."""
45
- allow: list[str] = []
46
- """URL origins or host patterns the agent may reach during execution. Framework
47
- routes are always added; an empty list allows only those routes and `*` allows all."""
48
- block: list[str] = []
49
- """URL origins or host patterns denied during execution. Block rules win over
50
- `allow`; framework interception and MCP routes always remain reachable."""
51
-
52
- @property
53
- def network_isolated(self) -> bool:
54
- """True unless a bare wildcard permits every destination without exceptions."""
55
- return "*" not in self.allow or bool(self.block)
56
44
 
57
45
 
58
46
  class DockerRuntimeInfo(DockerConfig, BaseRuntimeInfo):
@@ -96,7 +84,6 @@ class DockerRuntime(Runtime):
96
84
  self._proxy: EgressProxy | None = None
97
85
  self._proxy_host_ip: str | None = None
98
86
  self._stopped = False
99
- self._setup_claimed = False
100
87
  self._cut = False
101
88
 
102
89
  async def start(self) -> None:
@@ -127,8 +114,8 @@ class DockerRuntime(Runtime):
127
114
  _, gpu_count = parse_gpu(self.config.gpu)
128
115
  if gpu_count:
129
116
  limits += ["--gpus", str(gpu_count)]
130
- isolated = self.network_isolated
131
- if isolated:
117
+ restricted = self.network_restricted
118
+ if restricted:
132
119
  network = [
133
120
  "--network",
134
121
  "bridge",
@@ -164,7 +151,7 @@ class DockerRuntime(Runtime):
164
151
  self.info.id = run.stdout.strip()[
165
152
  :12
166
153
  ] # `docker run -d` prints the container id
167
- if isolated:
154
+ if restricted:
168
155
  # Setup is trusted; colocated servers fetch their task from host interception
169
156
  # before the final framework routes are known.
170
157
  self._proxy = EgressProxy(
@@ -236,33 +223,19 @@ class DockerRuntime(Runtime):
236
223
  host = urlsplit(url).hostname
237
224
  # Keep numeric loopback container-local; the proxy maps this reserved name to
238
225
  # the Verifiers process's loopback for interception and host-local MCP routes.
239
- if self.network_isolated and host in ("127.0.0.1", "localhost"):
226
+ if self.network_restricted and host in ("127.0.0.1", "localhost"):
240
227
  return url.replace(host, HOST_ALIAS, 1)
241
228
  if (
242
- not self.network_isolated
229
+ not self.network_restricted
243
230
  and sys.platform != "linux"
244
231
  and host in ("127.0.0.1", "localhost")
245
232
  ):
246
233
  return url.replace(host, "host.docker.internal", 1)
247
234
  return url
248
235
 
249
- @property
250
- def network_isolated(self) -> bool:
251
- return self.config.network_isolated
252
-
253
- async def prepare_setup(self) -> None:
254
- if not self.network_isolated:
255
- return
256
- if self._setup_claimed:
257
- raise SandboxError(
258
- "network-filtered Docker runtimes are single-rollout; provision a "
259
- "fresh runtime instead of reusing this one"
260
- )
261
- self._setup_claimed = True
262
-
263
236
  async def prepare_execution(self, routes: list[str]) -> None:
264
237
  """Allow the declared framework routes, then leave the proxy as the only route."""
265
- if not self.network_isolated:
238
+ if not self.network_restricted:
266
239
  return
267
240
  assert self._proxy is not None
268
241
  framework = [
@@ -14,14 +14,15 @@ import shlex
14
14
  import tempfile
15
15
  from pathlib import Path, PurePosixPath
16
16
  from typing import ClassVar, Literal
17
+ from urllib.parse import urlsplit
17
18
 
18
19
  from pydantic import model_validator
19
- from pydantic_config import BaseConfig
20
20
 
21
21
  from verifiers.v1.errors import SandboxError
22
22
  from verifiers.v1.runtimes.base import (
23
23
  SERVICE_PORT,
24
24
  BaseRuntimeInfo,
25
+ NetworkPolicyConfig,
25
26
  ProgramResult,
26
27
  Runtime,
27
28
  parse_gpu,
@@ -34,7 +35,7 @@ MAX_LIFETIME = 24 * 60 * 60
34
35
  """Prime's fixed cap (seconds) on any sandbox's total lifetime."""
35
36
 
36
37
 
37
- class PrimeConfig(BaseConfig):
38
+ class PrimeConfig(NetworkPolicyConfig):
38
39
  type: Literal["prime"] = "prime"
39
40
  image: str = "python:3.11-slim"
40
41
  """Docker image to run. Any pullable ref works: on the first use of an image, the
@@ -42,7 +43,6 @@ class PrimeConfig(BaseConfig):
42
43
  ~10 minutes) and caches the result, so later sandboxes on the same ref start in
43
44
  seconds."""
44
45
  workdir: str = "/app"
45
- network_access: bool = True
46
46
  vm: bool = False
47
47
  """Run as a micro-VM rather than a container (kernel features / stronger isolation)."""
48
48
  guaranteed: bool = False
@@ -67,6 +67,22 @@ class PrimeConfig(BaseConfig):
67
67
  env-server worker process (None/<= 0 disables it). (Tunnel creation is limited separately
68
68
  and globally — see interception.tunnel.prime.TUNNEL_LIMITER.)"""
69
69
 
70
+ @model_validator(mode="after")
71
+ def _validate_egress(self) -> "PrimeConfig":
72
+ if not self.network_restricted:
73
+ return self
74
+ if not self.vm:
75
+ raise ValueError(
76
+ "Prime allow/block egress lists require a VM sandbox (vm=true)"
77
+ )
78
+ from prime_sandboxes.models import validate_egress_lists
79
+
80
+ allow = None if self.allow == ["*"] else self.allow
81
+ block = self.block or None
82
+ if allow is not None or block != ["*"]:
83
+ validate_egress_lists(allow, block)
84
+ return self
85
+
70
86
  @model_validator(mode="after")
71
87
  def _validate_idle_timeout(self) -> "PrimeConfig":
72
88
  if self.idle_timeout is not None and self.idle_timeout > MAX_LIFETIME:
@@ -133,7 +149,6 @@ class PrimeRuntime(Runtime):
133
149
  name=self.name,
134
150
  labels=self.config.labels,
135
151
  docker_image=self.config.image,
136
- network_access=self.config.network_access,
137
152
  vm=self.config.vm,
138
153
  guaranteed=self.config.guaranteed,
139
154
  **{k: v for k, v in options.items() if v is not None},
@@ -165,6 +180,44 @@ class PrimeRuntime(Runtime):
165
180
  ) as e: # provisioning failure is one rollout's problem, not the eval's
166
181
  raise SandboxError(f"prime sandbox provisioning failed: {e}") from e
167
182
 
183
+ async def prepare_execution(self, routes: list[str]) -> None:
184
+ """Apply the host policy after setup and wait until the platform enforces it."""
185
+ if not self.network_restricted:
186
+ return
187
+ try:
188
+ if self.config.allow == ["*"]:
189
+ policy = {"deny": self.config.block}
190
+ else:
191
+ hosts = [h for h in (urlsplit(route).hostname for route in routes) if h]
192
+ entries = list(dict.fromkeys([*hosts, *self.config.allow]))
193
+ from prime_sandboxes.models import validate_egress_lists
194
+
195
+ validate_egress_lists(entries, None)
196
+ policy = {"allow": entries} if entries else {"deny": ["*"]}
197
+ status = await self._client.set_network(self.info.id, **policy)
198
+ try:
199
+ async with asyncio.timeout(60):
200
+ delay = 0.1
201
+ while not status.applied:
202
+ await asyncio.sleep(delay)
203
+ delay = min(delay * 2, 3)
204
+ status = await self._client.get_network(self.info.id)
205
+ except TimeoutError as e:
206
+ raise SandboxError(
207
+ "prime egress policy was not applied within 60s on sandbox "
208
+ f"{self.info.id}; refusing to start the agent unrestricted"
209
+ ) from e
210
+ except SandboxError:
211
+ raise
212
+ except Exception as e:
213
+ raise SandboxError(f"prime egress policy failed: {e}") from e
214
+ logger.info(
215
+ "prime: egress policy applied on sandbox %s (allow=%s block=%s)",
216
+ self.info.id,
217
+ self.config.allow,
218
+ self.config.block,
219
+ )
220
+
168
221
  async def run(self, argv: list[str], env: dict[str, str]) -> ProgramResult:
169
222
  try:
170
223
  # Poll directly so the rollout stage owns the execution timeout; the SDK helper
@@ -140,11 +140,11 @@ class TaskData(StrictBaseModel):
140
140
  workdir: str | None = None
141
141
  network_allow: list[str] = ["*"]
142
142
  """Execution-time destinations requested by this task. `*` leaves the runtime
143
- allowlist unchanged; a concrete list replaces a wildcard or combines with
144
- existing entries."""
143
+ allowlist unchanged; a concrete list replaces a wildcard or combines with existing
144
+ entries. Prime runtimes accept host-level entries and require `vm=true`."""
145
145
  network_block: list[str] = []
146
146
  """Execution-time destinations denied by this task and combined with runtime
147
- blocks."""
147
+ blocks. Prime runtimes cannot combine an allowlist and a blocklist."""
148
148
  timeout: TaskTimeout = TaskTimeout()
149
149
  resources: TaskResources = TaskResources()
150
150
 
@@ -7,7 +7,7 @@ from collections.abc import Collection
7
7
 
8
8
  from verifiers.v1.harness import Harness
9
9
  from verifiers.v1.runtimes import (
10
- DockerConfig,
10
+ NetworkPolicyConfig,
11
11
  RuntimeConfig,
12
12
  SubprocessConfig,
13
13
  runtime_is_local,
@@ -45,19 +45,13 @@ def resolve_runtime_config(
45
45
  task.data.network_block
46
46
  )
47
47
  if task_network_policy:
48
- if not isinstance(config, DockerConfig):
48
+ if not isinstance(config, NetworkPolicyConfig):
49
49
  raise ValueError(
50
- f"task {task.data.idx!r} requires a URL network policy, but the "
51
- f"{config.type} runtime does not support framework-aware URL policies"
50
+ f"task {task.data.idx!r} requires a network policy, but the "
51
+ f"{config.type} runtime does not support framework-aware policies"
52
52
  )
53
- if "*" not in task.data.network_allow:
54
- updates["allow"] = (
55
- task.data.network_allow
56
- if "*" in config.allow
57
- else list(dict.fromkeys([*task.data.network_allow, *config.allow]))
58
- )
59
- updates["block"] = list(
60
- dict.fromkeys([*task.data.network_block, *config.block])
53
+ config = config.with_task_network_policy(
54
+ task.data.network_allow, task.data.network_block
61
55
  )
62
56
  for resource, value in task.data.resources.model_dump(exclude_none=True).items():
63
57
  spec = type(config).model_fields.get(resource)
File without changes