verifiers 0.3.2.dev30__tar.gz → 0.3.2.dev31__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.dev31}/PKG-INFO +1 -1
  2. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/utils/artifacts.py +53 -14
  3. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/.gitignore +0 -0
  4. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/LICENSE +0 -0
  5. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/README.md +0 -0
  6. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/pyproject.toml +0 -0
  7. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/tests/v1/conftest.py +0 -0
  8. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  9. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/tests/v1/fixtures/duet_v1.py +0 -0
  10. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
  11. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  12. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  13. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  14. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/tests/v1/fixtures/echo_v1.py +0 -0
  15. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/tests/v1/fixtures/pyproject.toml +0 -0
  16. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  17. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/tests/v1/test_color_codeword_tasks.py +0 -0
  18. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/tests/v1/test_configs.py +0 -0
  19. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/tests/v1/test_e2e.py +0 -0
  20. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/tests/v1/test_envs.py +0 -0
  21. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/tests/v1/test_graph.py +0 -0
  22. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/tests/v1/test_judges.py +0 -0
  23. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/tests/v1/test_scoring.py +0 -0
  24. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/tests/v1/test_taskset.py +0 -0
  25. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/tests/v1/test_trace.py +0 -0
  26. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/__init__.py +0 -0
  27. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/__init__.py +0 -0
  28. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/acp/__init__.py +0 -0
  29. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/acp/runner.py +0 -0
  30. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/agent.py +0 -0
  31. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/cli/__init__.py +0 -0
  32. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  33. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/cli/dashboard/base.py +0 -0
  34. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/cli/dashboard/eval.py +0 -0
  35. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/cli/dashboard/replay.py +0 -0
  36. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/cli/dashboard/validate.py +0 -0
  37. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/cli/debug.py +0 -0
  38. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/cli/eval/__init__.py +0 -0
  39. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/cli/eval/main.py +0 -0
  40. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/cli/eval/resume.py +0 -0
  41. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/cli/eval/runner.py +0 -0
  42. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/cli/gepa.py +0 -0
  43. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/cli/init.py +0 -0
  44. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/cli/output.py +0 -0
  45. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/cli/replay.py +0 -0
  46. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/cli/resolve.py +0 -0
  47. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/cli/resume.py +0 -0
  48. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/cli/validate.py +0 -0
  49. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/clients/__init__.py +0 -0
  50. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/clients/base.py +0 -0
  51. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/clients/client.py +0 -0
  52. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/clients/eval.py +0 -0
  53. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/clients/train.py +0 -0
  54. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/configs/__init__.py +0 -0
  55. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/configs/agent.py +0 -0
  56. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/configs/cli/__init__.py +0 -0
  57. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/configs/cli/debug.py +0 -0
  58. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/configs/cli/env.py +0 -0
  59. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/configs/cli/eval.py +0 -0
  60. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/configs/cli/init.py +0 -0
  61. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/configs/cli/replay.py +0 -0
  62. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/configs/cli/validate.py +0 -0
  63. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/configs/client.py +0 -0
  64. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/configs/env.py +0 -0
  65. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/configs/harness.py +0 -0
  66. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/configs/judge.py +0 -0
  67. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/configs/retries.py +0 -0
  68. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/configs/runtime.py +0 -0
  69. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/configs/serve.py +0 -0
  70. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/configs/task.py +0 -0
  71. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/configs/taskset.py +0 -0
  72. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/dialects/__init__.py +0 -0
  73. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/dialects/anthropic.py +0 -0
  74. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/dialects/base.py +0 -0
  75. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/dialects/chat.py +0 -0
  76. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/dialects/responses.py +0 -0
  77. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/env.py +0 -0
  78. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/envs/__init__.py +0 -0
  79. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
  80. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/envs/agentic_judge/env.py +0 -0
  81. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  82. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/envs/best_of_n/env.py +0 -0
  83. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/envs/shared_agentic_judge/__init__.py +0 -0
  84. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  85. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/envs/single_agent/env.py +0 -0
  86. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/envs/user_sim/__init__.py +0 -0
  87. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/envs/user_sim/env.py +0 -0
  88. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/episode.py +0 -0
  89. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/errors.py +0 -0
  90. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/gepa/__init__.py +0 -0
  91. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/gepa/adapter.py +0 -0
  92. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/gepa/config.py +0 -0
  93. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/gepa/dataset.py +0 -0
  94. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/gepa/reflection.py +0 -0
  95. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/gepa/runner.py +0 -0
  96. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/graph.py +0 -0
  97. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harness.py +0 -0
  98. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/__init__.py +0 -0
  99. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  100. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/bash/harness.py +0 -0
  101. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
  102. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
  103. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/browser_use/program.py +0 -0
  104. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  105. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
  106. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  107. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/codex/harness.py +0 -0
  108. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
  109. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
  110. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
  111. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  112. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  113. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  114. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  115. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  116. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/node.py +0 -0
  117. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/null/__init__.py +0 -0
  118. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/null/harness.py +0 -0
  119. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
  120. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/openclaw/harness.py +0 -0
  121. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  122. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/pi/harness.py +0 -0
  123. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/pool/__init__.py +0 -0
  124. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/pool/harness.py +0 -0
  125. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/prime_agent/__init__.py +0 -0
  126. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/prime_agent/harness.py +0 -0
  127. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  128. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  129. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  130. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  131. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  132. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/utils/__init__.py +0 -0
  133. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/utils/compaction.py +0 -0
  134. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/utils/core.py +0 -0
  135. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/utils/launch.py +0 -0
  136. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/harnesses/utils/mcp.py +0 -0
  137. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/interception/__init__.py +0 -0
  138. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/interception/base.py +0 -0
  139. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/interception/pool.py +0 -0
  140. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/interception/server.py +0 -0
  141. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/interception/tool.py +0 -0
  142. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  143. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/interception/tunnel/base.py +0 -0
  144. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/interception/tunnel/custom.py +0 -0
  145. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/interception/tunnel/prime.py +0 -0
  146. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/judge.py +0 -0
  147. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/judges/__init__.py +0 -0
  148. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/judges/reference.py +0 -0
  149. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/judges/reference.txt +0 -0
  150. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/judges/rubric.py +0 -0
  151. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/judges/rubric.txt +0 -0
  152. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/mcp/__init__.py +0 -0
  153. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/mcp/launch.py +0 -0
  154. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/mcp/server.py +0 -0
  155. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/mcp/toolset.py +0 -0
  156. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/rollout.py +0 -0
  157. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/runtimes/__init__.py +0 -0
  158. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/runtimes/base.py +0 -0
  159. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/runtimes/docker/__init__.py +0 -0
  160. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/runtimes/docker/egress.py +0 -0
  161. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/runtimes/limiters.py +0 -0
  162. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/runtimes/modal.py +0 -0
  163. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/runtimes/prime.py +0 -0
  164. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/runtimes/subprocess.py +0 -0
  165. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/semantic.py +0 -0
  166. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/serve/__init__.py +0 -0
  167. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/serve/client.py +0 -0
  168. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/serve/encoding.py +0 -0
  169. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/serve/pool.py +0 -0
  170. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/serve/server.py +0 -0
  171. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/serve/types.py +0 -0
  172. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/session.py +0 -0
  173. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/state.py +0 -0
  174. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/task.py +0 -0
  175. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/taskset.py +0 -0
  176. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/tasksets/__init__.py +0 -0
  177. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  178. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/tasksets/harbor/env.py +0 -0
  179. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  180. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  181. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  182. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  183. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/tasksets/nemo_gym/__init__.py +0 -0
  184. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/tasksets/nemo_gym/response.py +0 -0
  185. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/tasksets/nemo_gym/server.py +0 -0
  186. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/tasksets/nemo_gym/taskset.py +0 -0
  187. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/tasksets/nemo_gym/toolset.py +0 -0
  188. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  189. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  190. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  191. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  192. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/trace.py +0 -0
  193. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/types.py +0 -0
  194. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/utils/__init__.py +0 -0
  195. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/utils/aio.py +0 -0
  196. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/utils/compile.py +0 -0
  197. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/utils/decorators.py +0 -0
  198. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/utils/format.py +0 -0
  199. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/utils/generic.py +0 -0
  200. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/utils/git.py +0 -0
  201. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/utils/image.py +0 -0
  202. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/utils/interrupt.py +0 -0
  203. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/utils/loaders.py +0 -0
  204. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/utils/logging.py +0 -0
  205. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/utils/memory.py +0 -0
  206. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/utils/paths.py +0 -0
  207. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/utils/platform.py +0 -0
  208. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/utils/prime.py +0 -0
  209. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/utils/retries.py +0 -0
  210. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/verifiers/v1/utils/score.py +0 -0
  211. {verifiers-0.3.2.dev30 → verifiers-0.3.2.dev31}/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.dev31
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
@@ -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