verifiers 0.3.2.dev101__tar.gz → 0.3.2.dev103__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 (218) hide show
  1. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/PKG-INFO +1 -1
  2. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/test_graph.py +76 -0
  3. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/test_serve_delta.py +14 -1
  4. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/graph.py +41 -5
  5. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/serve/delta.py +49 -4
  6. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/.gitignore +0 -0
  7. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/LICENSE +0 -0
  8. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/README.md +0 -0
  9. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/pyproject.toml +0 -0
  10. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/conftest.py +0 -0
  11. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  12. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/fixtures/duet_v1.py +0 -0
  13. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
  14. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  15. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  16. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  17. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/fixtures/echo_v1.py +0 -0
  18. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/fixtures/pyproject.toml +0 -0
  19. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  20. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/test_color_codeword_tasks.py +0 -0
  21. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/test_configs.py +0 -0
  22. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/test_e2e.py +0 -0
  23. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/test_envs.py +0 -0
  24. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/test_judges.py +0 -0
  25. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/test_platform_run.py +0 -0
  26. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/test_scoring.py +0 -0
  27. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/test_taskset.py +0 -0
  28. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/tests/v1/test_trace.py +0 -0
  29. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/__init__.py +0 -0
  30. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/cli/commands/init.py +0 -0
  31. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/__init__.py +0 -0
  32. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/acp/__init__.py +0 -0
  33. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/acp/runner.py +0 -0
  34. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/agent.py +0 -0
  35. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/__init__.py +0 -0
  36. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  37. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/dashboard/base.py +0 -0
  38. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/dashboard/eval.py +0 -0
  39. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/dashboard/replay.py +0 -0
  40. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/dashboard/validate.py +0 -0
  41. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/debug.py +0 -0
  42. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/eval/__init__.py +0 -0
  43. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/eval/hint.py +0 -0
  44. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/eval/main.py +0 -0
  45. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/eval/resume.py +0 -0
  46. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/eval/runner.py +0 -0
  47. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/gepa.py +0 -0
  48. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/init.py +0 -0
  49. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/output.py +0 -0
  50. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/replay.py +0 -0
  51. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/resolve.py +0 -0
  52. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/resume.py +0 -0
  53. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/cli/validate.py +0 -0
  54. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/clients/__init__.py +0 -0
  55. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/clients/base.py +0 -0
  56. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/clients/client.py +0 -0
  57. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/clients/eval.py +0 -0
  58. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/clients/train.py +0 -0
  59. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/configs/__init__.py +0 -0
  60. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/configs/agent.py +0 -0
  61. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/configs/cli/__init__.py +0 -0
  62. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/configs/cli/debug.py +0 -0
  63. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/configs/cli/env.py +0 -0
  64. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/configs/cli/eval.py +0 -0
  65. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/configs/cli/init.py +0 -0
  66. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/configs/cli/replay.py +0 -0
  67. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/configs/cli/validate.py +0 -0
  68. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/configs/client.py +0 -0
  69. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/configs/env.py +0 -0
  70. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/configs/harness.py +0 -0
  71. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/configs/judge.py +0 -0
  72. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/configs/retries.py +0 -0
  73. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/configs/runtime.py +0 -0
  74. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/configs/serve.py +0 -0
  75. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/configs/task.py +0 -0
  76. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/configs/taskset.py +0 -0
  77. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/dialects/__init__.py +0 -0
  78. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/dialects/anthropic.py +0 -0
  79. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/dialects/base.py +0 -0
  80. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/dialects/chat.py +0 -0
  81. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/dialects/responses.py +0 -0
  82. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/env.py +0 -0
  83. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/envs/__init__.py +0 -0
  84. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
  85. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/envs/agentic_judge/env.py +0 -0
  86. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  87. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/envs/best_of_n/env.py +0 -0
  88. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/envs/isolated_verifier/__init__.py +0 -0
  89. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/envs/isolated_verifier/env.py +0 -0
  90. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/envs/shared_agentic_judge/__init__.py +0 -0
  91. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  92. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/envs/single_agent/env.py +0 -0
  93. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/envs/user_sim/__init__.py +0 -0
  94. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/envs/user_sim/env.py +0 -0
  95. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/episode.py +0 -0
  96. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/errors.py +0 -0
  97. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/gepa/__init__.py +0 -0
  98. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/gepa/adapter.py +0 -0
  99. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/gepa/config.py +0 -0
  100. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/gepa/dataset.py +0 -0
  101. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/gepa/reflection.py +0 -0
  102. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/gepa/runner.py +0 -0
  103. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harness.py +0 -0
  104. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/__init__.py +0 -0
  105. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  106. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/bash/harness.py +0 -0
  107. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
  108. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
  109. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/browser_use/program.py +0 -0
  110. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  111. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
  112. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  113. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/codex/harness.py +0 -0
  114. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
  115. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
  116. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
  117. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  118. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  119. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  120. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  121. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  122. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/node.py +0 -0
  123. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/null/__init__.py +0 -0
  124. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/null/harness.py +0 -0
  125. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
  126. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/openclaw/harness.py +0 -0
  127. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  128. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/pi/harness.py +0 -0
  129. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/prime_agent/__init__.py +0 -0
  130. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/prime_agent/harness.py +0 -0
  131. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  132. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  133. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  134. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  135. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  136. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/utils/__init__.py +0 -0
  137. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/utils/compaction.py +0 -0
  138. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/utils/core.py +0 -0
  139. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/utils/install.py +0 -0
  140. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/utils/launch.py +0 -0
  141. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/harnesses/utils/mcp.py +0 -0
  142. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/interception/__init__.py +0 -0
  143. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/interception/base.py +0 -0
  144. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/interception/pool.py +0 -0
  145. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/interception/server.py +0 -0
  146. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/interception/tool.py +0 -0
  147. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  148. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/interception/tunnel/base.py +0 -0
  149. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/interception/tunnel/custom.py +0 -0
  150. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/interception/tunnel/prime.py +0 -0
  151. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/judge.py +0 -0
  152. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/judges/__init__.py +0 -0
  153. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/judges/reference.py +0 -0
  154. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/judges/reference.txt +0 -0
  155. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/judges/rubric.py +0 -0
  156. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/judges/rubric.txt +0 -0
  157. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/mcp/__init__.py +0 -0
  158. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/mcp/launch.py +0 -0
  159. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/mcp/server.py +0 -0
  160. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/mcp/toolset.py +0 -0
  161. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/rollout.py +0 -0
  162. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/runtimes/__init__.py +0 -0
  163. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/runtimes/base.py +0 -0
  164. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/runtimes/docker/__init__.py +0 -0
  165. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/runtimes/docker/egress.py +0 -0
  166. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/runtimes/limiters.py +0 -0
  167. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/runtimes/modal.py +0 -0
  168. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/runtimes/prime.py +0 -0
  169. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/runtimes/subprocess.py +0 -0
  170. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/semantic.py +0 -0
  171. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/serve/__init__.py +0 -0
  172. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/serve/client.py +0 -0
  173. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/serve/encoding.py +0 -0
  174. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/serve/pool.py +0 -0
  175. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/serve/server.py +0 -0
  176. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/serve/types.py +0 -0
  177. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/session.py +0 -0
  178. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/state.py +0 -0
  179. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/task.py +0 -0
  180. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/taskset.py +0 -0
  181. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/tasksets/__init__.py +0 -0
  182. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  183. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/tasksets/harbor/env.py +0 -0
  184. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  185. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/tasksets/harbor/toolset.py +0 -0
  186. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  187. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  188. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  189. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/tasksets/nemo_gym/__init__.py +0 -0
  190. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/tasksets/nemo_gym/response.py +0 -0
  191. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/tasksets/nemo_gym/server.py +0 -0
  192. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/tasksets/nemo_gym/taskset.py +0 -0
  193. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/tasksets/nemo_gym/toolset.py +0 -0
  194. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  195. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  196. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  197. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  198. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/trace.py +0 -0
  199. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/types.py +0 -0
  200. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/utils/__init__.py +0 -0
  201. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/utils/aio.py +0 -0
  202. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/utils/artifacts.py +0 -0
  203. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/utils/compile.py +0 -0
  204. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/utils/decorators.py +0 -0
  205. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/utils/format.py +0 -0
  206. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/utils/generic.py +0 -0
  207. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/utils/git.py +0 -0
  208. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/utils/image.py +0 -0
  209. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/utils/interrupt.py +0 -0
  210. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/utils/loaders.py +0 -0
  211. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/utils/logging.py +0 -0
  212. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/utils/memory.py +0 -0
  213. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/utils/paths.py +0 -0
  214. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/utils/platform.py +0 -0
  215. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/utils/prime.py +0 -0
  216. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/utils/retries.py +0 -0
  217. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/verifiers/v1/utils/score.py +0 -0
  218. {verifiers-0.3.2.dev101 → verifiers-0.3.2.dev103}/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.dev101
