verifiers 0.4.1.dev37__tar.gz → 0.4.1.dev39__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 (271) hide show
  1. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/PKG-INFO +1 -1
  2. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/acp/__init__.py +9 -0
  3. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/dialects/anthropic.py +10 -6
  4. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/dialects/base.py +1 -1
  5. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/grading.py +15 -8
  6. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/interception/server.py +37 -45
  7. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/tasksets/harbor/taskset.py +8 -0
  8. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/.gitignore +0 -0
  9. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/LICENSE +0 -0
  10. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/README.md +0 -0
  11. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/pyproject.toml +0 -0
  12. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/integration/conftest.py +0 -0
  13. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/integration/fixtures/agent_user_harness_v1.py +0 -0
  14. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/integration/fixtures/agent_user_v1.py +0 -0
  15. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/integration/fixtures/counter_tool_v1.py +0 -0
  16. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/integration/fixtures/duet_v1.py +0 -0
  17. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/integration/fixtures/echo_acp_resume_v1.py +0 -0
  18. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/integration/fixtures/echo_agentic_v1.py +0 -0
  19. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/integration/fixtures/echo_tool_compose/docker-compose.yaml +0 -0
  20. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/integration/fixtures/echo_tool_v1.py +0 -0
  21. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/integration/fixtures/echo_user_sim_v1.py +0 -0
  22. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/integration/fixtures/echo_v1.py +0 -0
  23. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/integration/fixtures/network_policy_v1.py +0 -0
  24. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/integration/fixtures/pyproject.toml +0 -0
  25. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/integration/fixtures/skill_codeword_v1.py +0 -0
  26. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/integration/fixtures/skills/project-codeword/SKILL.md +0 -0
  27. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/integration/fixtures/tool_response_image_v1.py +0 -0
  28. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/integration/grid.py +0 -0
  29. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/integration/test_agent_user.py +0 -0
  30. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/integration/test_agentic_judge.py +0 -0
  31. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/integration/test_compose_scoring.py +0 -0
  32. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/integration/test_examples.py +0 -0
  33. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/integration/test_limits.py +0 -0
  34. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/integration/test_multi_agent.py +0 -0
  35. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/integration/test_multi_turn.py +0 -0
  36. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/integration/test_multi_turn_tool.py +0 -0
  37. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/integration/test_multimodal_tool.py +0 -0
  38. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/integration/test_network_policy.py +0 -0
  39. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/integration/test_resume_tool.py +0 -0
  40. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/integration/test_rubric_judge.py +0 -0
  41. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/integration/test_sampling.py +0 -0
  42. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/integration/test_shared_tool.py +0 -0
  43. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/integration/test_single_turn.py +0 -0
  44. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/integration/test_skills.py +0 -0
  45. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/integration/test_stateful_tool.py +0 -0
  46. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/integration/test_user_echo.py +0 -0
  47. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/integration/test_user_sim.py +0 -0
  48. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/unit/cli/test_replay.py +0 -0
  49. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/unit/conftest.py +0 -0
  50. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/unit/harnesses/test_core.py +0 -0
  51. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/unit/harnesses/test_rlm.py +0 -0
  52. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/unit/interception/test_tunnel.py +0 -0
  53. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/unit/judges/conftest.py +0 -0
  54. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/unit/judges/test_judge.py +0 -0
  55. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/unit/judges/test_reference.py +0 -0
  56. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/unit/judges/test_rubric.py +0 -0
  57. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/unit/runtimes/test_e2b.py +0 -0
  58. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/unit/serve/test_client.py +0 -0
  59. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/unit/serve/test_delta.py +0 -0
  60. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/unit/serve/test_pool.py +0 -0
  61. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/unit/test_agent.py +0 -0
  62. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/unit/test_dialects.py +0 -0
  63. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/unit/test_graph.py +0 -0
  64. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/unit/test_semantic.py +0 -0
  65. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/unit/test_task.py +0 -0
  66. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/unit/test_taskset.py +0 -0
  67. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/unit/test_trace.py +0 -0
  68. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/unit/utils/test_compile.py +0 -0
  69. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/unit/utils/test_loaders.py +0 -0
  70. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/unit/utils/test_platform.py +0 -0
  71. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/tests/unit/utils/test_score.py +0 -0
  72. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/__init__.py +0 -0
  73. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/__init__.py +0 -0
  74. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/acp/runner.py +0 -0
  75. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/agent.py +0 -0
  76. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/cli/__init__.py +0 -0
  77. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  78. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/cli/dashboard/base.py +0 -0
  79. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/cli/dashboard/eval.py +0 -0
  80. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/cli/dashboard/replay.py +0 -0
  81. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/cli/dashboard/validate.py +0 -0
  82. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/cli/debug.py +0 -0
  83. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/cli/eval/__init__.py +0 -0
  84. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/cli/eval/hint.py +0 -0
  85. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/cli/eval/main.py +0 -0
  86. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/cli/eval/resume.py +0 -0
  87. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/cli/eval/runner.py +0 -0
  88. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/cli/gepa.py +0 -0
  89. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/cli/output.py +0 -0
  90. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/cli/replay.py +0 -0
  91. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/cli/resolve.py +0 -0
  92. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/cli/resume.py +0 -0
  93. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/cli/validate.py +0 -0
  94. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/clients/__init__.py +0 -0
  95. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/clients/base.py +0 -0
  96. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/clients/client.py +0 -0
  97. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/clients/eval.py +0 -0
  98. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/clients/train.py +0 -0
  99. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/configs/__init__.py +0 -0
  100. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/configs/agent.py +0 -0
  101. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/configs/cli/__init__.py +0 -0
  102. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/configs/cli/debug.py +0 -0
  103. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/configs/cli/env.py +0 -0
  104. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/configs/cli/eval.py +0 -0
  105. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/configs/cli/replay.py +0 -0
  106. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/configs/cli/validate.py +0 -0
  107. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/configs/client.py +0 -0
  108. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/configs/env.py +0 -0
  109. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/configs/harness.py +0 -0
  110. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/configs/judge.py +0 -0
  111. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/configs/retries.py +0 -0
  112. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/configs/runtime.py +0 -0
  113. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/configs/scoring.py +0 -0
  114. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/configs/select.py +0 -0
  115. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/configs/serve.py +0 -0
  116. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/configs/task.py +0 -0
  117. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/configs/taskset.py +0 -0
  118. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/dialects/__init__.py +0 -0
  119. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/dialects/chat.py +0 -0
  120. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/dialects/responses.py +0 -0
  121. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/env.py +0 -0
  122. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/envs/__init__.py +0 -0
  123. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
  124. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/envs/agentic_judge/env.py +0 -0
  125. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  126. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/envs/best_of_n/env.py +0 -0
  127. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  128. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/envs/single_agent/env.py +0 -0
  129. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/envs/user_sim/__init__.py +0 -0
  130. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/envs/user_sim/env.py +0 -0
  131. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/episode.py +0 -0
  132. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/errors.py +0 -0
  133. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/gepa/__init__.py +0 -0
  134. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/gepa/adapter.py +0 -0
  135. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/gepa/config.py +0 -0
  136. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/gepa/dataset.py +0 -0
  137. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/gepa/reflection.py +0 -0
  138. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/gepa/runner.py +0 -0
  139. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/graph.py +0 -0
  140. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harness.py +0 -0
  141. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/__init__.py +0 -0
  142. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  143. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/bash/harness.py +0 -0
  144. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
  145. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
  146. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/browser_use/program.py +0 -0
  147. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  148. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
  149. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  150. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/codex/gate.mjs +0 -0
  151. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/codex/harness.py +0 -0
  152. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/deepseek/__init__.py +0 -0
  153. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/deepseek/gate.mjs +0 -0
  154. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/deepseek/harness.py +0 -0
  155. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/deepseek/usage.mjs +0 -0
  156. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
  157. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
  158. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
  159. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  160. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  161. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  162. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  163. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  164. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/node.py +0 -0
  165. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/null/__init__.py +0 -0
  166. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/null/harness.py +0 -0
  167. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
  168. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/openclaw/harness.py +0 -0
  169. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/opencode/__init__.py +0 -0
  170. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/opencode/harness.py +0 -0
  171. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/opencode/mcp-ready.js +0 -0
  172. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  173. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/pi/gate.mjs +0 -0
  174. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/pi/harness.py +0 -0
  175. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/prime_agent/__init__.py +0 -0
  176. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/prime_agent/harness.py +0 -0
  177. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  178. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  179. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  180. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  181. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  182. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/utils/__init__.py +0 -0
  183. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/utils/compaction.py +0 -0
  184. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/utils/core.py +0 -0
  185. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/utils/install.py +0 -0
  186. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/utils/launch.py +0 -0
  187. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/utils/mcp.py +0 -0
  188. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/harnesses/utils/replay.py +0 -0
  189. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/interception/__init__.py +0 -0
  190. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/interception/base.py +0 -0
  191. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/interception/pool.py +0 -0
  192. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  193. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/interception/tunnel/base.py +0 -0
  194. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/interception/tunnel/custom.py +0 -0
  195. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/interception/tunnel/prime.py +0 -0
  196. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/judge.py +0 -0
  197. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/judges/__init__.py +0 -0
  198. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/judges/decision.py +0 -0
  199. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/judges/reference.py +0 -0
  200. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/judges/reference.txt +0 -0
  201. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/judges/rubric.py +0 -0
  202. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/judges/rubric.txt +0 -0
  203. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/mcp/__init__.py +0 -0
  204. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/mcp/launch.py +0 -0
  205. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/mcp/server.py +0 -0
  206. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/mcp/toolset.py +0 -0
  207. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/rollout.py +0 -0
  208. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/runtimes/__init__.py +0 -0
  209. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/runtimes/apptainer.py +0 -0
  210. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/runtimes/base.py +0 -0
  211. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/runtimes/compose.py +0 -0
  212. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/runtimes/container.py +0 -0
  213. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/runtimes/deployment.py +0 -0
  214. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/runtimes/docker/__init__.py +0 -0
  215. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/runtimes/docker/egress.py +0 -0
  216. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/runtimes/e2b.py +0 -0
  217. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/runtimes/limiters.py +0 -0
  218. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/runtimes/modal.py +0 -0
  219. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/runtimes/prime.py +0 -0
  220. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/runtimes/runtime.py +0 -0
  221. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/runtimes/strategies.py +0 -0
  222. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/runtimes/subprocess.py +0 -0
  223. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/semantic.py +0 -0
  224. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/serve/__init__.py +0 -0
  225. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/serve/client.py +0 -0
  226. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/serve/delta.py +0 -0
  227. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/serve/encoding.py +0 -0
  228. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/serve/pool.py +0 -0
  229. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/serve/server.py +0 -0
  230. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/serve/types.py +0 -0
  231. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/session.py +0 -0
  232. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/state.py +0 -0
  233. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/task.py +0 -0
  234. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/taskset.py +0 -0
  235. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/tasksets/__init__.py +0 -0
  236. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  237. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/tasksets/harbor/toolset.py +0 -0
  238. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/tasksets/nemo_gym/__init__.py +0 -0
  239. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/tasksets/nemo_gym/response.py +0 -0
  240. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/tasksets/nemo_gym/server.py +0 -0
  241. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/tasksets/nemo_gym/taskset.py +0 -0
  242. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/tasksets/nemo_gym/toolset.py +0 -0
  243. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  244. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  245. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  246. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  247. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/trace.py +0 -0
  248. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/types.py +0 -0
  249. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/utils/__init__.py +0 -0
  250. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/utils/aio.py +0 -0
  251. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/utils/artifacts.py +0 -0
  252. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/utils/compile.py +0 -0
  253. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/utils/decorators.py +0 -0
  254. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/utils/env.py +0 -0
  255. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/utils/eval.py +0 -0
  256. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/utils/format.py +0 -0
  257. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/utils/generic.py +0 -0
  258. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/utils/git.py +0 -0
  259. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/utils/image.py +0 -0
  260. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/utils/interrupt.py +0 -0
  261. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/utils/loaders.py +0 -0
  262. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/utils/logging.py +0 -0
  263. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/utils/memory.py +0 -0
  264. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/utils/paths.py +0 -0
  265. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/utils/platform.py +0 -0
  266. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/utils/prime.py +0 -0
  267. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/utils/retries.py +0 -0
  268. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/utils/scope.py +0 -0
  269. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/utils/score.py +0 -0
  270. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/utils/trace_store.py +0 -0
  271. {verifiers-0.4.1.dev37 → verifiers-0.4.1.dev39}/verifiers/v1/utils/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: verifiers
