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