verifiers 0.1.15.dev400__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.dev400 → verifiers-0.1.15.dev402}/PKG-INFO +1 -1
  2. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -6
  3. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/README.md +14 -0
  4. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/tasksets/__init__.py +14 -1
  5. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/tasksets/harbor/taskset.py +97 -124
  6. verifiers-0.1.15.dev402/verifiers/v1/tasksets/lean/__init__.py +31 -0
  7. verifiers-0.1.15.dev402/verifiers/v1/tasksets/lean/scoring.py +262 -0
  8. verifiers-0.1.15.dev402/verifiers/v1/tasksets/lean/taskset.py +265 -0
  9. verifiers-0.1.15.dev400/tests/test_lean_task.py +0 -344
  10. verifiers-0.1.15.dev400/verifiers/envs/experimental/composable/tasksets/lean/__init__.py +0 -13
  11. verifiers-0.1.15.dev400/verifiers/envs/experimental/composable/tasksets/lean/lean_task.py +0 -458
  12. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/.gitignore +0 -0
  13. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/LICENSE +0 -0
  14. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/README.md +0 -0
  15. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/pyproject.toml +0 -0
  16. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/AGENTS.md +0 -0
  17. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/README.md +0 -0
  18. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/__init__.py +0 -0
  19. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/conftest.py +0 -0
  20. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_browser_env.py +0 -0
  21. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_build_script.py +0 -0
  22. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_cli_agent_env.py +0 -0
  23. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_client_auth_errors.py +0 -0
  24. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_client_config.py +0 -0
  25. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_client_multimodal_types.py +0 -0
  26. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_composable_env.py +0 -0
  27. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_context_token_metrics.py +0 -0
  28. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_decorator_ranks.py +0 -0
  29. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_endpoint_registry.py +0 -0
  30. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_env_group.py +0 -0
  31. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_env_server.py +0 -0
  32. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_environment.py +0 -0
  33. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_environment_extra.py +0 -0
  34. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_envs.py +0 -0
  35. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_error_chain.py +0 -0
  36. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_eval_display.py +0 -0
  37. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_eval_utils.py +0 -0
  38. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_gepa_cli.py +0 -0
  39. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_gepa_utils.py +0 -0
  40. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_gym_env.py +0 -0
  41. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_harbor_env_mcp.py +0 -0
  42. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_imports.py +0 -0
  43. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_init_script.py +0 -0
  44. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_install_utils.py +0 -0
  45. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_interception_utils.py +0 -0
  46. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_logging.py +0 -0
  47. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_math_rubric.py +0 -0
  48. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_maybe_think_parser.py +0 -0
  49. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_message_utils.py +0 -0
  50. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_message_utils_multimodal.py +0 -0
  51. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_multiturn_env.py +0 -0
  52. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_nemorl_client.py +0 -0
  53. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_openai_chat_completions_token_client.py +0 -0
  54. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_openai_responses_client.py +0 -0
  55. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_opencode_rlm_env.py +0 -0
  56. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_openenv_client.py +0 -0
  57. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_parser.py +0 -0
  58. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_path_utils.py +0 -0
  59. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_per_turn_timing.py +0 -0
  60. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_pricing_utils.py +0 -0
  61. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_prime_plugin.py +0 -0
  62. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_renderer_client.py +0 -0
  63. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_renderer_e2e.py +0 -0
  64. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_rlm_composable_env.py +0 -0
  65. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_rubric.py +0 -0
  66. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_rubric_group.py +0 -0
  67. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_sandbox_debug_env.py +0 -0
  68. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_sandbox_env.py +0 -0
  69. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_sandbox_mixin.py +0 -0
  70. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_save_utils.py +0 -0
  71. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_setup_script.py +0 -0
  72. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_singleturn_env.py +0 -0
  73. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_stateful_tool_env.py +0 -0
  74. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_think_parser.py +0 -0
  75. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_tool_env.py +0 -0
  76. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_tool_utils.py +0 -0
  77. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_trajectory_processing.py +0 -0
  78. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_tui_info_formatting.py +0 -0
  79. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_types.py +0 -0
  80. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_wordle_env.py +0 -0
  81. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/test_xml_parser.py +0 -0
  82. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/v1/conftest.py +0 -0
  83. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  84. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  85. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/v1/fixtures/echo_multi_v0.py +0 -0
  86. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  87. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  88. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/v1/fixtures/echo_v0.py +0 -0
  89. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/v1/fixtures/echo_v1.py +0 -0
  90. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/v1/fixtures/pyproject.toml +0 -0
  91. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  92. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/v1/test_color_codeword_tasks.py +0 -0
  93. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/v1/test_configs.py +0 -0
  94. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/v1/test_e2e.py +0 -0
  95. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/v1/test_envs.py +0 -0
  96. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/v1/test_graph.py +0 -0
  97. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/v1/test_legacy.py +0 -0
  98. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/tests/v1/test_trace.py +0 -0
  99. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/AGENTS.md +0 -0
  100. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/__init__.py +0 -0
  101. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/cli/__init__.py +0 -0
  102. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/cli/commands/__init__.py +0 -0
  103. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/cli/commands/build.py +0 -0
  104. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/cli/commands/eval.py +0 -0
  105. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/cli/commands/gepa.py +0 -0
  106. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/cli/commands/init.py +0 -0
  107. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/cli/commands/install.py +0 -0
  108. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/cli/commands/setup.py +0 -0
  109. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/cli/plugins/__init__.py +0 -0
  110. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/cli/plugins/prime.py +0 -0
  111. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/cli/tui.py +0 -0
  112. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/clients/__init__.py +0 -0
  113. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/clients/anthropic_messages_client.py +0 -0
  114. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/clients/client.py +0 -0
  115. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
  116. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/clients/openai_chat_completions_client.py +0 -0
  117. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
  118. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/clients/openai_completions_client.py +0 -0
  119. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/clients/openai_responses_client.py +0 -0
  120. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/clients/renderer_client.py +0 -0
  121. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/decorators.py +0 -0
  122. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/AGENTS.md +0 -0
  123. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/__init__.py +0 -0
  124. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/env_group.py +0 -0
  125. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/environment.py +0 -0
  126. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/README.md +0 -0
  127. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/__init__.py +0 -0
  128. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/cli_agent_env.py +0 -0
  129. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/README.md +0 -0
  130. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/__init__.py +0 -0
  131. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/_filter.py +0 -0
  132. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/composable_env.py +0 -0
  133. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/harness.py +0 -0
  134. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
  135. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  136. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
  137. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
  138. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
  139. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
  140. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
  141. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/task.py +0 -0
  142. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  143. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  144. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  145. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  146. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  147. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  148. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  149. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  150. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  151. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
  152. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
  153. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
  154. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
  155. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
  156. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
  157. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
  158. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
  159. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/__init__.py +0 -0
  160. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/tool_pdf.py +0 -0
  161. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +0 -0
  162. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
  163. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/__init__.py +0 -0
  164. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/base_client.py +0 -0
  165. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +0 -0
  166. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/cache_prompts.py +0 -0
  167. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +0 -0
  168. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/cache_filesys.py +0 -0
  169. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/load_eval_script.py +0 -0
  170. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +0 -0
  171. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/tool_visit.py +0 -0
  172. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/url_tools.py +0 -0
  173. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +0 -0
  174. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
  175. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
  176. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
  177. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
  178. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
  179. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
  180. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
  181. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  182. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  183. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  184. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  185. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  186. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  187. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  188. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  189. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  190. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  191. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  192. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  193. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  194. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  195. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  196. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  197. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  198. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  199. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  200. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  201. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  202. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  203. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  204. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/gym_env.py +0 -0
  205. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
  206. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/harbor_env/env.py +0 -0
  207. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
  208. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/mcp_env.py +0 -0
  209. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/opencode_env.py +0 -0
  210. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
  211. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
  212. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
  213. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/utils/__init__.py +0 -0
  214. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/utils/file_locks.py +0 -0
  215. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
  216. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/integrations/README.md +0 -0
  217. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/integrations/__init__.py +0 -0
  218. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/integrations/browser_env/README.md +0 -0
  219. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
  220. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
  221. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
  222. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
  223. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  224. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  225. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/integrations/openenv_env.py +0 -0
  226. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
  227. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/integrations/textarena_env.py +0 -0
  228. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/multiturn_env.py +0 -0
  229. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/python_env.py +0 -0
  230. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/sandbox_env.py +0 -0
  231. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/singleturn_env.py +0 -0
  232. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/stateful_tool_env.py +0 -0
  233. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/envs/tool_env.py +0 -0
  234. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/errors.py +0 -0
  235. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/gepa/__init__.py +0 -0
  236. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/gepa/adapter.py +0 -0
  237. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/gepa/config.py +0 -0
  238. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/gepa/display.py +0 -0
  239. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/gepa/gepa_utils.py +0 -0
  240. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/parsers/__init__.py +0 -0
  241. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/parsers/maybe_think_parser.py +0 -0
  242. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/parsers/parser.py +0 -0
  243. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/parsers/think_parser.py +0 -0
  244. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/parsers/xml_parser.py +0 -0
  245. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/rl/README.md +0 -0
  246. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/rl/__init__.py +0 -0
  247. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/rl/inference/__init__.py +0 -0
  248. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/rl/inference/client.py +0 -0
  249. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/rl/inference/server.py +0 -0
  250. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/rl/trainer/__init__.py +0 -0
  251. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/rl/trainer/config.py +0 -0
  252. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/rl/trainer/orchestrator.py +0 -0
  253. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/rl/trainer/trainer.py +0 -0
  254. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/rl/trainer/utils.py +0 -0
  255. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/rubrics/__init__.py +0 -0
  256. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
  257. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/rubrics/judge_rubric.py +0 -0
  258. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/rubrics/math_rubric.py +0 -0
  259. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/rubrics/rubric.py +0 -0
  260. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/rubrics/rubric_group.py +0 -0
  261. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/scripts/__init__.py +0 -0
  262. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/scripts/build.py +0 -0
  263. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/scripts/eval.py +0 -0
  264. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/scripts/gepa.py +0 -0
  265. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/scripts/init.py +0 -0
  266. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/scripts/install.py +0 -0
  267. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/scripts/rl.py +0 -0
  268. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/scripts/setup.py +0 -0
  269. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/scripts/train.py +0 -0
  270. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/scripts/tui.py +0 -0
  271. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/scripts/vllm.py +0 -0
  272. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/serve/__init__.py +0 -0
  273. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/serve/client/env_client.py +0 -0
  274. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/serve/client/zmq_env_client.py +0 -0
  275. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/serve/server/__init__.py +0 -0
  276. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/serve/server/env_router.py +0 -0
  277. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/serve/server/env_server.py +0 -0
  278. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/serve/server/env_worker.py +0 -0
  279. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/serve/server/zmq_env_server.py +0 -0
  280. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/serve/types.py +0 -0
  281. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/types.py +0 -0
  282. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/utils/__init__.py +0 -0
  283. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/utils/async_utils.py +0 -0
  284. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/utils/client_utils.py +0 -0
  285. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/utils/config_utils.py +0 -0
  286. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/utils/data_utils.py +0 -0
  287. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/utils/display_utils.py +0 -0
  288. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/utils/env_config_utils.py +0 -0
  289. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/utils/env_utils.py +0 -0
  290. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/utils/error_utils.py +0 -0
  291. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/utils/eval_display.py +0 -0
  292. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/utils/eval_utils.py +0 -0
  293. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/utils/heartbeat.py +0 -0
  294. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/utils/import_utils.py +0 -0
  295. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/utils/install_utils.py +0 -0
  296. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/utils/interception_utils.py +0 -0
  297. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/utils/logging_utils.py +0 -0
  298. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/utils/message_utils.py +0 -0
  299. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/utils/metric_utils.py +0 -0
  300. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/utils/path_utils.py +0 -0
  301. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/utils/pricing_utils.py +0 -0
  302. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/utils/process_utils.py +0 -0
  303. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/utils/response_utils.py +0 -0
  304. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/utils/save_utils.py +0 -0
  305. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/utils/serve_utils.py +0 -0
  306. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/utils/thread_utils.py +0 -0
  307. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/utils/threaded_sandbox_client.py +0 -0
  308. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/utils/tool_utils.py +0 -0
  309. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/utils/usage_utils.py +0 -0
  310. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/utils/version_utils.py +0 -0
  311. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/ARCHITECTURE.md +0 -0
  312. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/GUIDE.md +0 -0
  313. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/__init__.py +0 -0
  314. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/cli/__init__.py +0 -0
  315. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  316. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/cli/dashboard/base.py +0 -0
  317. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/cli/dashboard/eval.py +0 -0
  318. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/cli/dashboard/validate.py +0 -0
  319. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/cli/eval/__init__.py +0 -0
  320. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/cli/eval/main.py +0 -0
  321. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/cli/eval/resume.py +0 -0
  322. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/cli/eval/runner.py +0 -0
  323. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/cli/init.py +0 -0
  324. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/cli/output.py +0 -0
  325. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/cli/resolve.py +0 -0
  326. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/cli/serve.py +0 -0
  327. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/cli/validate.py +0 -0
  328. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/clients/__init__.py +0 -0
  329. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/clients/client.py +0 -0
  330. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/clients/config.py +0 -0
  331. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/clients/eval.py +0 -0
  332. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/clients/train.py +0 -0
  333. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/configs/__init__.py +0 -0
  334. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/configs/eval.py +0 -0
  335. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/configs/init.py +0 -0
  336. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/configs/serve.py +0 -0
  337. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/configs/validate.py +0 -0
  338. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/decorators.py +0 -0
  339. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/dialects/__init__.py +0 -0
  340. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/dialects/anthropic.py +0 -0
  341. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/dialects/base.py +0 -0
  342. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/dialects/chat.py +0 -0
  343. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/dialects/responses.py +0 -0
  344. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/env.py +0 -0
  345. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/episode.py +0 -0
  346. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/errors.py +0 -0
  347. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/graph.py +0 -0
  348. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/harness.py +0 -0
  349. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/__init__.py +0 -0
  350. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  351. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/bash/harness.py +0 -0
  352. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/bash/program.py +0 -0
  353. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/bash_edit/__init__.py +0 -0
  354. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/bash_edit/harness.py +0 -0
  355. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/bash_edit/program.py +0 -0
  356. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  357. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/codex/harness.py +0 -0
  358. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/default/__init__.py +0 -0
  359. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/default/harness.py +0 -0
  360. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/default/program.py +0 -0
  361. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  362. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  363. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  364. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  365. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  366. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  367. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  368. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  369. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  370. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  371. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/interception/__init__.py +0 -0
  372. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/interception/pool.py +0 -0
  373. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/interception/server.py +0 -0
  374. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/judge.py +0 -0
  375. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/legacy.py +0 -0
  376. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/loaders.py +0 -0
  377. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/mcp/__init__.py +0 -0
  378. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/mcp/launch.py +0 -0
  379. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/mcp/multiplex.py +0 -0
  380. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/mcp/server.py +0 -0
  381. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/mcp/toolset.py +0 -0
  382. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/mcp/user.py +0 -0
  383. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/retries.py +0 -0
  384. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/rollout.py +0 -0
  385. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/runtimes/__init__.py +0 -0
  386. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/runtimes/base.py +0 -0
  387. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/runtimes/docker.py +0 -0
  388. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/runtimes/limiters.py +0 -0
  389. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/runtimes/modal.py +0 -0
  390. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/runtimes/prime.py +0 -0
  391. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/runtimes/subprocess.py +0 -0
  392. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/serve/__init__.py +0 -0
  393. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/serve/client.py +0 -0
  394. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/serve/pool.py +0 -0
  395. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/serve/server.py +0 -0
  396. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/serve/types.py +0 -0
  397. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/state.py +0 -0
  398. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/task.py +0 -0
  399. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/taskset.py +0 -0
  400. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  401. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  402. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  403. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/trace.py +0 -0
  404. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/types.py +0 -0
  405. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/utils/__init__.py +0 -0
  406. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/utils/format.py +0 -0
  407. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/utils/install.py +0 -0
  408. {verifiers-0.1.15.dev400 → verifiers-0.1.15.dev402}/verifiers/v1/utils/logging.py +0 -0
  409. {verifiers-0.1.15.dev400 → 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.dev400
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",
@@ -241,6 +241,20 @@ each in its own declared, pullable container image — e.g. Terminal-Bench 2:
241
241
  uv run eval harbor --taskset.dataset terminal-bench/terminal-bench-2 -n 10 --harness.id rlm
242
242
  ```
243
243
 
244
+ Harbor registry selectors pass through as taskset config. For the
245
+ `research-environments` registry:
246
+
247
+ ```bash
248
+ uv run eval harbor --taskset.dataset general-agent@2026-06-25 \
249
+ --taskset.repo PrimeIntellect-ai/research-environments@REF_OR_SHA
250
+
251
+ uv run eval harbor --taskset.dataset general-agent@2026-06-25 \
252
+ --taskset.registry-path ./registry.json
253
+
254
+ uv run eval harbor --taskset.dataset general-agent@2026-06-25 \
255
+ --taskset.registry-url https://raw.githubusercontent.com/PrimeIntellect-ai/research-environments/REF_OR_SHA/registry.json
256
+ ```
257
+
244
258
  ## Backwards compatibility
245
259
 
246
260
  The v0 framework is untouched — the classic `verifiers` API and its entrypoints (`vf-eval`,
@@ -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
+ ]
@@ -1,9 +1,9 @@
1
1
  """harbor: run a Harbor (Terminal-Bench) dataset.
2
2
 
3
3
  `dataset` is a Harbor Hub package id (e.g. "org/name" or "org/name@ref"),
4
- downloaded directly from the registry and cached on first use. Each task dir
5
- ships task.toml + instruction.md (+ tests/, solution/, environment/). Defaults
6
- to the registry `harbor/hello-world` dataset.
4
+ downloaded through the installed Harbor CLI and cached on first use. Each task
5
+ dir ships task.toml + instruction.md (+ tests/, solution/, environment/).
6
+ Defaults to the registry `harbor/hello-world` dataset.
7
7
 
8
8
  The harness runs in a container and edits /app; then the task's verifier
9
9
  (tests/test.sh) runs in the SAME container and the reward it writes to
@@ -18,17 +18,16 @@ environment is only a `Dockerfile` has no pullable image — we don't build Dock
18
18
  no environment at all also runs on that image, unless `require_image`.
19
19
  """
20
20
 
21
+ import hashlib
21
22
  import io
22
- import json
23
- import os
23
+ import shutil
24
+ import subprocess
25
+ import sys
24
26
  import tarfile
25
27
  import tempfile
26
28
  import tomllib
27
- from concurrent.futures import ThreadPoolExecutor
28
29
  from functools import lru_cache
29
30
  from pathlib import Path
30
- from urllib.parse import urlencode
31
- from urllib.request import Request, urlopen
32
31
 
33
32
  from pydantic import Field
34
33
 
@@ -41,14 +40,20 @@ from verifiers.v1.trace import Trace
41
40
  from verifiers.v1.types import StrictBaseModel
42
41
 
43
42
  CACHE = Path.home() / ".cache" / "harbor"
44
- HARBOR_SUPABASE_URL = "https://ofhuhcpkvzjlejydnvyd.supabase.co"
45
- HARBOR_SUPABASE_PUBLISHABLE_KEY = "sb_publishable_Z-vuQbpvpG-PStjbh4yE0Q_e-d3MTIH"
43
+ HARBOR_INSTALL_HINT = "uv sync --python 3.12 --extra harbor"
46
44
 
47
45
 
48
46
  class HarborConfig(TasksetConfig):
49
47
  dataset: str = "harbor/hello-world"
50
48
  """A Harbor Hub package id ("org/name" or "org/name@ref"), where ref is a
51
- tag, integer revision, or sha256 digest. Downloaded directly and cached."""
49
+ tag, integer revision, or sha256 digest. Legacy registries selected with `repo`,
50
+ `registry_path`, or `registry_url` use a bare dataset name ("name" or "name@version")."""
51
+ repo: str | None = None
52
+ """Optional Harbor `--repo` registry selector, e.g. "org/repo@ref"."""
53
+ registry_path: Path | None = None
54
+ """Optional Harbor `--registry-path` selector. Local unless `repo` is also set."""
55
+ registry_url: str | None = None
56
+ """Optional Harbor `--registry-url` selector for a raw registry.json URL."""
52
57
  tasks: list[str] | None = None
53
58
  """Optional subset of task names to load (None = all)."""
54
59
  timeout_multiplier: float = Field(1.0, gt=0)
@@ -87,127 +92,95 @@ class HarborTask(Task):
87
92
  """Host path to the task dir; used to stage tests/ to verify, not serialized."""
88
93
 
89
94
 
90
- def dataset_dir(dataset: str) -> Path:
91
- """Download a Harbor Hub task or dataset package, cached on first use.
95
+ def harbor_cli() -> str:
96
+ """Return the Harbor CLI installed in the active Python environment."""
97
+ scripts_dir = Path(sys.executable).parent
98
+ harbor_bin = shutil.which("harbor", path=str(scripts_dir))
99
+ if harbor_bin is None:
100
+ raise RuntimeError(
101
+ "Harbor tasksets require the Harbor CLI from the `harbor` extra. "
102
+ f"Install it with: `{HARBOR_INSTALL_HINT}`"
103
+ )
104
+ return harbor_bin
105
+
106
+
107
+ def cache_dir(config: HarborConfig) -> Path:
108
+ selector_parts = [config.dataset]
109
+ if config.repo is not None:
110
+ selector_parts.extend(("repo", config.repo))
111
+ if config.registry_path is not None:
112
+ registry_path = (
113
+ config.registry_path
114
+ if config.repo is not None
115
+ else config.registry_path.expanduser().resolve()
116
+ )
117
+ selector_parts.extend(("registry_path", str(registry_path)))
118
+ if config.registry_url is not None:
119
+ selector_parts.extend(("registry_url", config.registry_url))
120
+
121
+ name = config.dataset.replace("/", "_").replace("@", "_")
122
+ if len(selector_parts) > 1:
123
+ digest = hashlib.sha256("\0".join(selector_parts).encode()).hexdigest()[:12]
124
+ name = f"{name}_{digest}"
125
+ return CACHE / name
126
+
127
+
128
+ def download_command(config: HarborConfig, output_dir: Path) -> list[str]:
129
+ command = [
130
+ harbor_cli(),
131
+ "download",
132
+ config.dataset,
133
+ "--export",
134
+ "-o",
135
+ str(output_dir),
136
+ ]
137
+ if config.repo is not None:
138
+ command.extend(["--repo", config.repo])
139
+ if config.registry_path is not None:
140
+ registry_path = (
141
+ config.registry_path
142
+ if config.repo is not None
143
+ else config.registry_path.expanduser()
144
+ )
145
+ command.extend(["--registry-path", str(registry_path)])
146
+ if config.registry_url is not None:
147
+ command.extend(["--registry-url", config.registry_url])
148
+ return command
149
+
92
150
 
93
- Harbor refs are tags, integer revisions, or ``sha256:`` digests.
151
+ def dataset_dir(config: HarborConfig) -> Path:
152
+ """Download a Harbor task or dataset package, cached on first use.
153
+
154
+ Harbor Hub refs are tags, integer revisions, or ``sha256:`` digests. Legacy registry
155
+ refs are selected through Harbor's CLI selectors (`repo`, `registry_path`,
156
+ `registry_url`).
94
157
  """
95
- out = CACHE / dataset.replace("/", "_").replace("@", "_")
158
+ out = cache_dir(config)
96
159
  if out.is_dir():
97
160
  return out
98
161
 
99
- package, _, ref = dataset.partition("@")
100
- org, name = package.split("/", 1)
101
- ref = ref or "latest"
102
- url = os.getenv("HARBOR_SUPABASE_URL", HARBOR_SUPABASE_URL).rstrip("/")
103
- key = os.getenv("HARBOR_SUPABASE_PUBLISHABLE_KEY", HARBOR_SUPABASE_PUBLISHABLE_KEY)
104
- headers = {
105
- "apikey": key,
106
- "Authorization": f"Bearer {key}",
107
- "Content-Type": "application/json",
108
- }
109
- # Harbor stores datasets in version tables; standalone tasks use the RPC fallback below.
110
- version_query = {
111
- "package.name": f"eq.{name}",
112
- "package.type": "eq.dataset",
113
- "package.org.name": f"eq.{org}",
114
- "limit": 1,
115
- }
116
- if ref.isdigit():
117
- table = "dataset_version"
118
- version_query |= {
119
- "select": "id,package:package_id!inner(name,type,org:org_id!inner(name))",
120
- "revision": f"eq.{ref}",
121
- }
122
- elif ref.startswith("sha256:"):
123
- table = "dataset_version"
124
- version_query |= {
125
- "select": "id,package:package_id!inner(name,type,org:org_id!inner(name))",
126
- "content_hash": f"eq.{ref.removeprefix('sha256:')}",
127
- }
128
- else:
129
- table = "dataset_version_tag"
130
- version_query |= {
131
- "select": "dataset_version:dataset_version_id(id),package:package_id!inner(name,type,org:org_id!inner(name))",
132
- "tag": f"eq.{ref}",
133
- }
134
- request = Request(
135
- f"{url}/rest/v1/{table}?{urlencode(version_query)}", headers=headers
136
- )
137
- with urlopen(request) as response:
138
- versions = json.load(response)
139
-
140
- if versions:
141
- version = versions[0]
142
- version_id = version.get("id") or version["dataset_version"]["id"]
143
- task_query = {
144
- "select": "task_version:task_version_id(archive_path,package:package_id(name))",
145
- "dataset_version_id": f"eq.{version_id}",
146
- "order": "task_version_id",
147
- "limit": 1000,
148
- "offset": 0,
149
- }
150
- request = Request(
151
- f"{url}/rest/v1/dataset_version_task?{urlencode(task_query)}",
152
- headers={**headers, "Prefer": "count=exact"},
153
- )
154
- with urlopen(request) as response:
155
- pages = [json.load(response)]
156
- total = int(response.headers["Content-Range"].rsplit("/", 1)[1])
157
-
158
- for offset in range(1000, total, 1000):
159
- task_query["offset"] = offset
160
- request = Request(
161
- f"{url}/rest/v1/dataset_version_task?{urlencode(task_query)}",
162
- headers=headers,
163
- )
164
- with urlopen(request) as response:
165
- pages.append(json.load(response))
166
- downloads = [
167
- (
168
- Path(name) / row["task_version"]["package"]["name"],
169
- row["task_version"]["archive_path"],
170
- )
171
- for page in pages
172
- for row in page
173
- ]
174
- else:
175
- body = json.dumps({"p_org": org, "p_name": name, "p_ref": ref}).encode()
176
- request = Request(
177
- f"{url}/rest/v1/rpc/resolve_task_version", body, headers=headers
178
- )
179
- with urlopen(request) as response:
180
- task = json.load(response)
181
- if task is None:
182
- raise ValueError(f"Harbor package not found: {dataset}")
183
- downloads = [(Path(name), task["archive_path"])]
184
-
185
- if not downloads:
186
- raise ValueError(f"Harbor dataset has no tasks: {dataset}")
187
-
188
162
  CACHE.mkdir(parents=True, exist_ok=True)
189
- # Stream archives concurrently into a temporary directory; publish only a complete cache.
163
+ # Publish only a complete CLI export to the cache.
190
164
  with tempfile.TemporaryDirectory(dir=CACHE) as temp:
191
-
192
- def extract(item: tuple[Path, str]) -> None:
193
- relative_path, archive_path = item
194
- target = Path(temp) / relative_path
195
- target.mkdir(parents=True, exist_ok=True)
196
- request = Request(
197
- f"{url}/storage/v1/object/authenticated/packages/{archive_path}",
198
- headers=headers,
165
+ export_dir = Path(temp) / "export"
166
+ command = download_command(config, export_dir)
167
+ try:
168
+ subprocess.run(command, check=True, capture_output=True, text=True)
169
+ except subprocess.CalledProcessError as exc:
170
+ message = (
171
+ f"Harbor download failed for {config.dataset!r} with exit code "
172
+ f"{exc.returncode}"
199
173
  )
200
- with urlopen(request) as response:
201
- with tarfile.open(fileobj=response, mode="r|gz") as tar:
202
- kwargs = (
203
- {"filter": "data"} if hasattr(tarfile, "data_filter") else {}
204
- )
205
- tar.extractall(target, **kwargs)
206
-
207
- with ThreadPoolExecutor(max_workers=100) as pool:
208
- list(pool.map(extract, downloads))
174
+ outputs = [
175
+ output.strip()
176
+ for output in (exc.stdout, exc.stderr)
177
+ if isinstance(output, str) and output.strip()
178
+ ]
179
+ if output := "\n".join(outputs):
180
+ message = f"{message}:\n{output}"
181
+ raise RuntimeError(message) from exc
209
182
  try:
210
- Path(temp).rename(out)
183
+ export_dir.rename(out)
211
184
  except OSError:
212
185
  if out.is_dir():
213
186
  return out
@@ -312,7 +285,7 @@ def make_tar(directory: Path) -> bytes:
312
285
 
313
286
  class HarborTaskset(Taskset[HarborTask, HarborConfig]):
314
287
  def load_tasks(self) -> list[HarborTask]:
315
- root = dataset_dir(self.config.dataset)
288
+ root = dataset_dir(self.config)
316
289
  task_dirs = [
317
290
  toml_path.parent
318
291
  for toml_path in sorted(root.rglob("task.toml"))
@@ -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