verifiers 0.3.2.dev127__tar.gz → 0.3.2.dev128__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 (220) hide show
  1. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/PKG-INFO +1 -3
  2. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/pyproject.toml +0 -3
  3. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/gepa/dataset.py +1 -1
  4. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/tasksets/__init__.py +0 -10
  5. verifiers-0.3.2.dev127/verifiers/v1/tasksets/lean/__init__.py +0 -33
  6. verifiers-0.3.2.dev127/verifiers/v1/tasksets/lean/scoring.py +0 -262
  7. verifiers-0.3.2.dev127/verifiers/v1/tasksets/lean/taskset.py +0 -229
  8. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/.gitignore +0 -0
  9. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/LICENSE +0 -0
  10. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/README.md +0 -0
  11. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/tests/v1/conftest.py +0 -0
  12. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  13. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/tests/v1/fixtures/duet_v1.py +0 -0
  14. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
  15. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  16. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  17. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  18. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/tests/v1/fixtures/echo_v1.py +0 -0
  19. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/tests/v1/fixtures/pyproject.toml +0 -0
  20. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  21. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/tests/v1/test_color_codeword_tasks.py +0 -0
  22. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/tests/v1/test_configs.py +0 -0
  23. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/tests/v1/test_e2e.py +0 -0
  24. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/tests/v1/test_envs.py +0 -0
  25. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/tests/v1/test_graph.py +0 -0
  26. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/tests/v1/test_judges.py +0 -0
  27. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/tests/v1/test_platform_run.py +0 -0
  28. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/tests/v1/test_scoring.py +0 -0
  29. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/tests/v1/test_serve_delta.py +0 -0
  30. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/tests/v1/test_taskset.py +0 -0
  31. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/tests/v1/test_trace.py +0 -0
  32. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/__init__.py +0 -0
  33. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/__init__.py +0 -0
  34. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/acp/__init__.py +0 -0
  35. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/acp/runner.py +0 -0
  36. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/agent.py +0 -0
  37. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/cli/__init__.py +0 -0
  38. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  39. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/cli/dashboard/base.py +0 -0
  40. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/cli/dashboard/eval.py +0 -0
  41. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/cli/dashboard/replay.py +0 -0
  42. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/cli/dashboard/validate.py +0 -0
  43. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/cli/debug.py +0 -0
  44. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/cli/eval/__init__.py +0 -0
  45. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/cli/eval/hint.py +0 -0
  46. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/cli/eval/main.py +0 -0
  47. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/cli/eval/resume.py +0 -0
  48. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/cli/eval/runner.py +0 -0
  49. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/cli/gepa.py +0 -0
  50. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/cli/init.py +0 -0
  51. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/cli/output.py +0 -0
  52. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/cli/replay.py +0 -0
  53. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/cli/resolve.py +0 -0
  54. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/cli/resume.py +0 -0
  55. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/cli/validate.py +0 -0
  56. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/clients/__init__.py +0 -0
  57. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/clients/base.py +0 -0
  58. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/clients/client.py +0 -0
  59. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/clients/eval.py +0 -0
  60. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/clients/train.py +0 -0
  61. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/configs/__init__.py +0 -0
  62. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/configs/agent.py +0 -0
  63. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/configs/cli/__init__.py +0 -0
  64. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/configs/cli/debug.py +0 -0
  65. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/configs/cli/env.py +0 -0
  66. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/configs/cli/eval.py +0 -0
  67. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/configs/cli/init.py +0 -0
  68. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/configs/cli/replay.py +0 -0
  69. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/configs/cli/validate.py +0 -0
  70. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/configs/client.py +0 -0
  71. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/configs/env.py +0 -0
  72. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/configs/harness.py +0 -0
  73. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/configs/judge.py +0 -0
  74. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/configs/retries.py +0 -0
  75. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/configs/runtime.py +0 -0
  76. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/configs/serve.py +0 -0
  77. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/configs/task.py +0 -0
  78. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/configs/taskset.py +0 -0
  79. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/dialects/__init__.py +0 -0
  80. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/dialects/anthropic.py +0 -0
  81. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/dialects/base.py +0 -0
  82. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/dialects/chat.py +0 -0
  83. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/dialects/responses.py +0 -0
  84. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/env.py +0 -0
  85. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/envs/__init__.py +0 -0
  86. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
  87. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/envs/agentic_judge/env.py +0 -0
  88. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  89. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/envs/best_of_n/env.py +0 -0
  90. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/envs/isolated_verifier/__init__.py +0 -0
  91. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/envs/isolated_verifier/env.py +0 -0
  92. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/envs/shared_agentic_judge/__init__.py +0 -0
  93. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  94. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/envs/single_agent/env.py +0 -0
  95. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/envs/user_sim/__init__.py +0 -0
  96. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/envs/user_sim/env.py +0 -0
  97. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/episode.py +0 -0
  98. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/errors.py +0 -0
  99. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/gepa/__init__.py +0 -0
  100. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/gepa/adapter.py +0 -0
  101. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/gepa/config.py +0 -0
  102. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/gepa/reflection.py +0 -0
  103. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/gepa/runner.py +0 -0
  104. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/graph.py +0 -0
  105. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harness.py +0 -0
  106. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/__init__.py +0 -0
  107. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  108. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/bash/harness.py +0 -0
  109. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
  110. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
  111. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/browser_use/program.py +0 -0
  112. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  113. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
  114. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  115. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/codex/gate.mjs +0 -0
  116. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/codex/harness.py +0 -0
  117. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
  118. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
  119. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
  120. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  121. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  122. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  123. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  124. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  125. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/node.py +0 -0
  126. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/null/__init__.py +0 -0
  127. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/null/harness.py +0 -0
  128. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
  129. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/openclaw/harness.py +0 -0
  130. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  131. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/pi/gate.mjs +0 -0
  132. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/pi/harness.py +0 -0
  133. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/prime_agent/__init__.py +0 -0
  134. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/prime_agent/harness.py +0 -0
  135. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  136. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  137. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  138. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  139. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  140. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/utils/__init__.py +0 -0
  141. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/utils/compaction.py +0 -0
  142. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/utils/core.py +0 -0
  143. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/utils/install.py +0 -0
  144. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/utils/launch.py +0 -0
  145. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/harnesses/utils/mcp.py +0 -0
  146. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/interception/__init__.py +0 -0
  147. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/interception/base.py +0 -0
  148. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/interception/pool.py +0 -0
  149. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/interception/server.py +0 -0
  150. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  151. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/interception/tunnel/base.py +0 -0
  152. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/interception/tunnel/custom.py +0 -0
  153. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/interception/tunnel/prime.py +0 -0
  154. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/judge.py +0 -0
  155. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/judges/__init__.py +0 -0
  156. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/judges/reference.py +0 -0
  157. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/judges/reference.txt +0 -0
  158. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/judges/rubric.py +0 -0
  159. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/judges/rubric.txt +0 -0
  160. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/mcp/__init__.py +0 -0
  161. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/mcp/launch.py +0 -0
  162. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/mcp/server.py +0 -0
  163. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/mcp/toolset.py +0 -0
  164. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/rollout.py +0 -0
  165. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/runtimes/__init__.py +0 -0
  166. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/runtimes/apptainer.py +0 -0
  167. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/runtimes/base.py +0 -0
  168. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/runtimes/container.py +0 -0
  169. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/runtimes/docker/__init__.py +0 -0
  170. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/runtimes/docker/egress.py +0 -0
  171. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/runtimes/limiters.py +0 -0
  172. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/runtimes/modal.py +0 -0
  173. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/runtimes/prime.py +0 -0
  174. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/runtimes/subprocess.py +0 -0
  175. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/semantic.py +0 -0
  176. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/serve/__init__.py +0 -0
  177. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/serve/client.py +0 -0
  178. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/serve/delta.py +0 -0
  179. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/serve/encoding.py +0 -0
  180. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/serve/pool.py +0 -0
  181. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/serve/server.py +0 -0
  182. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/serve/types.py +0 -0
  183. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/session.py +0 -0
  184. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/state.py +0 -0
  185. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/task.py +0 -0
  186. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/taskset.py +0 -0
  187. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  188. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/tasksets/harbor/env.py +0 -0
  189. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  190. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/tasksets/harbor/toolset.py +0 -0
  191. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/tasksets/nemo_gym/__init__.py +0 -0
  192. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/tasksets/nemo_gym/response.py +0 -0
  193. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/tasksets/nemo_gym/server.py +0 -0
  194. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/tasksets/nemo_gym/taskset.py +0 -0
  195. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/tasksets/nemo_gym/toolset.py +0 -0
  196. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  197. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  198. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  199. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  200. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/trace.py +0 -0
  201. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/types.py +0 -0
  202. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/utils/__init__.py +0 -0
  203. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/utils/aio.py +0 -0
  204. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/utils/artifacts.py +0 -0
  205. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/utils/compile.py +0 -0
  206. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/utils/decorators.py +0 -0
  207. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/utils/format.py +0 -0
  208. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/utils/generic.py +0 -0
  209. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/utils/git.py +0 -0
  210. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/utils/image.py +0 -0
  211. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/utils/interrupt.py +0 -0
  212. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/utils/loaders.py +0 -0
  213. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/utils/logging.py +0 -0
  214. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/utils/memory.py +0 -0
  215. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/utils/paths.py +0 -0
  216. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/utils/platform.py +0 -0
  217. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/utils/prime.py +0 -0
  218. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/utils/retries.py +0 -0
  219. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/verifiers/v1/utils/score.py +0 -0
  220. {verifiers-0.3.2.dev127 → verifiers-0.3.2.dev128}/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.dev127
