verifiers 0.3.2.dev115__tar.gz → 0.3.2.dev117__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 (220) hide show
  1. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/PKG-INFO +1 -1
  2. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/tests/v1/fixtures/echo_acp_resume_v1.py +4 -2
  3. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/tests/v1/test_trace.py +7 -2
  4. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/browser_use/program.py +1 -1
  5. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/claude_code/harness.py +4 -2
  6. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/codex/harness.py +2 -2
  7. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/hermes_agent/harness.py +34 -9
  8. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/hermes_agent/program.py +2 -2
  9. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/kimi_code/harness.py +1 -1
  10. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/mini_swe_agent/program.py +1 -1
  11. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/openclaw/harness.py +3 -2
  12. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/pi/harness.py +2 -2
  13. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/prime_agent/harness.py +9 -9
  14. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/rlm/harness.py +1 -1
  15. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/terminus_2/harness.py +1 -1
  16. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/rollout.py +3 -1
  17. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/runtimes/prime.py +19 -8
  18. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/task.py +3 -1
  19. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/tasksets/harbor/taskset.py +7 -2
  20. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/utils/artifacts.py +6 -3
  21. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/.gitignore +0 -0
  22. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/LICENSE +0 -0
  23. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/README.md +0 -0
  24. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/pyproject.toml +0 -0
  25. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/tests/v1/conftest.py +0 -0
  26. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  27. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/tests/v1/fixtures/duet_v1.py +0 -0
  28. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  29. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  30. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  31. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/tests/v1/fixtures/echo_v1.py +0 -0
  32. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/tests/v1/fixtures/pyproject.toml +0 -0
  33. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  34. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/tests/v1/test_color_codeword_tasks.py +0 -0
  35. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/tests/v1/test_configs.py +0 -0
  36. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/tests/v1/test_e2e.py +0 -0
  37. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/tests/v1/test_envs.py +0 -0
  38. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/tests/v1/test_graph.py +0 -0
  39. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/tests/v1/test_judges.py +0 -0
  40. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/tests/v1/test_platform_run.py +0 -0
  41. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/tests/v1/test_scoring.py +0 -0
  42. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/tests/v1/test_serve_delta.py +0 -0
  43. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/tests/v1/test_taskset.py +0 -0
  44. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/__init__.py +0 -0
  45. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/cli/commands/init.py +0 -0
  46. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/__init__.py +0 -0
  47. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/acp/__init__.py +0 -0
  48. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/acp/runner.py +0 -0
  49. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/agent.py +0 -0
  50. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/cli/__init__.py +0 -0
  51. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  52. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/cli/dashboard/base.py +0 -0
  53. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/cli/dashboard/eval.py +0 -0
  54. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/cli/dashboard/replay.py +0 -0
  55. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/cli/dashboard/validate.py +0 -0
  56. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/cli/debug.py +0 -0
  57. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/cli/eval/__init__.py +0 -0
  58. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/cli/eval/hint.py +0 -0
  59. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/cli/eval/main.py +0 -0
  60. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/cli/eval/resume.py +0 -0
  61. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/cli/eval/runner.py +0 -0
  62. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/cli/gepa.py +0 -0
  63. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/cli/init.py +0 -0
  64. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/cli/output.py +0 -0
  65. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/cli/replay.py +0 -0
  66. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/cli/resolve.py +0 -0
  67. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/cli/resume.py +0 -0
  68. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/cli/validate.py +0 -0
  69. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/clients/__init__.py +0 -0
  70. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/clients/base.py +0 -0
  71. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/clients/client.py +0 -0
  72. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/clients/eval.py +0 -0
  73. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/clients/train.py +0 -0
  74. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/configs/__init__.py +0 -0
  75. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/configs/agent.py +0 -0
  76. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/configs/cli/__init__.py +0 -0
  77. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/configs/cli/debug.py +0 -0
  78. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/configs/cli/env.py +0 -0
  79. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/configs/cli/eval.py +0 -0
  80. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/configs/cli/init.py +0 -0
  81. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/configs/cli/replay.py +0 -0
  82. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/configs/cli/validate.py +0 -0
  83. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/configs/client.py +0 -0
  84. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/configs/env.py +0 -0
  85. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/configs/harness.py +0 -0
  86. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/configs/judge.py +0 -0
  87. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/configs/retries.py +0 -0
  88. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/configs/runtime.py +0 -0
  89. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/configs/serve.py +0 -0
  90. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/configs/task.py +0 -0
  91. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/configs/taskset.py +0 -0
  92. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/dialects/__init__.py +0 -0
  93. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/dialects/anthropic.py +0 -0
  94. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/dialects/base.py +0 -0
  95. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/dialects/chat.py +0 -0
  96. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/dialects/responses.py +0 -0
  97. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/env.py +0 -0
  98. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/envs/__init__.py +0 -0
  99. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
  100. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/envs/agentic_judge/env.py +0 -0
  101. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  102. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/envs/best_of_n/env.py +0 -0
  103. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/envs/isolated_verifier/__init__.py +0 -0
  104. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/envs/isolated_verifier/env.py +0 -0
  105. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/envs/shared_agentic_judge/__init__.py +0 -0
  106. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  107. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/envs/single_agent/env.py +0 -0
  108. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/envs/user_sim/__init__.py +0 -0
  109. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/envs/user_sim/env.py +0 -0
  110. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/episode.py +0 -0
  111. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/errors.py +0 -0
  112. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/gepa/__init__.py +0 -0
  113. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/gepa/adapter.py +0 -0
  114. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/gepa/config.py +0 -0
  115. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/gepa/dataset.py +0 -0
  116. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/gepa/reflection.py +0 -0
  117. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/gepa/runner.py +0 -0
  118. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/graph.py +0 -0
  119. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harness.py +0 -0
  120. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/__init__.py +0 -0
  121. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  122. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/bash/harness.py +0 -0
  123. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
  124. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
  125. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  126. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  127. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
  128. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  129. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  130. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  131. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/node.py +0 -0
  132. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/null/__init__.py +0 -0
  133. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/null/harness.py +0 -0
  134. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
  135. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  136. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/prime_agent/__init__.py +0 -0
  137. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  138. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  139. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  140. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/utils/__init__.py +0 -0
  141. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/utils/compaction.py +0 -0
  142. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/utils/core.py +0 -0
  143. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/utils/install.py +0 -0
  144. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/utils/launch.py +0 -0
  145. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/harnesses/utils/mcp.py +0 -0
  146. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/interception/__init__.py +0 -0
  147. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/interception/base.py +0 -0
  148. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/interception/pool.py +0 -0
  149. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/interception/server.py +0 -0
  150. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/interception/tool.py +0 -0
  151. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  152. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/interception/tunnel/base.py +0 -0
  153. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/interception/tunnel/custom.py +0 -0
  154. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/interception/tunnel/prime.py +0 -0
  155. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/judge.py +0 -0
  156. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/judges/__init__.py +0 -0
  157. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/judges/reference.py +0 -0
  158. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/judges/reference.txt +0 -0
  159. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/judges/rubric.py +0 -0
  160. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/judges/rubric.txt +0 -0
  161. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/mcp/__init__.py +0 -0
  162. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/mcp/launch.py +0 -0
  163. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/mcp/server.py +0 -0
  164. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/mcp/toolset.py +0 -0
  165. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/runtimes/__init__.py +0 -0
  166. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/runtimes/apptainer.py +0 -0
  167. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/runtimes/base.py +0 -0
  168. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/runtimes/container.py +0 -0
  169. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/runtimes/docker/__init__.py +0 -0
  170. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/runtimes/docker/egress.py +0 -0
  171. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/runtimes/limiters.py +0 -0
  172. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/runtimes/modal.py +0 -0
  173. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/runtimes/subprocess.py +0 -0
  174. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/semantic.py +0 -0
  175. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/serve/__init__.py +0 -0
  176. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/serve/client.py +0 -0
  177. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/serve/delta.py +0 -0
  178. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/serve/encoding.py +0 -0
  179. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/serve/pool.py +0 -0
  180. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/serve/server.py +0 -0
  181. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/serve/types.py +0 -0
  182. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/session.py +0 -0
  183. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/state.py +0 -0
  184. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/taskset.py +0 -0
  185. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/tasksets/__init__.py +0 -0
  186. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  187. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/tasksets/harbor/env.py +0 -0
  188. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/tasksets/harbor/toolset.py +0 -0
  189. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  190. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  191. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  192. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/tasksets/nemo_gym/__init__.py +0 -0
  193. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/tasksets/nemo_gym/response.py +0 -0
  194. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/tasksets/nemo_gym/server.py +0 -0
  195. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/tasksets/nemo_gym/taskset.py +0 -0
  196. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/tasksets/nemo_gym/toolset.py +0 -0
  197. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  198. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  199. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  200. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  201. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/trace.py +0 -0
  202. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/types.py +0 -0
  203. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/utils/__init__.py +0 -0
  204. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/utils/aio.py +0 -0
  205. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/utils/compile.py +0 -0
  206. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/utils/decorators.py +0 -0
  207. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/utils/format.py +0 -0
  208. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/utils/generic.py +0 -0
  209. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/utils/git.py +0 -0
  210. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/utils/image.py +0 -0
  211. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/utils/interrupt.py +0 -0
  212. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/utils/loaders.py +0 -0
  213. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/utils/logging.py +0 -0
  214. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/utils/memory.py +0 -0
  215. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/utils/paths.py +0 -0
  216. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/utils/platform.py +0 -0
  217. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/utils/prime.py +0 -0
  218. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/utils/retries.py +0 -0
  219. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/utils/score.py +0 -0
  220. {verifiers-0.3.2.dev115 → verifiers-0.3.2.dev117}/verifiers/v1/utils/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: verifiers
