verifiers 0.3.2.dev30__tar.gz → 0.3.2.dev32__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 (211) hide show
  1. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/PKG-INFO +1 -1
  2. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/tests/v1/fixtures/echo_agentic_v1.py +0 -7
  3. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/agent.py +23 -5
  4. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/envs/agentic_judge/env.py +1 -1
  5. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/rollout.py +10 -5
  6. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/utils/artifacts.py +53 -14
  7. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/.gitignore +0 -0
  8. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/LICENSE +0 -0
  9. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/README.md +0 -0
  10. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/pyproject.toml +0 -0
  11. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/tests/v1/conftest.py +0 -0
  12. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  13. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/tests/v1/fixtures/duet_v1.py +0 -0
  14. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
  15. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  16. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  17. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/tests/v1/fixtures/echo_v1.py +0 -0
  18. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/tests/v1/fixtures/pyproject.toml +0 -0
  19. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  20. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/tests/v1/test_color_codeword_tasks.py +0 -0
  21. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/tests/v1/test_configs.py +0 -0
  22. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/tests/v1/test_e2e.py +0 -0
  23. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/tests/v1/test_envs.py +0 -0
  24. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/tests/v1/test_graph.py +0 -0
  25. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/tests/v1/test_judges.py +0 -0
  26. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/tests/v1/test_scoring.py +0 -0
  27. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/tests/v1/test_taskset.py +0 -0
  28. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/tests/v1/test_trace.py +0 -0
  29. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/__init__.py +0 -0
  30. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/__init__.py +0 -0
  31. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/acp/__init__.py +0 -0
  32. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/acp/runner.py +0 -0
  33. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/cli/__init__.py +0 -0
  34. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  35. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/cli/dashboard/base.py +0 -0
  36. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/cli/dashboard/eval.py +0 -0
  37. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/cli/dashboard/replay.py +0 -0
  38. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/cli/dashboard/validate.py +0 -0
  39. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/cli/debug.py +0 -0
  40. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/cli/eval/__init__.py +0 -0
  41. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/cli/eval/main.py +0 -0
  42. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/cli/eval/resume.py +0 -0
  43. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/cli/eval/runner.py +0 -0
  44. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/cli/gepa.py +0 -0
  45. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/cli/init.py +0 -0
  46. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/cli/output.py +0 -0
  47. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/cli/replay.py +0 -0
  48. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/cli/resolve.py +0 -0
  49. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/cli/resume.py +0 -0
  50. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/cli/validate.py +0 -0
  51. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/clients/__init__.py +0 -0
  52. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/clients/base.py +0 -0
  53. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/clients/client.py +0 -0
  54. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/clients/eval.py +0 -0
  55. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/clients/train.py +0 -0
  56. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/configs/__init__.py +0 -0
  57. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/configs/agent.py +0 -0
  58. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/configs/cli/__init__.py +0 -0
  59. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/configs/cli/debug.py +0 -0
  60. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/configs/cli/env.py +0 -0
  61. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/configs/cli/eval.py +0 -0
  62. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/configs/cli/init.py +0 -0
  63. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/configs/cli/replay.py +0 -0
  64. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/configs/cli/validate.py +0 -0
  65. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/configs/client.py +0 -0
  66. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/configs/env.py +0 -0
  67. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/configs/harness.py +0 -0
  68. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/configs/judge.py +0 -0
  69. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/configs/retries.py +0 -0
  70. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/configs/runtime.py +0 -0
  71. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/configs/serve.py +0 -0
  72. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/configs/task.py +0 -0
  73. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/configs/taskset.py +0 -0
  74. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/dialects/__init__.py +0 -0
  75. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/dialects/anthropic.py +0 -0
  76. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/dialects/base.py +0 -0
  77. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/dialects/chat.py +0 -0
  78. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/dialects/responses.py +0 -0
  79. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/env.py +0 -0
  80. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/envs/__init__.py +0 -0
  81. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
  82. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  83. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/envs/best_of_n/env.py +0 -0
  84. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/envs/shared_agentic_judge/__init__.py +0 -0
  85. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  86. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/envs/single_agent/env.py +0 -0
  87. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/envs/user_sim/__init__.py +0 -0
  88. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/envs/user_sim/env.py +0 -0
  89. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/episode.py +0 -0
  90. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/errors.py +0 -0
  91. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/gepa/__init__.py +0 -0
  92. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/gepa/adapter.py +0 -0
  93. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/gepa/config.py +0 -0
  94. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/gepa/dataset.py +0 -0
  95. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/gepa/reflection.py +0 -0
  96. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/gepa/runner.py +0 -0
  97. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/graph.py +0 -0
  98. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harness.py +0 -0
  99. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/__init__.py +0 -0
  100. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  101. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/bash/harness.py +0 -0
  102. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
  103. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
  104. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/browser_use/program.py +0 -0
  105. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  106. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
  107. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  108. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/codex/harness.py +0 -0
  109. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
  110. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
  111. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
  112. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  113. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  114. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  115. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  116. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  117. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/node.py +0 -0
  118. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/null/__init__.py +0 -0
  119. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/null/harness.py +0 -0
  120. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
  121. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/openclaw/harness.py +0 -0
  122. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  123. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/pi/harness.py +0 -0
  124. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/pool/__init__.py +0 -0
  125. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/pool/harness.py +0 -0
  126. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/prime_agent/__init__.py +0 -0
  127. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/prime_agent/harness.py +0 -0
  128. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  129. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  130. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  131. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  132. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  133. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/utils/__init__.py +0 -0
  134. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/utils/compaction.py +0 -0
  135. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/utils/core.py +0 -0
  136. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/utils/launch.py +0 -0
  137. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/harnesses/utils/mcp.py +0 -0
  138. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/interception/__init__.py +0 -0
  139. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/interception/base.py +0 -0
  140. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/interception/pool.py +0 -0
  141. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/interception/server.py +0 -0
  142. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/interception/tool.py +0 -0
  143. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  144. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/interception/tunnel/base.py +0 -0
  145. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/interception/tunnel/custom.py +0 -0
  146. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/interception/tunnel/prime.py +0 -0
  147. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/judge.py +0 -0
  148. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/judges/__init__.py +0 -0
  149. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/judges/reference.py +0 -0
  150. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/judges/reference.txt +0 -0
  151. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/judges/rubric.py +0 -0
  152. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/judges/rubric.txt +0 -0
  153. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/mcp/__init__.py +0 -0
  154. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/mcp/launch.py +0 -0
  155. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/mcp/server.py +0 -0
  156. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/mcp/toolset.py +0 -0
  157. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/runtimes/__init__.py +0 -0
  158. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/runtimes/base.py +0 -0
  159. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/runtimes/docker/__init__.py +0 -0
  160. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/runtimes/docker/egress.py +0 -0
  161. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/runtimes/limiters.py +0 -0
  162. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/runtimes/modal.py +0 -0
  163. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/runtimes/prime.py +0 -0
  164. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/runtimes/subprocess.py +0 -0
  165. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/semantic.py +0 -0
  166. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/serve/__init__.py +0 -0
  167. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/serve/client.py +0 -0
  168. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/serve/encoding.py +0 -0
  169. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/serve/pool.py +0 -0
  170. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/serve/server.py +0 -0
  171. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/serve/types.py +0 -0
  172. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/session.py +0 -0
  173. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/state.py +0 -0
  174. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/task.py +0 -0
  175. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/taskset.py +0 -0
  176. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/tasksets/__init__.py +0 -0
  177. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  178. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/tasksets/harbor/env.py +0 -0
  179. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  180. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  181. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  182. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  183. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/tasksets/nemo_gym/__init__.py +0 -0
  184. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/tasksets/nemo_gym/response.py +0 -0
  185. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/tasksets/nemo_gym/server.py +0 -0
  186. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/tasksets/nemo_gym/taskset.py +0 -0
  187. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/tasksets/nemo_gym/toolset.py +0 -0
  188. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  189. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  190. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  191. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  192. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/trace.py +0 -0
  193. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/types.py +0 -0
  194. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/utils/__init__.py +0 -0
  195. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/utils/aio.py +0 -0
  196. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/utils/compile.py +0 -0
  197. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/utils/decorators.py +0 -0
  198. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/utils/format.py +0 -0
  199. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/utils/generic.py +0 -0
  200. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/utils/git.py +0 -0
  201. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/utils/image.py +0 -0
  202. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/utils/interrupt.py +0 -0
  203. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/utils/loaders.py +0 -0
  204. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/utils/logging.py +0 -0
  205. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/utils/memory.py +0 -0
  206. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/utils/paths.py +0 -0
  207. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/utils/platform.py +0 -0
  208. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/utils/prime.py +0 -0
  209. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/utils/retries.py +0 -0
  210. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/verifiers/v1/utils/score.py +0 -0
  211. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev32}/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.dev30