3
+ Version: 0.3.2.dev128
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
@@ -48,8 +48,6 @@ Requires-Dist: typing-extensions>=4.12.2
48
48
  Requires-Dist: uvicorn>=0.52.0
49
49
  Provides-Extra: harbor
50
50
  Requires-Dist: harbor==0.21.0; (python_full_version >= '3.12') and extra == 'harbor'
51
- Provides-Extra: lean
52
- Requires-Dist: datasets<6.0.0,>=3.3.0; extra == 'lean'
53
51
  Provides-Extra: modal
54
52
  Requires-Dist: modal>=1.5.4; extra == 'modal'
55
53
  Provides-Extra: openenv
@@ -89,9 +89,6 @@ examples = [
89
89
  ]
90
90
 
91
91
  [project.optional-dependencies]
92
- lean = [
93
- "datasets>=3.3.0,<6.0.0",
94
- ]
95
92
  ta = [
96
93
  "textarena==0.7.4",
97
94
  "nltk>=3.9.2",
@@ -40,5 +40,5 @@ def resolve_gepa_seed_prompt(tasks: list[Task], initial_prompt: str | None) -> s
40
40
  "no task in this taskset sets Task.system_prompt — some tasksets bake instructions "
41
41
  "directly into `prompt` instead (e.g. gsm8k) and can't be optimized this way. Pass "
42
42
  "--initial-prompt to seed one explicitly, or pick a taskset whose load() sets "
43
- "system_prompt on its task data (e.g. reverse-text, lean, textarena)."
43
+ "system_prompt on its task data (e.g. reverse-text, textarena)."
44
44
  )