3
+ Version: 0.3.2.dev103
4
4
  Summary: Verifiers: Environments for LLM Reinforcement Learning
5
5
  Project-URL: Homepage, https://github.com/primeintellect-ai/verifiers
6
6
  Project-URL: Documentation, https://github.com/primeintellect-ai/verifiers
@@ -91,6 +91,82 @@ def test_routed_experts_attributed_and_aligned_across_turns():
91
91
  )
92
92
 
93
93
 
94
+ def test_bridged_turn_recovers_the_prior_turn_unforwarded_row():
95
+ """A turn never forwards its own final sampled token, so the engine returns one routing row
96
+ fewer than the turn has prompt plus completion positions, and that final position is filled
97
+ with a copy of its predecessor: a placeholder, effectively. The next turn's prefill does
98
+ forward it and reports it as row 0, so the placeholder must be replaced by that real row
99
+ rather than discarded."""
100
+ trace = vf.Trace(
101
+ agent=vf.AgentInfo(config=vf.AgentConfig()),
102
+ task=vf.TraceTask(type="Task", data=vf.TaskData(idx=0, prompt="x")),
103
+ )
104
+ user = vf.UserMessage(content="u1")
105
+
106
+ # Start first turn
107
+ graph.prepare_turn(trace, [user]).commit(
108
+ vf.Response(
109
+ id="a",
110
+ created=0,
111
+ model="t",
112
+ message=vf.AssistantMessage(content="a1"),
113
+ finish_reason="stop",
114
+ tokens=TurnTokens(
115
+ prompt_ids=[10, 11, 12],
116
+ completion_ids=[20, 21],
117
+ message_spans=[(0, 2)],
118
+ routed_experts=_routed_payload(4, 0, 0),
119
+ ),
120
+ )
121
+ )
122
+ sampled_node = trace.nodes[-1]
123
+ assert sampled_node.routed_experts is not None
124
+ # First turn has the placeholder routing assignments:
125
+ assert bool(
126
+ (sampled_node.routed_experts[-1] == sampled_node.routed_experts[-2]).all()
127
+ )
128
+ forwarded_rows = sampled_node.routed_experts[:-1].copy()
129
+
130
+ # Start second turn
131
+ bridged = _routed_payload(4, 4, 100)
132
+ true_row = np.frombuffer(base64.b64decode(bridged["data"]), dtype=np.uint8).reshape(
133
+ bridged["shape"]
134
+ )[0]
135
+ graph.prepare_turn(
136
+ trace,
137
+ [user, vf.AssistantMessage(content="a1"), vf.UserMessage(content="u2")],
138
+ ).commit(
139
+ vf.Response(
140
+ id="b",
141
+ created=0,
142
+ model="t",
143
+ message=vf.AssistantMessage(content="a2"),
144
+ finish_reason="stop",
145
+ tokens=TurnTokens(
146
+ prompt_ids=[10, 11, 12, 20, 21, 30, 31],
147
+ completion_ids=[40, 41],
148
+ message_spans=[(0, 2), None, (5, 7)],
149
+ routed_experts=bridged,
150
+ ),
151
+ )
152
+ )
153
+
154
+ recovered = sampled_node.routed_experts
155
+ assert recovered is not None
156
+ # Did the first turn's final placeholder get corrected?
157
+ assert bool((recovered[-1] == true_row).all()), (
158
+ f"expected turn 1's final position to hold {true_row.tolist()}, "
159
+ f"got {recovered[-1].tolist()}"
160
+ )
161
+ assert bool((recovered[:-1] == forwarded_rows).all()), (
162
+ "only the fabricated final row may change"
163
+ )
164
+ assert recovered.flags.owndata
165
+ branch = trace.branches[-1]
166
+ assert branch.routed_experts is not None
167
+ assert branch.routed_experts.shape[0] == len(branch.token_ids)
168
+
169
+
94
170
  def test_routed_experts_none_when_absent():
