verifiers 0.1.15.dev401__tar.gz → 0.1.15.dev402__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 (409) hide show
  1. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/PKG-INFO +1 -1
  2. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -6
  3. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/tasksets/__init__.py +14 -1
  4. verifiers-0.1.15.dev402/verifiers/v1/tasksets/lean/__init__.py +31 -0
  5. verifiers-0.1.15.dev402/verifiers/v1/tasksets/lean/scoring.py +262 -0
  6. verifiers-0.1.15.dev402/verifiers/v1/tasksets/lean/taskset.py +265 -0
  7. verifiers-0.1.15.dev401/tests/test_lean_task.py +0 -344
  8. verifiers-0.1.15.dev401/verifiers/envs/experimental/composable/tasksets/lean/__init__.py +0 -13
  9. verifiers-0.1.15.dev401/verifiers/envs/experimental/composable/tasksets/lean/lean_task.py +0 -458
  10. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/.gitignore +0 -0
  11. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/LICENSE +0 -0
  12. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/README.md +0 -0
  13. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/pyproject.toml +0 -0
  14. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/AGENTS.md +0 -0
  15. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/README.md +0 -0
  16. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/__init__.py +0 -0
  17. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/conftest.py +0 -0
  18. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_browser_env.py +0 -0
  19. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_build_script.py +0 -0
  20. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_cli_agent_env.py +0 -0
  21. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_client_auth_errors.py +0 -0
  22. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_client_config.py +0 -0
  23. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_client_multimodal_types.py +0 -0
  24. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_composable_env.py +0 -0
  25. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_context_token_metrics.py +0 -0
  26. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_decorator_ranks.py +0 -0
  27. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_endpoint_registry.py +0 -0
  28. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_env_group.py +0 -0
  29. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_env_server.py +0 -0
  30. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_environment.py +0 -0
  31. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_environment_extra.py +0 -0
  32. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_envs.py +0 -0
  33. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_error_chain.py +0 -0
  34. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_eval_display.py +0 -0
  35. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_eval_utils.py +0 -0
  36. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_gepa_cli.py +0 -0
  37. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_gepa_utils.py +0 -0
  38. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_gym_env.py +0 -0
  39. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_harbor_env_mcp.py +0 -0
  40. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_imports.py +0 -0
  41. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_init_script.py +0 -0
  42. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_install_utils.py +0 -0
  43. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_interception_utils.py +0 -0
  44. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_logging.py +0 -0
  45. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_math_rubric.py +0 -0
  46. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_maybe_think_parser.py +0 -0
  47. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_message_utils.py +0 -0
  48. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_message_utils_multimodal.py +0 -0
  49. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_multiturn_env.py +0 -0
  50. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_nemorl_client.py +0 -0
  51. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_openai_chat_completions_token_client.py +0 -0
  52. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_openai_responses_client.py +0 -0
  53. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_opencode_rlm_env.py +0 -0
  54. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_openenv_client.py +0 -0
  55. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_parser.py +0 -0
  56. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_path_utils.py +0 -0
  57. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_per_turn_timing.py +0 -0
  58. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_pricing_utils.py +0 -0
  59. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_prime_plugin.py +0 -0
  60. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_renderer_client.py +0 -0
  61. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_renderer_e2e.py +0 -0
  62. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_rlm_composable_env.py +0 -0
  63. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_rubric.py +0 -0
  64. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_rubric_group.py +0 -0
  65. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_sandbox_debug_env.py +0 -0
  66. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_sandbox_env.py +0 -0
  67. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_sandbox_mixin.py +0 -0
  68. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_save_utils.py +0 -0
  69. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_setup_script.py +0 -0
  70. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_singleturn_env.py +0 -0
  71. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_stateful_tool_env.py +0 -0
  72. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_think_parser.py +0 -0
  73. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_tool_env.py +0 -0
  74. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_tool_utils.py +0 -0
  75. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_trajectory_processing.py +0 -0
  76. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_tui_info_formatting.py +0 -0
  77. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_types.py +0 -0
  78. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_wordle_env.py +0 -0
  79. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_xml_parser.py +0 -0
  80. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/v1/conftest.py +0 -0
  81. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  82. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  83. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/v1/fixtures/echo_multi_v0.py +0 -0
  84. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  85. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  86. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/v1/fixtures/echo_v0.py +0 -0
  87. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/v1/fixtures/echo_v1.py +0 -0
  88. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/v1/fixtures/pyproject.toml +0 -0
  89. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  90. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/v1/test_color_codeword_tasks.py +0 -0
  91. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/v1/test_configs.py +0 -0
  92. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/v1/test_e2e.py +0 -0
  93. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/v1/test_envs.py +0 -0
  94. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/v1/test_graph.py +0 -0
  95. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/v1/test_legacy.py +0 -0
  96. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/v1/test_trace.py +0 -0
  97. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/AGENTS.md +0 -0
  98. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/__init__.py +0 -0
  99. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/cli/__init__.py +0 -0
  100. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/cli/commands/__init__.py +0 -0
  101. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/cli/commands/build.py +0 -0
  102. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/cli/commands/eval.py +0 -0
  103. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/cli/commands/gepa.py +0 -0
  104. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/cli/commands/init.py +0 -0
  105. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/cli/commands/install.py +0 -0
  106. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/cli/commands/setup.py +0 -0
  107. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/cli/plugins/__init__.py +0 -0
  108. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/cli/plugins/prime.py +0 -0
  109. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/cli/tui.py +0 -0
  110. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/clients/__init__.py +0 -0
  111. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/clients/anthropic_messages_client.py +0 -0
  112. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/clients/client.py +0 -0
  113. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
  114. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/clients/openai_chat_completions_client.py +0 -0
  115. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
  116. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/clients/openai_completions_client.py +0 -0
  117. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/clients/openai_responses_client.py +0 -0
  118. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/clients/renderer_client.py +0 -0
  119. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/decorators.py +0 -0
  120. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/AGENTS.md +0 -0
  121. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/__init__.py +0 -0
  122. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/env_group.py +0 -0
  123. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/environment.py +0 -0
  124. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/README.md +0 -0
  125. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/__init__.py +0 -0
  126. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/cli_agent_env.py +0 -0
  127. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/README.md +0 -0
  128. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/__init__.py +0 -0
  129. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/_filter.py +0 -0
  130. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/composable_env.py +0 -0
  131. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/harness.py +0 -0
  132. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
  133. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  134. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
  135. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
  136. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
  137. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
  138. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
  139. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/task.py +0 -0
  140. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  141. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  142. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  143. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  144. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  145. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  146. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  147. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  148. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  149. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
  150. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
  151. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
  152. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
  153. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
  154. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
  155. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
  156. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
  157. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/__init__.py +0 -0
  158. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/tool_pdf.py +0 -0
  159. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +0 -0
  160. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
  161. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/__init__.py +0 -0
  162. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/base_client.py +0 -0
  163. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +0 -0
  164. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/cache_prompts.py +0 -0
  165. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +0 -0
  166. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/cache_filesys.py +0 -0
  167. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/load_eval_script.py +0 -0
  168. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +0 -0
  169. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/tool_visit.py +0 -0
  170. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/url_tools.py +0 -0
  171. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +0 -0
  172. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
  173. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
  174. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
  175. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
  176. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
  177. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
  178. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
  179. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  180. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  181. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  182. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  183. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  184. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  185. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  186. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  187. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  188. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  189. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  190. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  191. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  192. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  193. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  194. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  195. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  196. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  197. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  198. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  199. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  200. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  201. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  202. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/gym_env.py +0 -0
  203. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
  204. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/harbor_env/env.py +0 -0
  205. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
  206. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/mcp_env.py +0 -0
  207. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/opencode_env.py +0 -0
  208. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
  209. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
  210. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
  211. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/utils/__init__.py +0 -0
  212. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/utils/file_locks.py +0 -0
  213. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
  214. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/integrations/README.md +0 -0
  215. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/integrations/__init__.py +0 -0
  216. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/integrations/browser_env/README.md +0 -0
  217. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
  218. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
  219. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
  220. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
  221. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  222. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  223. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/integrations/openenv_env.py +0 -0
  224. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
  225. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/integrations/textarena_env.py +0 -0
  226. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/multiturn_env.py +0 -0
  227. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/python_env.py +0 -0
  228. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/sandbox_env.py +0 -0
  229. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/singleturn_env.py +0 -0
  230. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/stateful_tool_env.py +0 -0
  231. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/tool_env.py +0 -0
  232. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/errors.py +0 -0
  233. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/gepa/__init__.py +0 -0
  234. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/gepa/adapter.py +0 -0
  235. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/gepa/config.py +0 -0
  236. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/gepa/display.py +0 -0
  237. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/gepa/gepa_utils.py +0 -0
  238. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/parsers/__init__.py +0 -0
  239. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/parsers/maybe_think_parser.py +0 -0
  240. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/parsers/parser.py +0 -0
  241. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/parsers/think_parser.py +0 -0
  242. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/parsers/xml_parser.py +0 -0
  243. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/rl/README.md +0 -0
  244. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/rl/__init__.py +0 -0
  245. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/rl/inference/__init__.py +0 -0
  246. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/rl/inference/client.py +0 -0
  247. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/rl/inference/server.py +0 -0
  248. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/rl/trainer/__init__.py +0 -0
  249. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/rl/trainer/config.py +0 -0
  250. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/rl/trainer/orchestrator.py +0 -0
  251. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/rl/trainer/trainer.py +0 -0
  252. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/rl/trainer/utils.py +0 -0
  253. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/rubrics/__init__.py +0 -0
  254. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
  255. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/rubrics/judge_rubric.py +0 -0
  256. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/rubrics/math_rubric.py +0 -0
  257. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/rubrics/rubric.py +0 -0
  258. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/rubrics/rubric_group.py +0 -0
  259. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/scripts/__init__.py +0 -0
  260. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/scripts/build.py +0 -0
  261. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/scripts/eval.py +0 -0
  262. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/scripts/gepa.py +0 -0
  263. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/scripts/init.py +0 -0
  264. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/scripts/install.py +0 -0
  265. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/scripts/rl.py +0 -0
  266. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/scripts/setup.py +0 -0
  267. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/scripts/train.py +0 -0
  268. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/scripts/tui.py +0 -0
  269. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/scripts/vllm.py +0 -0
  270. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/serve/__init__.py +0 -0
  271. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/serve/client/env_client.py +0 -0
  272. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/serve/client/zmq_env_client.py +0 -0
  273. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/serve/server/__init__.py +0 -0
  274. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/serve/server/env_router.py +0 -0
  275. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/serve/server/env_server.py +0 -0
  276. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/serve/server/env_worker.py +0 -0
  277. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/serve/server/zmq_env_server.py +0 -0
  278. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/serve/types.py +0 -0
  279. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/types.py +0 -0
  280. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/__init__.py +0 -0
  281. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/async_utils.py +0 -0
  282. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/client_utils.py +0 -0
  283. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/config_utils.py +0 -0
  284. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/data_utils.py +0 -0
  285. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/display_utils.py +0 -0
  286. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/env_config_utils.py +0 -0
  287. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/env_utils.py +0 -0
  288. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/error_utils.py +0 -0
  289. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/eval_display.py +0 -0
  290. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/eval_utils.py +0 -0
  291. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/heartbeat.py +0 -0
  292. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/import_utils.py +0 -0
  293. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/install_utils.py +0 -0
  294. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/interception_utils.py +0 -0
  295. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/logging_utils.py +0 -0
  296. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/message_utils.py +0 -0
  297. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/metric_utils.py +0 -0
  298. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/path_utils.py +0 -0
  299. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/pricing_utils.py +0 -0
  300. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/process_utils.py +0 -0
  301. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/response_utils.py +0 -0
  302. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/save_utils.py +0 -0
  303. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/serve_utils.py +0 -0
  304. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/thread_utils.py +0 -0
  305. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/threaded_sandbox_client.py +0 -0
  306. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/tool_utils.py +0 -0
  307. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/usage_utils.py +0 -0
  308. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/version_utils.py +0 -0
  309. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/ARCHITECTURE.md +0 -0
  310. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/GUIDE.md +0 -0
  311. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/README.md +0 -0
  312. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/__init__.py +0 -0
  313. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/cli/__init__.py +0 -0
  314. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  315. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/cli/dashboard/base.py +0 -0
  316. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/cli/dashboard/eval.py +0 -0
  317. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/cli/dashboard/validate.py +0 -0
  318. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/cli/eval/__init__.py +0 -0
  319. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/cli/eval/main.py +0 -0
  320. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/cli/eval/resume.py +0 -0
  321. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/cli/eval/runner.py +0 -0
  322. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/cli/init.py +0 -0
  323. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/cli/output.py +0 -0
  324. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/cli/resolve.py +0 -0
  325. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/cli/serve.py +0 -0
  326. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/cli/validate.py +0 -0
  327. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/clients/__init__.py +0 -0
  328. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/clients/client.py +0 -0
  329. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/clients/config.py +0 -0
  330. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/clients/eval.py +0 -0
  331. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/clients/train.py +0 -0
  332. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/configs/__init__.py +0 -0
  333. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/configs/eval.py +0 -0
  334. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/configs/init.py +0 -0
  335. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/configs/serve.py +0 -0
  336. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/configs/validate.py +0 -0
  337. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/decorators.py +0 -0
  338. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/dialects/__init__.py +0 -0
  339. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/dialects/anthropic.py +0 -0
  340. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/dialects/base.py +0 -0
  341. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/dialects/chat.py +0 -0
  342. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/dialects/responses.py +0 -0
  343. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/env.py +0 -0
  344. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/episode.py +0 -0
  345. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/errors.py +0 -0
  346. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/graph.py +0 -0
  347. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harness.py +0 -0
  348. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/__init__.py +0 -0
  349. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  350. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/bash/harness.py +0 -0
  351. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/bash/program.py +0 -0
  352. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/bash_edit/__init__.py +0 -0
  353. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/bash_edit/harness.py +0 -0
  354. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/bash_edit/program.py +0 -0
  355. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  356. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/codex/harness.py +0 -0
  357. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/default/__init__.py +0 -0
  358. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/default/harness.py +0 -0
  359. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/default/program.py +0 -0
  360. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  361. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  362. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  363. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  364. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  365. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  366. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  367. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  368. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  369. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  370. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/interception/__init__.py +0 -0
  371. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/interception/pool.py +0 -0
  372. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/interception/server.py +0 -0
  373. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/judge.py +0 -0
  374. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/legacy.py +0 -0
  375. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/loaders.py +0 -0
  376. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/mcp/__init__.py +0 -0
  377. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/mcp/launch.py +0 -0
  378. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/mcp/multiplex.py +0 -0
  379. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/mcp/server.py +0 -0
  380. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/mcp/toolset.py +0 -0
  381. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/mcp/user.py +0 -0
  382. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/retries.py +0 -0
  383. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/rollout.py +0 -0
  384. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/runtimes/__init__.py +0 -0
  385. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/runtimes/base.py +0 -0
  386. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/runtimes/docker.py +0 -0
  387. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/runtimes/limiters.py +0 -0
  388. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/runtimes/modal.py +0 -0
  389. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/runtimes/prime.py +0 -0
  390. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/runtimes/subprocess.py +0 -0
  391. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/serve/__init__.py +0 -0
  392. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/serve/client.py +0 -0
  393. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/serve/pool.py +0 -0
  394. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/serve/server.py +0 -0
  395. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/serve/types.py +0 -0
  396. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/state.py +0 -0
  397. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/task.py +0 -0
  398. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/taskset.py +0 -0
  399. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  400. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  401. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  402. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  403. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/trace.py +0 -0
  404. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/types.py +0 -0
  405. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/utils/__init__.py +0 -0
  406. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/utils/format.py +0 -0
  407. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/utils/install.py +0 -0
  408. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/utils/logging.py +0 -0
  409. {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/utils/memory.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: verifiers
3
- Version: 0.1.15.dev401
3
+ Version: 0.1.15.dev402
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
@@ -17,10 +17,6 @@ from verifiers.envs.experimental.composable.tasksets.swe.swe_tasksets import (
17
17
  make_swesmith_taskset,
18
18
  make_swesmith_ts_taskset,
19
19
  )
20
- from verifiers.envs.experimental.composable.tasksets.lean.lean_task import (
21
- LEAN_SYSTEM_PROMPT,
22
- LeanTaskSet,
23
- )
24
20
  from verifiers.envs.experimental.composable.tasksets.math.math_task import MathTaskSet
25
21
  from verifiers.envs.experimental.composable.tasksets.cp.cp_task import (
26
22
  CPRubric,
@@ -59,8 +55,6 @@ __all__ = [
59
55
  "make_swesmith_rs_taskset",
60
56
  "make_swesmith_cpp_taskset",
61
57
  "make_swesmith_php_taskset",
62
- "LeanTaskSet",
63
- "LEAN_SYSTEM_PROMPT",
64
58
  "MathTaskSet",
65
59
  "CPTaskSet",
66
60
  "CPRubric",
@@ -5,5 +5,18 @@ here — it imports the optional `textarena` dependency at module load — but s
5
5
  `verifiers.v1.tasksets.textarena`."""
6
6
 
7
7
  from verifiers.v1.tasksets.harbor import HarborConfig, HarborTaskset
8
+ from verifiers.v1.tasksets.lean import (
9
+ LeanConfig,
10
+ LeanDatasetConfig,
11
+ LeanTask,
12
+ LeanTaskset,
13
+ )
8
14
 
9
- __all__ = ["HarborConfig", "HarborTaskset"]
15
+ __all__ = [
16
+ "HarborConfig",
17
+ "HarborTaskset",
18
+ "LeanConfig",
19
+ "LeanDatasetConfig",
20
+ "LeanTask",
21
+ "LeanTaskset",
22
+ ]
@@ -0,0 +1,31 @@
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
+ LeanTaskset,
16
+ )
17
+
18
+ __all__ = [
19
+ "DEFAULT_DOCKER_IMAGE",
20
+ "LEAN_PROJECT_PATH",
21
+ "PROOF_FILE_PATH",
22
+ "LeanConfig",
23
+ "LeanDatasetConfig",
24
+ "LeanTask",
25
+ "LeanTaskset",
26
+ "build_starter_file",
27
+ "expected_protected_signature",
28
+ "parse_compile_output",
29
+ "protected_signature_substring_present",
30
+ "strip_lean_comments",
31
+ ]
@@ -0,0 +1,262 @@
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
@@ -0,0 +1,265 @@
1
+ """lean: a reusable Lean 4 theorem-proving taskset base.
2
+
3
+ Loads a Lean dataset (any HuggingFace dataset with a formal-statement column),
4
+ plants a ``sorry`` starter file in a Mathlib sandbox at ``setup``, and rewards a
5
+ clean ``lake env lean`` compile — with a reward-hacking guard that pins the
6
+ original theorem signature — at scoring time. It exposes **no tools**: the agent
7
+ reads, edits, and compiles ``proof.lean`` through whichever shell-capable harness
8
+ drives the rollout (``mini-swe-agent`` / ``rlm`` / ``bash``), so a lean task runs
9
+ under ANY harness.
10
+
11
+ This is a *base*: point it at a dataset via ``--taskset.dataset-name`` (+ column
12
+ config), or subclass it in a thin per-dataset package that just sets the config
13
+ defaults — the way ``swebench-verified-v1`` etc. wrap ``HarborTaskset``. The
14
+ per-dataset packages live in research-environments.
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ import shlex
20
+
21
+ from pydantic_config import BaseConfig
22
+
23
+ from verifiers.v1.decorators import reward
24
+ from verifiers.v1.runtimes import Runtime
25
+ from verifiers.v1.task import Task, TaskResources
26
+ from verifiers.v1.taskset import Taskset, TasksetConfig
27
+ from verifiers.v1.tasksets.lean.scoring import (
28
+ build_starter_file,
29
+ expected_protected_signature,
30
+ parse_compile_output,
31
+ protected_signature_substring_present,
32
+ )
33
+ from verifiers.v1.trace import Trace
34
+
35
+ # Default sandbox image: Lean v4.27 + Mathlib v4.27 (PI Research team registry).
36
+ # A per-dataset package overrides ``docker_image`` with its version-matched image.
37
+ DEFAULT_DOCKER_IMAGE = "team-clyvldofb0000gg1kx39rgzjq/lean-tactic:mathlib-v4.27.0-v3"
38
+ LEAN_PROJECT_PATH = "/workspace/mathlib4"
39
+ PROOF_FILE_PATH = "/tmp/proof.lean"
40
+
41
+ DEFAULT_SYSTEM_PROMPT = "You are an expert Lean 4 theorem prover working with Mathlib."
42
+
43
+
44
+ class LeanTask(Task):
45
+ formal_statement: str
46
+ header: str = ""
47
+ imports: str = "import Mathlib"
48
+ normalize_mathlib_imports: bool = False
49
+ # Canonical ``theorem ... := by`` text pinned at load; the reward checks it
50
+ # still appears in the final file (the only edit the reward cares about).
51
+ protected_signature: str = ""
52
+ # Gold proof body (replaces `` sorry``); "" when the dataset ships no gold.
53
+ formal_proof: str = ""
54
+
55
+
56
+ class LeanDatasetConfig(BaseConfig):
57
+ """Which HuggingFace dataset to load and how to read its columns."""
58
+
59
+ name: str
60
+ """HuggingFace dataset id (required; each per-dataset package sets it)."""
61
+ split: str = "train"
62
+ subset: str | None = None
63
+ statement_column: str = "formal_statement"
64
+ header_column: str | None = None
65
+ imports_column: str | None = None
66
+ name_column: str | None = None
67
+ proof_column: str | None = None
68
+ """Column holding the gold proof body (used by ``validate``); None = no gold."""
69
+ normalize_mathlib_imports: bool = False
70
+
71
+
72
+ class LeanConfig(TasksetConfig):
73
+ dataset: LeanDatasetConfig
74
+ docker_image: str = DEFAULT_DOCKER_IMAGE
75
+ lean_project_path: str = LEAN_PROJECT_PATH
76
+ proof_file_path: str = PROOF_FILE_PATH
77
+ compile_timeout: int = 300
78
+ """Per-compile ``timeout`` wrapper (seconds), bounding each ``lake env lean``."""
79
+ system_prompt: str = DEFAULT_SYSTEM_PROMPT
80
+
81
+
82
+ class LeanTaskset(Taskset[LeanTask, LeanConfig]):
83
+ NEEDS_CONTAINER = True
84
+
85
+ # ---- task loading -------------------------------------------------------
86
+
87
+ def load_tasks(self) -> list[LeanTask]:
88
+ from datasets import load_dataset
89
+
90
+ config = self.config
91
+ ds = config.dataset
92
+ raw = load_dataset(
93
+ ds.name,
94
+ ds.subset,
95
+ split=ds.split,
96
+ keep_in_memory=True,
97
+ num_proc=8,
98
+ )
99
+
100
+ # Fail loud on a misconfigured column name — otherwise a typo is silently
101
+ # treated as a missing/empty field (e.g. a wrong proof_column makes every
102
+ # gold check vacuously fail), or a statement_column typo raises a raw
103
+ # KeyError on the first row instead of this clear error.
104
+ for label, col in (
105
+ ("statement_column", ds.statement_column),
106
+ ("header_column", ds.header_column),
107
+ ("imports_column", ds.imports_column),
108
+ ("name_column", ds.name_column),
109
+ ("proof_column", ds.proof_column),
110
+ ):
111
+ if col is not None and col not in raw.column_names:
112
+ raise ValueError(
113
+ f"dataset.{label}={col!r} not found in {ds.name!r}; columns={raw.column_names}"
114
+ )
115
+
116
+ resources = TaskResources(cpu=4, memory=4, disk=10)
117
+ tasks: list[LeanTask] = []
118
+ for index, row in enumerate(raw):
119
+ # Skip degenerate rows with no statement: there's nothing to prove, and
120
+ # an empty statement collapses the pinned signature to just ``:= by``,
121
+ # which every proof contains — so the reward-hacking guard would pass on
122
+ # a rewritten trivial theorem. Drop them rather than ship a free-reward task.
123
+ formal_statement = row[ds.statement_column]
124
+ if not isinstance(formal_statement, str) or not formal_statement.strip():
125
+ continue
126
+ # Unset columns are None, and row.get(None) is None, so the `or`
127
+ # fallbacks cover both an unset column and an empty value.
128
+ header = row.get(ds.header_column) or ""
129
+ imports = row.get(ds.imports_column) or "import Mathlib"
130
+ gold = row.get(ds.proof_column) or ""
131
+ name = row.get(ds.name_column)
132
+ tasks.append(
133
+ LeanTask(
134
+ idx=index,
135
+ name=str(name) if name else f"task_{index:05d}",
136
+ prompt=self._build_prompt(formal_statement, header),
137
+ system_prompt=config.system_prompt,
138
+ image=config.docker_image,
139
+ workdir=config.lean_project_path,
140
+ resources=resources,
141
+ formal_statement=formal_statement,
142
+ header=header,
143
+ imports=imports,
144
+ normalize_mathlib_imports=ds.normalize_mathlib_imports,
145
+ protected_signature=expected_protected_signature(formal_statement),
146
+ formal_proof=gold,
147
+ )
148
+ )
149
+ return tasks
150
+
151
+ def _build_prompt(self, formal_statement: str, header: str) -> str:
152
+ cfg = self.config
153
+ block = (
154
+ "Prove the following Lean 4 theorem. A starter proof file is at "
155
+ f"`{cfg.proof_file_path}` with the theorem statement and a `sorry` "
156
+ "placeholder already in place. Edit it and compile with "
157
+ f"`cd {cfg.lean_project_path} && lake env lean {cfg.proof_file_path}`.\n\n"
158
+ f"```lean\n{formal_statement}\n```"
159
+ )
160
+ if header:
161
+ block += f"\n\nThe file header (imports/namespaces) is already set up:\n```lean\n{header}\n```"
162
+ block += (
163
+ "\n\nDo NOT modify the theorem statement (the lines from `theorem ...` "
164
+ "through `:= by`) — the grader checks the original statement still "
165
+ "appears and gives zero reward if you rewrote it. Write your proof "
166
+ "tactics in place of `sorry`; the final proof must not contain `sorry` "
167
+ "or `admit`. A clean compile prints nothing and exits 0."
168
+ )
169
+ return block
170
+
171
+ # ---- sandbox helpers ----------------------------------------------------
172
+
173
+ async def _compile(self, runtime: Runtime) -> tuple[bool, str, int]:
174
+ """Run ``lake env lean`` on the proof file; returns (compiled, output, exit_code)."""
175
+ cfg = self.config
176
+ cmd = (
177
+ f"cd {shlex.quote(cfg.lean_project_path)} && "
178
+ f"timeout {cfg.compile_timeout} lake env lean {shlex.quote(cfg.proof_file_path)} 2>&1; "
179
+ "echo EXIT_CODE:$?"
180
+ )
181
+ result = await runtime.run(["bash", "-lc", cmd], {})
182
+ return parse_compile_output((result.stdout or "") + (result.stderr or ""))
183
+
184
+ # ---- lifecycle ----------------------------------------------------------
185
+
186
+ async def setup(self, task: LeanTask, runtime: Runtime) -> None:
187
+ """Plant the ``sorry`` starter file in the sandbox before the agent runs."""
188
+ content = build_starter_file(
189
+ task.formal_statement,
190
+ header=task.header,
191
+ imports=task.imports,
192
+ normalize=task.normalize_mathlib_imports,
193
+ )
194
+ await runtime.write(self.config.proof_file_path, content.encode())
195
+
196
+ # ---- scoring ------------------------------------------------------------
197
+
198
+ @reward(weight=1.0)
199
+ async def lean_compiled(
200
+ self, task: LeanTask, trace: Trace, runtime: Runtime
201
+ ) -> float:
202
+ """1.0 iff the final proof compiles cleanly (exit 0, no ``sorry``) and the
203
+ protected theorem signature is intact; 0.0 otherwise.
204
+
205
+ Reads the final ``proof.lean`` back through the live runtime, runs the
206
+ host-side signature guard (with comment/string stripping), then re-runs
207
+ ``lake env lean``. Diagnostics land on ``trace.info`` for inspection.
208
+ """
209
+ if trace.has_error:
210
+ return 0.0
211
+
212
+ # Read the final proof back. A read failure here is genuinely exceptional
213
+ # (setup planted the file; the agent edits it in-sandbox), so let it
214
+ # propagate as a scoring error rather than swallow an infra/sandbox failure
215
+ # into a false-negative 0. (The prime runtime collapses every read error
216
+ # into SandboxError, so there's no file-not-found type to narrow to.)
217
+ current = (await runtime.read(self.config.proof_file_path)).decode(
218
+ "utf-8", "replace"
219
+ )
220
+
221
+ expected_sig = task.protected_signature or expected_protected_signature(
222
+ task.formal_statement
223
+ )
224
+ if expected_sig and not protected_signature_substring_present(
225
+ current, expected_sig
226
+ ):
227
+ trace.info["lean_tampered"] = True
228
+ trace.info["compile_output"] = "signature rewritten or hidden in a comment"
229
+ return 0.0
230
+ trace.info["lean_tampered"] = False
231
+
232
+ compiled, output, exit_code = await self._compile(runtime)
233
+ trace.info["lean_compiled"] = compiled
234
+ trace.info["compile_exit_code"] = exit_code
235
+ trace.info["compile_output"] = output[-4000:]
236
+ return 1.0 if compiled else 0.0
237
+
238
+ # ---- validation (model-free gold check) ---------------------------------
239
+
240
+ async def validate(self, task: LeanTask, runtime: Runtime) -> bool:
241
+ """Compile the gold proof: substitute it for ``sorry`` and check it type-checks.
242
+
243
+ ``False`` is reserved for a row whose gold proof exists but **fails to
244
+ compile** (a genuinely bad/unprovable row). A row with **no** gold proof
245
+ (statement-only datasets, or an empty proof column) returns ``True`` — there
246
+ is nothing to refute, matching the base ``Taskset.validate`` no-op; flagging
247
+ it ``invalid`` would both swamp the report on statement-only datasets and
248
+ mask the rows whose gold actually fails on a sparse-gold dataset.
249
+ """
250
+ gold = (task.formal_proof or "").rstrip()
251
+ if not gold:
252
+ return True
253
+ content = build_starter_file(
254
+ task.formal_statement,
255
+ header=task.header,
256
+ imports=task.imports,
257
+ normalize=task.normalize_mathlib_imports,
258
+ proof_body=gold,
259
+ )
260
+ await runtime.write(self.config.proof_file_path, content.encode())
261
+ compiled, _, _ = await self._compile(runtime)
262
+ return compiled
263
+
264
+
265
+ __all__ = ["LeanTask", "LeanConfig", "LeanTaskset"]