@@ -1,10 +1,4 @@
1
1
  from verifiers.v1.tasksets.harbor import HarborConfig, HarborTaskset
2
- from verifiers.v1.tasksets.lean import (
3
- LeanConfig,
4
- LeanDatasetConfig,
5
- LeanTask,
6
- LeanTaskset,
7
- )
8
2
  from verifiers.v1.tasksets.nemo_gym import NeMoGymConfig, NeMoGymTaskset
9
3
  from verifiers.v1.tasksets.openenv import (
10
4
  OpenEnvConfig,
@@ -18,10 +12,6 @@ from verifiers.v1.tasksets.openenv import (
18
12
  __all__ = [
19
13
  "HarborConfig",
20
14
  "HarborTaskset",
21
- "LeanConfig",
22
- "LeanDatasetConfig",
23
- "LeanTask",
24
- "LeanTaskset",
25
15
  "NeMoGymConfig",
26
16
  "NeMoGymTaskset",
27
17
  "OpenEnvConfig",
@@ -1,33 +0,0 @@
1
- from verifiers.v1.tasksets.lean.scoring import (
2
- build_starter_file,
3
- expected_protected_signature,
4
- parse_compile_output,
5
- protected_signature_substring_present,
6
- strip_lean_comments,
7
- )
8
- from verifiers.v1.tasksets.lean.taskset import (
9
- DEFAULT_DOCKER_IMAGE,
10
- LEAN_PROJECT_PATH,
11
- PROOF_FILE_PATH,
12
- LeanConfig,
13
- LeanDatasetConfig,
14
- LeanTask,
15
- LeanTaskConfig,
16
- LeanTaskset,
17
- )
18
-
19
- __all__ = [
20
- "DEFAULT_DOCKER_IMAGE",
21
- "LEAN_PROJECT_PATH",
22
- "PROOF_FILE_PATH",
23
- "LeanConfig",
24
- "LeanDatasetConfig",
25
- "LeanTask",
26
- "LeanTaskConfig",
27
- "LeanTaskset",
28
- "build_starter_file",
29
- "expected_protected_signature",
30
- "parse_compile_output",
31
- "protected_signature_substring_present",
32
- "strip_lean_comments",
33
- ]
@@ -1,262 +0,0 @@
1
- """Pure helpers for the Lean taskset: starter-file construction, theorem-signature
2
- canonicalization, the reward-hacking signature guard, and compile-output parsing.
3
-
4
- Everything here is a pure function over plain strings — no runtime, no sandbox, no
5
- verifiers types — so it's trivially unit-testable and shared between ``setup``
6
- (building the starter file), the reward (the signature guard + compile parsing),
7
- and ``validate`` (planting the gold proof).
8
- """
9
-
10
- from __future__ import annotations
11
-
12
- import re
13
-
14
- PROTECTED_HEADER_COMMENT = (
15
- "-- DO NOT MODIFY the theorem statement below. The grader checks\n"
16
- "-- that the original `theorem ... := by` text still appears in\n"
17
- "-- this file. Only edit the proof body (currently `sorry`) and\n"
18
- "-- lines after it."
19
- )
20
-
21
-
22
- # ── Imports / preamble normalization ─────────────────────────────────────────
23
-
24
-
25
- def normalize_imports(text: str) -> str:
26
- """Collapse every ``import Mathlib*`` line to a single ``import Mathlib``.
27
-
28
- Some datasets (miniF2F) ship fine-grained Mathlib imports that don't resolve
29
- against the monolithic ``import Mathlib`` the sandbox image provides.
30
- """
31
- lines = text.split("\n")
32
- out: list[str] = []
33
- inserted = False
34
- for line in lines:
35
- if line.strip().startswith("import Mathlib"):
36
- if not inserted:
37
- out.append("import Mathlib")
38
- inserted = True
39
- else:
40
- out.append(line)
41
- return "\n".join(out)
42
-
43
-
44
- def _build_preamble(imports_str: str, header: str, normalize: bool) -> str:
45
- if header and header.strip().startswith("import"):
46
- preamble = header.strip()
47
- return normalize_imports(preamble) if normalize else preamble
48
- parts = [imports_str.strip()]
49
- if header and header.strip():
50
- parts.append(header.strip())
51
- preamble = "\n\n".join(parts)
52
- return normalize_imports(preamble) if normalize else preamble
53
-
54
-
55
- # ── Theorem signature canonicalization ───────────────────────────────────────
56
-
57
-
58
- def _normalize_signature(stmt: str) -> str:
59
- """Canonicalize a Lean theorem statement to end with ``:= by``.
60
-
61
- Strips trailing ``sorry``/``admit`` placeholders and any trailing ``by`` /
62
- ``:=`` tokens, then re-appends `` := by``. Places the appended token on a new
63
- indented line when the last line of the stripped signature already contains a
64
- ``--`` comment (otherwise the ``:= by`` would land inside the line comment and
65
- Lean would silently ignore it).
66
- """
67
- s = stmt.rstrip()
68
- s = re.sub(r"\s*\b(?:sorry|admit)\b\s*$", "", s)
69
- s = re.sub(r"\s*\bby\b\s*$", "", s)
70
- s = re.sub(r"\s*:=\s*$", "", s)
71
- s = s.rstrip()
72
- last_newline = s.rfind("\n")
73
- last_line = s[last_newline + 1 :] if last_newline != -1 else s
74
- sep = "\n " if "--" in last_line else " "
75
- return s + sep + ":= by"
76
-
77
-
78
- def _split_imports_and_signature(stmt: str) -> tuple[str, str]:
79
- decl_match = re.search(r"^(?:theorem|lemma|example)\s", stmt, flags=re.MULTILINE)
80
- if not decl_match:
81
- return "", stmt
82
- return stmt[: decl_match.start()].rstrip(), stmt[decl_match.start() :]
83
-
84
-
85
- def expected_protected_signature(formal_statement: str) -> str:
86
- """Return the canonical ``theorem ... := by`` block the reward pins as ground truth.
87
-
88
- Pure function over ``formal_statement``; the imports/header portion (if the
89
- statement carries one inline) is stripped first.
90
- """
91
- stmt = formal_statement or ""
92
- if stmt.strip().startswith("import "):
93
- _, signature_raw = _split_imports_and_signature(stmt)
94
- else:
95
- signature_raw = stmt
96
- return _normalize_signature(signature_raw).strip()
97
-
98
-
99
- # ── Comment / string stripping for the signature guard ───────────────────────
100
-
101
-
102
- def strip_lean_comments(text: str) -> str:
103
- """Remove Lean line/block comments **and string literals** from ``text``.
104
-
105
- Lean comments come in two forms: ``-- ...`` line comments (to end of line) and
106
- ``/- ... -/`` block comments (nestable; ``/-- ... -/`` doc comments are a
107
- special case). String literals must also be stripped: a Lean
108
- ``"theorem ... := by"`` constant or doc-string would otherwise let a model hide
109
- the pinned signature inside a string while rewriting the live declaration to a
110
- trivial one, defeating the substring guard. We handle both regular
111
- double-quoted strings (with backslash escapes) and triple-quoted raw strings.
112
-
113
- Block comments nest, so we count depth; line comments end at the next newline.
114
- Outside comments and strings, newlines are preserved so the result keeps
115
- roughly the right shape for substring matching downstream.
116
- """
117
- out: list[str] = []
118
- i = 0
119
- n = len(text)
120
- block_depth = 0
121
- in_line_comment = False
122
- while i < n:
123
- ch = text[i]
124
- if in_line_comment:
125
- if ch == "\n":
126
- in_line_comment = False
127
- out.append(ch)
128
- i += 1
129
- continue
130
- if block_depth > 0:
131
- if i + 1 < n and text[i : i + 2] == "-/":
132
- block_depth -= 1
133
- i += 2
134
- continue
135
- if i + 1 < n and text[i : i + 2] == "/-":
136
- block_depth += 1
137
- i += 2
138
- continue
139
- if ch == "\n":
140
- out.append(ch)
141
- i += 1
142
- continue
143
- if i + 1 < n and text[i : i + 2] == "/-":
144
- block_depth = 1
145
- i += 2
146
- continue
147
- if i + 1 < n and text[i : i + 2] == "--":
148
- in_line_comment = True
149
- i += 2
150
- continue
151
- # Triple-quoted raw string ``"""..."""`` — skip until the closing
152
- # triple-quote, preserving newlines.
153
- if i + 2 < n and text[i : i + 3] == '"""':
154
- i += 3
155
- while i < n:
156
- if i + 2 < n and text[i : i + 3] == '"""':
157
- i += 3
158
- break
159
- if text[i] == "\n":
160
- out.append("\n")
161
- i += 1
162
- continue
163
- # Regular string ``"..."`` — handle ``\\`` escapes, stop at the next
164
- # unescaped quote or newline (Lean strings are single-line).
165
- if ch == '"':
166
- i += 1
167
- while i < n and text[i] != '"' and text[i] != "\n":
168
- if text[i] == "\\" and i + 1 < n:
169
- i += 2
170
- else:
171
- i += 1
172
- if i < n and text[i] == '"':
173
- i += 1
174
- continue
175
- out.append(ch)
176
- i += 1
177
- return "".join(out)
178
-
179
-
180
- def protected_signature_substring_present(
181
- content: str, expected_signature: str
182
- ) -> bool:
183
- """True when the locked signature text still appears in the file.
184
-
185
- Strips Lean comments from BOTH sides — without that a model could paste the
186
- pinned signature into a ``--`` or ``/- ... -/`` block while rewriting the live
187
- declaration to something trivial, and the asymmetric variant would also misfire
188
- if ``expected_signature`` itself contains a comment. Tries an exact substring
189
- match first, then a whitespace-flexible match (each side collapsed to
190
- single-spaced tokens) so the model can re-indent or reflow whitespace freely.
191
- """
192
- if not expected_signature:
193
- return True
194
- decommented_content = strip_lean_comments(content)
195
- decommented_expected = strip_lean_comments(expected_signature)
196
- if not decommented_expected.strip():
197
- return True
198
- if decommented_expected in decommented_content:
199
- return True
200
- flat_signature = " ".join(decommented_expected.split())
201
- flat_content = " ".join(decommented_content.split())
202
- return flat_signature in flat_content
203
-
204
-
205
- # ── Starter-file construction ────────────────────────────────────────────────
206
-
207
-
208
- def build_starter_file(
209
- formal_statement: str,
210
- header: str = "",
211
- imports: str = "import Mathlib",
212
- normalize: bool = False,
213
- proof_body: str | None = None,
214
- ) -> str:
215
- """Construct the starter proof file.
216
-
217
- Layout: preamble (imports / header) + a brief ``-- DO NOT MODIFY`` comment
218
- block + the normalized theorem signature + the proof body. If ``proof_body`` is
219
- None (the default) the body is the placeholder `` sorry`` — what's planted at
220
- rollout start. A supplied gold ``proof_body`` (e.g. by ``validate``) replaces
221
- the placeholder so the file is the full reference solution.
222
- """
223
- stmt = formal_statement or ""
224
- if stmt.strip().startswith("import "):
225
- imports_block, signature_raw = _split_imports_and_signature(stmt)
226
- preamble = normalize_imports(imports_block) if normalize else imports_block
227
- else:
228
- preamble = _build_preamble(imports or "import Mathlib", header, normalize)
229
- signature_raw = stmt
230
-
231
- signature = _normalize_signature(signature_raw)
232
- body = " sorry" if proof_body is None else proof_body.rstrip()
233
- wrapped = f"{PROTECTED_HEADER_COMMENT}\n{signature}\n{body}\n"
234
- if preamble:
235
- return preamble.rstrip() + "\n\n" + wrapped
236
- return wrapped
237
-
238
-
239
- # ── Compile-output parsing ───────────────────────────────────────────────────
240
-
241
-
242
- def parse_compile_output(output: str) -> tuple[bool, str, int]:
243
- """Parse a ``lake env lean ...; echo EXIT_CODE:$?`` transcript.
244
-
245
- Returns ``(compiled, cleaned_output, exit_code)`` where ``compiled`` is True iff
246
- the compiler exited 0 with no ``declaration uses 'sorry'`` diagnostic.
247
-
248
- Matches the LAST ``EXIT_CODE:N`` — that's the one our shell appends at the end
249
- of the command. Matching the first occurrence would let a model inject
250
- ``#eval IO.println "EXIT_CODE:0"`` into the proof file to bypass the
251
- sorry/exit-code checks: the regex would hit the injected marker, truncate
252
- everything after it (hiding the real ``declaration uses 'sorry'`` diagnostic and
253
- the real EXIT_CODE), and report success.
254
- """
255
- exit_code = 1
256
- matches = list(re.finditer(r"EXIT_CODE:(\d+)", output))
257
- if matches:
258
- last = matches[-1]
259
- exit_code = int(last.group(1))
260
- output = output[: last.start()].strip()
261
- has_sorry = bool(re.search(r"declaration uses 'sorry'", output))
262
- return (exit_code == 0 and not has_sorry), output, exit_code
@@ -1,229 +0,0 @@
1
- """Lean 4 theorem-proving tasks backed by Hugging Face datasets.
2
-
3
- Each task plants a ``sorry``-based starter file, lets any container-capable
4
- harness edit it, and rewards a clean ``lake env lean`` compile. The original
5
- theorem signature must remain present, which prevents replacing the assigned
6
- statement with an easier theorem. Dataset-specific packages can subclass this
7
- taskset and only supply column mappings.
8
- """
9
-
10
- from __future__ import annotations
11
-
12
- import shlex
13
- from collections.abc import Iterator
14
-
15
- from pydantic_config import BaseConfig
16
-
17
- from verifiers.v1.configs.task import TaskConfig
18
- from verifiers.v1.configs.taskset import TasksetConfig
19
- from verifiers.v1.runtimes import Runtime
20
- from verifiers.v1.state import State
21
- from verifiers.v1.task import Task, TaskData, TaskResources
22
- from verifiers.v1.taskset import Taskset
23
- from verifiers.v1.tasksets.lean.scoring import (
24
- build_starter_file,
25
- expected_protected_signature,
26
- parse_compile_output,
27
- protected_signature_substring_present,
28
- )
29
- from verifiers.v1.trace import Trace
30
- from verifiers.v1.utils.decorators import reward
31
-
32
- # Lean v4.27 with Mathlib v4.27.
33
- DEFAULT_DOCKER_IMAGE = "team-clyvldofb0000gg1kx39rgzjq/lean-tactic:mathlib-v4.27.0-v3"
34
- LEAN_PROJECT_PATH = "/workspace/mathlib4"
35
- PROOF_FILE_PATH = "/tmp/proof.lean"
36
-
37
- DEFAULT_SYSTEM_PROMPT = "You are an expert Lean 4 theorem prover working with Mathlib."
38
-
39
-
40
- class LeanDatasetConfig(BaseConfig):
41
- name: str
42
- """HuggingFace dataset id (required; each per-dataset package sets it)."""
43
- split: str = "train"
44
- subset: str | None = None
45
- statement_column: str = "formal_statement"
46
- header_column: str | None = None
47
- imports_column: str | None = None
48
- name_column: str | None = None
49
- proof_column: str | None = None
50
- """Column holding the gold proof body (used by ``validate``); None = no gold."""
51
- normalize_mathlib_imports: bool = False
52
-
53
-
54
- class LeanTaskConfig(TaskConfig):
55
- lean_project_path: str = LEAN_PROJECT_PATH
56
- proof_file_path: str = PROOF_FILE_PATH
57
- compile_timeout: int = 300
58
- """Per-compile ``timeout`` wrapper (seconds), bounding each ``lake env lean``."""
59
-
60
-
61
- class LeanConfig(TasksetConfig):
62
- dataset: LeanDatasetConfig
63
- docker_image: str = DEFAULT_DOCKER_IMAGE
64
- task: LeanTaskConfig = LeanTaskConfig()
65
-
66
-
67
- class LeanData(TaskData):
68
- formal_statement: str
69
- header: str = ""
70
- imports: str = "import Mathlib"
71
- normalize_mathlib_imports: bool = False
72
- # Canonical ``theorem ... := by`` text pinned at load; the reward checks it
73
- # still appears in the final file (the only edit the reward cares about).
74
- protected_signature: str = ""
75
- # Gold proof body (replaces `` sorry``); "" when the dataset ships no gold.
76
- formal_proof: str = ""
77
-
78
-
79
- class LeanTask(Task[LeanData, State, LeanTaskConfig]):
80
- NEEDS_CONTAINER = True
81
-
82
- async def _compile(self, runtime: Runtime) -> tuple[bool, str, int]:
83
- cmd = (
84
- f"cd {shlex.quote(self.config.lean_project_path)} && "
85
- f"timeout {self.config.compile_timeout} lake env lean "
86
- f"{shlex.quote(self.config.proof_file_path)} 2>&1; "
87
- "echo EXIT_CODE:$?"
88
- )
89
- result = await runtime.run(["bash", "-lc", cmd], {})
90
- return parse_compile_output((result.stdout or "") + (result.stderr or ""))
91
-
92
- async def setup(self, runtime: Runtime) -> None:
93
- content = build_starter_file(
94
- self.data.formal_statement,
95
- header=self.data.header,
96
- imports=self.data.imports,
97
- normalize=self.data.normalize_mathlib_imports,
98
- )
99
- await runtime.write(self.config.proof_file_path, content.encode())
100
-
101
- @reward(weight=1.0)
102
- async def lean_compiled(self, trace: Trace, runtime: Runtime) -> float:
103
- """Require both the assigned signature and a clean Lean compile."""
104
- if trace.has_error:
105
- return 0.0
106
-
107
- # Setup created this file, so a read failure is an infrastructure error.
108
- current = (await runtime.read(self.config.proof_file_path)).decode(
109
- "utf-8", "replace"
110
- )
111
-
112
- expected_sig = self.data.protected_signature or expected_protected_signature(
113
- self.data.formal_statement
114
- )
115
- if expected_sig and not protected_signature_substring_present(
116
- current, expected_sig
117
- ):
118
- trace.info["lean_tampered"] = True
119
- trace.info["compile_output"] = "signature rewritten or hidden in a comment"
120
- return 0.0
121
- trace.info["lean_tampered"] = False
122
-
123
- compiled, output, exit_code = await self._compile(runtime)
124
- trace.info["lean_compiled"] = compiled
125
- trace.info["compile_exit_code"] = exit_code
126
- trace.info["compile_output"] = output[-4000:]
127
- return 1.0 if compiled else 0.0
128
-
129
- async def validate(self, runtime: Runtime) -> bool | None:
130
- """Compile the gold proof; rows without one have nothing to preflight."""
131
- gold = (self.data.formal_proof or "").rstrip()
132
- if not gold:
133
- return None
134
- content = build_starter_file(
135
- self.data.formal_statement,
136
- header=self.data.header,
137
- imports=self.data.imports,
138
- normalize=self.data.normalize_mathlib_imports,
139
- proof_body=gold,
140
- )
141
- await runtime.write(self.config.proof_file_path, content.encode())
142
- compiled, _, _ = await self._compile(runtime)
143
- return compiled
144
-
145
-
146
- class LeanTaskset(Taskset[LeanTask, LeanConfig]):
147
- def load(self) -> Iterator[LeanTask]:
148
- try:
149
- from datasets import load_dataset
150
- except ModuleNotFoundError as e:
151
- raise ModuleNotFoundError(
152
- "the Lean taskset requires the `lean` extra; install `verifiers[lean]`"
153
- ) from e
154
-
155
- config = self.config
156
- ds = config.dataset
157
- raw = load_dataset(
158
- ds.name,
159
- ds.subset,
160
- split=ds.split,
161
- num_proc=8,
162
- )
163
-
164
- # Validate optional columns before empty-value fallbacks hide a typo.
165
- for label, col in (
166
- ("statement_column", ds.statement_column),
167
- ("header_column", ds.header_column),
168
- ("imports_column", ds.imports_column),
169
- ("name_column", ds.name_column),
170
- ("proof_column", ds.proof_column),
171
- ):
172
- if col is not None and col not in raw.column_names:
173
- raise ValueError(
174
- f"dataset.{label}={col!r} not found in {ds.name!r}; columns={raw.column_names}"
175
- )
176
-
177
- resources = TaskResources(cpu=4, memory=4, disk=10)
178
- for index, row in enumerate(raw):
179
- # An empty statement would reduce the signature guard to `:= by`.
180
- formal_statement = row[ds.statement_column]
181
- if not isinstance(formal_statement, str) or not formal_statement.strip():
182
- continue
183
- # A disabled optional column is None; row.get(None) yields the same
184
- # empty fallback as a present-but-empty column.
185
- header = row.get(ds.header_column) or ""
186
- imports = row.get(ds.imports_column) or "import Mathlib"
187
- gold = row.get(ds.proof_column) or ""
188
- name = row.get(ds.name_column)
189
- yield LeanTask(
190
- LeanData(
191
- idx=index,
192
- name=str(name) if name else f"task_{index:05d}",
193
- prompt=self._build_prompt(formal_statement, header),
194
- system_prompt=DEFAULT_SYSTEM_PROMPT,
195
- image=config.docker_image,
196
- workdir=config.task.lean_project_path,
197
- resources=resources,
198
- formal_statement=formal_statement,
199
- header=header,
200
- imports=imports,
201
- normalize_mathlib_imports=ds.normalize_mathlib_imports,
202
- protected_signature=expected_protected_signature(formal_statement),
203
- formal_proof=gold,
204
- ),
205
- self.config.task,
206
- )
207
-
208
- def _build_prompt(self, formal_statement: str, header: str) -> str:
209
- cfg = self.config
210
- block = (
211
- "Prove the following Lean 4 theorem. A starter proof file is at "
212
- f"`{cfg.task.proof_file_path}` with the theorem statement and a `sorry` "
213
- "placeholder already in place. Edit it and compile with "
214
- f"`cd {cfg.task.lean_project_path} && lake env lean {cfg.task.proof_file_path}`.\n\n"
215
- f"```lean\n{formal_statement}\n```"
216
- )
217
- if header:
218
- block += f"\n\nThe file header (imports/namespaces) is already set up:\n```lean\n{header}\n```"
219
- block += (
220
- "\n\nDo NOT modify the theorem statement (the lines from `theorem ...` "
221
- "through `:= by`) — the grader checks the original statement still "
222
- "appears and gives zero reward if you rewrote it. Write your proof "
223
- "tactics in place of `sorry`; the final proof must not contain `sorry` "
224
- "or `admit`. A clean compile prints nothing and exits 0."
225
- )
226
- return block
227
-
228
-
229
- __all__ = ["LeanConfig", "LeanTask", "LeanTaskset"]