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.
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/PKG-INFO +1 -1
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -6
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/tasksets/__init__.py +14 -1
- verifiers-0.1.15.dev402/verifiers/v1/tasksets/lean/__init__.py +31 -0
- verifiers-0.1.15.dev402/verifiers/v1/tasksets/lean/scoring.py +262 -0
- verifiers-0.1.15.dev402/verifiers/v1/tasksets/lean/taskset.py +265 -0
- verifiers-0.1.15.dev401/tests/test_lean_task.py +0 -344
- verifiers-0.1.15.dev401/verifiers/envs/experimental/composable/tasksets/lean/__init__.py +0 -13
- verifiers-0.1.15.dev401/verifiers/envs/experimental/composable/tasksets/lean/lean_task.py +0 -458
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/.gitignore +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/LICENSE +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/README.md +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/pyproject.toml +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/AGENTS.md +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/README.md +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/conftest.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_browser_env.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_build_script.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_cli_agent_env.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_client_auth_errors.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_client_config.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_client_multimodal_types.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_composable_env.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_context_token_metrics.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_decorator_ranks.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_endpoint_registry.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_env_group.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_env_server.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_environment.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_environment_extra.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_envs.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_error_chain.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_eval_display.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_eval_utils.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_gepa_cli.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_gepa_utils.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_gym_env.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_harbor_env_mcp.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_imports.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_init_script.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_install_utils.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_interception_utils.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_logging.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_math_rubric.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_maybe_think_parser.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_message_utils.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_message_utils_multimodal.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_multiturn_env.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_nemorl_client.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_openai_chat_completions_token_client.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_openai_responses_client.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_opencode_rlm_env.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_openenv_client.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_parser.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_path_utils.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_per_turn_timing.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_pricing_utils.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_prime_plugin.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_renderer_client.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_renderer_e2e.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_rlm_composable_env.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_rubric.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_rubric_group.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_sandbox_debug_env.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_sandbox_env.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_sandbox_mixin.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_save_utils.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_setup_script.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_singleturn_env.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_stateful_tool_env.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_think_parser.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_tool_env.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_tool_utils.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_trajectory_processing.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_tui_info_formatting.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_types.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_wordle_env.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/test_xml_parser.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/v1/conftest.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/v1/fixtures/counter_tool_v1.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/v1/fixtures/echo_multi_v0.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/v1/fixtures/echo_tool_v1.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/v1/fixtures/echo_v0.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/v1/fixtures/echo_v1.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/v1/fixtures/pyproject.toml +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/v1/test_color_codeword_tasks.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/v1/test_configs.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/v1/test_e2e.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/v1/test_envs.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/v1/test_graph.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/v1/test_legacy.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/tests/v1/test_trace.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/AGENTS.md +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/cli/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/cli/commands/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/cli/commands/build.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/cli/commands/eval.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/cli/commands/gepa.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/cli/commands/init.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/cli/commands/install.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/cli/commands/setup.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/cli/plugins/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/cli/plugins/prime.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/cli/tui.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/clients/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/clients/anthropic_messages_client.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/clients/client.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/clients/openai_chat_completions_client.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/clients/openai_completions_client.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/clients/openai_responses_client.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/clients/renderer_client.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/decorators.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/AGENTS.md +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/env_group.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/environment.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/README.md +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/cli_agent_env.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/README.md +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/_filter.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/composable_env.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/harness.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/task.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
- {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
- {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
- {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
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/gym_env.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/harbor_env/env.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/mcp_env.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/opencode_env.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/utils/file_locks.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/integrations/README.md +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/integrations/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/integrations/browser_env/README.md +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/integrations/openenv_env.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/integrations/textarena_env.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/multiturn_env.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/python_env.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/sandbox_env.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/singleturn_env.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/stateful_tool_env.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/envs/tool_env.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/errors.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/gepa/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/gepa/adapter.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/gepa/config.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/gepa/display.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/gepa/gepa_utils.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/parsers/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/parsers/maybe_think_parser.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/parsers/parser.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/parsers/think_parser.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/parsers/xml_parser.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/rl/README.md +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/rl/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/rl/inference/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/rl/inference/client.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/rl/inference/server.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/rl/trainer/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/rl/trainer/config.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/rl/trainer/orchestrator.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/rl/trainer/trainer.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/rl/trainer/utils.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/rubrics/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/rubrics/judge_rubric.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/rubrics/math_rubric.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/rubrics/rubric.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/rubrics/rubric_group.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/scripts/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/scripts/build.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/scripts/eval.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/scripts/gepa.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/scripts/init.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/scripts/install.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/scripts/rl.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/scripts/setup.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/scripts/train.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/scripts/tui.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/scripts/vllm.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/serve/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/serve/client/env_client.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/serve/client/zmq_env_client.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/serve/server/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/serve/server/env_router.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/serve/server/env_server.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/serve/server/env_worker.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/serve/server/zmq_env_server.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/serve/types.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/types.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/async_utils.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/client_utils.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/config_utils.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/data_utils.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/display_utils.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/env_config_utils.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/env_utils.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/error_utils.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/eval_display.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/eval_utils.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/heartbeat.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/import_utils.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/install_utils.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/interception_utils.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/logging_utils.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/message_utils.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/metric_utils.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/path_utils.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/pricing_utils.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/process_utils.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/response_utils.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/save_utils.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/serve_utils.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/thread_utils.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/threaded_sandbox_client.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/tool_utils.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/usage_utils.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/utils/version_utils.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/ARCHITECTURE.md +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/GUIDE.md +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/README.md +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/cli/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/cli/dashboard/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/cli/dashboard/base.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/cli/dashboard/eval.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/cli/dashboard/validate.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/cli/eval/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/cli/eval/main.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/cli/eval/resume.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/cli/eval/runner.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/cli/init.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/cli/output.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/cli/resolve.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/cli/serve.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/cli/validate.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/clients/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/clients/client.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/clients/config.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/clients/eval.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/clients/train.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/configs/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/configs/eval.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/configs/init.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/configs/serve.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/configs/validate.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/decorators.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/dialects/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/dialects/anthropic.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/dialects/base.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/dialects/chat.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/dialects/responses.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/env.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/episode.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/errors.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/graph.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harness.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/bash/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/bash/harness.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/bash/program.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/bash_edit/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/bash_edit/harness.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/bash_edit/program.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/codex/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/codex/harness.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/default/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/default/harness.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/default/program.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/rlm/harness.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/interception/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/interception/pool.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/interception/server.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/judge.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/legacy.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/loaders.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/mcp/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/mcp/launch.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/mcp/multiplex.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/mcp/server.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/mcp/toolset.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/mcp/user.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/retries.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/rollout.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/runtimes/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/runtimes/base.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/runtimes/docker.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/runtimes/limiters.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/runtimes/modal.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/runtimes/prime.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/runtimes/subprocess.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/serve/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/serve/client.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/serve/pool.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/serve/server.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/serve/types.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/state.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/task.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/taskset.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/trace.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/types.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/utils/__init__.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/utils/format.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/utils/install.py +0 -0
- {verifiers-0.1.15.dev401 → verifiers-0.1.15.dev402}/verifiers/v1/utils/logging.py +0 -0
- {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.
|
|
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__ = [
|
|
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"]
|