3
- Version: 0.4.1.dev37
3
+ Version: 0.4.1.dev39
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
@@ -27,6 +27,12 @@ from verifiers.v1.utils.aio import run_shielded
27
27
 
28
28
  ACP_SOURCE = (Path(__file__).resolve().parent / "runner.py").read_text()
29
29
  MAX_PACKET_BYTES = 128 * 1024 * 1024
30
+ _STOP_CONDITIONS = {
31
+ "max_tokens": "max_output_tokens",
32
+ "max_turn_requests": "max_turns",
33
+ "refusal": "refusal",
34
+ "cancelled": "cancelled",
35
+ }
30
36
 
31
37
  __all__ = ["ACPConfig", "ACPHarness", "ACPTurn"]
32
38
 
@@ -354,6 +360,7 @@ class ACPHarnessSession(HarnessSession):
354
360
  raise
355
361
  turn = _turn_result(response)
356
362
  self.trace.root_reply = turn.reply.strip()
363
+ self.trace.info["acp_stop_reason"] = turn.stop_reason
357
364
  if not response.get("ok"):
358
365
  detail = response.get("error") or "ACP session request failed"
359
366
  if stderr := self._stderr():
@@ -368,6 +375,8 @@ class ACPHarnessSession(HarnessSession):
368
375
  harness = cast(ACPHarness, self.harness)