3
+ Version: 0.3.2.dev32
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
@@ -31,13 +31,6 @@ class EchoAgenticData(vf.TaskData):
31
31
 
32
32
 
33
33
  class EchoAgenticTask(vf.Task[EchoAgenticData]):
34
- async def finalize(self, trace: vf.Trace, runtime: Runtime) -> None:
35
- # Subprocess uses a runtime-owned temporary cwd, not a restorable absolute
36
- # path; isolated agentic judging requires a container anyway.
37
- if runtime.type == "subprocess":
38
- return
39
- trace.state.artifacts = await vf.collect(runtime, self.data.artifacts)
40
-
41
34
  @vf.reward(weight=1.0)
42
35
  async def wrote_phrase(self, runtime: Runtime) -> float:
43
36
  try:
@@ -362,21 +362,26 @@ class Agent:
362
362
  runtime: Runtime | None = None,
363
363
  tools: Mapping[str, SharedToolServer] | None = None,
364
364
  on_trace: Callable[[Trace], None] | None = None,
365
+ collect_artifacts: bool = False,
365
366
  ) -> Trace:
366
367
  """Run this agent on `task` once and return the trace: one segment — the
367
368
  program runs on the task's prompt until it exits (a multi-turn exchange
368
369
  is `interaction()`). `runtime` places it into a live borrowed box instead of
369
370
  provisioning one; `tools` are live servers borrowed from their
370
371
  owner, counted in the pairing check; `on_trace` observes the trace the
371
- moment it's minted, before any I/O. Retries whole while the trace ends
372
- with a retryable error (`config.retries`) — never into a borrowed box;
373
- the final trace keeps earlier attempts' errors."""
372
+ moment it's minted, before any I/O. `collect_artifacts` captures the task's
373
+ declared artifacts after its finalizer while its container runtime is still
374
+ alive. Retries whole while the trace ends with a retryable error
375
+ (`config.retries`) — never into a borrowed box; the final trace keeps earlier
376
+ attempts' errors."""
374
377
  if self._closed:
375
378
  raise RuntimeError("Agent is closed; create a new agent")
376
379
  retry = self.config.retries
377
380
  history: list = []
378
381
  for attempt in range(retry.max_retries + 1):
379
- trace = await self._run_once(task, runtime, tools, on_trace)
382
+ trace = await self._run_once(
383
+ task, runtime, tools, on_trace, collect_artifacts
384
+ )
380
385
  if attempt == retry.max_retries or not trace_should_retry(trace, retry):
381
386
  break
382
387
  if runtime is not None:
@@ -407,9 +412,20 @@ class Agent:
407
412
  runtime: Runtime | None,
408
413
  shared_tools: Mapping[str, SharedToolServer] | None,
409
414
  on_trace: Callable[[Trace], None] | None,
415
+ collect_artifacts: bool,
410
416
  ) -> Trace:
411
417
  params = self._rollout_params(task, runtime, dict(shared_tools or {}))
412
- run = Rollout(task=task, on_trace=on_trace, **params)
418
+ if collect_artifacts and isinstance(params["runtime_config"], SubprocessConfig):
419
+ raise TypeError(
420
+ "artifact collection requires a container runtime; subprocess "
421
+ "artifacts live in a host-only temporary working directory"
422
+ )
423
+ run = Rollout(
424
+ task=task,
425
+ on_trace=on_trace,
426
+ collect_artifacts=collect_artifacts,
427
+ **params,
428
+ )
413
429
  try:
414
430
  if await run.open():
415
431
  await run.step()
@@ -626,6 +642,7 @@ class _EpisodeAgent(Agent):
626
642
  runtime: Runtime | None = None,
627
643
  tools: Mapping[str, SharedToolServer] | None = None,
628
644
  on_trace: Callable[[Trace], None] | None = None,