3
- Version: 0.3.2.dev115
3
+ Version: 0.3.2.dev117
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
@@ -53,13 +53,15 @@ class ACPResumeEnv(vf.SingleAgentEnv):
53
53
  async def run(self, task, agents):
54
54
  async with agents.agent.interaction(task) as interaction:
55
55
  first = await interaction.turn(
56
- f"Remember the codeword {CODEWORD}. Reply with exactly READY."
56
+ f"Remember the codeword {CODEWORD} for this conversation only. "
57
+ "Do not call tools or store it in persistent memory. Reply with exactly READY."
57
58
  )
58
59
  segments = [first]
59
60
  if not first.terminated:
60
61
  segments.append(
61
62
  await interaction.turn(
62
- "Call the `recall` tool from the `resume` MCP server with the "
63
+ "Use your tools or pre-imported Python skills to call `resume`'s "
64
+ "`recall` with the "
63
65
  "codeword from my previous message, then reply with exactly the "
64
66
  "tool result."
65
67
  )
@@ -10,6 +10,7 @@ import pytest
10
10
 
11
11
  import verifiers.v1 as vf
12
12
  from verifiers.v1.agent import Interaction
13
+ from verifiers.v1.cli.output import write_episode
13
14
  from verifiers.v1.graph import MessageNode
14
15
  from verifiers.v1.harnesses.rlm.harness import (
15
16
  RLM_SESSION_METADATA_KEY,
@@ -144,13 +145,13 @@ def test_bare_trace_round_trip():
144
145
  assert rt.reward == 0.0 and rt.errors == []
145
146
 
146
147
 
147
- def test_custom_task_state_round_trip():
148
+ def test_custom_task_state_round_trip(tmp_path):
148
149
  # Custom data and state round-trip into the same parameterization. Data fields are
149
150
  # typed (not just `model_extra`); `state` is runtime-only and never crosses the wire.
150
151
  tr = vf.Trace[MyTask, MyState](
151
152
  agent=vf.AgentInfo(config=vf.AgentConfig()),
152
153
  task=vf.TraceTask(type="MyTask", data=MyTask(idx=0, prompt="q", answer="gold")),
153
- state=MyState(score=7),
154
+ state=MyState(score=7, artifacts={"/artifact.bin": b"\xff\x00\xfe"}),
154
155
  nodes=[
155
156
  MessageNode(parent=None, message=UserMessage(content="q"), sampled=False),
156
157
  MessageNode(parent=0, message=AssistantMessage(content="a"), sampled=True),
@@ -167,6 +168,10 @@ def test_custom_task_state_round_trip():
167
168
  assert rt.task.type == "MyTask" # the producing class's name survives the wire
168
169
  assert rt.num_turns == 1 and rt.num_branches == 1
169
170
  assert rt.reward == 0.5 # property recomputed from `rewards`
171
+ write_episode(tmp_path, vf.Episode(task=tr.task, traces=[tr], ok=True))
172
+ saved = json.loads((tmp_path / "traces.jsonl").read_bytes())
173
+ assert "state" not in saved["traces"][0]
174
+ assert tr.state.artifacts["/artifact.bin"] == b"\xff\x00\xfe"
170
175
 
171
176
 
172
177
  def test_wire_trace_round_trip():
@@ -1,7 +1,7 @@
1
1
  # /// script
2
2
  # requires-python = ">=3.11"
3
3
  # dependencies = [
4
- # "browser-harness==0.1.8",
4
+ # "browser-harness==0.1.13",
5
5
  # "openai",
6
6
  # "mcp==2.0.0",
7
7
  # "httpx",
@@ -11,7 +11,7 @@ from verifiers.v1.trace import Trace
11
11
 
12
12
  CLAUDE_ACP_DIR = "/var/tmp/vf-claude-agent-acp-{version}-{acp_version}"
13
13
  PACKAGES_DIR = f"{CLAUDE_ACP_DIR}/packages"
14
- ACP_VERSION = "0.67.0"
14
+ ACP_VERSION = "0.79.0"
15
15
  CLAUDE_BIN = f"{PACKAGES_DIR}/node_modules/.bin/claude"
16
16
  ACP_BIN = f"{PACKAGES_DIR}/node_modules/.bin/claude-agent-acp"
17
17
  CLAUDE_CONFIG_ROOT = ".vf-claude"
@@ -28,7 +28,7 @@ touch {ready}
28
28
 
29
29
 
30
30
  class ClaudeCodeHarnessConfig(HarnessConfig):
31
- version: PinnedVersion = "2.1.232"
31
+ version: PinnedVersion = "2.1.278"
32
32
  """Claude Code release to install, pinned for reproducibility."""
33
33
 
34
34
 
@@ -79,6 +79,8 @@ class ClaudeCodeHarness(ACPHarness[ClaudeCodeHarnessConfig]):
79
79
  "options": {
80
80
  "strictMcpConfig": True,
81
81
  "disallowedTools": self.config.disabled_tools or [],
82
+ # A supplied title prevents the adapter's background title-model call.
83
+ "extraArgs": {"name": trace.id},
82
84
  }
83
85
  },
84
86
  **({"systemPrompt": {"append": system_prompt}} if system_prompt else {}),
@@ -19,7 +19,7 @@ logger = logging.getLogger(__name__)
19
19
 
20
20
  CODEX_DIR = "/var/tmp/vf-codex-{version}-{acp_version}"
21
21
  PACKAGES_DIR = f"{CODEX_DIR}/acp"
22
- ACP_VERSION = "1.2.0"
22
+ ACP_VERSION = "1.12.0"
23
23
  CODEX_BIN = f"{PACKAGES_DIR}/node_modules/.bin/codex"
24
24
  ACP_BIN = f"{PACKAGES_DIR}/node_modules/.bin/codex-acp"
25
25
  INSTALL = r"""
@@ -35,7 +35,7 @@ touch {ready}
35
35
 
36
36
 
37
37
  class CodexHarnessConfig(HarnessConfig):
38
- version: PinnedVersion = "0.147.0"
38
+ version: PinnedVersion = "0.155.1"
39
39
  """Codex release to install, pinned for reproducibility."""
40
40
  multi_agent: bool = False
41
41
  """Enable Codex's native multi-agent v2 tools."""
@@ -6,17 +6,28 @@ from pathlib import Path
6
6
  from verifiers.v1.acp import ACPConfig, ACPHarness
7
7
  from verifiers.v1.clients import ModelContext
8
8
  from verifiers.v1.configs.harness import HarnessConfig, PinnedVersion
9
- from verifiers.v1.harnesses.utils.install import remove_dir
9
+ from verifiers.v1.harnesses.utils.install import ensure_installed, remove_dir
10
10
  from verifiers.v1.runtimes import Runtime
11
+ from verifiers.v1.runtimes.base import _ENSURE_UV
11
12
  from verifiers.v1.task import TaskData
12
13
  from verifiers.v1.trace import Trace
13
14
 
14
15
  PROGRAM_SOURCE = (Path(__file__).resolve().parent / "program.py").read_text()
16
+ HERMES_DIR = "/var/tmp/vf-hermes-agent-{version}"
17
+ INSTALL = f"""
18
+ set -e
19
+ {_ENSURE_UV}
20
+ command -v curl >/dev/null || (apt-get update -qq && apt-get install -y -qq curl ca-certificates >/dev/null)
21
+ curl -fsSL "https://github.com/NousResearch/hermes-agent/archive/refs/tags/$VF_HERMES_VERSION.tar.gz" \\
22
+ | tar -xz --strip-components=1 -C "$VF_HERMES_DIR"
23
+ uv sync --project "$VF_HERMES_DIR" --locked --no-dev --extra acp --extra mcp
24
+ touch "$VF_HERMES_DIR/.ready"
25
+ """
15
26
 
16
27
 
17
28
  class HermesAgentHarnessConfig(HarnessConfig):
18
- version: PinnedVersion = "0.19.0"
19
- """Hermes Agent release to install, pinned for reproducibility."""
29
+ version: PinnedVersion = "v2026.9.14"
30
+ """Hermes Agent Git release tag to install, pinned for reproducibility."""
20
31
  use_bundled_skill: bool = False
21
32
  """Enable Hermes Agent's bundled skill catalog in addition to uploaded skills."""
22
33
 
@@ -27,9 +38,20 @@ class HermesAgentHarness(ACPHarness[HermesAgentHarnessConfig]):
27
38
  SUPPORTS_SKILLS = True
28
39
 
29
40
  async def setup(self, runtime: Runtime) -> None:
30
- await runtime.prepare_uv_script(
31
- PROGRAM_SOURCE.replace("{version}", self.config.version),
32
- self.config.resolved_env,
41
+ # Hermes needs its source-tree assets and supports editable installs only.
42
+ directory = HERMES_DIR.format(version=self.config.version)
43
+ await ensure_installed(
44
+ runtime,
45
+ directory=directory,
46
+ ready=f"test -f {directory}/.ready",
47
+ install=INSTALL,
48
+ env={
49
+ **self.config.resolved_env,
50
+ "VF_HERMES_DIR": directory,
51
+ "VF_HERMES_VERSION": self.config.version,
52
+ },
53
+ label="Hermes Agent",
54
+ shell=("bash", "-o", "pipefail", "-c"),
33
55
  )
34
56
  await super().setup(runtime)
35
57
 
@@ -87,9 +109,12 @@ class HermesAgentHarness(ACPHarness[HermesAgentHarnessConfig]):
87
109
  system_prompt, prompt = self.resolve_prompt(data)
88
110
  return ACPConfig(
89
111
  env=env,
90
- command=await runtime.prepare_uv_script(
91
- PROGRAM_SOURCE.replace("{version}", self.config.version), env
92
- ),
112
+ command=[
113
+ f"{HERMES_DIR.format(version=self.config.version)}/.venv/bin/python",
114
+ "-P", # Keep task files from shadowing installed Hermes modules.
115
+ "-c",
116
+ PROGRAM_SOURCE,
117
+ ],
93
118
  prompt=prompt,
94
119
  system_prompt=system_prompt,
95
120
  )
@@ -1,8 +1,8 @@
1
1
  # /// script
2
2
  # requires-python = ">=3.11,<3.14"
3
- # dependencies = ["hermes-agent[acp,mcp]=={version}"]
3
+ # dependencies = []
4
4
  # ///
5
- """Start Hermes Agent's native ACP server."""
5
+ """Start Hermes Agent's native ACP server in its installed project environment."""
6
6
 
7
7
  import os
8
8
 
@@ -37,7 +37,7 @@ env \
37
37
 
38
38
 
39
39
  class KimiCodeHarnessConfig(HarnessConfig):
40
- version: PinnedVersion = "0.36.0"
40
+ version: PinnedVersion = "2.0.2"
41
41
  """Kimi Code release to install, pinned for reproducibility."""
42
42
  transport: Literal["chat_completions", "responses", "anthropic_messages"] = (
43
43
  "chat_completions"
@@ -1,6 +1,6 @@
1
1
  # /// script
2
2
  # requires-python = ">=3.10"
3
- # dependencies = ["mini-swe-agent=={version}", "litellm[proxy]==1.89.2"]
3
+ # dependencies = ["mini-swe-agent=={version}", "litellm[proxy]==1.102.0"]
4
4
  # ///
5
5
 
6
6
  from minisweagent.run.mini import app
@@ -23,7 +23,7 @@ if [ ! -x "$VF_OPENCLAW_BIN" ]; then
23
23
  curl -fsSL --proto '=https' --tlsv1.2 https://openclaw.ai/install-cli.sh \
24
24
  | bash -s -- --prefix "$VF_OPENCLAW_DIR" --version "$VF_OPENCLAW_VERSION" --no-onboard
25
25
  fi
26
- set -- $(find "$VF_OPENCLAW_DIR/tools" -type f -path '*/openclaw/dist/session-accessor.sqlite-transcript-store-*.js')
26
+ set -- $(find "$VF_OPENCLAW_DIR/tools" -type f -path '*/openclaw/dist/transcript-redact-*.mjs')
27
27
  [ "$#" -eq 1 ] || { echo "could not locate OpenClaw's transcript sanitizer for replay patch" >&2; exit 1; }
28
28
  "$VF_OPENCLAW_DIR/tools/node/bin/node" - "$1" <<'NODE'
29
29
  const fs = require("node:fs");
@@ -116,7 +116,7 @@ wait "$acp_pid"
116
116
 
117
117
 
118
118
  class OpenClawHarnessConfig(HarnessConfig):
119
- version: PinnedVersion = "2026.8.1"
119
+ version: PinnedVersion = "2026.9.5"
120
120
  """OpenClaw release to install, pinned for reproducibility."""
121
121
  use_bundled_skill: bool = True
122
122
  """Enable OpenClaw's bundled skill catalog in addition to uploaded harness skills."""
@@ -180,6 +180,7 @@ class OpenClawHarness(ACPHarness[OpenClawHarnessConfig]):
180
180
  "heartbeat": {"every": "0m"},
181
181
  "sandbox": {"mode": "off"},
182
182
  "model": {"primary": ctx.model},
183
+ "utilityModel": "", # Disable background recap model calls.
183
184
  }
184
185
  },
185
186
  "tools": {
@@ -21,7 +21,7 @@ KEY_VAR = "PI_INTERCEPT_KEY"
21
21
  PI_DIR = "/var/tmp/vf-pi"
22
22
  PACKAGES_DIR = f"{PI_DIR}/mcp"
23
23
  PI_BIN = f"{PACKAGES_DIR}/node_modules/.bin/pi"
24
- MCP_VERSION = "2.28.0"
24
+ MCP_VERSION = "2.34.0"
25
25
  ACP_VERSION = "0.0.33"
26
26
  MCP_ADAPTER = f"{PACKAGES_DIR}/node_modules/pi-mcp-adapter/index.ts"
27
27
  ACP_BIN = f"{PACKAGES_DIR}/node_modules/.bin/pi-acp"
@@ -44,7 +44,7 @@ fi
44
44
 
45
45
 
46
46
  class PiHarnessConfig(HarnessConfig):
47
- version: PinnedVersion = "0.84.1"
47
+ version: PinnedVersion = "0.86.1"
48
48
  """Pi release to install, pinned for reproducibility."""
49
49
  transport: Literal["chat_completions", "responses", "anthropic_messages"] = (
50
50
  "chat_completions"
@@ -19,10 +19,10 @@ logger = logging.getLogger(__name__)
19
19
  GITHUB_RELEASE_URL = (
20
20
  "https://github.com/PrimeIntellect-ai/prime-agent/releases/download"
21
21
  )
22
- PRIME_AGENT_COMMIT: Literal["81ae3cb34d27d38ee37f9e205a1e73694993b344"] = (
23
- "81ae3cb34d27d38ee37f9e205a1e73694993b344"
22
+ PRIME_AGENT_COMMIT: Literal["a7d791bc1be09793ed5f3ec05bf4cccbc60679ea"] = (
23
+ "a7d791bc1be09793ed5f3ec05bf4cccbc60679ea"
24
24
  )
25
- PRIME_AGENT_VERSION = "0.9.1"
25
+ PRIME_AGENT_VERSION = "0.9.5"
26
26
  PRIME_AGENT_DIR = "/var/tmp/vf-prime-agent"
27
27
  STATE_ROOT = "/tmp/vf-prime-agent-runs"
28
28
  PROVIDER = "intercept"
@@ -50,10 +50,10 @@ for tarball in "$agent_tarball" "$ai_tarball" "$core_tarball" "$tui_tarball"; do
50
50
  "$release_url/$tarball" -o "$download_dir/$tarball"
51
51
  done
52
52
  printf '%s %s\n' \
53
- '573bce0cd004fc62052e9a924089941b7f39266ab71e66a94c85a1f9d35835ba' "$agent_tarball" \
54
- '11b5b4cf67b6bb2d3420a44fb69181bc9d94d81e69a2b4fde07eb9c99f5faf4f' "$ai_tarball" \
55
- 'fb6f3a5dcc8b69c5eeb3beff722b5e0f09885c14849db50bc1d7c0f1d064151c' "$core_tarball" \
56
- '4f3eaca2814944d3993073e0b88c0bde54a641ddb5132fbe107e392b997e38ec' "$tui_tarball" \
53
+ '349f1682c7909550842f1b04a71ba95814341b136474ade736df93f8ec006876' "$agent_tarball" \
54
+ '9ad0184b7b5f3d5c3b1677c0663335de32c092cbdb72697aeaf997f17910bb92' "$ai_tarball" \
55
+ '59aafeffb4b64eb997399d56a03f529b2f6604b228e5674372195277db52f04a' "$core_tarball" \
56
+ 'e49f41170edfd1d0e72418729d2c117969ccf8df784dc55fe8c1a9d91778e103' "$tui_tarball" \
57
57
  > "$download_dir/SHA256SUMS"
58
58
  (cd "$download_dir" && sha256sum -c SHA256SUMS)
59
59
  mkdir "$download_dir/package-root"
@@ -87,8 +87,8 @@ PRIME_AGENT_BOOTSTRAP_TOOLS_ON_INSTALL=1 npm install -g \
87
87
 
88
88
 
89
89
  class PrimeAgentHarnessConfig(HarnessConfig):
90
- commit: Literal["81ae3cb34d27d38ee37f9e205a1e73694993b344"] = PRIME_AGENT_COMMIT
91
- """Prime Agent main commit to install."""
90
+ commit: Literal["a7d791bc1be09793ed5f3ec05bf4cccbc60679ea"] = PRIME_AGENT_COMMIT
91
+ """Prime Agent release commit to install."""
92
92
 
93
93
  autonomous: bool = False
94
94
  """Enable Prime Agent's autonomous continuation loop."""
@@ -69,7 +69,7 @@ class CompactionConfig(BaseConfig):
69
69
 
70
70
  class RLMHarnessConfig(HarnessConfig):
71
71
  version: str = Field(
72
- default="00d8aa713c820023033bce6aa2eacea6c37e675d", min_length=1
72
+ default="fc5734d20c5fe74f6ab527ecb7ab10299f3bb965", min_length=1
73
73
  )
74
74
  """Git ref (branch, tag, or commit) of nano-rlm to install. Must know every
75
75
  field this harness puts on the wire, i.e. be at least the default ref."""
@@ -13,7 +13,7 @@ logger = logging.getLogger(__name__)
13
13
 
14
14
 
15
15
  class Terminus2HarnessConfig(HarnessConfig):
16
- version: PinnedVersion = "0.21.0"
16
+ version: PinnedVersion = "0.23.0"
17
17
  """Harbor release to install, pinned for reproducibility."""
18
18
 
19
19
 
@@ -485,7 +485,9 @@ class Rollout:
485
485
  )
486
486
  if self._collect_artifacts and not trace.state.artifacts:
487
487
  trace.state.artifacts = await collect(
488
- runtime, self.task.data.artifacts
488
+ runtime,
489
+ self.task.data.artifacts,
490
+ max_bytes=self.task.data.artifact_max_bytes,
489
491
  )
490
492
  now = time.time()
491
493
  trace.timing.finalize.end = now
@@ -1,8 +1,8 @@
1
1
  """Remote Prime VM sandbox runtime."""
2
2
 
3
3
  import asyncio
4
- import base64
5
4
  import contextlib
5
+ import io
6
6
  import logging
7
7
  import math
8
8
  import shlex
@@ -329,19 +329,30 @@ class PrimeRuntime(Runtime):
329
329
  async def _read(self, path: str, max_bytes: int | None = None) -> bytes:
330
330
  if max_bytes is not None:
331
331
  try:
332
- # VM execute_command uses bash and returns the complete output stream.
333
- result = await self._client.execute_command(
332
+ # Stream binary output: execute_command buffers base64 text for the
333
+ # entire file. Bound the source read and the host buffer independently.
334
+ process = await self._client.open_process(
334
335
  self.info.id,
335
- f"set -o pipefail; head -c {max_bytes} -- {shlex.quote(path)} | base64",
336
+ f"head -c {max_bytes} -- {shlex.quote(path)}",
336
337
  working_dir=self.config.workdir,
337
338
  env=self.process_env({}),
338
- timeout=EFFECTIVELY_UNBOUNDED_SECONDS,
339
339
  )
340
+ async with contextlib.aclosing(process):
341
+ with io.BytesIO() as data:
342
+ async for chunk in process.stdout:
343
+ if data.tell() + len(chunk) > max_bytes:
344
+ raise SandboxError(
345
+ "read stream exceeded its byte limit"
346
+ )
347
+ data.write(chunk)
348
+ stderr = b""
349
+ async for chunk in process.stderr:
350
+ stderr = (stderr + chunk)[-500:]
351
+ if await process.wait():
352
+ raise SandboxError(stderr.decode(errors="replace").strip())
353
+ return data.getvalue()
340
354
  except Exception as exc:
341
355
  raise SandboxError(f"read {path!r}: {exc}") from exc
342
- if result.exit_code:
343
- raise SandboxError(f"read {path!r}: {result.stderr.strip()[-500:]}")
344
- return base64.b64decode(result.stdout)
345
356
  # Avoid background-job log limits and base64 overhead by downloading binary data directly.
346
357
  # The temporary file is removed on every exit, and its byte read stays off the event loop.
347
358
  target = (
@@ -25,7 +25,7 @@ from verifiers.v1.configs.task import TaskConfig
25
25
  from verifiers.v1.errors import TaskError, boundary
26
26
  from verifiers.v1.state import StateT
27
27
  from verifiers.v1.types import Messages, content_text
28
- from verifiers.v1.utils.artifacts import Artifact
28
+ from verifiers.v1.utils.artifacts import MAX_ARTIFACT_BYTES, Artifact
29
29
  from verifiers.v1.utils.decorators import (
30
30
  discover_decorated,
31
31
  invoke_all,
@@ -115,6 +115,8 @@ class TaskData(BaseModel):
115
115
  on top of the implicitly collected `/logs/artifacts/` convention dir. Declare
116
116
  runtime outputs that must cross that boundary. A declared path that is missing at
117
117
  collection time fails the rollout."""
118
+ artifact_max_bytes: int = Field(MAX_ARTIFACT_BYTES, gt=0)
119
+ """Total byte limit for collected artifact archives, including the convention dir."""
118
120
 
119
121
  timeout: TaskTimeout = TaskTimeout()
120
122
  resources: TaskResources = TaskResources()
@@ -40,7 +40,7 @@ from verifiers.v1.state import State
40
40
  from verifiers.v1.task import Task, TaskData, TaskResources, TaskTimeout
41
41
  from verifiers.v1.taskset import Taskset
42
42
  from verifiers.v1.trace import Trace
43
- from verifiers.v1.utils.artifacts import Artifact, collect
43
+ from verifiers.v1.utils.artifacts import MAX_ARTIFACT_BYTES, Artifact, collect
44
44
  from verifiers.v1.utils.decorators import reward
45
45
 
46
46
  logger = logging.getLogger(__name__)
@@ -61,6 +61,8 @@ class HarborTaskConfig(TaskConfig):
61
61
 
62
62
 
63
63
  class HarborConfig(TasksetConfig):
64
+ artifact_max_bytes: int = Field(MAX_ARTIFACT_BYTES, gt=0)
65
+ """Total byte limit for artifact archives transferred out of each solver runtime."""
64
66
  task: HarborTaskConfig = HarborTaskConfig()
65
67
  dataset: str = "harbor/hello-world"
66
68
  """A Harbor Hub package id ("org/name" or "org/name@ref"), where ref is a
@@ -272,7 +274,9 @@ class HarborTask(Task[HarborData, State, HarborTaskConfig]):
272
274
  f"{hook.command}\n{detail}"
273
275
  )
274
276
  if not self.scoring_deferred:
275
- trace.state.artifacts = await collect(runtime, self.data.artifacts)
277
+ trace.state.artifacts = await collect(
278
+ runtime, self.data.artifacts, max_bytes=self.data.artifact_max_bytes
279
+ )
276
280
 
277
281
  async def stage_verifier(self, trace: Trace, runtime: Runtime) -> None:
278
282
  if any(
@@ -582,6 +586,7 @@ def parse_task(task_dir: Path, idx: int, harbor_config: HarborConfig) -> HarborD
582
586
  )
583
587
  return HarborData(
584
588
  idx=idx,
589
+ artifact_max_bytes=harbor_config.artifact_max_bytes,
585
590
  name=harbor_task.name,
586
591
  description=task.description if task else None,
587
592
  prompt=harbor_task.instruction.strip(),
@@ -21,7 +21,7 @@ ARTIFACTS_DIR = "/logs/artifacts"
21
21
  """Implicit artifact directory; tasks that write here need no declaration."""
22
22
 
23
23
  MAX_ARTIFACT_BYTES = 32 * 1024 * 1024
24
- """Ceiling per collection. Sized for a delta, not a tree: the grading box boots from the
24
+ """Default ceiling per collection. Sized for a delta, not a tree: the grading box boots from the
25
25
  agent's image, so the repo is already there and only its output has to travel."""
26
26
 
27
27
 
@@ -35,7 +35,10 @@ class Artifact(BaseModel):
35
35
 
36
36
 
37
37
  async def collect(
38
- runtime: Runtime, artifacts: list[Artifact] | None = None
38
+ runtime: Runtime,
39
+ artifacts: list[Artifact] | None = None,
40
+ *,
41
+ max_bytes: int = MAX_ARTIFACT_BYTES,
39
42
  ) -> dict[str, bytes | None]:
40
43
  """Tar the convention dir and every declared path out of `runtime`.
41
44
 
@@ -114,7 +117,7 @@ async def collect(
114
117
  )
115
118
  existence.extend(output.splitlines())
116
119
  collected: dict[str, bytes | None] = {}
117
- budget = MAX_ARTIFACT_BYTES
120
+ budget = max_bytes
118
121
  for artifact, exists in zip(entries, existence, strict=True):
119
122
  source = artifact.source
120
123
  if exists != "1":