369
376
  harness._consume_protocol_metadata(self.trace, turn.response_metadata)
370
377
  harness.acp_turn_result(self.trace, turn)
378
+ if condition := _STOP_CONDITIONS.get(turn.stop_reason or ""):
379
+ self.trace.stop(condition)
371
380
  result = ProgramResult(exit_code=0, stdout=turn.reply, stderr="")
372
381
  _require_model_turn(self.trace, calls_before, result)
373
382
  return result
@@ -64,6 +64,7 @@ ERROR_TYPES = {
64
64
  }
65
65
  ERROR_STATUSES = {kind: status for status, kind in ERROR_TYPES.items()}
66
66
 
67
+
67
68
  # Claude may reorder mixed thinking block types between a response and its replay.
68
69
  # Native tool events share the final rank, preserving their relative order.
69
70
  THINKING_ORDER = {"redacted_thinking": 0, "thinking": 1}
@@ -118,6 +119,12 @@ _SAFE_CONTENT_TYPES = (
118
119
  )
119
120
 
120
121
 
122
+ def _error_type(status_code: int) -> str:
123
+ return ERROR_TYPES.get(
124
+ status_code, "api_error" if status_code >= 500 else "invalid_request_error"
125
+ )
126
+
127
+
121
128
  def parse_content(content) -> str | list[ContentPart]:
