verifiers 0.4.1.dev3__tar.gz → 0.4.1.dev4__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 (265) hide show
  1. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/PKG-INFO +29 -1
  2. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/README.md +28 -0
  3. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/pyproject.toml +22 -43
  4. {verifiers-0.4.1.dev3/tests/v1 → verifiers-0.4.1.dev4/tests/integration}/conftest.py +54 -138
  5. {verifiers-0.4.1.dev3/tests/v1 → verifiers-0.4.1.dev4/tests/integration}/fixtures/agent_user_harness_v1.py +1 -1
  6. {verifiers-0.4.1.dev3/tests/v1 → verifiers-0.4.1.dev4/tests/integration}/fixtures/duet_v1.py +1 -1
  7. {verifiers-0.4.1.dev3/tests/v1 → verifiers-0.4.1.dev4/tests/integration}/fixtures/echo_agentic_v1.py +1 -1
  8. {verifiers-0.4.1.dev3/tests/v1 → verifiers-0.4.1.dev4/tests/integration}/fixtures/echo_tool_v1.py +1 -1
  9. {verifiers-0.4.1.dev3/tests/v1 → verifiers-0.4.1.dev4/tests/integration}/fixtures/echo_user_sim_v1.py +13 -9
  10. {verifiers-0.4.1.dev3/tests/v1 → verifiers-0.4.1.dev4/tests/integration}/fixtures/echo_v1.py +2 -5
  11. verifiers-0.4.1.dev4/tests/integration/fixtures/network_policy_v1.py +88 -0
  12. {verifiers-0.4.1.dev3/tests/v1 → verifiers-0.4.1.dev4/tests/integration}/fixtures/pyproject.toml +1 -1
  13. verifiers-0.4.1.dev4/tests/integration/fixtures/skill_codeword_v1.py +39 -0
  14. verifiers-0.4.1.dev4/tests/integration/fixtures/skills/project-codeword/SKILL.md +8 -0
  15. verifiers-0.4.1.dev4/tests/integration/grid.py +235 -0
  16. verifiers-0.4.1.dev4/tests/integration/test_agent_user.py +56 -0
  17. verifiers-0.4.1.dev4/tests/integration/test_agentic_judge.py +90 -0
  18. verifiers-0.4.1.dev3/tests/v1/test_envs.py → verifiers-0.4.1.dev4/tests/integration/test_examples.py +23 -17
  19. verifiers-0.4.1.dev4/tests/integration/test_limits.py +54 -0
  20. verifiers-0.4.1.dev4/tests/integration/test_multi_agent.py +79 -0
  21. verifiers-0.4.1.dev4/tests/integration/test_multi_turn.py +30 -0
  22. verifiers-0.4.1.dev4/tests/integration/test_multi_turn_tool.py +51 -0
  23. verifiers-0.4.1.dev4/tests/integration/test_multimodal_tool.py +17 -0
  24. verifiers-0.4.1.dev4/tests/integration/test_network_policy.py +28 -0
  25. verifiers-0.4.1.dev4/tests/integration/test_resume_tool.py +65 -0
  26. verifiers-0.4.1.dev4/tests/integration/test_rubric_judge.py +27 -0
  27. verifiers-0.4.1.dev4/tests/integration/test_shared_tool.py +29 -0
  28. verifiers-0.4.1.dev4/tests/integration/test_single_turn.py +41 -0
  29. verifiers-0.4.1.dev4/tests/integration/test_skills.py +30 -0
  30. verifiers-0.4.1.dev4/tests/integration/test_stateful_tool.py +25 -0
  31. verifiers-0.4.1.dev4/tests/integration/test_user_echo.py +69 -0
  32. verifiers-0.4.1.dev4/tests/integration/test_user_sim.py +64 -0
  33. verifiers-0.4.1.dev4/tests/unit/cli/test_replay.py +97 -0
  34. verifiers-0.4.1.dev4/tests/unit/configs/test_eval.py +17 -0
  35. verifiers-0.4.1.dev4/tests/unit/conftest.py +94 -0
  36. verifiers-0.4.1.dev4/tests/unit/harnesses/test_core.py +110 -0
  37. verifiers-0.4.1.dev4/tests/unit/harnesses/test_rlm.py +45 -0
  38. verifiers-0.4.1.dev3/tests/v1/test_tunnel_watchdog.py → verifiers-0.4.1.dev4/tests/unit/interception/test_tunnel.py +0 -2
  39. verifiers-0.4.1.dev4/tests/unit/judges/conftest.py +65 -0
  40. verifiers-0.4.1.dev4/tests/unit/judges/test_judge.py +243 -0
  41. verifiers-0.4.1.dev4/tests/unit/judges/test_reference.py +163 -0
  42. verifiers-0.4.1.dev4/tests/unit/judges/test_rubric.py +169 -0
  43. verifiers-0.4.1.dev3/tests/v1/test_configs.py → verifiers-0.4.1.dev4/tests/unit/runtimes/test_e2b.py +1 -17
  44. verifiers-0.4.1.dev4/tests/unit/serve/test_client.py +34 -0
  45. verifiers-0.4.1.dev4/tests/unit/serve/test_pool.py +28 -0
  46. verifiers-0.4.1.dev4/tests/unit/test_agent.py +67 -0
  47. verifiers-0.4.1.dev3/tests/v1/test_trace.py → verifiers-0.4.1.dev4/tests/unit/test_semantic.py +2 -326
  48. verifiers-0.4.1.dev3/tests/v1/test_scoring.py → verifiers-0.4.1.dev4/tests/unit/test_task.py +2 -62
  49. verifiers-0.4.1.dev4/tests/unit/test_trace.py +243 -0
  50. verifiers-0.4.1.dev4/tests/unit/utils/test_compile.py +50 -0
  51. verifiers-0.4.1.dev4/tests/unit/utils/test_loaders.py +64 -0
  52. verifiers-0.4.1.dev4/tests/unit/utils/test_score.py +65 -0
  53. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/runtimes/base.py +3 -0
  54. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/runtimes/prime.py +1 -0
  55. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/utils/loaders.py +13 -3
  56. verifiers-0.4.1.dev3/tests/v1/fixtures/delivery_behaviors.py +0 -196
  57. verifiers-0.4.1.dev3/tests/v1/test_color_codeword_tasks.py +0 -16
  58. verifiers-0.4.1.dev3/tests/v1/test_delivery_behaviors.py +0 -288
  59. verifiers-0.4.1.dev3/tests/v1/test_e2e.py +0 -1031
  60. verifiers-0.4.1.dev3/tests/v1/test_judges.py +0 -720
  61. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/.gitignore +0 -0
  62. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/LICENSE +0 -0
  63. {verifiers-0.4.1.dev3/tests/v1 → verifiers-0.4.1.dev4/tests/integration}/fixtures/agent_user_v1.py +0 -0
  64. {verifiers-0.4.1.dev3/tests/v1 → verifiers-0.4.1.dev4/tests/integration}/fixtures/counter_tool_v1.py +0 -0
  65. {verifiers-0.4.1.dev3/tests/v1 → verifiers-0.4.1.dev4/tests/integration}/fixtures/echo_acp_resume_v1.py +0 -0
  66. {verifiers-0.4.1.dev3/tests/v1 → verifiers-0.4.1.dev4/tests/integration}/fixtures/tool_response_image_v1.py +0 -0
  67. /verifiers-0.4.1.dev3/tests/v1/test_serve_delta.py → /verifiers-0.4.1.dev4/tests/unit/serve/test_delta.py +0 -0
  68. {verifiers-0.4.1.dev3/tests/v1 → verifiers-0.4.1.dev4/tests/unit}/test_graph.py +0 -0
  69. {verifiers-0.4.1.dev3/tests/v1 → verifiers-0.4.1.dev4/tests/unit}/test_taskset.py +0 -0
  70. /verifiers-0.4.1.dev3/tests/v1/test_platform_run.py → /verifiers-0.4.1.dev4/tests/unit/utils/test_platform.py +0 -0
  71. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/__init__.py +0 -0
  72. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/__init__.py +0 -0
  73. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/acp/__init__.py +0 -0
  74. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/acp/runner.py +0 -0
  75. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/agent.py +0 -0
  76. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/cli/__init__.py +0 -0
  77. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  78. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/cli/dashboard/base.py +0 -0
  79. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/cli/dashboard/eval.py +0 -0
  80. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/cli/dashboard/replay.py +0 -0
  81. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/cli/dashboard/validate.py +0 -0
  82. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/cli/debug.py +0 -0
  83. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/cli/eval/__init__.py +0 -0
  84. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/cli/eval/hint.py +0 -0
  85. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/cli/eval/main.py +0 -0
  86. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/cli/eval/resume.py +0 -0
  87. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/cli/eval/runner.py +0 -0
  88. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/cli/gepa.py +0 -0
  89. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/cli/init.py +0 -0
  90. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/cli/output.py +0 -0
  91. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/cli/replay.py +0 -0
  92. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/cli/resolve.py +0 -0
  93. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/cli/resume.py +0 -0
  94. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/cli/validate.py +0 -0
  95. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/clients/__init__.py +0 -0
  96. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/clients/base.py +0 -0
  97. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/clients/client.py +0 -0
  98. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/clients/eval.py +0 -0
  99. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/clients/train.py +0 -0
  100. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/configs/__init__.py +0 -0
  101. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/configs/agent.py +0 -0
  102. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/configs/cli/__init__.py +0 -0
  103. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/configs/cli/debug.py +0 -0
  104. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/configs/cli/env.py +0 -0
  105. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/configs/cli/eval.py +0 -0
  106. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/configs/cli/init.py +0 -0
  107. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/configs/cli/replay.py +0 -0
  108. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/configs/cli/validate.py +0 -0
  109. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/configs/client.py +0 -0
  110. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/configs/env.py +0 -0
  111. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/configs/harness.py +0 -0
  112. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/configs/judge.py +0 -0
  113. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/configs/retries.py +0 -0
  114. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/configs/runtime.py +0 -0
  115. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/configs/select.py +0 -0
  116. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/configs/serve.py +0 -0
  117. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/configs/task.py +0 -0
  118. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/configs/taskset.py +0 -0
  119. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/dialects/__init__.py +0 -0
  120. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/dialects/anthropic.py +0 -0
  121. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/dialects/base.py +0 -0
  122. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/dialects/chat.py +0 -0
  123. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/dialects/responses.py +0 -0
  124. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/env.py +0 -0
  125. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/envs/__init__.py +0 -0
  126. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
  127. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/envs/agentic_judge/env.py +0 -0
  128. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  129. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/envs/best_of_n/env.py +0 -0
  130. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/envs/isolated_verifier/__init__.py +0 -0
  131. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/envs/isolated_verifier/env.py +0 -0
  132. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/envs/shared_agentic_judge/__init__.py +0 -0
  133. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  134. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/envs/single_agent/env.py +0 -0
  135. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/envs/user_sim/__init__.py +0 -0
  136. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/envs/user_sim/env.py +0 -0
  137. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/episode.py +0 -0
  138. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/errors.py +0 -0
  139. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/gepa/__init__.py +0 -0
  140. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/gepa/adapter.py +0 -0
  141. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/gepa/config.py +0 -0
  142. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/gepa/dataset.py +0 -0
  143. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/gepa/reflection.py +0 -0
  144. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/gepa/runner.py +0 -0
  145. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/graph.py +0 -0
  146. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harness.py +0 -0
  147. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/__init__.py +0 -0
  148. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  149. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/bash/harness.py +0 -0
  150. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
  151. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
  152. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/browser_use/program.py +0 -0
  153. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  154. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
  155. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  156. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/codex/gate.mjs +0 -0
  157. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/codex/harness.py +0 -0
  158. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
  159. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
  160. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
  161. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  162. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  163. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  164. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  165. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  166. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/node.py +0 -0
  167. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/null/__init__.py +0 -0
  168. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/null/harness.py +0 -0
  169. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
  170. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/openclaw/harness.py +0 -0
  171. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  172. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/pi/gate.mjs +0 -0
  173. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/pi/harness.py +0 -0
  174. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/prime_agent/__init__.py +0 -0
  175. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/prime_agent/harness.py +0 -0
  176. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  177. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  178. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  179. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  180. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  181. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/utils/__init__.py +0 -0
  182. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/utils/compaction.py +0 -0
  183. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/utils/core.py +0 -0
  184. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/utils/install.py +0 -0
  185. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/utils/launch.py +0 -0
  186. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/harnesses/utils/mcp.py +0 -0
  187. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/interception/__init__.py +0 -0
  188. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/interception/base.py +0 -0
  189. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/interception/pool.py +0 -0
  190. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/interception/server.py +0 -0
  191. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  192. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/interception/tunnel/base.py +0 -0
  193. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/interception/tunnel/custom.py +0 -0
  194. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/interception/tunnel/prime.py +0 -0
  195. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/judge.py +0 -0
  196. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/judges/__init__.py +0 -0
  197. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/judges/decision.py +0 -0
  198. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/judges/reference.py +0 -0
  199. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/judges/reference.txt +0 -0
  200. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/judges/rubric.py +0 -0
  201. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/judges/rubric.txt +0 -0
  202. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/mcp/__init__.py +0 -0
  203. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/mcp/launch.py +0 -0
  204. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/mcp/server.py +0 -0
  205. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/mcp/toolset.py +0 -0
  206. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/rollout.py +0 -0
  207. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/runtimes/__init__.py +0 -0
  208. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/runtimes/apptainer.py +0 -0
  209. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/runtimes/container.py +0 -0
  210. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/runtimes/docker/__init__.py +0 -0
  211. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/runtimes/docker/egress.py +0 -0
  212. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/runtimes/e2b.py +0 -0
  213. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/runtimes/limiters.py +0 -0
  214. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/runtimes/modal.py +0 -0
  215. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/runtimes/subprocess.py +0 -0
  216. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/semantic.py +0 -0
  217. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/serve/__init__.py +0 -0
  218. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/serve/client.py +0 -0
  219. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/serve/delta.py +0 -0
  220. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/serve/encoding.py +0 -0
  221. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/serve/pool.py +0 -0
  222. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/serve/server.py +0 -0
  223. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/serve/types.py +0 -0
  224. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/session.py +0 -0
  225. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/state.py +0 -0
  226. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/task.py +0 -0
  227. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/taskset.py +0 -0
  228. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/tasksets/__init__.py +0 -0
  229. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  230. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/tasksets/harbor/compose.py +0 -0
  231. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/tasksets/harbor/env.py +0 -0
  232. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  233. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/tasksets/harbor/toolset.py +0 -0
  234. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/tasksets/nemo_gym/__init__.py +0 -0
  235. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/tasksets/nemo_gym/response.py +0 -0
  236. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/tasksets/nemo_gym/server.py +0 -0
  237. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/tasksets/nemo_gym/taskset.py +0 -0
  238. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/tasksets/nemo_gym/toolset.py +0 -0
  239. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  240. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  241. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  242. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  243. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/trace.py +0 -0
  244. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/types.py +0 -0
  245. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/utils/__init__.py +0 -0
  246. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/utils/aio.py +0 -0
  247. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/utils/artifacts.py +0 -0
  248. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/utils/compile.py +0 -0
  249. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/utils/decorators.py +0 -0
  250. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/utils/eval.py +0 -0
  251. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/utils/format.py +0 -0
  252. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/utils/generic.py +0 -0
  253. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/utils/git.py +0 -0
  254. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/utils/image.py +0 -0
  255. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/utils/interrupt.py +0 -0
  256. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/utils/logging.py +0 -0
  257. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/utils/memory.py +0 -0
  258. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/utils/paths.py +0 -0
  259. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/utils/platform.py +0 -0
  260. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/utils/prime.py +0 -0
  261. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/utils/retries.py +0 -0
  262. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/utils/scope.py +0 -0
  263. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/utils/score.py +0 -0
  264. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/utils/trace_store.py +0 -0
  265. {verifiers-0.4.1.dev3 → verifiers-0.4.1.dev4}/verifiers/v1/utils/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: verifiers