645
+ collect_artifacts: bool = False,
629
646
  ) -> Trace:
630
647
  async with self._gate or nullcontext():
631
648
  trace = await super().run(
@@ -633,6 +650,7 @@ class _EpisodeAgent(Agent):
633
650
  runtime=runtime,
634
651
  tools=tools if tools is not None else self._shared_for(task),
635
652
  on_trace=self._watch(on_trace),
653
+ collect_artifacts=collect_artifacts,
636
654
  )
637
655
  self._completed.append(trace)
638
656
  return trace
@@ -342,7 +342,7 @@ class IsolatedAgenticJudgeEnv(AgenticJudgeEnv):
342
342
  """Judge only collected artifacts in a fresh box with the solver's policy."""
343
343
 
344
344
  async def run(self, task: vf.Task, agents: vf.Agents) -> None:
345
- solution = await agents.solver.run(task)
345
+ solution = await agents.solver.run(task, collect_artifacts=True)
346
346
  if not solution.ok:
347
347
  raise RuntimeError("the solver's rollout failed, so the judge never ran")
348
348
  await agents.judge.run(
@@ -32,6 +32,7 @@ from verifiers.v1.state import state_cls
32
32
  from verifiers.v1.task import Task
33
33
  from verifiers.v1.trace import AgentInfo, Trace, TraceTask
34
34
  from verifiers.v1.types import Messages, Request, Response, SystemMessage, UserMessage
35
+ from verifiers.v1.utils.artifacts import collect
35
36
  from verifiers.v1.utils.decorators import discover_decorated, invoke
36
37
 
37
38
  logger = logging.getLogger(__name__)
@@ -69,6 +70,7 @@ class Rollout:
69
70
  interception: Interception | None = None,
70
71
  runtime: Runtime | None = None,
71
72
  on_trace: Callable[[Trace], None] | None = None,
73
+ collect_artifacts: bool = False,
72
74
  ) -> None:
73
75
  self.task = task
74
76
  self.harness = harness
@@ -81,6 +83,7 @@ class Rollout:
81
83
  self._interception = interception
82
84
  self.runtime = runtime
83
85
  self._borrowed_runtime = runtime