122
129
  """Anthropic user-side content (text + image blocks) -> typed content parts."""
123
130
  if isinstance(content, str):
@@ -525,10 +532,10 @@ class AnthropicDialect(Dialect[AnthropicMessage]):
525
532
  # The SDK sends the key as `x-api-key`; an ANTHROPIC_AUTH_TOKEN arrives as Bearer.
526
533
  return headers.get("x-api-key") or super().secret(headers)
527
534
 
528
- def error_body(self, message: str) -> dict:
535
+ def error_body(self, message: str, *, status_code: int = 400) -> dict:
529
536
  return {
530
537
  "type": "error",
531
- "error": {"type": "invalid_request_error", "message": message},
538
+ "error": {"type": _error_type(status_code), "message": message},
532
539
  }
533
540
 
534
541
  def stream_keepalive(self, first: bool) -> bytes:
@@ -538,10 +545,7 @@ class AnthropicDialect(Dialect[AnthropicMessage]):
538
545
  def stream_error(self, error: dict, *, status_code: int | None = None) -> bytes:
539
546
  # Once HTTP 200 is committed, clients classify retries from the SSE error type.
540
547
  if status_code is not None:
541
- kind = ERROR_TYPES.get(
542
- status_code,
543
- "api_error" if status_code >= 500 else "invalid_request_error",
544
- )
548
+ kind = _error_type(status_code)
545
549
  error = {**error, "error": {**error.get("error", {}), "type": kind}}