95
171
  """No routing captured (engine ran without `enable_return_routed_experts`) -> the branch
96
172
  reports None and the trainer simply skips replay."""
@@ -4,6 +4,7 @@ the episode the worker finished with."""
4
4
  import asyncio
5
5
  import copy
6
6
 
7
+ import numpy as np
7
8
  import pytest
8
9
 
9
10
  import verifiers.v1 as vf
@@ -176,7 +177,8 @@ async def test_pending_preview_streams_and_clears_on_commit():
176
177
 
177
178
 
178
179
  @pytest.mark.asyncio
179
- async def test_deltas_stream_once_and_reassemble_the_episode():
180
+ @pytest.mark.parametrize("routing_dtype", [np.uint8, np.uint16])
181
+ async def test_deltas_stream_once_and_reassemble_the_episode(routing_dtype):
180
182
  slot = Slot()
181
183
  frames: list[bytes] = []
182
184
 
@@ -192,8 +194,15 @@ async def test_deltas_stream_once_and_reassemble_the_episode():
192
194
  await settle()
193
195
  assert len(frames) == 1, "the mint and the boot span coalesce into one delta"
194
196
  add_turn(trace, "a1")
197
+ trace.nodes[1].routed_experts = np.arange(6, dtype=np.uint8).reshape(3, 2, 1)
195
198
  await settle()
196
199
  add_turn(trace, "a2")
200
+ # The next prefill corrects the previous turn's last routing row, potentially
201
+ # widening its dtype. The previous node has already crossed the wire.
202
+ trace.nodes[1].routed_experts = np.array(
203
+ [[[0], [1]], [[2], [3]], [[100], [np.iinfo(routing_dtype).max]]],
204
+ dtype=routing_dtype,
205
+ )
197
206
  trace.nodes[0].semantic_parents.append(ParentLink(node=1, type="reply"))
198
207
  await settle()
199
208
  trace.record_reward("match", 1.0)
@@ -224,6 +233,10 @@ async def test_deltas_stream_once_and_reassemble_the_episode():
224
233
  rebuilt = WireEpisode.model_validate(unpack(pack(assembly.finish(head, summaries))))
225
234
  assert rebuilt.ok and rebuilt.traces[0].id == trace.id
226
235
  assert rebuilt.traces[0].messages == trace.messages
236
+ np.testing.assert_array_equal(
237
+ rebuilt.traces[0].nodes[1].routed_experts, trace.nodes[1].routed_experts
238
+ )
239
+ assert rebuilt.traces[0].nodes[1].routed_experts.dtype == routing_dtype
227
240
  assert (
228
241
  rebuilt.traces[0].nodes[0].semantic_parents == trace.nodes[0].semantic_parents
229
242
  )
@@ -673,8 +673,41 @@ def _attribute_mm(
673
673
  )
674
674
 
675
675
 
676
+ def _replace_placeholder_routing_row(
677
+ trace: Trace, prefix_node_ids: list[int], arr: np.ndarray, off: int
678
+ ) -> None:
679
+ """Replace the prefix's placeholder routing row with the one this turn's prefill forwarded."""
680
+ if not 1 <= off <= arr.shape[0]:
681
+ return
682
+ # Only assistant (`sampled`) nodes are affected: the model forward isn't run on the final
683
+ # generated token for such turns, meaning its routing decisions are fundamentally unavailable.
684
+ # But, because routing needs one row per token, that row instead receives an inaccurate
685
+ # placeholder, attempt to fix up below.
686
+ node_with_placeholder = None
687
+ for nid in reversed(prefix_node_ids):
688
+ if trace.nodes[nid].token_ids:
689
+ node_with_placeholder = trace.nodes[nid]
690
+ break
691
+ if node_with_placeholder is None or not node_with_placeholder.sampled:
692
+ return
693
+ node_rows = node_with_placeholder.routed_experts
694
+ if (
695
+ node_rows is None
696
+ or node_rows.shape[0] == 0
697
+ or node_rows.shape[1:] != arr.shape[1:]
698
+ ):
699
+ return
700
+ # Row `i` of this turn's array is sequence position `start + i`, so the prefix's final position
701
+ # is `arr[off - 1]`. Concatenating widens the node when this turn serialized `uint16`, where an
702
+ # in-place write would truncate.
703
+ node_with_placeholder.routed_experts = np.concatenate(
704
+ [node_rows[:-1], arr[off - 1 : off]], axis=0
705
+ )
706
+
707
+
676
708
  def _attribute_routed_experts(
677
709
  trace: Trace,
710
+ prefix_node_ids: list[int],
678
711
  new_node_ids: list[int],
679
712
  path_len: int,
680
713
  payload: Any,
@@ -683,7 +716,8 @@ def _attribute_routed_experts(
683
716
  payload's array covers the turn's prompt+completion from `payload["start"]` (0 = from token
684
717
  0); the nodes created this turn tile sequence positions `[path_len:]` in creation order, so
685
718
  we hand each node `arr[off : off+len(node.token_ids)]` and advance. Reused-prefix nodes keep
686
- the routing attributed when they were first created. A node whose slice falls outside the
719
+ the routing attributed when they were first created, except for the one position this turn
720
+ corrects (see `_replace_placeholder_routing_row`). A node whose slice falls outside the
687
721
  array (a `start` past `path_len`, e.g. an unexpected prefix-cache delta) is left unset — the
688
722
  branch then reports no routing rather than misaligning."""