3
- Version: 0.4.1.dev3
3
+ Version: 0.4.1.dev4
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
@@ -91,6 +91,34 @@ uv tool install prime
91
91
  - The [docs](docs/) contain short, human-written guides and overviews about the architecture.
92
92
  - The [AGENTS.md](AGENTS.md) and [skills](skills/) are for coding agents and go into more details.
93
93
 
94
+ ## Contributing
95
+
96
+ We welcome community contributions. We use [issues](https://github.com/PrimeIntellect-ai/verifiers/issues) to track bugs and feature requests. If you hit a bug, a pain point, or have an idea for a feature, please open an issue.
97
+
98
+ Contributions are welcome via PR. Please follow these guidelines:
99
+
100
+ 1. Install the [pre-commit hooks](#pre-commit-hooks) so your code is formatted and type-checked.
101
+ 2. Keep your PR in "Draft" until it is ready for review.
102
+ 3. If your PR resolves an issue, link the issue in the PR description.
103
+ 4. Run the [tests](#tests) for the areas you touched.
104
+
105
+ ### Pre-commit hooks
106
+
107
+ ```bash
108
+ uv run pre-commit install
109
+ ```
110
+
111
+ ### Tests
112
+
113
+ Unit tests run one component in isolation, with no network, and mirror the `verifiers/v1` layout. Integration tests run real evals: they need `PRIME_API_KEY` and skip without it.
114
+
115
+ ```bash
116
+ uv run pytest tests/unit -n auto # unit
117
+ uv run pytest tests/integration -n 8 # integration
118
+ uv run pytest tests/integration/test_single_turn.py # one behavior
119
+ uv run pytest tests/integration -m "docker and codex" # one runtime and harness
120
+ ```
121
+
94
122
  ## Citation
95
123
 
96
124
  Originally created by Will Brown ([@willccbb](https://github.com/willccbb)).
@@ -30,6 +30,34 @@ uv tool install prime
30
30
  - The [docs](docs/) contain short, human-written guides and overviews about the architecture.
31
31
  - The [AGENTS.md](AGENTS.md) and [skills](skills/) are for coding agents and go into more details.
32
32
 
33
+ ## Contributing
34
+
35
+ We welcome community contributions. We use [issues](https://github.com/PrimeIntellect-ai/verifiers/issues) to track bugs and feature requests. If you hit a bug, a pain point, or have an idea for a feature, please open an issue.
36
+
37
+ Contributions are welcome via PR. Please follow these guidelines:
38
+
39
+ 1. Install the [pre-commit hooks](#pre-commit-hooks) so your code is formatted and type-checked.
40
+ 2. Keep your PR in "Draft" until it is ready for review.
41
+ 3. If your PR resolves an issue, link the issue in the PR description.
42
+ 4. Run the [tests](#tests) for the areas you touched.
43
+
44
+ ### Pre-commit hooks
45
+
46
+ ```bash
47
+ uv run pre-commit install
48
+ ```
49
+
50
+ ### Tests
51
+
52
+ Unit tests run one component in isolation, with no network, and mirror the `verifiers/v1` layout. Integration tests run real evals: they need `PRIME_API_KEY` and skip without it.
53
+
54
+ ```bash
55
+ uv run pytest tests/unit -n auto # unit
56
+ uv run pytest tests/integration -n 8 # integration
57
+ uv run pytest tests/integration/test_single_turn.py # one behavior
58
+ uv run pytest tests/integration -m "docker and codex" # one runtime and harness
59
+ ```
60
+
33
61
  ## Citation
34
62
 
35
63
  Originally created by Will Brown ([@willccbb](https://github.com/willccbb)).
@@ -61,7 +61,6 @@ dev = [
61
61
  "ty>=0.0.63",
62
62
  "pytest>=7.0.0,<9.1.0",
63
63
  "pytest-asyncio>=0.21.0",
64
- "pytest-cov>=4.0.0",
65
64
  "pytest-xdist>=3.8.0",
66
65
  ]
67
66
  # V1 examples and support packages, resolved from their local sources below.
@@ -213,7 +212,7 @@ known-first-party = ["verifiers"]
213
212
  [tool.pytest.ini_options]
214
213
  minversion = "7.0"
215
214
  testpaths = ["tests"]
216
- pythonpath = ["tests/v1/fixtures"]
215
+ pythonpath = ["tests/integration", "tests/integration/fixtures"]
217
216
  python_files = ["test_*.py"]
218
217
  python_classes = ["Test*"]
219
218
  python_functions = ["test_*"]
@@ -224,27 +223,27 @@ addopts = [
224
223
  "--quiet",
225
224
  ]
226
225
  markers = [
227
- "e2e: marks end-to-end eval-run tests (need a model API key; skipped without one)",
228
- # v1 e2e matrix axes — select subsets with `-m` (see tests/v1/conftest.py). A mark is applied
229
- # per axis, so it matches every case touching that value on any axis.
230
- "subprocess: v1 e2e cases touching the subprocess (host) runtime",
231
- "docker: v1 e2e cases touching the docker runtime",
232
- "podman: v1 e2e cases touching the podman runtime",
233
- "apptainer: v1 e2e cases touching the apptainer runtime",
234
- "prime: v1 e2e cases touching the prime runtime (real sandbox + tunnel; local-only, excluded in CI)",
235
- "modal: v1 e2e cases touching the modal runtime (local-only setup; excluded in CI)",
236
- "e2b: v1 e2e cases touching the e2b runtime (real sandbox; local-only, excluded in CI)",
237
- "colocated: v1 e2e cases with a user/tool server colocated in the harness runtime",
238
- "null: v1 e2e cases on the null harness",
239
- "bash: v1 e2e cases on the bash harness",
240
- "browser_use: v1 e2e cases on the browser_use harness",
241
- "claude_code: v1 e2e cases on the claude-code harness",
242
- "openclaw: v1 e2e cases on the OpenClaw harness",
243
- "hermes_agent: v1 e2e cases on the hermes-agent harness",
244
- "rlm: v1 e2e cases on the rlm harness",
245
- "kimi_code: v1 e2e cases on the kimi-code harness",
246
- "pi: v1 e2e cases on the pi harness",
247
- "codex: v1 e2e cases on the codex harness",
226
+ # Integration grid axes — select subsets with `-m` (see tests/integration/grid.py). A mark
227
+ # is applied per axis, so it matches every cell touching that value on any axis.
228
+ "subprocess: integration cells touching the subprocess (host) runtime",
229
+ "docker: integration cells touching the docker runtime",
230
+ "podman: integration cells touching the podman runtime (needs the engine on the host; local-only)",
231
+ "apptainer: integration cells touching the apptainer runtime (needs the engine on the host; local-only)",
232
+ "prime: integration cells touching the prime runtime (real sandbox + tunnel)",
233
+ "modal: integration cells touching the modal runtime (external sandbox; local-only, excluded in CI)",
234
+ "e2b: integration cells touching the e2b runtime (external sandbox; local-only, excluded in CI)",
235
+ "colocated: integration cells with a tool server colocated in the harness runtime",
236
+ "null: integration cells on the null harness",
237
+ "bash: integration cells on the bash harness",
238
+ "claude_code: integration cells on the claude-code harness",
239
+ "openclaw: integration cells on the OpenClaw harness",
240
+ "hermes_agent: integration cells on the hermes-agent harness",
241
+ "rlm: integration cells on the rlm harness",
242
+ "kimi_code: integration cells on the kimi-code harness",
243
+ "pi: integration cells on the pi harness",
244
+ "codex: integration cells on the codex harness",
245
+ "mini_swe_agent: integration cells on the mini-swe-agent harness",
246
+ "prime_agent: integration cells on the prime-agent harness",
248
247
  "asyncio: marks tests as async tests",
249
248
  ]
250
249
  filterwarnings = [
@@ -268,23 +267,3 @@ redundant-cast = "ignore"
268
267
  # verifiers/v1 is vendored (heavily typed upstream for a different checker); it is not part
269
268
  # of verifiers' ty gate. environments/ are user-authored envs, also out of scope.
270
269
  exclude = ["environments", "verifiers/v1"]
271
-
272
-
273
- [tool.coverage.run]
274
- source = ["verifiers"]
275
- omit = [
276
- "*/tests/*",
277
- "*/__pycache__/*",
278
- "*/site-packages/*",
279
- ]
280
-
281
- [tool.coverage.report]
282
- exclude_lines = [
283
- "pragma: no cover",
284
- "def __repr__",
285
- "if self.debug:",
286
- "raise AssertionError",
287
- "raise NotImplementedError",
288
- "if __name__ == .__main__.:",
289
- "if TYPE_CHECKING:",
290
- ]
@@ -1,37 +1,12 @@
1
- """Shared fixtures + helpers for the v1 end-to-end eval tests.
2
-
3
- These tests run REAL eval runs (a live model endpoint, real runtimes) with the smallest
4
- settings that still exercise the path, then assert on the resulting `Trace`(s) — they are
5
- not unit tests of individual components. They need a model API key (`PRIME_API_KEY`);
6
- without one the `e2e`-marked tests skip (config parsing still runs).
7
-
8
- `run_v1` mirrors the eval CLI (`run_eval`, in-process); `run_v1_server` drives the same env
9
- through an env-server worker pool, the path prime-rl trains through. Placement coverage (harness x harness runtime x tool
10
- server runtime) is PAIRWISE, not a full cross product: each test carries a curated list of
11
- combinations (in test_e2e.py) that hits every axis value and the cross-boundary pairs with
12
- distinct networking. The full cross bought flake exposure and CI minutes, not coverage — add
13
- a combination to a test's list when it exercises a genuinely new reachability pair. The
14
- placement fixtures below are indirect-only: they translate a parametrized value, and using
15
- one without `indirect=True` fails loudly.
16
-
17
- Every combination carries its axes' pytest marks, so subsets select with `-m`:
18
-
19
- uv run pytest tests/v1 -n auto # everything (needs remote setup)
20
- uv run pytest tests/v1 -n auto -m "not e2e" # deterministic CI matrix
21
- uv run pytest tests/v1 -n auto -m "e2e and not prime and not modal and not e2b" # live CI job
22
- uv run pytest tests/v1 -n auto -m docker # any case touching the docker runtime
23
- uv run pytest tests/v1 -n auto -m bash # only the bash harness
24
- uv run pytest tests/v1 -n auto -m prime # only prime (real sandboxes; local)
25
- uv run pytest tests/v1 -n auto -m modal # only modal (needs local setup)
26
- uv run pytest tests/v1 -n auto -m e2b # only e2b (real sandboxes; local)
27
-
28
- Marks: runtimes `subprocess` / `docker` / `podman` / `apptainer` / `prime` / `modal` / `e2b`, placement `colocated`,
29
- harnesses `null` / `bash` / `rlm` / `kimi_code` / `pi` / `openclaw` / `codex` /
30
- `claude_code` / `hermes_agent`.
31
- A mark is applied per axis, so it selects every case touching that value on ANY axis; for one exact
32
- combination use `-k` on the test id (e.g. `-k "harness-in-docker-with-tool-in-subprocess"`).
33
- prime/modal/e2b provision real remote sandboxes (slow, infra-flaky, need setup), so they're local-only.
34
- CI runs deterministic tests across the Python matrix and the remaining live E2Es once.
1
+ """Shared fixtures for the integration suite: REAL eval runs (a live model endpoint, real
2
+ runtimes) with the smallest settings that still exercise the path, asserting on the
3
+ resulting `Trace`(s). They need a model API key (`PRIME_API_KEY`); without one the
4
+ model-driven tests skip.
5
+
6
+ Each behavior module fixes one task and fans it across the harness x runtime grid in
7
+ `grid.py`, which also says why a cell is skipped. `run` drives the `Env` API in-process,
8
+ the calls the eval CLI makes. The placement fixtures below are indirect-only: they translate a parametrized value, and using one without
9
+ `indirect=True` fails loudly.
35
10
  """
36
11
 
37
12
  import asyncio
@@ -39,27 +14,29 @@ import os
39
14
  from pathlib import Path
40
15
 
41
16
  import pytest
17
+ from grid import agent_seats, runtime_config
42
18
 
43
- import verifiers.v1 as vf
44
- from verifiers.v1.cli.eval.runner import run_eval
19
+ from verifiers.v1.clients import EvalClientConfig, ModelContext
45
20
  from verifiers.v1.configs.cli.eval import EvalConfig
46
21
  from verifiers.v1.configs.harness import HarnessConfig
47
- from verifiers.v1.trace import Trace
48
- from verifiers.v1.utils.loaders import harness_config_type
22
+ from verifiers.v1.episode import Episode
23
+ from verifiers.v1.types import SamplingConfig
24
+ from verifiers.v1.utils.loaders import harness_config_type, load_environment
49
25
 
50
26
  CI_MODEL = "openai/gpt-5.6-luna"
51
27
 
52
- # Fixture tasksets (echo-v1, echo-agentic-v1) live in tests/v1/fixtures, added to the
53
- # path via `pythonpath` in pyproject so the loader resolves them by id (no install).
28
+ # Fixture tasksets (echo-v1, echo-agentic-v1, ...) live in tests/integration/fixtures,
29
+ # added to the path via `pythonpath` in pyproject so the loader resolves them by id.
54
30
 
55
- # The placement fixtures translate one parametrized value each; the combinations live on
56
- # the tests (`indirect=True`), so coverage is a visible, curated list — never an implicit
57
- # cross product.
31
+ LIVE_FIXTURES = {"run", "live_ctx"}
58
32
 
59
33
 
60
34
  @pytest.fixture
61
- def harness_runtime(request) -> str | dict:
62
- return request.param
35
+ def harness_runtime(request) -> dict:
36
+ """The runtime config placing the harness: a config built by the grid, or a
37
+ runtime type from a runtime-only grid."""
38
+ param = request.param
39
+ return dict(param) if isinstance(param, dict) else runtime_config(param)
63
40
 
64
41
 
65
42
  @pytest.fixture
@@ -68,15 +45,13 @@ def tool_runtime(request) -> dict:
68
45
  runtime) or its own runtime, by type."""
69
46
  if request.param == "colocated":
70
47
  return {"colocated": True}
71
- if request.param == "docker":
72
- return {"runtime": {"type": "docker", "allow": ["*"]}}
73
48
  return {"runtime": {"type": request.param}}
74
49
 
75
50
 
76
51
  # Built-in harnesses are bundled in the `harnesses` package; the agent CLIs (`rlm` /
77
52
  # `kimi-code` / `openclaw` / `codex` / `claude-code` / `hermes-agent`) install their
78
53
  # dependencies at rollout.
79
- # `compact` (an example harness) and `terminus-2` (drives the host tmux) are excluded from e2e.
54
+ # `compact` (an example harness) and `terminus-2` (drives the host tmux) are outside the grid.
80
55
  @pytest.fixture
81
56
  def harness(request) -> HarnessConfig:
82
57
  config = {"id": request.param} if isinstance(request.param, str) else request.param
@@ -97,33 +72,29 @@ def pytest_configure(config) -> None:
97
72
 
98
73
 
99
74
  def pytest_collection_modifyitems(config, items) -> None:
100
- """Skip the live-model tests (marked `e2e`) when no model endpoint is configured, so the
101
- rest of the suite (e.g. config parsing) still runs in a keyless environment."""
75
+ """Skip the model-driven tests when no model endpoint is configured; the rest
76
+ (scripted harness behaviors, the examples' own key check) decide for themselves."""
102
77
  if os.environ.get("PRIME_API_KEY"):
103
78
  return
104
79
  skip = pytest.mark.skip(reason="needs PRIME_API_KEY")
105
80
  for item in items:
106
- if "e2e" in item.keywords:
81
+ if LIVE_FIXTURES & set(getattr(item, "fixturenames", ())):
107
82
  item.add_marker(skip)
108
83
 
109
84
 
110
- def _configure_prime_runtimes(config: dict) -> None:
111
- """Configure every prime runtime config (nested — harness / tool): tag a `vf-ci` label
112
- for optional cleanup, and pin a region that supports port exposure."""
85
+ def _label_prime_runtimes(config: dict) -> None:
86
+ """Tag every prime runtime config (nested: harness / tool) with a `vf-ci` label, so
87
+ leftover sandboxes can be found and cleaned up."""
113
88
  if isinstance(config, dict):
114
89
  if config.get("type") == "prime":
115
90
  config.setdefault("labels", ["vf-ci"])
116
- # `us` is required for prime's port exposure, which a tool server hosted in a
117
- # sandbox needs to be reachable from outside it.
118
- config.setdefault("region", "us")
119
91
  for value in config.values():
120
- _configure_prime_runtimes(value)
92
+ _label_prime_runtimes(value)
121
93
 
122
94
 
123
95
  def _eval_config(
124
96
  taskset: str,
125
97
  *,
126
- output_dir: Path,
127
98
  harness: str | HarnessConfig | None = "null",
128
99
  n: int = 1,
129
100
  num_tasks: int = 1,
@@ -136,8 +107,8 @@ def _eval_config(
136
107
  reasoning_effort: str | None = None,
137
108
  client: dict | None = None,
138
109
  ) -> EvalConfig:
139
- """Build the smallest `EvalConfig` that still exercises the path, shared by the in-process
140
- (`run_v1`) and env-server (`run_v1_server`) fixtures. `taskset_overrides` merges onto the
110
+ """Build the smallest `EvalConfig` that still exercises the path, used by the `run`
111
+ fixture. `taskset_overrides` merges onto the
141
112
  `{id: ...}` config; `runtime` places the `agent` seat's harness (an agent field, not a
142
113
  harness one).
143
114
 
@@ -146,7 +117,7 @@ def _eval_config(
146
117
  seat and a multi-agent test pins its seats through `env` role fields instead."""
147
118
  taskset_cfg = {"id": taskset, **(taskset_overrides or {})}
148
119
  env_cfg = dict(env or {})
149
- _configure_prime_runtimes(taskset_cfg)
120
+ _label_prime_runtimes(taskset_cfg)
150
121
  if harness:
151
122
  env_cfg.setdefault("agent", {})["harness"] = (
152
123
  harness_config_type(harness)(id=harness)
@@ -155,7 +126,7 @@ def _eval_config(
155
126
  )
156
127
  if runtime:
157
128
  runtime_cfg = dict(runtime)
158
- _configure_prime_runtimes(runtime_cfg)
129
+ _label_prime_runtimes(runtime_cfg)
159
130
  env_cfg.setdefault("agent", {})["runtime"] = runtime_cfg
160
131
  retries = {
161
132
  "max_retries": 0,
@@ -165,15 +136,9 @@ def _eval_config(
165
136
  ],
166
137
  }
167
138
  env_cfg.setdefault("retries", retries)
168
- # Per-run caps live on the seats: resolve the env's declared roles and cap
169
- # each one (a test's own seat dict wins over the shared defaults).
170
- config_cls = vf.env_config_type(taskset, env_cfg.get("id", ""))
171
- seats = [
172
- name
173
- for name, field in config_cls.model_fields.items()
174
- if isinstance(field.default, vf.AgentConfig)
175
- ]
176
- for seat in seats:
139
+ # Per-run caps live on the seats: cap each role the env declares (a test's own
140
+ # seat dict wins over the shared defaults).
141
+ for seat in agent_seats(taskset, env_cfg.get("id", "")):
177
142
  seat_cfg = env_cfg.setdefault(seat, {})
178
143
  seat_cfg.setdefault("max_turns", max_turns)
179
144
  seat_cfg.setdefault("max_output_tokens", max_tokens)
@@ -191,91 +156,42 @@ def _eval_config(
191
156
  "max_tokens": max_tokens,
192
157
  "reasoning_effort": reasoning_effort,
193
158
  },
194
- rich=None,
195
- output_dir=output_dir.parent,
196
- run={"dir": output_dir.name},
197
159
  model=CI_MODEL,
198
- push=False,
199
160
  **({"client": client} if client else {}),
200
161
  )
201
162
 
202
163
 
203
164
  @pytest.fixture
204
- def run_v1():
205
- """Run a v1 taskset end-to-end in-process (`run_eval`) and return its traces."""
165
+ def run():
166
+ """Run a taskset's episodes in-process through the `Env` API: the calls `vf-eval`
167
+ makes (`serving`, `slots`, `run_slot`, retries included), without its run
168
+ directory, platform push, or dashboard. The Examples job covers that CLI layer."""
206
169
 
207
- async def _run(taskset: str, **kwargs) -> list[Trace]:
170
+ async def _run(taskset: str, **kwargs) -> list[Episode]:
208
171
  config = _eval_config(taskset, **kwargs)
209
- records = await run_eval(config)
210
- # The runner answers durability envelopes; the tests assert on traces.
211
- return [t for r in records for t in r.traces]
212
-
213
- return _run
214
-
215
-
216
- @pytest.fixture
217
- def run_v1_server():
218
- """Run a v1 taskset through an env-server worker pool — the path prime-rl trains
219
- through. Spawns the broker + a worker, so it's the only fixture that exercises
220
- serving resources (shared tool servers, interception pool) being stood up by the
221
- *server* rather than the in-process runner. Pinned to a single static worker for
222
- determinism."""
223
- import multiprocessing as mp
224
-
225
- from verifiers.v1.serve import EnvClient, env_config_data, serve_env
226
- from verifiers.v1.utils.loaders import load_taskset
227
-
228
- async def _run(taskset: str, **kwargs) -> list[Trace]:
229
- config = _eval_config(taskset, **kwargs)
230
- tasks = list(load_taskset(config.env.taskset).select(config.select))
231
- mpctx = mp.get_context("spawn")
232
- address_queue: mp.Queue = mpctx.Queue()
233
- proc = mpctx.Process(
234
- target=serve_env,
235
- kwargs={
236
- "max_workers": 1,
237
- "elastic": False,
238
- "address": "tcp://127.0.0.1:0",
239
- "address_queue": address_queue,
240
- "config_data": env_config_data(config.env),
241
- "max_concurrent": config.max_concurrent,
242
- },
172
+ env = load_environment(config.env)
173
+ tasks = list(env.taskset.select(config.select))
174
+ ctx = ModelContext(
175
+ client=config.client, model=config.model, sampling=config.sampling
243
176
  )
244
- proc.start()
245
- try:
246
- address = await asyncio.to_thread(address_queue.get, timeout=600)
247
- client = EnvClient(address=address)
248
- try:
249
- await client.wait_for_server_startup(timeout=600)
250
- episodes = await asyncio.gather(
177
+ async with env.serving():
178
+ return list(
179
+ await asyncio.gather(
251
180
  *(
252
- client.run(
253
- client=config.client,
254
- model=config.model,
255
- sampling=config.sampling,
256
- task_data=task.data.model_dump(mode="json"),
257
- )
181
+ env.run_slot(slot, ctx)
258
182
  for task in tasks
259
- for _ in range(config.num_rollouts)
183
+ for slot in env.slots(task, config.num_rollouts)
260
184
  )
261
185
  )
262
- finally:
263
- await client.close()
264
- finally:
265
- proc.terminate()
266
- await asyncio.to_thread(proc.join, 10)
267
- return [t for e in episodes for t in e.traces]
186
+ )
268
187
 
269
188
  return _run
270
189
 
271
190
 
272
191
  @pytest.fixture
273
192
  async def live_ctx():
274
- """The e2e `ModelContext` (default model + endpoint config, provider-default sampling)
275
- for driving `Agent` directly — the agent-surface counterpart of `run_v1`."""
276
- from verifiers.v1.clients import EvalClientConfig, ModelContext
277
- from verifiers.v1.types import SamplingConfig
278
-
193
+ """The live `ModelContext` (default model + endpoint config, provider-default sampling)
194
+ for driving `Agent` directly — the agent-surface counterpart of `run`."""
279
195
  # Endpoint config only — each rollout builds and closes its own client.
280
196
  yield ModelContext(
281
197
  model=CI_MODEL,
@@ -2,7 +2,7 @@
2
2
 
3
3
  Root setup creates the task's `agent_user` (images normally ship one) and hands it the
4
4
  workdir; the harness then installs, launches as that user, and answers a one-line prompt.
5
- With the e2e suite's scripted upstream answering, the run is deterministic: it fails only if
5
+ With the integration suite's scripted upstream answering, the run is deterministic: it fails only if
6
6
  the harness can't set up or run without root.
7
7
  """
8
8
 
@@ -1,6 +1,6 @@
1
1
  """duet: the smallest multi-agent environment — two roles echo the same phrase.
2
2
 
3
- The multi-agent fixture for the v1 e2e suite (resolved by id `duet-v1`): an
3
+ The multi-agent fixture for the v1 integration suite (resolved by id `duet-v1`): an
4
4
  `Env` subclass exported alongside its taskset, with two roles ("a", a trainable
5
5
  seat on the run's model; "b", pinned untrainable), a `run()` that fans both out on
6
6
  the task, and a `finalize()` that records a sibling-dependent signal. One episode
@@ -3,7 +3,7 @@
3
3
  Like harbor's hello-world but with no Dockerfile to build — it runs on the runtime's default
4
4
  image, so the whole agentic loop works end to end: the model issues bash commands and the
5
5
  reward reads the file back out of the runtime (`runtime.read`, runtime-opaque like harbor's
6
- verifier). The minimal reward-1 agentic task for the e2e suite. Needs an agentic (shell) harness,
6
+ verifier). The minimal reward-1 agentic task for the integration suite. Needs an agentic (shell) harness,
7
7
  e.g. `bash`.
8
8
  """
9
9
 
@@ -1,6 +1,6 @@
1
1
  """echo (v1, MCP tool): retrieve a stamped echo from a `vf.Toolset`, then report it.
2
2
 
3
- The v1 tool fixture for the e2e matrix. The task constructs an `EchoToolset`
3
+ The v1 tool fixture for the integration grid. The task constructs an `EchoToolset`
4
4
  (`vf.Toolset`) in `Task.toolsets`, with one `@vf.tool` method whose placement is
5
5
  CLI-tunable (`--taskset.task.tools.colocated`, `--taskset.task.tools.runtime.type`):
6
6
  it runs colocated in the harness's runtime or in its own runtime, and the harness
@@ -9,7 +9,6 @@ closes the interaction (the trace stops as `user_closed`).
9
9
  import verifiers.v1 as vf
10
10
 
11
11
  PHRASES = ["hello world", "goodbye world"]
12
- SYSTEM = "Repeat the user's message back to them exactly, with no extra words."
13
12
 
14
13
 
15
14
  def _key(text: str) -> str:
@@ -27,12 +26,14 @@ class EchoUserSimData(vf.TaskData):
27
26
  class EchoUserSimTask(vf.Task[EchoUserSimData, vf.State, vf.TaskConfig]):
28
27
  @vf.reward(weight=1.0)
29
28
  async def echoed(self, trace: vf.Trace) -> float:
30
- replies = [m.content for m in trace.assistant_messages]
31
- phrases = self.data.phrases
32
- if len(replies) < len(phrases):
33
- return 0.0
34
- matched = sum(_key(p) in _key(r or "") for r, p in zip(replies, phrases))
35
- return matched / len(phrases)
29
+ # Match each phrase to a later reply, in order: a harness may spend turns on
30
+ # tool calls, so replies and phrases need not pair up one to one.
31
+ replies = iter(_key(m.content or "") for m in trace.assistant_messages)
32
+ matched = sum(
33
+ any(_key(phrase) in reply for reply in replies)
34
+ for phrase in self.data.phrases
35
+ )
36
+ return matched / len(self.data.phrases)
36
37
 
37
38
 
38
39
  class EchoUserSimEnv(vf.SingleAgentEnv):
@@ -43,7 +44,11 @@ class EchoUserSimEnv(vf.SingleAgentEnv):
43
44
  # first turn opens the conversation.
44
45
  async with agents.agent.interaction(task) as interaction:
45
46
  for phrase in task.data.phrases:
46
- if (await interaction.turn(phrase)).terminated:
47
+ instruction = (
48
+ "Answer directly without using tools or running code. Your "
49
+ f"reply must contain this exact phrase: {phrase}"
50
+ )
51
+ if (await interaction.turn(instruction)).terminated:
47
52
  break
48
53
 
49
54
 
@@ -55,7 +60,6 @@ class EchoUserSimTaskset(vf.Taskset[EchoUserSimTask, EchoUserSimConfig]):
55
60
  idx=0,
56
61
  # No prompt: the scripted user opens the conversation.
57
62
  prompt=None,
58
- system_prompt=SYSTEM,
59
63
  phrases=self.config.phrases,
60
64
  )
61
65
  )
@@ -2,16 +2,14 @@
2
2
 
3
3
  The smallest possible reward-1 taskset — no dataset, no tools, no reasoning required — so an
4
4
  end-to-end eval run is fast and deterministic. The reward is 1.0 when the phrase appears in
5
- the model's reply. It's a fixture taskset for the v1 e2e suite (in tests/v1/fixtures, resolved
6
- by id `echo-v1` via pytest's `pythonpath`).
5
+ the model's reply. It's a fixture taskset for the integration suite (in tests/integration/fixtures,
6
+ resolved by id `echo-v1` via pytest's `pythonpath`).
7
7
  """
8
8
 
9
9
  from pydantic import Field
10
10
 
11
11
  import verifiers.v1 as vf
12
12
 
13
- SYSTEM = "Repeat the user's message back to them exactly, with no extra words."
14
-
15
13
 
16
14
  def _key(text: str) -> str:
17
15
  """Lenient comparison key: lowercase, alphanumerics only."""
@@ -64,7 +62,6 @@ class EchoTaskset(vf.Taskset[EchoTask, EchoConfig]):
64
62
  "Answer directly without using tools or running code. Your reply "
65
63
  f"must contain this exact phrase: {phrase}"
66
64
  ),
67
- system_prompt=SYSTEM,
68
65
  answer=phrase,
69
66
  ),
70
67
  self.config.task,