546
550
  # The Anthropic SDKs raise only on a named `error` event.
547
551
  return b"event: error\ndata: " + json.dumps(error).encode() + b"\n\n"
@@ -316,7 +316,7 @@ class Dialect(ABC, Generic[RespT]):
316
316
  client ends on an earlier event (e.g. Responses' `response.completed`) overrides this."""
317
317
  return is_sse_done_event(chunk)
318
318
 
319
- def error_body(self, message: str) -> dict:
319
+ def error_body(self, message: str, *, status_code: int = 400) -> dict:
320
320
  """An error payload in this format's error shape (OpenAI by default)."""
321
321
  return {"error": {"message": message, "type": "invalid_request_error"}}
322
322
 
@@ -23,6 +23,8 @@ from verifiers.v1.utils.env import resolve_env
23
23
  from verifiers.v1.utils.retries import RetryState, backoff
24
24
 
25
25
  logger = logging.getLogger(__name__)
26
+ _SCORING_INFO_KEYS = ("judge_calls", "scoring_diagnostics")
27
+ """Accounting and diagnostics survive failed scoring attempts, unlike partial scores."""
26
28
 
27
29
 
28
30
  @contextmanager
@@ -32,11 +34,11 @@ def scoring_transaction(trace: Trace):
32
34
  try:
33
35
  yield
34
36
  except BaseException:
35
- # Failed judges still consume tokens and calls; retain their accounting.
36
- judge_calls = trace.info.get("judge_calls")
37
+ retained = {
38
+ key: trace.info[key] for key in _SCORING_INFO_KEYS if key in trace.info
39
+ }
37
40
  trace.state, trace.rewards, trace.metrics, trace.info = saved
38
- if judge_calls is not None:
39
- trace.info["judge_calls"] = judge_calls
41
+ trace.info.update(retained)
40
42
  raise
41
43
 
42
44
 
@@ -140,11 +142,16 @@ async def grade_task(
140
142
  if on_score is not None:
141
143
  await on_score(result, runtime)
142
144
  finally:
143
- # Model-backed judges are billed even when an attempt fails.
144
- # Preserve their accounting without committing partial rewards/state.
145
+ # Preserve failed attempts' evidence and accounting without
146
+ # committing partial rewards/state.
145
147
  trace.extra_usage = result.extra_usage
146
- if "judge_calls" in result.info:
147
- trace.info["judge_calls"] = result.info["judge_calls"]
148
+ trace.info.update(
149
+ {
150
+ key: result.info[key]
151
+ for key in _SCORING_INFO_KEYS
152
+ if key in result.info
153
+ }
154
+ )
148
155
  # Cleanup failure must not discard an authoritative completed score.
149
156
  trace.state, trace.rewards, trace.metrics = (
150
157
  result.state,
@@ -114,6 +114,13 @@ async def _request_digest(raw: bytes) -> bytes:
114
114
  return await asyncio.to_thread(_body_digest, raw)
115
115
 
116
116
 
117
+ def _error_response(dialect: Dialect, message: str, *, status: int) -> web.Response:
118
+ """Keep the native error classification consistent with its HTTP status."""
119
+ return web.json_response(
120
+ dialect.error_body(message, status_code=status), status=status
121
+ )
122
+
123
+
117
124
  def _completion_response(completion: dict | None) -> web.Response:
118
125
  """Serialize a model's JSON-native response without an intermediate string."""
119
126
  try:
@@ -470,9 +477,8 @@ class InterceptionServer(Interception):
470
477
  logger.warning(
471
478
  "rollout %s failed: %s: %s", session.trace.id, type(error).__name__, error
472
479
  )
473
- return web.json_response(
474
- dialect.error_body(str(error)),
475
- status=getattr(error, "status_code", 502),
480
+ return _error_response(
481
+ dialect, str(error), status=getattr(error, "status_code", 502)
476
482
  )
477
483
 
478
484
  def mediate_capabilities(
@@ -589,7 +595,7 @@ class InterceptionServer(Interception):
589
595
  session = self.sessions.get(dialect.secret(request.headers))
590
596
  if session is None:
591
597
  logger.warning("interception: unauthorized request")
592
- return web.json_response(dialect.error_body("unauthorized"), status=401)
598
+ return _error_response(dialect, "unauthorized", status=401)
593
599
  session.adopt(asyncio.current_task())
594
600
  started = time.monotonic()
595
601
  try:
@@ -621,7 +627,7 @@ class InterceptionServer(Interception):
621
627
  try:
622
628
  acp, upstream_headers = extract_acp_info(request.headers)
623
629
  except ValueError as error:
624
- return web.json_response(dialect.error_body(str(error)), status=400)
630
+ return _error_response(dialect, str(error), status=400)
625
631
  logger.debug(
626
632
  "intercept %s: id=%s stream=%s retry=%s",
627
633
  request.path,
@@ -655,10 +661,9 @@ class InterceptionServer(Interception):
655
661
  if idempotency_key or retried:
656
662
  idempotent = session.idempotent_requests.get(replay_key)
657
663
  if idempotent is not None and idempotent.binding != binding:
658
- return web.json_response(
659
- dialect.error_body(
660
- "Idempotency-Key was reused with a different request"
661
- ),
664
+ return _error_response(
665
+ dialect,
666
+ "Idempotency-Key was reused with a different request",
662
667
  status=400,
663
668
  )
664
669
  if idempotent is not None and idempotent.response is not None:
@@ -671,15 +676,12 @@ class InterceptionServer(Interception):
671
676
  try:
672
677
  model_request = dialect.parse_request(body)
673
678
  except ValueError as error:
674
- return web.json_response(dialect.error_body(str(error)), status=400)
679
+ return _error_response(dialect, str(error), status=400)
675
680
  if session.released:
676
- return web.json_response(
677
- dialect.error_body("rollout concluded"), status=409
678
- )
681
+ return _error_response(dialect, "rollout concluded", status=409)
679
682
  if session.stopped:
680
- return web.json_response(
681
- dialect.error_body(f"rollout stopped: {session.trace.stop_condition}"),
682
- status=400,
683
+ return _error_response(
684
+ dialect, f"rollout stopped: {session.trace.stop_condition}", status=400
683
685
  )
684
686
  if idempotent is None:
685
687
  idempotent = IdempotentRequest(binding=binding)
@@ -693,9 +695,7 @@ class InterceptionServer(Interception):
693
695
  )
694
696
  response = await asyncio.shield(inflight)
695
697
  if response is None:
696
- return web.json_response(
697
- dialect.error_body("upstream attempt failed"), status=503
698
- )
698
+ return _error_response(dialect, "upstream attempt failed", status=503)
699
699
  return _replay_response(response)
700
700
 
701
701
  if idempotent.inflight is not None:
@@ -718,8 +718,8 @@ class InterceptionServer(Interception):
718
718
  try:
719
719
  refused = await session.refused()
720
720
  if refused is not None:
721
- return web.json_response(
722
- dialect.error_body(f"rollout stopped: {refused}"), status=400
721
+ return _error_response(
722
+ dialect, f"rollout stopped: {refused}", status=400
723
723
  )
724
724
  original_request = model_request
725
725
  model_request, request_rewrites, stopped = await session.rewrite_request(
@@ -747,10 +747,7 @@ class InterceptionServer(Interception):
747
747
  )
748
748
  turn.commit_prompt()
749
749
  session.trace.stop(stopped)
750
- return web.json_response(
751
- dialect.error_body(f"rollout stopped: {stopped}"),
752
- status=400,
753
- )
750
+ return _error_response(dialect, f"rollout stopped: {stopped}", status=400)
754
751
 
755
752
  try:
756
753
  body, policy_paths = self.mediate_capabilities(session, dialect, body)
@@ -761,7 +758,7 @@ class InterceptionServer(Interception):
761
758
  session.trace, model_request.messages, model_request.tools, dialect.name
762
759
  )
763
760
  except ValueError as error:
764
- return web.json_response(dialect.error_body(str(error)), status=400)
761
+ return _error_response(dialect, str(error), status=400)
765
762
  except RolloutError as error:
766
763
  return self._fail(session, dialect, error)
767
764
  # The tail is what the harness added since the last turn (tool results, user
@@ -822,9 +819,7 @@ class InterceptionServer(Interception):
822
819
  len(call_response.message.tool_calls or []),
823
820
  )
824
821
  if session.released: # concluded while sampling — seal holds
825
- return web.json_response(
826
- dialect.error_body("rollout concluded"), status=409
827
- )
822
+ return _error_response(dialect, "rollout concluded", status=409)
828
823
  response_rewrites = []
829
824
  stopped = None
830
825
  if session.response_interceptors or session.response_stops:
@@ -845,10 +840,9 @@ class InterceptionServer(Interception):
845
840
  )
846
841
  call_response.raw = raw_response
847
842
  if session.stopped:
848
- return web.json_response(
849
- dialect.error_body(
850
- f"rollout stopped: {session.trace.stop_condition}"
851
- ),
843
+ return _error_response(
844
+ dialect,
845
+ f"rollout stopped: {session.trace.stop_condition}",
852
846
  status=400,
853
847
  )
854
848
  node = turn.commit(call_response)
@@ -858,9 +852,8 @@ class InterceptionServer(Interception):
858
852
  stopped = await session.gate_tool_calls(node)
859
853
  if stopped is not None:
860
854
  session.trace.stop(stopped)
861
- return web.json_response(
862
- dialect.error_body(f"rollout stopped: {stopped}"),
863
- status=400,
855
+ return _error_response(
856
+ dialect, f"rollout stopped: {stopped}", status=400
864
857
  )
865
858
  except RolloutError as e:
866
859
  # Stash the real cause; the rollout re-raises it after the harness returns.
@@ -873,9 +866,8 @@ class InterceptionServer(Interception):
873
866
  type(e).__name__,
874
867
  e,
875
868
  )
876
- return web.json_response(
877
- dialect.error_body(str(e)),
878
- status=getattr(e, "status_code", 502),
869
+ return _error_response(
870
+ dialect, str(e), status=getattr(e, "status_code", 502)
879
871
  )
880
872
  except Exception as e: # noqa: BLE001 - surface as an API error
881
873
  error = e
@@ -885,7 +877,7 @@ class InterceptionServer(Interception):
885
877
  type(e).__name__,
886
878
  e,
887
879
  )
888
- return web.json_response(dialect.error_body(str(e)), status=502)
880
+ return _error_response(dialect, str(e), status=502)
889
881
  except BaseException as e:
890
882
  # A cancelled exchange (harness disconnect, shutdown) is still
891
883
  # recorded, coupled to its cancellation.
@@ -923,7 +915,7 @@ class InterceptionServer(Interception):
923
915
  relayed as native JSON, never recorded on the trace."""
924
916
  session = self.sessions.get(dialect.secret(request.headers))
925
917
  if session is None:
926
- return web.json_response(dialect.error_body("unauthorized"), status=401)
918
+ return _error_response(dialect, "unauthorized", status=401)
927
919
  session.adopt(asyncio.current_task())
928
920
  logger.debug("intercept aux %s: id=%s", route, session.trace.id)
929
921
  try:
@@ -942,12 +934,12 @@ class InterceptionServer(Interception):
942
934
  type(e).__name__,
943
935
  e,
944
936
  )
945
- return web.json_response(
946
- dialect.error_body(str(e)), status=getattr(e, "status_code", 502)
937
+ return _error_response(
938
+ dialect, str(e), status=getattr(e, "status_code", 502)
947
939
  )
948
940
  except Exception as e: # noqa: BLE001 - surface auxiliary relay failures
949
941
  logger.warning("aux call failed: id=%s %s", session.trace.id, e)
950
- return web.json_response(dialect.error_body(str(e)), status=502)
942
+ return _error_response(dialect, str(e), status=502)
951
943
  return web.json_response(result)
952
944
 
953
945
  async def handle_models(self, request: web.Request) -> web.Response:
@@ -978,7 +970,7 @@ class InterceptionServer(Interception):
978
970
  )
979
971
  except httpx.HTTPError as e:
980
972
  logger.warning("models call failed: id=%s %s", session.trace.id, e)
981
- return web.json_response(dialect.error_body(str(e)), status=502)
973
+ return _error_response(dialect, str(e), status=502)
982
974
  return web.Response(
983
975
  body=upstream.content,
984
976
  status=upstream.status_code,
@@ -51,6 +51,7 @@ CACHE = Path.home() / ".cache" / "harbor"
51
51
  HARBOR_INSTALL_HINT = "uv sync --python 3.12 --extra harbor"
52
52
  REWARD_JSON = "/logs/verifier/reward.json"
53
53
  MAX_REWARD_BYTES = 1024 * 1024
54
+ MAX_VERIFIER_OUTPUT_CHARS = 16 * 1024
54
55
  REWARD_JSON_ADAPTER = TypeAdapter(
55
56
  dict[str, float],
56
57
  config=ConfigDict(strict=True, allow_inf_nan=False),
@@ -447,6 +448,13 @@ class HarborTask(Task[HarborData, State, HarborTaskConfig]):
447
448
  result = await runtime.run(
448
449
  ["bash", "/tests/test.sh"], resolve_env(self.scoring.env or {})
449
450
  )
451
+ trace.info.setdefault("scoring_diagnostics", {})["harbor"] = {
452
+ "exit_code": result.exit_code,
453
+ "stdout": result.stdout[-MAX_VERIFIER_OUTPUT_CHARS:],
454
+ "stderr": result.stderr[-MAX_VERIFIER_OUTPUT_CHARS:],
455
+ "stdout_truncated": len(result.stdout) > MAX_VERIFIER_OUTPUT_CHARS,
456
+ "stderr_truncated": len(result.stderr) > MAX_VERIFIER_OUTPUT_CHARS,
457
+ }
450
458
  scores = await self.read_reward_json(runtime)
451
459
  if scores is None:
452
460
  try:
File without changes