689
723
  if payload is None:
@@ -693,6 +727,7 @@ def _attribute_routed_experts(
693
727
  payload["shape"]
694
728
  )
695
729
  off = path_len - int(payload.get("start", 0) or 0)
730
+ _replace_placeholder_routing_row(trace, prefix_node_ids, arr, off)
696
731
  needed = off + sum(len(trace.nodes[nid].token_ids) for nid in new_node_ids)
697
732
  for nid in new_node_ids:
698
733
  n = len(trace.nodes[nid].token_ids)
@@ -701,8 +736,8 @@ def _attribute_routed_experts(
701
736
  # Own only this node's rows; a view would retain the turn's full-context array.
702
737
  trace.nodes[nid].routed_experts = arr[off:end].copy()
703
738
  elif n and arr.shape[0] and 0 <= off and end == needed == arr.shape[0] + 1:
704
- # The engine omits the turn's final position because no forward pass follows it.
705
- # Pad only the final node's suffix instead of copying the full-context array.
739
+ # No forward pass follows the turn's final position, so it gets a placeholder: a
740
+ # copy of the previous row, appended to this node's slice of the array.
706
741
  trace.nodes[nid].routed_experts = np.concatenate(
707
742
  [arr[off:], arr[-1:]], axis=0
708
743
  )
@@ -813,7 +848,7 @@ def _commit_turn(turn: PendingTurn, response: Response) -> int:
813
848
  parent = prefix[-1] if prefix else None
814
849
  # cursor: in prompt_ids, the end of the previous *new* message's tokens
815
850
  cursor: int | None = None
816
- # Track new nodes separately so routed-expert attribution does not need this full path.
851
+ # Track new nodes separately so routed-expert attribution needs only node ids, not this path.
817
852
  new_node_ids: list[int] = []
818
853
  # Materialize the reused message path only for multimodal cursor attribution.
819
854
  mm_path: list[tuple[int, Message]] | None = None
@@ -874,8 +909,9 @@ def _commit_turn(turn: PendingTurn, response: Response) -> int:
874
909
 
875
910
  # Attribute this turn's expert-routing array onto the nodes created this turn (new input
876
911
  # nodes in creation order, then the assistant node), each getting the routing for its tokens.
912
+ # The prefix goes in too, so the position the previous turn could only pad can be corrected.
877
913
  _attribute_routed_experts(
878
- trace, new_node_ids, path_len, tokens.routed_experts if tokens else None
914
+ trace, prefix, new_node_ids, path_len, tokens.routed_experts if tokens else None
879
915
  )
880
916
 
881
917
  # Sampling masks are completion-aligned, so only the sampled node carries them.
@@ -4,12 +4,12 @@ The worker streams a served episode as it grows. Each trace announces its own ch
4
4
  (`Trace.notify`, fired by the rollout at every phase change and by the interception proxy
5
5
  after every recorded turn); the `DeltaStreamer` then diffs the run's live traces against
6
6
  what it has already sent and ships only the new part — the trace header once, then
7
- appended nodes / calls / errors, semantic links landing on earlier nodes, the scalar
7
+ appended nodes / calls / errors, semantic links and routing-row repairs on earlier nodes, the scalar
8
8
  fields whose value changed (timing spans, stop condition, rewards, ...), and the
9
9
  `pending` preview — the messages of the request in flight that no node holds yet, so a
10
10
  watcher sees a tool result before the model has answered it. The `Trace` is
11
- append-only at turn granularity (a turn's nodes are committed complete, with their
12
- tokens), so apart from the preview, which a committed turn repeats, every byte of the
11
+ append-only at turn granularity except for links and the last routing row of a node,
12
+ which the next prefill can repair. Apart from these and the preview, every byte of the
13
13
  episode crosses the wire once and the stream costs about what a single reply would; the
14
14
  reply that ends the run carries only the episode head and per-trace counts the client
15
15
  checks its assembly against. A cursor advances only once its delta is on the wire, so a
@@ -29,8 +29,10 @@ from collections.abc import Awaitable, Callable
29
29
  from typing import TYPE_CHECKING, Any, Self
30
30
 
31
31
  import msgpack
32
+ import numpy as np
32
33
  from pydantic import BaseModel
33
34
 
35
+ from verifiers.v1.graph import _decode_ndarray, _encode_ndarray
34
36
  from verifiers.v1.serve.encoding import msgpack_encoder
35
37
 
36
38
  if TYPE_CHECKING:
@@ -73,7 +75,7 @@ def pack(payload: Any) -> bytes:
73
75
 
74
76
 
75
77
  def unpack(data: bytes) -> Any:
76
- # `links` is keyed by node index (int).
78
+ # Node updates are keyed by node index (int).
77
79
  return msgpack.unpackb(data, raw=False, strict_map_key=False)
78
80
 
79
81
 
@@ -90,6 +92,8 @@ class TraceCursor:
90
92
  self.sent = dict.fromkeys(LIST_FIELDS, 0)
91
93
  self.links: list[int] = []
92
94
  """Per sent node, how many of its semantic links went out with or after it."""
95
+ self.final_rows: dict[int, bytes] = {}
96
+ """Per node that carries routing, its final row as packed when last sent."""
93
97
  self.scalars: dict[str, bytes] = {}
94
98
  self.pending: bytes = pack([])
95
99
 
@@ -157,6 +161,31 @@ class DeltaStreamer:
157
161
  else:
158
162
  self.cursors[trace_id] = cursor
159
163
 
164
+ def _maybe_add_routing_repairs(
165
+ self,
166
+ delta: dict[str, Any],
167
+ trace: Trace,
168
+ cursor: TraceCursor,
169
+ sent_nodes: int,
170
+ ) -> None:
171
+ """Add final rows repaired since they were sent, keyed by node index.
172
+
173
+ Record every node's current row on the cursor. `sent_nodes` is the pre-flush
174
+ count, so a node first sent in this delta is never reported as a repair.
175
+ """
176
+ repairs: dict[int, dict] = {}
177
+ for index, node in enumerate(trace.nodes):
178
+ if node.routed_experts is None:
179
+ continue
180
+ row = _encode_ndarray(node.routed_experts[-1:])
181
+ packed = pack(row)
182
+ if cursor.final_rows.get(index) != packed:
183
+ cursor.final_rows[index] = packed
184
+ if index < sent_nodes:
185
+ repairs[index] = row
186
+ if repairs:
187
+ delta["routing_repairs"] = repairs
188
+
160
189
  def diff(self) -> list[tuple[str, dict, TraceCursor | None]]:
161
190
  """Each trace's delta against its sent cursor, with the cursor as it stands once
162
191
  that delta is sent (None for a discard). Nothing here is committed: `flush`
@@ -183,6 +212,7 @@ class DeltaStreamer:
183
212
  cursor.links[index] = len(node_links)
184
213
  if links:
185
214
  delta["links"] = links
215
+ self._maybe_add_routing_repairs(delta, trace, cursor, cursor.sent["nodes"])
186
216
  for field in LIST_FIELDS:
187
217
  items = getattr(trace, field)
188
218
  sent = cursor.sent[field]
@@ -220,6 +250,20 @@ class EpisodeAssembly:
220
250
  def __init__(self) -> None:
221
251
  self.traces: dict[str, dict] = {}
222
252
 
253
+ def _maybe_apply_routing_repairs(self, delta: dict[str, Any], trace: dict) -> None:
254
+ """Replace repaired final rows in nodes the client already holds.
255
+
256
+ Rebuild each array: a repair can widen its dtype, and decoded rows alias
257
+ the original delta's bytes, which must remain unchanged for consumers.
258
+ """
259
+ for index, row in (delta.get("routing_repairs") or {}).items():
260
+ node = trace["nodes"][int(index)]
261
+ node["routed_experts"] = _encode_ndarray(
262
+ np.concatenate(
263
+ [_decode_ndarray(node["routed_experts"])[:-1], _decode_ndarray(row)]
264
+ )
265
+ )
266
+
223
267
  def apply(self, delta: dict) -> None:
224
268
  trace_id = delta["trace"]
225
269
  if delta.get("discard"):
@@ -234,6 +278,7 @@ class EpisodeAssembly:
234
278
  }
235
279
  for index, links in (delta.get("links") or {}).items():
236
280
  trace["nodes"][int(index)]["semantic_parents"].extend(links)
281
+ self._maybe_apply_routing_repairs(delta, trace)
237
282
  # a later `links` delta grows a node's semantic_parents in place, so the node
238
283
  # is copied: the delta stays as it was when the caller received it
239
284
  if "nodes" in delta: