verifiers 0.3.2.dev51__tar.gz → 0.3.2.dev53__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 (215) hide show
  1. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/PKG-INFO +1 -1
  2. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/tests/v1/test_e2e.py +34 -0
  3. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/tests/v1/test_trace.py +128 -0
  4. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/acp/__init__.py +5 -6
  5. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/rlm/harness.py +5 -1
  6. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/semantic.py +2 -2
  7. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/serve/client.py +6 -2
  8. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/trace.py +22 -6
  9. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/.gitignore +0 -0
  10. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/LICENSE +0 -0
  11. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/README.md +0 -0
  12. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/pyproject.toml +0 -0
  13. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/tests/v1/conftest.py +0 -0
  14. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  15. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/tests/v1/fixtures/duet_v1.py +0 -0
  16. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
  17. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  18. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  19. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  20. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/tests/v1/fixtures/echo_v1.py +0 -0
  21. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/tests/v1/fixtures/pyproject.toml +0 -0
  22. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  23. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/tests/v1/test_color_codeword_tasks.py +0 -0
  24. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/tests/v1/test_configs.py +0 -0
  25. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/tests/v1/test_envs.py +0 -0
  26. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/tests/v1/test_graph.py +0 -0
  27. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/tests/v1/test_judges.py +0 -0
  28. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/tests/v1/test_scoring.py +0 -0
  29. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/tests/v1/test_taskset.py +0 -0
  30. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/__init__.py +0 -0
  31. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/cli/commands/init.py +0 -0
  32. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/__init__.py +0 -0
  33. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/acp/runner.py +0 -0
  34. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/agent.py +0 -0
  35. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/cli/__init__.py +0 -0
  36. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  37. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/cli/dashboard/base.py +0 -0
  38. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/cli/dashboard/eval.py +0 -0
  39. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/cli/dashboard/replay.py +0 -0
  40. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/cli/dashboard/validate.py +0 -0
  41. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/cli/debug.py +0 -0
  42. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/cli/eval/__init__.py +0 -0
  43. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/cli/eval/main.py +0 -0
  44. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/cli/eval/resume.py +0 -0
  45. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/cli/eval/runner.py +0 -0
  46. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/cli/gepa.py +0 -0
  47. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/cli/init.py +0 -0
  48. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/cli/output.py +0 -0
  49. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/cli/replay.py +0 -0
  50. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/cli/resolve.py +0 -0
  51. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/cli/resume.py +0 -0
  52. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/cli/validate.py +0 -0
  53. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/clients/__init__.py +0 -0
  54. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/clients/base.py +0 -0
  55. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/clients/client.py +0 -0
  56. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/clients/eval.py +0 -0
  57. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/clients/train.py +0 -0
  58. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/configs/__init__.py +0 -0
  59. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/configs/agent.py +0 -0
  60. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/configs/cli/__init__.py +0 -0
  61. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/configs/cli/debug.py +0 -0
  62. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/configs/cli/env.py +0 -0
  63. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/configs/cli/eval.py +0 -0
  64. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/configs/cli/init.py +0 -0
  65. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/configs/cli/replay.py +0 -0
  66. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/configs/cli/validate.py +0 -0
  67. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/configs/client.py +0 -0
  68. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/configs/env.py +0 -0
  69. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/configs/harness.py +0 -0
  70. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/configs/judge.py +0 -0
  71. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/configs/retries.py +0 -0
  72. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/configs/runtime.py +0 -0
  73. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/configs/serve.py +0 -0
  74. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/configs/task.py +0 -0
  75. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/configs/taskset.py +0 -0
  76. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/dialects/__init__.py +0 -0
  77. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/dialects/anthropic.py +0 -0
  78. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/dialects/base.py +0 -0
  79. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/dialects/chat.py +0 -0
  80. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/dialects/responses.py +0 -0
  81. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/env.py +0 -0
  82. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/envs/__init__.py +0 -0
  83. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
  84. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/envs/agentic_judge/env.py +0 -0
  85. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  86. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/envs/best_of_n/env.py +0 -0
  87. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/envs/isolated_verifier/__init__.py +0 -0
  88. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/envs/isolated_verifier/env.py +0 -0
  89. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/envs/shared_agentic_judge/__init__.py +0 -0
  90. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  91. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/envs/single_agent/env.py +0 -0
  92. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/envs/user_sim/__init__.py +0 -0
  93. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/envs/user_sim/env.py +0 -0
  94. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/episode.py +0 -0
  95. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/errors.py +0 -0
  96. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/gepa/__init__.py +0 -0
  97. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/gepa/adapter.py +0 -0
  98. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/gepa/config.py +0 -0
  99. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/gepa/dataset.py +0 -0
  100. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/gepa/reflection.py +0 -0
  101. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/gepa/runner.py +0 -0
  102. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/graph.py +0 -0
  103. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harness.py +0 -0
  104. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/__init__.py +0 -0
  105. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  106. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/bash/harness.py +0 -0
  107. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
  108. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
  109. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/browser_use/program.py +0 -0
  110. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  111. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
  112. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  113. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/codex/harness.py +0 -0
  114. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
  115. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
  116. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
  117. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  118. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  119. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  120. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  121. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  122. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/node.py +0 -0
  123. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/null/__init__.py +0 -0
  124. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/null/harness.py +0 -0
  125. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
  126. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/openclaw/harness.py +0 -0
  127. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  128. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/pi/harness.py +0 -0
  129. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/pool/__init__.py +0 -0
  130. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/pool/harness.py +0 -0
  131. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/prime_agent/__init__.py +0 -0
  132. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/prime_agent/harness.py +0 -0
  133. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  134. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  135. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  136. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  137. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/utils/__init__.py +0 -0
  138. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/utils/compaction.py +0 -0
  139. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/utils/core.py +0 -0
  140. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/utils/install.py +0 -0
  141. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/utils/launch.py +0 -0
  142. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/harnesses/utils/mcp.py +0 -0
  143. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/interception/__init__.py +0 -0
  144. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/interception/base.py +0 -0
  145. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/interception/pool.py +0 -0
  146. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/interception/server.py +0 -0
  147. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/interception/tool.py +0 -0
  148. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  149. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/interception/tunnel/base.py +0 -0
  150. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/interception/tunnel/custom.py +0 -0
  151. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/interception/tunnel/prime.py +0 -0
  152. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/judge.py +0 -0
  153. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/judges/__init__.py +0 -0
  154. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/judges/reference.py +0 -0
  155. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/judges/reference.txt +0 -0
  156. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/judges/rubric.py +0 -0
  157. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/judges/rubric.txt +0 -0
  158. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/mcp/__init__.py +0 -0
  159. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/mcp/launch.py +0 -0
  160. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/mcp/server.py +0 -0
  161. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/mcp/toolset.py +0 -0
  162. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/rollout.py +0 -0
  163. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/runtimes/__init__.py +0 -0
  164. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/runtimes/base.py +0 -0
  165. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/runtimes/docker/__init__.py +0 -0
  166. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/runtimes/docker/egress.py +0 -0
  167. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/runtimes/limiters.py +0 -0
  168. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/runtimes/modal.py +0 -0
  169. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/runtimes/prime.py +0 -0
  170. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/runtimes/subprocess.py +0 -0
  171. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/serve/__init__.py +0 -0
  172. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/serve/encoding.py +0 -0
  173. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/serve/pool.py +0 -0
  174. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/serve/server.py +0 -0
  175. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/serve/types.py +0 -0
  176. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/session.py +0 -0
  177. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/state.py +0 -0
  178. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/task.py +0 -0
  179. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/taskset.py +0 -0
  180. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/tasksets/__init__.py +0 -0
  181. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  182. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/tasksets/harbor/env.py +0 -0
  183. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  184. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  185. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  186. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  187. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/tasksets/nemo_gym/__init__.py +0 -0
  188. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/tasksets/nemo_gym/response.py +0 -0
  189. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/tasksets/nemo_gym/server.py +0 -0
  190. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/tasksets/nemo_gym/taskset.py +0 -0
  191. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/tasksets/nemo_gym/toolset.py +0 -0
  192. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  193. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  194. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  195. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  196. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/types.py +0 -0
  197. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/utils/__init__.py +0 -0
  198. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/utils/aio.py +0 -0
  199. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/utils/artifacts.py +0 -0
  200. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/utils/compile.py +0 -0
  201. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/utils/decorators.py +0 -0
  202. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/utils/format.py +0 -0
  203. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/utils/generic.py +0 -0
  204. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/utils/git.py +0 -0
  205. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/utils/image.py +0 -0
  206. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/utils/interrupt.py +0 -0
  207. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/utils/loaders.py +0 -0
  208. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/utils/logging.py +0 -0
  209. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/utils/memory.py +0 -0
  210. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/utils/paths.py +0 -0
  211. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/utils/platform.py +0 -0
  212. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/utils/prime.py +0 -0
  213. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/utils/retries.py +0 -0
  214. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/verifiers/v1/utils/score.py +0 -0
  215. {verifiers-0.3.2.dev51 → verifiers-0.3.2.dev53}/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.dev51
3
+ Version: 0.3.2.dev53
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
@@ -5,6 +5,9 @@ combinations a test runs — every axis value at least once plus the cross-bound
5
5
  with distinct networking — instead of fanning the full cross product. prime/modal rows
6
6
  are local-only (their marks are excluded in CI)."""
7
7
 
8
+ import subprocess
9
+ import sys
10
+
8
11
  import pytest
9
12
 
10
13
  mark = pytest.mark
@@ -675,6 +678,37 @@ async def test_multi_agent_env_server(run_v1_server, tmp_path):
675
678
  assert trace.metrics["duet"] == 1.0
676
679
 
677
680
 
681
+ # `_request` parks a cancelled run's fire-and-forget cancel in `_cancel_tasks` with a
682
+ # `discard` done-callback. One loop turn later the sends have finished but the callbacks
683
+ # are still queued behind us, so `close()` meets a set of finished tasks.
684
+ CLOSE_WITH_FINISHED_CANCELS = """
685
+ import asyncio, uuid
686
+ from verifiers.v1.serve.client import EnvClient
687
+
688
+ async def main():
689
+ client = EnvClient("tcp://127.0.0.1:1")
690
+ for _ in range(3):
691
+ task = asyncio.get_running_loop().create_task(client._send_cancel(uuid.uuid4().hex))
692
+ client._cancel_tasks.add(task)
693
+ task.add_done_callback(client._cancel_tasks.discard)
694
+ await asyncio.sleep(0)
695
+ assert all(task.done() for task in client._cancel_tasks) and client._cancel_tasks
696
+ await client.close()
697
+
698
+ asyncio.run(main())
699
+ """
700
+
701
+
702
+ def test_env_client_close_drains_finished_cancels():
703
+ """`close()` returns once every fire-and-forget cancel has run, also when all of them
704
+ finished before it looked: the state Ctrl-C leaves behind in served mode. A child
705
+ process bounds the check, since a `close()` that never yields to the loop never lets
706
+ an in-loop timeout fire either."""
707
+ subprocess.run(
708
+ [sys.executable, "-c", CLOSE_WITH_FINISHED_CANCELS], check=True, timeout=30
709
+ )
710
+
711
+
678
712
  @pytest.mark.e2e
679
713
  async def test_replay_round_trip(run_v1, tmp_path):
680
714
  """eval -> replay -> replay-the-replay. Offline re-scoring must preserve the saved
@@ -434,6 +434,134 @@ def test_acp_semantic_edge_metadata_is_optional():
434
434
  assert all(not node.semantic_parents for node in trace.nodes)
435
435
 
436
436
 
437
+ def test_acp_derives_compaction_attempt_branch_trainability():
438
+ trace = vf.Trace(
439
+ agent=vf.AgentInfo(config=vf.AgentConfig()),
440
+ task=vf.TraceTask(type="Task", data=vf.TaskData(idx=0, prompt="q")),
441
+ nodes=[
442
+ MessageNode(parent=None, message=UserMessage(content="work")),
443
+ MessageNode(
444
+ parent=0,
445
+ message=AssistantMessage(content="working"),
446
+ sampled=True,
447
+ token_ids=[1],
448
+ mask=[True],
449
+ logprobs=[-0.1],
450
+ ),
451
+ MessageNode(parent=1, message=UserMessage(content="summarize")),
452
+ MessageNode(
453
+ parent=2,
454
+ message=AssistantMessage(content="bad tool call"),
455
+ sampled=True,
456
+ token_ids=[2, 3],
457
+ mask=[True, True],
458
+ logprobs=[-0.2, -0.3],
459
+ ),
460
+ MessageNode(
461
+ parent=2,
462
+ message=AssistantMessage(content="accepted summary"),
463
+ sampled=True,
464
+ token_ids=[4, 5],
465
+ mask=[True, True],
466
+ logprobs=[-0.4, -0.5],
467
+ ),
468
+ MessageNode(parent=0, message=UserMessage(content="compacted context")),
469
+ MessageNode(
470
+ parent=5,
471
+ message=AssistantMessage(content="answer"),
472
+ sampled=True,
473
+ token_ids=[6],
474
+ mask=[True],
475
+ logprobs=[-0.6],
476
+ ),
477
+ ],
478
+ calls=[
479
+ vf.ModelCall(node=1, acp=vf.ACPInfo(request_id="work")),
480
+ vf.ModelCall(node=3, acp=vf.ACPInfo(request_id="rejected")),
481
+ vf.ModelCall(node=4, acp=vf.ACPInfo(request_id="accepted")),
482
+ vf.ModelCall(node=6, acp=vf.ACPInfo(request_id="resumed")),
483
+ ],
484
+ )
485
+ harness = RLMHarness(RLMHarnessConfig(id="rlm"))
486
+ harness._consume_protocol_metadata(
487
+ trace,
488
+ {
489
+ ACP_SEMANTIC_EDGES_METADATA_KEY: {
490
+ "edges": [
491
+ {
492
+ "source_request_id": "work",
493
+ "target_request_id": "rejected",
494
+ "type": "compaction_attempt",
495
+ },
496
+ {
497
+ "source_request_id": "work",
498
+ "target_request_id": "accepted",
499
+ "type": "compaction_attempt",
500
+ },
501
+ ]
502
+ },
503
+ },
504
+ )
505
+
506
+ attempts = {branch.nodes[-1].message.content: branch for branch in trace.branches}
507
+ assert attempts["bad tool call"].trainable is False
508
+ assert attempts["accepted summary"].trainable is False
509
+
510
+ harness._consume_protocol_metadata(
511
+ trace,
512
+ {
513
+ ACP_SEMANTIC_EDGES_METADATA_KEY: {
514
+ "edges": [
515
+ {
516
+ "source_request_id": "work",
517
+ "target_request_id": "rejected",
518
+ "type": "compaction_attempt",
519
+ },
520
+ {
521
+ "source_request_id": "work",
522
+ "target_request_id": "accepted",
523
+ "type": "compaction_attempt",
524
+ },
525
+ {
526
+ "source_request_id": "accepted",
527
+ "target_request_id": "resumed",
528
+ "type": "compaction",
529
+ },
530
+ ]
531
+ },
532
+ },
533
+ )
534
+
535
+ assert trace.nodes[3].sampled is True
536
+ assert trace.nodes[3].mask == [True, True]
537
+ assert trace.nodes[4].mask == [True, True]
538
+ assert trace.nodes[6].mask == [True]
539
+ assert trace.nodes[3].semantic_parents == [
540
+ vf.ParentLink(node=1, type="compaction_attempt")
541
+ ]
542
+ assert trace.nodes[4].semantic_parents == [
543
+ vf.ParentLink(node=1, type="compaction_attempt")
544
+ ]
545
+ assert trace.nodes[6].semantic_parents == [vf.ParentLink(node=4, type="compaction")]
546
+ assert trace.num_branches == 3
547
+ branches = {branch.nodes[-1].message.content: branch for branch in trace.branches}
548
+ assert branches["bad tool call"].trainable is False
549
+ assert branches["accepted summary"].trainable is True
550
+ assert branches["answer"].trainable is True
551
+ assert branches["bad tool call"].nodes[-2] is trace.nodes[2]
552
+ assert branches["accepted summary"].nodes[-2] is trace.nodes[2]
553
+
554
+ restored = vf.WireTrace.model_validate_json(trace.model_dump_json())
555
+ assert restored.nodes[3].sampled is True
556
+ assert restored.nodes[3].mask == [True, True]
557
+ assert restored.nodes[4].mask == [True, True]
558
+ restored_branches = {
559
+ branch.nodes[-1].message.content: branch for branch in restored.branches
560
+ }
561
+ assert restored_branches["bad tool call"].trainable is False
562
+ assert restored_branches["accepted summary"].trainable is True
563
+
564
+
437
565
  def test_semantic_edge_set_rejects_duplicate_self_and_cyclic_edges():
438
566
  edge_set = _semantic_edge_set().model_dump(mode="json")
439
567
  edge_set["edges"].append(edge_set["edges"][0])
@@ -78,12 +78,11 @@ class ACPHarness(Harness[ConfigT]):
78
78
  self, trace: Trace, response_metadata: dict[str, Any]
79
79
  ) -> None:
80
80
  """Attach optional protocol extensions understood by every ACP harness."""
81
- if ACP_SEMANTIC_EDGES_METADATA_KEY not in response_metadata:
82
- return
83
- edge_set = SemanticEdgeSet.model_validate(
84
- response_metadata[ACP_SEMANTIC_EDGES_METADATA_KEY]
85
- )
86
- trace.add_semantic_edges(edge_set)
81
+ if ACP_SEMANTIC_EDGES_METADATA_KEY in response_metadata:
82
+ edge_set = SemanticEdgeSet.model_validate(
83
+ response_metadata[ACP_SEMANTIC_EDGES_METADATA_KEY]
84
+ )
85
+ trace.add_semantic_edges(edge_set)
87
86
 
88
87
  @abstractmethod
89
88
  async def prepare_acp(
@@ -51,10 +51,13 @@ class CompactionConfig(BaseConfig):
51
51
  max_compactions: PositiveInt | None = None
52
52
  """Compactions per session before the engine stops compacting; `None` =
53
53
  nano-rlm's default."""
54
+ max_attempts: PositiveInt | None = None
55
+ """Summary-generation attempts within one compaction cycle; `None` =
56
+ nano-rlm's default (5)."""
54
57
 
55
58
 
56
59
  class RLMHarnessConfig(HarnessConfig):
57
- version: str = Field(default="dd2c04f", min_length=1)
60
+ version: str = Field(default="e384006", min_length=1)
58
61
  """Git ref (branch, tag, or commit) of nano-rlm to install. Must know every
59
62
  field this harness puts on the wire, i.e. be at least the default ref."""
60
63
  max_depth: NonNegativeInt | None = None
@@ -170,6 +173,7 @@ class RLMHarness(ACPHarness[RLMHarnessConfig]):
170
173
  policy_knobs["compaction"] = True
171
174
  policy_knobs["summarize_at_tokens"] = compaction.summarize_at_tokens
172
175
  policy_knobs["max_compactions"] = compaction.max_compactions
176
+ policy_knobs["max_compaction_attempts"] = compaction.max_attempts
173
177
  appends = [
174
178
  text
175
179
  for text in (system_prompt, self.config.append_to_system_prompt)
@@ -63,8 +63,8 @@ class SemanticEdgeSet(BaseModel):
63
63
  """A harness-published set of semantic edges over logical request IDs.
64
64
 
65
65
  Edge labels are intentionally extensible. Initial harnesses use ``continuation``,
66
- ``compaction``, ``subagent_call``, and ``subagent_return``; consumers must preserve
67
- unknown labels.
66
+ ``compaction_attempt``, ``compaction``, ``subagent_call``, and ``subagent_return``;
67
+ consumers must preserve unknown labels.
68
68
  """
69
69
 
70
70
  model_config = ConfigDict(extra="forbid", strict=True)
@@ -187,8 +187,12 @@ class EnvClient:
187
187
  self._receiver = None
188
188
  # Let scheduled fire-and-forget cancels reach the socket first, or a
189
189
  # run cancelled right before close() leaves its server-side rollout
190
- # running. Loop: awaiting one wave can schedule another
190
+ # running. Pop before awaiting: awaiting finished tasks never yields
191
+ # (since CPython 3.12 a gather of them completes eagerly), so their
192
+ # queued `discard` callbacks cannot be what empties the set
191
193
  while self._cancel_tasks:
192
- await asyncio.gather(*list(self._cancel_tasks), return_exceptions=True)
194
+ task = self._cancel_tasks.pop()
195
+ with contextlib.suppress(asyncio.CancelledError):
196
+ await task
193
197
  self.socket.close()
194
198
  self.ctx.term()
@@ -20,11 +20,7 @@ from verifiers.v1.configs.agent import AgentConfig, WireAgentConfig
20
20
  from verifiers.v1.errors import ProviderError
21
21
  from verifiers.v1.graph import RECORD_FLOAT_DECIMALS, MessageNode
22
22
  from verifiers.v1.runtimes import RuntimeInfo
23
- from verifiers.v1.semantic import (
24
- ACPInfo,
25
- ParentLink,
26
- SemanticEdgeSet,
27
- )
23
+ from verifiers.v1.semantic import ACPInfo, ParentLink, SemanticEdgeSet
28
24
  from verifiers.v1.state import State, StateT
29
25
  from verifiers.v1.task import DataT, WireTaskData
30
26
  from verifiers.v1.types import (
@@ -201,6 +197,8 @@ class Branch(BaseModel):
201
197
  index: int
202
198
  nodes: list[MessageNode]
203
199
  calls: list[ModelCall] = Field(default_factory=list)
200
+ trainable: bool = True
201
+ """Whether this physical path contributes a training sample."""
204
202
  mm_token_type_id_map: dict[int, int] = Field(default_factory=dict)
205
203
  """The trace's `mm_token_type_id_map`, carried so `mm_token_type_ids` is self-contained."""
206
204
 
@@ -492,8 +490,18 @@ class Trace(BaseModel, Generic[DataT, StateT, AgentConfigT]):
492
490
 
493
491
  @property
494
492
  def branches(self) -> list[Branch]:
495
- """One root-to-leaf path per graph leaf, its calls attached in path order."""
493
+ """One root-to-leaf view per graph leaf, with no duplicated node storage.
494
+
495
+ A compaction attempt is a dangling physical leaf. It is trainable only when
496
+ the final semantic graph shows that the harness resumed from it.
497
+ """
496
498
  by_node = {c.node: c for c in self.calls if c.node is not None}
499
+ accepted_compaction_attempts = {
500
+ link.node
501
+ for node in self.nodes
502
+ for link in node.semantic_parents
503
+ if link.type == "compaction"
504
+ }
497
505
  branches: list[Branch] = []
498
506
  for i, leaf in enumerate(graph.leaves(self)):
499
507
  path: list[int] = []
@@ -502,11 +510,19 @@ class Trace(BaseModel, Generic[DataT, StateT, AgentConfigT]):
502
510
  path.append(nid)
503
511
  nid = self.nodes[nid].parent
504
512
  path.reverse()
513
+ is_compaction_attempt = any(
514
+ link.type == "compaction_attempt"
515
+ for link in self.nodes[leaf].semantic_parents
516
+ )
505
517
  branches.append(
506
518
  Branch(
507
519
  index=i,
508
520
  nodes=[self.nodes[n] for n in path],
509
521
  calls=[by_node[n] for n in path if n in by_node],
522
+ trainable=(
523
+ not is_compaction_attempt
524
+ or leaf in accepted_compaction_attempts
525
+ ),
510
526
  mm_token_type_id_map=self.mm_token_type_id_map,
511
527
  )
512
528
  )
File without changes