86
+ self._collect_artifacts = collect_artifacts
84
87
  self.trace: Trace = Trace(
85
88
  task=TraceTask(
86
89
  type=type(task).__name__,
@@ -466,12 +469,14 @@ class Rollout:
466
469
  if not self._failed and self._opened:
467
470
  trace.timing.finalize.start = time.time()
468
471
  async with boundary(TaskError, "task finalize"):
469
- await asyncio.wait_for(
470
- invoke(
472
+ async with asyncio.timeout(self._timeouts.finalize):
473
+ await invoke(
471
474
  self.task.finalize, {"trace": trace, "runtime": runtime}
472
- ),
473
- self._timeouts.finalize,
474
- )
475
+ )
476
+ if self._collect_artifacts and not trace.state.artifacts:
477
+ trace.state.artifacts = await collect(
478
+ runtime, self.task.data.artifacts
479
+ )
475
480
  now = time.time()
476
481
  trace.timing.finalize.end = now
477
482
  trace.timing.scoring.start = now
@@ -1,9 +1,11 @@
1
- """Artifact collection and restoration across runtimes."""
1
+ """Bounded, validated artifact collection and restoration across runtimes."""
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import io
5
6
  import logging
6
7
  import shlex
8
+ import tarfile
7
9
  import uuid
8
10
  from pathlib import PurePosixPath
9
11
  from typing import TYPE_CHECKING
@@ -110,7 +112,12 @@ async def collect(
110
112
 
111
113
 
112
114
  async def restore(runtime: Runtime, collected: dict[str, bytes | None]) -> None:
113
- """Extract `collected` in `runtime` at the original absolute paths."""
115
+ """Extract `collected` in `runtime` at the original absolute paths.
116
+
117
+ Archive bytes are untrusted: the agent controls both their source files and the
118
+ runtime tooling that creates them. Every archive is therefore validated on the host
119
+ before the grading runtime is changed. Only regular files and directories travel.
120
+ """
114
121
  if not collected:
115
122
  return
116
123
  # Restoring into the subprocess runtime would extract absolute paths onto the
@@ -120,6 +127,8 @@ async def restore(runtime: Runtime, collected: dict[str, bytes | None]) -> None:
120
127
  "refusing to restore artifacts into the subprocess runtime: extraction "
121
128
  "writes to absolute paths on the host. Grade in a container."
122
129
  )
130
+ for root, archive in collected.items():
131
+ _validate_restore(root, archive)
123
132
  # Clear every root up front, not per entry: a later nested root would otherwise
124
133
  # delete content an earlier one just restored. Clearing also drops any file or
125
134
  # symlink the image left at the target.
@@ -141,23 +150,16 @@ async def _tar_out(runtime: Runtime, artifact: Artifact, budget: int) -> bytes:
141
150
  path = f"/tmp/vf-artifact-{uuid.uuid4().hex}.tar"
142
151
  excludes = " ".join(f"--exclude={shlex.quote(p)}" for p in artifact.exclude)
143
152
  try:
153
+ # macOS tar otherwise adds AppleDouble sidecars next to a directory root.
144
154
  await _run(
145
155
  runtime,
146
- f"tar -cf {shlex.quote(path)} -C / {excludes} -- "
156
+ f"COPYFILE_DISABLE=1 tar -cf {shlex.quote(path)} -C / {excludes} -- "
147
157
  f"{shlex.quote(artifact.source.lstrip('/'))}",
148
158
  f"collect artifact {artifact.source!r}",
149
159
  )
150
- # Size it in the box: an oversized collection is refused before it reaches host
151
- # memory, not after.
152
- sized = await runtime.run(["sh", "-c", f"wc -c < {shlex.quote(path)}"], {})
153
- if (raw := sized.stdout.strip()).isdigit() and int(raw) > budget:
154
- raise RuntimeError(
155
- f"artifact {artifact.source!r} takes the collection over the "
156
- f"{MAX_ARTIFACT_BYTES} byte limit. The grading box boots from the "
157
- "agent's image, so only the delta needs to travel — narrow the source "
158
- "or add `exclude` patterns."
159
- )
160
- return await runtime.read(path)
160
+ # The runtime enforces the remaining collection budget while transferring the
161
+ # bytes, so replacing or growing the archive cannot race a separate size probe.
162
+ return await runtime.read(path, max_bytes=budget)
161
163
  finally:
162
164
  # Best-effort: the box is about to be destroyed and the name is unique per call.
163
165
  try:
@@ -166,6 +168,43 @@ async def _tar_out(runtime: Runtime, artifact: Artifact, budget: int) -> bytes:
166
168
  logger.debug("failed to remove %s", path, exc_info=True)
167
169
 
168
170
 
171
+ def _validate_restore(root: str, archive: bytes | None) -> None:
172
+ """Reject archive content that could restore outside its declared root."""
173
+ root_path = PurePosixPath(root)
174
+ if (
175
+ root_path.anchor != "/"
176
+ or ".." in root_path.parts
177
+ or root_path == PurePosixPath("/")
178
+ ):
179
+ raise RuntimeError(
180
+ f"artifact root {root!r} must be an absolute path below '/' with no '..'"
181
+ )
182
+ if archive is None:
183
+ return
184
+
185
+ try:
186
+ with tarfile.open(fileobj=io.BytesIO(archive), mode="r:") as tar:
187
+ for member in tar:
188
+ member_path = PurePosixPath(member.name)
189
+ destination = PurePosixPath("/") / member_path
190
+ if (
191
+ not member.name
192
+ or member_path.is_absolute()
193
+ or ".." in member_path.parts
194
+ or not destination.is_relative_to(root_path)
195
+ ):
196
+ raise RuntimeError(
197
+ f"artifact member {member.name!r} is outside declared root "
198
+ f"{root!r}"
199
+ )
200
+ if not (member.isfile() or member.isdir()):
201
+ raise RuntimeError(
202
+ f"artifact member {member.name!r} is a link or special file"
203
+ )
204
+ except tarfile.TarError as exc:
205
+ raise RuntimeError(f"unreadable artifact archive for {root!r}: {exc}") from exc
206
+
207
+
169
208
  async def _run(runtime: Runtime, command: str, action: str) -> None:
170
209
  result = await runtime.run(["sh", "-c", command], {})
171
210
  if result.exit_code:
File without changes